@villedemontreal/angular-ui 2.2.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/esm2020/lib/alert/alert.component.mjs +7 -9
  2. package/esm2020/lib/avatar/avatar.component.mjs +102 -0
  3. package/esm2020/lib/avatar/index.mjs +8 -0
  4. package/esm2020/lib/avatar/module.mjs +24 -0
  5. package/esm2020/lib/bao.module.mjs +16 -4
  6. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +5 -5
  7. package/esm2020/lib/button/button.component.mjs +3 -3
  8. package/esm2020/lib/checkbox/checkbox-group.component.mjs +5 -6
  9. package/esm2020/lib/checkbox/checkbox.component.mjs +38 -39
  10. package/esm2020/lib/core/colors.mjs +10 -27
  11. package/esm2020/lib/icon/icon.component.mjs +29 -33
  12. package/esm2020/lib/icon/icons-dictionary.mjs +3 -2
  13. package/esm2020/lib/modal/index.mjs +12 -0
  14. package/esm2020/lib/modal/modal-animations.mjs +29 -0
  15. package/esm2020/lib/modal/modal-config.mjs +65 -0
  16. package/esm2020/lib/modal/modal-container.mjs +254 -0
  17. package/esm2020/lib/modal/modal-directives.mjs +84 -0
  18. package/esm2020/lib/modal/modal-ref.mjs +195 -0
  19. package/esm2020/lib/modal/modal.mjs +291 -0
  20. package/esm2020/lib/modal/module.mjs +46 -0
  21. package/esm2020/lib/radio/radio-group.component.mjs +40 -41
  22. package/esm2020/lib/radio/radio.component.mjs +38 -39
  23. package/esm2020/lib/shared/enum/display-mode.mjs +2 -11
  24. package/esm2020/lib/summary/summary.component.mjs +5 -7
  25. package/esm2020/lib/tabs/index.mjs +8 -0
  26. package/esm2020/lib/tabs/module.mjs +35 -0
  27. package/esm2020/lib/tabs/tabs.component.mjs +295 -0
  28. package/esm2020/lib/tag/tag.component.mjs +3 -3
  29. package/esm2020/public-api.mjs +5 -1
  30. package/fesm2015/villedemontreal-angular-ui.mjs +1607 -230
  31. package/fesm2015/villedemontreal-angular-ui.mjs.map +1 -1
  32. package/fesm2020/villedemontreal-angular-ui.mjs +1597 -228
  33. package/fesm2020/villedemontreal-angular-ui.mjs.map +1 -1
  34. package/lib/alert/alert.component.d.ts +2 -3
  35. package/lib/avatar/avatar.component.d.ts +26 -0
  36. package/lib/avatar/index.d.ts +2 -0
  37. package/lib/avatar/module.d.ts +8 -0
  38. package/lib/bao.module.d.ts +4 -1
  39. package/lib/breadcrumb/breadcrumb.component.d.ts +1 -1
  40. package/lib/button/button.component.d.ts +1 -1
  41. package/lib/checkbox/checkbox-group.component.d.ts +2 -2
  42. package/lib/checkbox/checkbox.component.d.ts +27 -27
  43. package/lib/core/colors.d.ts +1 -1
  44. package/lib/icon/icon.component.d.ts +11 -11
  45. package/lib/modal/index.d.ts +6 -0
  46. package/lib/modal/modal-animations.d.ts +8 -0
  47. package/lib/modal/modal-config.d.ts +105 -0
  48. package/lib/modal/modal-container.d.ts +106 -0
  49. package/lib/modal/modal-directives.d.ts +25 -0
  50. package/lib/modal/modal-ref.d.ts +91 -0
  51. package/lib/modal/modal.d.ts +91 -0
  52. package/lib/modal/module.d.ts +12 -0
  53. package/lib/radio/radio-group.component.d.ts +19 -19
  54. package/lib/radio/radio.component.d.ts +27 -27
  55. package/lib/shared/enum/display-mode.d.ts +1 -1
  56. package/lib/summary/summary.component.d.ts +5 -5
  57. package/lib/tabs/index.d.ts +2 -0
  58. package/lib/tabs/module.d.ts +8 -0
  59. package/lib/tabs/tabs.component.d.ts +95 -0
  60. package/lib/tag/tag.component.d.ts +1 -1
  61. package/package.json +1 -1
  62. package/public-api.d.ts +4 -0
@@ -0,0 +1,195 @@
1
+ import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
2
+ import { filter, Subject, take } from 'rxjs';
3
+ // Counter for unique modal ids.
4
+ let uniqueId = 0;
5
+ /**
6
+ * Reference to a modal opened via the BaoModalService.
7
+ */
8
+ export class BaoModalRef {
9
+ constructor(_overlayRef, _containerInstance,
10
+ /** Id of the modal. */
11
+ id = `bao-modal-${uniqueId++}`) {
12
+ this._overlayRef = _overlayRef;
13
+ this._containerInstance = _containerInstance;
14
+ this.id = id;
15
+ /** Whether the user is allowed to close the modal. */
16
+ this.disableClose = this._containerInstance._config.disableClose;
17
+ /** Subject for notifying the user that the modal has finished opening. */
18
+ this._afterOpened = new Subject();
19
+ /** Subject for notifying the user that the modal has finished closing. */
20
+ this._afterClosed = new Subject();
21
+ /** Subject for notifying the user that the modal has started closing. */
22
+ this._beforeClosed = new Subject();
23
+ /** Current state of the modal. */
24
+ this._state = 0 /* OPEN */;
25
+ // Pass the id along to the container.
26
+ _containerInstance._id = id;
27
+ // Emit when opening animation completes
28
+ _containerInstance._animationStateChanged
29
+ .pipe(filter(event => event.state === 'opened'), take(1))
30
+ .subscribe(() => {
31
+ this._afterOpened.next();
32
+ this._afterOpened.complete();
33
+ });
34
+ // Dispose overlay when closing animation is complete
35
+ _containerInstance._animationStateChanged
36
+ .pipe(filter(event => event.state === 'closed'), take(1))
37
+ .subscribe(() => {
38
+ clearTimeout(this._closeFallbackTimeout);
39
+ this._finishModalClose();
40
+ });
41
+ _overlayRef.detachments().subscribe(() => {
42
+ this._beforeClosed.next(this._result);
43
+ this._beforeClosed.complete();
44
+ this._afterClosed.next(this._result);
45
+ this._afterClosed.complete();
46
+ this.componentInstance = null;
47
+ this._overlayRef.dispose();
48
+ });
49
+ _overlayRef
50
+ .keydownEvents()
51
+ .pipe(filter(event => {
52
+ return (event.keyCode === ESCAPE &&
53
+ !this.disableClose &&
54
+ !hasModifierKey(event));
55
+ }))
56
+ .subscribe(event => {
57
+ event.preventDefault();
58
+ _closeModalVia(this, 'keyboard');
59
+ });
60
+ _overlayRef.backdropClick().subscribe(async () => {
61
+ if (this.disableClose) {
62
+ await this._containerInstance._recaptureFocus();
63
+ }
64
+ else {
65
+ _closeModalVia(this, 'mouse');
66
+ }
67
+ });
68
+ }
69
+ /**
70
+ * Close the modal.
71
+ * @param modalResult Optional result to return to the modal opener.
72
+ */
73
+ close(modalResult) {
74
+ this._result = modalResult;
75
+ // Transition the backdrop in parallel to the modal.
76
+ this._containerInstance._animationStateChanged
77
+ .pipe(filter(event => event.state === 'closing'), take(1))
78
+ .subscribe(event => {
79
+ this._beforeClosed.next(modalResult);
80
+ this._beforeClosed.complete();
81
+ this._overlayRef.detachBackdrop();
82
+ // The logic that disposes of the overlay depends on the exit animation completing, however
83
+ // it isn't guaranteed if the parent view is destroyed while it's running. Add a fallback
84
+ // timeout which will clean everything up if the animation hasn't fired within the specified
85
+ // amount of time plus 100ms. We don't need to run this outside the NgZone, because for the
86
+ // vast majority of cases the timeout will have been cleared before it has the chance to fire.
87
+ this._closeFallbackTimeout = setTimeout(() => this._finishModalClose(), event.totalTime + 100);
88
+ });
89
+ this._state = 1 /* CLOSING */;
90
+ this._containerInstance._startExitAnimation();
91
+ }
92
+ /**
93
+ * Gets an observable that is notified when the modal is finished opening.
94
+ */
95
+ afterOpened() {
96
+ return this._afterOpened;
97
+ }
98
+ /**
99
+ * Gets an observable that is notified when the modal is finished closing.
100
+ */
101
+ afterClosed() {
102
+ return this._afterClosed;
103
+ }
104
+ /**
105
+ * Gets an observable that is notified when the modal has started closing.
106
+ */
107
+ beforeClosed() {
108
+ return this._beforeClosed;
109
+ }
110
+ /**
111
+ * Gets an observable that emits when the overlay's backdrop has been clicked.
112
+ */
113
+ backdropClick() {
114
+ return this._overlayRef.backdropClick();
115
+ }
116
+ /**
117
+ * Gets an observable that emits when keydown events are targeted on the overlay.
118
+ */
119
+ keydownEvents() {
120
+ return this._overlayRef.keydownEvents();
121
+ }
122
+ /**
123
+ * Updates the dialog's position.
124
+ */
125
+ updatePosition(position) {
126
+ const strategy = this._getPositionStrategy();
127
+ if (position && (position.left || position.right)) {
128
+ position.left
129
+ ? strategy.left(position.left)
130
+ : strategy.right(position.right);
131
+ }
132
+ else {
133
+ strategy.centerHorizontally();
134
+ }
135
+ if (position && (position.top || position.bottom)) {
136
+ position.top
137
+ ? strategy.top(position.top)
138
+ : strategy.bottom(position.bottom);
139
+ }
140
+ else {
141
+ strategy.centerVertically();
142
+ }
143
+ this._overlayRef.updatePosition();
144
+ return this;
145
+ }
146
+ /**
147
+ * Updates the modal's width and height.
148
+ */
149
+ updateSize(width = '', height = '') {
150
+ this._overlayRef.updateSize({ width, height });
151
+ this._overlayRef.updatePosition();
152
+ return this;
153
+ }
154
+ /** Add a CSS class or an array of classes to the overlay pane. */
155
+ addPanelClass(classes) {
156
+ this._overlayRef.addPanelClass(classes);
157
+ return this;
158
+ }
159
+ /** Remove a CSS class or an array of classes from the overlay pane. */
160
+ removePanelClass(classes) {
161
+ this._overlayRef.removePanelClass(classes);
162
+ return this;
163
+ }
164
+ /** Gets the current state of the modal's lifecycle. */
165
+ getState() {
166
+ return this._state;
167
+ }
168
+ /**
169
+ * Finishes the modal close by updating the state of the modal
170
+ * and disposing the overlay.
171
+ */
172
+ _finishModalClose() {
173
+ this._state = 2 /* CLOSED */;
174
+ this._overlayRef.dispose();
175
+ }
176
+ /** Fetches the position strategy object from the overlay ref. */
177
+ _getPositionStrategy() {
178
+ return this._overlayRef.getConfig()
179
+ .positionStrategy;
180
+ }
181
+ }
182
+ /**
183
+ * Closes the modal with the specified interaction type. This is currently not part of
184
+ * `BaoModalRef` as that would conflict with custom modal ref mocks provided in tests.
185
+ * More details. See: https://github.com/angular/components/pull/9257#issuecomment-651342226.
186
+ */
187
+ export function _closeModalVia(ref, interactionType, result) {
188
+ // Some mock modal ref instances in tests do not have the `_containerInstance` property.
189
+ // For those, we keep the behavior as is and do not deal with the interaction type.
190
+ if (ref._containerInstance !== undefined) {
191
+ ref._containerInstance._closeInteractionType = interactionType;
192
+ }
193
+ return ref.close(result);
194
+ }
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11aS9zcmMvbGliL21vZGFsL21vZGFsLXJlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxNQUFNLEVBQWMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUl6RCxnQ0FBZ0M7QUFDaEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBU2pCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUEwQnRCLFlBQ1UsV0FBdUIsRUFDeEIsa0JBQTBDO0lBQ2pELHVCQUF1QjtJQUNkLEtBQWEsYUFBYSxRQUFRLEVBQUUsRUFBRTtRQUh2QyxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN4Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXdCO1FBRXhDLE9BQUUsR0FBRixFQUFFLENBQW9DO1FBMUJqRCxzREFBc0Q7UUFDL0MsaUJBQVksR0FDakIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFFL0MsMEVBQTBFO1FBQ3pELGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVwRCwwRUFBMEU7UUFDekQsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBaUIsQ0FBQztRQUU3RCx5RUFBeUU7UUFDeEQsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBaUIsQ0FBQztRQVE5RCxrQ0FBa0M7UUFDMUIsV0FBTSxnQkFBc0I7UUFRbEMsc0NBQXNDO1FBQ3RDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFNUIsd0NBQXdDO1FBQ3hDLGtCQUFrQixDQUFDLHNCQUFzQjthQUN0QyxJQUFJLENBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFD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QUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGlFQUFpRTtJQUN6RCxvQkFBb0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTthQUNoQyxnQkFBMEMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsR0FBbUIsRUFDbkIsZUFBNEIsRUFDNUIsTUFBVTtJQUVWLHdGQUF3RjtJQUN4RixtRkFBbUY7SUFDbkYsSUFBSSxHQUFHLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFO1FBQ3hDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsR0FBRyxlQUFlLENBQUM7S0FDaEU7SUFDRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVmlsbGUgZGUgTW9udHJlYWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqL1xuaW1wb3J0IHsgRm9jdXNPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBFU0NBUEUsIGhhc01vZGlmaWVyS2V5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3ksIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBmaWx0ZXIsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1vZGFsUG9zaXRpb24gfSBmcm9tICcuL21vZGFsLWNvbmZpZyc7XG5pbXBvcnQgeyBfQmFvTW9kYWxDb250YWluZXJCYXNlIH0gZnJvbSAnLi9tb2RhbC1jb250YWluZXInO1xuXG4vLyBDb3VudGVyIGZvciB1bmlxdWUgbW9kYWwgaWRzLlxubGV0IHVuaXF1ZUlkID0gMDtcblxuLyoqIFBvc3NpYmxlIHN0YXRlcyBvZiB0aGUgbGlmZWN5Y2xlIG9mIGEgbW9kYWwuICovXG5leHBvcnQgY29uc3QgZW51bSBCYW9Nb2RhbFN0YXRlIHtcbiAgT1BFTixcbiAgQ0xPU0lORyxcbiAgQ0xPU0VEXG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgbW9kYWwgb3BlbmVkIHZpYSB0aGUgQmFvTW9kYWxTZXJ2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgQmFvTW9kYWxSZWY8VCwgUiA9IHVua25vd24+IHtcbiAgLyoqIFRoZSBpbnN0YW5jZSBvZiBjb21wb25lbnQgb3BlbmVkIGludG8gdGhlIG1vZGFsLiAqL1xuICBwdWJsaWMgY29tcG9uZW50SW5zdGFuY2U6IFQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBjbG9zZSB0aGUgbW9kYWwuICovXG4gIHB1YmxpYyBkaXNhYmxlQ2xvc2U6IGJvb2xlYW4gfCB1bmRlZmluZWQgPVxuICAgIHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9jb25maWcuZGlzYWJsZUNsb3NlO1xuXG4gIC8qKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB0aGUgbW9kYWwgaGFzIGZpbmlzaGVkIG9wZW5pbmcuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FmdGVyT3BlbmVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiogU3ViamVjdCBmb3Igbm90aWZ5aW5nIHRoZSB1c2VyIHRoYXQgdGhlIG1vZGFsIGhhcyBmaW5pc2hlZCBjbG9zaW5nLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZnRlckNsb3NlZCA9IG5ldyBTdWJqZWN0PFIgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqIFN1YmplY3QgZm9yIG5vdGlmeWluZyB0aGUgdXNlciB0aGF0IHRoZSBtb2RhbCBoYXMgc3RhcnRlZCBjbG9zaW5nLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9iZWZvcmVDbG9zZWQgPSBuZXcgU3ViamVjdDxSIHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qKiBSZXN1bHQgdG8gYmUgcGFzc2VkIHRvIGFmdGVyQ2xvc2VkLiAqL1xuICBwcml2YXRlIF9yZXN1bHQ6IFIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEhhbmRsZSB0byB0aGUgdGltZW91dCB0aGF0J3MgcnVubmluZyBhcyBhIGZhbGxiYWNrIGluIGNhc2UgdGhlIGV4aXQgYW5pbWF0aW9uIGRvZXNuJ3QgZmlyZS4gKi9cbiAgcHJpdmF0ZSBfY2xvc2VGYWxsYmFja1RpbWVvdXQ6IGFueTtcblxuICAvKiogQ3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kYWwuICovXG4gIHByaXZhdGUgX3N0YXRlID0gQmFvTW9kYWxTdGF0ZS5PUEVOO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgcHVibGljIF9jb250YWluZXJJbnN0YW5jZTogX0Jhb01vZGFsQ29udGFpbmVyQmFzZSxcbiAgICAvKiogSWQgb2YgdGhlIG1vZGFsLiAqL1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmcgPSBgYmFvLW1vZGFsLSR7dW5pcXVlSWQrK31gXG4gICkge1xuICAgIC8vIFBhc3MgdGhlIGlkIGFsb25nIHRvIHRoZSBjb250YWluZXIuXG4gICAgX2NvbnRhaW5lckluc3RhbmNlLl9pZCA9IGlkO1xuXG4gICAgLy8gRW1pdCB3aGVuIG9wZW5pbmcgYW5pbWF0aW9uIGNvbXBsZXRlc1xuICAgIF9jb250YWluZXJJbnN0YW5jZS5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnN0YXRlID09PSAnb3BlbmVkJyksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9hZnRlck9wZW5lZC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2FmdGVyT3BlbmVkLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcblxuICAgIC8vIERpc3Bvc2Ugb3ZlcmxheSB3aGVuIGNsb3NpbmcgYW5pbWF0aW9uIGlzIGNvbXBsZXRlXG4gICAgX2NvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQuc3RhdGUgPT09ICdjbG9zZWQnKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZUZhbGxiYWNrVGltZW91dCk7XG4gICAgICAgIHRoaXMuX2ZpbmlzaE1vZGFsQ2xvc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgX292ZXJsYXlSZWYuZGV0YWNobWVudHMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fYmVmb3JlQ2xvc2VkLm5leHQodGhpcy5fcmVzdWx0KTtcbiAgICAgIHRoaXMuX2JlZm9yZUNsb3NlZC5jb21wbGV0ZSgpO1xuICAgICAgdGhpcy5fYWZ0ZXJDbG9zZWQubmV4dCh0aGlzLl9yZXN1bHQpO1xuICAgICAgdGhpcy5fYWZ0ZXJDbG9zZWQuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgPSBudWxsO1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgfSk7XG5cbiAgICBfb3ZlcmxheVJlZlxuICAgICAgLmtleWRvd25FdmVudHMoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihldmVudCA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSAmJlxuICAgICAgICAgICAgIXRoaXMuZGlzYWJsZUNsb3NlICYmXG4gICAgICAgICAgICAhaGFzTW9kaWZpZXJLZXkoZXZlbnQpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBfY2xvc2VNb2RhbFZpYSh0aGlzLCAna2V5Ym9hcmQnKTtcbiAgICAgIH0pO1xuXG4gICAgX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlQ2xvc2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX3JlY2FwdHVyZUZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfY2xvc2VNb2RhbFZpYSh0aGlzLCAnbW91c2UnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgbW9kYWwuXG4gICAqIEBwYXJhbSBtb2RhbFJlc3VsdCBPcHRpb25hbCByZXN1bHQgdG8gcmV0dXJuIHRvIHRoZSBtb2RhbCBvcGVuZXIuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UobW9kYWxSZXN1bHQ/OiBSKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzdWx0ID0gbW9kYWxSZXN1bHQ7XG5cbiAgICAvLyBUcmFuc2l0aW9uIHRoZSBiYWNrZHJvcCBpbiBwYXJhbGxlbCB0byB0aGUgbW9kYWwuXG4gICAgdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIHRoaXMuX2JlZm9yZUNsb3NlZC5uZXh0KG1vZGFsUmVzdWx0KTtcbiAgICAgICAgdGhpcy5fYmVmb3JlQ2xvc2VkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoQmFja2Ryb3AoKTtcbiAgICAgICAgLy8gVGhlIGxvZ2ljIHRoYXQgZGlzcG9zZXMgb2YgdGhlIG92ZXJsYXkgZGVwZW5kcyBvbiB0aGUgZXhpdCBhbmltYXRpb24gY29tcGxldGluZywgaG93ZXZlclxuICAgICAgICAvLyBpdCBpc24ndCBndWFyYW50ZWVkIGlmIHRoZSBwYXJlbnQgdmlldyBpcyBkZXN0cm95ZWQgd2hpbGUgaXQncyBydW5uaW5nLiBBZGQgYSBmYWxsYmFja1xuICAgICAgICAvLyB0aW1lb3V0IHdoaWNoIHdpbGwgY2xlYW4gZXZlcnl0aGluZyB1cCBpZiB0aGUgYW5pbWF0aW9uIGhhc24ndCBmaXJlZCB3aXRoaW4gdGhlIHNwZWNpZmllZFxuICAgICAgICAvLyBhbW91bnQgb2YgdGltZSBwbHVzIDEwMG1zLiBXZSBkb24ndCBuZWVkIHRvIHJ1biB0aGlzIG91dHNpZGUgdGhlIE5nWm9uZSwgYmVjYXVzZSBmb3IgdGhlXG4gICAgICAgIC8vIHZhc3QgbWFqb3JpdHkgb2YgY2FzZXMgdGhlIHRpbWVvdXQgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBiZWZvcmUgaXQgaGFzIHRoZSBjaGFuY2UgdG8gZmlyZS5cbiAgICAgICAgdGhpcy5fY2xvc2VGYWxsYmFja1RpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICgpID0+IHRoaXMuX2ZpbmlzaE1vZGFsQ2xvc2UoKSxcbiAgICAgICAgICAoZXZlbnQudG90YWxUaW1lIGFzIG51bWJlcikgKyAxMDBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fc3RhdGUgPSBCYW9Nb2RhbFN0YXRlLkNMT1NJTkc7XG4gICAgdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX3N0YXJ0RXhpdEFuaW1hdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIG1vZGFsIGlzIGZpbmlzaGVkIG9wZW5pbmcuXG4gICAqL1xuICBwdWJsaWMgYWZ0ZXJPcGVuZWQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FmdGVyT3BlbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIG1vZGFsIGlzIGZpbmlzaGVkIGNsb3NpbmcuXG4gICAqL1xuICBwdWJsaWMgYWZ0ZXJDbG9zZWQoKTogT2JzZXJ2YWJsZTxSIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FmdGVyQ2xvc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIG1vZGFsIGhhcyBzdGFydGVkIGNsb3NpbmcuXG4gICAqL1xuICBwdWJsaWMgYmVmb3JlQ2xvc2VkKCk6IE9ic2VydmFibGU8UiB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLl9iZWZvcmVDbG9zZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgb3ZlcmxheSdzIGJhY2tkcm9wIGhhcyBiZWVuIGNsaWNrZWQuXG4gICAqL1xuICBwdWJsaWMgYmFja2Ryb3BDbGljaygpOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiBrZXlkb3duIGV2ZW50cyBhcmUgdGFyZ2V0ZWQgb24gdGhlIG92ZXJsYXkuXG4gICAqL1xuICBwdWJsaWMga2V5ZG93bkV2ZW50cygpOiBPYnNlcnZhYmxlPEtleWJvYXJkRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGlhbG9nJ3MgcG9zaXRpb24uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUG9zaXRpb24ocG9zaXRpb24/OiBNb2RhbFBvc2l0aW9uKTogdGhpcyB7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLl9nZXRQb3NpdGlvblN0cmF0ZWd5KCk7XG5cbiAgICBpZiAocG9zaXRpb24gJiYgKHBvc2l0aW9uLmxlZnQgfHwgcG9zaXRpb24ucmlnaHQpKSB7XG4gICAgICBwb3NpdGlvbi5sZWZ0XG4gICAgICAgID8gc3RyYXRlZ3kubGVmdChwb3NpdGlvbi5sZWZ0KVxuICAgICAgICA6IHN0cmF0ZWd5LnJpZ2h0KHBvc2l0aW9uLnJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyYXRlZ3kuY2VudGVySG9yaXpvbnRhbGx5KCk7XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uICYmIChwb3NpdGlvbi50b3AgfHwgcG9zaXRpb24uYm90dG9tKSkge1xuICAgICAgcG9zaXRpb24udG9wXG4gICAgICAgID8gc3RyYXRlZ3kudG9wKHBvc2l0aW9uLnRvcClcbiAgICAgICAgOiBzdHJhdGVneS5ib3R0b20ocG9zaXRpb24uYm90dG9tKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyYXRlZ3kuY2VudGVyVmVydGljYWxseSgpO1xuICAgIH1cblxuICAgIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIG1vZGFsJ3Mgd2lkdGggYW5kIGhlaWdodC5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVTaXplKHdpZHRoID0gJycsIGhlaWdodCA9ICcnKTogdGhpcyB7XG4gICAgdGhpcy5fb3ZlcmxheVJlZi51cGRhdGVTaXplKHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgICB0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQWRkIGEgQ1NTIGNsYXNzIG9yIGFuIGFycmF5IG9mIGNsYXNzZXMgdG8gdGhlIG92ZXJsYXkgcGFuZS4gKi9cbiAgcHVibGljIGFkZFBhbmVsQ2xhc3MoY2xhc3Nlczogc3RyaW5nIHwgc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLl9vdmVybGF5UmVmLmFkZFBhbmVsQ2xhc3MoY2xhc3Nlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgQ1NTIGNsYXNzIG9yIGFuIGFycmF5IG9mIGNsYXNzZXMgZnJvbSB0aGUgb3ZlcmxheSBwYW5lLiAqL1xuICBwdWJsaWMgcmVtb3ZlUGFuZWxDbGFzcyhjbGFzc2VzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMuX292ZXJsYXlSZWYucmVtb3ZlUGFuZWxDbGFzcyhjbGFzc2VzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2RhbCdzIGxpZmVjeWNsZS4gKi9cbiAgcHVibGljIGdldFN0YXRlKCk6IEJhb01vZGFsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyB0aGUgbW9kYWwgY2xvc2UgYnkgdXBkYXRpbmcgdGhlIHN0YXRlIG9mIHRoZSBtb2RhbFxuICAgKiBhbmQgZGlzcG9zaW5nIHRoZSBvdmVybGF5LlxuICAgKi9cbiAgcHJpdmF0ZSBfZmluaXNoTW9kYWxDbG9zZSgpIHtcbiAgICB0aGlzLl9zdGF0ZSA9IEJhb01vZGFsU3RhdGUuQ0xPU0VEO1xuICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqIEZldGNoZXMgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5IG9iamVjdCBmcm9tIHRoZSBvdmVybGF5IHJlZi4gKi9cbiAgcHJpdmF0ZSBfZ2V0UG9zaXRpb25TdHJhdGVneSgpOiBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKVxuICAgICAgLnBvc2l0aW9uU3RyYXRlZ3kgYXMgR2xvYmFsUG9zaXRpb25TdHJhdGVneTtcbiAgfVxufVxuXG4vKipcbiAqIENsb3NlcyB0aGUgbW9kYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVyYWN0aW9uIHR5cGUuIFRoaXMgaXMgY3VycmVudGx5IG5vdCBwYXJ0IG9mXG4gKiBgQmFvTW9kYWxSZWZgIGFzIHRoYXQgd291bGQgY29uZmxpY3Qgd2l0aCBjdXN0b20gbW9kYWwgcmVmIG1vY2tzIHByb3ZpZGVkIGluIHRlc3RzLlxuICogTW9yZSBkZXRhaWxzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvcHVsbC85MjU3I2lzc3VlY29tbWVudC02NTEzNDIyMjYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2xvc2VNb2RhbFZpYTxSPihcbiAgcmVmOiBCYW9Nb2RhbFJlZjxSPixcbiAgaW50ZXJhY3Rpb25UeXBlOiBGb2N1c09yaWdpbixcbiAgcmVzdWx0PzogUlxuKSB7XG4gIC8vIFNvbWUgbW9jayBtb2RhbCByZWYgaW5zdGFuY2VzIGluIHRlc3RzIGRvIG5vdCBoYXZlIHRoZSBgX2NvbnRhaW5lckluc3RhbmNlYCBwcm9wZXJ0eS5cbiAgLy8gRm9yIHRob3NlLCB3ZSBrZWVwIHRoZSBiZWhhdmlvciBhcyBpcyBhbmQgZG8gbm90IGRlYWwgd2l0aCB0aGUgaW50ZXJhY3Rpb24gdHlwZS5cbiAgaWYgKHJlZi5fY29udGFpbmVySW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlZi5fY29udGFpbmVySW5zdGFuY2UuX2Nsb3NlSW50ZXJhY3Rpb25UeXBlID0gaW50ZXJhY3Rpb25UeXBlO1xuICB9XG4gIHJldHVybiByZWYuY2xvc2UocmVzdWx0KTtcbn1cbiJdfQ==
@@ -0,0 +1,291 @@
1
+ /*
2
+ * Copyright (c) 2022 Ville de Montreal. All rights reserved.
3
+ * Licensed under the MIT license.
4
+ * See LICENSE file in the project root for full license information.
5
+ */
6
+ /* eslint-disable @typescript-eslint/no-unsafe-return*/
7
+ import { Directive, Inject, Injectable, InjectionToken, Injector, Optional, SkipSelf, TemplateRef } from '@angular/core';
8
+ import { defer, startWith, Subject, Subscription } from 'rxjs';
9
+ import { BaoModalContainer } from './modal-container';
10
+ import { BaoModalRef } from './modal-ref';
11
+ import { BaoModalInitialConfig, eModalDesktopWidthSize, eModalMobileWidthSize } from './modal-config';
12
+ import { OverlayConfig } from '@angular/cdk/overlay';
13
+ import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
14
+ import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/cdk/overlay";
17
+ /** Injection token that can be used to access the data that was passed in to a modal. */
18
+ export const BAO_MODAL_DATA = new InjectionToken('BaoModalData');
19
+ export class BaoModalBase {
20
+ constructor(_overlay, _injector, _parentModal, _overlayContainer, _modalRefConstructor, _modalContainerType, _modalDataToken, _animationMode) {
21
+ this._overlay = _overlay;
22
+ this._injector = _injector;
23
+ this._parentModal = _parentModal;
24
+ this._overlayContainer = _overlayContainer;
25
+ this._modalRefConstructor = _modalRefConstructor;
26
+ this._modalContainerType = _modalContainerType;
27
+ this._modalDataToken = _modalDataToken;
28
+ this._animationMode = _animationMode;
29
+ this.afterAllClosed = defer(() => this.openModals.length
30
+ ? this.getAfterAllClosed()
31
+ : this.getAfterAllClosed().pipe(startWith(undefined)));
32
+ this._openModalsAtThisLevel = [];
33
+ this._afterAllClosedAtThisLevel = new Subject();
34
+ this._afterOpenedAtThisLevel = new Subject();
35
+ this._ariaHiddenElements = new Map();
36
+ this._modalAnimatingOpen = false;
37
+ }
38
+ /** Keeps track of the currently-open modals. */
39
+ get openModals() {
40
+ return this._parentModal
41
+ ? this._parentModal.openModals
42
+ : this._openModalsAtThisLevel;
43
+ }
44
+ /** Stream that emits when a modal has been opened. */
45
+ get afterOpened() {
46
+ // Maybe typescript version difference
47
+ return this._parentModal
48
+ ? this._parentModal.afterOpened
49
+ : this._afterOpenedAtThisLevel;
50
+ }
51
+ getAfterAllClosed() {
52
+ const parent = this._parentModal;
53
+ return (parent ? parent.getAfterAllClosed() : this._afterAllClosedAtThisLevel);
54
+ }
55
+ /**
56
+ * Opens a modal modal containing the given template.
57
+ */
58
+ open(componentOrTemplateRef, config) {
59
+ const conf = this._applyConfigDefaults(config, new BaoModalInitialConfig());
60
+ // If there is a modal that is currently animating open, return the MatmodalRef of that modal
61
+ if (this._modalAnimatingOpen) {
62
+ return this._lastModalRef;
63
+ }
64
+ const overlayRef = this._createOverlay(conf);
65
+ const modalContainer = this._attachModalContainer(overlayRef, conf);
66
+ if (this._animationMode !== 'NoopAnimations') {
67
+ const animationStateSubscription = modalContainer._animationStateChanged.subscribe(modalAnimationEvent => {
68
+ if (modalAnimationEvent.state === 'opening') {
69
+ this._modalAnimatingOpen = true;
70
+ }
71
+ if (modalAnimationEvent.state === 'opened') {
72
+ this._modalAnimatingOpen = false;
73
+ animationStateSubscription.unsubscribe();
74
+ }
75
+ });
76
+ if (!this._animationStateSubscriptions) {
77
+ this._animationStateSubscriptions = new Subscription();
78
+ }
79
+ this._animationStateSubscriptions.add(animationStateSubscription);
80
+ }
81
+ const modalRef = this._attachModalContent(componentOrTemplateRef, modalContainer, overlayRef, conf);
82
+ this._lastModalRef = modalRef;
83
+ // If this is the first modal that we're opening, hide all the non-overlay content.
84
+ if (!this.openModals.length) {
85
+ this._hideNonModalContentFromAssistiveTechnology();
86
+ }
87
+ this.openModals.push(modalRef);
88
+ modalRef.afterClosed().subscribe(() => this._removeOpenModal(modalRef));
89
+ this.afterOpened.next(modalRef);
90
+ // Notify the modal container that the content has been attached.
91
+ modalContainer._initializeWithAttachedContent();
92
+ return modalRef;
93
+ }
94
+ /**
95
+ * Closes all of the currently-open modals.
96
+ */
97
+ closeAll() {
98
+ this._closeModals(this.openModals);
99
+ }
100
+ /**
101
+ * Finds an open modal by its id.
102
+ */
103
+ getModalById(id) {
104
+ return this.openModals.find(modal => modal.id === id);
105
+ }
106
+ ngOnDestroy() {
107
+ // Only close the modals at this level on destroy
108
+ // since the parent service may still be active.
109
+ this._closeModals(this._openModalsAtThisLevel);
110
+ this._afterAllClosedAtThisLevel.complete();
111
+ this._afterOpenedAtThisLevel.complete();
112
+ // Clean up any subscriptions to modals that never finished opening.
113
+ if (this._animationStateSubscriptions) {
114
+ this._animationStateSubscriptions.unsubscribe();
115
+ }
116
+ }
117
+ /**
118
+ * Creates the overlay into which the modal will be loaded.
119
+ */
120
+ _createOverlay(config) {
121
+ const overlayConfig = this._getOverlayConfig(config);
122
+ return this._overlay.create(overlayConfig);
123
+ }
124
+ /**
125
+ * Creates an overlay config from a modal config.
126
+ */
127
+ _getOverlayConfig(config) {
128
+ const state = new OverlayConfig({
129
+ positionStrategy: this._overlay.position().global(),
130
+ scrollStrategy: this._overlay.scrollStrategies.block(),
131
+ panelClass: config.panelClass,
132
+ hasBackdrop: config.hasBackdrop,
133
+ disposeOnNavigation: config.closeOnNavigation
134
+ });
135
+ if (config.backdropClass) {
136
+ state.backdropClass = config.backdropClass;
137
+ }
138
+ return state;
139
+ }
140
+ /**
141
+ * Attaches a modal container to a modal's already-created overlay.
142
+ */
143
+ _attachModalContainer(overlay, config) {
144
+ const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
145
+ const injector = Injector.create({
146
+ parent: userInjector || this._injector,
147
+ providers: [{ provide: BaoModalInitialConfig, useValue: config }]
148
+ });
149
+ const containerPortal = new ComponentPortal(this._modalContainerType, config.viewContainerRef, injector);
150
+ const containerRef = overlay.attach(containerPortal);
151
+ return containerRef.instance;
152
+ }
153
+ /**
154
+ * Attaches the user-provided component to the already-created modal container.
155
+ */
156
+ _attachModalContent(componentOrTemplateRef, modalContainer, overlayRef, config) {
157
+ // Create a reference to the modal we're creating in order to give the user a handle
158
+ // to modify and close it.
159
+ const modalRef = new this._modalRefConstructor(overlayRef, modalContainer, config.id);
160
+ if (componentOrTemplateRef instanceof TemplateRef) {
161
+ modalContainer.attachTemplatePortal(new TemplatePortal(componentOrTemplateRef, null, {
162
+ $implicit: config.data,
163
+ modalRef
164
+ }));
165
+ }
166
+ else {
167
+ const injector = this._createInjector(config, modalRef, modalContainer);
168
+ const contentRef = modalContainer.attachComponentPortal(new ComponentPortal(componentOrTemplateRef, config.viewContainerRef, injector));
169
+ modalRef.componentInstance = contentRef.instance;
170
+ }
171
+ modalRef
172
+ .updateSize(config.width, config.height)
173
+ .updatePosition(config.position);
174
+ return modalRef;
175
+ }
176
+ /**
177
+ * Creates a custom injector to be used inside the modal. This allows a component loaded inside
178
+ * of a modal to close itself and, optionally, to return a value.
179
+ */
180
+ _createInjector(config, modalRef, modalContainer) {
181
+ const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
182
+ // The modal container should be provided as the modal container and the modal's
183
+ // content are created out of the same `ViewContainerRef` and as such, are siblings
184
+ // for injector purposes. To allow the hierarchy that is expected, the modal
185
+ // container is explicitly provided in the injector.
186
+ const providers = [
187
+ { provide: this._modalContainerType, useValue: modalContainer },
188
+ { provide: this._modalDataToken, useValue: config.data },
189
+ { provide: this._modalRefConstructor, useValue: modalRef }
190
+ ];
191
+ return Injector.create({
192
+ parent: userInjector || this._injector,
193
+ providers
194
+ });
195
+ }
196
+ /**
197
+ * Removes a modal from the array of open modals.
198
+ */
199
+ _removeOpenModal(modalRef) {
200
+ const index = this.openModals.indexOf(modalRef);
201
+ if (index > -1) {
202
+ this.openModals.splice(index, 1);
203
+ // If all the modals were closed, remove/restore the `aria-hidden`
204
+ // to a the siblings and emit to the `afterAllClosed` stream.
205
+ if (!this.openModals.length) {
206
+ this._ariaHiddenElements.forEach((previousValue, element) => {
207
+ if (previousValue) {
208
+ element.setAttribute('aria-hidden', previousValue);
209
+ }
210
+ else {
211
+ element.removeAttribute('aria-hidden');
212
+ }
213
+ });
214
+ this._ariaHiddenElements.clear();
215
+ this.getAfterAllClosed().next();
216
+ }
217
+ }
218
+ }
219
+ /**
220
+ * Hides all of the content that isn't an overlay from assistive technology.
221
+ */
222
+ _hideNonModalContentFromAssistiveTechnology() {
223
+ const overlayContainer = this._overlayContainer.getContainerElement();
224
+ // Ensure that the overlay container is attached to the DOM.
225
+ if (overlayContainer.parentElement) {
226
+ const siblings = overlayContainer.parentElement.children;
227
+ for (let i = siblings.length - 1; i > -1; i--) {
228
+ const sibling = siblings[i];
229
+ if (sibling !== overlayContainer &&
230
+ sibling.nodeName !== 'SCRIPT' &&
231
+ sibling.nodeName !== 'STYLE' &&
232
+ !sibling.hasAttribute('aria-live')) {
233
+ this._ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));
234
+ sibling.setAttribute('aria-hidden', 'true');
235
+ }
236
+ }
237
+ }
238
+ }
239
+ /** Closes all of the modals in an array. */
240
+ _closeModals(modals) {
241
+ let i = modals.length;
242
+ while (i--) {
243
+ modals[i].close();
244
+ }
245
+ }
246
+ /**
247
+ * Applies default options to the modal config.
248
+ */
249
+ _applyConfigDefaults(config, defaultOptions) {
250
+ const desktopClass = config?.size || eModalDesktopWidthSize.SMALL;
251
+ const mobilClass = config?.mobileSize || eModalMobileWidthSize.FULL;
252
+ const data = config?.data || null;
253
+ const ariaLabelledBy = config?.ariaLabelledBy || null;
254
+ return {
255
+ ...defaultOptions,
256
+ ...{
257
+ panelClass: [desktopClass, mobilClass],
258
+ ariaLabelledBy,
259
+ data
260
+ }
261
+ };
262
+ }
263
+ }
264
+ BaoModalBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModalBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
265
+ BaoModalBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaoModalBase, ngImport: i0 });
266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModalBase, decorators: [{
267
+ type: Directive
268
+ }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }, { type: undefined }, { type: i1.OverlayContainer }, { type: i0.Type }, { type: i0.Type }, { type: i0.InjectionToken }, { type: undefined }]; } });
269
+ /**
270
+ * Service to open modal.
271
+ */
272
+ export class BaoModal extends BaoModalBase {
273
+ constructor(overlay, injector, parentModal, overlayContainer, animationMode) {
274
+ super(overlay, injector, parentModal, overlayContainer, BaoModalRef, BaoModalContainer, BAO_MODAL_DATA, animationMode);
275
+ }
276
+ }
277
+ BaoModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModal, deps: [{ token: i1.Overlay }, { token: i0.Injector }, { token: BaoModal, optional: true, skipSelf: true }, { token: i1.OverlayContainer }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
278
+ BaoModal.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModal });
279
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModal, decorators: [{
280
+ type: Injectable
281
+ }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }, { type: BaoModal, decorators: [{
282
+ type: Optional
283
+ }, {
284
+ type: SkipSelf
285
+ }] }, { type: i1.OverlayContainer }, { type: undefined, decorators: [{
286
+ type: Optional
287
+ }, {
288
+ type: Inject,
289
+ args: [ANIMATION_MODULE_TYPE]
290
+ }] }]; } });
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXVpL3NyYy9saWIvbW9kYWwvbW9kYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILHVEQUF1RDtBQUN2RCxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsY0FBYyxFQUNkLFFBQVEsRUFFUixRQUFRLEVBQ1IsUUFBUSxFQUVSLFdBQVcsRUFFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFjLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBMEIsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFFTCxxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUN0QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFHTCxhQUFhLEVBR2QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7QUFFN0UseUZBQXlGO0FBQ3pGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBVSxjQUFjLENBQUMsQ0FBQztBQUcxRSxNQUFNLE9BQWdCLFlBQVk7SUFtQmhDLFlBQ1UsUUFBaUIsRUFDakIsU0FBbUIsRUFDbkIsWUFBeUMsRUFDekMsaUJBQW1DLEVBQ25DLG9CQUFnRCxFQUNoRCxtQkFBNEIsRUFDNUIsZUFBd0MsRUFDeEMsY0FBdUQ7UUFQdkQsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixjQUFTLEdBQVQsU0FBUyxD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QUFRLEVBQ1IsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxhQUFhLENBQ2QsQ0FBQztJQUNKLENBQUM7O3FHQXBCVSxRQUFRLGlFQUlvQixRQUFRLDZFQUdyQyxxQkFBcUI7eUdBUHBCLFFBQVE7MkZBQVIsUUFBUTtrQkFEcEIsVUFBVTt1R0FLOEIsUUFBUTswQkFBNUMsUUFBUTs7MEJBQUksUUFBUTs7MEJBRXBCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMiBWaWxsZSBkZSBNb250cmVhbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIFNlZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtcmV0dXJuKi9cbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFNraXBTZWxmLFxuICBTdGF0aWNQcm92aWRlcixcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWZlciwgT2JzZXJ2YWJsZSwgc3RhcnRXaXRoLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJhb01vZGFsQ29udGFpbmVyLCBfQmFvTW9kYWxDb250YWluZXJCYXNlIH0gZnJvbSAnLi9tb2RhbC1jb250YWluZXInO1xuaW1wb3J0IHsgQmFvTW9kYWxSZWYgfSBmcm9tICcuL21vZGFsLXJlZic7XG5pbXBvcnQge1xuICBCYW9Nb2RhbENvbmZpZyxcbiAgQmFvTW9kYWxJbml0aWFsQ29uZmlnLFxuICBlTW9kYWxEZXNrdG9wV2lkdGhTaXplLFxuICBlTW9kYWxNb2JpbGVXaWR0aFNpemVcbn0gZnJvbSAnLi9tb2RhbC1jb25maWcnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50VHlwZSxcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheUNvbmZpZyxcbiAgT3ZlcmxheUNvbnRhaW5lcixcbiAgT3ZlcmxheVJlZlxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwsIFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBBTklNQVRJT05fTU9EVUxFX1RZUEUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMnO1xuXG4vKiogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCBpbiB0byBhIG1vZGFsLiAqL1xuZXhwb3J0IGNvbnN0IEJBT19NT0RBTF9EQVRBID0gbmV3IEluamVjdGlvblRva2VuPHVua25vd24+KCdCYW9Nb2RhbERhdGEnKTtcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFvTW9kYWxCYXNlPEMgZXh0ZW5kcyBfQmFvTW9kYWxDb250YWluZXJCYXNlPlxuICBpbXBsZW1lbnRzIE9uRGVzdHJveVxue1xuICBwdWJsaWMgcmVhZG9ubHkgYWZ0ZXJBbGxDbG9zZWQ6IE9ic2VydmFibGU8dm9pZD4gPSBkZWZlcigoKSA9PlxuICAgIHRoaXMub3Blbk1vZGFscy5sZW5ndGhcbiAgICAgID8gdGhpcy5nZXRBZnRlckFsbENsb3NlZCgpXG4gICAgICA6IHRoaXMuZ2V0QWZ0ZXJBbGxDbG9zZWQoKS5waXBlKHN0YXJ0V2l0aCh1bmRlZmluZWQpKVxuICApO1xuXG4gIHByaXZhdGUgX29wZW5Nb2RhbHNBdFRoaXNMZXZlbDogQmFvTW9kYWxSZWY8dW5rbm93bj5bXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbCA9IG5ldyBTdWJqZWN0PFxuICAgIEJhb01vZGFsUmVmPHVua25vd24+XG4gID4oKTtcbiAgcHJpdmF0ZSBfYXJpYUhpZGRlbkVsZW1lbnRzID0gbmV3IE1hcDxFbGVtZW50LCBzdHJpbmcgfCBudWxsPigpO1xuICBwcml2YXRlIF9tb2RhbEFuaW1hdGluZ09wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYW5pbWF0aW9uU3RhdGVTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX2xhc3RNb2RhbFJlZjogQmFvTW9kYWxSZWY8dW5rbm93bj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBfcGFyZW50TW9kYWw6IEJhb01vZGFsQmFzZTxDPiB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIF9vdmVybGF5Q29udGFpbmVyOiBPdmVybGF5Q29udGFpbmVyLFxuICAgIHByaXZhdGUgX21vZGFsUmVmQ29uc3RydWN0b3I6IFR5cGU8QmFvTW9kYWxSZWY8dW5rbm93bj4+LFxuICAgIHByaXZhdGUgX21vZGFsQ29udGFpbmVyVHlwZTogVHlwZTxDPixcbiAgICBwcml2YXRlIF9tb2RhbERhdGFUb2tlbjogSW5qZWN0aW9uVG9rZW48dW5rbm93bj4sXG4gICAgcHJpdmF0ZSBfYW5pbWF0aW9uTW9kZT86ICdOb29wQW5pbWF0aW9ucycgfCAnQnJvd3NlckFuaW1hdGlvbnMnXG4gICkge31cblxuICAvKiogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnRseS1vcGVuIG1vZGFscy4gKi9cbiAgcHVibGljIGdldCBvcGVuTW9kYWxzKCk6IEJhb01vZGFsUmVmPHVua25vd24+W10ge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRNb2RhbFxuICAgICAgPyB0aGlzLl9wYXJlbnRNb2RhbC5vcGVuTW9kYWxzXG4gICAgICA6IHRoaXMuX29wZW5Nb2RhbHNBdFRoaXNMZXZlbDtcbiAgfVxuXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGEgbW9kYWwgaGFzIGJlZW4gb3BlbmVkLiAqL1xuICBwdWJsaWMgZ2V0IGFmdGVyT3BlbmVkKCk6IFN1YmplY3Q8QmFvTW9kYWxSZWY8dW5rbm93bj4+IHtcbiAgICAvLyBNYXliZSB0eXBlc2NyaXB0IHZlcnNpb24gZGlmZmVyZW5jZVxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRNb2RhbFxuICAgICAgPyB0aGlzLl9wYXJlbnRNb2RhbC5hZnRlck9wZW5lZFxuICAgICAgOiB0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsO1xuICB9XG5cbiAgcHVibGljIGdldEFmdGVyQWxsQ2xvc2VkKCk6IFN1YmplY3Q8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3BhcmVudE1vZGFsO1xuICAgIHJldHVybiAoXG4gICAgICBwYXJlbnQgPyBwYXJlbnQuZ2V0QWZ0ZXJBbGxDbG9zZWQoKSA6IHRoaXMuX2FmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWxcbiAgICApIGFzIFN1YmplY3Q8dm9pZD47XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSBtb2RhbCBtb2RhbCBjb250YWluaW5nIHRoZSBnaXZlbiB0ZW1wbGF0ZS5cbiAgICovXG4gIHB1YmxpYyBvcGVuPFQ+KFxuICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPixcbiAgICBjb25maWc/OiBCYW9Nb2RhbENvbmZpZ1xuICApOiBCYW9Nb2RhbFJlZjx1bmtub3duPiB7XG4gICAgY29uc3QgY29uZiA9IHRoaXMuX2FwcGx5Q29uZmlnRGVmYXVsdHMoY29uZmlnLCBuZXcgQmFvTW9kYWxJbml0aWFsQ29uZmlnKCkpO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBtb2RhbCB0aGF0IGlzIGN1cnJlbnRseSBhbmltYXRpbmcgb3BlbiwgcmV0dXJuIHRoZSBNYXRtb2RhbFJlZiBvZiB0aGF0IG1vZGFsXG4gICAgaWYgKHRoaXMuX21vZGFsQW5pbWF0aW5nT3Blbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RNb2RhbFJlZjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fY3JlYXRlT3ZlcmxheShjb25mKTtcbiAgICBjb25zdCBtb2RhbENvbnRhaW5lciA9IHRoaXMuX2F0dGFjaE1vZGFsQ29udGFpbmVyKG92ZXJsYXlSZWYsIGNvbmYpO1xuICAgIGlmICh0aGlzLl9hbmltYXRpb25Nb2RlICE9PSAnTm9vcEFuaW1hdGlvbnMnKSB7XG4gICAgICBjb25zdCBhbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbiA9XG4gICAgICAgIG1vZGFsQ29udGFpbmVyLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQuc3Vic2NyaWJlKG1vZGFsQW5pbWF0aW9uRXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChtb2RhbEFuaW1hdGlvbkV2ZW50LnN0YXRlID09PSAnb3BlbmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX21vZGFsQW5pbWF0aW5nT3BlbiA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtb2RhbEFuaW1hdGlvbkV2ZW50LnN0YXRlID09PSAnb3BlbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbW9kYWxBbmltYXRpbmdPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICBhbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICBpZiAoIXRoaXMuX2FuaW1hdGlvblN0YXRlU3Vic2NyaXB0aW9ucykge1xuICAgICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbnMuYWRkKGFuaW1hdGlvblN0YXRlU3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMuX2F0dGFjaE1vZGFsQ29udGVudDxUPihcbiAgICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsXG4gICAgICBtb2RhbENvbnRhaW5lcixcbiAgICAgIG92ZXJsYXlSZWYsXG4gICAgICBjb25mXG4gICAgKTtcbiAgICB0aGlzLl9sYXN0TW9kYWxSZWYgPSBtb2RhbFJlZjtcblxuICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IG1vZGFsIHRoYXQgd2UncmUgb3BlbmluZywgaGlkZSBhbGwgdGhlIG5vbi1vdmVybGF5IGNvbnRlbnQuXG4gICAgaWYgKCF0aGlzLm9wZW5Nb2RhbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9oaWRlTm9uTW9kYWxDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5Nb2RhbHMucHVzaChtb2RhbFJlZik7XG4gICAgbW9kYWxSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVtb3ZlT3Blbk1vZGFsKG1vZGFsUmVmKSk7XG4gICAgdGhpcy5hZnRlck9wZW5lZC5uZXh0KG1vZGFsUmVmKTtcblxuICAgIC8vIE5vdGlmeSB0aGUgbW9kYWwgY29udGFpbmVyIHRoYXQgdGhlIGNvbnRlbnQgaGFzIGJlZW4gYXR0YWNoZWQuXG4gICAgbW9kYWxDb250YWluZXIuX2luaXRpYWxpemVXaXRoQXR0YWNoZWRDb250ZW50KCk7XG5cbiAgICByZXR1cm4gbW9kYWxSZWY7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBvZiB0aGUgY3VycmVudGx5LW9wZW4gbW9kYWxzLlxuICAgKi9cbiAgcHVibGljIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX2Nsb3NlTW9kYWxzKHRoaXMub3Blbk1vZGFscyk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gb3BlbiBtb2RhbCBieSBpdHMgaWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0TW9kYWxCeUlkKGlkOiBzdHJpbmcpOiBCYW9Nb2RhbFJlZjx1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFscy5maW5kKG1vZGFsID0+IG1vZGFsLmlkID09PSBpZCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gT25seSBjbG9zZSB0aGUgbW9kYWxzIGF0IHRoaXMgbGV2ZWwgb24gZGVzdHJveVxuICAgIC8vIHNpbmNlIHRoZSBwYXJlbnQgc2VydmljZSBtYXkgc3RpbGwgYmUgYWN0aXZlLlxuICAgIHRoaXMuX2Nsb3NlTW9kYWxzKHRoaXMuX29wZW5Nb2RhbHNBdFRoaXNMZXZlbCk7XG4gICAgdGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2FmdGVyT3BlbmVkQXRUaGlzTGV2ZWwuY29tcGxldGUoKTtcbiAgICAvLyBDbGVhbiB1cCBhbnkgc3Vic2NyaXB0aW9ucyB0byBtb2RhbHMgdGhhdCBuZXZlciBmaW5pc2hlZCBvcGVuaW5nLlxuICAgIGlmICh0aGlzLl9hbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXRlU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBvdmVybGF5IGludG8gd2hpY2ggdGhlIG1vZGFsIHdpbGwgYmUgbG9hZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlT3ZlcmxheShjb25maWc6IEJhb01vZGFsSW5pdGlhbENvbmZpZyk6IE92ZXJsYXlSZWYge1xuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSB0aGlzLl9nZXRPdmVybGF5Q29uZmlnKGNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gb3ZlcmxheSBjb25maWcgZnJvbSBhIG1vZGFsIGNvbmZpZy5cbiAgICovXG4gIHByaXZhdGUgX2dldE92ZXJsYXlDb25maWcoY29uZmlnOiBCYW9Nb2RhbEluaXRpYWxDb25maWcpOiBPdmVybGF5Q29uZmlnIHtcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSxcbiAgICAgIHBhbmVsQ2xhc3M6IGNvbmZpZy5wYW5lbENsYXNzLFxuICAgICAgaGFzQmFja2Ryb3A6IGNvbmZpZy5oYXNCYWNrZHJvcCxcbiAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IGNvbmZpZy5jbG9zZU9uTmF2aWdhdGlvblxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5iYWNrZHJvcENsYXNzKSB7XG4gICAgICBzdGF0ZS5iYWNrZHJvcENsYXNzID0gY29uZmlnLmJhY2tkcm9wQ2xhc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGEgbW9kYWwgY29udGFpbmVyIHRvIGEgbW9kYWwncyBhbHJlYWR5LWNyZWF0ZWQgb3ZlcmxheS5cbiAgICovXG4gIHByaXZhdGUgX2F0dGFjaE1vZGFsQ29udGFpbmVyKFxuICAgIG92ZXJsYXk6IE92ZXJsYXlSZWYsXG4gICAgY29uZmlnOiBCYW9Nb2RhbEluaXRpYWxDb25maWdcbiAgKTogQyB7XG4gICAgY29uc3QgdXNlckluamVjdG9yID1cbiAgICAgIGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjtcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IHVzZXJJbmplY3RvciB8fCB0aGlzLl9pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogQmFvTW9kYWxJbml0aWFsQ29uZmlnLCB1c2VWYWx1ZTogY29uZmlnIH1dXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb250YWluZXJQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgdGhpcy5fbW9kYWxDb250YWluZXJUeXBlLFxuICAgICAgY29uZmlnLnZpZXdDb250YWluZXJSZWYsXG4gICAgICBpbmplY3RvclxuICAgICk7XG4gICAgY29uc3QgY29udGFpbmVyUmVmID0gb3ZlcmxheS5hdHRhY2g8Qz4oY29udGFpbmVyUG9ydGFsKTtcblxuICAgIHJldHVybiBjb250YWluZXJSZWYuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgdGhlIHVzZXItcHJvdmlkZWQgY29tcG9uZW50IHRvIHRoZSBhbHJlYWR5LWNyZWF0ZWQgbW9kYWwgY29udGFpbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0YWNoTW9kYWxDb250ZW50PFQ+KFxuICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPixcbiAgICBtb2RhbENvbnRhaW5lcjogQyxcbiAgICBvdmVybGF5UmVmOiBPdmVybGF5UmVmLFxuICAgIGNvbmZpZzogQmFvTW9kYWxJbml0aWFsQ29uZmlnXG4gICk6IEJhb01vZGFsUmVmPHVua25vd24+IHtcbiAgICAvLyBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIG1vZGFsIHdlJ3JlIGNyZWF0aW5nIGluIG9yZGVyIHRvIGdpdmUgdGhlIHVzZXIgYSBoYW5kbGVcbiAgICAvLyB0byBtb2RpZnkgYW5kIGNsb3NlIGl0LlxuICAgIGNvbnN0IG1vZGFsUmVmID0gbmV3IHRoaXMuX21vZGFsUmVmQ29uc3RydWN0b3IoXG4gICAgICBvdmVybGF5UmVmLFxuICAgICAgbW9kYWxDb250YWluZXIsXG4gICAgICBjb25maWcuaWRcbiAgICApO1xuXG4gICAgaWYgKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgICAgbW9kYWxDb250YWluZXIuYXR0YWNoVGVtcGxhdGVQb3J0YWwoXG4gICAgICAgIG5ldyBUZW1wbGF0ZVBvcnRhbChjb21wb25lbnRPclRlbXBsYXRlUmVmLCBudWxsLCA8dW5rbm93bj57XG4gICAgICAgICAgJGltcGxpY2l0OiBjb25maWcuZGF0YSxcbiAgICAgICAgICBtb2RhbFJlZlxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSB0aGlzLl9jcmVhdGVJbmplY3Rvcihjb25maWcsIG1vZGFsUmVmLCBtb2RhbENvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb250ZW50UmVmID0gbW9kYWxDb250YWluZXIuYXR0YWNoQ29tcG9uZW50UG9ydGFsPFQ+KFxuICAgICAgICBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsXG4gICAgICAgICAgY29uZmlnLnZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlID0gY29udGVudFJlZi5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBtb2RhbFJlZlxuICAgICAgLnVwZGF0ZVNpemUoY29uZmlnLndpZHRoLCBjb25maWcuaGVpZ2h0KVxuICAgICAgLnVwZGF0ZVBvc2l0aW9uKGNvbmZpZy5wb3NpdGlvbik7XG5cbiAgICByZXR1cm4gbW9kYWxSZWY7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBpbmplY3RvciB0byBiZSB1c2VkIGluc2lkZSB0aGUgbW9kYWwuIFRoaXMgYWxsb3dzIGEgY29tcG9uZW50IGxvYWRlZCBpbnNpZGVcbiAgICogb2YgYSBtb2RhbCB0byBjbG9zZSBpdHNlbGYgYW5kLCBvcHRpb25hbGx5LCB0byByZXR1cm4gYSB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZUluamVjdG9yKFxuICAgIGNvbmZpZzogQmFvTW9kYWxJbml0aWFsQ29uZmlnLFxuICAgIG1vZGFsUmVmOiBCYW9Nb2RhbFJlZjx1bmtub3duPixcbiAgICBtb2RhbENvbnRhaW5lcjogQ1xuICApOiBJbmplY3RvciB7XG4gICAgY29uc3QgdXNlckluamVjdG9yID1cbiAgICAgIGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjtcblxuICAgIC8vIFRoZSBtb2RhbCBjb250YWluZXIgc2hvdWxkIGJlIHByb3ZpZGVkIGFzIHRoZSBtb2RhbCBjb250YWluZXIgYW5kIHRoZSBtb2RhbCdzXG4gICAgLy8gY29udGVudCBhcmUgY3JlYXRlZCBvdXQgb2YgdGhlIHNhbWUgYFZpZXdDb250YWluZXJSZWZgIGFuZCBhcyBzdWNoLCBhcmUgc2libGluZ3NcbiAgICAvLyBmb3IgaW5qZWN0b3IgcHVycG9zZXMuIFRvIGFsbG93IHRoZSBoaWVyYXJjaHkgdGhhdCBpcyBleHBlY3RlZCwgdGhlIG1vZGFsXG4gICAgLy8gY29udGFpbmVyIGlzIGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gdGhlIGluamVjdG9yLlxuICAgIGNvbnN0IHByb3ZpZGVyczogU3RhdGljUHJvdmlkZXJbXSA9IFtcbiAgICAgIHsgcHJvdmlkZTogdGhpcy5fbW9kYWxDb250YWluZXJUeXBlLCB1c2VWYWx1ZTogbW9kYWxDb250YWluZXIgfSxcbiAgICAgIHsgcHJvdmlkZTogdGhpcy5fbW9kYWxEYXRhVG9rZW4sIHVzZVZhbHVlOiBjb25maWcuZGF0YSB9LFxuICAgICAgeyBwcm92aWRlOiB0aGlzLl9tb2RhbFJlZkNvbnN0cnVjdG9yLCB1c2VWYWx1ZTogbW9kYWxSZWYgfVxuICAgIF07XG5cbiAgICByZXR1cm4gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdXNlckluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLFxuICAgICAgcHJvdmlkZXJzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIG1vZGFsIGZyb20gdGhlIGFycmF5IG9mIG9wZW4gbW9kYWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlT3Blbk1vZGFsKG1vZGFsUmVmOiBCYW9Nb2RhbFJlZjx1bmtub3duPikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuTW9kYWxzLmluZGV4T2YobW9kYWxSZWYpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMub3Blbk1vZGFscy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAvLyBJZiBhbGwgdGhlIG1vZGFscyB3ZXJlIGNsb3NlZCwgcmVtb3ZlL3Jlc3RvcmUgdGhlIGBhcmlhLWhpZGRlbmBcbiAgICAgIC8vIHRvIGEgdGhlIHNpYmxpbmdzIGFuZCBlbWl0IHRvIHRoZSBgYWZ0ZXJBbGxDbG9zZWRgIHN0cmVhbS5cbiAgICAgIGlmICghdGhpcy5vcGVuTW9kYWxzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuZm9yRWFjaCgocHJldmlvdXNWYWx1ZSwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBwcmV2aW91c1ZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5nZXRBZnRlckFsbENsb3NlZCgpLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgYWxsIG9mIHRoZSBjb250ZW50IHRoYXQgaXNuJ3QgYW4gb3ZlcmxheSBmcm9tIGFzc2lzdGl2ZSB0ZWNobm9sb2d5LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGlkZU5vbk1vZGFsQ29udGVudEZyb21Bc3Npc3RpdmVUZWNobm9sb2d5KCkge1xuICAgIGNvbnN0IG92ZXJsYXlDb250YWluZXIgPSB0aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKTtcblxuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBvdmVybGF5IGNvbnRhaW5lciBpcyBhdHRhY2hlZCB0byB0aGUgRE9NLlxuICAgIGlmIChvdmVybGF5Q29udGFpbmVyLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHNpYmxpbmdzID0gb3ZlcmxheUNvbnRhaW5lci5wYXJlbnRFbGVtZW50LmNoaWxkcmVuO1xuXG4gICAgICBmb3IgKGxldCBpID0gc2libGluZ3MubGVuZ3RoIC0gMTsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgY29uc3Qgc2libGluZyA9IHNpYmxpbmdzW2ldO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBzaWJsaW5nICE9PSBvdmVybGF5Q29udGFpbmVyICYmXG4gICAgICAgICAgc2libGluZy5ub2RlTmFtZSAhPT0gJ1NDUklQVCcgJiZcbiAgICAgICAgICBzaWJsaW5nLm5vZGVOYW1lICE9PSAnU1RZTEUnICYmXG4gICAgICAgICAgIXNpYmxpbmcuaGFzQXR0cmlidXRlKCdhcmlhLWxpdmUnKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuc2V0KFxuICAgICAgICAgICAgc2libGluZyxcbiAgICAgICAgICAgIHNpYmxpbmcuZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzaWJsaW5nLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlcyBhbGwgb2YgdGhlIG1vZGFscyBpbiBhbiBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfY2xvc2VNb2RhbHMobW9kYWxzOiBCYW9Nb2RhbFJlZjx1bmtub3duPltdKSB7XG4gICAgbGV0IGkgPSBtb2RhbHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIG1vZGFsc1tpXS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGRlZmF1bHQgb3B0aW9ucyB0byB0aGUgbW9kYWwgY29uZmlnLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXBwbHlDb25maWdEZWZhdWx0cyhcbiAgICBjb25maWc/OiBCYW9Nb2RhbENvbmZpZyxcbiAgICBkZWZhdWx0T3B0aW9ucz86IEJhb01vZGFsSW5pdGlhbENvbmZpZ1xuICApOiBCYW9Nb2RhbEluaXRpYWxDb25maWcge1xuICAgIGNvbnN0IGRlc2t0b3BDbGFzcyA9IGNvbmZpZz8uc2l6ZSB8fCBlTW9kYWxEZXNrdG9wV2lkdGhTaXplLlNNQUxMO1xuICAgIGNvbnN0IG1vYmlsQ2xhc3MgPSBjb25maWc/Lm1vYmlsZVNpemUgfHwgZU1vZGFsTW9iaWxlV2lkdGhTaXplLkZVTEw7XG4gICAgY29uc3QgZGF0YSA9IGNvbmZpZz8uZGF0YSB8fCBudWxsO1xuICAgIGNvbnN0IGFyaWFMYWJlbGxlZEJ5ID0gY29uZmlnPy5hcmlhTGFiZWxsZWRCeSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4ue1xuICAgICAgICBwYW5lbENsYXNzOiBbZGVza3RvcENsYXNzLCBtb2JpbENsYXNzXSxcbiAgICAgICAgYXJpYUxhYmVsbGVkQnksXG4gICAgICAgIGRhdGFcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU2VydmljZSB0byBvcGVuIG1vZGFsLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQmFvTW9kYWwgZXh0ZW5kcyBCYW9Nb2RhbEJhc2U8QmFvTW9kYWxDb250YWluZXI+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcGFyZW50TW9kYWw6IEJhb01vZGFsLFxuICAgIG92ZXJsYXlDb250YWluZXI6IE92ZXJsYXlDb250YWluZXIsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSlcbiAgICBhbmltYXRpb25Nb2RlPzogJ05vb3BBbmltYXRpb25zJyB8ICdCcm93c2VyQW5pbWF0aW9ucydcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBvdmVybGF5LFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBwYXJlbnRNb2RhbCxcbiAgICAgIG92ZXJsYXlDb250YWluZXIsXG4gICAgICBCYW9Nb2RhbFJlZixcbiAgICAgIEJhb01vZGFsQ29udGFpbmVyLFxuICAgICAgQkFPX01PREFMX0RBVEEsXG4gICAgICBhbmltYXRpb25Nb2RlXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Copyright (c) 2022 Ville de Montreal. All rights reserved.
3
+ * Licensed under the MIT license.
4
+ * See LICENSE file in the project root for full license information.
5
+ */
6
+ import { OverlayModule } from '@angular/cdk/overlay';
7
+ import { PortalModule } from '@angular/cdk/portal';
8
+ import { CommonModule } from '@angular/common';
9
+ import { NgModule } from '@angular/core';
10
+ import { BaoModal } from './modal';
11
+ import { BaoModalContainer } from './modal-container';
12
+ import { BrowserAnimationsModule, NoopAnimationsModule } from '@angular/platform-browser/animations';
13
+ import { BaoModalClose } from './modal-directives';
14
+ import * as i0 from "@angular/core";
15
+ const MODAL_DIRECTIVES = [BaoModalContainer, BaoModalClose];
16
+ export class BaoModalModule {
17
+ }
18
+ BaoModalModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
19
+ BaoModalModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModalModule, declarations: [BaoModalContainer, BaoModalClose], imports: [CommonModule,
20
+ OverlayModule,
21
+ PortalModule,
22
+ BrowserAnimationsModule,
23
+ NoopAnimationsModule], exports: [BaoModalContainer, BaoModalClose] });
24
+ BaoModalModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModalModule, providers: [BaoModal], imports: [[
25
+ CommonModule,
26
+ OverlayModule,
27
+ PortalModule,
28
+ BrowserAnimationsModule,
29
+ NoopAnimationsModule
30
+ ]] });
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaoModalModule, decorators: [{
32
+ type: NgModule,
33
+ args: [{
34
+ imports: [
35
+ CommonModule,
36
+ OverlayModule,
37
+ PortalModule,
38
+ BrowserAnimationsModule,
39
+ NoopAnimationsModule
40
+ ],
41
+ declarations: MODAL_DIRECTIVES,
42
+ exports: MODAL_DIRECTIVES,
43
+ providers: [BaoModal]
44
+ }]
45
+ }] });
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11aS9zcmMvbGliL21vZGFsL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3JCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQUVuRCxNQUFNLGdCQUFnQixHQUFHLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFjNUQsTUFBTSxPQUFPLGNBQWM7OzJHQUFkLGNBQWM7NEdBQWQsY0FBYyxpQkFkRCxpQkFBaUIsRUFBRSxhQUFhLGFBSXRELFlBQVk7UUFDWixhQUFhO1FBQ2IsWUFBWTtRQUNaLHVCQUF1QjtRQUN2QixvQkFBb0IsYUFSRSxpQkFBaUIsRUFBRSxhQUFhOzRHQWM3QyxjQUFjLGFBRmQsQ0FBQyxRQUFRLENBQUMsWUFUWjtZQUNQLFlBQVk7WUFDWixhQUFhO1lBQ2IsWUFBWTtZQUNaLHVCQUF1QjtZQUN2QixvQkFBb0I7U0FDckI7MkZBS1UsY0FBYztrQkFaMUIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLFlBQVk7d0JBQ1osdUJBQXVCO3dCQUN2QixvQkFBb0I7cUJBQ3JCO29CQUNELFlBQVksRUFBRSxnQkFBZ0I7b0JBQzlCLE9BQU8sRUFBRSxnQkFBZ0I7b0JBQ3pCLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDdEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFZpbGxlIGRlIE1vbnRyZWFsLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogU2VlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcHJvamVjdCByb290IGZvciBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi9cbmltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBQb3J0YWxNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFvTW9kYWwgfSBmcm9tICcuL21vZGFsJztcbmltcG9ydCB7IEJhb01vZGFsQ29udGFpbmVyIH0gZnJvbSAnLi9tb2RhbC1jb250YWluZXInO1xuaW1wb3J0IHtcbiAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsXG4gIE5vb3BBbmltYXRpb25zTW9kdWxlXG59IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBCYW9Nb2RhbENsb3NlIH0gZnJvbSAnLi9tb2RhbC1kaXJlY3RpdmVzJztcblxuY29uc3QgTU9EQUxfRElSRUNUSVZFUyA9IFtCYW9Nb2RhbENvbnRhaW5lciwgQmFvTW9kYWxDbG9zZV07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgT3ZlcmxheU1vZHVsZSxcbiAgICBQb3J0YWxNb2R1bGUsXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsXG4gICAgTm9vcEFuaW1hdGlvbnNNb2R1bGVcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBNT0RBTF9ESVJFQ1RJVkVTLFxuICBleHBvcnRzOiBNT0RBTF9ESVJFQ1RJVkVTLFxuICBwcm92aWRlcnM6IFtCYW9Nb2RhbF1cbn0pXG5leHBvcnQgY2xhc3MgQmFvTW9kYWxNb2R1bGUge31cbiJdfQ==