@ng-matero/extensions 12.7.1 → 12.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_all-theme.scss +2 -0
- package/_index.scss +1 -0
- package/_theming.scss +1 -0
- package/bundles/extensions.umd.js +18 -11
- package/bundles/extensions.umd.js.map +1 -1
- package/bundles/mtxDatetimepicker.umd.js +3 -3
- package/bundles/mtxDatetimepicker.umd.js.map +1 -1
- package/bundles/mtxDrawer.umd.js +936 -0
- package/bundles/mtxDrawer.umd.js.map +1 -0
- package/bundles/mtxGrid.umd.js +45 -25
- package/bundles/mtxGrid.umd.js.map +1 -1
- package/datetimepicker/_datetimepicker-theme.scss +2 -2
- package/datetimepicker/calendar.scss +49 -9
- package/datetimepicker/datetimepicker-content.scss +1 -1
- package/datetimepicker/mtxDatetimepicker.metadata.json +1 -1
- package/drawer/_drawer-theme.import.scss +2 -0
- package/drawer/_drawer-theme.scss +40 -0
- package/drawer/drawer-animation.d.ts +5 -0
- package/drawer/drawer-config.d.ts +53 -0
- package/drawer/drawer-container.d.ts +80 -0
- package/drawer/drawer-container.scss +32 -0
- package/drawer/drawer-module.d.ts +2 -0
- package/drawer/drawer-ref.d.ts +44 -0
- package/drawer/drawer.d.ts +58 -0
- package/drawer/mtxDrawer.d.ts +4 -0
- package/drawer/mtxDrawer.metadata.json +1 -0
- package/drawer/package.json +11 -0
- package/drawer/public-api.d.ts +6 -0
- package/esm2015/datetimepicker/calendar.js +3 -3
- package/esm2015/datetimepicker/datetimepicker.js +1 -1
- package/esm2015/drawer/drawer-animation.js +18 -0
- package/esm2015/drawer/drawer-config.js +39 -0
- package/esm2015/drawer/drawer-container.js +261 -0
- package/esm2015/drawer/drawer-module.js +18 -0
- package/esm2015/drawer/drawer-ref.js +90 -0
- package/esm2015/drawer/drawer.js +166 -0
- package/esm2015/drawer/mtxDrawer.js +5 -0
- package/esm2015/drawer/public-api.js +7 -0
- package/esm2015/extensions.module.js +5 -3
- package/esm2015/grid/cell.component.js +4 -4
- package/esm2015/grid/column-menu.component.js +29 -8
- package/esm2015/grid/grid.component.js +12 -17
- package/esm2015/grid/grid.interface.js +1 -1
- package/esm2015/public-api.js +3 -2
- package/extensions.metadata.json +1 -1
- package/fesm2015/extensions.js +6 -3
- package/fesm2015/extensions.js.map +1 -1
- package/fesm2015/mtxDatetimepicker.js +3 -3
- package/fesm2015/mtxDatetimepicker.js.map +1 -1
- package/fesm2015/mtxDrawer.js +586 -0
- package/fesm2015/mtxDrawer.js.map +1 -0
- package/fesm2015/mtxGrid.js +42 -26
- package/fesm2015/mtxGrid.js.map +1 -1
- package/grid/cell.component.d.ts +1 -1
- package/grid/cell.component.scss +0 -9
- package/grid/column-menu.component.d.ts +10 -5
- package/grid/column-menu.component.scss +28 -2
- package/grid/grid.component.d.ts +5 -5
- package/grid/grid.component.scss +27 -9
- package/grid/grid.interface.d.ts +12 -12
- package/grid/mtxGrid.metadata.json +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -1
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { FocusTrapFactory, InteractivityChecker } from '@angular/cdk/a11y';
|
|
2
|
+
import { coerceArray } from '@angular/cdk/coercion';
|
|
3
|
+
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
|
|
4
|
+
import { _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';
|
|
5
|
+
import { BasePortalOutlet, CdkPortalOutlet, } from '@angular/cdk/portal';
|
|
6
|
+
import { DOCUMENT } from '@angular/common';
|
|
7
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, NgZone, Optional, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
8
|
+
import { mtxDrawerAnimations } from './drawer-animation';
|
|
9
|
+
import { MtxDrawerConfig } from './drawer-config';
|
|
10
|
+
/**
|
|
11
|
+
* Internal component that wraps user-provided drawer content.
|
|
12
|
+
* @docs-private
|
|
13
|
+
*/
|
|
14
|
+
export class MtxDrawerContainer extends BasePortalOutlet {
|
|
15
|
+
constructor(_elementRef, _changeDetectorRef, _focusTrapFactory, _interactivityChecker, _ngZone, breakpointObserver, document,
|
|
16
|
+
/** The drawer configuration. */
|
|
17
|
+
drawerConfig) {
|
|
18
|
+
super();
|
|
19
|
+
this._elementRef = _elementRef;
|
|
20
|
+
this._changeDetectorRef = _changeDetectorRef;
|
|
21
|
+
this._focusTrapFactory = _focusTrapFactory;
|
|
22
|
+
this._interactivityChecker = _interactivityChecker;
|
|
23
|
+
this._ngZone = _ngZone;
|
|
24
|
+
this.drawerConfig = drawerConfig;
|
|
25
|
+
/** The state of the drawer animations. */
|
|
26
|
+
this._animationState = 'void';
|
|
27
|
+
/** Emits whenever the state of the animation changes. */
|
|
28
|
+
this._animationStateChanged = new EventEmitter();
|
|
29
|
+
/** Element that was focused before the drawer was opened. */
|
|
30
|
+
this._elementFocusedBeforeOpened = null;
|
|
31
|
+
/**
|
|
32
|
+
* Attaches a DOM portal to the drawer container.
|
|
33
|
+
* @deprecated To be turned into a method.
|
|
34
|
+
* @breaking-change 10.0.0
|
|
35
|
+
*/
|
|
36
|
+
this.attachDomPortal = (portal) => {
|
|
37
|
+
this._validatePortalAttached();
|
|
38
|
+
this._setPanelClass();
|
|
39
|
+
this._savePreviouslyFocusedElement();
|
|
40
|
+
return this._portalOutlet.attachDomPortal(portal);
|
|
41
|
+
};
|
|
42
|
+
this._document = document;
|
|
43
|
+
this._breakpointSubscription = breakpointObserver
|
|
44
|
+
.observe([Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])
|
|
45
|
+
.subscribe(() => { });
|
|
46
|
+
}
|
|
47
|
+
get drawerPosition() {
|
|
48
|
+
return `mtx-drawer-${this.drawerConfig.position}`;
|
|
49
|
+
}
|
|
50
|
+
get drawerWidth() {
|
|
51
|
+
return this.drawerConfig.position === 'left' || this.drawerConfig.position === 'right'
|
|
52
|
+
? this.drawerConfig.width
|
|
53
|
+
: '100vw';
|
|
54
|
+
}
|
|
55
|
+
get drawerHeight() {
|
|
56
|
+
return this.drawerConfig.position === 'top' || this.drawerConfig.position === 'bottom'
|
|
57
|
+
? this.drawerConfig.height
|
|
58
|
+
: '100vh';
|
|
59
|
+
}
|
|
60
|
+
/** Attach a component portal as content to this drawer container. */
|
|
61
|
+
attachComponentPortal(portal) {
|
|
62
|
+
this._validatePortalAttached();
|
|
63
|
+
this._setPanelClass();
|
|
64
|
+
this._savePreviouslyFocusedElement();
|
|
65
|
+
return this._portalOutlet.attachComponentPortal(portal);
|
|
66
|
+
}
|
|
67
|
+
/** Attach a template portal as content to this drawer container. */
|
|
68
|
+
attachTemplatePortal(portal) {
|
|
69
|
+
this._validatePortalAttached();
|
|
70
|
+
this._setPanelClass();
|
|
71
|
+
this._savePreviouslyFocusedElement();
|
|
72
|
+
return this._portalOutlet.attachTemplatePortal(portal);
|
|
73
|
+
}
|
|
74
|
+
/** Begin animation of drawer entrance into view. */
|
|
75
|
+
enter() {
|
|
76
|
+
if (!this._destroyed) {
|
|
77
|
+
this._animationState = 'visible';
|
|
78
|
+
this._changeDetectorRef.detectChanges();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Begin animation of the drawer exiting from view. */
|
|
82
|
+
exit() {
|
|
83
|
+
if (!this._destroyed) {
|
|
84
|
+
this._animationState = 'hidden';
|
|
85
|
+
this._changeDetectorRef.markForCheck();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
ngOnDestroy() {
|
|
89
|
+
this._breakpointSubscription.unsubscribe();
|
|
90
|
+
this._destroyed = true;
|
|
91
|
+
}
|
|
92
|
+
_onAnimationDone(event) {
|
|
93
|
+
if (event.toState === 'hidden') {
|
|
94
|
+
this._restoreFocus();
|
|
95
|
+
}
|
|
96
|
+
else if (event.toState === 'visible') {
|
|
97
|
+
this._trapFocus();
|
|
98
|
+
}
|
|
99
|
+
this._animationStateChanged.emit(event);
|
|
100
|
+
}
|
|
101
|
+
_onAnimationStart(event) {
|
|
102
|
+
this._animationStateChanged.emit(event);
|
|
103
|
+
}
|
|
104
|
+
_toggleClass(cssClass, add) {
|
|
105
|
+
this._elementRef.nativeElement.classList.toggle(cssClass, add);
|
|
106
|
+
}
|
|
107
|
+
_validatePortalAttached() {
|
|
108
|
+
if (this._portalOutlet.hasAttached()) {
|
|
109
|
+
throw Error('Attempting to attach drawer content after content is already attached');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
_setPanelClass() {
|
|
113
|
+
const element = this._elementRef.nativeElement;
|
|
114
|
+
element.classList.add(...coerceArray(this.drawerConfig.panelClass || []));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Focuses the provided element. If the element is not focusable, it will add a tabIndex
|
|
118
|
+
* attribute to forcefully focus it. The attribute is removed after focus is moved.
|
|
119
|
+
* @param element The element to focus.
|
|
120
|
+
*/
|
|
121
|
+
_forceFocus(element, options) {
|
|
122
|
+
if (!this._interactivityChecker.isFocusable(element)) {
|
|
123
|
+
element.tabIndex = -1;
|
|
124
|
+
// The tabindex attribute should be removed to avoid navigating to that element again
|
|
125
|
+
this._ngZone.runOutsideAngular(() => {
|
|
126
|
+
element.addEventListener('blur', () => element.removeAttribute('tabindex'));
|
|
127
|
+
element.addEventListener('mousedown', () => element.removeAttribute('tabindex'));
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
element.focus(options);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Focuses the first element that matches the given selector within the focus trap.
|
|
134
|
+
* @param selector The CSS selector for the element to set focus to.
|
|
135
|
+
*/
|
|
136
|
+
_focusByCssSelector(selector, options) {
|
|
137
|
+
const elementToFocus = this._elementRef.nativeElement.querySelector(selector);
|
|
138
|
+
if (elementToFocus) {
|
|
139
|
+
this._forceFocus(elementToFocus, options);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Moves the focus inside the focus trap. When autoFocus is not set to 'bottom-sheet',
|
|
144
|
+
* if focus cannot be moved then focus will go to the drawer container.
|
|
145
|
+
*/
|
|
146
|
+
_trapFocus() {
|
|
147
|
+
const element = this._elementRef.nativeElement;
|
|
148
|
+
if (!this._focusTrap) {
|
|
149
|
+
this._focusTrap = this._focusTrapFactory.create(element);
|
|
150
|
+
}
|
|
151
|
+
// If were to attempt to focus immediately, then the content of the drawer would not
|
|
152
|
+
// yet be ready in instances where change detection has to run first. To deal with this,
|
|
153
|
+
// we simply wait for the microtask queue to be empty when setting focus when autoFocus
|
|
154
|
+
// isn't set to drawer. If the element inside the drawer can't be focused,
|
|
155
|
+
// then the container is focused so the user can't tab into other elements behind it.
|
|
156
|
+
switch (this.drawerConfig.autoFocus) {
|
|
157
|
+
case false:
|
|
158
|
+
case 'dialog':
|
|
159
|
+
// eslint-disable-next-line no-case-declarations
|
|
160
|
+
const activeElement = _getFocusedElementPierceShadowDom();
|
|
161
|
+
// Ensure that focus is on the drawer container. It's possible that a different
|
|
162
|
+
// component tried to move focus while the open animation was running. See:
|
|
163
|
+
// https://github.com/angular/components/issues/16215. Note that we only want to do this
|
|
164
|
+
// if the focus isn't inside the drawer already, because it's possible that the
|
|
165
|
+
// consumer specified `autoFocus` in order to move focus themselves.
|
|
166
|
+
if (activeElement !== element && !element.contains(activeElement)) {
|
|
167
|
+
element.focus();
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
case true:
|
|
171
|
+
case 'first-tabbable':
|
|
172
|
+
this._focusTrap.focusInitialElementWhenReady();
|
|
173
|
+
break;
|
|
174
|
+
case 'first-heading':
|
|
175
|
+
this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');
|
|
176
|
+
break;
|
|
177
|
+
default:
|
|
178
|
+
this._focusByCssSelector(this.drawerConfig.autoFocus);
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** Restores focus to the element that was focused before the drawer was opened. */
|
|
183
|
+
_restoreFocus() {
|
|
184
|
+
const toFocus = this._elementFocusedBeforeOpened;
|
|
185
|
+
// We need the extra check, because IE can set the `activeElement` to null in some cases.
|
|
186
|
+
if (this.drawerConfig.restoreFocus && toFocus && typeof toFocus.focus === 'function') {
|
|
187
|
+
const activeElement = _getFocusedElementPierceShadowDom();
|
|
188
|
+
const element = this._elementRef.nativeElement;
|
|
189
|
+
// Make sure that focus is still inside the drawer or is on the body (usually because a
|
|
190
|
+
// non-focusable element like the backdrop was clicked) before moving it. It's possible that
|
|
191
|
+
// the consumer moved it themselves before the animation was done, in which case we shouldn't
|
|
192
|
+
// do anything.
|
|
193
|
+
if (!activeElement ||
|
|
194
|
+
activeElement === this._document.body ||
|
|
195
|
+
activeElement === element ||
|
|
196
|
+
element.contains(activeElement)) {
|
|
197
|
+
toFocus.focus();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (this._focusTrap) {
|
|
201
|
+
this._focusTrap.destroy();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** Saves a reference to the element that was focused before the drawer was opened. */
|
|
205
|
+
_savePreviouslyFocusedElement() {
|
|
206
|
+
this._elementFocusedBeforeOpened = _getFocusedElementPierceShadowDom();
|
|
207
|
+
// The `focus` method isn't available during server-side rendering.
|
|
208
|
+
if (this._elementRef.nativeElement.focus) {
|
|
209
|
+
this._ngZone.runOutsideAngular(() => {
|
|
210
|
+
Promise.resolve().then(() => this._elementRef.nativeElement.focus());
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
|
|
216
|
+
MtxDrawerContainer.decorators = [
|
|
217
|
+
{ type: Component, args: [{
|
|
218
|
+
selector: 'mtx-drawer-container',
|
|
219
|
+
template: "<div class=\"mtx-drawer-content-wrapper\" [style.width]=\"drawerWidth\" [style.height]=\"drawerHeight\">\n <ng-template cdkPortalOutlet></ng-template>\n</div>\n",
|
|
220
|
+
// In Ivy embedded views will be change detected from their declaration place, rather than where
|
|
221
|
+
// they were stamped out. This means that we can't have the drawer container be OnPush,
|
|
222
|
+
// because it might cause the sheets that were opened from a template not to be out of date.
|
|
223
|
+
changeDetection: ChangeDetectionStrategy.Default,
|
|
224
|
+
encapsulation: ViewEncapsulation.None,
|
|
225
|
+
animations: [mtxDrawerAnimations.drawerState],
|
|
226
|
+
host: {
|
|
227
|
+
'class': 'mtx-drawer-container',
|
|
228
|
+
'[class]': 'drawerPosition',
|
|
229
|
+
'tabindex': '-1',
|
|
230
|
+
'role': 'dialog',
|
|
231
|
+
'aria-modal': 'true',
|
|
232
|
+
'[attr.aria-label]': 'drawerConfig?.ariaLabel',
|
|
233
|
+
'[@state]': '_animationState',
|
|
234
|
+
'(@state.start)': '_onAnimationStart($event)',
|
|
235
|
+
'(@state.done)': '_onAnimationDone($event)',
|
|
236
|
+
},
|
|
237
|
+
styles: [".mtx-drawer-container{display:block;outline:0}.cdk-high-contrast-active .mtx-drawer-container{outline:1px solid}.mtx-drawer-content-wrapper{box-sizing:border-box;padding:8px 16px;overflow:auto}.mtx-drawer-right{transform:translate(100%)}.mtx-drawer-left{transform:translate(-100%)}.mtx-drawer-bottom{transform:translateY(100%)}.mtx-drawer-top{transform:translateY(-100%)}\n"]
|
|
238
|
+
},] }
|
|
239
|
+
];
|
|
240
|
+
/**
|
|
241
|
+
* @type {function(): !Array<(null|{
|
|
242
|
+
* type: ?,
|
|
243
|
+
* decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>),
|
|
244
|
+
* })>}
|
|
245
|
+
* @nocollapse
|
|
246
|
+
*/
|
|
247
|
+
MtxDrawerContainer.ctorParameters = () => [
|
|
248
|
+
{ type: ElementRef },
|
|
249
|
+
{ type: ChangeDetectorRef },
|
|
250
|
+
{ type: FocusTrapFactory },
|
|
251
|
+
{ type: InteractivityChecker },
|
|
252
|
+
{ type: NgZone },
|
|
253
|
+
{ type: BreakpointObserver },
|
|
254
|
+
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },
|
|
255
|
+
{ type: MtxDrawerConfig }
|
|
256
|
+
];
|
|
257
|
+
/** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
|
|
258
|
+
MtxDrawerContainer.propDecorators = {
|
|
259
|
+
_portalOutlet: [{ type: ViewChild, args: [CdkPortalOutlet, { static: true },] }]
|
|
260
|
+
};
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLWNvbnRhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZHJhd2VyL2RyYXdlci1jb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFhLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGVBQWUsR0FJaEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUVULFVBQVUsRUFFVixZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFFTixRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQ7OztHQUdHO0FBdUJILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxnQkFBZ0I7SUF3Q3RELFlBQ1UsV0FBb0MsRUFDcEMsa0JBQXFDLEVBQ3JDLGlCQUFtQyxFQUMxQixxQkFBMkMsRUFDM0MsT0FBZSxFQUNoQyxrQkFBc0MsRUFDUixRQUFhO0lBQzNDLGdDQUFnQztJQUN6QixZQUE2QjtRQUVwQyxLQUFLLEVBQUUsQ0FBQztRQVZBLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNwQyx1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TUFBTSxFQUFFLFFBQVE7b0JBQ2hCLFlBQVksRUFBRSxNQUFNO29CQUNwQixtQkFBbUIsRUFBRSx5QkFBeUI7b0JBQzlDLFVBQVUsRUFBRSxpQkFBaUI7b0JBQzdCLGdCQUFnQixFQUFFLDJCQUEyQjtvQkFDN0MsZUFBZSxFQUFFLDBCQUEwQjtpQkFDNUM7O2FBQ0Y7Ozs7Ozs7Ozs7WUF2Q0MsVUFBVTtZQUhWLGlCQUFpQjtZQWRDLGdCQUFnQjtZQUFFLG9CQUFvQjtZQXFCeEQsTUFBTTtZQW5CQyxrQkFBa0I7NENBc0d0QixRQUFRLFlBQUksTUFBTSxTQUFDLFFBQVE7WUEzRXZCLGVBQWU7Ozs7NEJBZ0NyQixTQUFTLFNBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuaW1hdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBGb2N1c1RyYXAsIEZvY3VzVHJhcEZhY3RvcnksIEludGVyYWN0aXZpdHlDaGVja2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgY29lcmNlQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50cyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgX2dldEZvY3VzZWRFbGVtZW50UGllcmNlU2hhZG93RG9tIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7XG4gIEJhc2VQb3J0YWxPdXRsZXQsXG4gIENka1BvcnRhbE91dGxldCxcbiAgQ29tcG9uZW50UG9ydGFsLFxuICBEb21Qb3J0YWwsXG4gIFRlbXBsYXRlUG9ydGFsLFxufSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG10eERyYXdlckFuaW1hdGlvbnMgfSBmcm9tICcuL2RyYXdlci1hbmltYXRpb24nO1xuaW1wb3J0IHsgTXR4RHJhd2VyQ29uZmlnIH0gZnJvbSAnLi9kcmF3ZXItY29uZmlnJztcblxuLyoqXG4gKiBJbnRlcm5hbCBjb21wb25lbnQgdGhhdCB3cmFwcyB1c2VyLXByb3ZpZGVkIGRyYXdlciBjb250ZW50LlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdHgtZHJhd2VyLWNvbnRhaW5lcicsXG4gIHRlbXBsYXRlVXJsOiAnZHJhd2VyLWNvbnRhaW5lci5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2RyYXdlci1jb250YWluZXIuc2NzcyddLFxuICAvLyBJbiBJdnkgZW1iZWRkZWQgdmlld3Mgd2lsbCBiZSBjaGFuZ2UgZGV0ZWN0ZWQgZnJvbSB0aGVpciBkZWNsYXJhdGlvbiBwbGFjZSwgcmF0aGVyIHRoYW4gd2hlcmVcbiAgLy8gdGhleSB3ZXJlIHN0YW1wZWQgb3V0LiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuJ3QgaGF2ZSB0aGUgZHJhd2VyIGNvbnRhaW5lciBiZSBPblB1c2gsXG4gIC8vIGJlY2F1c2UgaXQgbWlnaHQgY2F1c2UgdGhlIHNoZWV0cyB0aGF0IHdlcmUgb3BlbmVkIGZyb20gYSB0ZW1wbGF0ZSBub3QgdG8gYmUgb3V0IG9mIGRhdGUuXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgYW5pbWF0aW9uczogW210eERyYXdlckFuaW1hdGlvbnMuZHJhd2VyU3RhdGVdLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ210eC1kcmF3ZXItY29udGFpbmVyJyxcbiAgICAnW2NsYXNzXSc6ICdkcmF3ZXJQb3NpdGlvbicsXG4gICAgJ3RhYmluZGV4JzogJy0xJyxcbiAgICAncm9sZSc6ICdkaWFsb2cnLFxuICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLFxuICAgICdbYXR0ci5hcmlhLWxhYmVsXSc6ICdkcmF3ZXJDb25maWc/LmFyaWFMYWJlbCcsXG4gICAgJ1tAc3RhdGVdJzogJ19hbmltYXRpb25TdGF0ZScsXG4gICAgJyhAc3RhdGUuc3RhcnQpJzogJ19vbkFuaW1hdGlvblN0YXJ0KCRldmVudCknLFxuICAgICcoQHN0YXRlLmRvbmUpJzogJ19vbkFuaW1hdGlvbkRvbmUoJGV2ZW50KScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIE10eERyYXdlckNvbnRhaW5lciBleHRlbmRzIEJhc2VQb3J0YWxPdXRsZXQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9icmVha3BvaW50U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqIFRoZSBwb3J0YWwgb3V0bGV0IGluc2lkZSBvZiB0aGlzIGNvbnRhaW5lciBpbnRvIHdoaWNoIHRoZSBjb250ZW50IHdpbGwgYmUgbG9hZGVkLiAqL1xuICBAVmlld0NoaWxkKENka1BvcnRhbE91dGxldCwgeyBzdGF0aWM6IHRydWUgfSkgX3BvcnRhbE91dGxldCE6IENka1BvcnRhbE91dGxldDtcblxuICAvKiogVGhlIHN0YXRlIG9mIHRoZSBkcmF3ZXIgYW5pbWF0aW9ucy4gKi9cbiAgX2FuaW1hdGlvblN0YXRlOiAndm9pZCcgfCAndmlzaWJsZScgfCAnaGlkZGVuJyA9ICd2b2lkJztcblxuICAvKiogRW1pdHMgd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIHRoZSBhbmltYXRpb24gY2hhbmdlcy4gKi9cbiAgX2FuaW1hdGlvblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QW5pbWF0aW9uRXZlbnQ+KCk7XG5cbiAgLyoqIFRoZSBjbGFzcyB0aGF0IHRyYXBzIGFuZCBtYW5hZ2VzIGZvY3VzIHdpdGhpbiB0aGUgZHJhd2VyLiAqL1xuICBwcml2YXRlIF9mb2N1c1RyYXAhOiBGb2N1c1RyYXA7XG5cbiAgLyoqIEVsZW1lbnQgdGhhdCB3YXMgZm9jdXNlZCBiZWZvcmUgdGhlIGRyYXdlciB3YXMgb3BlbmVkLiAqL1xuICBwcml2YXRlIF9lbGVtZW50Rm9jdXNlZEJlZm9yZU9wZW5lZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvKiogU2VydmVyLXNpZGUgcmVuZGVyaW5nLWNvbXBhdGlibGUgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgZG9jdW1lbnQgb2JqZWN0LiAqL1xuICBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBkZXN0cm95ZWQuICovXG4gIHByaXZhdGUgX2Rlc3Ryb3llZCE6IGJvb2xlYW47XG5cbiAgZ2V0IGRyYXdlclBvc2l0aW9uKCkge1xuICAgIHJldHVybiBgbXR4LWRyYXdlci0ke3RoaXMuZHJhd2VyQ29uZmlnLnBvc2l0aW9ufWA7XG4gIH1cblxuICBnZXQgZHJhd2VyV2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJhd2VyQ29uZmlnLnBvc2l0aW9uID09PSAnbGVmdCcgfHwgdGhpcy5kcmF3ZXJDb25maWcucG9zaXRpb24gPT09ICdyaWdodCdcbiAgICAgID8gdGhpcy5kcmF3ZXJDb25maWcud2lkdGhcbiAgICAgIDogJzEwMHZ3JztcbiAgfVxuXG4gIGdldCBkcmF3ZXJIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJhd2VyQ29uZmlnLnBvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLmRyYXdlckNvbmZpZy5wb3NpdGlvbiA9PT0gJ2JvdHRvbSdcbiAgICAgID8gdGhpcy5kcmF3ZXJDb25maWcuaGVpZ2h0XG4gICAgICA6ICcxMDB2aCc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfZm9jdXNUcmFwRmFjdG9yeTogRm9jdXNUcmFwRmFjdG9yeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcmFjdGl2aXR5Q2hlY2tlcjogSW50ZXJhY3Rpdml0eUNoZWNrZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICAgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnQ6IGFueSxcbiAgICAvKiogVGhlIGRyYXdlciBjb25maWd1cmF0aW9uLiAqL1xuICAgIHB1YmxpYyBkcmF3ZXJDb25maWc6IE10eERyYXdlckNvbmZpZ1xuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICB0aGlzLl9icmVha3BvaW50U3Vic2NyaXB0aW9uID0gYnJlYWtwb2ludE9ic2VydmVyXG4gICAgICAub2JzZXJ2ZShbQnJlYWtwb2ludHMuTWVkaXVtLCBCcmVha3BvaW50cy5MYXJnZSwgQnJlYWtwb2ludHMuWExhcmdlXSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqIEF0dGFjaCBhIGNvbXBvbmVudCBwb3J0YWwgYXMgY29udGVudCB0byB0aGlzIGRyYXdlciBjb250YWluZXIuICovXG4gIGF0dGFjaENvbXBvbmVudFBvcnRhbDxUPihwb3J0YWw6IENvbXBvbmVudFBvcnRhbDxUPik6IENvbXBvbmVudFJlZjxUPiB7XG4gICAgdGhpcy5fdmFsaWRhdGVQb3J0YWxBdHRhY2hlZCgpO1xuICAgIHRoaXMuX3NldFBhbmVsQ2xhc3MoKTtcbiAgICB0aGlzLl9zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hDb21wb25lbnRQb3J0YWwocG9ydGFsKTtcbiAgfVxuXG4gIC8qKiBBdHRhY2ggYSB0ZW1wbGF0ZSBwb3J0YWwgYXMgY29udGVudCB0byB0aGlzIGRyYXdlciBjb250YWluZXIuICovXG4gIGF0dGFjaFRlbXBsYXRlUG9ydGFsPEM+KHBvcnRhbDogVGVtcGxhdGVQb3J0YWw8Qz4pOiBFbWJlZGRlZFZpZXdSZWY8Qz4ge1xuICAgIHRoaXMuX3ZhbGlkYXRlUG9ydGFsQXR0YWNoZWQoKTtcbiAgICB0aGlzLl9zZXRQYW5lbENsYXNzKCk7XG4gICAgdGhpcy5fc2F2ZVByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpO1xuICAgIHJldHVybiB0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIERPTSBwb3J0YWwgdG8gdGhlIGRyYXdlciBjb250YWluZXIuXG4gICAqIEBkZXByZWNhdGVkIFRvIGJlIHR1cm5lZCBpbnRvIGEgbWV0aG9kLlxuICAgKiBAYnJlYWtpbmctY2hhbmdlIDEwLjAuMFxuICAgKi9cbiAgb3ZlcnJpZGUgYXR0YWNoRG9tUG9ydGFsID0gKHBvcnRhbDogRG9tUG9ydGFsKSA9PiB7XG4gICAgdGhpcy5fdmFsaWRhdGVQb3J0YWxBdHRhY2hlZCgpO1xuICAgIHRoaXMuX3NldFBhbmVsQ2xhc3MoKTtcbiAgICB0aGlzLl9zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hEb21Qb3J0YWwocG9ydGFsKTtcbiAgfTtcblxuICAvKiogQmVnaW4gYW5pbWF0aW9uIG9mIGRyYXdlciBlbnRyYW5jZSBpbnRvIHZpZXcuICovXG4gIGVudGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZSA9ICd2aXNpYmxlJztcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQmVnaW4gYW5pbWF0aW9uIG9mIHRoZSBkcmF3ZXIgZXhpdGluZyBmcm9tIHZpZXcuICovXG4gIGV4aXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXRlID0gJ2hpZGRlbic7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9icmVha3BvaW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuXG4gIF9vbkFuaW1hdGlvbkRvbmUoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlRm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICd2aXNpYmxlJykge1xuICAgICAgdGhpcy5fdHJhcEZvY3VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgX29uQW5pbWF0aW9uU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KSB7XG4gICAgdGhpcy5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdG9nZ2xlQ2xhc3MoY3NzQ2xhc3M6IHN0cmluZywgYWRkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY3NzQ2xhc3MsIGFkZCk7XG4gIH1cblxuICBwcml2YXRlIF92YWxpZGF0ZVBvcnRhbEF0dGFjaGVkKCkge1xuICAgIGlmICh0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0F0dGVtcHRpbmcgdG8gYXR0YWNoIGRyYXdlciBjb250ZW50IGFmdGVyIGNvbnRlbnQgaXMgYWxyZWFkeSBhdHRhY2hlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFBhbmVsQ2xhc3MoKSB7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNvZXJjZUFycmF5KHRoaXMuZHJhd2VyQ29uZmlnLnBhbmVsQ2xhc3MgfHwgW10pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRoZSBwcm92aWRlZCBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCBpcyBub3QgZm9jdXNhYmxlLCBpdCB3aWxsIGFkZCBhIHRhYkluZGV4XG4gICAqIGF0dHJpYnV0ZSB0byBmb3JjZWZ1bGx5IGZvY3VzIGl0LiBUaGUgYXR0cmlidXRlIGlzIHJlbW92ZWQgYWZ0ZXIgZm9jdXMgaXMgbW92ZWQuXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGZvY3VzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZm9yY2VGb2N1cyhlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IEZvY3VzT3B0aW9ucykge1xuICAgIGlmICghdGhpcy5faW50ZXJhY3Rpdml0eUNoZWNrZXIuaXNGb2N1c2FibGUoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQudGFiSW5kZXggPSAtMTtcbiAgICAgIC8vIFRoZSB0YWJpbmRleCBhdHRyaWJ1dGUgc2hvdWxkIGJlIHJlbW92ZWQgdG8gYXZvaWQgbmF2aWdhdGluZyB0byB0aGF0IGVsZW1lbnQgYWdhaW5cbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoKSA9PiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxlbWVudC5mb2N1cyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2VsZWN0b3Igd2l0aGluIHRoZSBmb2N1cyB0cmFwLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnQgdG8gc2V0IGZvY3VzIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBfZm9jdXNCeUNzc1NlbGVjdG9yKHNlbGVjdG9yOiBzdHJpbmcsIG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpIHtcbiAgICBjb25zdCBlbGVtZW50VG9Gb2N1cyA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgc2VsZWN0b3JcbiAgICApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoZWxlbWVudFRvRm9jdXMpIHtcbiAgICAgIHRoaXMuX2ZvcmNlRm9jdXMoZWxlbWVudFRvRm9jdXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgZm9jdXMgaW5zaWRlIHRoZSBmb2N1cyB0cmFwLiBXaGVuIGF1dG9Gb2N1cyBpcyBub3Qgc2V0IHRvICdib3R0b20tc2hlZXQnLFxuICAgKiBpZiBmb2N1cyBjYW5ub3QgYmUgbW92ZWQgdGhlbiBmb2N1cyB3aWxsIGdvIHRvIHRoZSBkcmF3ZXIgY29udGFpbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfdHJhcEZvY3VzKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIXRoaXMuX2ZvY3VzVHJhcCkge1xuICAgICAgdGhpcy5fZm9jdXNUcmFwID0gdGhpcy5fZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2VyZSB0byBhdHRlbXB0IHRvIGZvY3VzIGltbWVkaWF0ZWx5LCB0aGVuIHRoZSBjb250ZW50IG9mIHRoZSBkcmF3ZXIgd291bGQgbm90XG4gICAgLy8geWV0IGJlIHJlYWR5IGluIGluc3RhbmNlcyB3aGVyZSBjaGFuZ2UgZGV0ZWN0aW9uIGhhcyB0byBydW4gZmlyc3QuIFRvIGRlYWwgd2l0aCB0aGlzLFxuICAgIC8vIHdlIHNpbXBseSB3YWl0IGZvciB0aGUgbWljcm90YXNrIHF1ZXVlIHRvIGJlIGVtcHR5IHdoZW4gc2V0dGluZyBmb2N1cyB3aGVuIGF1dG9Gb2N1c1xuICAgIC8vIGlzbid0IHNldCB0byBkcmF3ZXIuIElmIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgZHJhd2VyIGNhbid0IGJlIGZvY3VzZWQsXG4gICAgLy8gdGhlbiB0aGUgY29udGFpbmVyIGlzIGZvY3VzZWQgc28gdGhlIHVzZXIgY2FuJ3QgdGFiIGludG8gb3RoZXIgZWxlbWVudHMgYmVoaW5kIGl0LlxuICAgIHN3aXRjaCAodGhpcy5kcmF3ZXJDb25maWcuYXV0b0ZvY3VzKSB7XG4gICAgICBjYXNlIGZhbHNlOlxuICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBfZ2V0Rm9jdXNlZEVsZW1lbnRQaWVyY2VTaGFkb3dEb20oKTtcbiAgICAgICAgLy8gRW5zdXJlIHRoYXQgZm9jdXMgaXMgb24gdGhlIGRyYXdlciBjb250YWluZXIuIEl0J3MgcG9zc2libGUgdGhhdCBhIGRpZmZlcmVudFxuICAgICAgICAvLyBjb21wb25lbnQgdHJpZWQgdG8gbW92ZSBmb2N1cyB3aGlsZSB0aGUgb3BlbiBhbmltYXRpb24gd2FzIHJ1bm5pbmcuIFNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTYyMTUuIE5vdGUgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpc1xuICAgICAgICAvLyBpZiB0aGUgZm9jdXMgaXNuJ3QgaW5zaWRlIHRoZSBkcmF3ZXIgYWxyZWFkeSwgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlXG4gICAgICAgIC8vIGNvbnN1bWVyIHNwZWNpZmllZCBgYXV0b0ZvY3VzYCBpbiBvcmRlciB0byBtb3ZlIGZvY3VzIHRoZW1zZWx2ZXMuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50ICE9PSBlbGVtZW50ICYmICFlbGVtZW50LmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0cnVlOlxuICAgICAgY2FzZSAnZmlyc3QtdGFiYmFibGUnOlxuICAgICAgICB0aGlzLl9mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpcnN0LWhlYWRpbmcnOlxuICAgICAgICB0aGlzLl9mb2N1c0J5Q3NzU2VsZWN0b3IoJ2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIFtyb2xlPVwiaGVhZGluZ1wiXScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuX2ZvY3VzQnlDc3NTZWxlY3Rvcih0aGlzLmRyYXdlckNvbmZpZy5hdXRvRm9jdXMhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc3RvcmVzIGZvY3VzIHRvIHRoZSBlbGVtZW50IHRoYXQgd2FzIGZvY3VzZWQgYmVmb3JlIHRoZSBkcmF3ZXIgd2FzIG9wZW5lZC4gKi9cbiAgcHJpdmF0ZSBfcmVzdG9yZUZvY3VzKCkge1xuICAgIGNvbnN0IHRvRm9jdXMgPSB0aGlzLl9lbGVtZW50Rm9jdXNlZEJlZm9yZU9wZW5lZDtcblxuICAgIC8vIFdlIG5lZWQgdGhlIGV4dHJhIGNoZWNrLCBiZWNhdXNlIElFIGNhbiBzZXQgdGhlIGBhY3RpdmVFbGVtZW50YCB0byBudWxsIGluIHNvbWUgY2FzZXMuXG4gICAgaWYgKHRoaXMuZHJhd2VyQ29uZmlnLnJlc3RvcmVGb2N1cyAmJiB0b0ZvY3VzICYmIHR5cGVvZiB0b0ZvY3VzLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gX2dldEZvY3VzZWRFbGVtZW50UGllcmNlU2hhZG93RG9tKCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCBmb2N1cyBpcyBzdGlsbCBpbnNpZGUgdGhlIGRyYXdlciBvciBpcyBvbiB0aGUgYm9keSAodXN1YWxseSBiZWNhdXNlIGFcbiAgICAgIC8vIG5vbi1mb2N1c2FibGUgZWxlbWVudCBsaWtlIHRoZSBiYWNrZHJvcCB3YXMgY2xpY2tlZCkgYmVmb3JlIG1vdmluZyBpdC4gSXQncyBwb3NzaWJsZSB0aGF0XG4gICAgICAvLyB0aGUgY29uc3VtZXIgbW92ZWQgaXQgdGhlbXNlbHZlcyBiZWZvcmUgdGhlIGFuaW1hdGlvbiB3YXMgZG9uZSwgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGRuJ3RcbiAgICAgIC8vIGRvIGFueXRoaW5nLlxuICAgICAgaWYgKFxuICAgICAgICAhYWN0aXZlRWxlbWVudCB8fFxuICAgICAgICBhY3RpdmVFbGVtZW50ID09PSB0aGlzLl9kb2N1bWVudC5ib2R5IHx8XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQgPT09IGVsZW1lbnQgfHxcbiAgICAgICAgZWxlbWVudC5jb250YWlucyhhY3RpdmVFbGVtZW50KVxuICAgICAgKSB7XG4gICAgICAgIHRvRm9jdXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZm9jdXNUcmFwKSB7XG4gICAgICB0aGlzLl9mb2N1c1RyYXAuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTYXZlcyBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB0aGF0IHdhcyBmb2N1c2VkIGJlZm9yZSB0aGUgZHJhd2VyIHdhcyBvcGVuZWQuICovXG4gIHByaXZhdGUgX3NhdmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKSB7XG4gICAgdGhpcy5fZWxlbWVudEZvY3VzZWRCZWZvcmVPcGVuZWQgPSBfZ2V0Rm9jdXNlZEVsZW1lbnRQaWVyY2VTaGFkb3dEb20oKTtcblxuICAgIC8vIFRoZSBgZm9jdXNgIG1ldGhvZCBpc24ndCBhdmFpbGFibGUgZHVyaW5nIHNlcnZlci1zaWRlIHJlbmRlcmluZy5cbiAgICBpZiAodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKSB7XG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { OverlayModule } from '@angular/cdk/overlay';
|
|
2
|
+
import { PortalModule } from '@angular/cdk/portal';
|
|
3
|
+
import { NgModule } from '@angular/core';
|
|
4
|
+
import { MatCommonModule } from '@angular/material/core';
|
|
5
|
+
import { MtxDrawer } from './drawer';
|
|
6
|
+
import { MtxDrawerContainer } from './drawer-container';
|
|
7
|
+
export class MtxDrawerModule {
|
|
8
|
+
}
|
|
9
|
+
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
|
|
10
|
+
MtxDrawerModule.decorators = [
|
|
11
|
+
{ type: NgModule, args: [{
|
|
12
|
+
imports: [OverlayModule, PortalModule, MatCommonModule],
|
|
13
|
+
exports: [MtxDrawerContainer, MatCommonModule],
|
|
14
|
+
declarations: [MtxDrawerContainer],
|
|
15
|
+
providers: [MtxDrawer],
|
|
16
|
+
},] }
|
|
17
|
+
];
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZHJhd2VyL2RyYXdlci1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBUXhELE1BQU0sT0FBTyxlQUFlOzs7O1lBTjNCLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUUsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQztnQkFDdkQsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxDQUFDO2dCQUM5QyxZQUFZLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDbEMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDO2FBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFBvcnRhbE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTXR4RHJhd2VyIH0gZnJvbSAnLi9kcmF3ZXInO1xuaW1wb3J0IHsgTXR4RHJhd2VyQ29udGFpbmVyIH0gZnJvbSAnLi9kcmF3ZXItY29udGFpbmVyJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW092ZXJsYXlNb2R1bGUsIFBvcnRhbE1vZHVsZSwgTWF0Q29tbW9uTW9kdWxlXSxcbiAgZXhwb3J0czogW010eERyYXdlckNvbnRhaW5lciwgTWF0Q29tbW9uTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbTXR4RHJhd2VyQ29udGFpbmVyXSxcbiAgcHJvdmlkZXJzOiBbTXR4RHJhd2VyXSxcbn0pXG5leHBvcnQgY2xhc3MgTXR4RHJhd2VyTW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
|
|
2
|
+
import { merge, Subject } from 'rxjs';
|
|
3
|
+
import { filter, take } from 'rxjs/operators';
|
|
4
|
+
/**
|
|
5
|
+
* Reference to a drawer dispatched from the drawer service.
|
|
6
|
+
*/
|
|
7
|
+
export class MtxDrawerRef {
|
|
8
|
+
constructor(containerInstance, _overlayRef) {
|
|
9
|
+
this._overlayRef = _overlayRef;
|
|
10
|
+
/** Subject for notifying the user that the drawer has been dismissed. */
|
|
11
|
+
this._afterDismissed = new Subject();
|
|
12
|
+
/** Subject for notifying the user that the drawer has opened and appeared. */
|
|
13
|
+
this._afterOpened = new Subject();
|
|
14
|
+
this.containerInstance = containerInstance;
|
|
15
|
+
this.disableClose = containerInstance.drawerConfig.disableClose;
|
|
16
|
+
// Emit when opening animation completes
|
|
17
|
+
containerInstance._animationStateChanged
|
|
18
|
+
.pipe(filter(event => event.phaseName === 'done' && event.toState === 'visible'), take(1))
|
|
19
|
+
.subscribe(() => {
|
|
20
|
+
this._afterOpened.next();
|
|
21
|
+
this._afterOpened.complete();
|
|
22
|
+
});
|
|
23
|
+
// Dispose overlay when closing animation is complete
|
|
24
|
+
containerInstance._animationStateChanged
|
|
25
|
+
.pipe(filter(event => event.phaseName === 'done' && event.toState === 'hidden'), take(1))
|
|
26
|
+
.subscribe(() => {
|
|
27
|
+
clearTimeout(this._closeFallbackTimeout);
|
|
28
|
+
_overlayRef.dispose();
|
|
29
|
+
});
|
|
30
|
+
_overlayRef
|
|
31
|
+
.detachments()
|
|
32
|
+
.pipe(take(1))
|
|
33
|
+
.subscribe(() => {
|
|
34
|
+
this._afterDismissed.next(this._result);
|
|
35
|
+
this._afterDismissed.complete();
|
|
36
|
+
});
|
|
37
|
+
merge(_overlayRef.backdropClick(), _overlayRef.keydownEvents().pipe(filter(event => event.keyCode === ESCAPE))).subscribe(event => {
|
|
38
|
+
if (!this.disableClose &&
|
|
39
|
+
(event.type !== 'keydown' || !hasModifierKey(event))) {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
this.dismiss();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Dismisses the drawer.
|
|
47
|
+
* @param result Data to be passed back to the drawer opener.
|
|
48
|
+
*/
|
|
49
|
+
dismiss(result) {
|
|
50
|
+
if (!this._afterDismissed.closed) {
|
|
51
|
+
// Transition the backdrop in parallel to the drawer.
|
|
52
|
+
this.containerInstance._animationStateChanged
|
|
53
|
+
.pipe(filter(event => event.phaseName === 'start'), take(1))
|
|
54
|
+
.subscribe(event => {
|
|
55
|
+
// The logic that disposes of the overlay depends on the exit animation completing, however
|
|
56
|
+
// it isn't guaranteed if the parent view is destroyed while it's running. Add a fallback
|
|
57
|
+
// timeout which will clean everything up if the animation hasn't fired within the specified
|
|
58
|
+
// amount of time plus 100ms. We don't need to run this outside the NgZone, because for the
|
|
59
|
+
// vast majority of cases the timeout will have been cleared before it has fired.
|
|
60
|
+
this._closeFallbackTimeout = setTimeout(() => {
|
|
61
|
+
this._overlayRef.dispose();
|
|
62
|
+
}, event.totalTime + 100);
|
|
63
|
+
this._overlayRef.detachBackdrop();
|
|
64
|
+
});
|
|
65
|
+
this._result = result;
|
|
66
|
+
this.containerInstance.exit();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Gets an observable that is notified when the drawer is finished closing. */
|
|
70
|
+
afterDismissed() {
|
|
71
|
+
return this._afterDismissed;
|
|
72
|
+
}
|
|
73
|
+
/** Gets an observable that is notified when the drawer has opened and appeared. */
|
|
74
|
+
afterOpened() {
|
|
75
|
+
return this._afterOpened;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Gets an observable that emits when the overlay's backdrop has been clicked.
|
|
79
|
+
*/
|
|
80
|
+
backdropClick() {
|
|
81
|
+
return this._overlayRef.backdropClick();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Gets an observable that emits when keydown events are targeted on the overlay.
|
|
85
|
+
*/
|
|
86
|
+
keydownEvents() {
|
|
87
|
+
return this._overlayRef.keydownEvents();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZHJhd2VyL2RyYXdlci1yZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUF5QnZCLFlBQVksaUJBQXFDLEVBQVUsV0FBdUI7UUFBdkIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFabEYseUVBQXlFO1FBQ3hELG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7UUFFaEUsOEVBQThFO1FBQzdELGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQVNsRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBQ2hFLHdDQUF3QztRQUN4QyxpQkFBaUIsQ0FBQyxzQkFBc0I7YUFDckMsSUFBSSxDQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLEVBQzFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDUjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFFTCxxREFBcUQ7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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRVNDQVBFLCBoYXNNb2RpZmllcktleSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE10eERyYXdlckNvbnRhaW5lciB9IGZyb20gJy4vZHJhd2VyLWNvbnRhaW5lcic7XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgZHJhd2VyIGRpc3BhdGNoZWQgZnJvbSB0aGUgZHJhd2VyIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdHhEcmF3ZXJSZWY8VCA9IGFueSwgUiA9IGFueT4ge1xuICAvKiogSW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCBtYWtpbmcgdXAgdGhlIGNvbnRlbnQgb2YgdGhlIGRyYXdlci4gKi9cbiAgaW5zdGFuY2UhOiBUO1xuXG4gIC8qKlxuICAgKiBJbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGludG8gd2hpY2ggdGhlIGRyYXdlciBjb250ZW50IGlzIHByb2plY3RlZC5cbiAgICogQGRvY3MtcHJpdmF0ZVxuICAgKi9cbiAgY29udGFpbmVySW5zdGFuY2U6IE10eERyYXdlckNvbnRhaW5lcjtcblxuICAvKiogV2hldGhlciB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGNsb3NlIHRoZSBkcmF3ZXIuICovXG4gIGRpc2FibGVDbG9zZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKiogU3ViamVjdCBmb3Igbm90aWZ5aW5nIHRoZSB1c2VyIHRoYXQgdGhlIGRyYXdlciBoYXMgYmVlbiBkaXNtaXNzZWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FmdGVyRGlzbWlzc2VkID0gbmV3IFN1YmplY3Q8UiB8IHVuZGVmaW5lZD4oKTtcblxuICAvKiogU3ViamVjdCBmb3Igbm90aWZ5aW5nIHRoZSB1c2VyIHRoYXQgdGhlIGRyYXdlciBoYXMgb3BlbmVkIGFuZCBhcHBlYXJlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfYWZ0ZXJPcGVuZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBSZXN1bHQgdG8gYmUgcGFzc2VkIGRvd24gdG8gdGhlIGBhZnRlckRpc21pc3NlZGAgc3RyZWFtLiAqL1xuICBwcml2YXRlIF9yZXN1bHQ6IFIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEhhbmRsZSB0byB0aGUgdGltZW91dCB0aGF0J3MgcnVubmluZyBhcyBhIGZhbGxiYWNrIGluIGNhc2UgdGhlIGV4aXQgYW5pbWF0aW9uIGRvZXNuJ3QgZmlyZS4gKi9cbiAgcHJpdmF0ZSBfY2xvc2VGYWxsYmFja1RpbWVvdXQhOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoY29udGFpbmVySW5zdGFuY2U6IE10eERyYXdlckNvbnRhaW5lciwgcHJpdmF0ZSBfb3ZlcmxheVJlZjogT3ZlcmxheVJlZikge1xuICAgIHRoaXMuY29udGFpbmVySW5zdGFuY2UgPSBjb250YWluZXJJbnN0YW5jZTtcbiAgICB0aGlzLmRpc2FibGVDbG9zZSA9IGNvbnRhaW5lckluc3RhbmNlLmRyYXdlckNvbmZpZy5kaXNhYmxlQ2xvc2U7XG4gICAgLy8gRW1pdCB3aGVuIG9wZW5pbmcgYW5pbWF0aW9uIGNvbXBsZXRlc1xuICAgIGNvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQucGhhc2VOYW1lID09PSAnZG9uZScgJiYgZXZlbnQudG9TdGF0ZSA9PT0gJ3Zpc2libGUnKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FmdGVyT3BlbmVkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fYWZ0ZXJPcGVuZWQuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gRGlzcG9zZSBvdmVybGF5IHdoZW4gY2xvc2luZyBhbmltYXRpb24gaXMgY29tcGxldGVcbiAgICBjb250YWluZXJJbnN0YW5jZS5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnBoYXNlTmFtZSA9PT0gJ2RvbmUnICYmIGV2ZW50LnRvU3RhdGUgPT09ICdoaWRkZW4nKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZUZhbGxiYWNrVGltZW91dCk7XG4gICAgICAgIF9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgX292ZXJsYXlSZWZcbiAgICAgIC5kZXRhY2htZW50cygpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FmdGVyRGlzbWlzc2VkLm5leHQodGhpcy5fcmVzdWx0KTtcbiAgICAgICAgdGhpcy5fYWZ0ZXJEaXNtaXNzZWQuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuXG4gICAgbWVyZ2UoXG4gICAgICBfb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCksXG4gICAgICBfb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFKSlcbiAgICApLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmRpc2FibGVDbG9zZSAmJlxuICAgICAgICAoZXZlbnQudHlwZSAhPT0gJ2tleWRvd24nIHx8ICFoYXNNb2RpZmllcktleShldmVudCBhcyBLZXlib2FyZEV2ZW50KSlcbiAgICAgICkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRpc21pc3MoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIGRyYXdlci5cbiAgICogQHBhcmFtIHJlc3VsdCBEYXRhIHRvIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBkcmF3ZXIgb3BlbmVyLlxuICAgKi9cbiAgZGlzbWlzcyhyZXN1bHQ/OiBSKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hZnRlckRpc21pc3NlZC5jbG9zZWQpIHtcbiAgICAgIC8vIFRyYW5zaXRpb24gdGhlIGJhY2tkcm9wIGluIHBhcmFsbGVsIHRvIHRoZSBkcmF3ZXIuXG4gICAgICB0aGlzLmNvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnBoYXNlTmFtZSA9PT0gJ3N0YXJ0JyksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgIC8vIFRoZSBsb2dpYyB0aGF0IGRpc3Bvc2VzIG9mIHRoZSBvdmVybGF5IGRlcGVuZHMgb24gdGhlIGV4aXQgYW5pbWF0aW9uIGNvbXBsZXRpbmcsIGhvd2V2ZXJcbiAgICAgICAgICAvLyBpdCBpc24ndCBndWFyYW50ZWVkIGlmIHRoZSBwYXJlbnQgdmlldyBpcyBkZXN0cm95ZWQgd2hpbGUgaXQncyBydW5uaW5nLiBBZGQgYSBmYWxsYmFja1xuICAgICAgICAgIC8vIHRpbWVvdXQgd2hpY2ggd2lsbCBjbGVhbiBldmVyeXRoaW5nIHVwIGlmIHRoZSBhbmltYXRpb24gaGFzbid0IGZpcmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkXG4gICAgICAgICAgLy8gYW1vdW50IG9mIHRpbWUgcGx1cyAxMDBtcy4gV2UgZG9uJ3QgbmVlZCB0byBydW4gdGhpcyBvdXRzaWRlIHRoZSBOZ1pvbmUsIGJlY2F1c2UgZm9yIHRoZVxuICAgICAgICAgIC8vIHZhc3QgbWFqb3JpdHkgb2YgY2FzZXMgdGhlIHRpbWVvdXQgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBiZWZvcmUgaXQgaGFzIGZpcmVkLlxuICAgICAgICAgIHRoaXMuX2Nsb3NlRmFsbGJhY2tUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9LCBldmVudC50b3RhbFRpbWUgKyAxMDApO1xuXG4gICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2hCYWNrZHJvcCgpO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5fcmVzdWx0ID0gcmVzdWx0O1xuICAgICAgdGhpcy5jb250YWluZXJJbnN0YW5jZS5leGl0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIGRyYXdlciBpcyBmaW5pc2hlZCBjbG9zaW5nLiAqL1xuICBhZnRlckRpc21pc3NlZCgpOiBPYnNlcnZhYmxlPFIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYWZ0ZXJEaXNtaXNzZWQ7XG4gIH1cblxuICAvKiogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgaXMgbm90aWZpZWQgd2hlbiB0aGUgZHJhd2VyIGhhcyBvcGVuZWQgYW5kIGFwcGVhcmVkLiAqL1xuICBhZnRlck9wZW5lZCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYWZ0ZXJPcGVuZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgb3ZlcmxheSdzIGJhY2tkcm9wIGhhcyBiZWVuIGNsaWNrZWQuXG4gICAqL1xuICBiYWNrZHJvcENsaWNrKCk6IE9ic2VydmFibGU8TW91c2VFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIGtleWRvd24gZXZlbnRzIGFyZSB0YXJnZXRlZCBvbiB0aGUgb3ZlcmxheS5cbiAgICovXG4gIGtleWRvd25FdmVudHMoKTogT2JzZXJ2YWJsZTxLZXlib2FyZEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { Directionality } from '@angular/cdk/bidi';
|
|
2
|
+
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
|
|
3
|
+
import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
|
|
4
|
+
import { Injectable, Injector, Optional, SkipSelf, TemplateRef, InjectionToken, Inject, InjectFlags, } from '@angular/core';
|
|
5
|
+
import { of as observableOf } from 'rxjs';
|
|
6
|
+
import { MtxDrawerConfig } from './drawer-config';
|
|
7
|
+
import { MtxDrawerContainer } from './drawer-container';
|
|
8
|
+
import { MtxDrawerRef } from './drawer-ref';
|
|
9
|
+
/** Injection token that can be used to access the data that was passed in to a drawer. */
|
|
10
|
+
export const MTX_DRAWER_DATA = new InjectionToken('MtxDrawerData');
|
|
11
|
+
/** Injection token that can be used to specify default drawer options. */
|
|
12
|
+
export const MTX_DRAWER_DEFAULT_OPTIONS = new InjectionToken('mtx-drawer-default-options');
|
|
13
|
+
/**
|
|
14
|
+
* Service to trigger Material Design bottom sheets.
|
|
15
|
+
*/
|
|
16
|
+
export class MtxDrawer {
|
|
17
|
+
constructor(_overlay, _injector, _parentDrawer, _defaultOptions) {
|
|
18
|
+
this._overlay = _overlay;
|
|
19
|
+
this._injector = _injector;
|
|
20
|
+
this._parentDrawer = _parentDrawer;
|
|
21
|
+
this._defaultOptions = _defaultOptions;
|
|
22
|
+
this._drawerRefAtThisLevel = null;
|
|
23
|
+
}
|
|
24
|
+
/** Reference to the currently opened drawer. */
|
|
25
|
+
get _openedDrawerRef() {
|
|
26
|
+
const parent = this._parentDrawer;
|
|
27
|
+
return parent ? parent._openedDrawerRef : this._drawerRefAtThisLevel;
|
|
28
|
+
}
|
|
29
|
+
set _openedDrawerRef(value) {
|
|
30
|
+
if (this._parentDrawer) {
|
|
31
|
+
this._parentDrawer._openedDrawerRef = value;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this._drawerRefAtThisLevel = value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
open(componentOrTemplateRef, config) {
|
|
38
|
+
const _config = _applyConfigDefaults(this._defaultOptions || new MtxDrawerConfig(), config);
|
|
39
|
+
const overlayRef = this._createOverlay(_config);
|
|
40
|
+
const container = this._attachContainer(overlayRef, _config);
|
|
41
|
+
const ref = new MtxDrawerRef(container, overlayRef);
|
|
42
|
+
if (componentOrTemplateRef instanceof TemplateRef) {
|
|
43
|
+
container.attachTemplatePortal(new TemplatePortal(componentOrTemplateRef, null, {
|
|
44
|
+
$implicit: _config.data,
|
|
45
|
+
drawerRef: ref,
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const portal = new ComponentPortal(componentOrTemplateRef, undefined, this._createInjector(_config, ref));
|
|
50
|
+
const contentRef = container.attachComponentPortal(portal);
|
|
51
|
+
ref.instance = contentRef.instance;
|
|
52
|
+
}
|
|
53
|
+
// When the drawer is dismissed, clear the reference to it.
|
|
54
|
+
ref.afterDismissed().subscribe(() => {
|
|
55
|
+
// Clear the drawer ref if it hasn't already been replaced by a newer one.
|
|
56
|
+
if (this._openedDrawerRef == ref) {
|
|
57
|
+
this._openedDrawerRef = null;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if (this._openedDrawerRef) {
|
|
61
|
+
// If a drawer is already in view, dismiss it and enter the
|
|
62
|
+
// new drawer after exit animation is complete.
|
|
63
|
+
this._openedDrawerRef.afterDismissed().subscribe(() => ref.containerInstance.enter());
|
|
64
|
+
this._openedDrawerRef.dismiss();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// If no drawer is in view, enter the new drawer.
|
|
68
|
+
ref.containerInstance.enter();
|
|
69
|
+
}
|
|
70
|
+
this._openedDrawerRef = ref;
|
|
71
|
+
return ref;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Dismisses the currently-visible drawer.
|
|
75
|
+
* @param result Data to pass to the drawer instance.
|
|
76
|
+
*/
|
|
77
|
+
dismiss(result) {
|
|
78
|
+
if (this._openedDrawerRef) {
|
|
79
|
+
this._openedDrawerRef.dismiss(result);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
ngOnDestroy() {
|
|
83
|
+
if (this._drawerRefAtThisLevel) {
|
|
84
|
+
this._drawerRefAtThisLevel.dismiss();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Attaches the drawer container component to the overlay.
|
|
89
|
+
*/
|
|
90
|
+
_attachContainer(overlayRef, config) {
|
|
91
|
+
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
|
|
92
|
+
const injector = Injector.create({
|
|
93
|
+
parent: userInjector || this._injector,
|
|
94
|
+
providers: [{ provide: MtxDrawerConfig, useValue: config }],
|
|
95
|
+
});
|
|
96
|
+
const containerPortal = new ComponentPortal(MtxDrawerContainer, config.viewContainerRef, injector);
|
|
97
|
+
const containerRef = overlayRef.attach(containerPortal);
|
|
98
|
+
return containerRef.instance;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates a new overlay and places it in the correct location.
|
|
102
|
+
* @param config The user-specified drawer config.
|
|
103
|
+
*/
|
|
104
|
+
_createOverlay(config) {
|
|
105
|
+
const overlayConfig = new OverlayConfig({
|
|
106
|
+
direction: config.direction,
|
|
107
|
+
hasBackdrop: config.hasBackdrop,
|
|
108
|
+
disposeOnNavigation: config.closeOnNavigation,
|
|
109
|
+
maxWidth: '100%',
|
|
110
|
+
scrollStrategy: config.scrollStrategy || this._overlay.scrollStrategies.block(),
|
|
111
|
+
positionStrategy: this._overlay.position().global()[config.position]('0'),
|
|
112
|
+
});
|
|
113
|
+
if (config.backdropClass) {
|
|
114
|
+
overlayConfig.backdropClass = config.backdropClass;
|
|
115
|
+
}
|
|
116
|
+
return this._overlay.create(overlayConfig);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Creates an injector to be used inside of a drawer component.
|
|
120
|
+
* @param config Config that was used to create the drawer.
|
|
121
|
+
* @param drawerRef Reference to the drawer.
|
|
122
|
+
*/
|
|
123
|
+
_createInjector(config, drawerRef) {
|
|
124
|
+
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
|
|
125
|
+
const providers = [
|
|
126
|
+
{ provide: MtxDrawerRef, useValue: drawerRef },
|
|
127
|
+
{ provide: MTX_DRAWER_DATA, useValue: config.data },
|
|
128
|
+
];
|
|
129
|
+
if (config.direction &&
|
|
130
|
+
(!userInjector ||
|
|
131
|
+
!userInjector.get(Directionality, null, InjectFlags.Optional))) {
|
|
132
|
+
providers.push({
|
|
133
|
+
provide: Directionality,
|
|
134
|
+
useValue: { value: config.direction, change: observableOf() },
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return Injector.create({ parent: userInjector || this._injector, providers });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
|
|
141
|
+
MtxDrawer.decorators = [
|
|
142
|
+
{ type: Injectable }
|
|
143
|
+
];
|
|
144
|
+
/**
|
|
145
|
+
* @type {function(): !Array<(null|{
|
|
146
|
+
* type: ?,
|
|
147
|
+
* decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>),
|
|
148
|
+
* })>}
|
|
149
|
+
* @nocollapse
|
|
150
|
+
*/
|
|
151
|
+
MtxDrawer.ctorParameters = () => [
|
|
152
|
+
{ type: Overlay },
|
|
153
|
+
{ type: Injector },
|
|
154
|
+
{ type: MtxDrawer, decorators: [{ type: Optional }, { type: SkipSelf }] },
|
|
155
|
+
{ type: MtxDrawerConfig, decorators: [{ type: Optional }, { type: Inject, args: [MTX_DRAWER_DEFAULT_OPTIONS,] }] }
|
|
156
|
+
];
|
|
157
|
+
/**
|
|
158
|
+
* Applies default options to the drawer config.
|
|
159
|
+
* @param defaults Object containing the default values to which to fall back.
|
|
160
|
+
* @param config The configuration to which the defaults will be applied.
|
|
161
|
+
* @returns The new configuration object with defaults applied.
|
|
162
|
+
*/
|
|
163
|
+
function _applyConfigDefaults(defaults, config) {
|
|
164
|
+
return Object.assign(Object.assign({}, defaults), config);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9kcmF3ZXIvZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JGLE9BQU8sRUFFTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsV0FBVyxFQUNYLGNBQWMsRUFDZCxNQUFNLEVBR04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTVDLDBGQUEwRjtBQUMxRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxjQUFjLENBQU0sZUFBZSxDQUFDLENBQUM7QUFFeEUsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLElBQUksY0FBYyxDQUMxRCw0QkFBNEIsQ0FDN0IsQ0FBQztBQUVGOztHQUVHO0FBRUgsTUFBTSxPQUFPLFNBQVM7SUFpQnBCLFlBQ1UsUUFBaUIsRUFDakIsU0FBbUIsRUFDSyxhQUF3QixFQUdoRCxlQUFpQztRQUxqQyxhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFDSyxrQkFBYSxHQUFiLGFBQWEsQ0FBVztRQUdoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUF0Qm5DLDBCQUFxQixHQUE2QixJQUFJLENBQUM7SUF1QjVELENBQUM7SUFyQkosZ0RBQWdEO0lBQ2hELElBQUksZ0JBQWdCO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLGdCQUFnQixDQUFDLEtBQStCO1FBQ2xELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztTQUM3QzthQUFNO1lBQ0wsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztTQUNwQztJQUNILENBQUM7SUFpQ0QsSUFBSSxDQUNGLHNCQUF5RCxFQUN6RCxNQUEyQjtRQUUzQixNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksZUFBZSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdELE1BQU0sR0FBRyxHQUFHLElBQUksWUFBWSxDQUFPLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUxRCxJQUFJLHNCQUFzQixZQUFZLFdBQVcsRUFBRTtZQUNqRCxTQUFTLENBQUMsb0JBQW9CLENBQzVCLElBQUksY0FBYyxDQUFJLHNCQUFzQixFQUFFLElBQUssRUFBRTtnQkFDbkQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dCQUN2QixTQUFTLEVBQUUsR0FBRzthQUNSLENBQUMsQ0FDVixDQUFDO1NBQ0g7YUFBTTtZQUNMLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUNoQyxzQkFBc0IsRUFDdEIsU0FBUyxFQUNULElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUNuQyxDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNELEdBQUcsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUNwQztRQUVELDJEQUEyRDtRQUMzRCxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNsQywwRUFBMEU7WUFDMUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksR0FBRyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QiwyREFBMkQ7WUFDM0QsK0NBQStDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2pDO2FBQU07WUFDTCxpREFBaUQ7WUFDakQsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztRQUU1QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQVUsTUFBVTtRQUN6QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM5QixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxVQUFzQixFQUFFLE1BQXVCO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztRQUMzRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQy9CLE1BQU0sRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVM7WUFDdEMsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUM1RCxDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FDekMsa0JBQWtCLEVBQ2xCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsUUFBUSxDQUNULENBQUM7UUFDRixNQUFNLFlBQVksR0FBcUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxRixPQUFPLFlBQVksQ0FBQyxRQUFRLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGNBQWMsQ0FBQyxNQUF1QjtRQUM1QyxNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBQztZQUN0QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQy9CLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7WUFDN0MsUUFBUSxFQUFFLE1BQU07WUFDaEIsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDL0UsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUyxDQUFDLENBQUMsR0FBRyxDQUFDO1NBQzNFLENBQUMsQ0FBQztRQUVILElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUN4QixhQUFhLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7U0FDcEQ7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZUFBZSxDQUFJLE1BQXVCLEVBQUUsU0FBMEI7UUFDNUUsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQzNGLE1BQU0sU0FBUyxHQUFxQjtZQUNsQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtZQUM5QyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUU7U0FDcEQsQ0FBQztRQUVGLElBQ0UsTUFBTSxDQUFDLFNBQVM7WUFDaEIsQ0FBQyxDQUFDLFlBQVk7Z0JBQ1osQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUF3QixjQUFjLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUN2RjtZQUNBLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRTthQUM5RCxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7Ozs7WUFsTEYsVUFBVTs7Ozs7Ozs7OztZQS9CRixPQUFPO1lBS2QsUUFBUTtZQStDeUMsU0FBUyx1QkFBdkQsUUFBUSxZQUFJLFFBQVE7WUFwQ2hCLGVBQWUsdUJBcUNuQixRQUFRLFlBQ1IsTUFBTSxTQUFDLDBCQUEwQjs7QUE4SnRDOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsUUFBeUIsRUFDekIsTUFBd0I7SUFFeEIsdUNBQVksUUFBUSxHQUFLLE1BQU0sRUFBRztBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBDb21wb25lbnRUeXBlLCBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50UmVmLFxuICBJbmplY3RhYmxlLFxuICBJbmplY3RvcixcbiAgT3B0aW9uYWwsXG4gIFNraXBTZWxmLFxuICBUZW1wbGF0ZVJlZixcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIEluamVjdCxcbiAgT25EZXN0cm95LFxuICBTdGF0aWNQcm92aWRlcixcbiAgSW5qZWN0RmxhZ3MsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgb2YgYXMgb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNdHhEcmF3ZXJDb25maWcgfSBmcm9tICcuL2RyYXdlci1jb25maWcnO1xuaW1wb3J0IHsgTXR4RHJhd2VyQ29udGFpbmVyIH0gZnJvbSAnLi9kcmF3ZXItY29udGFpbmVyJztcbmltcG9ydCB7IE10eERyYXdlclJlZiB9IGZyb20gJy4vZHJhd2VyLXJlZic7XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGEgdGhhdCB3YXMgcGFzc2VkIGluIHRvIGEgZHJhd2VyLiAqL1xuZXhwb3J0IGNvbnN0IE1UWF9EUkFXRVJfREFUQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxhbnk+KCdNdHhEcmF3ZXJEYXRhJyk7XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGRlZmF1bHQgZHJhd2VyIG9wdGlvbnMuICovXG5leHBvcnQgY29uc3QgTVRYX0RSQVdFUl9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48TXR4RHJhd2VyQ29uZmlnPihcbiAgJ210eC1kcmF3ZXItZGVmYXVsdC1vcHRpb25zJ1xuKTtcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIHRyaWdnZXIgTWF0ZXJpYWwgRGVzaWduIGJvdHRvbSBzaGVldHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNdHhEcmF3ZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9kcmF3ZXJSZWZBdFRoaXNMZXZlbDogTXR4RHJhd2VyUmVmPGFueT4gfCBudWxsID0gbnVsbDtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50bHkgb3BlbmVkIGRyYXdlci4gKi9cbiAgZ2V0IF9vcGVuZWREcmF3ZXJSZWYoKTogTXR4RHJhd2VyUmVmPGFueT4gfCBudWxsIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9wYXJlbnREcmF3ZXI7XG4gICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5fb3BlbmVkRHJhd2VyUmVmIDogdGhpcy5fZHJhd2VyUmVmQXRUaGlzTGV2ZWw7XG4gIH1cblxuICBzZXQgX29wZW5lZERyYXdlclJlZih2YWx1ZTogTXR4RHJhd2VyUmVmPGFueT4gfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX3BhcmVudERyYXdlcikge1xuICAgICAgdGhpcy5fcGFyZW50RHJhd2VyLl9vcGVuZWREcmF3ZXJSZWYgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZHJhd2VyUmVmQXRUaGlzTGV2ZWwgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9vdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwcml2YXRlIF9wYXJlbnREcmF3ZXI6IE10eERyYXdlcixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoTVRYX0RSQVdFUl9ERUZBVUxUX09QVElPTlMpXG4gICAgcHJpdmF0ZSBfZGVmYXVsdE9wdGlvbnM/OiBNdHhEcmF3ZXJDb25maWdcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIGRyYXdlciBjb250YWluaW5nIHRoZSBnaXZlbiBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgVHlwZSBvZiB0aGUgY29tcG9uZW50IHRvIGxvYWQgaW50byB0aGUgZHJhd2VyLlxuICAgKiBAcGFyYW0gY29uZmlnIEV4dHJhIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgUmVmZXJlbmNlIHRvIHRoZSBuZXdseS1vcGVuZWQgZHJhd2VyLlxuICAgKi9cbiAgb3BlbjxULCBEID0gYW55LCBSID0gYW55PihcbiAgICBjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8VD4sXG4gICAgY29uZmlnPzogTXR4RHJhd2VyQ29uZmlnPEQ+XG4gICk6IE10eERyYXdlclJlZjxULCBSPjtcblxuICAvKipcbiAgICogT3BlbnMgYSBkcmF3ZXIgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGVtcGxhdGUuXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZSBUZW1wbGF0ZVJlZiB0byBpbnN0YW50aWF0ZSBhcyB0aGUgZHJhd2VyIGNvbnRlbnQuXG4gICAqIEBwYXJhbSBjb25maWcgRXh0cmEgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBSZWZlcmVuY2UgdG8gdGhlIG5ld2x5LW9wZW5lZCBkcmF3ZXIuXG4gICAqL1xuICBvcGVuPFQsIEQgPSBhbnksIFIgPSBhbnk+KFxuICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUPixcbiAgICBjb25maWc/OiBNdHhEcmF3ZXJDb25maWc8RD5cbiAgKTogTXR4RHJhd2VyUmVmPFQsIFI+O1xuXG4gIG9wZW48VCwgRCA9IGFueSwgUiA9IGFueT4oXG4gICAgY29tcG9uZW50T3JUZW1wbGF0ZVJlZjogQ29tcG9uZW50VHlwZTxUPiB8IFRlbXBsYXRlUmVmPFQ+LFxuICAgIGNvbmZpZz86IE10eERyYXdlckNvbmZpZzxEPlxuICApOiBNdHhEcmF3ZXJSZWY8VCwgUj4ge1xuICAgIGNvbnN0IF9jb25maWcgPSBfYXBwbHlDb25maWdEZWZhdWx0cyh0aGlzLl9kZWZhdWx0T3B0aW9ucyB8fCBuZXcgTXR4RHJhd2VyQ29uZmlnKCksIGNvbmZpZyk7XG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXkoX2NvbmZpZyk7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fYXR0YWNoQ29udGFpbmVyKG92ZXJsYXlSZWYsIF9jb25maWcpO1xuICAgIGNvbnN0IHJlZiA9IG5ldyBNdHhEcmF3ZXJSZWY8VCwgUj4oY29udGFpbmVyLCBvdmVybGF5UmVmKTtcblxuICAgIGlmIChjb21wb25lbnRPclRlbXBsYXRlUmVmIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIGNvbnRhaW5lci5hdHRhY2hUZW1wbGF0ZVBvcnRhbChcbiAgICAgICAgbmV3IFRlbXBsYXRlUG9ydGFsPFQ+KGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIG51bGwhLCB7XG4gICAgICAgICAgJGltcGxpY2l0OiBfY29uZmlnLmRhdGEsXG4gICAgICAgICAgZHJhd2VyUmVmOiByZWYsXG4gICAgICAgIH0gYXMgYW55KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChcbiAgICAgICAgY29tcG9uZW50T3JUZW1wbGF0ZVJlZixcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLl9jcmVhdGVJbmplY3RvcihfY29uZmlnLCByZWYpXG4gICAgICApO1xuICAgICAgY29uc3QgY29udGVudFJlZiA9IGNvbnRhaW5lci5hdHRhY2hDb21wb25lbnRQb3J0YWwocG9ydGFsKTtcbiAgICAgIHJlZi5pbnN0YW5jZSA9IGNvbnRlbnRSZWYuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLy8gV2hlbiB0aGUgZHJhd2VyIGlzIGRpc21pc3NlZCwgY2xlYXIgdGhlIHJlZmVyZW5jZSB0byBpdC5cbiAgICByZWYuYWZ0ZXJEaXNtaXNzZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gQ2xlYXIgdGhlIGRyYXdlciByZWYgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiByZXBsYWNlZCBieSBhIG5ld2VyIG9uZS5cbiAgICAgIGlmICh0aGlzLl9vcGVuZWREcmF3ZXJSZWYgPT0gcmVmKSB7XG4gICAgICAgIHRoaXMuX29wZW5lZERyYXdlclJlZiA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkRHJhd2VyUmVmKSB7XG4gICAgICAvLyBJZiBhIGRyYXdlciBpcyBhbHJlYWR5IGluIHZpZXcsIGRpc21pc3MgaXQgYW5kIGVudGVyIHRoZVxuICAgICAgLy8gbmV3IGRyYXdlciBhZnRlciBleGl0IGFuaW1hdGlvbiBpcyBjb21wbGV0ZS5cbiAgICAgIHRoaXMuX29wZW5lZERyYXdlclJlZi5hZnRlckRpc21pc3NlZCgpLnN1YnNjcmliZSgoKSA9PiByZWYuY29udGFpbmVySW5zdGFuY2UuZW50ZXIoKSk7XG4gICAgICB0aGlzLl9vcGVuZWREcmF3ZXJSZWYuZGlzbWlzcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBubyBkcmF3ZXIgaXMgaW4gdmlldywgZW50ZXIgdGhlIG5ldyBkcmF3ZXIuXG4gICAgICByZWYuY29udGFpbmVySW5zdGFuY2UuZW50ZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9vcGVuZWREcmF3ZXJSZWYgPSByZWY7XG5cbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgY3VycmVudGx5LXZpc2libGUgZHJhd2VyLlxuICAgKiBAcGFyYW0gcmVzdWx0IERhdGEgdG8gcGFzcyB0byB0aGUgZHJhd2VyIGluc3RhbmNlLlxuICAgKi9cbiAgZGlzbWlzczxSID0gYW55PihyZXN1bHQ/OiBSKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX29wZW5lZERyYXdlclJlZikge1xuICAgICAgdGhpcy5fb3BlbmVkRHJhd2VyUmVmLmRpc21pc3MocmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fZHJhd2VyUmVmQXRUaGlzTGV2ZWwpIHtcbiAgICAgIHRoaXMuX2RyYXdlclJlZkF0VGhpc0xldmVsLmRpc21pc3MoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgdGhlIGRyYXdlciBjb250YWluZXIgY29tcG9uZW50IHRvIHRoZSBvdmVybGF5LlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0YWNoQ29udGFpbmVyKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsIGNvbmZpZzogTXR4RHJhd2VyQ29uZmlnKTogTXR4RHJhd2VyQ29udGFpbmVyIHtcbiAgICBjb25zdCB1c2VySW5qZWN0b3IgPSBjb25maWcgJiYgY29uZmlnLnZpZXdDb250YWluZXJSZWYgJiYgY29uZmlnLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3I7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcGFyZW50OiB1c2VySW5qZWN0b3IgfHwgdGhpcy5faW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE10eERyYXdlckNvbmZpZywgdXNlVmFsdWU6IGNvbmZpZyB9XSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbnRhaW5lclBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoXG4gICAgICBNdHhEcmF3ZXJDb250YWluZXIsXG4gICAgICBjb25maWcudmlld0NvbnRhaW5lclJlZixcbiAgICAgIGluamVjdG9yXG4gICAgKTtcbiAgICBjb25zdCBjb250YWluZXJSZWY6IENvbXBvbmVudFJlZjxNdHhEcmF3ZXJDb250YWluZXI+ID0gb3ZlcmxheVJlZi5hdHRhY2goY29udGFpbmVyUG9ydGFsKTtcbiAgICByZXR1cm4gY29udGFpbmVyUmVmLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgb3ZlcmxheSBhbmQgcGxhY2VzIGl0IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uLlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSB1c2VyLXNwZWNpZmllZCBkcmF3ZXIgY29uZmlnLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlT3ZlcmxheShjb25maWc6IE10eERyYXdlckNvbmZpZyk6IE92ZXJsYXlSZWYge1xuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBkaXJlY3Rpb246IGNvbmZpZy5kaXJlY3Rpb24sXG4gICAgICBoYXNCYWNrZHJvcDogY29uZmlnLmhhc0JhY2tkcm9wLFxuICAgICAgZGlzcG9zZU9uTmF2aWdhdGlvbjogY29uZmlnLmNsb3NlT25OYXZpZ2F0aW9uLFxuICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiBjb25maWcuc2Nyb2xsU3RyYXRlZ3kgfHwgdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKCksXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKClbY29uZmlnLnBvc2l0aW9uIV0oJzAnKSxcbiAgICB9KTtcblxuICAgIGlmIChjb25maWcuYmFja2Ryb3BDbGFzcykge1xuICAgICAgb3ZlcmxheUNvbmZpZy5iYWNrZHJvcENsYXNzID0gY29uZmlnLmJhY2tkcm9wQ2xhc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5qZWN0b3IgdG8gYmUgdXNlZCBpbnNpZGUgb2YgYSBkcmF3ZXIgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZyB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZHJhd2VyLlxuICAgKiBAcGFyYW0gZHJhd2VyUmVmIFJlZmVyZW5jZSB0byB0aGUgZHJhd2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlSW5qZWN0b3I8VD4oY29uZmlnOiBNdHhEcmF3ZXJDb25maWcsIGRyYXdlclJlZjogTXR4RHJhd2VyUmVmPFQ+KTogSW5qZWN0b3Ige1xuICAgIGNvbnN0IHVzZXJJbmplY3RvciA9IGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjtcbiAgICBjb25zdCBwcm92aWRlcnM6IFN0YXRpY1Byb3ZpZGVyW10gPSBbXG4gICAgICB7IHByb3ZpZGU6IE10eERyYXdlclJlZiwgdXNlVmFsdWU6IGRyYXdlclJlZiB9LFxuICAgICAgeyBwcm92aWRlOiBNVFhfRFJBV0VSX0RBVEEsIHVzZVZhbHVlOiBjb25maWcuZGF0YSB9LFxuICAgIF07XG5cbiAgICBpZiAoXG4gICAgICBjb25maWcuZGlyZWN0aW9uICYmXG4gICAgICAoIXVzZXJJbmplY3RvciB8fFxuICAgICAgICAhdXNlckluamVjdG9yLmdldDxEaXJlY3Rpb25hbGl0eSB8IG51bGw+KERpcmVjdGlvbmFsaXR5LCBudWxsLCBJbmplY3RGbGFncy5PcHRpb25hbCkpXG4gICAgKSB7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICB1c2VWYWx1ZTogeyB2YWx1ZTogY29uZmlnLmRpcmVjdGlvbiwgY2hhbmdlOiBvYnNlcnZhYmxlT2YoKSB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEluamVjdG9yLmNyZWF0ZSh7IHBhcmVudDogdXNlckluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLCBwcm92aWRlcnMgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGRlZmF1bHQgb3B0aW9ucyB0byB0aGUgZHJhd2VyIGNvbmZpZy5cbiAqIEBwYXJhbSBkZWZhdWx0cyBPYmplY3QgY29udGFpbmluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgdG8gd2hpY2ggdG8gZmFsbCBiYWNrLlxuICogQHBhcmFtIGNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB0aGUgZGVmYXVsdHMgd2lsbCBiZSBhcHBsaWVkLlxuICogQHJldHVybnMgVGhlIG5ldyBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIGRlZmF1bHRzIGFwcGxpZWQuXG4gKi9cbmZ1bmN0aW9uIF9hcHBseUNvbmZpZ0RlZmF1bHRzKFxuICBkZWZhdWx0czogTXR4RHJhd2VyQ29uZmlnLFxuICBjb25maWc/OiBNdHhEcmF3ZXJDb25maWdcbik6IE10eERyYXdlckNvbmZpZyB7XG4gIHJldHVybiB7IC4uLmRlZmF1bHRzLCAuLi5jb25maWcgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXR4RHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9kcmF3ZXIvbXR4RHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
|