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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +39 -3
  2. package/esm2022/lib/channel-histogram/channel-tree.mjs +65 -0
  3. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +1 -1
  4. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  5. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +5 -8
  6. package/esm2022/lib/spatial/lod.mjs +19 -1
  7. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +47 -10
  8. package/esm2022/lib/store/visualizer-store.service.mjs +20 -3
  9. 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-qUeMuBb0.mjs} +198 -29
  10. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs.map +1 -0
  11. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs} +3 -2
  12. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs.map} +1 -1
  13. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -1
  14. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  15. package/lib/channel-histogram/channel-histogram.component.d.ts +14 -0
  16. package/lib/channel-histogram/channel-tree.d.ts +30 -0
  17. package/lib/contracts/channel-histogram-api.contract.d.ts +2 -0
  18. package/lib/contracts/image.contract.d.ts +6 -0
  19. package/lib/spatial/lod.d.ts +11 -1
  20. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +18 -1
  21. package/lib/store/visualizer-store.service.d.ts +7 -1
  22. package/package.json +1 -1
  23. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +0 -1
@@ -48,6 +48,10 @@ export class VisualizerStore {
48
48
  // The derived defaults (full window, gamma 1, default tint) for the current
49
49
  // image, kept so "Reset" can restore a channel's window/gamma/colour.
50
50
  this.defaultChannelStates = [];
51
+ /** The channel info the host gave with the image (see setImageMeta), apart from what a tile
52
+ * descriptor added since: each adoption merges against this, so a later descriptor can change
53
+ * or clear what an earlier one put in. */
54
+ this.hostChannelInfo = [];
51
55
  // Grayscale display (ignore the channel tints) and inverted background — both
52
56
  // global display flags, like the colormap.
53
57
  this.grayscale$ = new BehaviorSubject(false);
@@ -184,7 +188,8 @@ export class VisualizerStore {
184
188
  * "Actin" or "Cell-Membrane"), where a host's metadata (jit-ui's `/metadata`) carries none, so
185
189
  * the Channels pane showed "Channel 1", "Channel 2"… The host's own names and tints win; only a
186
190
  * channel still showing its derived default takes the descriptor's, so an edit made in the pane
187
- * stays. A no-op when the channel counts differ, or for RGB.
191
+ * stays. A no-op when the channel counts differ, or for RGB. Each adoption replaces the last
192
+ * one's names, tints and groups: only the host's own count as overrides.
188
193
  */
189
194
  adoptChannelInfo(info) {
190
195
  const meta = this.imageMeta$.value;
@@ -194,11 +199,12 @@ export class VisualizerStore {
194
199
  return;
195
200
  if ((m0.channelCount ?? 1) !== info.length || current.length !== info.length)
196
201
  return;
197
- const host = m0.channelInfo ?? [];
202
+ const host = this.hostChannelInfo;
198
203
  const merged = info.map((d, i) => ({
199
204
  ...(host[i] ?? {}),
200
205
  name: host[i]?.name || d.name || '',
201
206
  color: host[i]?.color || d.color || '',
207
+ group: host[i]?.group?.length ? host[i].group : d.group,
202
208
  }));
203
209
  const before = this.defaultChannelStates;
204
210
  const nextMeta = meta.map((e, k) => (k === 0 ? { ...e, channelInfo: merged } : e));
@@ -216,6 +222,9 @@ export class VisualizerStore {
216
222
  patch.name = now.name;
217
223
  if (st.color === was.color && now.color !== was.color)
218
224
  patch.color = now.color;
225
+ // The groups are the image's, never edited in the pane.
226
+ if (!sameGroup(st.group, now.group))
227
+ patch.group = now.group;
219
228
  if (!Object.keys(patch).length)
220
229
  return st;
221
230
  changed = true;
@@ -234,6 +243,7 @@ export class VisualizerStore {
234
243
  * CD3/CD8/PanCK one. Without a key, only a change of channel count re-derives.
235
244
  */
236
245
  setImageMeta(imageMeta, imageKey) {
246
+ this.hostChannelInfo = imageMeta?.[0]?.channelInfo ?? [];
237
247
  this.imageMeta$.next(imageMeta);
238
248
  const next = this.deriveChannels(imageMeta);
239
249
  // Always refresh the reset baseline to the current image's derived defaults
@@ -274,6 +284,7 @@ export class VisualizerStore {
274
284
  color: info?.[i]?.color || palette[i % palette.length],
275
285
  ...base,
276
286
  visible: defaultChannelVisible(i, count, info?.[i]?.visible),
287
+ ...(info?.[i]?.group?.length ? { group: [...info[i].group] } : {}),
277
288
  }));
278
289
  }
279
290
  return [{ index: 0, name: 'Intensity', color: '#ffffff', ...base }];
@@ -436,4 +447,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
436
447
  type: Inject,
437
448
  args: [PREFERENCES_PORT]
438
449
  }] }] });
439
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQTBCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFHeEYsT0FBTyxFQUFFLHFCQUFxQixFQUFpQixNQUFNLDZDQUE2QyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxvQkFBb0IsRUFBb0IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFckQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFxRDFCLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsMkJBQTJCO0lBQzNCLFlBQW1FLFlBQW9DLElBQUk7UUFBeEMsY0FBUyxHQUFULFNBQVMsQ0FBK0I7UUF2RDNHLHdFQUF3RTtRQUN4RSw4RUFBOEU7UUFDOUUscURBQXFEO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FDOUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxXQUFXLENB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OzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9wdGlvbmFsLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0LCBkZWZhdWx0UHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBmaW5kUHJlc2V0LCBwcmVzZXRLZXkgfSBmcm9tICcuL2NsYXNzLWNvbG9yLnV0aWwnO1xuaW1wb3J0IHsgUFJFRkVSRU5DRVNfUE9SVCwgUHJlZmVyZW5jZXNQb3J0IH0gZnJvbSAnLi4vY29udHJhY3RzL3BvcnRzL3ByZWZlcmVuY2VzLnBvcnQnO1xuXG5pbXBvcnQgeyBJQ2hhbm5lbEluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IGRlZmF1bHRDaGFubmVsVmlzaWJsZSwgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBDT0xPUk1BUF9PUFRJT05TIH0gZnJvbSAnLi4vcGxvdC51dGlsaXRpZXMnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCBzdG9yZSBmb3IgdGhlICoqdmlzdWFsaXphdGlvbiBzZXNzaW9uKiog4oCUIHRoZSBzdGF0ZSB0aGF0XG4gKiBkZXNjcmliZXMgKmhvdyogdGhlIGN1cnJlbnQgaW1hZ2UgaXMgYmVpbmcgdmlld2VkLCBpbmRlcGVuZGVudCBvZiB3aGljaFxuICogcmVuZGVyaW5nIGJhY2tlbmQgKFBsb3RseSwgT3BlblNlYWRyYWdvbiBvciBuYXBhcmktanMpIGlzIG9uIHNjcmVlbjpcbiAqXG4gKiAgLSB0aGUgYWN0aXZlIGNvbG9ybWFwIC8gTFVUIGFuZCBpdHMgcmV2ZXJzZS1zY2FsZSB0b2dnbGUsXG4gKiAgLSB0aGUgY3VycmVudCBpbWFnZSdzIHBoeXNpY2FsIG1ldGFkYXRhICjCtW0vcGl4ZWwgZXRjLikgYW5kIGl0cyBwZXItY2hhbm5lbFxuICogICAgZGlzcGxheSBzdGF0ZSAod2luZG93LCBnYW1tYSwgdGludCwgdmlzaWJpbGl0eTsgZ3JheXNjYWxlIC8gaW52ZXJ0KSxcbiAqICAtIHRoZSBhbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgKHRoZSBjbGFzc2lmaWNhdGlvbiBsYWJlbCDihpIgY29sb3VyIG1hcCksXG4gKiAgLSB0aGUgc3BhdGlhbC1vbWljcyB2aWV3IHN0YXRlLFxuICogIC0gd2hpY2ggb24tY2FudmFzIHRvb2wgaXMgY3VycmVudGx5IGFjdGl2ZS5cbiAqXG4gKiBFdmVyeSBiYWNrZW5kIHJlYWRzIGFuZCB3cml0ZXMgdGhpcyBzaW5nbGUgaW5zdGFuY2UgKG9uZSBwZXIgdmlzdWFsaXplciBjaGFpbiksXG4gKiBzbyB0aGV5IHN0YXkgaW4gbG9jay1zdGVwIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIGlzIHJlbmRlcmluZzsgbm9uZSBvZiB0aGVtXG4gKiBvd25zIHRoZSBzZXNzaW9uIHN0YXRlLiBSZWdpb24gZ2VvbWV0cnkgbGl2ZXMgaW4gdGhlIHNpYmxpbmcgYFJlZ2lvblN0b3JlYC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyU3RvcmUge1xuICAvLyDilIDilIAgQ29sb3JtYXAgLyBMVVQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIERlZmF1bHQgdG8gaW52ZXJ0ZWQgZ3JleXMgKGRhcmsgYmFja2dyb3VuZCDihpIgYnJpZ2h0IHNpZ25hbCksIHdoaWNoIHJlYWRzIGFzXG4gIC8vIHRoZSBuYXR1cmFsIGdyYXlzY2FsZSBmb3IgdGhlc2UgbWljcm9zY29weSBpbWFnZXMuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29sb3JtYXAkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KFxuICAgIENPTE9STUFQX09QVElPTlNbMF0uY2hpbGRyZW4uZmluZCgoYzogYW55KSA9PiBjLmxhYmVsID09PSAnR3JleXMgSW52JykgPz8gQ09MT1JNQVBfT1BUSU9OU1swXS5jaGlsZHJlblswXSxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXZlcnNlU2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8g4pSA4pSAIEltYWdlIG1ldGFkYXRhIChwaHlzaWNhbCBwaXhlbCBzaXplLCBjaGFubmVscywg4oCmKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZU1ldGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJSW1hZ2VNZXRhZGF0YVtdPihbXSk7XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzICYgaGlzdG9ncmFtIGRpc3BsYXkgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFBlci1jaGFubmVsIGRpc3BsYXkgd2luZG93L2dhbW1hL3Zpc2liaWxpdHkvY29sb3VyLCBkZXJpdmVkIGZyb20gdGhlIGltYWdlXG4gIC8vIG1ldGFkYXRhIG9uIGxvYWQgKDEgXCJJbnRlbnNpdHlcIiBjaGFubmVsIGZvciBncmF5c2NhbGU7IFIvRy9CIGZvciBSR0IpLiBUaGVcbiAgLy8gQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSBlZGl0cyB0aGVzZSBhbmQgYm90aCBiYWNrZW5kcyByZWNvbG9yIGxpdmUuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbm5lbFN0YXRlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElDaGFubmVsU3RhdGVbXT4oW10pO1xuICAvKiogSW5kZXggb2YgdGhlIGNoYW5uZWwgc2VsZWN0ZWQgaW4gdGhlIENoYW5uZWxzIHBhbmUg4oCUIHRoZSBPTkUgYmFuZCBhXG4gICAqICBzaW5nbGUtc2NhbGFyIDNEIHZpZXcgKHRoZSBuYXBhcmkgU3VyZmFjZSkgZm9sbG93cyBmb3IgYSBtdWx0aWNoYW5uZWwgaW1hZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRDaGFubmVsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgLy8gVGhlIGRlcml2ZWQgZGVmYXVsdHMgKGZ1bGwgd2luZG93LCBnYW1tYSAxLCBkZWZhdWx0IHRpbnQpIGZvciB0aGUgY3VycmVudFxuICAvLyBpbWFnZSwga2VwdCBzbyBcIlJlc2V0XCIgY2FuIHJlc3RvcmUgYSBjaGFubmVsJ3Mgd2luZG93L2dhbW1hL2NvbG91ci5cbiAgcHJpdmF0ZSBkZWZhdWx0Q2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgd2VyZSBkZXJpdmVkIGZvciAoc2VlIHNldEltYWdlTWV0YSkuICovXG4gIHByaXZhdGUgY2hhbm5lbEltYWdlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8vIEdyYXlzY2FsZSBkaXNwbGF5IChpZ25vcmUgdGhlIGNoYW5uZWwgdGludHMpIGFuZCBpbnZlcnRlZCBiYWNrZ3JvdW5kIOKAlCBib3RoXG4gIC8vIGdsb2JhbCBkaXNwbGF5IGZsYWdzLCBsaWtlIHRoZSBjb2xvcm1hcC5cbiAgcHJpdmF0ZSByZWFkb25seSBncmF5c2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW52ZXJ0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIOKUgOKUgCBBbm5vdGF0aW9uIGNsYXNzIHByZXNldHMgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFRoZSBwZXItdXNlciwgc2VydmVyLXBlcnNpc3RlZCBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJlZ2lvbiBjb2xvdXJzLCBzZWVkZWRcbiAgLy8gZnJvbSB0aGUgaGlzdG9yaWNhbCBkZWZhdWx0IGNsYXNzZXMuIExvYWRlZC9zYXZlZCB2aWEgdGhlIG9wdGlvbmFsXG4gIC8vIFByZWZlcmVuY2VzUG9ydCAoYXBwLXNpZGUgYWRhcHRlciDihpIgaml0LXNlcnZpY2UpLiBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpXG4gIC8vIGJlbG93IHN0YXlzIGFzIGEgbmFtZeKGkmNvbG91ciB2aWV3IGZvciB0aGUgYmFja2VuZHMnIHJlZ2lvbiByZW5kZXJlcnMuXG4gIHByaXZhdGUgcHJlc2V0U2V0OiBQcmVzZXRTZXQgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gIC8qKiBTZXNzaW9uLW9ubHkgY2xhc3MgY29sb3VycyBmcm9tIGltcG9ydGVkIGZpbGVzIChzZWUgUHJlc2V0U2V0LmltcG9ydGVkQ29sb3JzKS4gKi9cbiAgcHJpdmF0ZSBpbXBvcnRlZENvbG9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXNldFNldCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByZXNldFNldD4odGhpcy5wcmVzZXRTZXQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdmVQcmVzZXRzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcHJlc2V0c0xvYWRlZCA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBY3RpdmUgb24tY2FudmFzIHRvb2wg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFdoaWNoIHRvb2wgdGhlIHVzZXIgaGFzIGFybWVkIChwYW4sIHpvb20sIGRyYXdyZWN0LCB3YW5kLCBlcmFzZXIsIOKApikgb3JcbiAgLy8gbnVsbCB3aGVuIG5vbmUgaXMgYWN0aXZlLiBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdG9vbCBzdGF0ZSBhY3Jvc3NcbiAgLy8gdGhlIHRvb2xiYXIgYW5kIHdoaWNoZXZlciBiYWNrZW5kJ3Mgb3ZlcmxheSBoYW5kbGVzIHRoZSBwb2ludGVyLlxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZVRvb2wkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvKiogU3BhdGlhbC1vbWljcyBkaXNwbGF5IHN0YXRlIChjb2xvdXIgc291cmNlLCBwb2ludCBzaXplLCBhbHBoYSwgc2NhbGluZykuXG4gICAqICBIZWxkIGhlcmUsIG5leHQgdG8gdGhlIGNvbG9ybWFwL2NoYW5uZWwgc3RhdGUsIHNvIHRoZSBhY3RpdmUgYmFja2VuZCByZWFjdHNcbiAgICogIHRvIGFuIGVkaXQgZXhhY3RseSBhcyBpdCBkb2VzIGZvciBhbiBpbWFnZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzcGF0aWFsVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNwYXRpYWxWaWV3U3RhdGU+KHsgLi4uREVGQVVMVF9TUEFUSUFMX1ZJRVcgfSk7XG5cbiAgLy8gT3B0aW9uYWwgKyBudWxsIGRlZmF1bHQgc28gdGhlIHN0b3JlIGNhbiBiZSBjb25zdHJ1Y3RlZCBib3RoIHZpYSBESSBhbmRcbiAgLy8gZGlyZWN0bHkgKGBuZXcgVmlzdWFsaXplclN0b3JlKClgIGluIHVuaXQgdGVzdHMpOyBwcmVzZXQgbG9hZC9zYXZlIG5vLW9wXG4gIC8vIHdoZW4gdGhlIHBvcnQgaXMgYWJzZW50LlxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFBSRUZFUkVOQ0VTX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgcHJlZnNQb3J0OiBQcmVmZXJlbmNlc1BvcnQgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuaW5pdFByZXNldFBlcnNpc3RlbmNlKCk7XG4gIH1cblxuICAvLyDilIDilIAgUHJlc2V0IHBlcnNpc3RlbmNlIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGluaXRQcmVzZXRQZXJzaXN0ZW5jZSgpOiB2b2lkIHtcbiAgICAvLyBEZWJvdW5jZWQgd3JpdGUtYmFjayBzbyBhIGJ1cnN0IG9mIGVkaXRzIGNvbGxhcHNlcyBpbnRvIG9uZSBQVVQuXG4gICAgdGhpcy5zYXZlUHJlc2V0cyQucGlwZShkZWJvdW5jZVRpbWUoODAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucHJlZnNQb3J0Py5zYXZlUHJlc2V0U2V0KHRoaXMucHJlc2V0U2V0KS5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIC8qIGtlZXAgbG9jYWwgY29weSAqL1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gTG9hZCB0aGUgdXNlcidzIHNhdmVkIHNldCAoaWYgYW55KTsgb3RoZXJ3aXNlIGtlZXAgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgICB0aGlzLnByZWZzUG9ydD8ubG9hZFByZXNldFNldCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoc2V0KSA9PiB7XG4gICAgICAgIGlmIChzZXQgJiYgQXJyYXkuaXNBcnJheShzZXQuY2xhc3NlcykgJiYgc2V0LmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMucHJlc2V0U2V0ID0gdGhpcy5ub3JtYWxpemVQcmVzZXRTZXQoc2V0KTtcbiAgICAgICAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXNldHNMb2FkZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJlc2V0c0xvYWRlZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFB1Ymxpc2ggdGhlIHByZXNldCBzZXQgd2l0aCB0aGlzIHNlc3Npb24ncyBpbXBvcnRlZCBjbGFzcyBjb2xvdXJzLiAqL1xuICBwcml2YXRlIGVtaXRQcmVzZXRTZXQoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQkLm5leHQoeyAuLi50aGlzLnByZXNldFNldCwgaW1wb3J0ZWRDb2xvcnM6IHRoaXMuaW1wb3J0ZWRDb2xvcnMgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVByZXNldFNldChzZXQ6IFByZXNldFNldCk6IFByZXNldFNldCB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gICAgLy8gQ2xvbmUgdGhlIG5lc3RlZCBhcnJheXMvb2JqZWN0cyBzbyBvdXRzaWRlIGNhbGxlcnMgY2FuJ3QgbXV0YXRlIHRoZSBzdG9yZSdzXG4gICAgLy8gaW50ZXJuYWwgc3RhdGUgd2l0aG91dCBnb2luZyB0aHJvdWdoIHNldFByZXNldFNldCgpL3Vwc2VydENsYXNzKCkuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzZXM6IEFycmF5LmlzQXJyYXkoc2V0LmNsYXNzZXMpID8gc2V0LmNsYXNzZXMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSA6IFtdLFxuICAgICAgZmFsbGJhY2tQYWxldHRlOlxuICAgICAgICBBcnJheS5pc0FycmF5KHNldC5mYWxsYmFja1BhbGV0dGUpICYmIHNldC5mYWxsYmFja1BhbGV0dGUubGVuZ3RoXG4gICAgICAgICAgPyBbLi4uc2V0LmZhbGxiYWNrUGFsZXR0ZV1cbiAgICAgICAgICA6IGRlZmF1bHRzLmZhbGxiYWNrUGFsZXR0ZSxcbiAgICAgIGF1dG9Qcm9tb3RlOiAhIXNldC5hdXRvUHJvbW90ZSxcbiAgICAgIG1hdGNoTW9kZTogc2V0Lm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gJ25vcm1hbGl6ZWQnIDogJ2V4YWN0JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFF1ZXVlIGEgZGVib3VuY2VkIHNhdmUuIE5vLW9wcyB1bnRpbCB0aGUgaW5pdGlhbCBsb2FkIHJlc29sdmVzIChhbmQgd2hlbiBubyBwb3J0IGlzIGJvdW5kKS4gKi9cbiAgcHJpdmF0ZSBxdWV1ZVByZXNldFNhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlc2V0c0xvYWRlZCkgdGhpcy5zYXZlUHJlc2V0cyQubmV4dCgpO1xuICB9XG5cbiAgLyoqIFBlcnNpc3QgdGhlIGN1cnJlbnQgcHJlc2V0IHNldCBpbW1lZGlhdGVseSwgYnlwYXNzaW5nIHRoZSBpbmNyZW1lbnRhbC1lZGl0XG4gICAqICBkZWJvdW5jZS4gVXNlZCBmb3IgZXhwbGljaXQgYnVsayBhY3Rpb25zIChBcHBseSAvIEltcG9ydCAvIFJlc2V0KS4gKi9cbiAgcHJpdmF0ZSBzYXZlUHJlc2V0c05vdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVzZXRzTG9hZGVkKSB7XG4gICAgICB0aGlzLnByZWZzUG9ydD8uc2F2ZVByZXNldFNldCh0aGlzLnByZXNldFNldCkuc3Vic2NyaWJlKHtcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAvKiBrZWVwIGxvY2FsIGNvcHkgKi9cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgYXZhaWxhYmxlIGNvbG9ybWFwIG9wdGlvbnMgKHRyZWUgZm9yIHRoZSBMVVQgZHJvcGRvd24pLiAqL1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogYW55IHtcbiAgICByZXR1cm4gQ09MT1JNQVBfT1BUSU9OUztcbiAgfVxuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JtYXAkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIC8qKiBTeW5jaHJvbm91cyBjdXJyZW50IHZhbHVlIOKAlCBmb3IgcmVuZGVyIHBhdGhzIHRoYXQgcmVhZCBpdCB3aGlsZSBidWlsZGluZ1xuICAgKiAgYSBmcmFtZSAoZS5nLiBQbG90bHkncyBjb2xvcnNjYWxlKSByYXRoZXIgdGhhbiBzdWJzY3JpYmluZy4gKi9cbiAgY3VycmVudENvbG9ybWFwKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JtYXAkLnZhbHVlO1xuICB9XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9ybWFwJC5uZXh0KGNvbG9ybWFwKTtcbiAgfVxuXG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXZlcnNlU2NhbGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRSZXZlcnNlU2NhbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmV2ZXJzZVNjYWxlJC52YWx1ZTtcbiAgfVxuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmV2ZXJzZVNjYWxlJC5uZXh0KHJldmVyc2UpO1xuICB9XG5cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLmltYWdlTWV0YSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2ggdGhlIHBoeXNpY2FsIHBpeGVsIHNpemUgKMK1bS9waXhlbCkgb250byB0aGUgY3VycmVudCBpbWFnZSBtZXRhIGFuZFxuICAgKiByZS1lbWl0LCB3aXRob3V0IHRvdWNoaW5nIHRoZSBkZXJpdmVkIGNoYW5uZWxzLiBUaGUgT1NEIHRpbGUgZGVzY3JpcHRvclxuICAgKiAoZnJvbSB0aGUgc2VydmVyJ3MgQmlvLUZvcm1hdHMgYC90aWxlcy9pbmZvYCkgaXMgYXV0aG9yaXRhdGl2ZSBmb3Igc2NhbGVkXG4gICAqIGltYWdlcyDigJQgYGltYWdlSW5mby5pbWFnZU1ldGFgIG9mdGVuIGNhcnJpZXMgbm8gbXBwIOKAlCBzbyB0aGUgcmVuZGVyZXIgZmVlZHNcbiAgICogaXQgaGVyZSBvbmNlIHRoZSBkZXNjcmlwdG9yIGxvYWRzLCBsZXR0aW5nIGFyZWEvc2NhbGUgY29uc3VtZXJzICh0aGUgUmVnaW9uXG4gICAqIEVkaXRvcikgc2hvdyDCtW3Csi9tbcKyIGluc3RlYWQgb2YgcHjCsi4gTm8tb3Agd2hlbiBuZWl0aGVyIGF4aXMgaXMgcG9zaXRpdmUuXG4gICAqL1xuICBzZXRQaHlzaWNhbFBpeGVsU2l6ZShtcHBYPzogbnVtYmVyLCBtcHBZPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaGFzWCA9IChtcHBYID8/IDApID4gMCxcbiAgICAgIGhhc1kgPSAobXBwWSA/PyAwKSA+IDA7XG4gICAgaWYgKCFoYXNYICYmICFoYXNZKSByZXR1cm47XG4gICAgY29uc3QgY3VyID0gdGhpcy5pbWFnZU1ldGEkLnZhbHVlO1xuICAgIGNvbnN0IG1ldGEgPSAoY3VyICYmIGN1ci5sZW5ndGggPyBjdXIgOiBbe30gYXMgSUltYWdlTWV0YWRhdGFdKS5tYXAoKGUpID0+ICh7IC4uLmUgfSkpO1xuICAgIGlmIChoYXNYKSBtZXRhWzBdLm1wcFggPSBtcHBYO1xuICAgIGlmIChoYXNZKSBtZXRhWzBdLm1wcFkgPSBtcHBZO1xuICAgIHRoaXMuaW1hZ2VNZXRhJC5uZXh0KG1ldGEpO1xuICB9XG4gIC8qKlxuICAgKiBGaWxsIGluIHRoZSBjaGFubmVsIG5hbWVzIGFuZCB0aW50cyB0aGUgaG9zdCdzIGltYWdlIG1ldGEgbGVmdCBvdXQsIGZyb20gdGhlIGltYWdlJ3MgdGlsZVxuICAgKiBkZXNjcmlwdG9yOiB0aGUgc2VydmVyIHJlYWRzIHRoZW0gZnJvbSB0aGUgZmlsZSAoYW4gT01FLVRJRkYncyBjaGFubmVsIG5hbWVzLCBzdWNoIGFzIEN5dG9zJ3NcbiAgICogXCJBY3RpblwiIG9yIFwiQ2VsbC1NZW1icmFuZVwiKSwgd2hlcmUgYSBob3N0J3MgbWV0YWRhdGEgKGppdC11aSdzIGAvbWV0YWRhdGFgKSBjYXJyaWVzIG5vbmUsIHNvXG4gICAqIHRoZSBDaGFubmVscyBwYW5lIHNob3dlZCBcIkNoYW5uZWwgMVwiLCBcIkNoYW5uZWwgMlwi4oCmIFRoZSBob3N0J3Mgb3duIG5hbWVzIGFuZCB0aW50cyB3aW47IG9ubHkgYVxuICAgKiBjaGFubmVsIHN0aWxsIHNob3dpbmcgaXRzIGRlcml2ZWQgZGVmYXVsdCB0YWtlcyB0aGUgZGVzY3JpcHRvcidzLCBzbyBhbiBlZGl0IG1hZGUgaW4gdGhlIHBhbmVcbiAgICogc3RheXMuIEEgbm8tb3Agd2hlbiB0aGUgY2hhbm5lbCBjb3VudHMgZGlmZmVyLCBvciBmb3IgUkdCLlxuICAgKi9cbiAgYWRvcHRDaGFubmVsSW5mbyhpbmZvOiBSZWFkb25seUFycmF5PHsgbmFtZT86IHN0cmluZzsgY29sb3I/OiBzdHJpbmcgfT4gfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuaW1hZ2VNZXRhJC52YWx1ZTtcbiAgICBjb25zdCBtMCA9IG1ldGE/LlswXTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZTtcbiAgICBpZiAoIWluZm8/Lmxlbmd0aCB8fCAhbTAgfHwgKG0wLnJnYkNoYW5uZWxzID8/IDEpID49IDMpIHJldHVybjtcbiAgICBpZiAoKG0wLmNoYW5uZWxDb3VudCA/PyAxKSAhPT0gaW5mby5sZW5ndGggfHwgY3VycmVudC5sZW5ndGggIT09IGluZm8ubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgaG9zdCA9IG0wLmNoYW5uZWxJbmZvID8/IFtdO1xuICAgIGNvbnN0IG1lcmdlZDogSUNoYW5uZWxJbmZvW10gPSBpbmZvLm1hcCgoZCwgaSkgPT4gKHtcbiAgICAgIC4uLihob3N0W2ldID8/IHt9KSxcbiAgICAgIG5hbWU6IGhvc3RbaV0/Lm5hbWUgfHwgZC5uYW1lIHx8ICcnLFxuICAgICAgY29sb3I6IGhvc3RbaV0/LmNvbG9yIHx8IGQuY29sb3IgfHwgJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMuZGVmYXVsdENoYW5uZWxTdGF0ZXM7XG4gICAgY29uc3QgbmV4dE1ldGEgPSBtZXRhLm1hcCgoZSwgaykgPT4gKGsgPT09IDAgPyB7IC4uLmUsIGNoYW5uZWxJbmZvOiBtZXJnZWQgfSA6IGUpKTtcbiAgICB0aGlzLmltYWdlTWV0YSQubmV4dChuZXh0TWV0YSk7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZGVyaXZlQ2hhbm5lbHMobmV4dE1ldGEpO1xuICAgIHRoaXMuZGVmYXVsdENoYW5uZWxTdGF0ZXMgPSBuZXh0Lm1hcCgoYykgPT4gKHsgLi4uYyB9KSk7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzdGF0ZXMgPSBjdXJyZW50Lm1hcCgoc3QsIGkpID0+IHtcbiAgICAgIGNvbnN0IHdhcyA9IGJlZm9yZVtpXTtcbiAgICAgIGNvbnN0IG5vdyA9IG5leHRbaV07XG4gICAgICBpZiAoIXdhcyB8fCAhbm93KSByZXR1cm4gc3Q7XG4gICAgICBjb25zdCBwYXRjaDogUGFydGlhbDxJQ2hhbm5lbFN0YXRlPiA9IHt9O1xuICAgICAgaWYgKHN0Lm5hbWUgPT09IHdhcy5uYW1lICYmIG5vdy5uYW1lICE9PSB3YXMubmFtZSkgcGF0Y2gubmFtZSA9IG5vdy5uYW1lO1xuICAgICAgaWYgKHN0LmNvbG9yID09PSB3YXMuY29sb3IgJiYgbm93LmNvbG9yICE9PSB3YXMuY29sb3IpIHBhdGNoLmNvbG9yID0gbm93LmNvbG9yO1xuICAgICAgaWYgKCFPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoKSByZXR1cm4gc3Q7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB7IC4uLnN0LCAuLi5wYXRjaCB9O1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLmNoYW5uZWxTdGF0ZXMkLm5leHQoc3RhdGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIHRoZSBjdXJyZW50IGltYWdlJ3MgbWV0YWRhdGEgYW5kIGRlcml2ZSBpdHMgY2hhbm5lbHMuXG4gICAqXG4gICAqIGBpbWFnZUtleWAgaWRlbnRpZmllcyB0aGUgaW1hZ2UgKGl0cyBmaWxlIG5hbWUpLiBBIHJlLXBsb3Qgb2YgdGhlIFNBTUUgaW1hZ2VcbiAgICoga2VlcHMgdGhlIHVzZXIncyB3aW5kb3cvZ2FtbWEvdGludCBlZGl0czsgYSBkaWZmZXJlbnQgaW1hZ2UgZ2V0cyBpdHMgb3duXG4gICAqIGRlcml2ZWQgY2hhbm5lbHMgZXZlbiBhdCB0aGUgc2FtZSBjaGFubmVsIGNvdW50IOKAlCBrZXlpbmcgb24gdGhlIGNvdW50IGFsb25lXG4gICAqIGxlZnQgYSBEQVBJL0dGUC9SRlAgc3RhY2sncyBuYW1lcywgdGludHMgYW5kIHdpbmRvd3Mgb24gYSBmb2xsb3dpbmdcbiAgICogQ0QzL0NEOC9QYW5DSyBvbmUuIFdpdGhvdXQgYSBrZXksIG9ubHkgYSBjaGFuZ2Ugb2YgY2hhbm5lbCBjb3VudCByZS1kZXJpdmVzLlxuICAgKi9cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlTWV0YSQubmV4dChpbWFnZU1ldGEpO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmRlcml2ZUNoYW5uZWxzKGltYWdlTWV0YSk7XG4gICAgLy8gQWx3YXlzIHJlZnJlc2ggdGhlIHJlc2V0IGJhc2VsaW5lIHRvIHRoZSBjdXJyZW50IGltYWdlJ3MgZGVyaXZlZCBkZWZhdWx0c1xuICAgIC8vIChuYW1lcy9jb2xvdXJzIGNhbiBkaWZmZXIgZXZlbiBhdCB0aGUgc2FtZSBjaGFubmVsIGNvdW50KS5cbiAgICB0aGlzLmRlZmF1bHRDaGFubmVsU3RhdGVzID0gbmV4dC5tYXAoKGMpID0+ICh7IC4uLmMgfSkpO1xuICAgIGNvbnN0IG90aGVySW1hZ2UgPSBpbWFnZUtleSAhPT0gdW5kZWZpbmVkICYmIGltYWdlS2V5ICE9PSB0aGlzLmNoYW5uZWxJbWFnZUtleTtcbiAgICBpZiAoaW1hZ2VLZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5jaGFubmVsSW1hZ2VLZXkgPSBpbWFnZUtleTtcbiAgICBpZiAob3RoZXJJbWFnZSB8fCBuZXh0Lmxlbmd0aCAhPT0gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChuZXh0KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDaGFubmVsJC5uZXh0KDApOyAvLyBuZXcgaW1hZ2UgLyBjaGFubmVsIHN0cnVjdHVyZSDihpIgcmVzZXQgdGhlIHNlbGVjdGVkIGJhbmRcbiAgICB9XG4gIH1cblxuICAvKiogQ2hhbm5lbHMgZm9yIGFuIGltYWdlOlxuICAgKiAgIC0gUkdCIChyZ2JDaGFubmVscyDiiaUgMykg4oaSIFJlZC9HcmVlbi9CbHVlO1xuICAgKiAgIC0gbXVsdGljaGFubmVsIGZsdW9yZXNjZW5jZSAoY2hhbm5lbENvdW50ID4gMSkg4oaSIG9uZSBjaGFubmVsIHBlciBiYW5kLFxuICAgKiAgICAgbmFtZWQvdGludGVkIGZyb20gdGhlIHNlcnZlciBgY2hhbm5lbEluZm9gIHdoZW4gcHJlc2VudCwgZWxzZSBhIHBhbGV0dGU7XG4gICAqICAgICBvbmx5IHRoZSBmaXJzdCBgREVGQVVMVF9WSVNJQkxFX0NIQU5ORUxTYCBzdGFydCB2aXNpYmxlIChzZWUgYGRlZmF1bHRDaGFubmVsVmlzaWJsZWApO1xuICAgKiAgIC0gb3RoZXJ3aXNlIGEgc2luZ2xlIGdyYXlzY2FsZSBcIkludGVuc2l0eVwiIGNoYW5uZWwuICovXG4gIHByaXZhdGUgZGVyaXZlQ2hhbm5lbHMobWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IElDaGFubmVsU3RhdGVbXSB7XG4gICAgY29uc3QgYmFzZSA9IHsgbWluOiAwLCBtYXg6IDI1NSwgZ2FtbWE6IDEsIHZpc2libGU6IHRydWUgfTtcbiAgICBjb25zdCBtID0gbWV0YT8uWzBdO1xuICAgIGlmICgobT8ucmdiQ2hhbm5lbHMgPz8gMSkgPj0gMykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBpbmRleDogMCwgbmFtZTogJ1JlZCcsIGNvbG9yOiAnI2ZmMDAwMCcsIC4uLmJhc2UgfSxcbiAgICAgICAgeyBpbmRleDogMSwgbmFtZTogJ0dyZWVuJywgY29sb3I6ICcjMDBmZjAwJywgLi4uYmFzZSB9LFxuICAgICAgICB7IGluZGV4OiAyLCBuYW1lOiAnQmx1ZScsIGNvbG9yOiAnIzAwMDBmZicsIC4uLmJhc2UgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGNvdW50ID0gbT8uY2hhbm5lbENvdW50ID8/IDE7XG4gICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgY29uc3QgaW5mbyA9IG0/LmNoYW5uZWxJbmZvO1xuICAgICAgLy8gRmFsbGJhY2sgdGludHMgKEZpamktaXNoKSB3aGVuIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwbHkgYSBjb2xvci5cbiAgICAgIGNvbnN0IHBhbGV0dGUgPSBbJyNmZjAwMDAnLCAnIzAwZmYwMCcsICcjMDAwMGZmJywgJyNmZmZmZmYnLCAnIzAwZmZmZicsICcjZmYwMGZmJywgJyNmZmZmMDAnXTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gKHtcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIG5hbWU6IGluZm8/LltpXT8ubmFtZSB8fCBgQ2hhbm5lbCAke2kgKyAxfWAsXG4gICAgICAgIGNvbG9yOiBpbmZvPy5baV0/LmNvbG9yIHx8IHBhbGV0dGVbaSAlIHBhbGV0dGUubGVuZ3RoXSxcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgdmlzaWJsZTogZGVmYXVsdENoYW5uZWxWaXNpYmxlKGksIGNvdW50LCBpbmZvPy5baV0/LnZpc2libGUpLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gW3sgaW5kZXg6IDAsIG5hbWU6ICdJbnRlbnNpdHknLCBjb2xvcjogJyNmZmZmZmYnLCAuLi5iYXNlIH1dO1xuICB9XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzICYgaGlzdG9ncmFtIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRDaGFubmVsU3RhdGVzKCk6IE9ic2VydmFibGU8SUNoYW5uZWxTdGF0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbFN0YXRlcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudENoYW5uZWxTdGF0ZXMoKTogSUNoYW5uZWxTdGF0ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZTtcbiAgfVxuICAvKiogVGhlIGNoYW5uZWwgc2VsZWN0ZWQgaW4gdGhlIHBhbmUgKGRyaXZlcyBhIHNpbmdsZS1zY2FsYXIgM0QgU3VyZmFjZSkuICovXG4gIGdldFNlbGVjdGVkQ2hhbm5lbCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ2hhbm5lbCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudFNlbGVjdGVkQ2hhbm5lbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ2hhbm5lbCQudmFsdWU7XG4gIH1cbiAgc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZENoYW5uZWwkLnZhbHVlICE9PSBpbmRleCkgdGhpcy5zZWxlY3RlZENoYW5uZWwkLm5leHQoaW5kZXgpO1xuICB9XG4gIC8qKiBQYXRjaCBvbmUgY2hhbm5lbCBieSBpbmRleCAoaW1tdXRhYmxlIHVwZGF0ZSkuICovXG4gIHNldENoYW5uZWxTdGF0ZShpbmRleDogbnVtYmVyLCBwYXJ0aWFsOiBQYXJ0aWFsPElDaGFubmVsU3RhdGU+KTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhbm5lbFN0YXRlcyQudmFsdWUubWFwKChjKSA9PlxuICAgICAgYy5pbmRleCA9PT0gaW5kZXggPyB7IC4uLmMsIC4uLnBhcnRpYWwsIGluZGV4OiBjLmluZGV4IH0gOiBjLFxuICAgICk7XG4gICAgdGhpcy5jaGFubmVsU3RhdGVzJC5uZXh0KG5leHQpO1xuICB9XG4gIC8qKiBSZXBsYWNlIGFsbCBjaGFubmVsIHN0YXRlcyAodXNlZCBieSBhdXRvL3Jlc2V0KS4gKi9cbiAgc2V0Q2hhbm5lbFN0YXRlcyhzdGF0ZXM6IElDaGFubmVsU3RhdGVbXSk6IHZvaWQge1xuICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChzdGF0ZXMpO1xuICB9XG4gIC8qKiBSZXNldCBvbmUgY2hhbm5lbCdzIGRpc3BsYXkgd2luZG93LCBnYW1tYSBBTkQgY29sb3VyIHRvIHRoZSB2YWx1ZXMgZGVyaXZlZFxuICAgKiAgZm9yIHRoZSBjdXJyZW50IGltYWdlIChmdWxsIDAuLjI1NSByYW5nZSwgZ2FtbWEgMSwgdGhlIGNoYW5uZWwncyBkZWZhdWx0XG4gICAqICB0aW50KS4gRmFsbHMgYmFjayB0byBuZXV0cmFsIGRlZmF1bHRzIGlmIG5vIGJhc2VsaW5lIHdhcyBjYXB0dXJlZC4gKi9cbiAgcmVzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuZGVmYXVsdENoYW5uZWxTdGF0ZXMuZmluZCgoYykgPT4gYy5pbmRleCA9PT0gaW5kZXgpO1xuICAgIHRoaXMuc2V0Q2hhbm5lbFN0YXRlKGluZGV4LCB7XG4gICAgICBtaW46IGRlZj8ubWluID8/IDAsXG4gICAgICBtYXg6IGRlZj8ubWF4ID8/IDI1NSxcbiAgICAgIGdhbW1hOiBkZWY/LmdhbW1hID8/IDEsXG4gICAgICBjb2xvcjogZGVmPy5jb2xvciA/PyAnI2ZmZmZmZicsXG4gICAgfSk7XG4gIH1cblxuICBnZXRHcmF5c2NhbGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JheXNjYWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBjdXJyZW50R3JheXNjYWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyYXlzY2FsZSQudmFsdWU7XG4gIH1cbiAgc2V0R3JheXNjYWxlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ncmF5c2NhbGUkLm5leHQob24pO1xuICB9XG5cbiAgZ2V0SW52ZXJ0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmludmVydCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudEludmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnZlcnQkLnZhbHVlO1xuICB9XG4gIHNldEludmVydChvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW52ZXJ0JC5uZXh0KG9uKTtcbiAgfVxuXG4gIC8qKiBOYW1l4oaSY29sb3VyIHZpZXcgb2YgdGhlIGN1cnJlbnQgcHJlc2V0IHNldCAoY29tcGF0IGZvciBiYWNrZW5kIHJlbmRlcmVyc1xuICAgKiAgdGhhdCBzdGlsbCByZWFkIGEgTWFwKS4gKi9cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5tYXAoKGMpID0+IFtjLm5hbWUsIGMuY29sb3JdKSk7XG4gIH1cbiAgLyoqIFVwc2VydCBhIHNpbmdsZSBjbGFzcyBjb2xvdXIgKHVzZWQgYnkgdGhlIGVkaXRvcidzIHBlci1jbGFzcyBjb2xvdXIgcGlja2VyKS4gKi9cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51cHNlcnRDbGFzcyh7IG5hbWU6IGxhYmVsLCBjb2xvciB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBBbm5vdGF0aW9uLWNsYXNzIHByZXNldCBzZXQgYWNjZXNzb3JzIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgICAvLyBEZWZlbnNpdmUgY29weTogY2FsbGVycyBtdXN0IG5vdCBtdXRhdGUgdGhlIHN0b3JlJ3Mgc3RhdGUgaW4gcGxhY2Ug4oCUXG4gICAgLy8gYWxsIGNoYW5nZXMgZ28gdGhyb3VnaCBzZXRQcmVzZXRTZXQoKS91cHNlcnRDbGFzcygpL3JlbW92ZUNsYXNzKCkgc29cbiAgICAvLyBwcmVzZXRTZXQkIGFuZCBwZXJzaXN0ZW5jZSBzdGF5IGluIHN5bmMuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzZXM6IHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSxcbiAgICAgIGZhbGxiYWNrUGFsZXR0ZTogWy4uLnRoaXMucHJlc2V0U2V0LmZhbGxiYWNrUGFsZXR0ZV0sXG4gICAgICBhdXRvUHJvbW90ZTogdGhpcy5wcmVzZXRTZXQuYXV0b1Byb21vdGUsXG4gICAgICBtYXRjaE1vZGU6IHRoaXMucHJlc2V0U2V0Lm1hdGNoTW9kZSxcbiAgICAgIGltcG9ydGVkQ29sb3JzOiB7IC4uLnRoaXMuaW1wb3J0ZWRDb2xvcnMgfSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBSZW1lbWJlciB0aGUgY2xhc3MgY29sb3VycyBhbiBpbXBvcnRlZCBmaWxlIGNhcnJpZWQgKGxhYmVsIOKGkiBjb2xvdXIpLCBzbyBpdHMgcmVnaW9ucyBrZWVwXG4gICAqIHRoZW06IGEgY2xhc3Mgd2l0aCBhIHByZXNldCBrZWVwcyB0aGUgcHJlc2V0J3MgY29sb3VyLCBhbmQgdGhlIGxhdGVzdCBpbXBvcnQgd2lucyBmb3IgdGhlXG4gICAqIHJlc3QuIE5vdCBwZXJzaXN0ZWQuXG4gICAqL1xuICByZW1lbWJlckltcG9ydGVkQ2xhc3NDb2xvcnMoY29sb3JzOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2xhYmVsLCBjb2xvcl0gb2YgY29sb3JzKSB7XG4gICAgICBpZiAoIWxhYmVsIHx8IGZpbmRQcmVzZXQobGFiZWwsIHRoaXMucHJlc2V0U2V0KSkgY29udGludWU7XG4gICAgICBjb25zdCBrZXkgPSBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGxhYmVsKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkQ29sb3JzW2tleV0gPT09IGNvbG9yKSBjb250aW51ZTtcbiAgICAgIHRoaXMuaW1wb3J0ZWRDb2xvcnMgPSB7IC4uLnRoaXMuaW1wb3J0ZWRDb2xvcnMsIFtrZXldOiBjb2xvciB9O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkKSB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2V0U2V0JC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBzZXRQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNldFNldCA9IHRoaXMubm9ybWFsaXplUHJlc2V0U2V0KHNldCk7XG4gICAgdGhpcy5lbWl0UHJlc2V0U2V0KCk7XG4gICAgdGhpcy5zYXZlUHJlc2V0c05vdygpOyAvLyBleHBsaWNpdCBidWxrIGFwcGx5L2ltcG9ydCDihpIgcGVyc2lzdCBpbW1lZGlhdGVseVxuICB9XG4gIC8qKiBBZGQgb3IgdXBkYXRlIGEgY2xhc3MgKGtleWVkIGJ5IGV4YWN0IHN0b3JlZCBgbmFtZWApLiAqL1xuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFsuLi50aGlzLnByZXNldFNldC5jbGFzc2VzXTtcbiAgICBjb25zdCBpID0gY2xhc3Nlcy5maW5kSW5kZXgoKGMpID0+IGMubmFtZSA9PT0gcHJlc2V0Lm5hbWUpO1xuICAgIGlmIChpID49IDApIGNsYXNzZXNbaV0gPSB7IC4uLmNsYXNzZXNbaV0sIC4uLnByZXNldCB9O1xuICAgIGVsc2UgY2xhc3Nlcy5wdXNoKHsgLi4ucHJlc2V0IH0pO1xuICAgIHRoaXMucHJlc2V0U2V0ID0geyAuLi50aGlzLnByZXNldFNldCwgY2xhc3NlcyB9O1xuICAgIHRoaXMuZW1pdFByZXNldFNldCgpO1xuICAgIHRoaXMucXVldWVQcmVzZXRTYXZlKCk7XG4gIH1cbiAgcmVtb3ZlQ2xhc3MobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQgPSB7IC4uLnRoaXMucHJlc2V0U2V0LCBjbGFzc2VzOiB0aGlzLnByZXNldFNldC5jbGFzc2VzLmZpbHRlcigoYykgPT4gYy5uYW1lICE9PSBuYW1lKSB9O1xuICAgIHRoaXMuZW1pdFByZXNldFNldCgpO1xuICAgIHRoaXMucXVldWVQcmVzZXRTYXZlKCk7XG4gIH1cbiAgcmVzZXRQcmVzZXRzKCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0U2V0ID0gZGVmYXVsdFByZXNldFNldCgpO1xuICAgIHRoaXMuZW1pdFByZXNldFNldCgpO1xuICAgIHRoaXMuc2F2ZVByZXNldHNOb3coKTsgLy8gZXhwbGljaXQgcmVzZXQg4oaSIHBlcnNpc3QgaW1tZWRpYXRlbHlcbiAgfVxuXG4gIC8vIOKUgOKUgCBzcGF0aWFsLW9taWNzIHZpZXcgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFNwYXRpYWxWaWV3JCgpOiBPYnNlcnZhYmxlPFNwYXRpYWxWaWV3U3RhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5zcGF0aWFsVmlldyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgcmVhZCwgZm9yIGEgcmVuZGVyZXIgYnVpbGRpbmcgaXRzIGZpcnN0IGZyYW1lLiAqL1xuICBjdXJyZW50U3BhdGlhbFZpZXcoKTogU3BhdGlhbFZpZXdTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFZpZXckLnZhbHVlO1xuICB9XG5cbiAgLyoqIFBhdGNoIHRoZSBzcGF0aWFsIHZpZXcgc3RhdGU7IGVtaXRzIG9uY2Ugd2l0aCB0aGUgbWVyZ2VkIHZhbHVlLiAqL1xuICBzZXRTcGF0aWFsVmlldyhwYXJ0aWFsOiBQYXJ0aWFsPFNwYXRpYWxWaWV3U3RhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zcGF0aWFsVmlldyQubmV4dCh7IC4uLnRoaXMuc3BhdGlhbFZpZXckLnZhbHVlLCAuLi5wYXJ0aWFsIH0pO1xuICB9XG5cbiAgZ2V0QWN0aXZlVG9vbCQoKTogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVG9vbCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgc2V0QWN0aXZlVG9vbCh0b29sOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVUb29sJC5uZXh0KHRvb2wpO1xuICB9XG59XG4iXX0=
450
+ /** Whether two group paths are the same (absent and empty alike). */
451
+ function sameGroup(a, b) {
452
+ const x = a ?? [];
453
+ const y = b ?? [];
454
+ return x.length === y.length && x.every((v, i) => v === y[i]);
455
+ }
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQTBCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFHeEYsT0FBTyxFQUFFLHFCQUFxQixFQUFpQixNQUFNLDZDQUE2QyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxvQkFBb0IsRUFBb0IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFckQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUF5RDFCLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsMkJBQTJCO0lBQzNCLFlBQW1FLFlBQW9DLElBQUk7UUFBeEMsY0FBUyxHQUFULFNBQVMsQ0FBK0I7UUEzRDNHLHdFQUF3RTtRQUN4RSw4RUFBOEU7UUFDOUUscURBQXFEO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FDOUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxXQUFXLENB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cm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0LCBkZWZhdWx0UHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBmaW5kUHJlc2V0LCBwcmVzZXRLZXkgfSBmcm9tICcuL2NsYXNzLWNvbG9yLnV0aWwnO1xuaW1wb3J0IHsgUFJFRkVSRU5DRVNfUE9SVCwgUHJlZmVyZW5jZXNQb3J0IH0gZnJvbSAnLi4vY29udHJhY3RzL3BvcnRzL3ByZWZlcmVuY2VzLnBvcnQnO1xuXG5pbXBvcnQgeyBJQ2hhbm5lbEluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IGRlZmF1bHRDaGFubmVsVmlzaWJsZSwgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBDT0xPUk1BUF9PUFRJT05TIH0gZnJvbSAnLi4vcGxvdC51dGlsaXRpZXMnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCBzdG9yZSBmb3IgdGhlICoqdmlzdWFsaXphdGlvbiBzZXNzaW9uKiog4oCUIHRoZSBzdGF0ZSB0aGF0XG4gKiBkZXNjcmliZXMgKmhvdyogdGhlIGN1cnJlbnQgaW1hZ2UgaXMgYmVpbmcgdmlld2VkLCBpbmRlcGVuZGVudCBvZiB3aGljaFxuICogcmVuZGVyaW5nIGJhY2tlbmQgKFBsb3RseSwgT3BlblNlYWRyYWdvbiBvciBuYXBhcmktanMpIGlzIG9uIHNjcmVlbjpcbiAqXG4gKiAgLSB0aGUgYWN0aXZlIGNvbG9ybWFwIC8gTFVUIGFuZCBpdHMgcmV2ZXJzZS1zY2FsZSB0b2dnbGUsXG4gKiAgLSB0aGUgY3VycmVudCBpbWFnZSdzIHBoeXNpY2FsIG1ldGFkYXRhICjCtW0vcGl4ZWwgZXRjLikgYW5kIGl0cyBwZXItY2hhbm5lbFxuICogICAgZGlzcGxheSBzdGF0ZSAod2luZG93LCBnYW1tYSwgdGludCwgdmlzaWJpbGl0eTsgZ3JheXNjYWxlIC8gaW52ZXJ0KSxcbiAqICAtIHRoZSBhbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgKHRoZSBjbGFzc2lmaWNhdGlvbiBsYWJlbCDihpIgY29sb3VyIG1hcCksXG4gKiAgLSB0aGUgc3BhdGlhbC1vbWljcyB2aWV3IHN0YXRlLFxuICogIC0gd2hpY2ggb24tY2FudmFzIHRvb2wgaXMgY3VycmVudGx5IGFjdGl2ZS5cbiAqXG4gKiBFdmVyeSBiYWNrZW5kIHJlYWRzIGFuZCB3cml0ZXMgdGhpcyBzaW5nbGUgaW5zdGFuY2UgKG9uZSBwZXIgdmlzdWFsaXplciBjaGFpbiksXG4gKiBzbyB0aGV5IHN0YXkgaW4gbG9jay1zdGVwIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIGlzIHJlbmRlcmluZzsgbm9uZSBvZiB0aGVtXG4gKiBvd25zIHRoZSBzZXNzaW9uIHN0YXRlLiBSZWdpb24gZ2VvbWV0cnkgbGl2ZXMgaW4gdGhlIHNpYmxpbmcgYFJlZ2lvblN0b3JlYC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyU3RvcmUge1xuICAvLyDilIDilIAgQ29sb3JtYXAgLyBMVVQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIERlZmF1bHQgdG8gaW52ZXJ0ZWQgZ3JleXMgKGRhcmsgYmFja2dyb3VuZCDihpIgYnJpZ2h0IHNpZ25hbCksIHdoaWNoIHJlYWRzIGFzXG4gIC8vIHRoZSBuYXR1cmFsIGdyYXlzY2FsZSBmb3IgdGhlc2UgbWljcm9zY29weSBpbWFnZXMuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29sb3JtYXAkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KFxuICAgIENPTE9STUFQX09QVElPTlNbMF0uY2hpbGRyZW4uZmluZCgoYzogYW55KSA9PiBjLmxhYmVsID09PSAnR3JleXMgSW52JykgPz8gQ09MT1JNQVBfT1BUSU9OU1swXS5jaGlsZHJlblswXSxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXZlcnNlU2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8g4pSA4pSAIEltYWdlIG1ldGFkYXRhIChwaHlzaWNhbCBwaXhlbCBzaXplLCBjaGFubmVscywg4oCmKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZU1ldGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJSW1hZ2VNZXRhZGF0YVtdPihbXSk7XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzICYgaGlzdG9ncmFtIGRpc3BsYXkgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFBlci1jaGFubmVsIGRpc3BsYXkgd2luZG93L2dhbW1hL3Zpc2liaWxpdHkvY29sb3VyLCBkZXJpdmVkIGZyb20gdGhlIGltYWdlXG4gIC8vIG1ldGFkYXRhIG9uIGxvYWQgKDEgXCJJbnRlbnNpdHlcIiBjaGFubmVsIGZvciBncmF5c2NhbGU7IFIvRy9CIGZvciBSR0IpLiBUaGVcbiAgLy8gQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSBlZGl0cyB0aGVzZSBhbmQgYm90aCBiYWNrZW5kcyByZWNvbG9yIGxpdmUuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbm5lbFN0YXRlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElDaGFubmVsU3RhdGVbXT4oW10pO1xuICAvKiogSW5kZXggb2YgdGhlIGNoYW5uZWwgc2VsZWN0ZWQgaW4gdGhlIENoYW5uZWxzIHBhbmUg4oCUIHRoZSBPTkUgYmFuZCBhXG4gICAqICBzaW5nbGUtc2NhbGFyIDNEIHZpZXcgKHRoZSBuYXBhcmkgU3VyZmFjZSkgZm9sbG93cyBmb3IgYSBtdWx0aWNoYW5uZWwgaW1hZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRDaGFubmVsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgLy8gVGhlIGRlcml2ZWQgZGVmYXVsdHMgKGZ1bGwgd2luZG93LCBnYW1tYSAxLCBkZWZhdWx0IHRpbnQpIGZvciB0aGUgY3VycmVudFxuICAvLyBpbWFnZSwga2VwdCBzbyBcIlJlc2V0XCIgY2FuIHJlc3RvcmUgYSBjaGFubmVsJ3Mgd2luZG93L2dhbW1hL2NvbG91ci5cbiAgcHJpdmF0ZSBkZWZhdWx0Q2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgd2VyZSBkZXJpdmVkIGZvciAoc2VlIHNldEltYWdlTWV0YSkuICovXG4gIHByaXZhdGUgY2hhbm5lbEltYWdlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgY2hhbm5lbCBpbmZvIHRoZSBob3N0IGdhdmUgd2l0aCB0aGUgaW1hZ2UgKHNlZSBzZXRJbWFnZU1ldGEpLCBhcGFydCBmcm9tIHdoYXQgYSB0aWxlXG4gICAqICBkZXNjcmlwdG9yIGFkZGVkIHNpbmNlOiBlYWNoIGFkb3B0aW9uIG1lcmdlcyBhZ2FpbnN0IHRoaXMsIHNvIGEgbGF0ZXIgZGVzY3JpcHRvciBjYW4gY2hhbmdlXG4gICAqICBvciBjbGVhciB3aGF0IGFuIGVhcmxpZXIgb25lIHB1dCBpbi4gKi9cbiAgcHJpdmF0ZSBob3N0Q2hhbm5lbEluZm86IElDaGFubmVsSW5mb1tdID0gW107XG4gIC8vIEdyYXlzY2FsZSBkaXNwbGF5IChpZ25vcmUgdGhlIGNoYW5uZWwgdGludHMpIGFuZCBpbnZlcnRlZCBiYWNrZ3JvdW5kIOKAlCBib3RoXG4gIC8vIGdsb2JhbCBkaXNwbGF5IGZsYWdzLCBsaWtlIHRoZSBjb2xvcm1hcC5cbiAgcHJpdmF0ZSByZWFkb25seSBncmF5c2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW52ZXJ0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIOKUgOKUgCBBbm5vdGF0aW9uIGNsYXNzIHByZXNldHMgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFRoZSBwZXItdXNlciwgc2VydmVyLXBlcnNpc3RlZCBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJlZ2lvbiBjb2xvdXJzLCBzZWVkZWRcbiAgLy8gZnJvbSB0aGUgaGlzdG9yaWNhbCBkZWZhdWx0IGNsYXNzZXMuIExvYWRlZC9zYXZlZCB2aWEgdGhlIG9wdGlvbmFsXG4gIC8vIFByZWZlcmVuY2VzUG9ydCAoYXBwLXNpZGUgYWRhcHRlciDihpIgaml0LXNlcnZpY2UpLiBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpXG4gIC8vIGJlbG93IHN0YXlzIGFzIGEgbmFtZeKGkmNvbG91ciB2aWV3IGZvciB0aGUgYmFja2VuZHMnIHJlZ2lvbiByZW5kZXJlcnMuXG4gIHByaXZhdGUgcHJlc2V0U2V0OiBQcmVzZXRTZXQgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gIC8qKiBTZXNzaW9uLW9ubHkgY2xhc3MgY29sb3VycyBmcm9tIGltcG9ydGVkIGZpbGVzIChzZWUgUHJlc2V0U2V0LmltcG9ydGVkQ29sb3JzKS4gKi9cbiAgcHJpdmF0ZSBpbXBvcnRlZENvbG9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXNldFNldCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByZXNldFNldD4odGhpcy5wcmVzZXRTZXQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdmVQcmVzZXRzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcHJlc2V0c0xvYWRlZCA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBY3RpdmUgb24tY2FudmFzIHRvb2wg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFdoaWNoIHRvb2wgdGhlIHVzZXIgaGFzIGFybWVkIChwYW4sIHpvb20sIGRyYXdyZWN0LCB3YW5kLCBlcmFzZXIsIOKApikgb3JcbiAgLy8gbnVsbCB3aGVuIG5vbmUgaXMgYWN0aXZlLiBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdG9vbCBzdGF0ZSBhY3Jvc3NcbiAgLy8gdGhlIHRvb2xiYXIgYW5kIHdoaWNoZXZlciBiYWNrZW5kJ3Mgb3ZlcmxheSBoYW5kbGVzIHRoZSBwb2ludGVyLlxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZVRvb2wkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvKiogU3BhdGlhbC1vbWljcyBkaXNwbGF5IHN0YXRlIChjb2xvdXIgc291cmNlLCBwb2ludCBzaXplLCBhbHBoYSwgc2NhbGluZykuXG4gICAqICBIZWxkIGhlcmUsIG5leHQgdG8gdGhlIGNvbG9ybWFwL2NoYW5uZWwgc3RhdGUsIHNvIHRoZSBhY3RpdmUgYmFja2VuZCByZWFjdHNcbiAgICogIHRvIGFuIGVkaXQgZXhhY3RseSBhcyBpdCBkb2VzIGZvciBhbiBpbWFnZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzcGF0aWFsVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNwYXRpYWxWaWV3U3RhdGU+KHsgLi4uREVGQVVMVF9TUEFUSUFMX1ZJRVcgfSk7XG5cbiAgLy8gT3B0aW9uYWwgKyBudWxsIGRlZmF1bHQgc28gdGhlIHN0b3JlIGNhbiBiZSBjb25zdHJ1Y3RlZCBib3RoIHZpYSBESSBhbmRcbiAgLy8gZGlyZWN0bHkgKGBuZXcgVmlzdWFsaXplclN0b3JlKClgIGluIHVuaXQgdGVzdHMpOyBwcmVzZXQgbG9hZC9zYXZlIG5vLW9wXG4gIC8vIHdoZW4gdGhlIHBvcnQgaXMgYWJzZW50LlxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFBSRUZFUkVOQ0VTX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgcHJlZnNQb3J0OiBQcmVmZXJlbmNlc1BvcnQgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuaW5pdFByZXNldFBlcnNpc3RlbmNlKCk7XG4gIH1cblxuICAvLyDilIDilIAgUHJlc2V0IHBlcnNpc3RlbmNlIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGluaXRQcmVzZXRQZXJzaXN0ZW5jZSgpOiB2b2lkIHtcbiAgICAvLyBEZWJvdW5jZWQgd3JpdGUtYmFjayBzbyBhIGJ1cnN0IG9mIGVkaXRzIGNvbGxhcHNlcyBpbnRvIG9uZSBQVVQuXG4gICAgdGhpcy5zYXZlUHJlc2V0cyQucGlwZShkZWJvdW5jZVRpbWUoODAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucHJlZnNQb3J0Py5zYXZlUHJlc2V0U2V0KHRoaXMucHJlc2V0U2V0KS5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIC8qIGtlZXAgbG9jYWwgY29weSAqL1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gTG9hZCB0aGUgdXNlcidzIHNhdmVkIHNldCAoaWYgYW55KTsgb3RoZXJ3aXNlIGtlZXAgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgICB0aGlzLnByZWZzUG9ydD8ubG9hZFByZXNldFNldCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoc2V0KSA9PiB7XG4gICAgICAgIGlmIChzZXQgJiYgQXJyYXkuaXNBcnJheShzZXQuY2xhc3NlcykgJiYgc2V0LmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMucHJlc2V0U2V0ID0gdGhpcy5ub3JtYWxpemVQcmVzZXRTZXQoc2V0KTtcbiAgICAgICAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXNldHNMb2FkZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJlc2V0c0xvYWRlZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFB1Ymxpc2ggdGhlIHByZXNldCBzZXQgd2l0aCB0aGlzIHNlc3Npb24ncyBpbXBvcnRlZCBjbGFzcyBjb2xvdXJzLiAqL1xuICBwcml2YXRlIGVtaXRQcmVzZXRTZXQoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQkLm5leHQoeyAuLi50aGlzLnByZXNldFNldCwgaW1wb3J0ZWRDb2xvcnM6IHRoaXMuaW1wb3J0ZWRDb2xvcnMgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVByZXNldFNldChzZXQ6IFByZXNldFNldCk6IFByZXNldFNldCB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gICAgLy8gQ2xvbmUgdGhlIG5lc3RlZCBhcnJheXMvb2JqZWN0cyBzbyBvdXRzaWRlIGNhbGxlcnMgY2FuJ3QgbXV0YXRlIHRoZSBzdG9yZSdzXG4gICAgLy8gaW50ZXJuYWwgc3RhdGUgd2l0aG91dCBnb2luZyB0aHJvdWdoIHNldFByZXNldFNldCgpL3Vwc2VydENsYXNzKCkuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzZXM6IEFycmF5LmlzQXJyYXkoc2V0LmNsYXNzZXMpID8gc2V0LmNsYXNzZXMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSA6IFtdLFxuICAgICAgZmFsbGJhY2tQYWxldHRlOlxuICAgICAgICBBcnJheS5pc0FycmF5KHNldC5mYWxsYmFja1BhbGV0dGUpICYmIHNldC5mYWxsYmFja1BhbGV0dGUubGVuZ3RoXG4gICAgICAgICAgPyBbLi4uc2V0LmZhbGxiYWNrUGFsZXR0ZV1cbiAgICAgICAgICA6IGRlZmF1bHRzLmZhbGxiYWNrUGFsZXR0ZSxcbiAgICAgIGF1dG9Qcm9tb3RlOiAhIXNldC5hdXRvUHJvbW90ZSxcbiAgICAgIG1hdGNoTW9kZTogc2V0Lm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gJ25vcm1hbGl6ZWQnIDogJ2V4YWN0JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFF1ZXVlIGEgZGVib3VuY2VkIHNhdmUuIE5vLW9wcyB1bnRpbCB0aGUgaW5pdGlhbCBsb2FkIHJlc29sdmVzIChhbmQgd2hlbiBubyBwb3J0IGlzIGJvdW5kKS4gKi9cbiAgcHJpdmF0ZSBxdWV1ZVByZXNldFNhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlc2V0c0xvYWRlZCkgdGhpcy5zYXZlUHJlc2V0cyQubmV4dCgpO1xuICB9XG5cbiAgLyoqIFBlcnNpc3QgdGhlIGN1cnJlbnQgcHJlc2V0IHNldCBpbW1lZGlhdGVseSwgYnlwYXNzaW5nIHRoZSBpbmNyZW1lbnRhbC1lZGl0XG4gICAqICBkZWJvdW5jZS4gVXNlZCBmb3IgZXhwbGljaXQgYnVsayBhY3Rpb25zIChBcHBseSAvIEltcG9ydCAvIFJlc2V0KS4gKi9cbiAgcHJpdmF0ZSBzYXZlUHJlc2V0c05vdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVzZXRzTG9hZGVkKSB7XG4gICAgICB0aGlzLnByZWZzUG9ydD8uc2F2ZVByZXNldFNldCh0aGlzLnByZXNldFNldCkuc3Vic2NyaWJlKHtcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAvKiBrZWVwIGxvY2FsIGNvcHkgKi9cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgYXZhaWxhYmxlIGNvbG9ybWFwIG9wdGlvbnMgKHRyZWUgZm9yIHRoZSBMVVQgZHJvcGRvd24pLiAqL1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogYW55IHtcbiAgICByZXR1cm4gQ09MT1JNQVBfT1BUSU9OUztcbiAgfVxuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JtYXAkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIC8qKiBTeW5jaHJvbm91cyBjdXJyZW50IHZhbHVlIOKAlCBmb3IgcmVuZGVyIHBhdGhzIHRoYXQgcmVhZCBpdCB3aGlsZSBidWlsZGluZ1xuICAgKiAgYSBmcmFtZSAoZS5nLiBQbG90bHkncyBjb2xvcnNjYWxlKSByYXRoZXIgdGhhbiBzdWJzY3JpYmluZy4gKi9cbiAgY3VycmVudENvbG9ybWFwKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JtYXAkLnZhbHVlO1xuICB9XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9ybWFwJC5uZXh0KGNvbG9ybWFwKTtcbiAgfVxuXG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXZlcnNlU2NhbGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRSZXZlcnNlU2NhbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmV2ZXJzZVNjYWxlJC52YWx1ZTtcbiAgfVxuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmV2ZXJzZVNjYWxlJC5uZXh0KHJldmVyc2UpO1xuICB9XG5cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLmltYWdlTWV0YSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2ggdGhlIHBoeXNpY2FsIHBpeGVsIHNpemUgKMK1bS9waXhlbCkgb250byB0aGUgY3VycmVudCBpbWFnZSBtZXRhIGFuZFxuICAgKiByZS1lbWl0LCB3aXRob3V0IHRvdWNoaW5nIHRoZSBkZXJpdmVkIGNoYW5uZWxzLiBUaGUgT1NEIHRpbGUgZGVzY3JpcHRvclxuICAgKiAoZnJvbSB0aGUgc2VydmVyJ3MgQmlvLUZvcm1hdHMgYC90aWxlcy9pbmZvYCkgaXMgYXV0aG9yaXRhdGl2ZSBmb3Igc2NhbGVkXG4gICAqIGltYWdlcyDigJQgYGltYWdlSW5mby5pbWFnZU1ldGFgIG9mdGVuIGNhcnJpZXMgbm8gbXBwIOKAlCBzbyB0aGUgcmVuZGVyZXIgZmVlZHNcbiAgICogaXQgaGVyZSBvbmNlIHRoZSBkZXNjcmlwdG9yIGxvYWRzLCBsZXR0aW5nIGFyZWEvc2NhbGUgY29uc3VtZXJzICh0aGUgUmVnaW9uXG4gICAqIEVkaXRvcikgc2hvdyDCtW3Csi9tbcKyIGluc3RlYWQgb2YgcHjCsi4gTm8tb3Agd2hlbiBuZWl0aGVyIGF4aXMgaXMgcG9zaXRpdmUuXG4gICAqL1xuICBzZXRQaHlzaWNhbFBpeGVsU2l6ZShtcHBYPzogbnVtYmVyLCBtcHBZPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaGFzWCA9IChtcHBYID8/IDApID4gMCxcbiAgICAgIGhhc1kgPSAobXBwWSA/PyAwKSA+IDA7XG4gICAgaWYgKCFoYXNYICYmICFoYXNZKSByZXR1cm47XG4gICAgY29uc3QgY3VyID0gdGhpcy5pbWFnZU1ldGEkLnZhbHVlO1xuICAgIGNvbnN0IG1ldGEgPSAoY3VyICYmIGN1ci5sZW5ndGggPyBjdXIgOiBbe30gYXMgSUltYWdlTWV0YWRhdGFdKS5tYXAoKGUpID0+ICh7IC4uLmUgfSkpO1xuICAgIGlmIChoYXNYKSBtZXRhWzBdLm1wcFggPSBtcHBYO1xuICAgIGlmIChoYXNZKSBtZXRhWzBdLm1wcFkgPSBtcHBZO1xuICAgIHRoaXMuaW1hZ2VNZXRhJC5uZXh0KG1ldGEpO1xuICB9XG4gIC8qKlxuICAgKiBGaWxsIGluIHRoZSBjaGFubmVsIG5hbWVzIGFuZCB0aW50cyB0aGUgaG9zdCdzIGltYWdlIG1ldGEgbGVmdCBvdXQsIGZyb20gdGhlIGltYWdlJ3MgdGlsZVxuICAgKiBkZXNjcmlwdG9yOiB0aGUgc2VydmVyIHJlYWRzIHRoZW0gZnJvbSB0aGUgZmlsZSAoYW4gT01FLVRJRkYncyBjaGFubmVsIG5hbWVzLCBzdWNoIGFzIEN5dG9zJ3NcbiAgICogXCJBY3RpblwiIG9yIFwiQ2VsbC1NZW1icmFuZVwiKSwgd2hlcmUgYSBob3N0J3MgbWV0YWRhdGEgKGppdC11aSdzIGAvbWV0YWRhdGFgKSBjYXJyaWVzIG5vbmUsIHNvXG4gICAqIHRoZSBDaGFubmVscyBwYW5lIHNob3dlZCBcIkNoYW5uZWwgMVwiLCBcIkNoYW5uZWwgMlwi4oCmIFRoZSBob3N0J3Mgb3duIG5hbWVzIGFuZCB0aW50cyB3aW47IG9ubHkgYVxuICAgKiBjaGFubmVsIHN0aWxsIHNob3dpbmcgaXRzIGRlcml2ZWQgZGVmYXVsdCB0YWtlcyB0aGUgZGVzY3JpcHRvcidzLCBzbyBhbiBlZGl0IG1hZGUgaW4gdGhlIHBhbmVcbiAgICogc3RheXMuIEEgbm8tb3Agd2hlbiB0aGUgY2hhbm5lbCBjb3VudHMgZGlmZmVyLCBvciBmb3IgUkdCLiBFYWNoIGFkb3B0aW9uIHJlcGxhY2VzIHRoZSBsYXN0XG4gICAqIG9uZSdzIG5hbWVzLCB0aW50cyBhbmQgZ3JvdXBzOiBvbmx5IHRoZSBob3N0J3Mgb3duIGNvdW50IGFzIG92ZXJyaWRlcy5cbiAgICovXG4gIGFkb3B0Q2hhbm5lbEluZm8oXG4gICAgaW5mbzogUmVhZG9ubHlBcnJheTx7IG5hbWU/OiBzdHJpbmc7IGNvbG9yPzogc3RyaW5nOyBncm91cD86IHN0cmluZ1tdIHwgbnVsbCB9PiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmltYWdlTWV0YSQudmFsdWU7XG4gICAgY29uc3QgbTAgPSBtZXRhPy5bMF07XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2hhbm5lbFN0YXRlcyQudmFsdWU7XG4gICAgaWYgKCFpbmZvPy5sZW5ndGggfHwgIW0wIHx8IChtMC5yZ2JDaGFubmVscyA/PyAxKSA+PSAzKSByZXR1cm47XG4gICAgaWYgKChtMC5jaGFubmVsQ291bnQgPz8gMSkgIT09IGluZm8ubGVuZ3RoIHx8IGN1cnJlbnQubGVuZ3RoICE9PSBpbmZvLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmhvc3RDaGFubmVsSW5mbztcbiAgICBjb25zdCBtZXJnZWQ6IElDaGFubmVsSW5mb1tdID0gaW5mby5tYXAoKGQsIGkpID0+ICh7XG4gICAgICAuLi4oaG9zdFtpXSA/PyB7fSksXG4gICAgICBuYW1lOiBob3N0W2ldPy5uYW1lIHx8IGQubmFtZSB8fCAnJyxcbiAgICAgIGNvbG9yOiBob3N0W2ldPy5jb2xvciB8fCBkLmNvbG9yIHx8ICcnLFxuICAgICAgZ3JvdXA6IGhvc3RbaV0/Lmdyb3VwPy5sZW5ndGggPyBob3N0W2ldLmdyb3VwIDogZC5ncm91cCxcbiAgICB9KSk7XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5kZWZhdWx0Q2hhbm5lbFN0YXRlcztcbiAgICBjb25zdCBuZXh0TWV0YSA9IG1ldGEubWFwKChlLCBrKSA9PiAoayA9PT0gMCA/IHsgLi4uZSwgY2hhbm5lbEluZm86IG1lcmdlZCB9IDogZSkpO1xuICAgIHRoaXMuaW1hZ2VNZXRhJC5uZXh0KG5leHRNZXRhKTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5kZXJpdmVDaGFubmVscyhuZXh0TWV0YSk7XG4gICAgdGhpcy5kZWZhdWx0Q2hhbm5lbFN0YXRlcyA9IG5leHQubWFwKChjKSA9PiAoeyAuLi5jIH0pKTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHN0YXRlcyA9IGN1cnJlbnQubWFwKChzdCwgaSkgPT4ge1xuICAgICAgY29uc3Qgd2FzID0gYmVmb3JlW2ldO1xuICAgICAgY29uc3Qgbm93ID0gbmV4dFtpXTtcbiAgICAgIGlmICghd2FzIHx8ICFub3cpIHJldHVybiBzdDtcbiAgICAgIGNvbnN0IHBhdGNoOiBQYXJ0aWFsPElDaGFubmVsU3RhdGU+ID0ge307XG4gICAgICBpZiAoc3QubmFtZSA9PT0gd2FzLm5hbWUgJiYgbm93Lm5hbWUgIT09IHdhcy5uYW1lKSBwYXRjaC5uYW1lID0gbm93Lm5hbWU7XG4gICAgICBpZiAoc3QuY29sb3IgPT09IHdhcy5jb2xvciAmJiBub3cuY29sb3IgIT09IHdhcy5jb2xvcikgcGF0Y2guY29sb3IgPSBub3cuY29sb3I7XG4gICAgICAvLyBUaGUgZ3JvdXBzIGFyZSB0aGUgaW1hZ2UncywgbmV2ZXIgZWRpdGVkIGluIHRoZSBwYW5lLlxuICAgICAgaWYgKCFzYW1lR3JvdXAoc3QuZ3JvdXAsIG5vdy5ncm91cCkpIHBhdGNoLmdyb3VwID0gbm93Lmdyb3VwO1xuICAgICAgaWYgKCFPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoKSByZXR1cm4gc3Q7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB7IC4uLnN0LCAuLi5wYXRjaCB9O1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLmNoYW5uZWxTdGF0ZXMkLm5leHQoc3RhdGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIHRoZSBjdXJyZW50IGltYWdlJ3MgbWV0YWRhdGEgYW5kIGRlcml2ZSBpdHMgY2hhbm5lbHMuXG4gICAqXG4gICAqIGBpbWFnZUtleWAgaWRlbnRpZmllcyB0aGUgaW1hZ2UgKGl0cyBmaWxlIG5hbWUpLiBBIHJlLXBsb3Qgb2YgdGhlIFNBTUUgaW1hZ2VcbiAgICoga2VlcHMgdGhlIHVzZXIncyB3aW5kb3cvZ2FtbWEvdGludCBlZGl0czsgYSBkaWZmZXJlbnQgaW1hZ2UgZ2V0cyBpdHMgb3duXG4gICAqIGRlcml2ZWQgY2hhbm5lbHMgZXZlbiBhdCB0aGUgc2FtZSBjaGFubmVsIGNvdW50IOKAlCBrZXlpbmcgb24gdGhlIGNvdW50IGFsb25lXG4gICAqIGxlZnQgYSBEQVBJL0dGUC9SRlAgc3RhY2sncyBuYW1lcywgdGludHMgYW5kIHdpbmRvd3Mgb24gYSBmb2xsb3dpbmdcbiAgICogQ0QzL0NEOC9QYW5DSyBvbmUuIFdpdGhvdXQgYSBrZXksIG9ubHkgYSBjaGFuZ2Ugb2YgY2hhbm5lbCBjb3VudCByZS1kZXJpdmVzLlxuICAgKi9cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmhvc3RDaGFubmVsSW5mbyA9IGltYWdlTWV0YT8uWzBdPy5jaGFubmVsSW5mbyA/PyBbXTtcbiAgICB0aGlzLmltYWdlTWV0YSQubmV4dChpbWFnZU1ldGEpO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmRlcml2ZUNoYW5uZWxzKGltYWdlTWV0YSk7XG4gICAgLy8gQWx3YXlzIHJlZnJlc2ggdGhlIHJlc2V0IGJhc2VsaW5lIHRvIHRoZSBjdXJyZW50IGltYWdlJ3MgZGVyaXZlZCBkZWZhdWx0c1xuICAgIC8vIChuYW1lcy9jb2xvdXJzIGNhbiBkaWZmZXIgZXZlbiBhdCB0aGUgc2FtZSBjaGFubmVsIGNvdW50KS5cbiAgICB0aGlzLmRlZmF1bHRDaGFubmVsU3RhdGVzID0gbmV4dC5tYXAoKGMpID0+ICh7IC4uLmMgfSkpO1xuICAgIGNvbnN0IG90aGVySW1hZ2UgPSBpbWFnZUtleSAhPT0gdW5kZWZpbmVkICYmIGltYWdlS2V5ICE9PSB0aGlzLmNoYW5uZWxJbWFnZUtleTtcbiAgICBpZiAoaW1hZ2VLZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5jaGFubmVsSW1hZ2VLZXkgPSBpbWFnZUtleTtcbiAgICBpZiAob3RoZXJJbWFnZSB8fCBuZXh0Lmxlbmd0aCAhPT0gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChuZXh0KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDaGFubmVsJC5uZXh0KDApOyAvLyBuZXcgaW1hZ2UgLyBjaGFubmVsIHN0cnVjdHVyZSDihpIgcmVzZXQgdGhlIHNlbGVjdGVkIGJhbmRcbiAgICB9XG4gIH1cblxuICAvKiogQ2hhbm5lbHMgZm9yIGFuIGltYWdlOlxuICAgKiAgIC0gUkdCIChyZ2JDaGFubmVscyDiiaUgMykg4oaSIFJlZC9HcmVlbi9CbHVlO1xuICAgKiAgIC0gbXVsdGljaGFubmVsIGZsdW9yZXNjZW5jZSAoY2hhbm5lbENvdW50ID4gMSkg4oaSIG9uZSBjaGFubmVsIHBlciBiYW5kLFxuICAgKiAgICAgbmFtZWQvdGludGVkIGZyb20gdGhlIHNlcnZlciBgY2hhbm5lbEluZm9gIHdoZW4gcHJlc2VudCwgZWxzZSBhIHBhbGV0dGU7XG4gICAqICAgICBvbmx5IHRoZSBmaXJzdCBgREVGQVVMVF9WSVNJQkxFX0NIQU5ORUxTYCBzdGFydCB2aXNpYmxlIChzZWUgYGRlZmF1bHRDaGFubmVsVmlzaWJsZWApO1xuICAgKiAgIC0gb3RoZXJ3aXNlIGEgc2luZ2xlIGdyYXlzY2FsZSBcIkludGVuc2l0eVwiIGNoYW5uZWwuICovXG4gIHByaXZhdGUgZGVyaXZlQ2hhbm5lbHMobWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IElDaGFubmVsU3RhdGVbXSB7XG4gICAgY29uc3QgYmFzZSA9IHsgbWluOiAwLCBtYXg6IDI1NSwgZ2FtbWE6IDEsIHZpc2libGU6IHRydWUgfTtcbiAgICBjb25zdCBtID0gbWV0YT8uWzBdO1xuICAgIGlmICgobT8ucmdiQ2hhbm5lbHMgPz8gMSkgPj0gMykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBpbmRleDogMCwgbmFtZTogJ1JlZCcsIGNvbG9yOiAnI2ZmMDAwMCcsIC4uLmJhc2UgfSxcbiAgICAgICAgeyBpbmRleDogMSwgbmFtZTogJ0dyZWVuJywgY29sb3I6ICcjMDBmZjAwJywgLi4uYmFzZSB9LFxuICAgICAgICB7IGluZGV4OiAyLCBuYW1lOiAnQmx1ZScsIGNvbG9yOiAnIzAwMDBmZicsIC4uLmJhc2UgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGNvdW50ID0gbT8uY2hhbm5lbENvdW50ID8/IDE7XG4gICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgY29uc3QgaW5mbyA9IG0/LmNoYW5uZWxJbmZvO1xuICAgICAgLy8gRmFsbGJhY2sgdGludHMgKEZpamktaXNoKSB3aGVuIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwbHkgYSBjb2xvci5cbiAgICAgIGNvbnN0IHBhbGV0dGUgPSBbJyNmZjAwMDAnLCAnIzAwZmYwMCcsICcjMDAwMGZmJywgJyNmZmZmZmYnLCAnIzAwZmZmZicsICcjZmYwMGZmJywgJyNmZmZmMDAnXTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gKHtcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIG5hbWU6IGluZm8/LltpXT8ubmFtZSB8fCBgQ2hhbm5lbCAke2kgKyAxfWAsXG4gICAgICAgIGNvbG9yOiBpbmZvPy5baV0/LmNvbG9yIHx8IHBhbGV0dGVbaSAlIHBhbGV0dGUubGVuZ3RoXSxcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgdmlzaWJsZTogZGVmYXVsdENoYW5uZWxWaXNpYmxlKGksIGNvdW50LCBpbmZvPy5baV0/LnZpc2libGUpLFxuICAgICAgICAuLi4oaW5mbz8uW2ldPy5ncm91cD8ubGVuZ3RoID8geyBncm91cDogWy4uLihpbmZvW2ldLmdyb3VwIGFzIHN0cmluZ1tdKV0gfSA6IHt9KSxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIFt7IGluZGV4OiAwLCBuYW1lOiAnSW50ZW5zaXR5JywgY29sb3I6ICcjZmZmZmZmJywgLi4uYmFzZSB9XTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDaGFubmVscyAmIGhpc3RvZ3JhbSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0Q2hhbm5lbFN0YXRlcygpOiBPYnNlcnZhYmxlPElDaGFubmVsU3RhdGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5uZWxTdGF0ZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRDaGFubmVsU3RhdGVzKCk6IElDaGFubmVsU3RhdGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbFN0YXRlcyQudmFsdWU7XG4gIH1cbiAgLyoqIFRoZSBjaGFubmVsIHNlbGVjdGVkIGluIHRoZSBwYW5lIChkcml2ZXMgYSBzaW5nbGUtc2NhbGFyIDNEIFN1cmZhY2UpLiAqL1xuICBnZXRTZWxlY3RlZENoYW5uZWwoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENoYW5uZWwkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRTZWxlY3RlZENoYW5uZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENoYW5uZWwkLnZhbHVlO1xuICB9XG4gIHNldFNlbGVjdGVkQ2hhbm5lbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDaGFubmVsJC52YWx1ZSAhPT0gaW5kZXgpIHRoaXMuc2VsZWN0ZWRDaGFubmVsJC5uZXh0KGluZGV4KTtcbiAgfVxuICAvKiogUGF0Y2ggb25lIGNoYW5uZWwgYnkgaW5kZXggKGltbXV0YWJsZSB1cGRhdGUpLiAqL1xuICBzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlciwgcGFydGlhbDogUGFydGlhbDxJQ2hhbm5lbFN0YXRlPik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmNoYW5uZWxTdGF0ZXMkLnZhbHVlLm1hcCgoYykgPT5cbiAgICAgIGMuaW5kZXggPT09IGluZGV4ID8geyAuLi5jLCAuLi5wYXJ0aWFsLCBpbmRleDogYy5pbmRleCB9IDogYyxcbiAgICApO1xuICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChuZXh0KTtcbiAgfVxuICAvKiogUmVwbGFjZSBhbGwgY2hhbm5lbCBzdGF0ZXMgKHVzZWQgYnkgYXV0by9yZXNldCkuICovXG4gIHNldENoYW5uZWxTdGF0ZXMoc3RhdGVzOiBJQ2hhbm5lbFN0YXRlW10pOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5uZWxTdGF0ZXMkLm5leHQoc3RhdGVzKTtcbiAgfVxuICAvKiogUmVzZXQgb25lIGNoYW5uZWwncyBkaXNwbGF5IHdpbmRvdywgZ2FtbWEgQU5EIGNvbG91ciB0byB0aGUgdmFsdWVzIGRlcml2ZWRcbiAgICogIGZvciB0aGUgY3VycmVudCBpbWFnZSAoZnVsbCAwLi4yNTUgcmFuZ2UsIGdhbW1hIDEsIHRoZSBjaGFubmVsJ3MgZGVmYXVsdFxuICAgKiAgdGludCkuIEZhbGxzIGJhY2sgdG8gbmV1dHJhbCBkZWZhdWx0cyBpZiBubyBiYXNlbGluZSB3YXMgY2FwdHVyZWQuICovXG4gIHJlc2V0Q2hhbm5lbFN0YXRlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmRlZmF1bHRDaGFubmVsU3RhdGVzLmZpbmQoKGMpID0+IGMuaW5kZXggPT09IGluZGV4KTtcbiAgICB0aGlzLnNldENoYW5uZWxTdGF0ZShpbmRleCwge1xuICAgICAgbWluOiBkZWY/Lm1pbiA/PyAwLFxuICAgICAgbWF4OiBkZWY/Lm1heCA/PyAyNTUsXG4gICAgICBnYW1tYTogZGVmPy5nYW1tYSA/PyAxLFxuICAgICAgY29sb3I6IGRlZj8uY29sb3IgPz8gJyNmZmZmZmYnLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0R3JheXNjYWxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdyYXlzY2FsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudEdyYXlzY2FsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmF5c2NhbGUkLnZhbHVlO1xuICB9XG4gIHNldEdyYXlzY2FsZShvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZ3JheXNjYWxlJC5uZXh0KG9uKTtcbiAgfVxuXG4gIGdldEludmVydCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pbnZlcnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRJbnZlcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZXJ0JC52YWx1ZTtcbiAgfVxuICBzZXRJbnZlcnQob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmludmVydCQubmV4dChvbik7XG4gIH1cblxuICAvKiogTmFtZeKGkmNvbG91ciB2aWV3IG9mIHRoZSBjdXJyZW50IHByZXNldCBzZXQgKGNvbXBhdCBmb3IgYmFja2VuZCByZW5kZXJlcnNcbiAgICogIHRoYXQgc3RpbGwgcmVhZCBhIE1hcCkuICovXG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiBbYy5uYW1lLCBjLmNvbG9yXSkpO1xuICB9XG4gIC8qKiBVcHNlcnQgYSBzaW5nbGUgY2xhc3MgY29sb3VyICh1c2VkIGJ5IHRoZSBlZGl0b3IncyBwZXItY2xhc3MgY29sb3VyIHBpY2tlcikuICovXG4gIHNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWw6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXBzZXJ0Q2xhc3MoeyBuYW1lOiBsYWJlbCwgY29sb3IgfSk7XG4gIH1cblxuICAvLyDilIDilIAgQW5ub3RhdGlvbi1jbGFzcyBwcmVzZXQgc2V0IGFjY2Vzc29ycyAoaml0LXVpIzcwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UHJlc2V0U2V0KCk6IFByZXNldFNldCB7XG4gICAgLy8gRGVmZW5zaXZlIGNvcHk6IGNhbGxlcnMgbXVzdCBub3QgbXV0YXRlIHRoZSBzdG9yZSdzIHN0YXRlIGluIHBsYWNlIOKAlFxuICAgIC8vIGFsbCBjaGFuZ2VzIGdvIHRocm91Z2ggc2V0UHJlc2V0U2V0KCkvdXBzZXJ0Q2xhc3MoKS9yZW1vdmVDbGFzcygpIHNvXG4gICAgLy8gcHJlc2V0U2V0JCBhbmQgcGVyc2lzdGVuY2Ugc3RheSBpbiBzeW5jLlxuICAgIHJldHVybiB7XG4gICAgICBjbGFzc2VzOiB0aGlzLnByZXNldFNldC5jbGFzc2VzLm1hcCgoYykgPT4gKHsgLi4uYyB9KSksXG4gICAgICBmYWxsYmFja1BhbGV0dGU6IFsuLi50aGlzLnByZXNldFNldC5mYWxsYmFja1BhbGV0dGVdLFxuICAgICAgYXV0b1Byb21vdGU6IHRoaXMucHJlc2V0U2V0LmF1dG9Qcm9tb3RlLFxuICAgICAgbWF0Y2hNb2RlOiB0aGlzLnByZXNldFNldC5tYXRjaE1vZGUsXG4gICAgICBpbXBvcnRlZENvbG9yczogeyAuLi50aGlzLmltcG9ydGVkQ29sb3JzIH0sXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogUmVtZW1iZXIgdGhlIGNsYXNzIGNvbG91cnMgYW4gaW1wb3J0ZWQgZmlsZSBjYXJyaWVkIChsYWJlbCDihpIgY29sb3VyKSwgc28gaXRzIHJlZ2lvbnMga2VlcFxuICAgKiB0aGVtOiBhIGNsYXNzIHdpdGggYSBwcmVzZXQga2VlcHMgdGhlIHByZXNldCdzIGNvbG91ciwgYW5kIHRoZSBsYXRlc3QgaW1wb3J0IHdpbnMgZm9yIHRoZVxuICAgKiByZXN0LiBOb3QgcGVyc2lzdGVkLlxuICAgKi9cbiAgcmVtZW1iZXJJbXBvcnRlZENsYXNzQ29sb3JzKGNvbG9yczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtsYWJlbCwgY29sb3JdIG9mIGNvbG9ycykge1xuICAgICAgaWYgKCFsYWJlbCB8fCBmaW5kUHJlc2V0KGxhYmVsLCB0aGlzLnByZXNldFNldCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2V5ID0gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBsYWJlbCk7XG4gICAgICBpZiAodGhpcy5pbXBvcnRlZENvbG9yc1trZXldID09PSBjb2xvcikgY29udGludWU7XG4gICAgICB0aGlzLmltcG9ydGVkQ29sb3JzID0geyAuLi50aGlzLmltcG9ydGVkQ29sb3JzLCBba2V5XTogY29sb3IgfTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlZCkgdGhpcy5lbWl0UHJlc2V0U2V0KCk7XG4gIH1cbiAgZ2V0UHJlc2V0U2V0JCgpOiBPYnNlcnZhYmxlPFByZXNldFNldD4ge1xuICAgIHJldHVybiB0aGlzLnByZXNldFNldCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgc2V0UHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQgPSB0aGlzLm5vcm1hbGl6ZVByZXNldFNldChzZXQpO1xuICAgIHRoaXMuZW1pdFByZXNldFNldCgpO1xuICAgIHRoaXMuc2F2ZVByZXNldHNOb3coKTsgLy8gZXhwbGljaXQgYnVsayBhcHBseS9pbXBvcnQg4oaSIHBlcnNpc3QgaW1tZWRpYXRlbHlcbiAgfVxuICAvKiogQWRkIG9yIHVwZGF0ZSBhIGNsYXNzIChrZXllZCBieSBleGFjdCBzdG9yZWQgYG5hbWVgKS4gKi9cbiAgdXBzZXJ0Q2xhc3MocHJlc2V0OiBDbGFzc1ByZXNldCk6IHZvaWQge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbLi4udGhpcy5wcmVzZXRTZXQuY2xhc3Nlc107XG4gICAgY29uc3QgaSA9IGNsYXNzZXMuZmluZEluZGV4KChjKSA9PiBjLm5hbWUgPT09IHByZXNldC5uYW1lKTtcbiAgICBpZiAoaSA+PSAwKSBjbGFzc2VzW2ldID0geyAuLi5jbGFzc2VzW2ldLCAuLi5wcmVzZXQgfTtcbiAgICBlbHNlIGNsYXNzZXMucHVzaCh7IC4uLnByZXNldCB9KTtcbiAgICB0aGlzLnByZXNldFNldCA9IHsgLi4udGhpcy5wcmVzZXRTZXQsIGNsYXNzZXMgfTtcbiAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLnF1ZXVlUHJlc2V0U2F2ZSgpO1xuICB9XG4gIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0U2V0ID0geyAuLi50aGlzLnByZXNldFNldCwgY2xhc3NlczogdGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5maWx0ZXIoKGMpID0+IGMubmFtZSAhPT0gbmFtZSkgfTtcbiAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLnF1ZXVlUHJlc2V0U2F2ZSgpO1xuICB9XG4gIHJlc2V0UHJlc2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNldFNldCA9IGRlZmF1bHRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLnNhdmVQcmVzZXRzTm93KCk7IC8vIGV4cGxpY2l0IHJlc2V0IOKGkiBwZXJzaXN0IGltbWVkaWF0ZWx5XG4gIH1cblxuICAvLyDilIDilIAgc3BhdGlhbC1vbWljcyB2aWV3IHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRTcGF0aWFsVmlldyQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsVmlld1N0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFZpZXckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQsIGZvciBhIHJlbmRlcmVyIGJ1aWxkaW5nIGl0cyBmaXJzdCBmcmFtZS4gKi9cbiAgY3VycmVudFNwYXRpYWxWaWV3KCk6IFNwYXRpYWxWaWV3U3RhdGUge1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWxWaWV3JC52YWx1ZTtcbiAgfVxuXG4gIC8qKiBQYXRjaCB0aGUgc3BhdGlhbCB2aWV3IHN0YXRlOyBlbWl0cyBvbmNlIHdpdGggdGhlIG1lcmdlZCB2YWx1ZS4gKi9cbiAgc2V0U3BhdGlhbFZpZXcocGFydGlhbDogUGFydGlhbDxTcGF0aWFsVmlld1N0YXRlPik6IHZvaWQge1xuICAgIHRoaXMuc3BhdGlhbFZpZXckLm5leHQoeyAuLi50aGlzLnNwYXRpYWxWaWV3JC52YWx1ZSwgLi4ucGFydGlhbCB9KTtcbiAgfVxuXG4gIGdldEFjdGl2ZVRvb2wkKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZVRvb2wkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHNldEFjdGl2ZVRvb2wodG9vbDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlVG9vbCQubmV4dCh0b29sKTtcbiAgfVxufVxuXG4vKiogV2hldGhlciB0d28gZ3JvdXAgcGF0aHMgYXJlIHRoZSBzYW1lIChhYnNlbnQgYW5kIGVtcHR5IGFsaWtlKS4gKi9cbmZ1bmN0aW9uIHNhbWVHcm91cChhOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgYjogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgeCA9IGEgPz8gW107XG4gIGNvbnN0IHkgPSBiID8/IFtdO1xuICByZXR1cm4geC5sZW5ndGggPT09IHkubGVuZ3RoICYmIHguZXZlcnkoKHYsIGkpID0+IHYgPT09IHlbaV0pO1xufVxuIl19