@angular/google-maps 13.0.0-next.7 → 13.0.0-rc.2

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 (81) hide show
  1. package/esm2020/google-map/google-map.mjs +445 -0
  2. package/esm2020/google-maps-module.mjs +86 -0
  3. package/esm2020/google-maps_public_index.mjs +5 -0
  4. package/esm2020/index.mjs +9 -0
  5. package/{esm2015/map-anchor-point.js → esm2020/map-anchor-point.mjs} +2 -2
  6. package/esm2020/map-base-layer.mjs +51 -0
  7. package/esm2020/map-bicycling-layer/map-bicycling-layer.mjs +48 -0
  8. package/esm2020/map-circle/map-circle.mjs +268 -0
  9. package/esm2020/map-directions-renderer/map-directions-renderer.mjs +138 -0
  10. package/esm2020/map-directions-renderer/map-directions-service.mjs +51 -0
  11. package/esm2020/map-event-manager.mjs +67 -0
  12. package/esm2020/map-geocoder/map-geocoder.mjs +47 -0
  13. package/esm2020/map-ground-overlay/map-ground-overlay.mjs +177 -0
  14. package/esm2020/map-heatmap-layer/map-heatmap-layer.mjs +135 -0
  15. package/esm2020/map-info-window/map-info-window.mjs +203 -0
  16. package/esm2020/map-kml-layer/map-kml-layer.mjs +170 -0
  17. package/esm2020/map-marker/map-marker.mjs +427 -0
  18. package/esm2020/map-marker-clusterer/map-marker-clusterer.mjs +407 -0
  19. package/esm2020/map-marker-clusterer/marker-clusterer-types.mjs +9 -0
  20. package/esm2020/map-polygon/map-polygon.mjs +216 -0
  21. package/esm2020/map-polyline/map-polyline.mjs +207 -0
  22. package/esm2020/map-rectangle/map-rectangle.mjs +229 -0
  23. package/esm2020/map-traffic-layer/map-traffic-layer.mjs +93 -0
  24. package/esm2020/map-transit-layer/map-transit-layer.mjs +48 -0
  25. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  26. package/fesm2015/{google-maps.js → google-maps.mjs} +590 -518
  27. package/fesm2015/google-maps.mjs.map +1 -0
  28. package/fesm2020/google-maps.mjs +3257 -0
  29. package/fesm2020/google-maps.mjs.map +1 -0
  30. package/google-map/google-map.d.ts +10 -7
  31. package/google-maps-module.d.ts +20 -7
  32. package/google-maps_public_index.d.ts +4 -0
  33. package/index.d.ts +5 -1
  34. package/map-anchor-point.d.ts +1 -1
  35. package/map-base-layer.d.ts +3 -0
  36. package/map-bicycling-layer/map-bicycling-layer.d.ts +4 -8
  37. package/map-circle/map-circle.d.ts +6 -3
  38. package/map-directions-renderer/map-directions-renderer.d.ts +6 -3
  39. package/map-directions-renderer/map-directions-service.d.ts +4 -1
  40. package/map-event-manager.d.ts +1 -1
  41. package/map-geocoder/map-geocoder.d.ts +4 -1
  42. package/map-ground-overlay/map-ground-overlay.d.ts +5 -2
  43. package/map-heatmap-layer/map-heatmap-layer.d.ts +4 -1
  44. package/map-info-window/map-info-window.d.ts +5 -2
  45. package/map-kml-layer/map-kml-layer.d.ts +6 -3
  46. package/map-marker/map-marker.d.ts +4 -1
  47. package/map-marker-clusterer/map-marker-clusterer.d.ts +5 -2
  48. package/map-marker-clusterer/marker-clusterer-types.d.ts +1 -1
  49. package/map-polygon/map-polygon.d.ts +4 -1
  50. package/map-polyline/map-polyline.d.ts +4 -1
  51. package/map-rectangle/map-rectangle.d.ts +5 -2
  52. package/map-traffic-layer/map-traffic-layer.d.ts +4 -1
  53. package/map-transit-layer/map-transit-layer.d.ts +4 -8
  54. package/package.json +23 -9
  55. package/bundles/google-maps.umd.js +0 -3757
  56. package/bundles/google-maps.umd.js.map +0 -1
  57. package/esm2015/google-map/google-map.js +0 -418
  58. package/esm2015/google-maps-module.js +0 -51
  59. package/esm2015/google-maps.externs.js +0 -6
  60. package/esm2015/index.js +0 -5
  61. package/esm2015/map-base-layer.js +0 -49
  62. package/esm2015/map-bicycling-layer/map-bicycling-layer.js +0 -43
  63. package/esm2015/map-circle/map-circle.js +0 -247
  64. package/esm2015/map-directions-renderer/map-directions-renderer.js +0 -131
  65. package/esm2015/map-directions-renderer/map-directions-service.js +0 -52
  66. package/esm2015/map-event-manager.js +0 -67
  67. package/esm2015/map-geocoder/map-geocoder.js +0 -47
  68. package/esm2015/map-ground-overlay/map-ground-overlay.js +0 -171
  69. package/esm2015/map-heatmap-layer/map-heatmap-layer.js +0 -130
  70. package/esm2015/map-info-window/map-info-window.js +0 -193
  71. package/esm2015/map-kml-layer/map-kml-layer.js +0 -160
  72. package/esm2015/map-marker/map-marker.js +0 -391
  73. package/esm2015/map-marker-clusterer/map-marker-clusterer.js +0 -360
  74. package/esm2015/map-marker-clusterer/marker-clusterer-types.js +0 -9
  75. package/esm2015/map-polygon/map-polygon.js +0 -198
  76. package/esm2015/map-polyline/map-polyline.js +0 -189
  77. package/esm2015/map-rectangle/map-rectangle.js +0 -210
  78. package/esm2015/map-traffic-layer/map-traffic-layer.js +0 -88
  79. package/esm2015/map-transit-layer/map-transit-layer.js +0 -43
  80. package/fesm2015/google-maps.js.map +0 -1
  81. package/index.metadata.json +0 -1
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { BehaviorSubject, Observable } from 'rxjs';
9
+ import { switchMap } from 'rxjs/operators';
10
+ /** Manages event on a Google Maps object, ensuring that events are added only when necessary. */
11
+ export class MapEventManager {
12
+ constructor(_ngZone) {
13
+ this._ngZone = _ngZone;
14
+ /** Pending listeners that were added before the target was set. */
15
+ this._pending = [];
16
+ this._listeners = [];
17
+ this._targetStream = new BehaviorSubject(undefined);
18
+ }
19
+ /** Clears all currently-registered event listeners. */
20
+ _clearListeners() {
21
+ for (const listener of this._listeners) {
22
+ listener.remove();
23
+ }
24
+ this._listeners = [];
25
+ }
26
+ /** Gets an observable that adds an event listener to the map when a consumer subscribes to it. */
27
+ getLazyEmitter(name) {
28
+ return this._targetStream.pipe(switchMap(target => {
29
+ const observable = new Observable(observer => {
30
+ // If the target hasn't been initialized yet, cache the observer so it can be added later.
31
+ if (!target) {
32
+ this._pending.push({ observable, observer });
33
+ return undefined;
34
+ }
35
+ const listener = target.addListener(name, (event) => {
36
+ this._ngZone.run(() => observer.next(event));
37
+ });
38
+ this._listeners.push(listener);
39
+ return () => listener.remove();
40
+ });
41
+ return observable;
42
+ }));
43
+ }
44
+ /** Sets the current target that the manager should bind events to. */
45
+ setTarget(target) {
46
+ const currentTarget = this._targetStream.value;
47
+ if (target === currentTarget) {
48
+ return;
49
+ }
50
+ // Clear the listeners from the pre-existing target.
51
+ if (currentTarget) {
52
+ this._clearListeners();
53
+ this._pending = [];
54
+ }
55
+ this._targetStream.next(target);
56
+ // Add the listeners that were bound before the map was initialized.
57
+ this._pending.forEach(subscriber => subscriber.observable.subscribe(subscriber.observer));
58
+ this._pending = [];
59
+ }
60
+ /** Destroys the manager and clears the event listeners. */
61
+ destroy() {
62
+ this._clearListeners();
63
+ this._pending = [];
64
+ this._targetStream.complete();
65
+ }
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWV2ZW50LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ29vZ2xlLW1hcHMvbWFwLWV2ZW50LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBRSxVQUFVLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBV3pDLGlHQUFpRztBQUNqRyxNQUFNLE9BQU8sZUFBZTtJQWUxQixZQUFvQixPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQWRuQyxtRUFBbUU7UUFDM0QsYUFBUSxHQUErRCxFQUFFLENBQUM7UUFDMUUsZUFBVSxHQUFvQyxFQUFFLENBQUM7UUFDakQsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsU0FBUyxDQUFDLENBQUM7SUFXeEMsQ0FBQztJQVR2Qyx1REFBdUQ7SUFDL0MsZUFBZTtRQUNyQixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDdEMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ25CO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUlELGtHQUFrRztJQUNsRyxjQUFjLENBQUksSUFBWTtRQUM1QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUM1QixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUksUUFBUSxDQUFDLEVBQUU7Z0JBQzlDLDBGQUEwRjtnQkFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO29CQUMzQyxPQUFPLFNBQVMsQ0FBQztpQkFDbEI7Z0JBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFRLEVBQUUsRUFBRTtvQkFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxTQUFTLENBQUMsTUFBNkI7UUFDckMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFFL0MsSUFBSSxNQUFNLEtBQUssYUFBYSxFQUFFO1lBQzVCLE9BQU87U0FDUjtRQUVELG9EQUFvRDtRQUNwRCxJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDcEI7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoQyxvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELE9BQU87UUFDTCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmliZXJ9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxudHlwZSBNYXBFdmVudE1hbmFnZXJUYXJnZXQgPVxuICB8IHtcbiAgICAgIGFkZExpc3RlbmVyOiAoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCxcbiAgICAgICkgPT4gZ29vZ2xlLm1hcHMuTWFwc0V2ZW50TGlzdGVuZXI7XG4gICAgfVxuICB8IHVuZGVmaW5lZDtcblxuLyoqIE1hbmFnZXMgZXZlbnQgb24gYSBHb29nbGUgTWFwcyBvYmplY3QsIGVuc3VyaW5nIHRoYXQgZXZlbnRzIGFyZSBhZGRlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LiAqL1xuZXhwb3J0IGNsYXNzIE1hcEV2ZW50TWFuYWdlciB7XG4gIC8qKiBQZW5kaW5nIGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQgYmVmb3JlIHRoZSB0YXJnZXQgd2FzIHNldC4gKi9cbiAgcHJpdmF0ZSBfcGVuZGluZzoge29ic2VydmFibGU6IE9ic2VydmFibGU8YW55Pjsgb2JzZXJ2ZXI6IFN1YnNjcmliZXI8YW55Pn1bXSA9IFtdO1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IGdvb2dsZS5tYXBzLk1hcHNFdmVudExpc3RlbmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBfdGFyZ2V0U3RyZWFtID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXBFdmVudE1hbmFnZXJUYXJnZXQ+KHVuZGVmaW5lZCk7XG5cbiAgLyoqIENsZWFycyBhbGwgY3VycmVudGx5LXJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzLiAqL1xuICBwcml2YXRlIF9jbGVhckxpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge31cblxuICAvKiogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgYWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgbWFwIHdoZW4gYSBjb25zdW1lciBzdWJzY3JpYmVzIHRvIGl0LiAqL1xuICBnZXRMYXp5RW1pdHRlcjxUPihuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0U3RyZWFtLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAodGFyZ2V0ID0+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFQ+KG9ic2VydmVyID0+IHtcbiAgICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldCwgY2FjaGUgdGhlIG9ic2VydmVyIHNvIGl0IGNhbiBiZSBhZGRlZCBsYXRlci5cbiAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZy5wdXNoKHtvYnNlcnZhYmxlLCBvYnNlcnZlcn0pO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRhcmdldC5hZGRMaXN0ZW5lcihuYW1lLCAoZXZlbnQ6IFQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gb2JzZXJ2ZXIubmV4dChldmVudCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBjdXJyZW50IHRhcmdldCB0aGF0IHRoZSBtYW5hZ2VyIHNob3VsZCBiaW5kIGV2ZW50cyB0by4gKi9cbiAgc2V0VGFyZ2V0KHRhcmdldDogTWFwRXZlbnRNYW5hZ2VyVGFyZ2V0KSB7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IHRoaXMuX3RhcmdldFN0cmVhbS52YWx1ZTtcblxuICAgIGlmICh0YXJnZXQgPT09IGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbGVhciB0aGUgbGlzdGVuZXJzIGZyb20gdGhlIHByZS1leGlzdGluZyB0YXJnZXQuXG4gICAgaWYgKGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIHRoaXMuX2NsZWFyTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLl9wZW5kaW5nID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5fdGFyZ2V0U3RyZWFtLm5leHQodGFyZ2V0KTtcblxuICAgIC8vIEFkZCB0aGUgbGlzdGVuZXJzIHRoYXQgd2VyZSBib3VuZCBiZWZvcmUgdGhlIG1hcCB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgdGhpcy5fcGVuZGluZy5mb3JFYWNoKHN1YnNjcmliZXIgPT4gc3Vic2NyaWJlci5vYnNlcnZhYmxlLnN1YnNjcmliZShzdWJzY3JpYmVyLm9ic2VydmVyKSk7XG4gICAgdGhpcy5fcGVuZGluZyA9IFtdO1xuICB9XG5cbiAgLyoqIERlc3Ryb3lzIHRoZSBtYW5hZ2VyIGFuZCBjbGVhcnMgdGhlIGV2ZW50IGxpc3RlbmVycy4gKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9jbGVhckxpc3RlbmVycygpO1xuICAgIHRoaXMuX3BlbmRpbmcgPSBbXTtcbiAgICB0aGlzLl90YXJnZXRTdHJlYW0uY29tcGxldGUoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,47 @@
1
+ /// <reference types="google.maps" />
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ // Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265
10
+ /// <reference types="google.maps" />
11
+ import { Injectable, NgZone } from '@angular/core';
12
+ import { Observable } from 'rxjs';
13
+ import * as i0 from "@angular/core";
14
+ /**
15
+ * Angular service that wraps the Google Maps Geocoder from the Google Maps JavaScript API.
16
+ * See developers.google.com/maps/documentation/javascript/reference/geocoder#Geocoder
17
+ */
18
+ export class MapGeocoder {
19
+ constructor(_ngZone) {
20
+ this._ngZone = _ngZone;
21
+ }
22
+ /**
23
+ * See developers.google.com/maps/documentation/javascript/reference/geocoder#Geocoder.geocode
24
+ */
25
+ geocode(request) {
26
+ return new Observable(observer => {
27
+ // Initialize the `Geocoder` lazily since the Google Maps API may
28
+ // not have been loaded when the provider is instantiated.
29
+ if (!this._geocoder) {
30
+ this._geocoder = new google.maps.Geocoder();
31
+ }
32
+ this._geocoder.geocode(request, (results, status) => {
33
+ this._ngZone.run(() => {
34
+ observer.next({ results: results || [], status });
35
+ observer.complete();
36
+ });
37
+ });
38
+ });
39
+ }
40
+ }
41
+ MapGeocoder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: MapGeocoder, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
42
+ MapGeocoder.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: MapGeocoder, providedIn: 'root' });
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: MapGeocoder, decorators: [{
44
+ type: Injectable,
45
+ args: [{ providedIn: 'root' }]
46
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWdlb2NvZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2dvb2dsZS1tYXBzL21hcC1nZW9jb2Rlci9tYXAtZ2VvY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EscUNBQXFDO0FBVHJDOzs7Ozs7R0FNRztBQUVILHlFQUF5RTtBQUN6RSxxQ0FBcUM7QUFFckMsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7QUFPaEM7OztHQUdHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUFHdEIsWUFBNkIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFBRyxDQUFDO0lBRWhEOztPQUVHO0lBQ0gsT0FBTyxDQUFDLE9BQW9DO1FBQzFDLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDL0IsaUVBQWlFO1lBQ2pFLDBEQUEwRDtZQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDN0M7WUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDcEIsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7b0JBQ2hELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0hBdkJVLFdBQVc7b0hBQVgsV0FBVyxjQURDLE1BQU07bUdBQ2xCLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFdvcmthcm91bmQgZm9yOiBodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9ydWxlc19ub2RlanMvaXNzdWVzLzEyNjVcbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiZ29vZ2xlLm1hcHNcIiAvPlxuXG5pbXBvcnQge0luamVjdGFibGUsIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hcEdlb2NvZGVyUmVzcG9uc2Uge1xuICBzdGF0dXM6IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzO1xuICByZXN1bHRzOiBnb29nbGUubWFwcy5HZW9jb2RlclJlc3VsdFtdO1xufVxuXG4vKipcbiAqIEFuZ3VsYXIgc2VydmljZSB0aGF0IHdyYXBzIHRoZSBHb29nbGUgTWFwcyBHZW9jb2RlciBmcm9tIHRoZSBHb29nbGUgTWFwcyBKYXZhU2NyaXB0IEFQSS5cbiAqIFNlZSBkZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL2dlb2NvZGVyI0dlb2NvZGVyXG4gKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIE1hcEdlb2NvZGVyIHtcbiAgcHJpdmF0ZSBfZ2VvY29kZXI6IGdvb2dsZS5tYXBzLkdlb2NvZGVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX25nWm9uZTogTmdab25lKSB7fVxuXG4gIC8qKlxuICAgKiBTZWUgZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L3JlZmVyZW5jZS9nZW9jb2RlciNHZW9jb2Rlci5nZW9jb2RlXG4gICAqL1xuICBnZW9jb2RlKHJlcXVlc3Q6IGdvb2dsZS5tYXBzLkdlb2NvZGVyUmVxdWVzdCk6IE9ic2VydmFibGU8TWFwR2VvY29kZXJSZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBgR2VvY29kZXJgIGxhemlseSBzaW5jZSB0aGUgR29vZ2xlIE1hcHMgQVBJIG1heVxuICAgICAgLy8gbm90IGhhdmUgYmVlbiBsb2FkZWQgd2hlbiB0aGUgcHJvdmlkZXIgaXMgaW5zdGFudGlhdGVkLlxuICAgICAgaWYgKCF0aGlzLl9nZW9jb2Rlcikge1xuICAgICAgICB0aGlzLl9nZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9nZW9jb2Rlci5nZW9jb2RlKHJlcXVlc3QsIChyZXN1bHRzLCBzdGF0dXMpID0+IHtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7cmVzdWx0czogcmVzdWx0cyB8fCBbXSwgc3RhdHVzfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,177 @@
1
+ /// <reference types="google.maps" />
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ // Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265
10
+ /// <reference types="google.maps" />
11
+ import { Directive, Input, NgZone, Output } from '@angular/core';
12
+ import { BehaviorSubject, Observable, Subject } from 'rxjs';
13
+ import { takeUntil } from 'rxjs/operators';
14
+ import { GoogleMap } from '../google-map/google-map';
15
+ import { MapEventManager } from '../map-event-manager';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "../google-map/google-map";
18
+ /**
19
+ * Angular component that renders a Google Maps Ground Overlay via the Google Maps JavaScript API.
20
+ *
21
+ * See developers.google.com/maps/documentation/javascript/reference/image-overlay#GroundOverlay
22
+ */
23
+ export class MapGroundOverlay {
24
+ constructor(_map, _ngZone) {
25
+ this._map = _map;
26
+ this._ngZone = _ngZone;
27
+ this._eventManager = new MapEventManager(this._ngZone);
28
+ this._opacity = new BehaviorSubject(1);
29
+ this._url = new BehaviorSubject('');
30
+ this._bounds = new BehaviorSubject(undefined);
31
+ this._destroyed = new Subject();
32
+ /** Whether the overlay is clickable */
33
+ this.clickable = false;
34
+ /**
35
+ * See
36
+ * developers.google.com/maps/documentation/javascript/reference/image-overlay#GroundOverlay.click
37
+ */
38
+ this.mapClick = this._eventManager.getLazyEmitter('click');
39
+ /**
40
+ * See
41
+ * developers.google.com/maps/documentation/javascript/reference/image-overlay
42
+ * #GroundOverlay.dblclick
43
+ */
44
+ this.mapDblclick = this._eventManager.getLazyEmitter('dblclick');
45
+ }
46
+ /** URL of the image that will be shown in the overlay. */
47
+ set url(url) {
48
+ this._url.next(url);
49
+ }
50
+ /** Bounds for the overlay. */
51
+ get bounds() {
52
+ return this._bounds.value;
53
+ }
54
+ set bounds(bounds) {
55
+ this._bounds.next(bounds);
56
+ }
57
+ /** Opacity of the overlay. */
58
+ set opacity(opacity) {
59
+ this._opacity.next(opacity);
60
+ }
61
+ ngOnInit() {
62
+ if (this._map._isBrowser) {
63
+ // The ground overlay setup is slightly different from the other Google Maps objects in that
64
+ // we have to recreate the `GroundOverlay` object whenever the bounds change, because
65
+ // Google Maps doesn't provide an API to update the bounds of an existing overlay.
66
+ this._bounds.pipe(takeUntil(this._destroyed)).subscribe(bounds => {
67
+ if (this.groundOverlay) {
68
+ this.groundOverlay.setMap(null);
69
+ this.groundOverlay = undefined;
70
+ }
71
+ // Create the object outside the zone so its events don't trigger change detection.
72
+ // We'll bring it back in inside the `MapEventManager` only for the events that the
73
+ // user has subscribed to.
74
+ if (bounds) {
75
+ this._ngZone.runOutsideAngular(() => {
76
+ this.groundOverlay = new google.maps.GroundOverlay(this._url.getValue(), bounds, {
77
+ clickable: this.clickable,
78
+ opacity: this._opacity.value,
79
+ });
80
+ });
81
+ this._assertInitialized();
82
+ this.groundOverlay.setMap(this._map.googleMap);
83
+ this._eventManager.setTarget(this.groundOverlay);
84
+ }
85
+ });
86
+ this._watchForOpacityChanges();
87
+ this._watchForUrlChanges();
88
+ }
89
+ }
90
+ ngOnDestroy() {
91
+ this._eventManager.destroy();
92
+ this._destroyed.next();
93
+ this._destroyed.complete();
94
+ if (this.groundOverlay) {
95
+ this.groundOverlay.setMap(null);
96
+ }
97
+ }
98
+ /**
99
+ * See
100
+ * developers.google.com/maps/documentation/javascript/reference/image-overlay
101
+ * #GroundOverlay.getBounds
102
+ */
103
+ getBounds() {
104
+ this._assertInitialized();
105
+ return this.groundOverlay.getBounds();
106
+ }
107
+ /**
108
+ * See
109
+ * developers.google.com/maps/documentation/javascript/reference/image-overlay
110
+ * #GroundOverlay.getOpacity
111
+ */
112
+ getOpacity() {
113
+ this._assertInitialized();
114
+ return this.groundOverlay.getOpacity();
115
+ }
116
+ /**
117
+ * See
118
+ * developers.google.com/maps/documentation/javascript/reference/image-overlay
119
+ * #GroundOverlay.getUrl
120
+ */
121
+ getUrl() {
122
+ this._assertInitialized();
123
+ return this.groundOverlay.getUrl();
124
+ }
125
+ _watchForOpacityChanges() {
126
+ this._opacity.pipe(takeUntil(this._destroyed)).subscribe(opacity => {
127
+ if (opacity != null) {
128
+ this._assertInitialized();
129
+ this.groundOverlay.setOpacity(opacity);
130
+ }
131
+ });
132
+ }
133
+ _watchForUrlChanges() {
134
+ this._url.pipe(takeUntil(this._destroyed)).subscribe(url => {
135
+ this._assertInitialized();
136
+ const overlay = this.groundOverlay;
137
+ overlay.set('url', url);
138
+ // Google Maps only redraws the overlay if we re-set the map.
139
+ overlay.setMap(null);
140
+ overlay.setMap(this._map.googleMap);
141
+ });
142
+ }
143
+ _assertInitialized() {
144
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
145
+ if (!this._map.googleMap) {
146
+ throw Error('Cannot access Google Map information before the API has been initialized. ' +
147
+ 'Please wait for the API to load before trying to interact with it.');
148
+ }
149
+ if (!this.groundOverlay) {
150
+ throw Error('Cannot interact with a Google Map GroundOverlay before it has been initialized. ' +
151
+ 'Please wait for the GroundOverlay to load before trying to interact with it.');
152
+ }
153
+ }
154
+ }
155
+ }
156
+ MapGroundOverlay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: MapGroundOverlay, deps: [{ token: i1.GoogleMap }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
157
+ MapGroundOverlay.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.0-next.15", type: MapGroundOverlay, selector: "map-ground-overlay", inputs: { url: "url", bounds: "bounds", clickable: "clickable", opacity: "opacity" }, outputs: { mapClick: "mapClick", mapDblclick: "mapDblclick" }, exportAs: ["mapGroundOverlay"], ngImport: i0 });
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: MapGroundOverlay, decorators: [{
159
+ type: Directive,
160
+ args: [{
161
+ selector: 'map-ground-overlay',
162
+ exportAs: 'mapGroundOverlay',
163
+ }]
164
+ }], ctorParameters: function () { return [{ type: i1.GoogleMap }, { type: i0.NgZone }]; }, propDecorators: { url: [{
165
+ type: Input
166
+ }], bounds: [{
167
+ type: Input
168
+ }], clickable: [{
169
+ type: Input
170
+ }], opacity: [{
171
+ type: Input
172
+ }], mapClick: [{
173
+ type: Output
174
+ }], mapDblclick: [{
175
+ type: Output
176
+ }] } });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWdyb3VuZC1vdmVybGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2dvb2dsZS1tYXBzL21hcC1ncm91bmQtb3ZlcmxheS9tYXAtZ3JvdW5kLW92ZXJsYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EscUNBQXFDO0FBVHJDOzs7Ozs7R0FNRztBQUVILHlFQUF5RTtBQUN6RSxxQ0FBcUM7QUFFckMsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFxQixNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFDLGVBQWUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDOzs7QUFFckQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxnQkFBZ0I7SUF3RDNCLFlBQTZCLElBQWUsRUFBbUIsT0FBZTtRQUFqRCxTQUFJLEdBQUosSUFBSSxDQUFXO1FBQW1CLFlBQU8sR0FBUCxPQUFPLENBQVE7UUF2RHRFLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpDLGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUMxQyxTQUFJLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkMsWUFBTyxHQUFHLElBQUksZUFBZSxDQUU1QyxTQUFTLENBQUMsQ0FBQztRQUNJLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBd0JsRCx1Q0FBdUM7UUFDOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQVFwQzs7O1dBR0c7UUFDZ0IsYUFB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QUFTLEVBQUU7WUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUN4QixNQUFNLEtBQUssQ0FDVCw0RUFBNEU7b0JBQzFFLG9FQUFvRSxDQUN2RSxDQUFDO2FBQ0g7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdkIsTUFBTSxLQUFLLENBQ1Qsa0ZBQWtGO29CQUNoRiw4RUFBOEUsQ0FDakYsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDOztxSEFyS1UsZ0JBQWdCO3lHQUFoQixnQkFBZ0I7bUdBQWhCLGdCQUFnQjtrQkFKNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixRQUFRLEVBQUUsa0JBQWtCO2lCQUM3QjtxSEFvQkssR0FBRztzQkFETixLQUFLO2dCQU9GLE1BQU07c0JBRFQsS0FBSztnQkFTRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlGLE9BQU87c0JBRFYsS0FBSztnQkFTYSxRQUFRO3NCQUExQixNQUFNO2dCQVFZLFdBQVc7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gV29ya2Fyb3VuZCBmb3I6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL3J1bGVzX25vZGVqcy9pc3N1ZXMvMTI2NVxuLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJnb29nbGUubWFwc1wiIC8+XG5cbmltcG9ydCB7RGlyZWN0aXZlLCBJbnB1dCwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7dGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7R29vZ2xlTWFwfSBmcm9tICcuLi9nb29nbGUtbWFwL2dvb2dsZS1tYXAnO1xuaW1wb3J0IHtNYXBFdmVudE1hbmFnZXJ9IGZyb20gJy4uL21hcC1ldmVudC1tYW5hZ2VyJztcblxuLyoqXG4gKiBBbmd1bGFyIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgYSBHb29nbGUgTWFwcyBHcm91bmQgT3ZlcmxheSB2aWEgdGhlIEdvb2dsZSBNYXBzIEphdmFTY3JpcHQgQVBJLlxuICpcbiAqIFNlZSBkZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL2ltYWdlLW92ZXJsYXkjR3JvdW5kT3ZlcmxheVxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdtYXAtZ3JvdW5kLW92ZXJsYXknLFxuICBleHBvcnRBczogJ21hcEdyb3VuZE92ZXJsYXknLFxufSlcbmV4cG9ydCBjbGFzcyBNYXBHcm91bmRPdmVybGF5IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9ldmVudE1hbmFnZXIgPSBuZXcgTWFwRXZlbnRNYW5hZ2VyKHRoaXMuX25nWm9uZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3BhY2l0eSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigxKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdXJsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYm91bmRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHNMaXRlcmFsIHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKipcbiAgICogVGhlIHVuZGVybHlpbmcgZ29vZ2xlLm1hcHMuR3JvdW5kT3ZlcmxheSBvYmplY3QuXG4gICAqXG4gICAqIFNlZSBkZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL2ltYWdlLW92ZXJsYXkjR3JvdW5kT3ZlcmxheVxuICAgKi9cbiAgZ3JvdW5kT3ZlcmxheT86IGdvb2dsZS5tYXBzLkdyb3VuZE92ZXJsYXk7XG5cbiAgLyoqIFVSTCBvZiB0aGUgaW1hZ2UgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBvdmVybGF5LiAqL1xuICBASW5wdXQoKVxuICBzZXQgdXJsKHVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXJsLm5leHQodXJsKTtcbiAgfVxuXG4gIC8qKiBCb3VuZHMgZm9yIHRoZSBvdmVybGF5LiAqL1xuICBASW5wdXQoKVxuICBnZXQgYm91bmRzKCk6IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyB8IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kc0xpdGVyYWwge1xuICAgIHJldHVybiB0aGlzLl9ib3VuZHMudmFsdWUhO1xuICB9XG4gIHNldCBib3VuZHMoYm91bmRzOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHNMaXRlcmFsKSB7XG4gICAgdGhpcy5fYm91bmRzLm5leHQoYm91bmRzKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVybGF5IGlzIGNsaWNrYWJsZSAqL1xuICBASW5wdXQoKSBjbGlja2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogT3BhY2l0eSBvZiB0aGUgb3ZlcmxheS4gKi9cbiAgQElucHV0KClcbiAgc2V0IG9wYWNpdHkob3BhY2l0eTogbnVtYmVyKSB7XG4gICAgdGhpcy5fb3BhY2l0eS5uZXh0KG9wYWNpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZVxuICAgKiBkZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL2ltYWdlLW92ZXJsYXkjR3JvdW5kT3ZlcmxheS5jbGlja1xuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG1hcENsaWNrOiBPYnNlcnZhYmxlPGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQ+ID1cbiAgICB0aGlzLl9ldmVudE1hbmFnZXIuZ2V0TGF6eUVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4oJ2NsaWNrJyk7XG5cbiAgLyoqXG4gICAqIFNlZVxuICAgKiBkZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL2ltYWdlLW92ZXJsYXlcbiAgICogI0dyb3VuZE92ZXJsYXkuZGJsY2xpY2tcbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBtYXBEYmxjbGljazogT2JzZXJ2YWJsZTxnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50PiA9XG4gICAgdGhpcy5fZXZlbnRNYW5hZ2VyLmdldExhenlFbWl0dGVyPGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQ+KCdkYmxjbGljaycpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX21hcDogR29vZ2xlTWFwLCBwcml2YXRlIHJlYWRvbmx5IF9uZ1pvbmU6IE5nWm9uZSkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5fbWFwLl9pc0Jyb3dzZXIpIHtcbiAgICAgIC8vIFRoZSBncm91bmQgb3ZlcmxheSBzZXR1cCBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgR29vZ2xlIE1hcHMgb2JqZWN0cyBpbiB0aGF0XG4gICAgICAvLyB3ZSBoYXZlIHRvIHJlY3JlYXRlIHRoZSBgR3JvdW5kT3ZlcmxheWAgb2JqZWN0IHdoZW5ldmVyIHRoZSBib3VuZHMgY2hhbmdlLCBiZWNhdXNlXG4gICAgICAvLyBHb29nbGUgTWFwcyBkb2Vzbid0IHByb3ZpZGUgYW4gQVBJIHRvIHVwZGF0ZSB0aGUgYm91bmRzIG9mIGFuIGV4aXN0aW5nIG92ZXJsYXkuXG4gICAgICB0aGlzLl9ib3VuZHMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKGJvdW5kcyA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdyb3VuZE92ZXJsYXkpIHtcbiAgICAgICAgICB0aGlzLmdyb3VuZE92ZXJsYXkuc2V0TWFwKG51bGwpO1xuICAgICAgICAgIHRoaXMuZ3JvdW5kT3ZlcmxheSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgb2JqZWN0IG91dHNpZGUgdGhlIHpvbmUgc28gaXRzIGV2ZW50cyBkb24ndCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgIC8vIFdlJ2xsIGJyaW5nIGl0IGJhY2sgaW4gaW5zaWRlIHRoZSBgTWFwRXZlbnRNYW5hZ2VyYCBvbmx5IGZvciB0aGUgZXZlbnRzIHRoYXQgdGhlXG4gICAgICAgIC8vIHVzZXIgaGFzIHN1YnNjcmliZWQgdG8uXG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncm91bmRPdmVybGF5ID0gbmV3IGdvb2dsZS5tYXBzLkdyb3VuZE92ZXJsYXkodGhpcy5fdXJsLmdldFZhbHVlKCksIGJvdW5kcywge1xuICAgICAgICAgICAgICBjbGlja2FibGU6IHRoaXMuY2xpY2thYmxlLFxuICAgICAgICAgICAgICBvcGFjaXR5OiB0aGlzLl9vcGFjaXR5LnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgICB0aGlzLmdyb3VuZE92ZXJsYXkuc2V0TWFwKHRoaXMuX21hcC5nb29nbGVNYXAhKTtcbiAgICAgICAgICB0aGlzLl9ldmVudE1hbmFnZXIuc2V0VGFyZ2V0KHRoaXMuZ3JvdW5kT3ZlcmxheSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl93YXRjaEZvck9wYWNpdHlDaGFuZ2VzKCk7XG4gICAgICB0aGlzLl93YXRjaEZvclVybENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9ldmVudE1hbmFnZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gICAgaWYgKHRoaXMuZ3JvdW5kT3ZlcmxheSkge1xuICAgICAgdGhpcy5ncm91bmRPdmVybGF5LnNldE1hcChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlXG4gICAqIGRldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvaW1hZ2Utb3ZlcmxheVxuICAgKiAjR3JvdW5kT3ZlcmxheS5nZXRCb3VuZHNcbiAgICovXG4gIGdldEJvdW5kcygpOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBudWxsIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdyb3VuZE92ZXJsYXkuZ2V0Qm91bmRzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VlXG4gICAqIGRldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvaW1hZ2Utb3ZlcmxheVxuICAgKiAjR3JvdW5kT3ZlcmxheS5nZXRPcGFjaXR5XG4gICAqL1xuICBnZXRPcGFjaXR5KCk6IG51bWJlciB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5ncm91bmRPdmVybGF5LmdldE9wYWNpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVcbiAgICogZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L3JlZmVyZW5jZS9pbWFnZS1vdmVybGF5XG4gICAqICNHcm91bmRPdmVybGF5LmdldFVybFxuICAgKi9cbiAgZ2V0VXJsKCk6IHN0cmluZyB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5ncm91bmRPdmVybGF5LmdldFVybCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfd2F0Y2hGb3JPcGFjaXR5Q2hhbmdlcygpIHtcbiAgICB0aGlzLl9vcGFjaXR5LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZShvcGFjaXR5ID0+IHtcbiAgICAgIGlmIChvcGFjaXR5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgdGhpcy5ncm91bmRPdmVybGF5LnNldE9wYWNpdHkob3BhY2l0eSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF93YXRjaEZvclVybENoYW5nZXMoKSB7XG4gICAgdGhpcy5fdXJsLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSh1cmwgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKTtcbiAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLmdyb3VuZE92ZXJsYXk7XG4gICAgICBvdmVybGF5LnNldCgndXJsJywgdXJsKTtcblxuICAgICAgLy8gR29vZ2xlIE1hcHMgb25seSByZWRyYXdzIHRoZSBvdmVybGF5IGlmIHdlIHJlLXNldCB0aGUgbWFwLlxuICAgICAgb3ZlcmxheS5zZXRNYXAobnVsbCk7XG4gICAgICBvdmVybGF5LnNldE1hcCh0aGlzLl9tYXAuZ29vZ2xlTWFwISk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hc3NlcnRJbml0aWFsaXplZCgpOiBhc3NlcnRzIHRoaXMgaXMge2dyb3VuZE92ZXJsYXk6IGdvb2dsZS5tYXBzLkdyb3VuZE92ZXJsYXl9IHtcbiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICBpZiAoIXRoaXMuX21hcC5nb29nbGVNYXApIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ0Nhbm5vdCBhY2Nlc3MgR29vZ2xlIE1hcCBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZC4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHdhaXQgZm9yIHRoZSBBUEkgdG8gbG9hZCBiZWZvcmUgdHJ5aW5nIHRvIGludGVyYWN0IHdpdGggaXQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5ncm91bmRPdmVybGF5KSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdDYW5ub3QgaW50ZXJhY3Qgd2l0aCBhIEdvb2dsZSBNYXAgR3JvdW5kT3ZlcmxheSBiZWZvcmUgaXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSB3YWl0IGZvciB0aGUgR3JvdW5kT3ZlcmxheSB0byBsb2FkIGJlZm9yZSB0cnlpbmcgdG8gaW50ZXJhY3Qgd2l0aCBpdC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,135 @@
1
+ /// <reference types="google.maps" />
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ // Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265
10
+ /// <reference types="google.maps" />
11
+ import { Input, NgZone, Directive } from '@angular/core';
12
+ import { GoogleMap } from '../google-map/google-map';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../google-map/google-map";
15
+ /**
16
+ * Angular directive that renders a Google Maps heatmap via the Google Maps JavaScript API.
17
+ *
18
+ * See: https://developers.google.com/maps/documentation/javascript/reference/visualization
19
+ */
20
+ export class MapHeatmapLayer {
21
+ constructor(_googleMap, _ngZone) {
22
+ this._googleMap = _googleMap;
23
+ this._ngZone = _ngZone;
24
+ }
25
+ /**
26
+ * Data shown on the heatmap.
27
+ * See: https://developers.google.com/maps/documentation/javascript/reference/visualization
28
+ */
29
+ set data(data) {
30
+ this._data = data;
31
+ }
32
+ /**
33
+ * Options used to configure the heatmap. See:
34
+ * developers.google.com/maps/documentation/javascript/reference/visualization#HeatmapLayerOptions
35
+ */
36
+ set options(options) {
37
+ this._options = options;
38
+ }
39
+ ngOnInit() {
40
+ if (this._googleMap._isBrowser) {
41
+ if (!window.google?.maps?.visualization && (typeof ngDevMode === 'undefined' || ngDevMode)) {
42
+ throw Error('Namespace `google.maps.visualization` not found, cannot construct heatmap. ' +
43
+ 'Please install the Google Maps JavaScript API with the "visualization" library: ' +
44
+ 'https://developers.google.com/maps/documentation/javascript/visualization');
45
+ }
46
+ // Create the object outside the zone so its events don't trigger change detection.
47
+ // We'll bring it back in inside the `MapEventManager` only for the events that the
48
+ // user has subscribed to.
49
+ this._ngZone.runOutsideAngular(() => {
50
+ this.heatmap = new google.maps.visualization.HeatmapLayer(this._combineOptions());
51
+ });
52
+ this._assertInitialized();
53
+ this.heatmap.setMap(this._googleMap.googleMap);
54
+ }
55
+ }
56
+ ngOnChanges(changes) {
57
+ const { _data, heatmap } = this;
58
+ if (heatmap) {
59
+ if (changes['options']) {
60
+ heatmap.setOptions(this._combineOptions());
61
+ }
62
+ if (changes['data'] && _data !== undefined) {
63
+ heatmap.setData(this._normalizeData(_data));
64
+ }
65
+ }
66
+ }
67
+ ngOnDestroy() {
68
+ if (this.heatmap) {
69
+ this.heatmap.setMap(null);
70
+ }
71
+ }
72
+ /**
73
+ * Gets the data that is currently shown on the heatmap.
74
+ * See: developers.google.com/maps/documentation/javascript/reference/visualization#HeatmapLayer
75
+ */
76
+ getData() {
77
+ this._assertInitialized();
78
+ return this.heatmap.getData();
79
+ }
80
+ /** Creates a combined options object using the passed-in options and the individual inputs. */
81
+ _combineOptions() {
82
+ const options = this._options || {};
83
+ return {
84
+ ...options,
85
+ data: this._normalizeData(this._data || options.data || []),
86
+ map: this._googleMap.googleMap,
87
+ };
88
+ }
89
+ /**
90
+ * Most Google Maps APIs support both `LatLng` objects and `LatLngLiteral`. The latter is more
91
+ * convenient to write out, because the Google Maps API doesn't have to have been loaded in order
92
+ * to construct them. The `HeatmapLayer` appears to be an exception that only allows a `LatLng`
93
+ * object, or it throws a runtime error. Since it's more convenient and we expect that Angular
94
+ * users will load the API asynchronously, we allow them to pass in a `LatLngLiteral` and we
95
+ * convert it to a `LatLng` object before passing it off to Google Maps.
96
+ */
97
+ _normalizeData(data) {
98
+ const result = [];
99
+ data.forEach(item => {
100
+ result.push(isLatLngLiteral(item) ? new google.maps.LatLng(item.lat, item.lng) : item);
101
+ });
102
+ return result;
103
+ }
104
+ /** Asserts that the heatmap object has been initialized. */
105
+ _assertInitialized() {
106
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
107
+ if (!this._googleMap.googleMap) {
108
+ throw Error('Cannot access Google Map information before the API has been initialized. ' +
109
+ 'Please wait for the API to load before trying to interact with it.');
110
+ }
111
+ if (!this.heatmap) {
112
+ throw Error('Cannot interact with a Google Map HeatmapLayer before it has been ' +
113
+ 'initialized. Please wait for the heatmap to load before trying to interact with it.');
114
+ }
115
+ }
116
+ }
117
+ }
118
+ MapHeatmapLayer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: MapHeatmapLayer, deps: [{ token: i1.GoogleMap }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
119
+ MapHeatmapLayer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.0-next.15", type: MapHeatmapLayer, selector: "map-heatmap-layer", inputs: { data: "data", options: "options" }, exportAs: ["mapHeatmapLayer"], usesOnChanges: true, ngImport: i0 });
120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: MapHeatmapLayer, decorators: [{
121
+ type: Directive,
122
+ args: [{
123
+ selector: 'map-heatmap-layer',
124
+ exportAs: 'mapHeatmapLayer',
125
+ }]
126
+ }], ctorParameters: function () { return [{ type: i1.GoogleMap }, { type: i0.NgZone }]; }, propDecorators: { data: [{
127
+ type: Input
128
+ }], options: [{
129
+ type: Input
130
+ }] } });
131
+ /** Asserts that an object is a `LatLngLiteral`. */
132
+ function isLatLngLiteral(value) {
133
+ return value && typeof value.lat === 'number' && typeof value.lng === 'number';
134
+ }
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWhlYXRtYXAtbGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvZ29vZ2xlLW1hcHMvbWFwLWhlYXRtYXAtbGF5ZXIvbWFwLWhlYXRtYXAtbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EscUNBQXFDO0FBVHJDOzs7Ozs7R0FNRztBQUVILHlFQUF5RTtBQUN6RSxxQ0FBcUM7QUFFckMsT0FBTyxFQUFDLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBMkIsTUFBTSxlQUFlLENBQUM7QUFFcEcsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDOzs7QUFTbkQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxlQUFlO0lBNEIxQixZQUE2QixVQUFxQixFQUFVLE9BQWU7UUFBOUMsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFBRyxDQUFDO0lBM0IvRTs7O09BR0c7SUFDSCxJQUNJLElBQUksQ0FBQyxJQUFpQjtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsSUFDSSxPQUFPLENBQUMsT0FBK0Q7UUFDekUsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQVlELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLElBQUksQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLEVBQUU7Z0JBQzFGLE1BQU0sS0FBSyxDQUNULDZFQUE2RTtvQkFDM0Usa0ZBQWtGO29CQUNsRiwyRUFBMkUsQ0FDOUUsQ0FBQzthQUNIO1lBRUQsbUZBQW1GO1lBQ25GLG1GQUFtRjtZQUNuRiwwQkFBMEI7WUFDMUIsSUFBSSxD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T0ssSUFBSTtzQkFEUCxLQUFLO2dCQVdGLE9BQU87c0JBRFYsS0FBSzs7QUFnSFIsbURBQW1EO0FBQ25ELFNBQVMsZUFBZSxDQUFDLEtBQVU7SUFDakMsT0FBTyxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gV29ya2Fyb3VuZCBmb3I6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL3J1bGVzX25vZGVqcy9pc3N1ZXMvMTI2NVxuLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJnb29nbGUubWFwc1wiIC8+XG5cbmltcG9ydCB7SW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBOZ1pvbmUsIERpcmVjdGl2ZSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtHb29nbGVNYXB9IGZyb20gJy4uL2dvb2dsZS1tYXAvZ29vZ2xlLW1hcCc7XG5cbi8qKiBQb3NzaWJsZSBkYXRhIHRoYXQgY2FuIGJlIHNob3duIG9uIGEgaGVhdG1hcCBsYXllci4gKi9cbmV4cG9ydCB0eXBlIEhlYXRtYXBEYXRhID1cbiAgfCBnb29nbGUubWFwcy5NVkNBcnJheTxcbiAgICAgIGdvb2dsZS5tYXBzLkxhdExuZyB8IGdvb2dsZS5tYXBzLnZpc3VhbGl6YXRpb24uV2VpZ2h0ZWRMb2NhdGlvbiB8IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWxcbiAgICA+XG4gIHwgKGdvb2dsZS5tYXBzLkxhdExuZyB8IGdvb2dsZS5tYXBzLnZpc3VhbGl6YXRpb24uV2VpZ2h0ZWRMb2NhdGlvbiB8IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWwpW107XG5cbi8qKlxuICogQW5ndWxhciBkaXJlY3RpdmUgdGhhdCByZW5kZXJzIGEgR29vZ2xlIE1hcHMgaGVhdG1hcCB2aWEgdGhlIEdvb2dsZSBNYXBzIEphdmFTY3JpcHQgQVBJLlxuICpcbiAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnbWFwLWhlYXRtYXAtbGF5ZXInLFxuICBleHBvcnRBczogJ21hcEhlYXRtYXBMYXllcicsXG59KVxuZXhwb3J0IGNsYXNzIE1hcEhlYXRtYXBMYXllciBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogRGF0YSBzaG93biBvbiB0aGUgaGVhdG1hcC5cbiAgICogU2VlOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvdmlzdWFsaXphdGlvblxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGRhdGEoZGF0YTogSGVhdG1hcERhdGEpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgfVxuICBwcml2YXRlIF9kYXRhOiBIZWF0bWFwRGF0YTtcblxuICAvKipcbiAgICogT3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgaGVhdG1hcC4gU2VlOlxuICAgKiBkZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb24jSGVhdG1hcExheWVyT3B0aW9uc1xuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG9wdGlvbnMob3B0aW9uczogUGFydGlhbDxnb29nbGUubWFwcy52aXN1YWxpemF0aW9uLkhlYXRtYXBMYXllck9wdGlvbnM+KSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cbiAgcHJpdmF0ZSBfb3B0aW9uczogUGFydGlhbDxnb29nbGUubWFwcy52aXN1YWxpemF0aW9uLkhlYXRtYXBMYXllck9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBUaGUgdW5kZXJseWluZyBnb29nbGUubWFwcy52aXN1YWxpemF0aW9uLkhlYXRtYXBMYXllciBvYmplY3QuXG4gICAqXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGhlYXRtYXA/OiBnb29nbGUubWFwcy52aXN1YWxpemF0aW9uLkhlYXRtYXBMYXllcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9nb29nbGVNYXA6IEdvb2dsZU1hcCwgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuX2dvb2dsZU1hcC5faXNCcm93c2VyKSB7XG4gICAgICBpZiAoIXdpbmRvdy5nb29nbGU/Lm1hcHM/LnZpc3VhbGl6YXRpb24gJiYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ05hbWVzcGFjZSBgZ29vZ2xlLm1hcHMudmlzdWFsaXphdGlvbmAgbm90IGZvdW5kLCBjYW5ub3QgY29uc3RydWN0IGhlYXRtYXAuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSBpbnN0YWxsIHRoZSBHb29nbGUgTWFwcyBKYXZhU2NyaXB0IEFQSSB3aXRoIHRoZSBcInZpc3VhbGl6YXRpb25cIiBsaWJyYXJ5OiAnICtcbiAgICAgICAgICAgICdodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC92aXN1YWxpemF0aW9uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHRoZSBvYmplY3Qgb3V0c2lkZSB0aGUgem9uZSBzbyBpdHMgZXZlbnRzIGRvbid0IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgIC8vIFdlJ2xsIGJyaW5nIGl0IGJhY2sgaW4gaW5zaWRlIHRoZSBgTWFwRXZlbnRNYW5hZ2VyYCBvbmx5IGZvciB0aGUgZXZlbnRzIHRoYXQgdGhlXG4gICAgICAvLyB1c2VyIGhhcyBzdWJzY3JpYmVkIHRvLlxuICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5oZWF0bWFwID0gbmV3IGdvb2dsZS5tYXBzLnZpc3VhbGl6YXRpb24uSGVhdG1hcExheWVyKHRoaXMuX2NvbWJpbmVPcHRpb25zKCkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgICAgdGhpcy5oZWF0bWFwLnNldE1hcCh0aGlzLl9nb29nbGVNYXAuZ29vZ2xlTWFwISk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHtfZGF0YSwgaGVhdG1hcH0gPSB0aGlzO1xuXG4gICAgaWYgKGhlYXRtYXApIHtcbiAgICAgIGlmIChjaGFuZ2VzWydvcHRpb25zJ10pIHtcbiAgICAgICAgaGVhdG1hcC5zZXRPcHRpb25zKHRoaXMuX2NvbWJpbmVPcHRpb25zKCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmIF9kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhdG1hcC5zZXREYXRhKHRoaXMuX25vcm1hbGl6ZURhdGEoX2RhdGEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5oZWF0bWFwKSB7XG4gICAgICB0aGlzLmhlYXRtYXAuc2V0TWFwKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkYXRhIHRoYXQgaXMgY3VycmVudGx5IHNob3duIG9uIHRoZSBoZWF0bWFwLlxuICAgKiBTZWU6IGRldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvdmlzdWFsaXphdGlvbiNIZWF0bWFwTGF5ZXJcbiAgICovXG4gIGdldERhdGEoKTogSGVhdG1hcERhdGEge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuaGVhdG1hcC5nZXREYXRhKCk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBhIGNvbWJpbmVkIG9wdGlvbnMgb2JqZWN0IHVzaW5nIHRoZSBwYXNzZWQtaW4gb3B0aW9ucyBhbmQgdGhlIGluZGl2aWR1YWwgaW5wdXRzLiAqL1xuICBwcml2YXRlIF9jb21iaW5lT3B0aW9ucygpOiBnb29nbGUubWFwcy52aXN1YWxpemF0aW9uLkhlYXRtYXBMYXllck9wdGlvbnMge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9vcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZGF0YTogdGhpcy5fbm9ybWFsaXplRGF0YSh0aGlzLl9kYXRhIHx8IG9wdGlvbnMuZGF0YSB8fCBbXSksXG4gICAgICBtYXA6IHRoaXMuX2dvb2dsZU1hcC5nb29nbGVNYXAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0IEdvb2dsZSBNYXBzIEFQSXMgc3VwcG9ydCBib3RoIGBMYXRMbmdgIG9iamVjdHMgYW5kIGBMYXRMbmdMaXRlcmFsYC4gVGhlIGxhdHRlciBpcyBtb3JlXG4gICAqIGNvbnZlbmllbnQgdG8gd3JpdGUgb3V0LCBiZWNhdXNlIHRoZSBHb29nbGUgTWFwcyBBUEkgZG9lc24ndCBoYXZlIHRvIGhhdmUgYmVlbiBsb2FkZWQgaW4gb3JkZXJcbiAgICogdG8gY29uc3RydWN0IHRoZW0uIFRoZSBgSGVhdG1hcExheWVyYCBhcHBlYXJzIHRvIGJlIGFuIGV4Y2VwdGlvbiB0aGF0IG9ubHkgYWxsb3dzIGEgYExhdExuZ2BcbiAgICogb2JqZWN0LCBvciBpdCB0aHJvd3MgYSBydW50aW1lIGVycm9yLiBTaW5jZSBpdCdzIG1vcmUgY29udmVuaWVudCBhbmQgd2UgZXhwZWN0IHRoYXQgQW5ndWxhclxuICAgKiB1c2VycyB3aWxsIGxvYWQgdGhlIEFQSSBhc3luY2hyb25vdXNseSwgd2UgYWxsb3cgdGhlbSB0byBwYXNzIGluIGEgYExhdExuZ0xpdGVyYWxgIGFuZCB3ZVxuICAgKiBjb252ZXJ0IGl0IHRvIGEgYExhdExuZ2Agb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0IG9mZiB0byBHb29nbGUgTWFwcy5cbiAgICovXG4gIHByaXZhdGUgX25vcm1hbGl6ZURhdGEoZGF0YTogSGVhdG1hcERhdGEpIHtcbiAgICBjb25zdCByZXN1bHQ6IChnb29nbGUubWFwcy5MYXRMbmcgfCBnb29nbGUubWFwcy52aXN1YWxpemF0aW9uLldlaWdodGVkTG9jYXRpb24pW10gPSBbXTtcblxuICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKGlzTGF0TG5nTGl0ZXJhbChpdGVtKSA/IG5ldyBnb29nbGUubWFwcy5MYXRMbmcoaXRlbS5sYXQsIGl0ZW0ubG5nKSA6IGl0ZW0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBBc3NlcnRzIHRoYXQgdGhlIGhlYXRtYXAgb2JqZWN0IGhhcyBiZWVuIGluaXRpYWxpemVkLiAqL1xuICBwcml2YXRlIF9hc3NlcnRJbml0aWFsaXplZCgpOiBhc3NlcnRzIHRoaXMgaXMge2hlYXRtYXA6IGdvb2dsZS5tYXBzLnZpc3VhbGl6YXRpb24uSGVhdG1hcExheWVyfSB7XG4gICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgaWYgKCF0aGlzLl9nb29nbGVNYXAuZ29vZ2xlTWFwKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdDYW5ub3QgYWNjZXNzIEdvb2dsZSBNYXAgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSB3YWl0IGZvciB0aGUgQVBJIHRvIGxvYWQgYmVmb3JlIHRyeWluZyB0byBpbnRlcmFjdCB3aXRoIGl0LicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaGVhdG1hcCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IGludGVyYWN0IHdpdGggYSBHb29nbGUgTWFwIEhlYXRtYXBMYXllciBiZWZvcmUgaXQgaGFzIGJlZW4gJyArXG4gICAgICAgICAgICAnaW5pdGlhbGl6ZWQuIFBsZWFzZSB3YWl0IGZvciB0aGUgaGVhdG1hcCB0byBsb2FkIGJlZm9yZSB0cnlpbmcgdG8gaW50ZXJhY3Qgd2l0aCBpdC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiogQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpcyBhIGBMYXRMbmdMaXRlcmFsYC4gKi9cbmZ1bmN0aW9uIGlzTGF0TG5nTGl0ZXJhbCh2YWx1ZTogYW55KTogdmFsdWUgaXMgZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGF0ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmFsdWUubG5nID09PSAnbnVtYmVyJztcbn1cbiJdfQ==