@flowmap.gl/data 8.0.0-alpha.9 → 8.0.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.
Files changed (70) hide show
  1. package/.turbo/turbo-build.log +3 -0
  2. package/.turbo/turbo-dev.log +6 -0
  3. package/LICENSE +2 -2
  4. package/dist/FlowmapAggregateAccessors.d.ts +4 -4
  5. package/dist/FlowmapAggregateAccessors.d.ts.map +1 -1
  6. package/dist/FlowmapAggregateAccessors.js +16 -9
  7. package/dist/FlowmapSelectors.d.ts +41 -87
  8. package/dist/FlowmapSelectors.d.ts.map +1 -1
  9. package/dist/FlowmapSelectors.js +174 -161
  10. package/dist/FlowmapState.d.ts +7 -5
  11. package/dist/FlowmapState.d.ts.map +1 -1
  12. package/dist/FlowmapState.js +6 -1
  13. package/dist/cluster/ClusterIndex.d.ts +4 -4
  14. package/dist/cluster/ClusterIndex.d.ts.map +1 -1
  15. package/dist/cluster/ClusterIndex.js +5 -17
  16. package/dist/cluster/cluster.d.ts +25 -5
  17. package/dist/cluster/cluster.d.ts.map +1 -1
  18. package/dist/cluster/cluster.js +115 -57
  19. package/dist/colors.d.ts +3 -3
  20. package/dist/colors.d.ts.map +1 -1
  21. package/dist/colors.js +19 -8
  22. package/dist/getViewStateForLocations.d.ts +3 -3
  23. package/dist/getViewStateForLocations.d.ts.map +1 -1
  24. package/dist/getViewStateForLocations.js +33 -12
  25. package/dist/index.d.ts +3 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +9 -4
  28. package/dist/provider/FlowmapDataProvider.d.ts +7 -2
  29. package/dist/provider/FlowmapDataProvider.d.ts.map +1 -1
  30. package/dist/provider/FlowmapDataProvider.js +11 -6
  31. package/dist/provider/LocalFlowmapDataProvider.d.ts +15 -4
  32. package/dist/provider/LocalFlowmapDataProvider.d.ts.map +1 -1
  33. package/dist/provider/LocalFlowmapDataProvider.js +98 -81
  34. package/dist/selector-functions.d.ts +10 -0
  35. package/dist/selector-functions.d.ts.map +1 -0
  36. package/dist/selector-functions.js +65 -0
  37. package/dist/time.d.ts.map +1 -1
  38. package/dist/time.js +6 -1
  39. package/dist/types.d.ts +20 -18
  40. package/dist/types.d.ts.map +1 -1
  41. package/dist/types.js +9 -4
  42. package/dist/util.d.ts.map +1 -1
  43. package/dist/util.js +6 -1
  44. package/package.json +22 -27
  45. package/src/FlowmapAggregateAccessors.ts +21 -10
  46. package/src/FlowmapSelectors.ts +304 -280
  47. package/src/FlowmapState.ts +13 -5
  48. package/src/cluster/ClusterIndex.ts +23 -28
  49. package/src/cluster/cluster.ts +165 -73
  50. package/src/colors.ts +13 -9
  51. package/src/getViewStateForLocations.ts +23 -7
  52. package/src/index.ts +9 -3
  53. package/src/provider/FlowmapDataProvider.ts +23 -7
  54. package/src/provider/LocalFlowmapDataProvider.ts +68 -5
  55. package/src/selector-functions.ts +93 -0
  56. package/src/time.ts +6 -0
  57. package/src/types.ts +23 -15
  58. package/src/util.ts +6 -0
  59. package/dist/provider/WorkerFlowmapDataProvider.d.ts +0 -42
  60. package/dist/provider/WorkerFlowmapDataProvider.d.ts.map +0 -1
  61. package/dist/provider/WorkerFlowmapDataProvider.js +0 -80
  62. package/dist/provider/WorkerFlowmapDataProviderWorker.d.ts +0 -2
  63. package/dist/provider/WorkerFlowmapDataProviderWorker.d.ts.map +0 -1
  64. package/dist/provider/WorkerFlowmapDataProviderWorker.js +0 -4
  65. package/dist/provider/createWorkerDataProvider.d.ts +0 -3
  66. package/dist/provider/createWorkerDataProvider.d.ts.map +0 -1
  67. package/dist/provider/createWorkerDataProvider.js +0 -21
  68. package/src/provider/WorkerFlowmapDataProvider.ts +0 -121
  69. package/src/provider/WorkerFlowmapDataProviderWorker.ts +0 -4
  70. package/src/provider/createWorkerDataProvider.ts +0 -18
@@ -1,14 +1,16 @@
1
1
  import { LocationFilterMode, ViewportProps } from './types';
2
2
  export interface FilterState {
3
- selectedLocations: string[] | undefined;
4
- selectedTimeRange: [Date, Date] | undefined;
5
- locationFilterMode: LocationFilterMode;
3
+ selectedLocations?: (string | number)[];
4
+ locationFilterMode?: LocationFilterMode;
5
+ selectedTimeRange?: [Date, Date];
6
6
  }
7
7
  export interface SettingsState {
8
8
  animationEnabled: boolean;
9
9
  fadeEnabled: boolean;
10
10
  fadeOpacityEnabled: boolean;
11
+ locationsEnabled: boolean;
11
12
  locationTotalsEnabled: boolean;
13
+ locationLabelsEnabled: boolean;
12
14
  adaptiveScalesEnabled: boolean;
13
15
  clusteringEnabled: boolean;
14
16
  clusteringAuto: boolean;
@@ -20,8 +22,8 @@ export interface SettingsState {
20
22
  maxTopFlowsDisplayNum: number;
21
23
  }
22
24
  export interface FlowmapState {
23
- filterState: FilterState;
24
- settingsState: SettingsState;
25
+ filter?: FilterState;
26
+ settings: SettingsState;
25
27
  viewport: ViewportProps;
26
28
  }
27
29
  //# sourceMappingURL=FlowmapState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FlowmapState.d.ts","sourceRoot":"","sources":["../src/FlowmapState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;CACzB"}
1
+ {"version":3,"file":"FlowmapState.d.ts","sourceRoot":"","sources":["../src/FlowmapState.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,kBAAkB,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;CACzB"}
@@ -1,2 +1,7 @@
1
+ /*
2
+ * Copyright (c) Flowmap.gl contributors
3
+ * Copyright (c) 2018-2020 Teralytics
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
1
6
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcFN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Zsb3dtYXBTdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMb2NhdGlvbkZpbHRlck1vZGUsIFZpZXdwb3J0UHJvcHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlclN0YXRlIHtcbiAgc2VsZWN0ZWRMb2NhdGlvbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBzZWxlY3RlZFRpbWVSYW5nZTogW0RhdGUsIERhdGVdIHwgdW5kZWZpbmVkO1xuICBsb2NhdGlvbkZpbHRlck1vZGU6IExvY2F0aW9uRmlsdGVyTW9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5nc1N0YXRlIHtcbiAgYW5pbWF0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgZmFkZUVuYWJsZWQ6IGJvb2xlYW47XG4gIGZhZGVPcGFjaXR5RW5hYmxlZDogYm9vbGVhbjtcbiAgbG9jYXRpb25Ub3RhbHNFbmFibGVkOiBib29sZWFuO1xuICBhZGFwdGl2ZVNjYWxlc0VuYWJsZWQ6IGJvb2xlYW47XG4gIGNsdXN0ZXJpbmdFbmFibGVkOiBib29sZWFuO1xuICBjbHVzdGVyaW5nQXV0bzogYm9vbGVhbjtcbiAgY2x1c3RlcmluZ0xldmVsPzogbnVtYmVyO1xuICBkYXJrTW9kZTogYm9vbGVhbjtcbiAgZmFkZUFtb3VudDogbnVtYmVyO1xuICBjb2xvclNjaGVtZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodENvbG9yOiBzdHJpbmc7XG4gIG1heFRvcEZsb3dzRGlzcGxheU51bTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dtYXBTdGF0ZSB7XG4gIGZpbHRlclN0YXRlOiBGaWx0ZXJTdGF0ZTtcbiAgc2V0dGluZ3NTdGF0ZTogU2V0dGluZ3NTdGF0ZTtcbiAgdmlld3BvcnQ6IFZpZXdwb3J0UHJvcHM7XG59XG4iXX0=
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcFN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Zsb3dtYXBTdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgRmxvd21hcC5nbCBjb250cmlidXRvcnNcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIwIFRlcmFseXRpY3NcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHtMb2NhdGlvbkZpbHRlck1vZGUsIFZpZXdwb3J0UHJvcHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlclN0YXRlIHtcbiAgc2VsZWN0ZWRMb2NhdGlvbnM/OiAoc3RyaW5nIHwgbnVtYmVyKVtdO1xuICBsb2NhdGlvbkZpbHRlck1vZGU/OiBMb2NhdGlvbkZpbHRlck1vZGU7XG4gIHNlbGVjdGVkVGltZVJhbmdlPzogW0RhdGUsIERhdGVdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzU3RhdGUge1xuICBhbmltYXRpb25FbmFibGVkOiBib29sZWFuO1xuICBmYWRlRW5hYmxlZDogYm9vbGVhbjtcbiAgZmFkZU9wYWNpdHlFbmFibGVkOiBib29sZWFuO1xuICBsb2NhdGlvbnNFbmFibGVkOiBib29sZWFuO1xuICBsb2NhdGlvblRvdGFsc0VuYWJsZWQ6IGJvb2xlYW47XG4gIGxvY2F0aW9uTGFiZWxzRW5hYmxlZDogYm9vbGVhbjtcbiAgYWRhcHRpdmVTY2FsZXNFbmFibGVkOiBib29sZWFuO1xuICBjbHVzdGVyaW5nRW5hYmxlZDogYm9vbGVhbjtcbiAgY2x1c3RlcmluZ0F1dG86IGJvb2xlYW47XG4gIGNsdXN0ZXJpbmdMZXZlbD86IG51bWJlcjtcbiAgZGFya01vZGU6IGJvb2xlYW47XG4gIGZhZGVBbW91bnQ6IG51bWJlcjtcbiAgY29sb3JTY2hlbWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xuICBtYXhUb3BGbG93c0Rpc3BsYXlOdW06IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbG93bWFwU3RhdGUge1xuICBmaWx0ZXI/OiBGaWx0ZXJTdGF0ZTtcbiAgc2V0dGluZ3M6IFNldHRpbmdzU3RhdGU7XG4gIHZpZXdwb3J0OiBWaWV3cG9ydFByb3BzO1xufVxuIl19
@@ -1,11 +1,11 @@
1
1
  import { AggregateFlow, Cluster, ClusterLevels, ClusterNode, FlowAccessors, FlowCountsMapReduce } from './../types';
2
- export declare type LocationWeightGetter = (id: string) => number;
2
+ export type LocationWeightGetter = (id: string | number) => number;
3
3
  /**
4
4
  * A data structure representing the cluster levels for efficient flow aggregation.
5
5
  */
6
6
  export interface ClusterIndex<F> {
7
7
  availableZoomLevels: number[];
8
- getClusterById: (clusterId: string) => Cluster | undefined;
8
+ getClusterById: (clusterId: string | number) => Cluster | undefined;
9
9
  /**
10
10
  * List the nodes on the given zoom level.
11
11
  */
@@ -13,7 +13,7 @@ export interface ClusterIndex<F> {
13
13
  /**
14
14
  * Get the min zoom level on which the location is not clustered.
15
15
  */
16
- getMinZoomForLocation: (locationId: string) => number;
16
+ getMinZoomForLocation: (locationId: string | number) => number;
17
17
  /**
18
18
  * List the IDs of all locations in the cluster (leaves of the subtree starting in the cluster).
19
19
  */
@@ -21,7 +21,7 @@ export interface ClusterIndex<F> {
21
21
  /**
22
22
  * Find the cluster the given location is residing in on the specified zoom level.
23
23
  */
24
- findClusterFor: (locationId: string, zoom: number) => string | undefined;
24
+ findClusterFor: (locationId: string | number, zoom: number) => string | number | undefined;
25
25
  /**
26
26
  * Aggregate flows for the specified zoom level.
27
27
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterIndex.d.ts","sourceRoot":"","sources":["../../src/cluster/ClusterIndex.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,aAAa,EACb,OAAO,EACP,aAAa,EACb,WAAW,EACX,aAAa,EACb,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAGpB,oBAAY,oBAAoB,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IAC3D;;OAEG;IACH,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,WAAW,EAAE,GAAG,SAAS,CAAC;IAC5E;;OAEG;IACH,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD;;OAEG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACnE;;OAEG;IACH,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACzE;;OAEG;IACH,cAAc,EAAE,CACd,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,EAAE,MAAM,EACZ,EAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EACpE,OAAO,CAAC,EAAE;QACR,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;KAC9C,KACE,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAqJ3E;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,KAAK,EAAE,CAAC,EAAE,EACV,EAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GACnE,oBAAoB,CAuBtB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,mBAAmB,EAAE,MAAM,EAAE,EAC7B,UAAU,EAAE,MAAM,UAWnB"}
1
+ {"version":3,"file":"ClusterIndex.d.ts","sourceRoot":"","sources":["../../src/cluster/ClusterIndex.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,aAAa,EACb,OAAO,EACP,aAAa,EACb,WAAW,EACX,aAAa,EACb,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,oBAAoB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IACpE;;OAEG;IACH,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,WAAW,EAAE,GAAG,SAAS,CAAC;IAC5E;;OAEG;IACH,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAC/D;;OAEG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACnE;;OAEG;IACH,cAAc,EAAE,CACd,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,IAAI,EAAE,MAAM,KACT,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACjC;;OAEG;IACH,cAAc,EAAE,CACd,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,EAAE,MAAM,EACZ,EAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EACpE,OAAO,CAAC,EAAE;QACR,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;KAC9C,KACE,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAyJ3E;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,KAAK,EAAE,CAAC,EAAE,EACV,EAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GACnE,oBAAoB,CAuBtB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,mBAAmB,EAAE,MAAM,EAAE,EAC7B,UAAU,EAAE,MAAM,UAWnB"}
@@ -1,19 +1,7 @@
1
1
  /*
2
- * Copyright 2022 FlowmapBlue
3
- * Copyright 2018-2020 Teralytics, modified by FlowmapBlue
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
2
+ * Copyright (c) Flowmap.gl contributors
3
+ * Copyright (c) 2018-2020 Teralytics
4
+ * SPDX-License-Identifier: Apache-2.0
17
5
  */
18
6
  import { isCluster, } from './../types';
19
7
  import { ascending, bisectLeft, extent } from 'd3-array';
@@ -52,7 +40,7 @@ export function buildIndex(clusterLevels) {
52
40
  leavesToClustersByZoom.set(zoom, leavesToClusters);
53
41
  }
54
42
  visitClusterLeaves(cluster, (leafId) => {
55
- leavesToClusters === null || leavesToClusters === void 0 ? void 0 : leavesToClusters.set(leafId, cluster);
43
+ leavesToClusters?.set(leafId, cluster);
56
44
  });
57
45
  }
58
46
  function visitClusterLeaves(cluster, visit) {
@@ -175,4 +163,4 @@ export function findAppropriateZoomLevel(availableZoomLevels, targetZoom) {
175
163
  }
176
164
  return availableZoomLevels[Math.min(bisectLeft(availableZoomLevels, Math.floor(targetZoom)), availableZoomLevels.length - 1)];
177
165
  }
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckluZGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsdXN0ZXIvQ2x1c3RlckluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQU9MLFNBQVMsR0FDVixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUF1Q3ZEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBSSxhQUE0QjtJQUN4RCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUNoRCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3RELEtBQUssTUFBTSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsSUFBSSxhQUFhLEVBQUU7UUFDekMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25CLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNqQztpQkFBTTtnQkFDTCxNQUFNLEVBQUMsRUFBRSxFQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFO29CQUMzQixtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNuQzthQUNGO1NBQ0Y7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QUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQy9DLENBQUM7QUFDTixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxtQkFBNkIsRUFDN0IsVUFBa0I7SUFFbEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7S0FDN0M7SUFDRCxPQUFPLG1CQUFtQixDQUN4QixJQUFJLENBQUMsR0FBRyxDQUNOLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQ3ZELG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQy9CLENBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjIgRmxvd21hcEJsdWVcbiAqIENvcHlyaWdodCAyMDE4LTIwMjAgVGVyYWx5dGljcywgbW9kaWZpZWQgYnkgRmxvd21hcEJsdWVcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cblxuaW1wb3J0IHtcbiAgQWdncmVnYXRlRmxvdyxcbiAgQ2x1c3RlcixcbiAgQ2x1c3RlckxldmVscyxcbiAgQ2x1c3Rlck5vZGUsXG4gIEZsb3dBY2Nlc3NvcnMsXG4gIEZsb3dDb3VudHNNYXBSZWR1Y2UsXG4gIGlzQ2x1c3Rlcixcbn0gZnJvbSAnLi8uLi90eXBlcyc7XG5pbXBvcnQge2FzY2VuZGluZywgYmlzZWN0TGVmdCwgZXh0ZW50fSBmcm9tICdkMy1hcnJheSc7XG5cbmV4cG9ydCB0eXBlIExvY2F0aW9uV2VpZ2h0R2V0dGVyID0gKGlkOiBzdHJpbmcpID0+IG51bWJlcjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY2x1c3RlciBsZXZlbHMgZm9yIGVmZmljaWVudCBmbG93IGFnZ3JlZ2F0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsdXN0ZXJJbmRleDxGPiB7XG4gIGF2YWlsYWJsZVpvb21MZXZlbHM6IG51bWJlcltdO1xuICBnZXRDbHVzdGVyQnlJZDogKGNsdXN0ZXJJZDogc3RyaW5nKSA9PiBDbHVzdGVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogTGlzdCB0aGUgbm9kZXMgb24gdGhlIGdpdmVuIHpvb20gbGV2ZWwuXG4gICAqL1xuICBnZXRDbHVzdGVyTm9kZXNGb3I6ICh6b29tOiBudW1iZXIgfCB1bmRlZmluZWQpID0+IENsdXN0ZXJOb2RlW10gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBHZXQgdGhlIG1pbiB6b29tIGxldmVsIG9uIHdoaWNoIHRoZSBsb2NhdGlvbiBpcyBub3QgY2x1c3RlcmVkLlxuICAgKi9cbiAgZ2V0TWluWm9vbUZvckxvY2F0aW9uOiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiBudW1iZXI7XG4gIC8qKlxuICAgKiBMaXN0IHRoZSBJRHMgb2YgYWxsIGxvY2F0aW9ucyBpbiB0aGUgY2x1c3RlciAobGVhdmVzIG9mIHRoZSBzdWJ0cmVlIHN0YXJ0aW5nIGluIHRoZSBjbHVzdGVyKS5cbiAgICovXG4gIGV4cGFuZENsdXN0ZXI6IChjbHVzdGVyOiBDbHVzdGVyLCB0YXJnZXRab29tPzogbnVtYmVyKSA9PiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEZpbmQgdGhlIGNsdXN0ZXIgdGhlIGdpdmVuIGxvY2F0aW9uIGlzIHJlc2lkaW5nIGluIG9uIHRoZSBzcGVjaWZpZWQgem9vbSBsZXZlbC5cbiAgICovXG4gIGZpbmRDbHVzdGVyRm9yOiAobG9jYXRpb25JZDogc3RyaW5nLCB6b29tOiBudW1iZXIpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZSBmbG93cyBmb3IgdGhlIHNwZWNpZmllZCB6b29tIGxldmVsLlxuICAgKi9cbiAgYWdncmVnYXRlRmxvd3M6IChcbiAgICBmbG93czogRltdLFxuICAgIHpvb206IG51bWJlcixcbiAgICB7Z2V0Rmxvd09yaWdpbklkLCBnZXRGbG93RGVzdElkLCBnZXRGbG93TWFnbml0dWRlfTogRmxvd0FjY2Vzc29yczxGPixcbiAgICBvcHRpb25zPzoge1xuICAgICAgZmxvd0NvdW50c01hcFJlZHVjZT86IEZsb3dDb3VudHNNYXBSZWR1Y2U8Rj47XG4gICAgfSxcbiAgKSA9PiAoRiB8IEFnZ3JlZ2F0ZUZsb3cpW107XG59XG5cbi8qKlxuICogQnVpbGQgQ2x1c3RlckluZGV4IGZyb20gdGhlIGdpdmVuIGNsdXN0ZXIgaGllcmFyY2h5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEluZGV4PEY+KGNsdXN0ZXJMZXZlbHM6IENsdXN0ZXJMZXZlbHMpOiBDbHVzdGVySW5kZXg8Rj4ge1xuICBjb25zdCBub2Rlc0J5Wm9vbSA9IG5ldyBNYXA8bnVtYmVyLCBDbHVzdGVyTm9kZVtdPigpO1xuICBjb25zdCBjbHVzdGVyc0J5SWQgPSBuZXcgTWFwPHN0cmluZywgQ2x1c3Rlcj4oKTtcbiAgY29uc3QgbWluWm9vbUJ5TG9jYXRpb25JZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3Qge3pvb20sIG5vZGVzfSBvZiBjbHVzdGVyTGV2ZWxzKSB7XG4gICAgbm9kZXNCeVpvb20uc2V0KHpvb20sIG5vZGVzKTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGlmIChpc0NsdXN0ZXIobm9kZSkpIHtcbiAgICAgICAgY2x1c3RlcnNCeUlkLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHtpZH0gPSBub2RlO1xuICAgICAgICBjb25zdCBteiA9IG1pblpvb21CeUxvY2F0aW9uSWQuZ2V0KGlkKTtcbiAgICAgICAgaWYgKG16ID09IG51bGwgfHwgbXogPiB6b29tKSB7XG4gICAgICAgICAgbWluWm9vbUJ5TG9jYXRpb25JZC5zZXQoaWQsIHpvb20pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgW21pblpvb20sIG1heFpvb21dID0gZXh0ZW50KGNsdXN0ZXJMZXZlbHMsIChjbCkgPT4gY2wuem9vbSk7XG4gIGlmIChtaW5ab29tID09IG51bGwgfHwgbWF4Wm9vbSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZGV0ZXJtaW5lIG1pblpvb20gb3IgbWF4Wm9vbScpO1xuICB9XG5cbiAgY29uc3QgbGVhdmVzVG9DbHVzdGVyc0J5Wm9vbSA9IG5ldyBNYXA8bnVtYmVyLCBNYXA8c3RyaW5nLCBDbHVzdGVyPj4oKTtcblxuICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnNCeUlkLnZhbHVlcygpKSB7XG4gICAgY29uc3Qge3pvb219ID0gY2x1c3RlcjtcbiAgICBsZXQgbGVhdmVzVG9DbHVzdGVycyA9IGxlYXZlc1RvQ2x1c3RlcnNCeVpvb20uZ2V0KHpvb20pO1xuICAgIGlmICghbGVhdmVzVG9DbHVzdGVycykge1xuICAgICAgbGVhdmVzVG9DbHVzdGVycyA9IG5ldyBNYXA8c3RyaW5nLCBDbHVzdGVyPigpO1xuICAgICAgbGVhdmVzVG9DbHVzdGVyc0J5Wm9vbS5zZXQoem9vbSwgbGVhdmVzVG9DbHVzdGVycyk7XG4gICAgfVxuICAgIHZpc2l0Q2x1c3RlckxlYXZlcyhjbHVzdGVyLCAobGVhZklkKSA9PiB7XG4gICAgICBsZWF2ZXNUb0NsdXN0ZXJzPy5zZXQobGVhZklkLCBjbHVzdGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZpc2l0Q2x1c3RlckxlYXZlcyhjbHVzdGVyOiBDbHVzdGVyLCB2aXNpdDogKGlkOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2YgY2x1c3Rlci5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGQgPSBjbHVzdGVyc0J5SWQuZ2V0KGNoaWxkSWQpO1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIHZpc2l0Q2x1c3RlckxlYXZlcyhjaGlsZCwgdmlzaXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlzaXQoY2hpbGRJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXhwYW5kQ2x1c3RlciA9IChjbHVzdGVyOiBDbHVzdGVyLCB0YXJnZXRab29tOiBudW1iZXIgPSBtYXhab29tKSA9PiB7XG4gICAgY29uc3QgaWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ID0gKGM6IENsdXN0ZXIsIGV4cGFuZGVkSWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgaWYgKHRhcmdldFpvb20gPiBjLnpvb20pIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZElkIG9mIGMuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGNsdXN0ZXJzQnlJZC5nZXQoY2hpbGRJZCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICB2aXNpdChjaGlsZCwgZXhwYW5kZWRJZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHBhbmRlZElkcy5wdXNoKGNoaWxkSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhwYW5kZWRJZHMucHVzaChjLmlkKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZpc2l0KGNsdXN0ZXIsIGlkcyk7XG4gICAgcmV0dXJuIGlkcztcbiAgfTtcblxuICBmdW5jdGlvbiBmaW5kQ2x1c3RlckZvcihsb2NhdGlvbklkOiBzdHJpbmcsIHpvb206IG51bWJlcikge1xuICAgIGNvbnN0IGxlYXZlc1RvQ2x1c3RlcnMgPSBsZWF2ZXNUb0NsdXN0ZXJzQnlab29tLmdldCh6b29tKTtcbiAgICBpZiAoIWxlYXZlc1RvQ2x1c3RlcnMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNsdXN0ZXIgPSBsZWF2ZXNUb0NsdXN0ZXJzLmdldChsb2NhdGlvbklkKTtcbiAgICByZXR1cm4gY2x1c3RlciA/IGNsdXN0ZXIuaWQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBhdmFpbGFibGVab29tTGV2ZWxzID0gY2x1c3RlckxldmVsc1xuICAgIC5tYXAoKGNsKSA9PiArY2wuem9vbSlcbiAgICAuc29ydCgoYSwgYikgPT4gYXNjZW5kaW5nKGEsIGIpKTtcblxuICByZXR1cm4ge1xuICAgIGF2YWlsYWJsZVpvb21MZXZlbHMsXG5cbiAgICBnZXRDbHVzdGVyTm9kZXNGb3I6ICh6b29tKSA9PiB7XG4gICAgICBpZiAoem9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZXNCeVpvb20uZ2V0KHpvb20pO1xuICAgIH0sXG5cbiAgICBnZXRDbHVzdGVyQnlJZDogKGNsdXN0ZXJJZCkgPT4gY2x1c3RlcnNCeUlkLmdldChjbHVzdGVySWQpLFxuXG4gICAgZ2V0TWluWm9vbUZvckxvY2F0aW9uOiAobG9jYXRpb25JZCkgPT5cbiAgICAgIG1pblpvb21CeUxvY2F0aW9uSWQuZ2V0KGxvY2F0aW9uSWQpIHx8IG1pblpvb20sXG5cbiAgICBleHBhbmRDbHVzdGVyLFxuXG4gICAgZmluZENsdXN0ZXJGb3IsXG5cbiAgICBhZ2dyZWdhdGVGbG93czogKFxuICAgICAgZmxvd3MsXG4gICAgICB6b29tLFxuICAgICAge2dldEZsb3dPcmlnaW5JZCwgZ2V0Rmxvd0Rlc3RJZCwgZ2V0Rmxvd01hZ25pdHVkZX0sXG4gICAgICBvcHRpb25zID0ge30sXG4gICAgKSA9PiB7XG4gICAgICBpZiAoem9vbSA+IG1heFpvb20pIHtcbiAgICAgICAgcmV0dXJuIGZsb3dzO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0OiAoRiB8IEFnZ3JlZ2F0ZUZsb3cpW10gPSBbXTtcbiAgICAgIGNvbnN0IGFnZ0Zsb3dzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgQWdncmVnYXRlRmxvdz4oKTtcbiAgICAgIGNvbnN0IG1ha2VLZXkgPSAob3JpZ2luOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykgPT4gYCR7b3JpZ2lufToke2Rlc3R9YDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmxvd0NvdW50c01hcFJlZHVjZSA9IHtcbiAgICAgICAgICBtYXA6IGdldEZsb3dNYWduaXR1ZGUsXG4gICAgICAgICAgcmVkdWNlOiAoYWNjOiBhbnksIGNvdW50OiBudW1iZXIpID0+IChhY2MgfHwgMCkgKyBjb3VudCxcbiAgICAgICAgfSxcbiAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IGdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICAgICAgY29uc3QgZGVzdCA9IGdldEZsb3dEZXN0SWQoZmxvdyk7XG4gICAgICAgIGNvbnN0IG9yaWdpbkNsdXN0ZXIgPSBmaW5kQ2x1c3RlckZvcihvcmlnaW4sIHpvb20pIHx8IG9yaWdpbjtcbiAgICAgICAgY29uc3QgZGVzdENsdXN0ZXIgPSBmaW5kQ2x1c3RlckZvcihkZXN0LCB6b29tKSB8fCBkZXN0O1xuICAgICAgICBjb25zdCBrZXkgPSBtYWtlS2V5KG9yaWdpbkNsdXN0ZXIsIGRlc3RDbHVzdGVyKTtcbiAgICAgICAgaWYgKG9yaWdpbkNsdXN0ZXIgPT09IG9yaWdpbiAmJiBkZXN0Q2x1c3RlciA9PT0gZGVzdCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGZsb3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBhZ2dyZWdhdGVGbG93ID0gYWdnRmxvd3NCeUtleS5nZXQoa2V5KTtcbiAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZUZsb3cpIHtcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZsb3cgPSB7XG4gICAgICAgICAgICAgIG9yaWdpbjogb3JpZ2luQ2x1c3RlcixcbiAgICAgICAgICAgICAgZGVzdDogZGVzdENsdXN0ZXIsXG4gICAgICAgICAgICAgIGNvdW50OiBmbG93Q291bnRzTWFwUmVkdWNlLm1hcChmbG93KSxcbiAgICAgICAgICAgICAgYWdncmVnYXRlOiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFnZ3JlZ2F0ZUZsb3cpO1xuICAgICAgICAgICAgYWdnRmxvd3NCeUtleS5zZXQoa2V5LCBhZ2dyZWdhdGVGbG93KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWdncmVnYXRlRmxvdy5jb3VudCA9IGZsb3dDb3VudHNNYXBSZWR1Y2UucmVkdWNlKFxuICAgICAgICAgICAgICBhZ2dyZWdhdGVGbG93LmNvdW50LFxuICAgICAgICAgICAgICBmbG93Q291bnRzTWFwUmVkdWNlLm1hcChmbG93KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTG9jYXRpb25XZWlnaHRHZXR0ZXI8Rj4oXG4gIGZsb3dzOiBGW10sXG4gIHtnZXRGbG93T3JpZ2luSWQsIGdldEZsb3dEZXN0SWQsIGdldEZsb3dNYWduaXR1ZGV9OiBGbG93QWNjZXNzb3JzPEY+LFxuKTogTG9jYXRpb25XZWlnaHRHZXR0ZXIge1xuICBjb25zdCBsb2NhdGlvblRvdGFscyA9IHtcbiAgICBpbmNvbWluZzogbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKSxcbiAgICBvdXRnb2luZzogbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKSxcbiAgfTtcbiAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gZ2V0Rmxvd09yaWdpbklkKGZsb3cpO1xuICAgIGNvbnN0IGRlc3QgPSBnZXRGbG93RGVzdElkKGZsb3cpO1xuICAgIGNvbnN0IGNvdW50ID0gZ2V0Rmxvd01hZ25pdHVkZShmbG93KTtcbiAgICBsb2NhdGlvblRvdGFscy5pbmNvbWluZy5zZXQoXG4gICAgICBkZXN0LFxuICAgICAgKGxvY2F0aW9uVG90YWxzLmluY29taW5nLmdldChkZXN0KSB8fCAwKSArIGNvdW50LFxuICAgICk7XG4gICAgbG9jYXRpb25Ub3RhbHMub3V0Z29pbmcuc2V0KFxuICAgICAgb3JpZ2luLFxuICAgICAgKGxvY2F0aW9uVG90YWxzLm91dGdvaW5nLmdldChvcmlnaW4pIHx8IDApICsgY291bnQsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gKGlkOiBzdHJpbmcpID0+XG4gICAgTWF0aC5tYXgoXG4gICAgICBNYXRoLmFicyhsb2NhdGlvblRvdGFscy5pbmNvbWluZy5nZXQoaWQpIHx8IDApLFxuICAgICAgTWF0aC5hYnMobG9jYXRpb25Ub3RhbHMub3V0Z29pbmcuZ2V0KGlkKSB8fCAwKSxcbiAgICApO1xufVxuXG4vKipcbiAqIEBwYXJhbSBhdmFpbGFibGVab29tTGV2ZWxzIE11c3QgYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlclxuICogQHBhcmFtIHRhcmdldFpvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBcHByb3ByaWF0ZVpvb21MZXZlbChcbiAgYXZhaWxhYmxlWm9vbUxldmVsczogbnVtYmVyW10sXG4gIHRhcmdldFpvb206IG51bWJlcixcbikge1xuICBpZiAoIWF2YWlsYWJsZVpvb21MZXZlbHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdmFpbGFibGUgem9vbSBsZXZlbHMnKTtcbiAgfVxuICByZXR1cm4gYXZhaWxhYmxlWm9vbUxldmVsc1tcbiAgICBNYXRoLm1pbihcbiAgICAgIGJpc2VjdExlZnQoYXZhaWxhYmxlWm9vbUxldmVscywgTWF0aC5mbG9vcih0YXJnZXRab29tKSksXG4gICAgICBhdmFpbGFibGVab29tTGV2ZWxzLmxlbmd0aCAtIDEsXG4gICAgKVxuICBdO1xufVxuIl19
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckluZGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsdXN0ZXIvQ2x1c3RlckluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBT0wsU0FBUyxHQUNWLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQTBDdkQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFJLGFBQTRCO0lBQ3hELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBQ3JELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBQ3pELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFDL0QsS0FBSyxNQUFNLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBQyxJQUFJLGFBQWEsRUFBRTtRQUN6QyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2pDO2lCQUFNO2dCQUNMLE1BQU0sRUFBQyxFQUFFLEVBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2xCLE1BQU0sRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUU7b0JBQzNCLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ25DO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsTUFB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SSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDL0MsQ0FBQztBQUNOLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLG1CQUE2QixFQUM3QixVQUFrQjtJQUVsQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztLQUM3QztJQUNELE9BQU8sbUJBQW1CLENBQ3hCLElBQUksQ0FBQyxHQUFHLENBQ04sVUFBVSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFDdkQsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDL0IsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIEZsb3dtYXAuZ2wgY29udHJpYnV0b3JzXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBUZXJhbHl0aWNzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7XG4gIEFnZ3JlZ2F0ZUZsb3csXG4gIENsdXN0ZXIsXG4gIENsdXN0ZXJMZXZlbHMsXG4gIENsdXN0ZXJOb2RlLFxuICBGbG93QWNjZXNzb3JzLFxuICBGbG93Q291bnRzTWFwUmVkdWNlLFxuICBpc0NsdXN0ZXIsXG59IGZyb20gJy4vLi4vdHlwZXMnO1xuaW1wb3J0IHthc2NlbmRpbmcsIGJpc2VjdExlZnQsIGV4dGVudH0gZnJvbSAnZDMtYXJyYXknO1xuXG5leHBvcnQgdHlwZSBMb2NhdGlvbldlaWdodEdldHRlciA9IChpZDogc3RyaW5nIHwgbnVtYmVyKSA9PiBudW1iZXI7XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGNsdXN0ZXIgbGV2ZWxzIGZvciBlZmZpY2llbnQgZmxvdyBhZ2dyZWdhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbHVzdGVySW5kZXg8Rj4ge1xuICBhdmFpbGFibGVab29tTGV2ZWxzOiBudW1iZXJbXTtcbiAgZ2V0Q2x1c3RlckJ5SWQ6IChjbHVzdGVySWQ6IHN0cmluZyB8IG51bWJlcikgPT4gQ2x1c3RlciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIExpc3QgdGhlIG5vZGVzIG9uIHRoZSBnaXZlbiB6b29tIGxldmVsLlxuICAgKi9cbiAgZ2V0Q2x1c3Rlck5vZGVzRm9yOiAoem9vbTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiBDbHVzdGVyTm9kZVtdIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogR2V0IHRoZSBtaW4gem9vbSBsZXZlbCBvbiB3aGljaCB0aGUgbG9jYXRpb24gaXMgbm90IGNsdXN0ZXJlZC5cbiAgICovXG4gIGdldE1pblpvb21Gb3JMb2NhdGlvbjogKGxvY2F0aW9uSWQ6IHN0cmluZyB8IG51bWJlcikgPT4gbnVtYmVyO1xuICAvKipcbiAgICogTGlzdCB0aGUgSURzIG9mIGFsbCBsb2NhdGlvbnMgaW4gdGhlIGNsdXN0ZXIgKGxlYXZlcyBvZiB0aGUgc3VidHJlZSBzdGFydGluZyBpbiB0aGUgY2x1c3RlcikuXG4gICAqL1xuICBleHBhbmRDbHVzdGVyOiAoY2x1c3RlcjogQ2x1c3RlciwgdGFyZ2V0Wm9vbT86IG51bWJlcikgPT4gc3RyaW5nW107XG4gIC8qKlxuICAgKiBGaW5kIHRoZSBjbHVzdGVyIHRoZSBnaXZlbiBsb2NhdGlvbiBpcyByZXNpZGluZyBpbiBvbiB0aGUgc3BlY2lmaWVkIHpvb20gbGV2ZWwuXG4gICAqL1xuICBmaW5kQ2x1c3RlckZvcjogKFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICB6b29tOiBudW1iZXIsXG4gICkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQWdncmVnYXRlIGZsb3dzIGZvciB0aGUgc3BlY2lmaWVkIHpvb20gbGV2ZWwuXG4gICAqL1xuICBhZ2dyZWdhdGVGbG93czogKFxuICAgIGZsb3dzOiBGW10sXG4gICAgem9vbTogbnVtYmVyLFxuICAgIHtnZXRGbG93T3JpZ2luSWQsIGdldEZsb3dEZXN0SWQsIGdldEZsb3dNYWduaXR1ZGV9OiBGbG93QWNjZXNzb3JzPEY+LFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBmbG93Q291bnRzTWFwUmVkdWNlPzogRmxvd0NvdW50c01hcFJlZHVjZTxGPjtcbiAgICB9LFxuICApID0+IChGIHwgQWdncmVnYXRlRmxvdylbXTtcbn1cblxuLyoqXG4gKiBCdWlsZCBDbHVzdGVySW5kZXggZnJvbSB0aGUgZ2l2ZW4gY2x1c3RlciBoaWVyYXJjaHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkSW5kZXg8Rj4oY2x1c3RlckxldmVsczogQ2x1c3RlckxldmVscyk6IENsdXN0ZXJJbmRleDxGPiB7XG4gIGNvbnN0IG5vZGVzQnlab29tID0gbmV3IE1hcDxudW1iZXIsIENsdXN0ZXJOb2RlW10+KCk7XG4gIGNvbnN0IGNsdXN0ZXJzQnlJZCA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBDbHVzdGVyPigpO1xuICBjb25zdCBtaW5ab29tQnlMb2NhdGlvbklkID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCB7em9vbSwgbm9kZXN9IG9mIGNsdXN0ZXJMZXZlbHMpIHtcbiAgICBub2Rlc0J5Wm9vbS5zZXQoem9vbSwgbm9kZXMpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgaWYgKGlzQ2x1c3Rlcihub2RlKSkge1xuICAgICAgICBjbHVzdGVyc0J5SWQuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qge2lkfSA9IG5vZGU7XG4gICAgICAgIGNvbnN0IG16ID0gbWluWm9vbUJ5TG9jYXRpb25JZC5nZXQoaWQpO1xuICAgICAgICBpZiAobXogPT0gbnVsbCB8fCBteiA+IHpvb20pIHtcbiAgICAgICAgICBtaW5ab29tQnlMb2NhdGlvbklkLnNldChpZCwgem9vbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBbbWluWm9vbSwgbWF4Wm9vbV0gPSBleHRlbnQoY2x1c3RlckxldmVscywgKGNsKSA9PiBjbC56b29tKTtcbiAgaWYgKG1pblpvb20gPT0gbnVsbCB8fCBtYXhab29tID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBkZXRlcm1pbmUgbWluWm9vbSBvciBtYXhab29tJyk7XG4gIH1cblxuICBjb25zdCBsZWF2ZXNUb0NsdXN0ZXJzQnlab29tID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgTWFwPHN0cmluZyB8IG51bWJlciwgQ2x1c3Rlcj5cbiAgPigpO1xuXG4gIGZvciAoY29uc3QgY2x1c3RlciBvZiBjbHVzdGVyc0J5SWQudmFsdWVzKCkpIHtcbiAgICBjb25zdCB7em9vbX0gPSBjbHVzdGVyO1xuICAgIGxldCBsZWF2ZXNUb0NsdXN0ZXJzID0gbGVhdmVzVG9DbHVzdGVyc0J5Wm9vbS5nZXQoem9vbSk7XG4gICAgaWYgKCFsZWF2ZXNUb0NsdXN0ZXJzKSB7XG4gICAgICBsZWF2ZXNUb0NsdXN0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIENsdXN0ZXI+KCk7XG4gICAgICBsZWF2ZXNUb0NsdXN0ZXJzQnlab29tLnNldCh6b29tLCBsZWF2ZXNUb0NsdXN0ZXJzKTtcbiAgICB9XG4gICAgdmlzaXRDbHVzdGVyTGVhdmVzKGNsdXN0ZXIsIChsZWFmSWQpID0+IHtcbiAgICAgIGxlYXZlc1RvQ2x1c3RlcnM/LnNldChsZWFmSWQsIGNsdXN0ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaXRDbHVzdGVyTGVhdmVzKGNsdXN0ZXI6IENsdXN0ZXIsIHZpc2l0OiAoaWQ6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBjbHVzdGVyLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGNsdXN0ZXJzQnlJZC5nZXQoY2hpbGRJZCk7XG4gICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgdmlzaXRDbHVzdGVyTGVhdmVzKGNoaWxkLCB2aXNpdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aXNpdChjaGlsZElkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBleHBhbmRDbHVzdGVyID0gKGNsdXN0ZXI6IENsdXN0ZXIsIHRhcmdldFpvb206IG51bWJlciA9IG1heFpvb20pID0+IHtcbiAgICBjb25zdCBpZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdmlzaXQgPSAoYzogQ2x1c3RlciwgZXhwYW5kZWRJZHM6IChzdHJpbmcgfCBudW1iZXIpW10pID0+IHtcbiAgICAgIGlmICh0YXJnZXRab29tID4gYy56b29tKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBjLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjbHVzdGVyc0J5SWQuZ2V0KGNoaWxkSWQpO1xuICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgdmlzaXQoY2hpbGQsIGV4cGFuZGVkSWRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwYW5kZWRJZHMucHVzaChjaGlsZElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cGFuZGVkSWRzLnB1c2goYy5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2aXNpdChjbHVzdGVyLCBpZHMpO1xuICAgIHJldHVybiBpZHM7XG4gIH07XG5cbiAgZnVuY3Rpb24gZmluZENsdXN0ZXJGb3IobG9jYXRpb25JZDogc3RyaW5nIHwgbnVtYmVyLCB6b29tOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZWF2ZXNUb0NsdXN0ZXJzID0gbGVhdmVzVG9DbHVzdGVyc0J5Wm9vbS5nZXQoem9vbSk7XG4gICAgaWYgKCFsZWF2ZXNUb0NsdXN0ZXJzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjbHVzdGVyID0gbGVhdmVzVG9DbHVzdGVycy5nZXQobG9jYXRpb25JZCk7XG4gICAgcmV0dXJuIGNsdXN0ZXIgPyBjbHVzdGVyLmlkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgYXZhaWxhYmxlWm9vbUxldmVscyA9IGNsdXN0ZXJMZXZlbHNcbiAgICAubWFwKChjbCkgPT4gK2NsLnpvb20pXG4gICAgLnNvcnQoKGEsIGIpID0+IGFzY2VuZGluZyhhLCBiKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBhdmFpbGFibGVab29tTGV2ZWxzLFxuXG4gICAgZ2V0Q2x1c3Rlck5vZGVzRm9yOiAoem9vbSkgPT4ge1xuICAgICAgaWYgKHpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGVzQnlab29tLmdldCh6b29tKTtcbiAgICB9LFxuXG4gICAgZ2V0Q2x1c3RlckJ5SWQ6IChjbHVzdGVySWQpID0+IGNsdXN0ZXJzQnlJZC5nZXQoY2x1c3RlcklkKSxcblxuICAgIGdldE1pblpvb21Gb3JMb2NhdGlvbjogKGxvY2F0aW9uSWQpID0+XG4gICAgICBtaW5ab29tQnlMb2NhdGlvbklkLmdldChsb2NhdGlvbklkKSB8fCBtaW5ab29tLFxuXG4gICAgZXhwYW5kQ2x1c3RlcixcblxuICAgIGZpbmRDbHVzdGVyRm9yLFxuXG4gICAgYWdncmVnYXRlRmxvd3M6IChcbiAgICAgIGZsb3dzLFxuICAgICAgem9vbSxcbiAgICAgIHtnZXRGbG93T3JpZ2luSWQsIGdldEZsb3dEZXN0SWQsIGdldEZsb3dNYWduaXR1ZGV9LFxuICAgICAgb3B0aW9ucyA9IHt9LFxuICAgICkgPT4ge1xuICAgICAgaWYgKHpvb20gPiBtYXhab29tKSB7XG4gICAgICAgIHJldHVybiBmbG93cztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogKEYgfCBBZ2dyZWdhdGVGbG93KVtdID0gW107XG4gICAgICBjb25zdCBhZ2dGbG93c0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIEFnZ3JlZ2F0ZUZsb3c+KCk7XG4gICAgICBjb25zdCBtYWtlS2V5ID0gKG9yaWdpbjogc3RyaW5nIHwgbnVtYmVyLCBkZXN0OiBzdHJpbmcgfCBudW1iZXIpID0+XG4gICAgICAgIGAke29yaWdpbn06JHtkZXN0fWA7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZsb3dDb3VudHNNYXBSZWR1Y2UgPSB7XG4gICAgICAgICAgbWFwOiBnZXRGbG93TWFnbml0dWRlLFxuICAgICAgICAgIHJlZHVjZTogKGFjYzogYW55LCBjb3VudDogbnVtYmVyKSA9PiAoYWNjIHx8IDApICsgY291bnQsXG4gICAgICAgIH0sXG4gICAgICB9ID0gb3B0aW9ucztcbiAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICBjb25zdCBvcmlnaW4gPSBnZXRGbG93T3JpZ2luSWQoZmxvdyk7XG4gICAgICAgIGNvbnN0IGRlc3QgPSBnZXRGbG93RGVzdElkKGZsb3cpO1xuICAgICAgICBjb25zdCBvcmlnaW5DbHVzdGVyID0gZmluZENsdXN0ZXJGb3Iob3JpZ2luLCB6b29tKSB8fCBvcmlnaW47XG4gICAgICAgIGNvbnN0IGRlc3RDbHVzdGVyID0gZmluZENsdXN0ZXJGb3IoZGVzdCwgem9vbSkgfHwgZGVzdDtcbiAgICAgICAgY29uc3Qga2V5ID0gbWFrZUtleShvcmlnaW5DbHVzdGVyLCBkZXN0Q2x1c3Rlcik7XG4gICAgICAgIGlmIChvcmlnaW5DbHVzdGVyID09PSBvcmlnaW4gJiYgZGVzdENsdXN0ZXIgPT09IGRlc3QpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChmbG93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgYWdncmVnYXRlRmxvdyA9IGFnZ0Zsb3dzQnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgaWYgKCFhZ2dyZWdhdGVGbG93KSB7XG4gICAgICAgICAgICBhZ2dyZWdhdGVGbG93ID0ge1xuICAgICAgICAgICAgICBvcmlnaW46IG9yaWdpbkNsdXN0ZXIsXG4gICAgICAgICAgICAgIGRlc3Q6IGRlc3RDbHVzdGVyLFxuICAgICAgICAgICAgICBjb3VudDogZmxvd0NvdW50c01hcFJlZHVjZS5tYXAoZmxvdyksXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXN1bHQucHVzaChhZ2dyZWdhdGVGbG93KTtcbiAgICAgICAgICAgIGFnZ0Zsb3dzQnlLZXkuc2V0KGtleSwgYWdncmVnYXRlRmxvdyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZsb3cuY291bnQgPSBmbG93Q291bnRzTWFwUmVkdWNlLnJlZHVjZShcbiAgICAgICAgICAgICAgYWdncmVnYXRlRmxvdy5jb3VudCxcbiAgICAgICAgICAgICAgZmxvd0NvdW50c01hcFJlZHVjZS5tYXAoZmxvdyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUxvY2F0aW9uV2VpZ2h0R2V0dGVyPEY+KFxuICBmbG93czogRltdLFxuICB7Z2V0Rmxvd09yaWdpbklkLCBnZXRGbG93RGVzdElkLCBnZXRGbG93TWFnbml0dWRlfTogRmxvd0FjY2Vzc29yczxGPixcbik6IExvY2F0aW9uV2VpZ2h0R2V0dGVyIHtcbiAgY29uc3QgbG9jYXRpb25Ub3RhbHMgPSB7XG4gICAgaW5jb21pbmc6IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBudW1iZXI+KCksXG4gICAgb3V0Z29pbmc6IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBudW1iZXI+KCksXG4gIH07XG4gIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgIGNvbnN0IG9yaWdpbiA9IGdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICBjb25zdCBkZXN0ID0gZ2V0Rmxvd0Rlc3RJZChmbG93KTtcbiAgICBjb25zdCBjb3VudCA9IGdldEZsb3dNYWduaXR1ZGUoZmxvdyk7XG4gICAgbG9jYXRpb25Ub3RhbHMuaW5jb21pbmcuc2V0KFxuICAgICAgZGVzdCxcbiAgICAgIChsb2NhdGlvblRvdGFscy5pbmNvbWluZy5nZXQoZGVzdCkgfHwgMCkgKyBjb3VudCxcbiAgICApO1xuICAgIGxvY2F0aW9uVG90YWxzLm91dGdvaW5nLnNldChcbiAgICAgIG9yaWdpbixcbiAgICAgIChsb2NhdGlvblRvdGFscy5vdXRnb2luZy5nZXQob3JpZ2luKSB8fCAwKSArIGNvdW50LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIChpZDogc3RyaW5nIHwgbnVtYmVyKSA9PlxuICAgIE1hdGgubWF4KFxuICAgICAgTWF0aC5hYnMobG9jYXRpb25Ub3RhbHMuaW5jb21pbmcuZ2V0KGlkKSB8fCAwKSxcbiAgICAgIE1hdGguYWJzKGxvY2F0aW9uVG90YWxzLm91dGdvaW5nLmdldChpZCkgfHwgMCksXG4gICAgKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gYXZhaWxhYmxlWm9vbUxldmVscyBNdXN0IGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXJcbiAqIEBwYXJhbSB0YXJnZXRab29tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQXBwcm9wcmlhdGVab29tTGV2ZWwoXG4gIGF2YWlsYWJsZVpvb21MZXZlbHM6IG51bWJlcltdLFxuICB0YXJnZXRab29tOiBudW1iZXIsXG4pIHtcbiAgaWYgKCFhdmFpbGFibGVab29tTGV2ZWxzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gYXZhaWxhYmxlIHpvb20gbGV2ZWxzJyk7XG4gIH1cbiAgcmV0dXJuIGF2YWlsYWJsZVpvb21MZXZlbHNbXG4gICAgTWF0aC5taW4oXG4gICAgICBiaXNlY3RMZWZ0KGF2YWlsYWJsZVpvb21MZXZlbHMsIE1hdGguZmxvb3IodGFyZ2V0Wm9vbSkpLFxuICAgICAgYXZhaWxhYmxlWm9vbUxldmVscy5sZW5ndGggLSAxLFxuICAgIClcbiAgXTtcbn1cbiJdfQ==
@@ -1,5 +1,24 @@
1
1
  import { LocationWeightGetter } from './ClusterIndex';
2
2
  import { ClusterLevel, LocationAccessors } from '../types';
3
+ /**
4
+ * The code in this file is a based on https://github.com/mapbox/supercluster
5
+ *
6
+ * ISC License
7
+ *
8
+ * Copyright (c) 2016, Mapbox
9
+ *
10
+ * Permission to use, copy, modify, and/or distribute this software for any purpose
11
+ * with or without fee is hereby granted, provided that the above copyright notice
12
+ * and this permission notice appear in all copies.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
15
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
16
+ * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
17
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
18
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
20
+ * THIS SOFTWARE.
21
+ */
3
22
  export interface Options {
4
23
  minZoom: number;
5
24
  maxZoom: number;
@@ -16,16 +35,17 @@ interface BasePoint {
16
35
  zoom: number;
17
36
  parentId: number;
18
37
  }
19
- interface LeafPoint extends BasePoint {
38
+ interface LeafPoint<L> extends BasePoint {
20
39
  index: number;
40
+ location: L;
21
41
  }
22
42
  interface ClusterPoint extends BasePoint {
23
43
  id: number;
24
44
  numPoints: number;
25
45
  }
26
- declare type Point = LeafPoint | ClusterPoint;
27
- export declare function isLeafPoint(p: Point): p is LeafPoint;
28
- export declare function isClusterPoint(p: Point): p is ClusterPoint;
29
- export declare function clusterLocations<L>(locations: L[], locationAccessors: LocationAccessors<L>, getLocationWeight: LocationWeightGetter, options?: Partial<Options>): ClusterLevel[];
46
+ type Point<L> = LeafPoint<L> | ClusterPoint;
47
+ export declare function isLeafPoint<L>(p: Point<L>): p is LeafPoint<L>;
48
+ export declare function isClusterPoint<L>(p: Point<L>): p is ClusterPoint;
49
+ export declare function clusterLocations<L>(locations: Iterable<L>, locationAccessors: LocationAccessors<L>, getLocationWeight: LocationWeightGetter, options?: Partial<Options>): ClusterLevel[];
30
50
  export {};
31
51
  //# sourceMappingURL=cluster.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../../src/cluster/cluster.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAC,oBAAoB,EAAC,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAU,YAAY,EAAe,iBAAiB,EAAC,MAAM,UAAU,CAAC;AAE/E,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAYD,UAAU,SAAS;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAU,SAAQ,SAAS;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAa,SAAQ,SAAS;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,aAAK,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;AAEtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,SAAS,CAGpD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,YAAY,CAG1D;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,SAAS,EAAE,CAAC,EAAE,EACd,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACvC,iBAAiB,EAAE,oBAAoB,EACvC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GACzB,YAAY,EAAE,CA8FhB"}
1
+ {"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../../src/cluster/cluster.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,oBAAoB,EAAC,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAU,YAAY,EAAe,iBAAiB,EAAC,MAAM,UAAU,CAAC;AAE/E;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAYD,UAAU,SAAS;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAS,CAAC,CAAC,CAAE,SAAQ,SAAS;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,CAAC;CACb;AAED,UAAU,YAAa,SAAQ,SAAS;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;AAE5C,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAG7D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,YAAY,CAGhE;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EACtB,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACvC,iBAAiB,EAAE,oBAAoB,EACvC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GACzB,YAAY,EAAE,CAmJhB"}
@@ -1,39 +1,9 @@
1
1
  /*
2
- * Copyright 2022 FlowmapBlue
3
- * Copyright 2018-2020 Teralytics, modified by FlowmapBlue
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
2
+ * Copyright (c) Flowmap.gl contributors
3
+ * Copyright (c) 2018-2020 Teralytics
4
+ * SPDX-License-Identifier: Apache-2.0
17
5
  */
18
- /**
19
- * The code in this file is a based on https://github.com/mapbox/supercluster
20
- */
21
- // ISC License
22
- //
23
- // Copyright (c) 2016, Mapbox
24
- //
25
- // Permission to use, copy, modify, and/or distribute this software for any purpose
26
- // with or without fee is hereby granted, provided that the above copyright notice
27
- // and this permission notice appear in all copies.
28
- //
29
- // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
30
- // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
31
- // FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
32
- // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
33
- // OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
34
- // TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
35
- // THIS SOFTWARE.
36
- import { rollup } from 'd3-array';
6
+ import { min, rollup } from 'd3-array';
37
7
  import KDBush from 'kdbush';
38
8
  const defaultOptions = {
39
9
  minZoom: 0,
@@ -54,49 +24,95 @@ export function isClusterPoint(p) {
54
24
  }
55
25
  export function clusterLocations(locations, locationAccessors, getLocationWeight, options) {
56
26
  const { getLocationLon, getLocationLat, getLocationId } = locationAccessors;
57
- const opts = Object.assign(Object.assign({}, defaultOptions), options);
27
+ const opts = {
28
+ ...defaultOptions,
29
+ ...options,
30
+ };
58
31
  const { minZoom, maxZoom, nodeSize, makeClusterName, makeClusterId } = opts;
59
32
  const trees = new Array(maxZoom + 1);
60
33
  // generate a cluster object for each point and index input points into a KD-tree
61
34
  let clusters = new Array();
62
- for (let i = 0; i < locations.length; i++) {
63
- const x = getLocationLon(locations[i]);
64
- const y = getLocationLat(locations[i]);
35
+ let locationsCount = 0;
36
+ for (const location of locations) {
37
+ const x = getLocationLon(location);
38
+ const y = getLocationLat(location);
65
39
  clusters.push({
66
40
  x: lngX(x),
67
41
  y: latY(y),
68
- weight: getLocationWeight(getLocationId(locations[i])),
42
+ weight: getLocationWeight(getLocationId(location)),
69
43
  zoom: Infinity,
70
- index: i,
71
- parentId: -1, // parent cluster id
44
+ index: locationsCount,
45
+ parentId: -1,
46
+ location,
72
47
  });
48
+ locationsCount++;
73
49
  }
74
- trees[maxZoom + 1] = new KDBush(clusters, getX, getY, nodeSize, Float32Array);
50
+ const makeBush = (points) => {
51
+ const bush = new KDBush(points.length, nodeSize, Float32Array);
52
+ for (let i = 0; i < points.length; i++) {
53
+ bush.add(points[i].x, points[i].y);
54
+ }
55
+ bush.finish();
56
+ bush.points = points;
57
+ return bush;
58
+ };
75
59
  // cluster points on max zoom, then cluster the results on previous zoom, etc.;
76
60
  // results in a cluster hierarchy across zoom levels
61
+ trees[maxZoom + 1] = makeBush(clusters);
62
+ let prevZoom = maxZoom + 1;
77
63
  for (let z = maxZoom; z >= minZoom; z--) {
78
64
  // create a new set of clusters for the zoom and index them with a KD-tree
79
- clusters = cluster(clusters, z, trees[z + 1], opts);
80
- trees[z] = new KDBush(clusters, getX, getY, nodeSize, Float32Array);
65
+ const _clusters = cluster(clusters, z, trees[prevZoom], opts);
66
+ if (_clusters.length === clusters.length) {
67
+ // same number of clusters => move the higher level clusters up
68
+ // no need to keep the same data on multiple levels
69
+ trees[z] = trees[prevZoom];
70
+ trees[prevZoom] = undefined;
71
+ prevZoom = z;
72
+ clusters = _clusters;
73
+ }
74
+ else {
75
+ prevZoom = z;
76
+ clusters = _clusters;
77
+ trees[z] = makeBush(clusters);
78
+ }
81
79
  }
82
80
  if (trees.length === 0) {
83
81
  return [];
84
82
  }
85
- const numbersOfClusters = trees.map((d) => d.points.length);
86
- const maxAvailZoom = numbersOfClusters.indexOf(numbersOfClusters[numbersOfClusters.length - 1]);
87
- const minAvailZoom = Math.min(maxAvailZoom, numbersOfClusters.lastIndexOf(numbersOfClusters[0]));
83
+ const numbersOfClusters = trees.map((d) => d?.points.length);
84
+ const minClusters = min(numbersOfClusters.filter((d) => d > 0));
85
+ let maxAvailZoom = findIndexOfMax(numbersOfClusters) ?? numbersOfClusters.length - 1;
86
+ const numUniqueLocations = countUniqueLocations(locations, locationAccessors);
87
+ if (numUniqueLocations < locationsCount) {
88
+ // Duplicate locations would be clustered together at any zoom level which can lead to having too many zooms.
89
+ // To avoid that, we need to find the max zoom level that has less or equal clusters than unique locations
90
+ // and drop all zoom levels beyond that (except the unclustered level).
91
+ const maxClustersZoom = findLastIndex(numbersOfClusters, (d) => d <= numUniqueLocations);
92
+ if (maxClustersZoom >= 0) {
93
+ // Now, move the unclustered points to the next zoom level to avoid having a gap
94
+ if (maxClustersZoom < maxAvailZoom) {
95
+ trees[maxClustersZoom + 1] = trees[maxAvailZoom];
96
+ trees.splice(maxClustersZoom + 2); // Remove all zoom levels beyond maxClustersZoom
97
+ }
98
+ maxAvailZoom = maxClustersZoom + 1;
99
+ }
100
+ }
101
+ const minAvailZoom = Math.min(maxAvailZoom, minClusters ? numbersOfClusters.lastIndexOf(minClusters) : maxAvailZoom);
88
102
  const clusterLevels = new Array();
89
- for (let zoom = minAvailZoom; zoom <= maxAvailZoom; zoom++) {
103
+ prevZoom = NaN;
104
+ for (let zoom = maxAvailZoom; zoom >= minAvailZoom; zoom--) {
90
105
  let childrenByParent;
91
106
  const tree = trees[zoom];
92
- if (zoom < maxAvailZoom) {
93
- childrenByParent = rollup(trees[zoom + 1].points, (points) => points.map((p) => p.id ? makeClusterId(p.id) : getLocationId(locations[p.index])), (point) => point.parentId);
107
+ if (!tree)
108
+ continue;
109
+ if (trees[prevZoom] && zoom < maxAvailZoom) {
110
+ childrenByParent = rollup(trees[prevZoom].points, (points) => points.map((p) => p.id ? makeClusterId(p.id) : getLocationId(p.location)), (point) => point.parentId);
94
111
  }
95
112
  const nodes = [];
96
113
  for (const point of tree.points) {
97
- const { x, y, numPoints } = point;
114
+ const { x, y, numPoints, location } = point;
98
115
  if (isLeafPoint(point)) {
99
- const location = locations[point.index];
100
116
  nodes.push({
101
117
  id: getLocationId(location),
102
118
  zoom,
@@ -108,22 +124,26 @@ export function clusterLocations(locations, locationAccessors, getLocationWeight
108
124
  const { id } = point;
109
125
  const children = childrenByParent && childrenByParent.get(id);
110
126
  if (!children) {
111
- throw new Error(`Cluster ${id} doesn't have children`);
127
+ // Might happen if there are multiple locations with same coordinates
128
+ console.warn(`Omitting cluster with no children, point:`, point);
129
+ continue;
112
130
  }
113
- nodes.push({
131
+ const cluster = {
114
132
  id: makeClusterId(id),
115
133
  name: makeClusterName(id, numPoints),
116
134
  zoom,
117
135
  lat: yLat(y),
118
136
  lon: xLng(x),
119
- children,
120
- });
137
+ children: children ?? [],
138
+ };
139
+ nodes.push(cluster);
121
140
  }
122
141
  }
123
142
  clusterLevels.push({
124
143
  zoom,
125
144
  nodes,
126
145
  });
146
+ prevZoom = zoom;
127
147
  }
128
148
  return clusterLevels;
129
149
  }
@@ -206,4 +226,42 @@ function getX(p) {
206
226
  function getY(p) {
207
227
  return p.y;
208
228
  }
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbHVzdGVyL2NsdXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7R0FFRztBQUVILGNBQWM7QUFDZCxFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLEVBQUU7QUFDRixtRkFBbUY7QUFDbkYsa0ZBQWtGO0FBQ2xGLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLGtGQUFrRjtBQUNsRiwyRUFBMkU7QUFDM0UsbUZBQW1GO0FBQ25GLGlGQUFpRjtBQUNqRixrRkFBa0Y7QUFDbEYsaUJBQWlCO0FBRWpCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBYzVCLE1BQU0sY0FBYyxHQUFZO0lBQzlCLE9BQU8sRUFBRSxDQUFDO0lBQ1YsT0FBTyxFQUFFLEVBQUU7SUFDWCxNQUFNLEVBQUUsRUFBRTtJQUNWLE1BQU0sRUFBRSxHQUFHO0lBQ1gsUUFBUSxFQUFFLEVBQUU7SUFDWixlQUFlLEVBQUUsQ0FBQyxFQUFVLEVBQUUsU0FBaUIsRUFBRSxFQUFFLENBQUMsU0FBUztJQUM3RCxhQUFhLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJO0NBQzNDLENBQUM7QUFxQkYsTUFBTSxVQUFVLFdBQVcsQ0FBQyxDQUFRO0lBQ2xDLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxDQUFjLENBQUM7SUFDL0IsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLENBQVE7SUFDckMsTUFBTSxFQUFDLEVBQUUsRUFBQyxHQUFHLENBQWlCLENBQUM7SUFDL0IsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDO0FBQ3BCLENBQUM7QUFJRCxNQUFNLFVBQVUsZ0JBQWdC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QUVELDJEQUEyRDtBQUMzRCxTQUFTLElBQUksQ0FBQyxHQUFXO0lBQ3ZCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekIsQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFDLEdBQVc7SUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxDQUFRO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxDQUFRO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjIgRmxvd21hcEJsdWVcbiAqIENvcHlyaWdodCAyMDE4LTIwMjAgVGVyYWx5dGljcywgbW9kaWZpZWQgYnkgRmxvd21hcEJsdWVcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cblxuLyoqXG4gKiBUaGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgYSBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3N1cGVyY2x1c3RlclxuICovXG5cbi8vIElTQyBMaWNlbnNlXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDE2LCBNYXBib3hcbi8vXG4vLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZVxuLy8gd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZVxuLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuLy8gUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORFxuLy8gRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG4vLyBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TU1xuLy8gT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSXG4vLyBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GXG4vLyBUSElTIFNPRlRXQVJFLlxuXG5pbXBvcnQge3JvbGx1cH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IEtEQnVzaCBmcm9tICdrZGJ1c2gnO1xuaW1wb3J0IHtMb2NhdGlvbldlaWdodEdldHRlcn0gZnJvbSAnLi9DbHVzdGVySW5kZXgnO1xuaW1wb3J0IHtDbHVzdGVyLCBDbHVzdGVyTGV2ZWwsIENsdXN0ZXJOb2RlLCBMb2NhdGlvbkFjY2Vzc29yc30gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICBtaW5ab29tOiBudW1iZXI7IC8vIG1pbiB6b29tIHRvIGdlbmVyYXRlIGNsdXN0ZXJzIG9uXG4gIG1heFpvb206IG51bWJlcjsgLy8gbWF4IHpvb20gbGV2ZWwgdG8gY2x1c3RlciB0aGUgcG9pbnRzIG9uXG4gIHJhZGl1czogbnVtYmVyOyAvLyBjbHVzdGVyIHJhZGl1cyBpbiBwaXhlbHNcbiAgZXh0ZW50OiBudW1iZXI7IC8vIHRpbGUgZXh0ZW50IChyYWRpdXMgaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBpdClcbiAgbm9kZVNpemU6IG51bWJlcjsgLy8gc2l6ZSBvZiB0aGUgS0QtdHJlZSBsZWFmIG5vZGUsIGFmZmVjdHMgcGVyZm9ybWFuY2VcbiAgbWFrZUNsdXN0ZXJOYW1lOiAoaWQ6IG51bWJlciwgbnVtUG9pbnRzOiBudW1iZXIpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbWFrZUNsdXN0ZXJJZDogKGlkOiBudW1iZXIpID0+IHN0cmluZztcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIG1pblpvb206IDAsXG4gIG1heFpvb206IDE2LFxuICByYWRpdXM6IDQwLFxuICBleHRlbnQ6IDUxMixcbiAgbm9kZVNpemU6IDY0LFxuICBtYWtlQ2x1c3Rlck5hbWU6IChpZDogbnVtYmVyLCBudW1Qb2ludHM6IG51bWJlcikgPT4gdW5kZWZpbmVkLFxuICBtYWtlQ2x1c3RlcklkOiAoaWQ6IG51bWJlcikgPT4gYHtbJHtpZH1dfWAsXG59O1xuXG5pbnRlcmZhY2UgQmFzZVBvaW50IHtcbiAgeDogbnVtYmVyOyAvLyBwcm9qZWN0ZWQgcG9pbnQgY29vcmRpbmF0ZXNcbiAgeTogbnVtYmVyO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgem9vbTogbnVtYmVyOyAvLyB0aGUgbGFzdCB6b29tIHRoZSBwb2ludCB3YXMgcHJvY2Vzc2VkIGF0XG4gIHBhcmVudElkOiBudW1iZXI7IC8vIHBhcmVudCBjbHVzdGVyIGlkXG59XG5cbmludGVyZmFjZSBMZWFmUG9pbnQgZXh0ZW5kcyBCYXNlUG9pbnQge1xuICBpbmRleDogbnVtYmVyOyAvLyBpbmRleCBvZiB0aGUgc291cmNlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGFycmF5LFxufVxuXG5pbnRlcmZhY2UgQ2x1c3RlclBvaW50IGV4dGVuZHMgQmFzZVBvaW50IHtcbiAgaWQ6IG51bWJlcjtcbiAgbnVtUG9pbnRzOiBudW1iZXI7XG59XG5cbnR5cGUgUG9pbnQgPSBMZWFmUG9pbnQgfCBDbHVzdGVyUG9pbnQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlYWZQb2ludChwOiBQb2ludCk6IHAgaXMgTGVhZlBvaW50IHtcbiAgY29uc3Qge2luZGV4fSA9IHAgYXMgTGVhZlBvaW50O1xuICByZXR1cm4gaW5kZXggIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2x1c3RlclBvaW50KHA6IFBvaW50KTogcCBpcyBDbHVzdGVyUG9pbnQge1xuICBjb25zdCB7aWR9ID0gcCBhcyBDbHVzdGVyUG9pbnQ7XG4gIHJldHVybiBpZCAhPSBudWxsO1xufVxuXG50eXBlIFpvb21MZXZlbEtEQnVzaCA9IGFueTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsdXN0ZXJMb2NhdGlvbnM8TD4oXG4gIGxvY2F0aW9uczogTFtdLFxuICBsb2NhdGlvbkFjY2Vzc29yczogTG9jYXRpb25BY2Nlc3NvcnM8TD4sXG4gIGdldExvY2F0aW9uV2VpZ2h0OiBMb2NhdGlvbldlaWdodEdldHRlcixcbiAgb3B0aW9ucz86IFBhcnRpYWw8T3B0aW9ucz4sXG4pOiBDbHVzdGVyTGV2ZWxbXSB7XG4gIGNvbnN0IHtnZXRMb2NhdGlvbkxvbiwgZ2V0TG9jYXRpb25MYXQsIGdldExvY2F0aW9uSWR9ID0gbG9jYXRpb25BY2Nlc3NvcnM7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcbiAgY29uc3Qge21pblpvb20sIG1heFpvb20sIG5vZGVTaXplLCBtYWtlQ2x1c3Rlck5hbWUsIG1ha2VDbHVzdGVySWR9ID0gb3B0cztcblxuICBjb25zdCB0cmVlcyA9IG5ldyBBcnJheTxab29tTGV2ZWxLREJ1c2g+KG1heFpvb20gKyAxKTtcblxuICAvLyBnZW5lcmF0ZSBhIGNsdXN0ZXIgb2JqZWN0IGZvciBlYWNoIHBvaW50IGFuZCBpbmRleCBpbnB1dCBwb2ludHMgaW50byBhIEtELXRyZWVcbiAgbGV0IGNsdXN0ZXJzID0gbmV3IEFycmF5PFBvaW50PigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHggPSBnZXRMb2NhdGlvbkxvbihsb2NhdGlvbnNbaV0pO1xuICAgIGNvbnN0IHkgPSBnZXRMb2NhdGlvbkxhdChsb2NhdGlvbnNbaV0pO1xuICAgIGNsdXN0ZXJzLnB1c2goe1xuICAgICAgeDogbG5nWCh4KSwgLy8gcHJvamVjdGVkIHBvaW50IGNvb3JkaW5hdGVzXG4gICAgICB5OiBsYXRZKHkpLFxuICAgICAgd2VpZ2h0OiBnZXRMb2NhdGlvbldlaWdodChnZXRMb2NhdGlvbklkKGxvY2F0aW9uc1tpXSkpLFxuICAgICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIHBvaW50IHdhcyBwcm9jZXNzZWQgYXRcbiAgICAgIGluZGV4OiBpLCAvLyBpbmRleCBvZiB0aGUgc291cmNlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGFycmF5LFxuICAgICAgcGFyZW50SWQ6IC0xLCAvLyBwYXJlbnQgY2x1c3RlciBpZFxuICAgIH0pO1xuICB9XG4gIHRyZWVzW21heFpvb20gKyAxXSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuXG4gIC8vIGNsdXN0ZXIgcG9pbnRzIG9uIG1heCB6b29tLCB0aGVuIGNsdXN0ZXIgdGhlIHJlc3VsdHMgb24gcHJldmlvdXMgem9vbSwgZXRjLjtcbiAgLy8gcmVzdWx0cyBpbiBhIGNsdXN0ZXIgaGllcmFyY2h5IGFjcm9zcyB6b29tIGxldmVsc1xuICBmb3IgKGxldCB6ID0gbWF4Wm9vbTsgeiA+PSBtaW5ab29tOyB6LS0pIHtcbiAgICAvLyBjcmVhdGUgYSBuZXcgc2V0IG9mIGNsdXN0ZXJzIGZvciB0aGUgem9vbSBhbmQgaW5kZXggdGhlbSB3aXRoIGEgS0QtdHJlZVxuICAgIGNsdXN0ZXJzID0gY2x1c3RlcihjbHVzdGVycywgeiwgdHJlZXNbeiArIDFdLCBvcHRzKTtcbiAgICB0cmVlc1t6XSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgaWYgKHRyZWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBudW1iZXJzT2ZDbHVzdGVycyA9IHRyZWVzLm1hcCgoZCkgPT4gZC5wb2ludHMubGVuZ3RoKTtcbiAgY29uc3QgbWF4QXZhaWxab29tID0gbnVtYmVyc09mQ2x1c3RlcnMuaW5kZXhPZihcbiAgICBudW1iZXJzT2ZDbHVzdGVyc1tudW1iZXJzT2ZDbHVzdGVycy5sZW5ndGggLSAxXSxcbiAgKTtcbiAgY29uc3QgbWluQXZhaWxab29tID0gTWF0aC5taW4oXG4gICAgbWF4QXZhaWxab29tLFxuICAgIG51bWJlcnNPZkNsdXN0ZXJzLmxhc3RJbmRleE9mKG51bWJlcnNPZkNsdXN0ZXJzWzBdKSxcbiAgKTtcblxuICBjb25zdCBjbHVzdGVyTGV2ZWxzID0gbmV3IEFycmF5PENsdXN0ZXJMZXZlbD4oKTtcbiAgZm9yIChsZXQgem9vbSA9IG1pbkF2YWlsWm9vbTsgem9vbSA8PSBtYXhBdmFpbFpvb207IHpvb20rKykge1xuICAgIGxldCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHJlZSA9IHRyZWVzW3pvb21dO1xuICAgIGlmICh6b29tIDwgbWF4QXZhaWxab29tKSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50ID0gcm9sbHVwPFBvaW50LCBzdHJpbmdbXSwgbnVtYmVyPihcbiAgICAgICAgdHJlZXNbem9vbSArIDFdLnBvaW50cyxcbiAgICAgICAgKHBvaW50czogYW55W10pID0+XG4gICAgICAgICAgcG9pbnRzLm1hcCgocDogYW55KSA9PlxuICAgICAgICAgICAgcC5pZCA/IG1ha2VDbHVzdGVySWQocC5pZCkgOiBnZXRMb2NhdGlvbklkKGxvY2F0aW9uc1twLmluZGV4XSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKHBvaW50OiBhbnkpID0+IHBvaW50LnBhcmVudElkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlczogQ2x1c3Rlck5vZGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9pbnQgb2YgdHJlZS5wb2ludHMpIHtcbiAgICAgIGNvbnN0IHt4LCB5LCBudW1Qb2ludHN9ID0gcG9pbnQ7XG4gICAgICBpZiAoaXNMZWFmUG9pbnQocG9pbnQpKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gbG9jYXRpb25zW3BvaW50LmluZGV4XTtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgaWQ6IGdldExvY2F0aW9uSWQobG9jYXRpb24pLFxuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgbGF0OiBnZXRMb2NhdGlvbkxhdChsb2NhdGlvbiksXG4gICAgICAgICAgbG9uOiBnZXRMb2NhdGlvbkxvbihsb2NhdGlvbiksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc0NsdXN0ZXJQb2ludChwb2ludCkpIHtcbiAgICAgICAgY29uc3Qge2lkfSA9IHBvaW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQgJiYgY2hpbGRyZW5CeVBhcmVudC5nZXQoaWQpO1xuICAgICAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbHVzdGVyICR7aWR9IGRvZXNuJ3QgaGF2ZSBjaGlsZHJlbmApO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgIGlkOiBtYWtlQ2x1c3RlcklkKGlkKSxcbiAgICAgICAgICBuYW1lOiBtYWtlQ2x1c3Rlck5hbWUoaWQsIG51bVBvaW50cyksXG4gICAgICAgICAgem9vbSxcbiAgICAgICAgICBsYXQ6IHlMYXQoeSksXG4gICAgICAgICAgbG9uOiB4TG5nKHgpLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB9IGFzIENsdXN0ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjbHVzdGVyTGV2ZWxzLnB1c2goe1xuICAgICAgem9vbSxcbiAgICAgIG5vZGVzLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBjbHVzdGVyTGV2ZWxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgaWQ6IG51bWJlcixcbiAgbnVtUG9pbnRzOiBudW1iZXIsXG4gIHdlaWdodDogbnVtYmVyLFxuKTogQ2x1c3RlclBvaW50IHtcbiAgcmV0dXJuIHtcbiAgICB4LCAvLyB3ZWlnaHRlZCBjbHVzdGVyIGNlbnRlclxuICAgIHksXG4gICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIGNsdXN0ZXIgd2FzIHByb2Nlc3NlZCBhdFxuICAgIGlkLCAvLyBlbmNvZGVzIGluZGV4IG9mIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2x1c3RlciBhbmQgaXRzIHpvb20gbGV2ZWxcbiAgICBwYXJlbnRJZDogLTEsIC8vIHBhcmVudCBjbHVzdGVyIGlkXG4gICAgbnVtUG9pbnRzLFxuICAgIHdlaWdodCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2x1c3RlcihcbiAgcG9pbnRzOiBQb2ludFtdLFxuICB6b29tOiBudW1iZXIsXG4gIHRyZWU6IFpvb21MZXZlbEtEQnVzaCxcbiAgb3B0aW9uczogT3B0aW9ucyxcbikge1xuICBjb25zdCBjbHVzdGVyczogUG9pbnRbXSA9IFtdO1xuICBjb25zdCB7cmFkaXVzLCBleHRlbnR9ID0gb3B0aW9ucztcbiAgY29uc3QgciA9IHJhZGl1cyAvIChleHRlbnQgKiBNYXRoLnBvdygyLCB6b29tKSk7XG5cbiAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggcG9pbnRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgdmlzaXRlZCB0aGUgcG9pbnQgYXQgdGhpcyB6b29tIGxldmVsLCBza2lwIGl0XG4gICAgaWYgKHAuem9vbSA8PSB6b29tKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcC56b29tID0gem9vbTtcblxuICAgIC8vIGZpbmQgYWxsIG5lYXJieSBwb2ludHNcbiAgICBjb25zdCBuZWlnaGJvcklkcyA9IHRyZWUud2l0aGluKHAueCwgcC55LCByKTtcblxuICAgIGxldCB3ZWlnaHQgPSBwLndlaWdodCB8fCAxO1xuICAgIGxldCBudW1Qb2ludHMgPSBpc0NsdXN0ZXJQb2ludChwKSA/IHAubnVtUG9pbnRzIDogMTtcbiAgICBsZXQgd3ggPSBwLnggKiB3ZWlnaHQ7XG4gICAgbGV0IHd5ID0gcC55ICogd2VpZ2h0O1xuXG4gICAgLy8gZW5jb2RlIGJvdGggem9vbSBhbmQgcG9pbnQgaW5kZXggb24gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIGNvbnN0IGlkID0gKGkgPDwgNSkgKyAoem9vbSArIDEpO1xuXG4gICAgZm9yIChjb25zdCBuZWlnaGJvcklkIG9mIG5laWdoYm9ySWRzKSB7XG4gICAgICBjb25zdCBiID0gdHJlZS5wb2ludHNbbmVpZ2hib3JJZF07XG4gICAgICAvLyBmaWx0ZXIgb3V0IG5laWdoYm9ycyB0aGF0IGFyZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgaWYgKGIuem9vbSA8PSB6b29tKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYi56b29tID0gem9vbTsgLy8gc2F2ZSB0aGUgem9vbSAoc28gaXQgZG9lc24ndCBnZXQgcHJvY2Vzc2VkIHR3aWNlKVxuXG4gICAgICBjb25zdCB3ZWlnaHQyID0gYi53ZWlnaHQgfHwgMTtcbiAgICAgIGNvbnN0IG51bVBvaW50czIgPSBiLm51bVBvaW50cyB8fCAxO1xuICAgICAgd3ggKz0gYi54ICogd2VpZ2h0MjsgLy8gYWNjdW11bGF0ZSBjb29yZGluYXRlcyBmb3IgY2FsY3VsYXRpbmcgd2VpZ2h0ZWQgY2VudGVyXG4gICAgICB3eSArPSBiLnkgKiB3ZWlnaHQyO1xuXG4gICAgICB3ZWlnaHQgKz0gd2VpZ2h0MjtcbiAgICAgIG51bVBvaW50cyArPSBudW1Qb2ludHMyO1xuICAgICAgYi5wYXJlbnRJZCA9IGlkO1xuICAgIH1cblxuICAgIGlmIChudW1Qb2ludHMgPT09IDEpIHtcbiAgICAgIGNsdXN0ZXJzLnB1c2gocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAucGFyZW50SWQgPSBpZDtcbiAgICAgIGNsdXN0ZXJzLnB1c2goXG4gICAgICAgIGNyZWF0ZUNsdXN0ZXIod3ggLyB3ZWlnaHQsIHd5IC8gd2VpZ2h0LCBpZCwgbnVtUG9pbnRzLCB3ZWlnaHQpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2x1c3RlcnM7XG59XG5cbi8vIHNwaGVyaWNhbCBtZXJjYXRvciB0byBsb25naXR1ZGUvbGF0aXR1ZGVcbmZ1bmN0aW9uIHhMbmcoeDogbnVtYmVyKSB7XG4gIHJldHVybiAoeCAtIDAuNSkgKiAzNjA7XG59XG5cbmZ1bmN0aW9uIHlMYXQoeTogbnVtYmVyKSB7XG4gIGNvbnN0IHkyID0gKCgxODAgLSB5ICogMzYwKSAqIE1hdGguUEkpIC8gMTgwO1xuICByZXR1cm4gKDM2MCAqIE1hdGguYXRhbihNYXRoLmV4cCh5MikpKSAvIE1hdGguUEkgLSA5MDtcbn1cblxuLy8gbG9uZ2l0dWRlL2xhdGl0dWRlIHRvIHNwaGVyaWNhbCBtZXJjYXRvciBpbiBbMC4uMV0gcmFuZ2VcbmZ1bmN0aW9uIGxuZ1gobG5nOiBudW1iZXIpIHtcbiAgcmV0dXJuIGxuZyAvIDM2MCArIDAuNTtcbn1cblxuZnVuY3Rpb24gbGF0WShsYXQ6IG51bWJlcikge1xuICBjb25zdCBzaW4gPSBNYXRoLnNpbigobGF0ICogTWF0aC5QSSkgLyAxODApO1xuICBjb25zdCB5ID0gMC41IC0gKDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpKSAvIE1hdGguUEk7XG4gIHJldHVybiB5IDwgMCA/IDAgOiB5ID4gMSA/IDEgOiB5O1xufVxuXG5mdW5jdGlvbiBnZXRYKHA6IFBvaW50KSB7XG4gIHJldHVybiBwLng7XG59XG5cbmZ1bmN0aW9uIGdldFkocDogUG9pbnQpIHtcbiAgcmV0dXJuIHAueTtcbn1cbiJdfQ==
229
+ function countUniqueLocations(locations, locationAccessors) {
230
+ const { getLocationLon, getLocationLat } = locationAccessors;
231
+ const countByLatLon = new Map();
232
+ let uniqueCnt = 0;
233
+ for (const loc of locations) {
234
+ const lon = getLocationLon(loc);
235
+ const lat = getLocationLat(loc);
236
+ const key = `${lon},${lat}`;
237
+ const prev = countByLatLon.get(key);
238
+ if (!prev) {
239
+ uniqueCnt++;
240
+ }
241
+ countByLatLon.set(key, prev ? prev + 1 : 1);
242
+ }
243
+ return uniqueCnt;
244
+ }
245
+ function findIndexOfMax(arr) {
246
+ let max = -Infinity;
247
+ let maxIndex = undefined;
248
+ for (let i = 0; i < arr.length; i++) {
249
+ const value = arr[i];
250
+ if (typeof value === 'number') {
251
+ if (value > max) {
252
+ max = value;
253
+ maxIndex = i;
254
+ }
255
+ }
256
+ }
257
+ return maxIndex;
258
+ }
259
+ function findLastIndex(arr, predicate) {
260
+ for (let i = arr.length - 1; i >= 0; i--) {
261
+ if (predicate(arr[i], i, arr)) {
262
+ return i;
263
+ }
264
+ }
265
+ return -1;
266
+ }
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbHVzdGVyL2NsdXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUUsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3JDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQWtDNUIsTUFBTSxjQUFjLEdBQVk7SUFDOUIsT0FBTyxFQUFFLENBQUM7SUFDVixPQUFPLEVBQUUsRUFBRTtJQUNYLE1BQU0sRUFBRSxFQUFFO0lBQ1YsTUFBTSxFQUFFLEdBQUc7SUFDWCxRQUFRLEVBQUUsRUFBRTtJQUNaLGVBQWUsRUFBRSxDQUFDLEVBQVUsRUFBRSxTQUFpQixFQUFFLEVBQUUsQ0FBQyxTQUFTO0lBQzdELGFBQWEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUk7Q0FDM0MsQ0FBQztBQXNCRixNQUFNLFVBQVUsV0FBVyxDQUFJLENBQVc7SUFDeEMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLENBQWlCLENBQUM7SUFDbEMsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFJLENBQVc7SUFDM0MsTUFBTSxFQUFDLEVBQUUsRUFBQyxHQUFHLENBQWlCLENBQUM7SUFDL0IsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDO0FBQ3BCLENBQUM7QUFJRCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLFNBQXNCLEVBQ3RCLGlCQUF1QyxFQUN2QyxpQkFBdUMsRUFDdkMsT0FBMEI7SUFFMUIsTUFBTSxFQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFDLEdBQUcsaUJBQWlCLENBQUM7SUFDMUUsTUFBTSxJQUFJLEdBQUc7UUFDWCxHQUFHLGNBQWM7UUFDakIsR0FBRyxPQUFPO0tBQ1gsQ0FBQztJQUNGLE1BQU0sRUFBQyxPQUFP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LENBQUM7YUFDZDtTQUNGO0tBQ0Y7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLEdBQVEsRUFDUixTQUEyRDtJQUUzRCxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsQ0FBQztTQUNWO0tBQ0Y7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIEZsb3dtYXAuZ2wgY29udHJpYnV0b3JzXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBUZXJhbHl0aWNzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7bWluLCByb2xsdXB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCBLREJ1c2ggZnJvbSAna2RidXNoJztcbmltcG9ydCB7TG9jYXRpb25XZWlnaHRHZXR0ZXJ9IGZyb20gJy4vQ2x1c3RlckluZGV4JztcbmltcG9ydCB7Q2x1c3RlciwgQ2x1c3RlckxldmVsLCBDbHVzdGVyTm9kZSwgTG9jYXRpb25BY2Nlc3NvcnN9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgYSBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3N1cGVyY2x1c3RlclxuICpcbiAqICBJU0MgTGljZW5zZVxuICpcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTYsIE1hcGJveFxuICpcbiAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZVxuICogIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VcbiAqICBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy5cbiAqXG4gKiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuICogIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkRcbiAqICBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbiAqICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TU1xuICogIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUlxuICogIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0ZcbiAqICBUSElTIFNPRlRXQVJFLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gIG1pblpvb206IG51bWJlcjsgLy8gbWluIHpvb20gdG8gZ2VuZXJhdGUgY2x1c3RlcnMgb25cbiAgbWF4Wm9vbTogbnVtYmVyOyAvLyBtYXggem9vbSBsZXZlbCB0byBjbHVzdGVyIHRoZSBwb2ludHMgb25cbiAgcmFkaXVzOiBudW1iZXI7IC8vIGNsdXN0ZXIgcmFkaXVzIGluIHBpeGVsc1xuICBleHRlbnQ6IG51bWJlcjsgLy8gdGlsZSBleHRlbnQgKHJhZGl1cyBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGl0KVxuICBub2RlU2l6ZTogbnVtYmVyOyAvLyBzaXplIG9mIHRoZSBLRC10cmVlIGxlYWYgbm9kZSwgYWZmZWN0cyBwZXJmb3JtYW5jZVxuICBtYWtlQ2x1c3Rlck5hbWU6IChpZDogbnVtYmVyLCBudW1Qb2ludHM6IG51bWJlcikgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBtYWtlQ2x1c3RlcklkOiAoaWQ6IG51bWJlcikgPT4gc3RyaW5nO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgbWluWm9vbTogMCxcbiAgbWF4Wm9vbTogMTYsXG4gIHJhZGl1czogNDAsXG4gIGV4dGVudDogNTEyLFxuICBub2RlU2l6ZTogNjQsXG4gIG1ha2VDbHVzdGVyTmFtZTogKGlkOiBudW1iZXIsIG51bVBvaW50czogbnVtYmVyKSA9PiB1bmRlZmluZWQsXG4gIG1ha2VDbHVzdGVySWQ6IChpZDogbnVtYmVyKSA9PiBge1ske2lkfV19YCxcbn07XG5cbmludGVyZmFjZSBCYXNlUG9pbnQge1xuICB4OiBudW1iZXI7IC8vIHByb2plY3RlZCBwb2ludCBjb29yZGluYXRlc1xuICB5OiBudW1iZXI7XG4gIHdlaWdodDogbnVtYmVyO1xuICB6b29tOiBudW1iZXI7IC8vIHRoZSBsYXN0IHpvb20gdGhlIHBvaW50IHdhcyBwcm9jZXNzZWQgYXRcbiAgcGFyZW50SWQ6IG51bWJlcjsgLy8gcGFyZW50IGNsdXN0ZXIgaWRcbn1cblxuaW50ZXJmYWNlIExlYWZQb2ludDxMPiBleHRlbmRzIEJhc2VQb2ludCB7XG4gIGluZGV4OiBudW1iZXI7IC8vIGluZGV4IG9mIHRoZSBzb3VyY2UgZmVhdHVyZSBpbiB0aGUgb3JpZ2luYWwgaW5wdXQgYXJyYXksXG4gIGxvY2F0aW9uOiBMO1xufVxuXG5pbnRlcmZhY2UgQ2x1c3RlclBvaW50IGV4dGVuZHMgQmFzZVBvaW50IHtcbiAgaWQ6IG51bWJlcjtcbiAgbnVtUG9pbnRzOiBudW1iZXI7XG59XG5cbnR5cGUgUG9pbnQ8TD4gPSBMZWFmUG9pbnQ8TD4gfCBDbHVzdGVyUG9pbnQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlYWZQb2ludDxMPihwOiBQb2ludDxMPik6IHAgaXMgTGVhZlBvaW50PEw+IHtcbiAgY29uc3Qge2luZGV4fSA9IHAgYXMgTGVhZlBvaW50PEw+O1xuICByZXR1cm4gaW5kZXggIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2x1c3RlclBvaW50PEw+KHA6IFBvaW50PEw+KTogcCBpcyBDbHVzdGVyUG9pbnQge1xuICBjb25zdCB7aWR9ID0gcCBhcyBDbHVzdGVyUG9pbnQ7XG4gIHJldHVybiBpZCAhPSBudWxsO1xufVxuXG50eXBlIFpvb21MZXZlbEtEQnVzaCA9IGFueTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsdXN0ZXJMb2NhdGlvbnM8TD4oXG4gIGxvY2F0aW9uczogSXRlcmFibGU8TD4sXG4gIGxvY2F0aW9uQWNjZXNzb3JzOiBMb2NhdGlvbkFjY2Vzc29yczxMPixcbiAgZ2V0TG9jYXRpb25XZWlnaHQ6IExvY2F0aW9uV2VpZ2h0R2V0dGVyLFxuICBvcHRpb25zPzogUGFydGlhbDxPcHRpb25zPixcbik6IENsdXN0ZXJMZXZlbFtdIHtcbiAgY29uc3Qge2dldExvY2F0aW9uTG9uLCBnZXRMb2NhdGlvbkxhdCwgZ2V0TG9jYXRpb25JZH0gPSBsb2NhdGlvbkFjY2Vzc29ycztcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAuLi5vcHRpb25zLFxuICB9O1xuICBjb25zdCB7bWluWm9vbSwgbWF4Wm9vbSwgbm9kZVNpemUsIG1ha2VDbHVzdGVyTmFtZSwgbWFrZUNsdXN0ZXJJZH0gPSBvcHRzO1xuXG4gIGNvbnN0IHRyZWVzID0gbmV3IEFycmF5PFpvb21MZXZlbEtEQnVzaD4obWF4Wm9vbSArIDEpO1xuXG4gIC8vIGdlbmVyYXRlIGEgY2x1c3RlciBvYmplY3QgZm9yIGVhY2ggcG9pbnQgYW5kIGluZGV4IGlucHV0IHBvaW50cyBpbnRvIGEgS0QtdHJlZVxuICBsZXQgY2x1c3RlcnMgPSBuZXcgQXJyYXk8UG9pbnQ8TD4+KCk7XG4gIGxldCBsb2NhdGlvbnNDb3VudCA9IDA7XG4gIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgY29uc3QgeCA9IGdldExvY2F0aW9uTG9uKGxvY2F0aW9uKTtcbiAgICBjb25zdCB5ID0gZ2V0TG9jYXRpb25MYXQobG9jYXRpb24pO1xuICAgIGNsdXN0ZXJzLnB1c2goe1xuICAgICAgeDogbG5nWCh4KSwgLy8gcHJvamVjdGVkIHBvaW50IGNvb3JkaW5hdGVzXG4gICAgICB5OiBsYXRZKHkpLFxuICAgICAgd2VpZ2h0OiBnZXRMb2NhdGlvbldlaWdodChnZXRMb2NhdGlvbklkKGxvY2F0aW9uKSksXG4gICAgICB6b29tOiBJbmZpbml0eSwgLy8gdGhlIGxhc3Qgem9vbSB0aGUgcG9pbnQgd2FzIHByb2Nlc3NlZCBhdFxuICAgICAgaW5kZXg6IGxvY2F0aW9uc0NvdW50LCAvLyBpbmRleCBvZiB0aGUgc291cmNlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGFycmF5LFxuICAgICAgcGFyZW50SWQ6IC0xLCAvLyBwYXJlbnQgY2x1c3RlciBpZFxuICAgICAgbG9jYXRpb24sXG4gICAgfSk7XG4gICAgbG9jYXRpb25zQ291bnQrKztcbiAgfVxuXG4gIGNvbnN0IG1ha2VCdXNoID0gKHBvaW50czogUG9pbnQ8TD5bXSkgPT4ge1xuICAgIGNvbnN0IGJ1c2ggPSBuZXcgS0RCdXNoKHBvaW50cy5sZW5ndGgsIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBidXNoLmFkZChwb2ludHNbaV0ueCwgcG9pbnRzW2ldLnkpO1xuICAgIH1cbiAgICBidXNoLmZpbmlzaCgpO1xuICAgIGJ1c2gucG9pbnRzID0gcG9pbnRzO1xuICAgIHJldHVybiBidXNoO1xuICB9O1xuXG4gIC8vIGNsdXN0ZXIgcG9pbnRzIG9uIG1heCB6b29tLCB0aGVuIGNsdXN0ZXIgdGhlIHJlc3VsdHMgb24gcHJldmlvdXMgem9vbSwgZXRjLjtcbiAgLy8gcmVzdWx0cyBpbiBhIGNsdXN0ZXIgaGllcmFyY2h5IGFjcm9zcyB6b29tIGxldmVsc1xuICB0cmVlc1ttYXhab29tICsgMV0gPSBtYWtlQnVzaChjbHVzdGVycyk7XG4gIGxldCBwcmV2Wm9vbSA9IG1heFpvb20gKyAxO1xuXG4gIGZvciAobGV0IHogPSBtYXhab29tOyB6ID49IG1pblpvb207IHotLSkge1xuICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXQgb2YgY2x1c3RlcnMgZm9yIHRoZSB6b29tIGFuZCBpbmRleCB0aGVtIHdpdGggYSBLRC10cmVlXG4gICAgY29uc3QgX2NsdXN0ZXJzID0gY2x1c3RlcihjbHVzdGVycywgeiwgdHJlZXNbcHJldlpvb21dLCBvcHRzKTtcbiAgICBpZiAoX2NsdXN0ZXJzLmxlbmd0aCA9PT0gY2x1c3RlcnMubGVuZ3RoKSB7XG4gICAgICAvLyBzYW1lIG51bWJlciBvZiBjbHVzdGVycyA9PiBtb3ZlIHRoZSBoaWdoZXIgbGV2ZWwgY2x1c3RlcnMgdXBcbiAgICAgIC8vIG5vIG5lZWQgdG8ga2VlcCB0aGUgc2FtZSBkYXRhIG9uIG11bHRpcGxlIGxldmVsc1xuICAgICAgdHJlZXNbel0gPSB0cmVlc1twcmV2Wm9vbV07XG4gICAgICB0cmVlc1twcmV2Wm9vbV0gPSB1bmRlZmluZWQ7XG4gICAgICBwcmV2Wm9vbSA9IHo7XG4gICAgICBjbHVzdGVycyA9IF9jbHVzdGVycztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldlpvb20gPSB6O1xuICAgICAgY2x1c3RlcnMgPSBfY2x1c3RlcnM7XG4gICAgICB0cmVlc1t6XSA9IG1ha2VCdXNoKGNsdXN0ZXJzKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHJlZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbnVtYmVyc09mQ2x1c3RlcnM6IG51bWJlcltdID0gdHJlZXMubWFwKChkKSA9PiBkPy5wb2ludHMubGVuZ3RoKTtcbiAgY29uc3QgbWluQ2x1c3RlcnMgPSBtaW4obnVtYmVyc09mQ2x1c3RlcnMuZmlsdGVyKChkKSA9PiBkID4gMCkpO1xuXG4gIGxldCBtYXhBdmFpbFpvb20gPVxuICAgIGZpbmRJbmRleE9mTWF4KG51bWJlcnNPZkNsdXN0ZXJzKSA/PyBudW1iZXJzT2ZDbHVzdGVycy5sZW5ndGggLSAxO1xuXG4gIGNvbnN0IG51bVVuaXF1ZUxvY2F0aW9ucyA9IGNvdW50VW5pcXVlTG9jYXRpb25zKGxvY2F0aW9ucywgbG9jYXRpb25BY2Nlc3NvcnMpO1xuICBpZiAobnVtVW5pcXVlTG9jYXRpb25zIDwgbG9jYXRpb25zQ291bnQpIHtcbiAgICAvLyBEdXBsaWNhdGUgbG9jYXRpb25zIHdvdWxkIGJlIGNsdXN0ZXJlZCB0b2dldGhlciBhdCBhbnkgem9vbSBsZXZlbCB3aGljaCBjYW4gbGVhZCB0byBoYXZpbmcgdG9vIG1hbnkgem9vbXMuXG4gICAgLy8gVG8gYXZvaWQgdGhhdCwgd2UgbmVlZCB0byBmaW5kIHRoZSBtYXggem9vbSBsZXZlbCB0aGF0IGhhcyBsZXNzIG9yIGVxdWFsIGNsdXN0ZXJzIHRoYW4gdW5pcXVlIGxvY2F0aW9uc1xuICAgIC8vIGFuZCBkcm9wIGFsbCB6b29tIGxldmVscyBiZXlvbmQgdGhhdCAoZXhjZXB0IHRoZSB1bmNsdXN0ZXJlZCBsZXZlbCkuXG4gICAgY29uc3QgbWF4Q2x1c3RlcnNab29tID0gZmluZExhc3RJbmRleChcbiAgICAgIG51bWJlcnNPZkNsdXN0ZXJzLFxuICAgICAgKGQpID0+IGQgPD0gbnVtVW5pcXVlTG9jYXRpb25zLFxuICAgICk7XG4gICAgaWYgKG1heENsdXN0ZXJzWm9vbSA+PSAwKSB7XG4gICAgICAvLyBOb3csIG1vdmUgdGhlIHVuY2x1c3RlcmVkIHBvaW50cyB0byB0aGUgbmV4dCB6b29tIGxldmVsIHRvIGF2b2lkIGhhdmluZyBhIGdhcFxuICAgICAgaWYgKG1heENsdXN0ZXJzWm9vbSA8IG1heEF2YWlsWm9vbSkge1xuICAgICAgICB0cmVlc1ttYXhDbHVzdGVyc1pvb20gKyAxXSA9IHRyZWVzW21heEF2YWlsWm9vbV07XG4gICAgICAgIHRyZWVzLnNwbGljZShtYXhDbHVzdGVyc1pvb20gKyAyKTsgLy8gUmVtb3ZlIGFsbCB6b29tIGxldmVscyBiZXlvbmQgbWF4Q2x1c3RlcnNab29tXG4gICAgICB9XG4gICAgICBtYXhBdmFpbFpvb20gPSBtYXhDbHVzdGVyc1pvb20gKyAxO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1pbkF2YWlsWm9vbSA9IE1hdGgubWluKFxuICAgIG1heEF2YWlsWm9vbSxcbiAgICBtaW5DbHVzdGVycyA/IG51bWJlcnNPZkNsdXN0ZXJzLmxhc3RJbmRleE9mKG1pbkNsdXN0ZXJzKSA6IG1heEF2YWlsWm9vbSxcbiAgKTtcblxuICBjb25zdCBjbHVzdGVyTGV2ZWxzID0gbmV3IEFycmF5PENsdXN0ZXJMZXZlbD4oKTtcbiAgcHJldlpvb20gPSBOYU47XG4gIGZvciAobGV0IHpvb20gPSBtYXhBdmFpbFpvb207IHpvb20gPj0gbWluQXZhaWxab29tOyB6b29tLS0pIHtcbiAgICBsZXQgY2hpbGRyZW5CeVBhcmVudDogTWFwPG51bWJlciwgKHN0cmluZyB8IG51bWJlcilbXT4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHJlZSA9IHRyZWVzW3pvb21dO1xuICAgIGlmICghdHJlZSkgY29udGludWU7XG4gICAgaWYgKHRyZWVzW3ByZXZab29tXSAmJiB6b29tIDwgbWF4QXZhaWxab29tKSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50ID0gcm9sbHVwKFxuICAgICAgICB0cmVlc1twcmV2Wm9vbV0ucG9pbnRzLFxuICAgICAgICAocG9pbnRzOiBhbnlbXSkgPT5cbiAgICAgICAgICBwb2ludHMubWFwKChwOiBhbnkpID0+XG4gICAgICAgICAgICBwLmlkID8gbWFrZUNsdXN0ZXJJZChwLmlkKSA6IGdldExvY2F0aW9uSWQocC5sb2NhdGlvbiksXG4gICAgICAgICAgKSxcbiAgICAgICAgKHBvaW50OiBhbnkpID0+IHBvaW50LnBhcmVudElkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlczogQ2x1c3Rlck5vZGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9pbnQgb2YgdHJlZS5wb2ludHMpIHtcbiAgICAgIGNvbnN0IHt4LCB5LCBudW1Qb2ludHMsIGxvY2F0aW9ufSA9IHBvaW50O1xuICAgICAgaWYgKGlzTGVhZlBvaW50KHBvaW50KSkge1xuICAgICAgICBub2Rlcy5wdXNoKHtcbiAgICAgICAgICBpZDogZ2V0TG9jYXRpb25JZChsb2NhdGlvbiksXG4gICAgICAgICAgem9vbSxcbiAgICAgICAgICBsYXQ6IGdldExvY2F0aW9uTGF0KGxvY2F0aW9uKSxcbiAgICAgICAgICBsb246IGdldExvY2F0aW9uTG9uKGxvY2F0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzQ2x1c3RlclBvaW50KHBvaW50KSkge1xuICAgICAgICBjb25zdCB7aWR9ID0gcG9pbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudCAmJiBjaGlsZHJlbkJ5UGFyZW50LmdldChpZCk7XG4gICAgICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgICAgICAvLyBNaWdodCBoYXBwZW4gaWYgdGhlcmUgYXJlIG11bHRpcGxlIGxvY2F0aW9ucyB3aXRoIHNhbWUgY29vcmRpbmF0ZXNcbiAgICAgICAgICBjb25zb2xlLndhcm4oYE9taXR0aW5nIGNsdXN0ZXIgd2l0aCBubyBjaGlsZHJlbiwgcG9pbnQ6YCwgcG9pbnQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsdXN0ZXIgPSB7XG4gICAgICAgICAgaWQ6IG1ha2VDbHVzdGVySWQoaWQpLFxuICAgICAgICAgIG5hbWU6IG1ha2VDbHVzdGVyTmFtZShpZCwgbnVtUG9pbnRzKSxcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIGxhdDogeUxhdCh5KSxcbiAgICAgICAgICBsb246IHhMbmcoeCksXG4gICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuID8/IFtdLFxuICAgICAgICB9IGFzIENsdXN0ZXI7XG4gICAgICAgIG5vZGVzLnB1c2goY2x1c3Rlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGNsdXN0ZXJMZXZlbHMucHVzaCh7XG4gICAgICB6b29tLFxuICAgICAgbm9kZXMsXG4gICAgfSk7XG4gICAgcHJldlpvb20gPSB6b29tO1xuICB9XG4gIHJldHVybiBjbHVzdGVyTGV2ZWxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgaWQ6IG51bWJlcixcbiAgbnVtUG9pbnRzOiBudW1iZXIsXG4gIHdlaWdodDogbnVtYmVyLFxuKTogQ2x1c3RlclBvaW50IHtcbiAgcmV0dXJuIHtcbiAgICB4LCAvLyB3ZWlnaHRlZCBjbHVzdGVyIGNlbnRlclxuICAgIHksXG4gICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIGNsdXN0ZXIgd2FzIHByb2Nlc3NlZCBhdFxuICAgIGlkLCAvLyBlbmNvZGVzIGluZGV4IG9mIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2x1c3RlciBhbmQgaXRzIHpvb20gbGV2ZWxcbiAgICBwYXJlbnRJZDogLTEsIC8vIHBhcmVudCBjbHVzdGVyIGlkXG4gICAgbnVtUG9pbnRzLFxuICAgIHdlaWdodCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2x1c3RlcjxMPihcbiAgcG9pbnRzOiBQb2ludDxMPltdLFxuICB6b29tOiBudW1iZXIsXG4gIHRyZWU6IFpvb21MZXZlbEtEQnVzaCxcbiAgb3B0aW9uczogT3B0aW9ucyxcbikge1xuICBjb25zdCBjbHVzdGVyczogUG9pbnQ8TD5bXSA9IFtdO1xuICBjb25zdCB7cmFkaXVzLCBleHRlbnR9ID0gb3B0aW9ucztcbiAgY29uc3QgciA9IHJhZGl1cyAvIChleHRlbnQgKiBNYXRoLnBvdygyLCB6b29tKSk7XG5cbiAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggcG9pbnRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgdmlzaXRlZCB0aGUgcG9pbnQgYXQgdGhpcyB6b29tIGxldmVsLCBza2lwIGl0XG4gICAgaWYgKHAuem9vbSA8PSB6b29tKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcC56b29tID0gem9vbTtcblxuICAgIC8vIGZpbmQgYWxsIG5lYXJieSBwb2ludHNcbiAgICBjb25zdCBuZWlnaGJvcklkcyA9IHRyZWUud2l0aGluKHAueCwgcC55LCByKTtcblxuICAgIGxldCB3ZWlnaHQgPSBwLndlaWdodCB8fCAxO1xuICAgIGxldCBudW1Qb2ludHMgPSBpc0NsdXN0ZXJQb2ludChwKSA/IHAubnVtUG9pbnRzIDogMTtcbiAgICBsZXQgd3ggPSBwLnggKiB3ZWlnaHQ7XG4gICAgbGV0IHd5ID0gcC55ICogd2VpZ2h0O1xuXG4gICAgLy8gZW5jb2RlIGJvdGggem9vbSBhbmQgcG9pbnQgaW5kZXggb24gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIGNvbnN0IGlkID0gKGkgPDwgNSkgKyAoem9vbSArIDEpO1xuXG4gICAgZm9yIChjb25zdCBuZWlnaGJvcklkIG9mIG5laWdoYm9ySWRzKSB7XG4gICAgICBjb25zdCBiID0gdHJlZS5wb2ludHNbbmVpZ2hib3JJZF07XG4gICAgICAvLyBmaWx0ZXIgb3V0IG5laWdoYm9ycyB0aGF0IGFyZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgaWYgKGIuem9vbSA8PSB6b29tKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYi56b29tID0gem9vbTsgLy8gc2F2ZSB0aGUgem9vbSAoc28gaXQgZG9lc24ndCBnZXQgcHJvY2Vzc2VkIHR3aWNlKVxuXG4gICAgICBjb25zdCB3ZWlnaHQyID0gYi53ZWlnaHQgfHwgMTtcbiAgICAgIGNvbnN0IG51bVBvaW50czIgPSBiLm51bVBvaW50cyB8fCAxO1xuICAgICAgd3ggKz0gYi54ICogd2VpZ2h0MjsgLy8gYWNjdW11bGF0ZSBjb29yZGluYXRlcyBmb3IgY2FsY3VsYXRpbmcgd2VpZ2h0ZWQgY2VudGVyXG4gICAgICB3eSArPSBiLnkgKiB3ZWlnaHQyO1xuXG4gICAgICB3ZWlnaHQgKz0gd2VpZ2h0MjtcbiAgICAgIG51bVBvaW50cyArPSBudW1Qb2ludHMyO1xuICAgICAgYi5wYXJlbnRJZCA9IGlkO1xuICAgIH1cblxuICAgIGlmIChudW1Qb2ludHMgPT09IDEpIHtcbiAgICAgIGNsdXN0ZXJzLnB1c2gocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAucGFyZW50SWQgPSBpZDtcbiAgICAgIGNsdXN0ZXJzLnB1c2goXG4gICAgICAgIGNyZWF0ZUNsdXN0ZXIod3ggLyB3ZWlnaHQsIHd5IC8gd2VpZ2h0LCBpZCwgbnVtUG9pbnRzLCB3ZWlnaHQpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2x1c3RlcnM7XG59XG5cbi8vIHNwaGVyaWNhbCBtZXJjYXRvciB0byBsb25naXR1ZGUvbGF0aXR1ZGVcbmZ1bmN0aW9uIHhMbmcoeDogbnVtYmVyKSB7XG4gIHJldHVybiAoeCAtIDAuNSkgKiAzNjA7XG59XG5cbmZ1bmN0aW9uIHlMYXQoeTogbnVtYmVyKSB7XG4gIGNvbnN0IHkyID0gKCgxODAgLSB5ICogMzYwKSAqIE1hdGguUEkpIC8gMTgwO1xuICByZXR1cm4gKDM2MCAqIE1hdGguYXRhbihNYXRoLmV4cCh5MikpKSAvIE1hdGguUEkgLSA5MDtcbn1cblxuLy8gbG9uZ2l0dWRlL2xhdGl0dWRlIHRvIHNwaGVyaWNhbCBtZXJjYXRvciBpbiBbMC4uMV0gcmFuZ2VcbmZ1bmN0aW9uIGxuZ1gobG5nOiBudW1iZXIpIHtcbiAgcmV0dXJuIGxuZyAvIDM2MCArIDAuNTtcbn1cblxuZnVuY3Rpb24gbGF0WShsYXQ6IG51bWJlcikge1xuICBjb25zdCBzaW4gPSBNYXRoLnNpbigobGF0ICogTWF0aC5QSSkgLyAxODApO1xuICBjb25zdCB5ID0gMC41IC0gKDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpKSAvIE1hdGguUEk7XG4gIHJldHVybiB5IDwgMCA/IDAgOiB5ID4gMSA/IDEgOiB5O1xufVxuXG5mdW5jdGlvbiBnZXRYPEw+KHA6IFBvaW50PEw+KSB7XG4gIHJldHVybiBwLng7XG59XG5cbmZ1bmN0aW9uIGdldFk8TD4ocDogUG9pbnQ8TD4pIHtcbiAgcmV0dXJuIHAueTtcbn1cblxuZnVuY3Rpb24gY291bnRVbmlxdWVMb2NhdGlvbnM8TD4oXG4gIGxvY2F0aW9uczogSXRlcmFibGU8TD4sXG4gIGxvY2F0aW9uQWNjZXNzb3JzOiBMb2NhdGlvbkFjY2Vzc29yczxMPixcbikge1xuICBjb25zdCB7Z2V0TG9jYXRpb25Mb24sIGdldExvY2F0aW9uTGF0fSA9IGxvY2F0aW9uQWNjZXNzb3JzO1xuICBjb25zdCBjb3VudEJ5TGF0TG9uID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgbGV0IHVuaXF1ZUNudCA9IDA7XG4gIGZvciAoY29uc3QgbG9jIG9mIGxvY2F0aW9ucykge1xuICAgIGNvbnN0IGxvbiA9IGdldExvY2F0aW9uTG9uKGxvYyk7XG4gICAgY29uc3QgbGF0ID0gZ2V0TG9jYXRpb25MYXQobG9jKTtcbiAgICBjb25zdCBrZXkgPSBgJHtsb259LCR7bGF0fWA7XG4gICAgY29uc3QgcHJldiA9IGNvdW50QnlMYXRMb24uZ2V0KGtleSk7XG4gICAgaWYgKCFwcmV2KSB7XG4gICAgICB1bmlxdWVDbnQrKztcbiAgICB9XG4gICAgY291bnRCeUxhdExvbi5zZXQoa2V5LCBwcmV2ID8gcHJldiArIDEgOiAxKTtcbiAgfVxuICByZXR1cm4gdW5pcXVlQ250O1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXhPZk1heChhcnI6IChudW1iZXIgfCB1bmRlZmluZWQpW10pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBsZXQgbWF4SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlID0gYXJyW2ldO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA+IG1heCkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgbWF4SW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXhJbmRleDtcbn1cblxuZnVuY3Rpb24gZmluZExhc3RJbmRleDxUPihcbiAgYXJyOiBUW10sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBib29sZWFuLFxuKTogbnVtYmVyIHtcbiAgZm9yIChsZXQgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyW2ldLCBpLCBhcnIpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIl19