flash-notifications 0.0.47 → 0.0.49
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/README.md +39 -7
- package/build/container/index.d.ts +14 -1
- package/build/container/index.d.ts.map +1 -1
- package/build/container/index.js +116 -13
- package/build/container/notification.d.ts +8 -1
- package/build/container/notification.d.ts.map +1 -1
- package/build/container/notification.js +215 -4
- package/build/flash-notifications.d.ts +65 -4
- package/build/flash-notifications.d.ts.map +1 -1
- package/build/flash-notifications.js +96 -15
- package/package.json +6 -1
package/README.md
CHANGED
|
@@ -10,6 +10,14 @@ npm install flash-notifications
|
|
|
10
10
|
|
|
11
11
|
For managed Expo projects, ensure your Expo SDK supports this module and follow the Expo install guidance for modules. For bare React Native projects, install and configure the `expo` package before continuing.
|
|
12
12
|
|
|
13
|
+
`expo` is an optional peer dependency: the runtime code never imports it (it is only used by the native module build config). Plain web apps can use this package by aliasing `react-native$` to `react-native-web` in their bundler, for example in webpack:
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
resolve: {
|
|
17
|
+
alias: {"react-native$": "react-native-web"}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
13
21
|
## Setup
|
|
14
22
|
|
|
15
23
|
Render the notification container once near the root of your app so it can listen for events globally.
|
|
@@ -69,22 +77,46 @@ FlashNotifications.show({type: "info", text: "Heads up!"})
|
|
|
69
77
|
|
|
70
78
|
### FlashNotifications
|
|
71
79
|
|
|
72
|
-
`FlashNotifications.alert(message)`
|
|
80
|
+
`FlashNotifications.alert(message, options?)`
|
|
73
81
|
Shows an alert notification with a localized "Alert" title.
|
|
74
82
|
|
|
75
|
-
`FlashNotifications.error(message)`
|
|
83
|
+
`FlashNotifications.error(message, options?)`
|
|
76
84
|
Shows an error notification with a localized "Error" title.
|
|
77
85
|
|
|
78
|
-
`FlashNotifications.success(message)`
|
|
86
|
+
`FlashNotifications.success(message, options?)`
|
|
79
87
|
Shows a success notification with a localized "Success" title.
|
|
80
88
|
|
|
81
|
-
`FlashNotifications.
|
|
89
|
+
`FlashNotifications.activity({message})`
|
|
90
|
+
Shows a long-running activity notification with a localized "Activity" title and a loading bar. It does not auto-dismiss; the returned handle resolves it:
|
|
91
|
+
|
|
92
|
+
- `handle.update({progress})` moves the bar determinately. `progress` is a number in `[0, 1]` (clamped; non-numbers and `NaN` are ignored). Call it without a `progress` to go back to an indeterminate sweep.
|
|
93
|
+
- `handle.succeed(message?)` flashes the success tone, then dismisses.
|
|
94
|
+
- `handle.fail(message?)` flashes the error tone, then dismisses.
|
|
95
|
+
- `handle.done()` dismisses without a tone change.
|
|
96
|
+
|
|
97
|
+
`FlashNotifications.show({type, text, persistent?, presentation?})`
|
|
82
98
|
Shows a notification with a localized title based on `type`. Unknown types fall back to the localized "Notification" title.
|
|
83
99
|
|
|
84
|
-
|
|
85
|
-
|
|
100
|
+
### Notification options
|
|
101
|
+
|
|
102
|
+
`options` (second argument of `alert`/`error`/`success`/`errorResponse`, or extra keys in `show`) supports:
|
|
103
|
+
|
|
104
|
+
- `persistent: true` — the notification never auto-dismisses. It stays on screen until it is dismissed, like an activity notification, but without a progress bar.
|
|
105
|
+
- `presentation: "modal"` — the notification renders as a centered card over a full-screen backdrop that blocks interaction with the app underneath. It can only be dismissed via its explicit Dismiss button; backdrop clicks and Escape do not dismiss it. On web the dialog carries `role="alertdialog"` and `aria-modal`, focus moves into the dialog on open, and focus returns to the previously focused element on dismiss. The default is `"toast"` (the usual corner stack).
|
|
106
|
+
|
|
107
|
+
```js
|
|
108
|
+
import {FlashNotifications} from "flash-notifications"
|
|
109
|
+
|
|
110
|
+
FlashNotifications.error("Registration could not be saved.", {
|
|
111
|
+
persistent: true,
|
|
112
|
+
presentation: "modal"
|
|
113
|
+
})
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Notifications auto-dismiss after 4 seconds and can be dismissed immediately by pressing them. Activity notifications are the exception: they stay on screen until the handle resolves them (or the card is pressed, which acts like `done()`). Notifications pushed with `persistent: true` stay until dismissed as well.
|
|
86
117
|
|
|
87
|
-
|
|
118
|
+
`FlashNotifications.errorResponse(error, options?)`
|
|
119
|
+
Handles Api Maker validation and base errors, converting them into notifications. Unknown errors are logged and rethrown. The options are passed through to the resulting notification.
|
|
88
120
|
|
|
89
121
|
### Container
|
|
90
122
|
|
|
@@ -2,22 +2,35 @@ declare const _default: React.NamedExoticComponent<FlashNotificationsContainerPr
|
|
|
2
2
|
export default _default;
|
|
3
3
|
export type NotificationObjectType = {
|
|
4
4
|
count: number;
|
|
5
|
+
id: string | undefined;
|
|
5
6
|
message: string;
|
|
7
|
+
persistent: boolean | undefined;
|
|
8
|
+
presentation: "toast" | "modal" | undefined;
|
|
6
9
|
title: string;
|
|
7
10
|
type: string;
|
|
8
11
|
};
|
|
9
12
|
export type StoredNotificationType = {
|
|
10
13
|
count: number;
|
|
14
|
+
id: string | undefined;
|
|
11
15
|
height: import("react-native").Animated.Value;
|
|
12
16
|
marginBottom: import("react-native").Animated.Value;
|
|
13
17
|
measuredHeight: number | undefined;
|
|
14
18
|
message: string;
|
|
15
19
|
opacity: import("react-native").Animated.Value;
|
|
20
|
+
persistent: boolean;
|
|
21
|
+
presentation: "toast" | "modal";
|
|
22
|
+
progress: number | undefined;
|
|
16
23
|
removing: boolean;
|
|
17
|
-
timeout: ReturnType<typeof setTimeout
|
|
24
|
+
timeout: ReturnType<typeof setTimeout> | undefined;
|
|
18
25
|
title: string;
|
|
19
26
|
type: string;
|
|
20
27
|
};
|
|
28
|
+
export type ActivityNotificationDetailType = {
|
|
29
|
+
action: "update" | "succeed" | "fail" | "done";
|
|
30
|
+
id: string;
|
|
31
|
+
message?: string | undefined;
|
|
32
|
+
progress?: number | undefined;
|
|
33
|
+
};
|
|
21
34
|
export type FlashNotificationsContainerProps = {
|
|
22
35
|
insets?: {
|
|
23
36
|
top?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"/src/","sources":["container/index.jsx"],"names":[],"mappings":";;;WAmBc,MAAM;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"/src/","sources":["container/index.jsx"],"names":[],"mappings":";;;WAmBc,MAAM;QACN,MAAM,GAAG,SAAS;aAClB,MAAM;gBACN,OAAO,GAAG,SAAS;kBACnB,OAAO,GAAG,OAAO,GAAG,SAAS;WAC7B,MAAM;UACN,MAAM;;;WAKN,MAAM;QACN,MAAM,GAAG,SAAS;YAClB,OAAO,cAAc,EAAE,QAAQ,CAAC,KAAK;kBACrC,OAAO,cAAc,EAAE,QAAQ,CAAC,KAAK;oBACrC,MAAM,GAAG,SAAS;aAClB,MAAM;aACN,OAAO,cAAc,EAAE,QAAQ,CAAC,KAAK;gBACrC,OAAO;kBACP,OAAO,GAAG,OAAO;cACjB,MAAM,GAAG,SAAS;cAClB,OAAO;aACP,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS;WACzC,MAAM;UACN,MAAM;;;YAKN,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM;QACtC,MAAM;cACN,MAAM,YAAC;eACP,MAAM,YAAC;;;aAKP;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,YAAC;;;WAK9C,MAAM;mBACN,sBAAsB,EAAE;;kBAxDQ,OAAO"}
|
package/build/container/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
import { digg } from "diggerize";
|
|
2
|
+
import { dig, digg } from "diggerize";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
// @ts-expect-error Package ships no .d.ts files.
|
|
5
5
|
import propTypesExact from "prop-types-exact";
|
|
@@ -15,23 +15,37 @@ import FlashNotification from "./notification";
|
|
|
15
15
|
/**
|
|
16
16
|
* @typedef {object} NotificationObjectType
|
|
17
17
|
* @property {number} count
|
|
18
|
+
* @property {string | undefined} id
|
|
18
19
|
* @property {string} message
|
|
20
|
+
* @property {boolean | undefined} persistent
|
|
21
|
+
* @property {"toast" | "modal" | undefined} presentation
|
|
19
22
|
* @property {string} title
|
|
20
23
|
* @property {string} type
|
|
21
24
|
*/
|
|
22
25
|
/**
|
|
23
26
|
* @typedef {object} StoredNotificationType
|
|
24
27
|
* @property {number} count
|
|
28
|
+
* @property {string | undefined} id
|
|
25
29
|
* @property {import("react-native").Animated.Value} height
|
|
26
30
|
* @property {import("react-native").Animated.Value} marginBottom
|
|
27
31
|
* @property {number | undefined} measuredHeight
|
|
28
32
|
* @property {string} message
|
|
29
33
|
* @property {import("react-native").Animated.Value} opacity
|
|
34
|
+
* @property {boolean} persistent
|
|
35
|
+
* @property {"toast" | "modal"} presentation
|
|
36
|
+
* @property {number | undefined} progress
|
|
30
37
|
* @property {boolean} removing
|
|
31
|
-
* @property {ReturnType<typeof setTimeout>} timeout
|
|
38
|
+
* @property {ReturnType<typeof setTimeout> | undefined} timeout
|
|
32
39
|
* @property {string} title
|
|
33
40
|
* @property {string} type
|
|
34
41
|
*/
|
|
42
|
+
/**
|
|
43
|
+
* @typedef {object} ActivityNotificationDetailType
|
|
44
|
+
* @property {"update" | "succeed" | "fail" | "done"} action
|
|
45
|
+
* @property {string} id
|
|
46
|
+
* @property {string=} message
|
|
47
|
+
* @property {number=} progress
|
|
48
|
+
*/
|
|
35
49
|
/**
|
|
36
50
|
* @typedef {object} FlashNotificationsContainerProps
|
|
37
51
|
* @property {{top?: number, right?: number, left?: number}=} insets
|
|
@@ -59,6 +73,7 @@ class FlashNotificationsContainer extends ShapeComponent {
|
|
|
59
73
|
notificationSpacing = 15;
|
|
60
74
|
setup() {
|
|
61
75
|
useEventEmitter(events, "pushNotification", this.onPushNotificationEvent);
|
|
76
|
+
useEventEmitter(events, "activityNotification", this.onActivityNotificationEvent);
|
|
62
77
|
useEffect(() => {
|
|
63
78
|
return () => {
|
|
64
79
|
for (const timeout of this.timeouts) {
|
|
@@ -104,15 +119,43 @@ class FlashNotificationsContainer extends ShapeComponent {
|
|
|
104
119
|
};
|
|
105
120
|
return style;
|
|
106
121
|
}, [isNative, smDown, mdUp, insets.top, insets.right, insets.left]);
|
|
107
|
-
|
|
108
|
-
//
|
|
109
|
-
|
|
122
|
+
// Modal notifications live in their own full-screen overlay instead of the
|
|
123
|
+
// stacked toast container: the overlay covers the whole viewport so the app
|
|
124
|
+
// underneath cannot be interacted with until the modal is dismissed.
|
|
125
|
+
const modalNotifications = notifications.filter(
|
|
126
|
+
/** @param {StoredNotificationType} notification */
|
|
127
|
+
(notification) => notification.presentation == "modal");
|
|
128
|
+
const toastNotifications = notifications.filter(
|
|
129
|
+
/** @param {StoredNotificationType} notification */
|
|
130
|
+
(notification) => notification.presentation == "toast");
|
|
131
|
+
/**
|
|
132
|
+
* @param {StoredNotificationType} notification
|
|
133
|
+
* @returns {React.ReactElement}
|
|
134
|
+
*/
|
|
135
|
+
const renderNotification = (notification) => (React.createElement(FlashNotification, { count: notification.count, key: `notification-${notification.count}`, message: notification.message, notification: notification, onMeasured: this.onNotificationMeasured, onRemovedClicked: this.onRemovedClicked, persistent: notification.persistent, presentation: notification.presentation, progress: notification.progress, removing: notification.removing, title: notification.title, type: notification.type }));
|
|
136
|
+
return (React.createElement(React.Fragment, null,
|
|
137
|
+
React.createElement(View
|
|
110
138
|
// @ts-expect-error
|
|
111
|
-
|
|
139
|
+
, {
|
|
140
|
+
// @ts-expect-error
|
|
141
|
+
dataSet: this.rootViewDataSet ||= { component: "flash-notifications-container" },
|
|
142
|
+
// @ts-expect-error React Native types do not include the web-only "fixed" position.
|
|
143
|
+
style: viewStyle, testID: "flash-notificaitons/container" }, toastNotifications.map(renderNotification)),
|
|
144
|
+
modalNotifications.length > 0 ? (React.createElement(View
|
|
112
145
|
// @ts-expect-error React Native types do not include the web-only "fixed" position.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
146
|
+
, {
|
|
147
|
+
// @ts-expect-error React Native types do not include the web-only "fixed" position.
|
|
148
|
+
style: {
|
|
149
|
+
// Unlike the toast container, this overlay swallows pointer events on purpose:
|
|
150
|
+
// a modal blocks interaction with the app underneath until it is dismissed.
|
|
151
|
+
pointerEvents: "auto",
|
|
152
|
+
position: isNative ? "absolute" : "fixed",
|
|
153
|
+
top: 0,
|
|
154
|
+
right: 0,
|
|
155
|
+
bottom: 0,
|
|
156
|
+
left: 0,
|
|
157
|
+
zIndex: 100000
|
|
158
|
+
}, testID: "flash-notifications/modal-overlay" }, modalNotifications.map(renderNotification))) : null));
|
|
116
159
|
}
|
|
117
160
|
/**
|
|
118
161
|
* @param {...unknown} args
|
|
@@ -126,27 +169,47 @@ class FlashNotificationsContainer extends ShapeComponent {
|
|
|
126
169
|
* @returns {void}
|
|
127
170
|
*/
|
|
128
171
|
onPushNotification = (detail) => {
|
|
172
|
+
const type = digg(detail, "type");
|
|
173
|
+
// An activity notification without an id has no handle to resolve it and
|
|
174
|
+
// would stay on screen forever, so it is dropped.
|
|
175
|
+
if (type == "activity" && detail.id == undefined) {
|
|
176
|
+
debugLog("FlashNotifications: activity notification without id ignored");
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
129
179
|
const count = this.s.count + 1;
|
|
130
|
-
const
|
|
180
|
+
const persistent = dig(detail, "persistent") == true;
|
|
181
|
+
const presentation = dig(detail, "presentation") == "modal" ? "modal" : "toast";
|
|
182
|
+
// Activity notifications stay on screen until their handle resolves them, and
|
|
183
|
+
// persistent notifications stay until the user dismisses them. Both skip the
|
|
184
|
+
// auto-dismiss timer; only a plain toast gets one.
|
|
185
|
+
const timeout = type == "activity" || persistent ? undefined : setTimeout(() => {
|
|
131
186
|
debugLog("FlashNotifications: notification timeout", { id: count });
|
|
132
187
|
this.dismissNotificationByCount(count, "timeout");
|
|
133
188
|
}, 4000);
|
|
134
|
-
|
|
189
|
+
if (timeout) {
|
|
190
|
+
this.timeouts.push(timeout);
|
|
191
|
+
}
|
|
135
192
|
/** @type {StoredNotificationType} */
|
|
136
193
|
const notification = {
|
|
137
194
|
count,
|
|
138
195
|
height: new Animated.Value(0),
|
|
196
|
+
id: dig(detail, "id"),
|
|
139
197
|
marginBottom: new Animated.Value(this.notificationSpacing),
|
|
140
198
|
measuredHeight: undefined,
|
|
141
199
|
message: digg(detail, "message"),
|
|
142
200
|
opacity: new Animated.Value(1),
|
|
201
|
+
persistent,
|
|
202
|
+
presentation,
|
|
203
|
+
progress: undefined,
|
|
143
204
|
removing: false,
|
|
144
205
|
timeout,
|
|
145
206
|
title: digg(detail, "title"),
|
|
146
|
-
type
|
|
207
|
+
type
|
|
147
208
|
};
|
|
148
209
|
debugLog("FlashNotifications: notification added", {
|
|
149
210
|
id: count,
|
|
211
|
+
persistent: notification.persistent,
|
|
212
|
+
presentation: notification.presentation,
|
|
150
213
|
title: notification.title,
|
|
151
214
|
type: notification.type
|
|
152
215
|
});
|
|
@@ -160,6 +223,46 @@ class FlashNotificationsContainer extends ShapeComponent {
|
|
|
160
223
|
debugLog("FlashNotifications: notification pressed", { id: notification.count });
|
|
161
224
|
this.dismissNotification(notification, "press");
|
|
162
225
|
};
|
|
226
|
+
/**
|
|
227
|
+
* @param {...unknown} args
|
|
228
|
+
* @returns {void}
|
|
229
|
+
*/
|
|
230
|
+
onActivityNotificationEvent = (...args) => {
|
|
231
|
+
this.onActivityNotification(/** @type {ActivityNotificationDetailType} */ (args[0]));
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* @param {ActivityNotificationDetailType} detail
|
|
235
|
+
* @returns {void}
|
|
236
|
+
*/
|
|
237
|
+
onActivityNotification = (detail) => {
|
|
238
|
+
const notification = /** @type {StoredNotificationType | undefined} */ (this.s.notifications.find(
|
|
239
|
+
/** @param {StoredNotificationType} item */
|
|
240
|
+
(item) => item.id === detail.id));
|
|
241
|
+
if (!notification || notification.removing) {
|
|
242
|
+
debugLog("FlashNotifications: activity notification not found", { id: detail.id, action: detail.action });
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (detail.action == "update") {
|
|
246
|
+
debugLog("FlashNotifications: activity progress updated", { id: notification.count, progress: detail.progress });
|
|
247
|
+
notification.progress = detail.progress;
|
|
248
|
+
this.setState({ notifications: [...this.s.notifications] });
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (detail.action == "succeed" || detail.action == "fail") {
|
|
252
|
+
debugLog("FlashNotifications: activity resolved", { id: notification.count, action: detail.action });
|
|
253
|
+
// Map the action verbs onto the canonical type names so the card
|
|
254
|
+
// renders the existing success/error tones during the dismiss flash.
|
|
255
|
+
notification.type = detail.action == "succeed" ? "success" : "error";
|
|
256
|
+
if (detail.message) {
|
|
257
|
+
notification.message = detail.message;
|
|
258
|
+
}
|
|
259
|
+
this.setState({ notifications: [...this.s.notifications] });
|
|
260
|
+
this.dismissNotification(notification, detail.action);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
debugLog("FlashNotifications: activity dismissed", { id: notification.count, action: detail.action });
|
|
264
|
+
this.dismissNotification(notification, "done");
|
|
265
|
+
};
|
|
163
266
|
/**
|
|
164
267
|
* @param {StoredNotificationType} notification
|
|
165
268
|
* @param {number} measuredHeight
|
|
@@ -237,4 +340,4 @@ class FlashNotificationsContainer extends ShapeComponent {
|
|
|
237
340
|
});
|
|
238
341
|
};
|
|
239
342
|
}));
|
|
240
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbImNvbnRhaW5lci9pbmRleC5qc3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBQ2xDLGlEQUFpRDtBQUNqRCxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQTtBQUM3QyxPQUFPLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUUsY0FBYyxFQUFDLE1BQU0sNENBQTRDLENBQUE7QUFDekYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sZUFBZSxNQUFNLHNCQUFzQixDQUFBO0FBQ2xELE9BQU8sV0FBVyxNQUFNLGtDQUFrQyxDQUFBO0FBQzFELE9BQU8sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRTNDLE9BQU8sUUFBUSxNQUFNLGFBQWEsQ0FBQTtBQUNsQyxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxpQkFBaUIsTUFBTSxnQkFBZ0IsQ0FBQTtBQUU5Qzs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBRUgsZUFBZSxJQUFJLENBQUMsY0FBYztBQUNoQzs7R0FFRztBQUNILE1BQU0sMkJBQTRCLFNBQVEsY0FBYztJQUN4RCxNQUFNLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztRQUNoQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFBO0lBRUYsS0FBSyxHQUFHO1FBQ04sS0FBSyxFQUFFLENBQUM7UUFDUix1Q0FBdUM7UUFDdkMsYUFBYSxFQUFFLEVBQUU7S0FDbEIs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QUFZLENBQUMsWUFBWSxFQUFFLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUMsQ0FBQztTQUM1RyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNaLFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRTtnQkFDN0MsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLO2dCQUN0QixVQUFVLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQztnQkFDakQsTUFBTTthQUNQLENBQUMsQ0FBQTtZQUNGLFFBQVEsQ0FBQyx3Q0FBd0MsRUFBRSxFQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFFcEYsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWixhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTTtnQkFDeEMsMkNBQTJDO2dCQUMzQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsS0FBSyxDQUMzQzthQUNGLENBQUMsQ0FBQTtZQUVGLFFBQVEsQ0FBQywwQ0FBMEMsRUFBRSxFQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDeEYsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUE7Q0FDRixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG4vLyBAdHMtZXhwZWN0LWVycm9yIFBhY2thZ2Ugc2hpcHMgbm8gLmQudHMgZmlsZXMuXG5pbXBvcnQgcHJvcFR5cGVzRXhhY3QgZnJvbSBcInByb3AtdHlwZXMtZXhhY3RcIlxuaW1wb3J0IFJlYWN0LCB7bWVtbywgdXNlRWZmZWN0LCB1c2VNZW1vfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtzaGFwZUNvbXBvbmVudCwgU2hhcGVDb21wb25lbnR9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9zaGFwZS1jb21wb25lbnQuanNcIlxuaW1wb3J0IHt1c2VCcmVha3BvaW50fSBmcm9tIFwicmVzcG9uc2l2ZS1icmVha3BvaW50c1wiXG5pbXBvcnQgdXNlRXZlbnRFbWl0dGVyIGZyb20gXCJ5YS11c2UtZXZlbnQtZW1pdHRlclwiXG5pbXBvcnQgdXNlRW52U2Vuc2UgZnJvbSBcImVudi1zZW5zZS9idWlsZC91c2UtZW52LXNlbnNlLmpzXCJcbmltcG9ydCB7QW5pbWF0ZWQsIFZpZXd9IGZyb20gXCJyZWFjdC1uYXRpdmVcIlxuXG5pbXBvcnQgZGVidWdMb2cgZnJvbSBcIi4uL2RlYnVnLmpzXCJcbmltcG9ydCBldmVudHMgZnJvbSBcIi4uL2V2ZW50cy5qc1wiXG5pbXBvcnQgRmxhc2hOb3RpZmljYXRpb24gZnJvbSBcIi4vbm90aWZpY2F0aW9uXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmljYXRpb25PYmplY3RUeXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gY291bnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWROb3RpZmljYXRpb25UeXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gY291bnRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBoZWlnaHRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBtYXJnaW5Cb3R0b21cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBtZWFzdXJlZEhlaWdodFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBvcGFjaXR5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlbW92aW5nXG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+fSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGbGFzaE5vdGlmaWNhdGlvbnNDb250YWluZXJQcm9wc1xuICogQHByb3BlcnR5IHt7dG9wPzogbnVtYmVyLCByaWdodD86IG51bWJlciwgbGVmdD86IG51bWJlcn09fSBpbnNldHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZsYXNoTm90aWZpY2F0aW9uc0NvbnRhaW5lclN0YXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0gY291bnRcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZVtdfSBub3RpZmljYXRpb25zXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgbWVtbyhzaGFwZUNvbXBvbmVudChcbiAgLyoqXG4gICAqIEBhdWdtZW50cyB7U2hhcGVDb21wb25lbnQ8Rmxhc2hOb3RpZmljYXRpb25zQ29udGFpbmVyUHJvcHMsIEZsYXNoTm90aWZpY2F0aW9uc0NvbnRhaW5lclN0YXRlPn1cbiAgICovXG4gIGNsYXNzIEZsYXNoTm90aWZpY2F0aW9uc0NvbnRhaW5lciBleHRlbmRzIFNoYXBlQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHByb3BUeXBlc0V4YWN0KHtcbiAgICBpbnNldHM6IFByb3BUeXBlcy5vYmplY3RcbiAgfSlcblxuICBzdGF0ZSA9IHtcbiAgICBjb3VudDogMCxcbiAgICAvKiogQHR5cGUge1N0b3JlZE5vdGlmaWNhdGlvblR5cGVbXX0gKi9cbiAgICBub3RpZmljYXRpb25zOiBbXVxuICB9XG5cbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgdGltZW91dHMgPSBbXVxuICBub3RpZmljYXRpb25TcGFjaW5nID0gMTVcblxuICBzZXR1cCgpIHtcbiAgICB1c2VFdmVudEVtaXR0ZXIoZXZlbnRzLCBcInB1c2hOb3RpZmljYXRpb25cIiwgdGhpcy5vblB1c2hOb3RpZmljYXRpb25FdmVudClcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB0aW1lb3V0IG9mIHRoaXMudGltZW91dHMpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFtdKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtub3RpZmljYXRpb25zfSA9IHRoaXMuc1xuICAgIGNvbnN0IGluc2V0cyA9IHRoaXMucHJvcHMuaW5zZXRzIHx8IHt9XG5cbiAgICBjb25zdCB7c21Eb3duLCBtZFVwfSA9IHVzZUJyZWFrcG9pbnQoKVxuICAgIGNvbnN0IHtpc05hdGl2ZX0gPSB1c2VFbnZTZW5zZSgpXG5cbiAgICBjb25zdCB2aWV3U3R5bGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGxldCB0b3AgPSAyMFxuICAgICAgbGV0IHJpZ2h0ID0gMFxuICAgICAgbGV0IGxlZnQgPSB1bmRlZmluZWRcblxuICAgICAgaWYgKGluc2V0cy50b3ApIHRvcCArPSBpbnNldHMudG9wXG4gICAgICBpZiAoaW5zZXRzLnJpZ2h0KSByaWdodCArPSBpbnNldHMucmlnaHRcblxuICAgICAgaWYgKHNtRG93bikge1xuICAgICAgICBsZWZ0ID0gMjBcblxuICAgICAgICBpZiAoaW5zZXRzLmxlZnQpIGxlZnQgKz0gaW5zZXRzLmxlZnRcblxuICAgICAgICByaWdodCArPSAyMFxuICAgICAgfSBlbHNlIGlmIChtZFVwKSB7XG4gICAgICAgIHJpZ2h0ICs9IDIwXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgICAvLyBcImJveC1ub25lXCIgc28gdGhlIGZpeGVkLCBoaWdoLXpJbmRleCBjb250YWluZXIgbmV2ZXIgaW50ZXJjZXB0cyBwb2ludGVyIGV2ZW50cyBvbiBpdHMgb3duXG4gICAgICAgIC8vIGJvdW5kczogZW1wdHkgZ2FwcyBwYXNzIHRocm91Z2gsIGFuZCBhIGZhZGluZyBub3RpZmljYXRpb24gKHdob3NlIHdyYXBwZXIgaXMgc2V0IHRvXG4gICAgICAgIC8vIHBvaW50ZXJFdmVudHMgXCJub25lXCIgd2hpbGUgcmVtb3ZpbmcpIHBhc3NlcyB0aHJvdWdoIHRvbywgd2hpbGUgYSBsaXZlIG5vdGlmaWNhdGlvbiBzdGlsbFxuICAgICAgICAvLyByZWNlaXZlcyBpdHMgb3duIHByZXNzZXMuIFdpdGhvdXQgdGhpcyB0aGUgY29udGFpbmVyIGl0c2VsZiB3b3VsZCBzd2FsbG93IGNsaWNrcy9maWxsc1xuICAgICAgICAvLyBhaW1lZCBhdCB0aGUgZm9ybSBiZW5lYXRoIGl0IGR1cmluZyBhIG5vdGlmaWNhdGlvbidzIGZhZGUtb3V0LlxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcImJveC1ub25lXCIsXG4gICAgICAgIHBvc2l0aW9uOiBpc05hdGl2ZSA/IFwiYWJzb2x1dGVcIiA6IFwiZml4ZWRcIixcbiAgICAgICAgdG9wLFxuICAgICAgICByaWdodCxcbiAgICAgICAgbGVmdCxcbiAgICAgICAgekluZGV4OiA5OTk5OVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGVcbiAgICB9LCBbaXNOYXRpdmUsIHNtRG93biwgbWRVcCwgaW5zZXRzLnRvcCwgaW5zZXRzLnJpZ2h0LCBpbnNldHMubGVmdF0pXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFZpZXdcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBkYXRhU2V0PXt0aGlzLnJvb3RWaWV3RGF0YVNldCB8fD0ge2NvbXBvbmVudDogXCJmbGFzaC1ub3RpZmljYXRpb25zLWNvbnRhaW5lclwifX1cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBSZWFjdCBOYXRpdmUgdHlwZXMgZG8gbm90IGluY2x1ZGUgdGhlIHdlYi1vbmx5IFwiZml4ZWRcIiBwb3NpdGlvbi5cbiAgICAgICAgc3R5bGU9e3ZpZXdTdHlsZX1cbiAgICAgICAgdGVzdElEPVwiZmxhc2gtbm90aWZpY2FpdG9ucy9jb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICB7bm90aWZpY2F0aW9ucy5tYXAoXG4gICAgICAgICAgLyoqIEBwYXJhbSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZX0gbm90aWZpY2F0aW9uICovXG4gICAgICAgICAgKG5vdGlmaWNhdGlvbikgPT5cbiAgICAgICAgICA8Rmxhc2hOb3RpZmljYXRpb25cbiAgICAgICAgICAgIGNvdW50PXtub3RpZmljYXRpb24uY291bnR9XG4gICAgICAgICAgICBrZXk9e2Bub3RpZmljYXRpb24tJHtub3RpZmljYXRpb24uY291bnR9YH1cbiAgICAgICAgICAgIG1lc3NhZ2U9e25vdGlmaWNhdGlvbi5tZXNzYWdlfVxuICAgICAgICAgICAgbm90aWZpY2F0aW9uPXtub3RpZmljYXRpb259XG4gICAgICAgICAgICBvbk1lYXN1cmVkPXt0aGlzLm9uTm90aWZpY2F0aW9uTWVhc3VyZWR9XG4gICAgICAgICAgICBvblJlbW92ZWRDbGlja2VkPXt0aGlzLm9uUmVtb3ZlZENsaWNrZWR9XG4gICAgICAgICAgICByZW1vdmluZz17bm90aWZpY2F0aW9uLnJlbW92aW5nfVxuICAgICAgICAgICAgdGl0bGU9e25vdGlmaWNhdGlvbi50aXRsZX1cbiAgICAgICAgICAgIHR5cGU9e25vdGlmaWNhdGlvbi50eXBlfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1ZpZXc+XG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Li4udW5rbm93bn0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uUHVzaE5vdGlmaWNhdGlvbkV2ZW50ID0gKC4uLmFyZ3MpID0+IHtcbiAgICB0aGlzLm9uUHVzaE5vdGlmaWNhdGlvbigvKiogQHR5cGUge05vdGlmaWNhdGlvbk9iamVjdFR5cGV9ICovIChhcmdzWzBdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vdGlmaWNhdGlvbk9iamVjdFR5cGV9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uUHVzaE5vdGlmaWNhdGlvbiA9IChkZXRhaWwpID0+IHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucy5jb3VudCArIDFcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogbm90aWZpY2F0aW9uIHRpbWVvdXRcIiwge2lkOiBjb3VudH0pXG4gICAgICB0aGlzLmRpc21pc3NOb3RpZmljYXRpb25CeUNvdW50KGNvdW50LCBcInRpbWVvdXRcIilcbiAgICB9LCA0MDAwKVxuXG4gICAgdGhpcy50aW1lb3V0cy5wdXNoKHRpbWVvdXQpXG5cbiAgICAvKiogQHR5cGUge1N0b3JlZE5vdGlmaWNhdGlvblR5cGV9ICovXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uID0ge1xuICAgICAgY291bnQsXG4gICAgICBoZWlnaHQ6IG5ldyBBbmltYXRlZC5WYWx1ZSgwKSxcbiAgICAgIG1hcmdpbkJvdHRvbTogbmV3IEFuaW1hdGVkLlZhbHVlKHRoaXMubm90aWZpY2F0aW9uU3BhY2luZyksXG4gICAgICBtZWFzdXJlZEhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZTogZGlnZyhkZXRhaWwsIFwibWVzc2FnZVwiKSxcbiAgICAgIG9wYWNpdHk6IG5ldyBBbmltYXRlZC5WYWx1ZSgxKSxcbiAgICAgIHJlbW92aW5nOiBmYWxzZSxcbiAgICAgIHRpbWVvdXQsXG4gICAgICB0aXRsZTogZGlnZyhkZXRhaWwsIFwidGl0bGVcIiksXG4gICAgICB0eXBlOiBkaWdnKGRldGFpbCwgXCJ0eXBlXCIpXG4gICAgfVxuXG4gICAgZGVidWdMb2coXCJGbGFzaE5vdGlmaWNhdGlvbnM6IG5vdGlmaWNhdGlvbiBhZGRlZFwiLCB7XG4gICAgICBpZDogY291bnQsXG4gICAgICB0aXRsZTogbm90aWZpY2F0aW9uLnRpdGxlLFxuICAgICAgdHlwZTogbm90aWZpY2F0aW9uLnR5cGVcbiAgICB9KVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7Y291bnQsIG5vdGlmaWNhdGlvbnM6IHRoaXMucy5ub3RpZmljYXRpb25zLmNvbmNhdChbbm90aWZpY2F0aW9uXSl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZX0gbm90aWZpY2F0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25SZW1vdmVkQ2xpY2tlZCA9IChub3RpZmljYXRpb24pID0+IHtcbiAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogbm90aWZpY2F0aW9uIHByZXNzZWRcIiwge2lkOiBub3RpZmljYXRpb24uY291bnR9KVxuICAgIHRoaXMuZGlzbWlzc05vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIFwicHJlc3NcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0b3JlZE5vdGlmaWNhdGlvblR5cGV9IG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gbWVhc3VyZWRIZWlnaHRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbk5vdGlmaWNhdGlvbk1lYXN1cmVkID0gKG5vdGlmaWNhdGlvbiwgbWVhc3VyZWRIZWlnaHQpID0+IHtcbiAgICBpZiAobm90aWZpY2F0aW9uLm1lYXN1cmVkSGVpZ2h0KSByZXR1cm5cblxuICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBub3RpZmljYXRpb24gbWVhc3VyZWRcIiwge2lkOiBub3RpZmljYXRpb24uY291bnQsIGhlaWdodDogbWVhc3VyZWRIZWlnaHR9KVxuXG4gICAgbm90aWZpY2F0aW9uLm1lYXN1cmVkSGVpZ2h0ID0gbWVhc3VyZWRIZWlnaHRcbiAgICBub3RpZmljYXRpb24uaGVpZ2h0LnNldFZhbHVlKG1lYXN1cmVkSGVpZ2h0KVxuICAgIHRoaXMuc2V0U3RhdGUoe25vdGlmaWNhdGlvbnM6IFsuLi50aGlzLnMubm90aWZpY2F0aW9uc119KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl1cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICovXG4gIGRpc21pc3NOb3RpZmljYXRpb25CeUNvdW50ID0gKGNvdW50LCByZWFzb24gPSBcInVua25vd25cIikgPT4ge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IC8qKiBAdHlwZSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZSB8IHVuZGVmaW5lZH0gKi8gKHRoaXMucy5ub3RpZmljYXRpb25zLmZpbmQoXG4gICAgICAvKiogQHBhcmFtIHtTdG9yZWROb3RpZmljYXRpb25UeXBlfSBpdGVtICovXG4gICAgICAoaXRlbSkgPT4gaXRlbS5jb3VudCA9PSBjb3VudFxuICAgICkpXG4gICAgaWYgKCFub3RpZmljYXRpb24pIHtcbiAgICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBub3RpZmljYXRpb24gbm90IGZvdW5kXCIsIHtpZDogY291bnQsIHJlYXNvbn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmRpc21pc3NOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCByZWFzb24pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdG9yZWROb3RpZmljYXRpb25UeXBlfSBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGlzbWlzc05vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb24sIHJlYXNvbiA9IFwidW5rbm93blwiKSA9PiB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5yZW1vdmluZykge1xuICAgICAgZGVidWdMb2coXCJGbGFzaE5vdGlmaWNhdGlvbnM6IG5vdGlmaWNhdGlvbiBhbHJlYWR5IHJlbW92aW5nXCIsIHtpZDogbm90aWZpY2F0aW9uLmNvdW50LCByZWFzb259KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbm90aWZpY2F0aW9uLnJlbW92aW5nID0gdHJ1ZVxuICAgIGlmIChub3RpZmljYXRpb24udGltZW91dCkgY2xlYXJUaW1lb3V0KG5vdGlmaWNhdGlvbi50aW1lb3V0KVxuXG4gICAgaWYgKCFub3RpZmljYXRpb24ubWVhc3VyZWRIZWlnaHQpIHtcbiAgICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBub3RpZmljYXRpb24gbWlzc2luZyBtZWFzdXJlZCBoZWlnaHRcIiwge2lkOiBub3RpZmljYXRpb24uY291bnR9KVxuICAgICAgbm90aWZpY2F0aW9uLm1lYXN1cmVkSGVpZ2h0ID0gMVxuICAgICAgbm90aWZpY2F0aW9uLmhlaWdodC5zZXRWYWx1ZSgxKVxuICAgIH1cblxuICAgIC8vIFJlLXJlbmRlciBpbW1lZGlhdGVseSBzbyB0aGUgY2xvc2luZyBub3RpZmljYXRpb24gZHJvcHMgcG9pbnRlciBldmVudHMgKHBvaW50ZXJFdmVudHM9XCJub25lXCIpXG4gICAgLy8gdGhlIGluc3RhbnQgaXQgc3RhcnRzIGZhZGluZyBvdXQuIE90aGVyd2lzZSB0aGUgZmFkaW5nIG92ZXJsYXkga2VlcHMgaW50ZXJjZXB0aW5nIHRoZSBuZXh0XG4gICAgLy8gY2xpY2svZmlsbCBmb3IgdGhlIHdob2xlIGZhZGUgZHVyYXRpb24gZXZlbiB0aG91Z2ggaXQgaXMgb24gaXRzIHdheSBvdXQuXG4gICAgdGhpcy5zZXRTdGF0ZSh7bm90aWZpY2F0aW9uczogWy4uLnRoaXMucy5ub3RpZmljYXRpb25zXX0pXG5cbiAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogYW5pbWF0aW9ucyBiZWdpblwiLCB7XG4gICAgICBpZDogbm90aWZpY2F0aW9uLmNvdW50LFxuICAgICAgYW5pbWF0aW9uczogW1wib3BhY2l0eVwiLCBcImhlaWdodFwiLCBcIm1hcmdpbkJvdHRvbVwiXSxcbiAgICAgIHJlYXNvblxuICAgIH0pXG4gICAgZGVidWdMb2coXCJGbGFzaE5vdGlmaWNhdGlvbnM6IGZhZGUgYW5pbWF0aW9uIGJlZ2luXCIsIHtpZDogbm90aWZpY2F0aW9uLmNvdW50LCByZWFzb259KVxuXG4gICAgY29uc3QgZGlzbWlzc0R1cmF0aW9uID0gcmVhc29uID09PSBcInByZXNzXCIgPyA4MCA6IDIwMFxuXG4gICAgQW5pbWF0ZWQucGFyYWxsZWwoW1xuICAgICAgQW5pbWF0ZWQudGltaW5nKG5vdGlmaWNhdGlvbi5vcGFjaXR5LCB7dG9WYWx1ZTogMCwgZHVyYXRpb246IGRpc21pc3NEdXJhdGlvbiwgdXNlTmF0aXZlRHJpdmVyOiBmYWxzZX0pLFxuICAgICAgQW5pbWF0ZWQudGltaW5nKG5vdGlmaWNhdGlvbi5oZWlnaHQsIHt0b1ZhbHVlOiAwLCBkdXJhdGlvbjogZGlzbWlzc0R1cmF0aW9uLCB1c2VOYXRpdmVEcml2ZXI6IGZhbHNlfSksXG4gICAgICBBbmltYXRlZC50aW1pbmcobm90aWZpY2F0aW9uLm1hcmdpbkJvdHRvbSwge3RvVmFsdWU6IDAsIGR1cmF0aW9uOiBkaXNtaXNzRHVyYXRpb24sIHVzZU5hdGl2ZURyaXZlcjogZmFsc2V9KVxuICAgIF0pLnN0YXJ0KCgpID0+IHtcbiAgICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBhbmltYXRpb25zIGVuZFwiLCB7XG4gICAgICAgIGlkOiBub3RpZmljYXRpb24uY291bnQsXG4gICAgICAgIGFuaW1hdGlvbnM6IFtcIm9wYWNpdHlcIiwgXCJoZWlnaHRcIiwgXCJtYXJnaW5Cb3R0b21cIl0sXG4gICAgICAgIHJlYXNvblxuICAgICAgfSlcbiAgICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBmYWRlIGFuaW1hdGlvbiBlbmRcIiwge2lkOiBub3RpZmljYXRpb24uY291bnQsIHJlYXNvbn0pXG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBub3RpZmljYXRpb25zOiB0aGlzLnMubm90aWZpY2F0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgLyoqIEBwYXJhbSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZX0gaXRlbSAqL1xuICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmNvdW50ICE9IG5vdGlmaWNhdGlvbi5jb3VudFxuICAgICAgICApXG4gICAgICB9KVxuXG4gICAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogbm90aWZpY2F0aW9uIHJlbW92ZWRcIiwge2lkOiBub3RpZmljYXRpb24uY291bnQsIHJlYXNvbn0pXG4gICAgfSlcbiAgfVxufSkpXG4iXX0=
|
|
343
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbImNvbnRhaW5lci9pbmRleC5qc3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxpREFBaUQ7QUFDakQsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUNyRCxPQUFPLEVBQUMsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3pGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUNwRCxPQUFPLGVBQWUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNsRCxPQUFPLFdBQVcsTUFBTSxrQ0FBa0MsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUUzQyxPQUFPLFFBQVEsTUFBTSxhQUFhLENBQUE7QUFDbEMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8saUJBQWlCLE1BQU0sZ0JBQWdCLENBQUE7QUFFOUM7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBRUgsZUFBZSxJQUFJLENBQUMsY0FBYztBQUNoQzs7R0FFRztBQUNILE1BQU0sMkJBQTRCLFNBQVEsY0FBYztJQUN4RCxNQUFNLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztRQUNoQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFBO0lBRUYsS0FBSyxHQUFHO1FBQ04sS0FBSyxFQUFFLENBQUM7UUFDUix1Q0FBdUM7UUFDdkMsYUFBYSxFQUFFLEVBQUU7S0FDbEIsQ0FBQTtJQUVELHVCQUF1QjtJQUN2QixRQUFRLEdBQUcsRUFBRSxDQUFBO0lBQ2IsbUJBQW1CLEdBQUcsRUFBRSxDQUFBO0lBRXhCLEtBQUs7UUFDSCxlQUFlLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQ3pFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7UUFDakYsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNiLE9BQU8sR0FBRyxFQUFFO2dCQUNWLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDLENBQUE7UUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDUixDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sRUFBQyxhQUFhLEVBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQTtRQUV0QyxNQUFNLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxHQUFHLGFBQWEsRUFBRSxDQUFBO1FBQ3RDLE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUVoQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQzdCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQTtZQUNaLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQTtZQUNiLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQTtZQUVwQixJQUFJLE1BQU0sQ0FBQyxHQUFHO2dCQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFBO1lBQ2pDLElBQUksTUFBTSxDQUFDLEtBQUs7Z0JBQUUsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUE7WUFFdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLEdBQUcsRUFBRSxDQUFBO2dCQUVULElBQUksTUFBTSxDQUFDLElBQUk7b0JBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUE7Z0JBRXBDLEtBQUssSUFBSSxFQUFFLENBQUE7WUFDYixDQUFDO2lCQUFNLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLEtBQUssSUFBSSxFQUFFLENBQUE7WUFDYixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUc7Z0JBQ1osNEZBQTRGO2dCQUM1RixzRkFBc0Y7Z0JBQ3RGLDJGQUEyRjtnQkFDM0YseUZBQXlGO2dCQUN6RixpRUFBaUU7Z0JBQ2pFLGFBQWEsRUFBRSxVQUFVO2dCQUN6QixRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQ3pDLEdBQUc7Z0JBQ0gsS0FBSztnQkFDTCxJQUFJO2dCQUNKLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQTtZQUVELE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBRW5FLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLE1BQU07UUFDN0MsbURBQW1EO1FBQ25ELENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FDdkQsQ0FBQTtRQUNELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLE1BQU07UUFDN0MsbURBQW1EO1FBQ25ELENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FDdkQsQ0FBQTtRQUVEOzs7V0FHRztRQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQzNDLG9CQUFDLGlCQUFpQixJQUNoQixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFDekIsR0FBRyxFQUFFLGdCQUFnQixZQUFZLENBQUMsS0FBSyxFQUFFLEVBQ3pDLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUM3QixZQUFZLEVBQUUsWUFBWSxFQUMxQixVQUFVLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUN2QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQ3ZDLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxFQUNuQyxZQUFZLEVBQUUsWUFBWSxDQUFDLFlBQVksRUFDdkMsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQy9CLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUMvQixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFDekIsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLEdBQ3ZCLENBQ0gsQ0FBQTtRQUVELE9BQU8sQ0FDTDtZQUNFLG9CQUFDLElBQUk7WUFDSCxtQkFBbUI7O2dCQUFuQixtQkFBbUI7Z0JBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxLQUFLLEVBQUMsU0FBUyxFQUFFLCtCQUErQixFQUFDO2dCQUM5RSxvRkFBb0Y7Z0JBQ3BGLEtBQUssRUFBRSxTQUFTLEVBQ2hCLE1BQU0sRUFBQywrQkFBK0IsSUFFckMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQ3RDO1lBQ04sa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDL0Isb0JBQUMsSUFBSTtZQUNILG9GQUFvRjs7Z0JBQXBGLG9GQUFvRjtnQkFDcEYsS0FBSyxFQUFFO29CQUNMLCtFQUErRTtvQkFDL0UsNEVBQTRFO29CQUM1RSxhQUFhLEVBQUUsTUFBTTtvQkFDckIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPO29CQUN6QyxHQUFHLEVBQUUsQ0FBQztvQkFDTixLQUFLLEVBQUUsQ0FBQztvQkFDUixNQUFNLEVBQUUsQ0FBQztvQkFDVCxJQUFJLEVBQUUsQ0FBQztvQkFDUCxNQUFNLEVBQUUsTUFBTTtpQkFDZixFQUNELE1BQU0sRUFBQyxtQ0FBbUMsSUFFekMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQ3RDLENBQ1IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNQLENBQ0osQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7UUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHFDQUFxQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMxRSxDQUFDLENBQUE7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFFakMseUVBQXlFO1FBQ3pFLGtEQUFrRDtRQUNsRCxJQUFJLElBQUksSUFBSSxVQUFVLElBQUksTUFBTSxDQUFDLEVBQUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqRCxRQUFRLENBQUMsOERBQThELENBQUMsQ0FBQTtZQUN4RSxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQTtRQUM5QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQTtRQUNwRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7UUFDL0UsOEVBQThFO1FBQzlFLDZFQUE2RTtRQUM3RSxtREFBbUQ7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM3RSxRQUFRLENBQUMsMENBQTBDLEVBQUUsRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUNqRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ25ELENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUVSLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM3QixDQUFDO1FBRUQscUNBQXFDO1FBQ3JDLE1BQU0sWUFBWSxHQUFHO1lBQ25CLEtBQUs7WUFDTCxNQUFNLEVBQUUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3QixFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDckIsWUFBWSxFQUFFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDMUQsY0FBYyxFQUFFLFNBQVM7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ2hDLE9BQU8sRUFBRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFVBQVU7WUFDVixZQUFZO1lBQ1osUUFBUSxFQUFFLFNBQVM7WUFDbkIsUUFBUSxFQUFFLEtBQUs7WUFDZixPQUFPO1lBQ1AsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO1lBQzVCLElBQUk7U0FDTCxDQUFBO1FBRUQsUUFBUSxDQUFDLHdDQUF3QyxFQUFFO1lBQ2pELEVBQUUsRUFBRSxLQUFLO1lBQ1QsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVO1lBQ25DLFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWTtZQUN2QyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7WUFDekIsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO1NBQ3hCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO0lBQ3BGLENBQUMsQ0FBQTtJQUVEOzs7T0FHRztJQUNILGdCQUFnQixHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUU7UUFDbEMsUUFBUSxDQUFDLDBDQUEwQyxFQUFFLEVBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBQzlFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDakQsQ0FBQyxDQUFBO0lBRUQ7OztPQUdHO0lBQ0gsMkJBQTJCLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFO1FBQ3hDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdEYsQ0FBQyxDQUFBO0lBRUQ7OztPQUdHO0lBQ0gsc0JBQXNCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNsQyxNQUFNLFlBQVksR0FBRyxpREFBaUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUk7UUFDL0YsMkNBQTJDO1FBQzNDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQ2hDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNDLFFBQVEsQ0FBQyxxREFBcUQsRUFBRSxFQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUN2RyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUM5QixRQUFRLENBQUMsK0NBQStDLEVBQUUsRUFBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7WUFDOUcsWUFBWSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFBO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFBO1lBQ3pELE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzFELFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRSxFQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUNsRyxpRUFBaUU7WUFDakUscUVBQXFFO1lBQ3JFLFlBQVksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO1lBQ3BFLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQixZQUFZLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUE7WUFDdkMsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFBO1lBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3JELE9BQU07UUFDUixDQUFDO1FBRUQsUUFBUSxDQUFDLHdDQUF3QyxFQUFFLEVBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ25HLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDaEQsQ0FBQyxDQUFBO0lBRUQ7Ozs7T0FJRztJQUNILHNCQUFzQixHQUFHLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxFQUFFO1FBQ3hELElBQUksWUFBWSxDQUFDLGNBQWM7WUFBRSxPQUFNO1FBRXZDLFFBQVEsQ0FBQywyQ0FBMkMsRUFBRSxFQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO1FBRXZHLFlBQVksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQzVDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFBO0lBQzNELENBQUMsQ0FBQTtJQUVEOzs7O01BSUU7SUFDRiwwQkFBMEIsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUFFLEVBQUU7UUFDekQsTUFBTSxZQUFZLEdBQUcsaURBQWlELENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJO1FBQy9GLDJDQUEyQztRQUMzQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQzlCLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixRQUFRLENBQUMsNENBQTRDLEVBQUUsRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFDM0UsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ2hELENBQUMsQ0FBQTtJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUFFLEVBQUU7UUFDekQsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUIsUUFBUSxDQUFDLG1EQUFtRCxFQUFFLEVBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUMvRixPQUFNO1FBQ1IsQ0FBQztRQUVELFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1FBQzVCLElBQUksWUFBWSxDQUFDLE9BQU87WUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRTVELElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakMsUUFBUSxDQUFDLDBEQUEwRCxFQUFFLEVBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBQzlGLFlBQVksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFBO1lBQy9CLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pDLENBQUM7UUFFRCxnR0FBZ0c7UUFDaEcsNkZBQTZGO1FBQzdGLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFDLENBQUMsQ0FBQTtRQUV6RCxRQUFRLENBQUMsc0NBQXNDLEVBQUU7WUFDL0MsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLO1lBQ3RCLFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDO1lBQ2pELE1BQU07U0FDUCxDQUFDLENBQUE7UUFDRixRQUFRLENBQUMsMENBQTBDLEVBQUUsRUFBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBRXRGLE1BQU0sZUFBZSxHQUFHLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBRXJELFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDaEIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUMsQ0FBQztZQUN0RyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDO1lBQ3JHLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFDLENBQUM7U0FDNUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDWixRQUFRLENBQUMsb0NBQW9DLEVBQUU7Z0JBQzdDLEVBQUUsRUFBRSxZQUFZLENBQUMsS0FBSztnQkFDdEIsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUM7Z0JBQ2pELE1BQU07YUFDUCxDQUFDLENBQUE7WUFDRixRQUFRLENBQUMsd0NBQXdDLEVBQUUsRUFBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1lBRXBGLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07Z0JBQ3hDLDJDQUEyQztnQkFDM0MsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLEtBQUssQ0FDM0M7YUFDRixDQUFDLENBQUE7WUFFRixRQUFRLENBQUMsMENBQTBDLEVBQUUsRUFBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ3hGLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFBO0NBQ0YsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWcsIGRpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG4vLyBAdHMtZXhwZWN0LWVycm9yIFBhY2thZ2Ugc2hpcHMgbm8gLmQudHMgZmlsZXMuXG5pbXBvcnQgcHJvcFR5cGVzRXhhY3QgZnJvbSBcInByb3AtdHlwZXMtZXhhY3RcIlxuaW1wb3J0IFJlYWN0LCB7bWVtbywgdXNlRWZmZWN0LCB1c2VNZW1vfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtzaGFwZUNvbXBvbmVudCwgU2hhcGVDb21wb25lbnR9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9zaGFwZS1jb21wb25lbnQuanNcIlxuaW1wb3J0IHt1c2VCcmVha3BvaW50fSBmcm9tIFwicmVzcG9uc2l2ZS1icmVha3BvaW50c1wiXG5pbXBvcnQgdXNlRXZlbnRFbWl0dGVyIGZyb20gXCJ5YS11c2UtZXZlbnQtZW1pdHRlclwiXG5pbXBvcnQgdXNlRW52U2Vuc2UgZnJvbSBcImVudi1zZW5zZS9idWlsZC91c2UtZW52LXNlbnNlLmpzXCJcbmltcG9ydCB7QW5pbWF0ZWQsIFZpZXd9IGZyb20gXCJyZWFjdC1uYXRpdmVcIlxuXG5pbXBvcnQgZGVidWdMb2cgZnJvbSBcIi4uL2RlYnVnLmpzXCJcbmltcG9ydCBldmVudHMgZnJvbSBcIi4uL2V2ZW50cy5qc1wiXG5pbXBvcnQgRmxhc2hOb3RpZmljYXRpb24gZnJvbSBcIi4vbm90aWZpY2F0aW9uXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmljYXRpb25PYmplY3RUeXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gY291bnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBpZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gcGVyc2lzdGVudFxuICogQHByb3BlcnR5IHtcInRvYXN0XCIgfCBcIm1vZGFsXCIgfCB1bmRlZmluZWR9IHByZXNlbnRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkTm90aWZpY2F0aW9uVHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gaWRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBoZWlnaHRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBtYXJnaW5Cb3R0b21cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBtZWFzdXJlZEhlaWdodFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBvcGFjaXR5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBlcnNpc3RlbnRcbiAqIEBwcm9wZXJ0eSB7XCJ0b2FzdFwiIHwgXCJtb2RhbFwifSBwcmVzZW50YXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBwcm9ncmVzc1xuICogQHByb3BlcnR5IHtib29sZWFufSByZW1vdmluZ1xuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWN0aXZpdHlOb3RpZmljYXRpb25EZXRhaWxUeXBlXG4gKiBAcHJvcGVydHkge1widXBkYXRlXCIgfCBcInN1Y2NlZWRcIiB8IFwiZmFpbFwiIHwgXCJkb25lXCJ9IGFjdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkXG4gKiBAcHJvcGVydHkge3N0cmluZz19IG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyPX0gcHJvZ3Jlc3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZsYXNoTm90aWZpY2F0aW9uc0NvbnRhaW5lclByb3BzXG4gKiBAcHJvcGVydHkge3t0b3A/OiBudW1iZXIsIHJpZ2h0PzogbnVtYmVyLCBsZWZ0PzogbnVtYmVyfT19IGluc2V0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmxhc2hOb3RpZmljYXRpb25zQ29udGFpbmVyU3RhdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb3VudFxuICogQHByb3BlcnR5IHtTdG9yZWROb3RpZmljYXRpb25UeXBlW119IG5vdGlmaWNhdGlvbnNcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBtZW1vKHNoYXBlQ29tcG9uZW50KFxuICAvKipcbiAgICogQGF1Z21lbnRzIHtTaGFwZUNvbXBvbmVudDxGbGFzaE5vdGlmaWNhdGlvbnNDb250YWluZXJQcm9wcywgRmxhc2hOb3RpZmljYXRpb25zQ29udGFpbmVyU3RhdGU+fVxuICAgKi9cbiAgY2xhc3MgRmxhc2hOb3RpZmljYXRpb25zQ29udGFpbmVyIGV4dGVuZHMgU2hhcGVDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0gcHJvcFR5cGVzRXhhY3Qoe1xuICAgIGluc2V0czogUHJvcFR5cGVzLm9iamVjdFxuICB9KVxuXG4gIHN0YXRlID0ge1xuICAgIGNvdW50OiAwLFxuICAgIC8qKiBAdHlwZSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZVtdfSAqL1xuICAgIG5vdGlmaWNhdGlvbnM6IFtdXG4gIH1cblxuICAvKiogQHR5cGUge251bWJlcltdfSAqL1xuICB0aW1lb3V0cyA9IFtdXG4gIG5vdGlmaWNhdGlvblNwYWNpbmcgPSAxNVxuXG4gIHNldHVwKCkge1xuICAgIHVzZUV2ZW50RW1pdHRlcihldmVudHMsIFwicHVzaE5vdGlmaWNhdGlvblwiLCB0aGlzLm9uUHVzaE5vdGlmaWNhdGlvbkV2ZW50KVxuICAgIHVzZUV2ZW50RW1pdHRlcihldmVudHMsIFwiYWN0aXZpdHlOb3RpZmljYXRpb25cIiwgdGhpcy5vbkFjdGl2aXR5Tm90aWZpY2F0aW9uRXZlbnQpXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgdGltZW91dCBvZiB0aGlzLnRpbWVvdXRzKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBbXSlcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7bm90aWZpY2F0aW9uc30gPSB0aGlzLnNcbiAgICBjb25zdCBpbnNldHMgPSB0aGlzLnByb3BzLmluc2V0cyB8fCB7fVxuXG4gICAgY29uc3Qge3NtRG93biwgbWRVcH0gPSB1c2VCcmVha3BvaW50KClcbiAgICBjb25zdCB7aXNOYXRpdmV9ID0gdXNlRW52U2Vuc2UoKVxuXG4gICAgY29uc3Qgdmlld1N0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBsZXQgdG9wID0gMjBcbiAgICAgIGxldCByaWdodCA9IDBcbiAgICAgIGxldCBsZWZ0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmIChpbnNldHMudG9wKSB0b3AgKz0gaW5zZXRzLnRvcFxuICAgICAgaWYgKGluc2V0cy5yaWdodCkgcmlnaHQgKz0gaW5zZXRzLnJpZ2h0XG5cbiAgICAgIGlmIChzbURvd24pIHtcbiAgICAgICAgbGVmdCA9IDIwXG5cbiAgICAgICAgaWYgKGluc2V0cy5sZWZ0KSBsZWZ0ICs9IGluc2V0cy5sZWZ0XG5cbiAgICAgICAgcmlnaHQgKz0gMjBcbiAgICAgIH0gZWxzZSBpZiAobWRVcCkge1xuICAgICAgICByaWdodCArPSAyMFxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgICAgLy8gXCJib3gtbm9uZVwiIHNvIHRoZSBmaXhlZCwgaGlnaC16SW5kZXggY29udGFpbmVyIG5ldmVyIGludGVyY2VwdHMgcG9pbnRlciBldmVudHMgb24gaXRzIG93blxuICAgICAgICAvLyBib3VuZHM6IGVtcHR5IGdhcHMgcGFzcyB0aHJvdWdoLCBhbmQgYSBmYWRpbmcgbm90aWZpY2F0aW9uICh3aG9zZSB3cmFwcGVyIGlzIHNldCB0b1xuICAgICAgICAvLyBwb2ludGVyRXZlbnRzIFwibm9uZVwiIHdoaWxlIHJlbW92aW5nKSBwYXNzZXMgdGhyb3VnaCB0b28sIHdoaWxlIGEgbGl2ZSBub3RpZmljYXRpb24gc3RpbGxcbiAgICAgICAgLy8gcmVjZWl2ZXMgaXRzIG93biBwcmVzc2VzLiBXaXRob3V0IHRoaXMgdGhlIGNvbnRhaW5lciBpdHNlbGYgd291bGQgc3dhbGxvdyBjbGlja3MvZmlsbHNcbiAgICAgICAgLy8gYWltZWQgYXQgdGhlIGZvcm0gYmVuZWF0aCBpdCBkdXJpbmcgYSBub3RpZmljYXRpb24ncyBmYWRlLW91dC5cbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJib3gtbm9uZVwiLFxuICAgICAgICBwb3NpdGlvbjogaXNOYXRpdmUgPyBcImFic29sdXRlXCIgOiBcImZpeGVkXCIsXG4gICAgICAgIHRvcCxcbiAgICAgICAgcmlnaHQsXG4gICAgICAgIGxlZnQsXG4gICAgICAgIHpJbmRleDogOTk5OTlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0eWxlXG4gICAgfSwgW2lzTmF0aXZlLCBzbURvd24sIG1kVXAsIGluc2V0cy50b3AsIGluc2V0cy5yaWdodCwgaW5zZXRzLmxlZnRdKVxuXG4gICAgLy8gTW9kYWwgbm90aWZpY2F0aW9ucyBsaXZlIGluIHRoZWlyIG93biBmdWxsLXNjcmVlbiBvdmVybGF5IGluc3RlYWQgb2YgdGhlXG4gICAgLy8gc3RhY2tlZCB0b2FzdCBjb250YWluZXI6IHRoZSBvdmVybGF5IGNvdmVycyB0aGUgd2hvbGUgdmlld3BvcnQgc28gdGhlIGFwcFxuICAgIC8vIHVuZGVybmVhdGggY2Fubm90IGJlIGludGVyYWN0ZWQgd2l0aCB1bnRpbCB0aGUgbW9kYWwgaXMgZGlzbWlzc2VkLlxuICAgIGNvbnN0IG1vZGFsTm90aWZpY2F0aW9ucyA9IG5vdGlmaWNhdGlvbnMuZmlsdGVyKFxuICAgICAgLyoqIEBwYXJhbSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZX0gbm90aWZpY2F0aW9uICovXG4gICAgICAobm90aWZpY2F0aW9uKSA9PiBub3RpZmljYXRpb24ucHJlc2VudGF0aW9uID09IFwibW9kYWxcIlxuICAgIClcbiAgICBjb25zdCB0b2FzdE5vdGlmaWNhdGlvbnMgPSBub3RpZmljYXRpb25zLmZpbHRlcihcbiAgICAgIC8qKiBAcGFyYW0ge1N0b3JlZE5vdGlmaWNhdGlvblR5cGV9IG5vdGlmaWNhdGlvbiAqL1xuICAgICAgKG5vdGlmaWNhdGlvbikgPT4gbm90aWZpY2F0aW9uLnByZXNlbnRhdGlvbiA9PSBcInRvYXN0XCJcbiAgICApXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0b3JlZE5vdGlmaWNhdGlvblR5cGV9IG5vdGlmaWNhdGlvblxuICAgICAqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9XG4gICAgICovXG4gICAgY29uc3QgcmVuZGVyTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbikgPT4gKFxuICAgICAgPEZsYXNoTm90aWZpY2F0aW9uXG4gICAgICAgIGNvdW50PXtub3RpZmljYXRpb24uY291bnR9XG4gICAgICAgIGtleT17YG5vdGlmaWNhdGlvbi0ke25vdGlmaWNhdGlvbi5jb3VudH1gfVxuICAgICAgICBtZXNzYWdlPXtub3RpZmljYXRpb24ubWVzc2FnZX1cbiAgICAgICAgbm90aWZpY2F0aW9uPXtub3RpZmljYXRpb259XG4gICAgICAgIG9uTWVhc3VyZWQ9e3RoaXMub25Ob3RpZmljYXRpb25NZWFzdXJlZH1cbiAgICAgICAgb25SZW1vdmVkQ2xpY2tlZD17dGhpcy5vblJlbW92ZWRDbGlja2VkfVxuICAgICAgICBwZXJzaXN0ZW50PXtub3RpZmljYXRpb24ucGVyc2lzdGVudH1cbiAgICAgICAgcHJlc2VudGF0aW9uPXtub3RpZmljYXRpb24ucHJlc2VudGF0aW9ufVxuICAgICAgICBwcm9ncmVzcz17bm90aWZpY2F0aW9uLnByb2dyZXNzfVxuICAgICAgICByZW1vdmluZz17bm90aWZpY2F0aW9uLnJlbW92aW5nfVxuICAgICAgICB0aXRsZT17bm90aWZpY2F0aW9uLnRpdGxlfVxuICAgICAgICB0eXBlPXtub3RpZmljYXRpb24udHlwZX1cbiAgICAgIC8+XG4gICAgKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxWaWV3XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIGRhdGFTZXQ9e3RoaXMucm9vdFZpZXdEYXRhU2V0IHx8PSB7Y29tcG9uZW50OiBcImZsYXNoLW5vdGlmaWNhdGlvbnMtY29udGFpbmVyXCJ9fVxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgUmVhY3QgTmF0aXZlIHR5cGVzIGRvIG5vdCBpbmNsdWRlIHRoZSB3ZWItb25seSBcImZpeGVkXCIgcG9zaXRpb24uXG4gICAgICAgICAgc3R5bGU9e3ZpZXdTdHlsZX1cbiAgICAgICAgICB0ZXN0SUQ9XCJmbGFzaC1ub3RpZmljYWl0b25zL2NvbnRhaW5lclwiXG4gICAgICAgID5cbiAgICAgICAgICB7dG9hc3ROb3RpZmljYXRpb25zLm1hcChyZW5kZXJOb3RpZmljYXRpb24pfVxuICAgICAgICA8L1ZpZXc+XG4gICAgICAgIHttb2RhbE5vdGlmaWNhdGlvbnMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICA8Vmlld1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBSZWFjdCBOYXRpdmUgdHlwZXMgZG8gbm90IGluY2x1ZGUgdGhlIHdlYi1vbmx5IFwiZml4ZWRcIiBwb3NpdGlvbi5cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIC8vIFVubGlrZSB0aGUgdG9hc3QgY29udGFpbmVyLCB0aGlzIG92ZXJsYXkgc3dhbGxvd3MgcG9pbnRlciBldmVudHMgb24gcHVycG9zZTpcbiAgICAgICAgICAgICAgLy8gYSBtb2RhbCBibG9ja3MgaW50ZXJhY3Rpb24gd2l0aCB0aGUgYXBwIHVuZGVybmVhdGggdW50aWwgaXQgaXMgZGlzbWlzc2VkLlxuICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBcImF1dG9cIixcbiAgICAgICAgICAgICAgcG9zaXRpb246IGlzTmF0aXZlID8gXCJhYnNvbHV0ZVwiIDogXCJmaXhlZFwiLFxuICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgIHpJbmRleDogMTAwMDAwXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdGVzdElEPVwiZmxhc2gtbm90aWZpY2F0aW9ucy9tb2RhbC1vdmVybGF5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7bW9kYWxOb3RpZmljYXRpb25zLm1hcChyZW5kZXJOb3RpZmljYXRpb24pfVxuICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi51bmtub3dufSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25QdXNoTm90aWZpY2F0aW9uRXZlbnQgPSAoLi4uYXJncykgPT4ge1xuICAgIHRoaXMub25QdXNoTm90aWZpY2F0aW9uKC8qKiBAdHlwZSB7Tm90aWZpY2F0aW9uT2JqZWN0VHlwZX0gKi8gKGFyZ3NbMF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9uT2JqZWN0VHlwZX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25QdXNoTm90aWZpY2F0aW9uID0gKGRldGFpbCkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBkaWdnKGRldGFpbCwgXCJ0eXBlXCIpXG5cbiAgICAvLyBBbiBhY3Rpdml0eSBub3RpZmljYXRpb24gd2l0aG91dCBhbiBpZCBoYXMgbm8gaGFuZGxlIHRvIHJlc29sdmUgaXQgYW5kXG4gICAgLy8gd291bGQgc3RheSBvbiBzY3JlZW4gZm9yZXZlciwgc28gaXQgaXMgZHJvcHBlZC5cbiAgICBpZiAodHlwZSA9PSBcImFjdGl2aXR5XCIgJiYgZGV0YWlsLmlkID09IHVuZGVmaW5lZCkge1xuICAgICAgZGVidWdMb2coXCJGbGFzaE5vdGlmaWNhdGlvbnM6IGFjdGl2aXR5IG5vdGlmaWNhdGlvbiB3aXRob3V0IGlkIGlnbm9yZWRcIilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zLmNvdW50ICsgMVxuICAgIGNvbnN0IHBlcnNpc3RlbnQgPSBkaWcoZGV0YWlsLCBcInBlcnNpc3RlbnRcIikgPT0gdHJ1ZVxuICAgIGNvbnN0IHByZXNlbnRhdGlvbiA9IGRpZyhkZXRhaWwsIFwicHJlc2VudGF0aW9uXCIpID09IFwibW9kYWxcIiA/IFwibW9kYWxcIiA6IFwidG9hc3RcIlxuICAgIC8vIEFjdGl2aXR5IG5vdGlmaWNhdGlvbnMgc3RheSBvbiBzY3JlZW4gdW50aWwgdGhlaXIgaGFuZGxlIHJlc29sdmVzIHRoZW0sIGFuZFxuICAgIC8vIHBlcnNpc3RlbnQgbm90aWZpY2F0aW9ucyBzdGF5IHVudGlsIHRoZSB1c2VyIGRpc21pc3NlcyB0aGVtLiBCb3RoIHNraXAgdGhlXG4gICAgLy8gYXV0by1kaXNtaXNzIHRpbWVyOyBvbmx5IGEgcGxhaW4gdG9hc3QgZ2V0cyBvbmUuXG4gICAgY29uc3QgdGltZW91dCA9IHR5cGUgPT0gXCJhY3Rpdml0eVwiIHx8IHBlcnNpc3RlbnQgPyB1bmRlZmluZWQgOiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBub3RpZmljYXRpb24gdGltZW91dFwiLCB7aWQ6IGNvdW50fSlcbiAgICAgIHRoaXMuZGlzbWlzc05vdGlmaWNhdGlvbkJ5Q291bnQoY291bnQsIFwidGltZW91dFwiKVxuICAgIH0sIDQwMDApXG5cbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy50aW1lb3V0cy5wdXNoKHRpbWVvdXQpXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtTdG9yZWROb3RpZmljYXRpb25UeXBlfSAqL1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICAgIGNvdW50LFxuICAgICAgaGVpZ2h0OiBuZXcgQW5pbWF0ZWQuVmFsdWUoMCksXG4gICAgICBpZDogZGlnKGRldGFpbCwgXCJpZFwiKSxcbiAgICAgIG1hcmdpbkJvdHRvbTogbmV3IEFuaW1hdGVkLlZhbHVlKHRoaXMubm90aWZpY2F0aW9uU3BhY2luZyksXG4gICAgICBtZWFzdXJlZEhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZTogZGlnZyhkZXRhaWwsIFwibWVzc2FnZVwiKSxcbiAgICAgIG9wYWNpdHk6IG5ldyBBbmltYXRlZC5WYWx1ZSgxKSxcbiAgICAgIHBlcnNpc3RlbnQsXG4gICAgICBwcmVzZW50YXRpb24sXG4gICAgICBwcm9ncmVzczogdW5kZWZpbmVkLFxuICAgICAgcmVtb3Zpbmc6IGZhbHNlLFxuICAgICAgdGltZW91dCxcbiAgICAgIHRpdGxlOiBkaWdnKGRldGFpbCwgXCJ0aXRsZVwiKSxcbiAgICAgIHR5cGVcbiAgICB9XG5cbiAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogbm90aWZpY2F0aW9uIGFkZGVkXCIsIHtcbiAgICAgIGlkOiBjb3VudCxcbiAgICAgIHBlcnNpc3RlbnQ6IG5vdGlmaWNhdGlvbi5wZXJzaXN0ZW50LFxuICAgICAgcHJlc2VudGF0aW9uOiBub3RpZmljYXRpb24ucHJlc2VudGF0aW9uLFxuICAgICAgdGl0bGU6IG5vdGlmaWNhdGlvbi50aXRsZSxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfSlcblxuICAgIHRoaXMuc2V0U3RhdGUoe2NvdW50LCBub3RpZmljYXRpb25zOiB0aGlzLnMubm90aWZpY2F0aW9ucy5jb25jYXQoW25vdGlmaWNhdGlvbl0pfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0b3JlZE5vdGlmaWNhdGlvblR5cGV9IG5vdGlmaWNhdGlvblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uUmVtb3ZlZENsaWNrZWQgPSAobm90aWZpY2F0aW9uKSA9PiB7XG4gICAgZGVidWdMb2coXCJGbGFzaE5vdGlmaWNhdGlvbnM6IG5vdGlmaWNhdGlvbiBwcmVzc2VkXCIsIHtpZDogbm90aWZpY2F0aW9uLmNvdW50fSlcbiAgICB0aGlzLmRpc21pc3NOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBcInByZXNzXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi51bmtub3dufSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25BY3Rpdml0eU5vdGlmaWNhdGlvbkV2ZW50ID0gKC4uLmFyZ3MpID0+IHtcbiAgICB0aGlzLm9uQWN0aXZpdHlOb3RpZmljYXRpb24oLyoqIEB0eXBlIHtBY3Rpdml0eU5vdGlmaWNhdGlvbkRldGFpbFR5cGV9ICovIChhcmdzWzBdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FjdGl2aXR5Tm90aWZpY2F0aW9uRGV0YWlsVHlwZX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25BY3Rpdml0eU5vdGlmaWNhdGlvbiA9IChkZXRhaWwpID0+IHtcbiAgICBjb25zdCBub3RpZmljYXRpb24gPSAvKiogQHR5cGUge1N0b3JlZE5vdGlmaWNhdGlvblR5cGUgfCB1bmRlZmluZWR9ICovICh0aGlzLnMubm90aWZpY2F0aW9ucy5maW5kKFxuICAgICAgLyoqIEBwYXJhbSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZX0gaXRlbSAqL1xuICAgICAgKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGRldGFpbC5pZFxuICAgICkpXG4gICAgaWYgKCFub3RpZmljYXRpb24gfHwgbm90aWZpY2F0aW9uLnJlbW92aW5nKSB7XG4gICAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogYWN0aXZpdHkgbm90aWZpY2F0aW9uIG5vdCBmb3VuZFwiLCB7aWQ6IGRldGFpbC5pZCwgYWN0aW9uOiBkZXRhaWwuYWN0aW9ufSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChkZXRhaWwuYWN0aW9uID09IFwidXBkYXRlXCIpIHtcbiAgICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBhY3Rpdml0eSBwcm9ncmVzcyB1cGRhdGVkXCIsIHtpZDogbm90aWZpY2F0aW9uLmNvdW50LCBwcm9ncmVzczogZGV0YWlsLnByb2dyZXNzfSlcbiAgICAgIG5vdGlmaWNhdGlvbi5wcm9ncmVzcyA9IGRldGFpbC5wcm9ncmVzc1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7bm90aWZpY2F0aW9uczogWy4uLnRoaXMucy5ub3RpZmljYXRpb25zXX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoZGV0YWlsLmFjdGlvbiA9PSBcInN1Y2NlZWRcIiB8fCBkZXRhaWwuYWN0aW9uID09IFwiZmFpbFwiKSB7XG4gICAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogYWN0aXZpdHkgcmVzb2x2ZWRcIiwge2lkOiBub3RpZmljYXRpb24uY291bnQsIGFjdGlvbjogZGV0YWlsLmFjdGlvbn0pXG4gICAgICAvLyBNYXAgdGhlIGFjdGlvbiB2ZXJicyBvbnRvIHRoZSBjYW5vbmljYWwgdHlwZSBuYW1lcyBzbyB0aGUgY2FyZFxuICAgICAgLy8gcmVuZGVycyB0aGUgZXhpc3Rpbmcgc3VjY2Vzcy9lcnJvciB0b25lcyBkdXJpbmcgdGhlIGRpc21pc3MgZmxhc2guXG4gICAgICBub3RpZmljYXRpb24udHlwZSA9IGRldGFpbC5hY3Rpb24gPT0gXCJzdWNjZWVkXCIgPyBcInN1Y2Nlc3NcIiA6IFwiZXJyb3JcIlxuICAgICAgaWYgKGRldGFpbC5tZXNzYWdlKSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbi5tZXNzYWdlID0gZGV0YWlsLm1lc3NhZ2VcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoe25vdGlmaWNhdGlvbnM6IFsuLi50aGlzLnMubm90aWZpY2F0aW9uc119KVxuICAgICAgdGhpcy5kaXNtaXNzTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgZGV0YWlsLmFjdGlvbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBhY3Rpdml0eSBkaXNtaXNzZWRcIiwge2lkOiBub3RpZmljYXRpb24uY291bnQsIGFjdGlvbjogZGV0YWlsLmFjdGlvbn0pXG4gICAgdGhpcy5kaXNtaXNzTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgXCJkb25lXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdG9yZWROb3RpZmljYXRpb25UeXBlfSBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1lYXN1cmVkSGVpZ2h0XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25Ob3RpZmljYXRpb25NZWFzdXJlZCA9IChub3RpZmljYXRpb24sIG1lYXN1cmVkSGVpZ2h0KSA9PiB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5tZWFzdXJlZEhlaWdodCkgcmV0dXJuXG5cbiAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogbm90aWZpY2F0aW9uIG1lYXN1cmVkXCIsIHtpZDogbm90aWZpY2F0aW9uLmNvdW50LCBoZWlnaHQ6IG1lYXN1cmVkSGVpZ2h0fSlcblxuICAgIG5vdGlmaWNhdGlvbi5tZWFzdXJlZEhlaWdodCA9IG1lYXN1cmVkSGVpZ2h0XG4gICAgbm90aWZpY2F0aW9uLmhlaWdodC5zZXRWYWx1ZShtZWFzdXJlZEhlaWdodClcbiAgICB0aGlzLnNldFN0YXRlKHtub3RpZmljYXRpb25zOiBbLi4udGhpcy5zLm5vdGlmaWNhdGlvbnNdfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAqL1xuICBkaXNtaXNzTm90aWZpY2F0aW9uQnlDb3VudCA9IChjb3VudCwgcmVhc29uID0gXCJ1bmtub3duXCIpID0+IHtcbiAgICBjb25zdCBub3RpZmljYXRpb24gPSAvKiogQHR5cGUge1N0b3JlZE5vdGlmaWNhdGlvblR5cGUgfCB1bmRlZmluZWR9ICovICh0aGlzLnMubm90aWZpY2F0aW9ucy5maW5kKFxuICAgICAgLyoqIEBwYXJhbSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZX0gaXRlbSAqL1xuICAgICAgKGl0ZW0pID0+IGl0ZW0uY291bnQgPT0gY291bnRcbiAgICApKVxuICAgIGlmICghbm90aWZpY2F0aW9uKSB7XG4gICAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogbm90aWZpY2F0aW9uIG5vdCBmb3VuZFwiLCB7aWQ6IGNvdW50LCByZWFzb259KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5kaXNtaXNzTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgcmVhc29uKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RvcmVkTm90aWZpY2F0aW9uVHlwZX0gbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGRpc21pc3NOb3RpZmljYXRpb24gPSAobm90aWZpY2F0aW9uLCByZWFzb24gPSBcInVua25vd25cIikgPT4ge1xuICAgIGlmIChub3RpZmljYXRpb24ucmVtb3ZpbmcpIHtcbiAgICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBub3RpZmljYXRpb24gYWxyZWFkeSByZW1vdmluZ1wiLCB7aWQ6IG5vdGlmaWNhdGlvbi5jb3VudCwgcmVhc29ufSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIG5vdGlmaWNhdGlvbi5yZW1vdmluZyA9IHRydWVcbiAgICBpZiAobm90aWZpY2F0aW9uLnRpbWVvdXQpIGNsZWFyVGltZW91dChub3RpZmljYXRpb24udGltZW91dClcblxuICAgIGlmICghbm90aWZpY2F0aW9uLm1lYXN1cmVkSGVpZ2h0KSB7XG4gICAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogbm90aWZpY2F0aW9uIG1pc3NpbmcgbWVhc3VyZWQgaGVpZ2h0XCIsIHtpZDogbm90aWZpY2F0aW9uLmNvdW50fSlcbiAgICAgIG5vdGlmaWNhdGlvbi5tZWFzdXJlZEhlaWdodCA9IDFcbiAgICAgIG5vdGlmaWNhdGlvbi5oZWlnaHQuc2V0VmFsdWUoMSlcbiAgICB9XG5cbiAgICAvLyBSZS1yZW5kZXIgaW1tZWRpYXRlbHkgc28gdGhlIGNsb3Npbmcgbm90aWZpY2F0aW9uIGRyb3BzIHBvaW50ZXIgZXZlbnRzIChwb2ludGVyRXZlbnRzPVwibm9uZVwiKVxuICAgIC8vIHRoZSBpbnN0YW50IGl0IHN0YXJ0cyBmYWRpbmcgb3V0LiBPdGhlcndpc2UgdGhlIGZhZGluZyBvdmVybGF5IGtlZXBzIGludGVyY2VwdGluZyB0aGUgbmV4dFxuICAgIC8vIGNsaWNrL2ZpbGwgZm9yIHRoZSB3aG9sZSBmYWRlIGR1cmF0aW9uIGV2ZW4gdGhvdWdoIGl0IGlzIG9uIGl0cyB3YXkgb3V0LlxuICAgIHRoaXMuc2V0U3RhdGUoe25vdGlmaWNhdGlvbnM6IFsuLi50aGlzLnMubm90aWZpY2F0aW9uc119KVxuXG4gICAgZGVidWdMb2coXCJGbGFzaE5vdGlmaWNhdGlvbnM6IGFuaW1hdGlvbnMgYmVnaW5cIiwge1xuICAgICAgaWQ6IG5vdGlmaWNhdGlvbi5jb3VudCxcbiAgICAgIGFuaW1hdGlvbnM6IFtcIm9wYWNpdHlcIiwgXCJoZWlnaHRcIiwgXCJtYXJnaW5Cb3R0b21cIl0sXG4gICAgICByZWFzb25cbiAgICB9KVxuICAgIGRlYnVnTG9nKFwiRmxhc2hOb3RpZmljYXRpb25zOiBmYWRlIGFuaW1hdGlvbiBiZWdpblwiLCB7aWQ6IG5vdGlmaWNhdGlvbi5jb3VudCwgcmVhc29ufSlcblxuICAgIGNvbnN0IGRpc21pc3NEdXJhdGlvbiA9IHJlYXNvbiA9PT0gXCJwcmVzc1wiID8gODAgOiAyMDBcblxuICAgIEFuaW1hdGVkLnBhcmFsbGVsKFtcbiAgICAgIEFuaW1hdGVkLnRpbWluZyhub3RpZmljYXRpb24ub3BhY2l0eSwge3RvVmFsdWU6IDAsIGR1cmF0aW9uOiBkaXNtaXNzRHVyYXRpb24sIHVzZU5hdGl2ZURyaXZlcjogZmFsc2V9KSxcbiAgICAgIEFuaW1hdGVkLnRpbWluZyhub3RpZmljYXRpb24uaGVpZ2h0LCB7dG9WYWx1ZTogMCwgZHVyYXRpb246IGRpc21pc3NEdXJhdGlvbiwgdXNlTmF0aXZlRHJpdmVyOiBmYWxzZX0pLFxuICAgICAgQW5pbWF0ZWQudGltaW5nKG5vdGlmaWNhdGlvbi5tYXJnaW5Cb3R0b20sIHt0b1ZhbHVlOiAwLCBkdXJhdGlvbjogZGlzbWlzc0R1cmF0aW9uLCB1c2VOYXRpdmVEcml2ZXI6IGZhbHNlfSlcbiAgICBdKS5zdGFydCgoKSA9PiB7XG4gICAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogYW5pbWF0aW9ucyBlbmRcIiwge1xuICAgICAgICBpZDogbm90aWZpY2F0aW9uLmNvdW50LFxuICAgICAgICBhbmltYXRpb25zOiBbXCJvcGFjaXR5XCIsIFwiaGVpZ2h0XCIsIFwibWFyZ2luQm90dG9tXCJdLFxuICAgICAgICByZWFzb25cbiAgICAgIH0pXG4gICAgICBkZWJ1Z0xvZyhcIkZsYXNoTm90aWZpY2F0aW9uczogZmFkZSBhbmltYXRpb24gZW5kXCIsIHtpZDogbm90aWZpY2F0aW9uLmNvdW50LCByZWFzb259KVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbm90aWZpY2F0aW9uczogdGhpcy5zLm5vdGlmaWNhdGlvbnMuZmlsdGVyKFxuICAgICAgICAgIC8qKiBAcGFyYW0ge1N0b3JlZE5vdGlmaWNhdGlvblR5cGV9IGl0ZW0gKi9cbiAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5jb3VudCAhPSBub3RpZmljYXRpb24uY291bnRcbiAgICAgICAgKVxuICAgICAgfSlcblxuICAgICAgZGVidWdMb2coXCJGbGFzaE5vdGlmaWNhdGlvbnM6IG5vdGlmaWNhdGlvbiByZW1vdmVkXCIsIHtpZDogbm90aWZpY2F0aW9uLmNvdW50LCByZWFzb259KVxuICAgIH0pXG4gIH1cbn0pKVxuIl19
|
|
@@ -2,13 +2,17 @@ declare const _default: React.NamedExoticComponent<FlashNotificationsNotificatio
|
|
|
2
2
|
export default _default;
|
|
3
3
|
export type StoredNotificationType = {
|
|
4
4
|
count: number;
|
|
5
|
+
id: string | undefined;
|
|
5
6
|
height: import("react-native").Animated.Value;
|
|
6
7
|
marginBottom: import("react-native").Animated.Value;
|
|
7
8
|
measuredHeight: number | undefined;
|
|
8
9
|
message: string;
|
|
9
10
|
opacity: import("react-native").Animated.Value;
|
|
11
|
+
persistent: boolean;
|
|
12
|
+
presentation: "toast" | "modal";
|
|
13
|
+
progress: number | undefined;
|
|
10
14
|
removing: boolean;
|
|
11
|
-
timeout: ReturnType<typeof setTimeout
|
|
15
|
+
timeout: ReturnType<typeof setTimeout> | undefined;
|
|
12
16
|
title: string;
|
|
13
17
|
type: string;
|
|
14
18
|
};
|
|
@@ -19,6 +23,9 @@ export type FlashNotificationsNotificationProps = {
|
|
|
19
23
|
notification: StoredNotificationType;
|
|
20
24
|
onMeasured: (notification: StoredNotificationType, measuredHeight: number) => void;
|
|
21
25
|
onRemovedClicked: (notification: StoredNotificationType) => void;
|
|
26
|
+
persistent: boolean;
|
|
27
|
+
presentation: "toast" | "modal";
|
|
28
|
+
progress?: number | undefined;
|
|
22
29
|
removing: boolean;
|
|
23
30
|
title: string;
|
|
24
31
|
type: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.d.ts","sourceRoot":"/src/","sources":["container/notification.jsx"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"/src/","sources":["container/notification.jsx"],"names":[],"mappings":";;;WAcc,MAAM;QACN,MAAM,GAAG,SAAS;YAClB,OAAO,cAAc,EAAE,QAAQ,CAAC,KAAK;kBACrC,OAAO,cAAc,EAAE,QAAQ,CAAC,KAAK;oBACrC,MAAM,GAAG,SAAS;aAClB,MAAM;aACN,OAAO,cAAc,EAAE,QAAQ,CAAC,KAAK;gBACrC,OAAO;kBACP,OAAO,GAAG,OAAO;cACjB,MAAM,GAAG,SAAS;cAClB,OAAO;aACP,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS;WACzC,MAAM;UACN,MAAM;;;gBAKN,MAAM,YAAC;WACP,MAAM;aACN,MAAM;kBACN,sBAAsB;gBACtB,CAAC,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI;sBACtE,CAAC,YAAY,EAAE,sBAAsB,KAAK,IAAI;gBAC9C,OAAO;kBACP,OAAO,GAAG,OAAO;eACjB,MAAM,YAAC;cACP,OAAO;WACP,MAAM;UACN,MAAM;;kBAtCe,OAAO"}
|
|
@@ -6,16 +6,21 @@ import React, { memo, useMemo } from "react";
|
|
|
6
6
|
import { Animated, Pressable, Text, View } from "react-native";
|
|
7
7
|
import { shapeComponent, ShapeComponent } from "set-state-compare/build/shape-component.js";
|
|
8
8
|
import { useBreakpoint } from "responsive-breakpoints";
|
|
9
|
+
import configuration from "../configuration.js";
|
|
9
10
|
/**
|
|
10
11
|
* @typedef {object} StoredNotificationType
|
|
11
12
|
* @property {number} count
|
|
13
|
+
* @property {string | undefined} id
|
|
12
14
|
* @property {import("react-native").Animated.Value} height
|
|
13
15
|
* @property {import("react-native").Animated.Value} marginBottom
|
|
14
16
|
* @property {number | undefined} measuredHeight
|
|
15
17
|
* @property {string} message
|
|
16
18
|
* @property {import("react-native").Animated.Value} opacity
|
|
19
|
+
* @property {boolean} persistent
|
|
20
|
+
* @property {"toast" | "modal"} presentation
|
|
21
|
+
* @property {number | undefined} progress
|
|
17
22
|
* @property {boolean} removing
|
|
18
|
-
* @property {ReturnType<typeof setTimeout>} timeout
|
|
23
|
+
* @property {ReturnType<typeof setTimeout> | undefined} timeout
|
|
19
24
|
* @property {string} title
|
|
20
25
|
* @property {string} type
|
|
21
26
|
*/
|
|
@@ -27,6 +32,9 @@ import { useBreakpoint } from "responsive-breakpoints";
|
|
|
27
32
|
* @property {StoredNotificationType} notification
|
|
28
33
|
* @property {(notification: StoredNotificationType, measuredHeight: number) => void} onMeasured
|
|
29
34
|
* @property {(notification: StoredNotificationType) => void} onRemovedClicked
|
|
35
|
+
* @property {boolean} persistent
|
|
36
|
+
* @property {"toast" | "modal"} presentation
|
|
37
|
+
* @property {number=} progress
|
|
30
38
|
* @property {boolean} removing
|
|
31
39
|
* @property {string} title
|
|
32
40
|
* @property {string} type
|
|
@@ -37,6 +45,8 @@ const dataSets = {};
|
|
|
37
45
|
const viewStyles = {};
|
|
38
46
|
/** @type {Record<string, import("react-native").TextStyle>} */
|
|
39
47
|
const textStyles = {};
|
|
48
|
+
/** @type {import("react-native").ViewStyle} */
|
|
49
|
+
const barFillStyle = { backgroundColor: "#fff", borderRadius: 2, height: 4, width: "30%" };
|
|
40
50
|
/**
|
|
41
51
|
* @augments {ShapeComponent<FlashNotificationsNotificationProps>}
|
|
42
52
|
*/
|
|
@@ -48,14 +58,54 @@ class FlashNotificationsNotification extends ShapeComponent {
|
|
|
48
58
|
notification: PropTypes.object.isRequired,
|
|
49
59
|
onMeasured: PropTypes.func.isRequired,
|
|
50
60
|
onRemovedClicked: PropTypes.func.isRequired,
|
|
61
|
+
persistent: PropTypes.bool.isRequired,
|
|
62
|
+
presentation: PropTypes.oneOf(["toast", "modal"]).isRequired,
|
|
63
|
+
progress: PropTypes.number,
|
|
51
64
|
removing: PropTypes.bool.isRequired,
|
|
52
65
|
title: PropTypes.string.isRequired,
|
|
53
66
|
type: PropTypes.string.isRequired
|
|
54
67
|
});
|
|
68
|
+
/** @type {import("react-native").Animated.Value} */
|
|
69
|
+
barSweep = new Animated.Value(0);
|
|
70
|
+
/** @type {import("react-native").Animated.CompositeAnimation | undefined} */
|
|
71
|
+
barSweepAnimation = undefined;
|
|
72
|
+
/** @type {number} */
|
|
73
|
+
barTrackWidth = 0;
|
|
74
|
+
/**
|
|
75
|
+
* The element that had focus when this modal notification mounted, so focus
|
|
76
|
+
* can be returned to it when the modal is dismissed.
|
|
77
|
+
* @type {HTMLElement | undefined}
|
|
78
|
+
*/
|
|
79
|
+
focusReturnElement = undefined;
|
|
80
|
+
/** @type {{focus?: () => void} | undefined} */
|
|
81
|
+
cardRef = undefined;
|
|
82
|
+
componentDidMount() {
|
|
83
|
+
if (this.p.presentation != "modal")
|
|
84
|
+
return;
|
|
85
|
+
// Remember what had focus before the dialog opened so it can be restored
|
|
86
|
+
// on dismiss. On native there is no document; focus handling is a no-op.
|
|
87
|
+
if (typeof document != "undefined" && document.activeElement instanceof HTMLElement) {
|
|
88
|
+
this.focusReturnElement = document.activeElement;
|
|
89
|
+
}
|
|
90
|
+
// Move focus into the dialog. The card is focusable via tabIndex={-1}.
|
|
91
|
+
setTimeout(() => {
|
|
92
|
+
this.cardRef?.focus?.();
|
|
93
|
+
}, 0);
|
|
94
|
+
}
|
|
95
|
+
componentWillUnmount() {
|
|
96
|
+
this.barSweepAnimation?.stop();
|
|
97
|
+
if (this.p.presentation != "modal")
|
|
98
|
+
return;
|
|
99
|
+
// Return focus to whatever was focused before the modal opened.
|
|
100
|
+
this.focusReturnElement?.focus?.();
|
|
101
|
+
}
|
|
55
102
|
render() {
|
|
56
|
-
const { count, message, title, type } = this.p;
|
|
103
|
+
const { count, message, presentation, progress, title, type } = this.p;
|
|
57
104
|
const { className } = this.props;
|
|
58
105
|
const breakpoint = useBreakpoint();
|
|
106
|
+
if (presentation == "modal") {
|
|
107
|
+
return this.renderModal();
|
|
108
|
+
}
|
|
59
109
|
const pressableDataSet = useMemo(() => ({
|
|
60
110
|
class: className,
|
|
61
111
|
role: "dialog",
|
|
@@ -81,6 +131,9 @@ class FlashNotificationsNotification extends ShapeComponent {
|
|
|
81
131
|
else if (type == "alert") {
|
|
82
132
|
return "1px solid rgba(204, 51, 0, 0.95)";
|
|
83
133
|
}
|
|
134
|
+
else if (type == "activity") {
|
|
135
|
+
return "1px solid rgba(30, 41, 59, 0.95)";
|
|
136
|
+
}
|
|
84
137
|
return undefined;
|
|
85
138
|
})(),
|
|
86
139
|
backgroundColor: (() => {
|
|
@@ -93,6 +146,9 @@ class FlashNotificationsNotification extends ShapeComponent {
|
|
|
93
146
|
else if (type == "alert") {
|
|
94
147
|
return "rgba(204, 51, 0, 0.87)";
|
|
95
148
|
}
|
|
149
|
+
else if (type == "activity") {
|
|
150
|
+
return "rgba(30, 41, 59, 0.87)";
|
|
151
|
+
}
|
|
96
152
|
return undefined;
|
|
97
153
|
})()
|
|
98
154
|
},
|
|
@@ -114,7 +170,109 @@ class FlashNotificationsNotification extends ShapeComponent {
|
|
|
114
170
|
, {
|
|
115
171
|
// @ts-expect-error React Native types do not include the web-only dataSet prop.
|
|
116
172
|
dataSet: dataSets[`notificationMessage-${count}`] ||= { count: `${count}` }, testID: "notification-message" },
|
|
117
|
-
React.createElement(Text, { style: textStyles.messageText ||= { color: "#fff" }, testID: `flash-notifications/notification-${count}/message` }, message))
|
|
173
|
+
React.createElement(Text, { style: textStyles.messageText ||= { color: "#fff" }, testID: `flash-notifications/notification-${count}/message` }, message)),
|
|
174
|
+
type == "activity" ? (React.createElement(View, { onLayout: this.tt.onBarLayout, style: viewStyles.barTrack ||= {
|
|
175
|
+
backgroundColor: "rgba(255, 255, 255, 0.3)",
|
|
176
|
+
borderRadius: 2,
|
|
177
|
+
height: 4,
|
|
178
|
+
marginTop: 10,
|
|
179
|
+
overflow: "hidden"
|
|
180
|
+
}, testID: "flash-notifications-notification-bar" }, progress == undefined ? (React.createElement(Animated.View, { style: {
|
|
181
|
+
...barFillStyle,
|
|
182
|
+
transform: [{ translateX: this.barSweep }]
|
|
183
|
+
}, testID: "flash-notifications-notification-bar-fill" })) : (React.createElement(View, { style: {
|
|
184
|
+
...barFillStyle,
|
|
185
|
+
width: `${progress * 100}%`
|
|
186
|
+
}, testID: "flash-notifications-notification-bar-fill" })))) : null)));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Modal presentation: a full-screen dimmed backdrop with the notification
|
|
190
|
+
* centered on top. The backdrop has no press handler on purpose — clicking
|
|
191
|
+
* it (or pressing Escape) must not dismiss the notification; only the
|
|
192
|
+
* explicit dismiss button does.
|
|
193
|
+
*
|
|
194
|
+
* @returns {React.ReactElement}
|
|
195
|
+
*/
|
|
196
|
+
renderModal() {
|
|
197
|
+
const { count, message, title, type } = this.p;
|
|
198
|
+
const breakpoint = useBreakpoint();
|
|
199
|
+
const dismissLabel = configuration.translate("js.shared.dismiss", { defaultValue: "Dismiss" });
|
|
200
|
+
return (React.createElement(Animated.View, { style: this.tt.modalWrapperStyle, testID: "flash-notifications-modal-backdrop" },
|
|
201
|
+
React.createElement(Pressable, { "aria-modal": true, ref: /** @param {import("react-native").View | null} ref */ (ref) => {
|
|
202
|
+
this.cardRef = /** @type {{focus?: () => void} | undefined} */ (ref);
|
|
203
|
+
}, role: "alertdialog", style: breakpoint.styling({
|
|
204
|
+
base: {
|
|
205
|
+
padding: 15,
|
|
206
|
+
borderRadius: 11,
|
|
207
|
+
border: (() => {
|
|
208
|
+
if (type == "error") {
|
|
209
|
+
return "1px solid rgba(161, 34, 32, 0.95)";
|
|
210
|
+
}
|
|
211
|
+
else if (type == "success") {
|
|
212
|
+
return "1px solid rgba(0, 0, 0, 0.95)";
|
|
213
|
+
}
|
|
214
|
+
else if (type == "alert") {
|
|
215
|
+
return "1px solid rgba(204, 51, 0, 0.95)";
|
|
216
|
+
}
|
|
217
|
+
else if (type == "activity") {
|
|
218
|
+
return "1px solid rgba(30, 41, 59, 0.95)";
|
|
219
|
+
}
|
|
220
|
+
return undefined;
|
|
221
|
+
})(),
|
|
222
|
+
backgroundColor: (() => {
|
|
223
|
+
if (type == "error") {
|
|
224
|
+
return "rgba(161, 34, 32, 0.87)";
|
|
225
|
+
}
|
|
226
|
+
else if (type == "success") {
|
|
227
|
+
return "rgba(0, 0, 0, 0.87)";
|
|
228
|
+
}
|
|
229
|
+
else if (type == "alert") {
|
|
230
|
+
return "rgba(204, 51, 0, 0.87)";
|
|
231
|
+
}
|
|
232
|
+
else if (type == "activity") {
|
|
233
|
+
return "rgba(30, 41, 59, 0.87)";
|
|
234
|
+
}
|
|
235
|
+
return "rgba(0, 0, 0, 0.87)";
|
|
236
|
+
})()
|
|
237
|
+
},
|
|
238
|
+
smDown: {
|
|
239
|
+
marginLeft: 20,
|
|
240
|
+
marginRight: 20,
|
|
241
|
+
maxWidth: "100%"
|
|
242
|
+
},
|
|
243
|
+
mdUp: {
|
|
244
|
+
width: 400,
|
|
245
|
+
maxWidth: "80%"
|
|
246
|
+
}
|
|
247
|
+
}), tabIndex: -1, testID: "flash-notifications-notification" },
|
|
248
|
+
React.createElement(View, { style: viewStyles.titleView ||= { marginBottom: 5 }, testID: "notification-title" },
|
|
249
|
+
React.createElement(Text, { style: textStyles.titleText ||= {
|
|
250
|
+
color: "#fff",
|
|
251
|
+
fontWeight: 700
|
|
252
|
+
}, testID: `flash-notifications/notification-${count}/title` }, title)),
|
|
253
|
+
React.createElement(View
|
|
254
|
+
// @ts-expect-error React Native types do not include the web-only dataSet prop.
|
|
255
|
+
, {
|
|
256
|
+
// @ts-expect-error React Native types do not include the web-only dataSet prop.
|
|
257
|
+
dataSet: dataSets[`notificationMessage-${count}`] ||= { count: `${count}` }, testID: "notification-message" },
|
|
258
|
+
React.createElement(Text, { style: textStyles.messageText ||= { color: "#fff" }, testID: `flash-notifications/notification-${count}/message` }, message)),
|
|
259
|
+
React.createElement(Pressable, { onPress: this.tt.onRemovedClicked, style: breakpoint.styling({
|
|
260
|
+
base: {
|
|
261
|
+
alignSelf: "flex-start",
|
|
262
|
+
backgroundColor: "rgba(255, 255, 255, 0.15)",
|
|
263
|
+
borderRadius: 8,
|
|
264
|
+
borderWidth: 1,
|
|
265
|
+
borderColor: "rgba(255, 255, 255, 0.6)",
|
|
266
|
+
cursor: "pointer",
|
|
267
|
+
marginTop: 15,
|
|
268
|
+
paddingHorizontal: 14,
|
|
269
|
+
paddingVertical: 8
|
|
270
|
+
}
|
|
271
|
+
}), testID: "flash-notifications-modal-dismiss" },
|
|
272
|
+
React.createElement(Text, { style: textStyles.dismissText ||= {
|
|
273
|
+
color: "#fff",
|
|
274
|
+
fontWeight: 700
|
|
275
|
+
} }, dismissLabel)))));
|
|
118
276
|
}
|
|
119
277
|
get wrapperStyle() {
|
|
120
278
|
const { notification, removing } = this.p;
|
|
@@ -126,6 +284,22 @@ class FlashNotificationsNotification extends ShapeComponent {
|
|
|
126
284
|
pointerEvents: removing ? "none" : "auto"
|
|
127
285
|
});
|
|
128
286
|
}
|
|
287
|
+
get modalWrapperStyle() {
|
|
288
|
+
const { notification, removing } = this.p;
|
|
289
|
+
return /** @type {import("react-native").Animated.WithAnimatedObject<import("react-native").ViewStyle>} */ ({
|
|
290
|
+
// Dimmed full-screen backdrop with the card centered on top of it.
|
|
291
|
+
alignItems: "center",
|
|
292
|
+
backgroundColor: "rgba(0, 0, 0, 0.45)",
|
|
293
|
+
bottom: 0,
|
|
294
|
+
justifyContent: "center",
|
|
295
|
+
left: 0,
|
|
296
|
+
opacity: notification.opacity,
|
|
297
|
+
pointerEvents: removing ? "none" : "auto",
|
|
298
|
+
position: "absolute",
|
|
299
|
+
right: 0,
|
|
300
|
+
top: 0
|
|
301
|
+
});
|
|
302
|
+
}
|
|
129
303
|
onRemovedClicked = () => this.p.onRemovedClicked(this.p.notification);
|
|
130
304
|
/**
|
|
131
305
|
* @param {import("react-native").LayoutChangeEvent} event
|
|
@@ -137,6 +311,43 @@ class FlashNotificationsNotification extends ShapeComponent {
|
|
|
137
311
|
this.p.onMeasured(notification, event.nativeEvent.layout.height);
|
|
138
312
|
}
|
|
139
313
|
};
|
|
314
|
+
/**
|
|
315
|
+
* @param {FlashNotificationsNotificationProps} prevProps
|
|
316
|
+
* @returns {void}
|
|
317
|
+
*/
|
|
318
|
+
componentDidUpdate(prevProps) {
|
|
319
|
+
if (prevProps.progress == undefined && this.p.progress != undefined) {
|
|
320
|
+
this.barSweepAnimation?.stop();
|
|
321
|
+
this.barSweepAnimation = undefined;
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
if (prevProps.progress != undefined && this.p.progress == undefined && this.barTrackWidth) {
|
|
325
|
+
this.startBarSweep();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* @returns {void}
|
|
330
|
+
*/
|
|
331
|
+
startBarSweep() {
|
|
332
|
+
this.barSweepAnimation?.stop();
|
|
333
|
+
this.barSweep.setValue(-this.barTrackWidth * 0.3);
|
|
334
|
+
const sweep = Animated.loop(Animated.timing(this.barSweep, { duration: 1000, toValue: this.barTrackWidth, useNativeDriver: false }));
|
|
335
|
+
sweep.start();
|
|
336
|
+
this.barSweepAnimation = sweep;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* @param {import("react-native").LayoutChangeEvent} event
|
|
340
|
+
* @returns {void}
|
|
341
|
+
*/
|
|
342
|
+
onBarLayout = (event) => {
|
|
343
|
+
const trackWidth = event.nativeEvent.layout.width;
|
|
344
|
+
if (!trackWidth || this.barTrackWidth == trackWidth)
|
|
345
|
+
return;
|
|
346
|
+
this.barTrackWidth = trackWidth;
|
|
347
|
+
if (this.p.progress == undefined) {
|
|
348
|
+
this.startBarSweep();
|
|
349
|
+
}
|
|
350
|
+
};
|
|
140
351
|
}
|
|
141
352
|
export default memo(shapeComponent(FlashNotificationsNotification));
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJjb250YWluZXIvbm90aWZpY2F0aW9uLmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBQ2xDLGlEQUFpRDtBQUNqRCxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQTtBQUM3QyxPQUFPLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUM1RCxPQUFPLEVBQUMsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3pGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUVwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVILHFDQUFxQztBQUNyQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUE7QUFDbkIsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQTtBQUNyQiwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0FBRXJCOztHQUVHO0FBQ0gsTUFBTSw4QkFBK0IsU0FBUSxjQUFjO0lBQ3pELE1BQU0sQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ2xDLE9BQU8sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFDcEMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUN6QyxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVO1FBQ3JDLGdCQUFnQixFQUFFLFNB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RTdCLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2xFLENBQUM7SUFDSCxDQUFDLENBQUE7O0FBR0gsZUFBZSxJQUFJLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbi8vIEB0cy1leHBlY3QtZXJyb3IgUGFja2FnZSBzaGlwcyBubyAuZC50cyBmaWxlcy5cbmltcG9ydCBQcm9wVHlwZXNFeGFjdCBmcm9tIFwicHJvcC10eXBlcy1leGFjdFwiXG5pbXBvcnQgUmVhY3QsIHttZW1vLCB1c2VNZW1vfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtBbmltYXRlZCwgUHJlc3NhYmxlLCBUZXh0LCBWaWV3fSBmcm9tIFwicmVhY3QtbmF0aXZlXCJcbmltcG9ydCB7c2hhcGVDb21wb25lbnQsIFNoYXBlQ29tcG9uZW50fSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmUvYnVpbGQvc2hhcGUtY29tcG9uZW50LmpzXCJcbmltcG9ydCB7dXNlQnJlYWtwb2ludH0gZnJvbSBcInJlc3BvbnNpdmUtYnJlYWtwb2ludHNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZE5vdGlmaWNhdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb3VudFxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJyZWFjdC1uYXRpdmVcIikuQW5pbWF0ZWQuVmFsdWV9IGhlaWdodFxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJyZWFjdC1uYXRpdmVcIikuQW5pbWF0ZWQuVmFsdWV9IG1hcmdpbkJvdHRvbVxuICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IG1lYXN1cmVkSGVpZ2h0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJyZWFjdC1uYXRpdmVcIikuQW5pbWF0ZWQuVmFsdWV9IG9wYWNpdHlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVtb3ZpbmdcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD59IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZsYXNoTm90aWZpY2F0aW9uc05vdGlmaWNhdGlvblByb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZz19IGNsYXNzTmFtZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZVxuICogQHByb3BlcnR5IHtTdG9yZWROb3RpZmljYXRpb25UeXBlfSBub3RpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5vdGlmaWNhdGlvbjogU3RvcmVkTm90aWZpY2F0aW9uVHlwZSwgbWVhc3VyZWRIZWlnaHQ6IG51bWJlcikgPT4gdm9pZH0gb25NZWFzdXJlZFxuICogQHByb3BlcnR5IHsobm90aWZpY2F0aW9uOiBTdG9yZWROb3RpZmljYXRpb25UeXBlKSA9PiB2b2lkfSBvblJlbW92ZWRDbGlja2VkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlbW92aW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlXG4gKi9cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fSAqL1xuY29uc3QgZGF0YVNldHMgPSB7fVxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCJyZWFjdC1uYXRpdmVcIikuVmlld1N0eWxlPn0gKi9cbmNvbnN0IHZpZXdTdHlsZXMgPSB7fVxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCJyZWFjdC1uYXRpdmVcIikuVGV4dFN0eWxlPn0gKi9cbmNvbnN0IHRleHRTdHlsZXMgPSB7fVxuXG4vKipcbiAqIEBhdWdtZW50cyB7U2hhcGVDb21wb25lbnQ8Rmxhc2hOb3RpZmljYXRpb25zTm90aWZpY2F0aW9uUHJvcHM+fVxuICovXG5jbGFzcyBGbGFzaE5vdGlmaWNhdGlvbnNOb3RpZmljYXRpb24gZXh0ZW5kcyBTaGFwZUNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBQcm9wVHlwZXNFeGFjdCh7XG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvdW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIG5vdGlmaWNhdGlvbjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIG9uTWVhc3VyZWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25SZW1vdmVkQ2xpY2tlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICByZW1vdmluZzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuICB9KVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7Y291bnQsIG1lc3NhZ2UsIHRpdGxlLCB0eXBlfSA9IHRoaXMucFxuICAgIGNvbnN0IHtjbGFzc05hbWV9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGJyZWFrcG9pbnQgPSB1c2VCcmVha3BvaW50KClcblxuICAgIGNvbnN0IHByZXNzYWJsZURhdGFTZXQgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgcm9sZTogXCJkaWFsb2dcIixcbiAgICAgICAgdHlwZVxuICAgICAgfSksXG4gICAgICBbY2xhc3NOYW1lLCB0eXBlXVxuICAgIClcbiAgICByZXR1cm4gKFxuICAgICAgPEFuaW1hdGVkLlZpZXdcbiAgICAgICAgc3R5bGU9e3RoaXMudHQud3JhcHBlclN0eWxlfVxuICAgICAgPlxuICAgICAgICA8UHJlc3NhYmxlXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBSZWFjdCBOYXRpdmUgdHlwZXMgZG8gbm90IGluY2x1ZGUgdGhlIHdlYi1vbmx5IGRhdGFTZXQgcHJvcC5cbiAgICAgICAgICBkYXRhU2V0PXtwcmVzc2FibGVEYXRhU2V0fVxuICAgICAgICAgIG9uTGF5b3V0PXt0aGlzLnR0Lm9uTGF5b3V0fVxuICAgICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25SZW1vdmVkQ2xpY2tlZH1cbiAgICAgICAgICBzdHlsZT17YnJlYWtwb2ludC5zdHlsaW5nKHtcbiAgICAgICAgICAgIGJhc2U6IHtcbiAgICAgICAgICAgICAgcGFkZGluZzogMTUsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMTEsXG4gICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgICAgIGJvcmRlcjogKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIjFweCBzb2xpZCByZ2JhKDE2MSwgMzQsIDMyLCAwLjk1KVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCIxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjk1KVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwiYWxlcnRcIikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiMXB4IHNvbGlkIHJnYmEoMjA0LCA1MSwgMCwgMC45NSlcIlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmdiYSgxNjEsIDM0LCAzMiwgMC44NylcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmdiYSgwLCAwLCAwLCAwLjg3KVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwiYWxlcnRcIikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmdiYSgyMDQsIDUxLCAwLCAwLjg3KVwiXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc21Eb3duOiB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1kVXA6IHtcbiAgICAgICAgICAgICAgd2lkdGg6IDMwMCxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IFwiMTAwJVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSl9XG4gICAgICAgICAgdGVzdElEPVwiZmxhc2gtbm90aWZpY2F0aW9ucy1ub3RpZmljYXRpb25cIlxuICAgICAgICA+XG4gICAgICAgICAgPFZpZXdcbiAgICAgICAgICAgIHN0eWxlPXt2aWV3U3R5bGVzLnRpdGxlVmlldyB8fD0ge21hcmdpbkJvdHRvbTogNX19XG4gICAgICAgICAgICB0ZXN0SUQ9XCJub3RpZmljYXRpb24tdGl0bGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICAgIHN0eWxlPXt0ZXh0U3R5bGVzLnRpdGxlVGV4dCB8fD0ge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcIiNmZmZcIixcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiA3MDBcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgdGVzdElEPXtgZmxhc2gtbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tJHtjb3VudH0vdGl0bGVgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFJlYWN0IE5hdGl2ZSB0eXBlcyBkbyBub3QgaW5jbHVkZSB0aGUgd2ViLW9ubHkgZGF0YVNldCBwcm9wLlxuICAgICAgICAgICAgZGF0YVNldD17ZGF0YVNldHNbYG5vdGlmaWNhdGlvbk1lc3NhZ2UtJHtjb3VudH1gXSB8fD0ge2NvdW50OiBgJHtjb3VudH1gfX1cbiAgICAgICAgICAgIHRlc3RJRD1cIm5vdGlmaWNhdGlvbi1tZXNzYWdlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICBzdHlsZT17dGV4dFN0eWxlcy5tZXNzYWdlVGV4dCB8fD0ge2NvbG9yOiBcIiNmZmZcIn19XG4gICAgICAgICAgICAgIHRlc3RJRD17YGZsYXNoLW5vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uLSR7Y291bnR9L21lc3NhZ2VgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7bWVzc2FnZX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgPC9BbmltYXRlZC5WaWV3PlxuICAgIClcbiAgfVxuXG4gIGdldCB3cmFwcGVyU3R5bGUoKSB7XG4gICAgY29uc3Qge25vdGlmaWNhdGlvbiwgcmVtb3Zpbmd9ID0gdGhpcy5wXG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCJyZWFjdC1uYXRpdmVcIikuQW5pbWF0ZWQuV2l0aEFuaW1hdGVkT2JqZWN0PGltcG9ydChcInJlYWN0LW5hdGl2ZVwiKS5WaWV3U3R5bGU+fSAqLyAoe1xuICAgICAgaGVpZ2h0OiBub3RpZmljYXRpb24ubWVhc3VyZWRIZWlnaHQgPyBub3RpZmljYXRpb24uaGVpZ2h0IDogdW5kZWZpbmVkLFxuICAgICAgbWFyZ2luQm90dG9tOiBub3RpZmljYXRpb24ubWFyZ2luQm90dG9tLFxuICAgICAgb3BhY2l0eTogbm90aWZpY2F0aW9uLm9wYWNpdHksXG4gICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgIHBvaW50ZXJFdmVudHM6IHJlbW92aW5nID8gXCJub25lXCIgOiBcImF1dG9cIlxuICAgIH0pXG4gIH1cblxuICBvblJlbW92ZWRDbGlja2VkID0gKCkgPT4gdGhpcy5wLm9uUmVtb3ZlZENsaWNrZWQodGhpcy5wLm5vdGlmaWNhdGlvbilcblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJyZWFjdC1uYXRpdmVcIikuTGF5b3V0Q2hhbmdlRXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25MYXlvdXQgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7bm90aWZpY2F0aW9ufSA9IHRoaXMucFxuXG4gICAgaWYgKCFub3RpZmljYXRpb24ubWVhc3VyZWRIZWlnaHQpIHtcbiAgICAgIHRoaXMucC5vbk1lYXN1cmVkKG5vdGlmaWNhdGlvbiwgZXZlbnQubmF0aXZlRXZlbnQubGF5b3V0LmhlaWdodClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbWVtbyhzaGFwZUNvbXBvbmVudChGbGFzaE5vdGlmaWNhdGlvbnNOb3RpZmljYXRpb24pKVxuIl19
|
|
353
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJjb250YWluZXIvbm90aWZpY2F0aW9uLmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBQ2xDLGlEQUFpRDtBQUNqRCxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQTtBQUM3QyxPQUFPLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUM1RCxPQUFPLEVBQUMsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3pGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUVwRCxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQTtBQUUvQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgscUNBQXFDO0FBQ3JDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQTtBQUNuQiwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0FBQ3JCLCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUE7QUFDckIsK0NBQStDO0FBQy9DLE1BQU0sWUFBWSxHQUFHLEVBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFBO0FBRXhGOztHQUVHO0FBQ0gsTUFBTSw4QkFBK0IsU0FBUSxjQUFjO0lBQ3pELE1BQU0sQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixLQUFLLEVBQUUsU0FB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QyxhQUFhLEVBQUUsQ0FBQztZQUMxRixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxDQUFBO1FBRWpELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQ3pCLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQ3RHLENBQUE7UUFDRCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDYixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFBO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUN0QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFFakQsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFVBQVU7WUFBRSxPQUFNO1FBRTNELElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFBO1FBRS9CLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3RCLENBQUM7SUFDSCxDQUFDLENBQUE7O0FBR0gsZUFBZSxJQUFJLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbi8vIEB0cy1leHBlY3QtZXJyb3IgUGFja2FnZSBzaGlwcyBubyAuZC50cyBmaWxlcy5cbmltcG9ydCBQcm9wVHlwZXNFeGFjdCBmcm9tIFwicHJvcC10eXBlcy1leGFjdFwiXG5pbXBvcnQgUmVhY3QsIHttZW1vLCB1c2VNZW1vfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtBbmltYXRlZCwgUHJlc3NhYmxlLCBUZXh0LCBWaWV3fSBmcm9tIFwicmVhY3QtbmF0aXZlXCJcbmltcG9ydCB7c2hhcGVDb21wb25lbnQsIFNoYXBlQ29tcG9uZW50fSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmUvYnVpbGQvc2hhcGUtY29tcG9uZW50LmpzXCJcbmltcG9ydCB7dXNlQnJlYWtwb2ludH0gZnJvbSBcInJlc3BvbnNpdmUtYnJlYWtwb2ludHNcIlxuXG5pbXBvcnQgY29uZmlndXJhdGlvbiBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkTm90aWZpY2F0aW9uVHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gaWRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBoZWlnaHRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBtYXJnaW5Cb3R0b21cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBtZWFzdXJlZEhlaWdodFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSBvcGFjaXR5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBlcnNpc3RlbnRcbiAqIEBwcm9wZXJ0eSB7XCJ0b2FzdFwiIHwgXCJtb2RhbFwifSBwcmVzZW50YXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBwcm9ncmVzc1xuICogQHByb3BlcnR5IHtib29sZWFufSByZW1vdmluZ1xuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmxhc2hOb3RpZmljYXRpb25zTm90aWZpY2F0aW9uUHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gY2xhc3NOYW1lXG4gKiBAcHJvcGVydHkge251bWJlcn0gY291bnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcHJvcGVydHkge1N0b3JlZE5vdGlmaWNhdGlvblR5cGV9IG5vdGlmaWNhdGlvblxuICogQHByb3BlcnR5IHsobm90aWZpY2F0aW9uOiBTdG9yZWROb3RpZmljYXRpb25UeXBlLCBtZWFzdXJlZEhlaWdodDogbnVtYmVyKSA9PiB2b2lkfSBvbk1lYXN1cmVkXG4gKiBAcHJvcGVydHkgeyhub3RpZmljYXRpb246IFN0b3JlZE5vdGlmaWNhdGlvblR5cGUpID0+IHZvaWR9IG9uUmVtb3ZlZENsaWNrZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGVyc2lzdGVudFxuICogQHByb3BlcnR5IHtcInRvYXN0XCIgfCBcIm1vZGFsXCJ9IHByZXNlbnRhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXI9fSBwcm9ncmVzc1xuICogQHByb3BlcnR5IHtib29sZWFufSByZW1vdmluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgb2JqZWN0Pn0gKi9cbmNvbnN0IGRhdGFTZXRzID0ge31cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLlZpZXdTdHlsZT59ICovXG5jb25zdCB2aWV3U3R5bGVzID0ge31cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLlRleHRTdHlsZT59ICovXG5jb25zdCB0ZXh0U3R5bGVzID0ge31cbi8qKiBAdHlwZSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLlZpZXdTdHlsZX0gKi9cbmNvbnN0IGJhckZpbGxTdHlsZSA9IHtiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmZlwiLCBib3JkZXJSYWRpdXM6IDIsIGhlaWdodDogNCwgd2lkdGg6IFwiMzAlXCJ9XG5cbi8qKlxuICogQGF1Z21lbnRzIHtTaGFwZUNvbXBvbmVudDxGbGFzaE5vdGlmaWNhdGlvbnNOb3RpZmljYXRpb25Qcm9wcz59XG4gKi9cbmNsYXNzIEZsYXNoTm90aWZpY2F0aW9uc05vdGlmaWNhdGlvbiBleHRlbmRzIFNoYXBlQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IFByb3BUeXBlc0V4YWN0KHtcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY291bnQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBtZXNzYWdlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgbm90aWZpY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgb25NZWFzdXJlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvblJlbW92ZWRDbGlja2VkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHBlcnNpc3RlbnQ6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gICAgcHJlc2VudGF0aW9uOiBQcm9wVHlwZXMub25lT2YoW1widG9hc3RcIiwgXCJtb2RhbFwiXSkuaXNSZXF1aXJlZCxcbiAgICBwcm9ncmVzczogUHJvcFR5cGVzLm51bWJlcixcbiAgICByZW1vdmluZzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuICB9KVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLkFuaW1hdGVkLlZhbHVlfSAqL1xuICBiYXJTd2VlcCA9IG5ldyBBbmltYXRlZC5WYWx1ZSgwKVxuICAvKiogQHR5cGUge2ltcG9ydChcInJlYWN0LW5hdGl2ZVwiKS5BbmltYXRlZC5Db21wb3NpdGVBbmltYXRpb24gfCB1bmRlZmluZWR9ICovXG4gIGJhclN3ZWVwQW5pbWF0aW9uID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICBiYXJUcmFja1dpZHRoID0gMFxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCBoYWQgZm9jdXMgd2hlbiB0aGlzIG1vZGFsIG5vdGlmaWNhdGlvbiBtb3VudGVkLCBzbyBmb2N1c1xuICAgKiBjYW4gYmUgcmV0dXJuZWQgdG8gaXQgd2hlbiB0aGUgbW9kYWwgaXMgZGlzbWlzc2VkLlxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnQgfCB1bmRlZmluZWR9XG4gICAqL1xuICBmb2N1c1JldHVybkVsZW1lbnQgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHt7Zm9jdXM/OiAoKSA9PiB2b2lkfSB8IHVuZGVmaW5lZH0gKi9cbiAgY2FyZFJlZiA9IHVuZGVmaW5lZFxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnAucHJlc2VudGF0aW9uICE9IFwibW9kYWxcIikgcmV0dXJuXG5cbiAgICAvLyBSZW1lbWJlciB3aGF0IGhhZCBmb2N1cyBiZWZvcmUgdGhlIGRpYWxvZyBvcGVuZWQgc28gaXQgY2FuIGJlIHJlc3RvcmVkXG4gICAgLy8gb24gZGlzbWlzcy4gT24gbmF0aXZlIHRoZXJlIGlzIG5vIGRvY3VtZW50OyBmb2N1cyBoYW5kbGluZyBpcyBhIG5vLW9wLlxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZm9jdXNSZXR1cm5FbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIH1cblxuICAgIC8vIE1vdmUgZm9jdXMgaW50byB0aGUgZGlhbG9nLiBUaGUgY2FyZCBpcyBmb2N1c2FibGUgdmlhIHRhYkluZGV4PXstMX0uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhcmRSZWY/LmZvY3VzPy4oKVxuICAgIH0sIDApXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmJhclN3ZWVwQW5pbWF0aW9uPy5zdG9wKClcblxuICAgIGlmICh0aGlzLnAucHJlc2VudGF0aW9uICE9IFwibW9kYWxcIikgcmV0dXJuXG5cbiAgICAvLyBSZXR1cm4gZm9jdXMgdG8gd2hhdGV2ZXIgd2FzIGZvY3VzZWQgYmVmb3JlIHRoZSBtb2RhbCBvcGVuZWQuXG4gICAgdGhpcy5mb2N1c1JldHVybkVsZW1lbnQ/LmZvY3VzPy4oKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtjb3VudCwgbWVzc2FnZSwgcHJlc2VudGF0aW9uLCBwcm9ncmVzcywgdGl0bGUsIHR5cGV9ID0gdGhpcy5wXG4gICAgY29uc3Qge2NsYXNzTmFtZX0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgYnJlYWtwb2ludCA9IHVzZUJyZWFrcG9pbnQoKVxuXG4gICAgaWYgKHByZXNlbnRhdGlvbiA9PSBcIm1vZGFsXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlck1vZGFsKClcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2FibGVEYXRhU2V0ID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGNsYXNzOiBjbGFzc05hbWUsXG4gICAgICAgIHJvbGU6IFwiZGlhbG9nXCIsXG4gICAgICAgIHR5cGVcbiAgICAgIH0pLFxuICAgICAgW2NsYXNzTmFtZSwgdHlwZV1cbiAgICApXG4gICAgcmV0dXJuIChcbiAgICAgIDxBbmltYXRlZC5WaWV3XG4gICAgICAgIHN0eWxlPXt0aGlzLnR0LndyYXBwZXJTdHlsZX1cbiAgICAgID5cbiAgICAgICAgPFByZXNzYWJsZVxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgUmVhY3QgTmF0aXZlIHR5cGVzIGRvIG5vdCBpbmNsdWRlIHRoZSB3ZWItb25seSBkYXRhU2V0IHByb3AuXG4gICAgICAgICAgZGF0YVNldD17cHJlc3NhYmxlRGF0YVNldH1cbiAgICAgICAgICBvbkxheW91dD17dGhpcy50dC5vbkxheW91dH1cbiAgICAgICAgICBvblByZXNzPXt0aGlzLnR0Lm9uUmVtb3ZlZENsaWNrZWR9XG4gICAgICAgICAgc3R5bGU9e2JyZWFrcG9pbnQuc3R5bGluZyh7XG4gICAgICAgICAgICBiYXNlOiB7XG4gICAgICAgICAgICAgIHBhZGRpbmc6IDE1LFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDExLFxuICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICAgICAgICBib3JkZXI6ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCIxcHggc29saWQgcmdiYSgxNjEsIDM0LCAzMiwgMC45NSlcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC45NSlcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImFsZXJ0XCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIjFweCBzb2xpZCByZ2JhKDIwNCwgNTEsIDAsIDAuOTUpXCJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJhY3Rpdml0eVwiKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCIxcHggc29saWQgcmdiYSgzMCwgNDEsIDU5LCAwLjk1KVwiXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9KSgpLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJyZ2JhKDE2MSwgMzQsIDMyLCAwLjg3KVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJyZ2JhKDAsIDAsIDAsIDAuODcpXCJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJhbGVydFwiKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJyZ2JhKDIwNCwgNTEsIDAsIDAuODcpXCJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJhY3Rpdml0eVwiKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJyZ2JhKDMwLCA0MSwgNTksIDAuODcpXCJcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbURvd246IHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWRVcDoge1xuICAgICAgICAgICAgICB3aWR0aDogMzAwLFxuICAgICAgICAgICAgICBtYXhXaWR0aDogXCIxMDAlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KX1cbiAgICAgICAgICB0ZXN0SUQ9XCJmbGFzaC1ub3RpZmljYXRpb25zLW5vdGlmaWNhdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8Vmlld1xuICAgICAgICAgICAgc3R5bGU9e3ZpZXdTdHlsZXMudGl0bGVWaWV3IHx8PSB7bWFyZ2luQm90dG9tOiA1fX1cbiAgICAgICAgICAgIHRlc3RJRD1cIm5vdGlmaWNhdGlvbi10aXRsZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFRleHRcbiAgICAgICAgICAgICAgc3R5bGU9e3RleHRTdHlsZXMudGl0bGVUZXh0IHx8PSB7XG4gICAgICAgICAgICAgICAgY29sb3I6IFwiI2ZmZlwiLFxuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDcwMFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB0ZXN0SUQ9e2BmbGFzaC1ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbi0ke2NvdW50fS90aXRsZWB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgICAgPFZpZXdcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgUmVhY3QgTmF0aXZlIHR5cGVzIGRvIG5vdCBpbmNsdWRlIHRoZSB3ZWItb25seSBkYXRhU2V0IHByb3AuXG4gICAgICAgICAgICBkYXRhU2V0PXtkYXRhU2V0c1tgbm90aWZpY2F0aW9uTWVzc2FnZS0ke2NvdW50fWBdIHx8PSB7Y291bnQ6IGAke2NvdW50fWB9fVxuICAgICAgICAgICAgdGVzdElEPVwibm90aWZpY2F0aW9uLW1lc3NhZ2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICAgIHN0eWxlPXt0ZXh0U3R5bGVzLm1lc3NhZ2VUZXh0IHx8PSB7Y29sb3I6IFwiI2ZmZlwifX1cbiAgICAgICAgICAgICAgdGVzdElEPXtgZmxhc2gtbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tJHtjb3VudH0vbWVzc2FnZWB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHttZXNzYWdlfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICB7dHlwZSA9PSBcImFjdGl2aXR5XCIgPyAoXG4gICAgICAgICAgICA8Vmlld1xuICAgICAgICAgICAgICBvbkxheW91dD17dGhpcy50dC5vbkJhckxheW91dH1cbiAgICAgICAgICAgICAgc3R5bGU9e3ZpZXdTdHlsZXMuYmFyVHJhY2sgfHw9IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpXCIsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAyLFxuICAgICAgICAgICAgICAgIGhlaWdodDogNCxcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IDEwLFxuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHRlc3RJRD1cImZsYXNoLW5vdGlmaWNhdGlvbnMtbm90aWZpY2F0aW9uLWJhclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtwcm9ncmVzcyA9PSB1bmRlZmluZWQgPyAoXG4gICAgICAgICAgICAgICAgPEFuaW1hdGVkLlZpZXdcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIC4uLmJhckZpbGxTdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBbe3RyYW5zbGF0ZVg6IHRoaXMuYmFyU3dlZXB9XVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIHRlc3RJRD1cImZsYXNoLW5vdGlmaWNhdGlvbnMtbm90aWZpY2F0aW9uLWJhci1maWxsXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAuLi5iYXJGaWxsU3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBgJHtwcm9ncmVzcyAqIDEwMH0lYFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIHRlc3RJRD1cImZsYXNoLW5vdGlmaWNhdGlvbnMtbm90aWZpY2F0aW9uLWJhci1maWxsXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9WaWV3PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L1ByZXNzYWJsZT5cbiAgICAgIDwvQW5pbWF0ZWQuVmlldz5cbiAgICApXG4gIH1cblxuICAvKipcbiAgICogTW9kYWwgcHJlc2VudGF0aW9uOiBhIGZ1bGwtc2NyZWVuIGRpbW1lZCBiYWNrZHJvcCB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICogY2VudGVyZWQgb24gdG9wLiBUaGUgYmFja2Ryb3AgaGFzIG5vIHByZXNzIGhhbmRsZXIgb24gcHVycG9zZSDigJQgY2xpY2tpbmdcbiAgICogaXQgKG9yIHByZXNzaW5nIEVzY2FwZSkgbXVzdCBub3QgZGlzbWlzcyB0aGUgbm90aWZpY2F0aW9uOyBvbmx5IHRoZVxuICAgKiBleHBsaWNpdCBkaXNtaXNzIGJ1dHRvbiBkb2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UmVhY3QuUmVhY3RFbGVtZW50fVxuICAgKi9cbiAgcmVuZGVyTW9kYWwoKSB7XG4gICAgY29uc3Qge2NvdW50LCBtZXNzYWdlLCB0aXRsZSwgdHlwZX0gPSB0aGlzLnBcbiAgICBjb25zdCBicmVha3BvaW50ID0gdXNlQnJlYWtwb2ludCgpXG5cbiAgICBjb25zdCBkaXNtaXNzTGFiZWwgPSBjb25maWd1cmF0aW9uLnRyYW5zbGF0ZShcImpzLnNoYXJlZC5kaXNtaXNzXCIsIHtkZWZhdWx0VmFsdWU6IFwiRGlzbWlzc1wifSlcblxuICAgIHJldHVybiAoXG4gICAgICA8QW5pbWF0ZWQuVmlld1xuICAgICAgICBzdHlsZT17dGhpcy50dC5tb2RhbFdyYXBwZXJTdHlsZX1cbiAgICAgICAgdGVzdElEPVwiZmxhc2gtbm90aWZpY2F0aW9ucy1tb2RhbC1iYWNrZHJvcFwiXG4gICAgICA+XG4gICAgICAgIDxQcmVzc2FibGVcbiAgICAgICAgICBhcmlhLW1vZGFsXG4gICAgICAgICAgcmVmPXsvKiogQHBhcmFtIHtpbXBvcnQoXCJyZWFjdC1uYXRpdmVcIikuVmlldyB8IG51bGx9IHJlZiAqLyAocmVmKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhcmRSZWYgPSAvKiogQHR5cGUge3tmb2N1cz86ICgpID0+IHZvaWR9IHwgdW5kZWZpbmVkfSAqLyAocmVmKVxuICAgICAgICAgIH19XG4gICAgICAgICAgcm9sZT1cImFsZXJ0ZGlhbG9nXCJcbiAgICAgICAgICBzdHlsZT17YnJlYWtwb2ludC5zdHlsaW5nKHtcbiAgICAgICAgICAgIGJhc2U6IHtcbiAgICAgICAgICAgICAgcGFkZGluZzogMTUsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMTEsXG4gICAgICAgICAgICAgIGJvcmRlcjogKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIjFweCBzb2xpZCByZ2JhKDE2MSwgMzQsIDMyLCAwLjk1KVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCIxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjk1KVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwiYWxlcnRcIikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiMXB4IHNvbGlkIHJnYmEoMjA0LCA1MSwgMCwgMC45NSlcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImFjdGl2aXR5XCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIjFweCBzb2xpZCByZ2JhKDMwLCA0MSwgNTksIDAuOTUpXCJcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInJnYmEoMTYxLCAzNCwgMzIsIDAuODcpXCJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInJnYmEoMCwgMCwgMCwgMC44NylcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImFsZXJ0XCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInJnYmEoMjA0LCA1MSwgMCwgMC44NylcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImFjdGl2aXR5XCIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInJnYmEoMzAsIDQxLCA1OSwgMC44NylcIlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBcInJnYmEoMCwgMCwgMCwgMC44NylcIlxuICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc21Eb3duOiB7XG4gICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IDIwLFxuICAgICAgICAgICAgICBtYXJnaW5SaWdodDogMjAsXG4gICAgICAgICAgICAgIG1heFdpZHRoOiBcIjEwMCVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1kVXA6IHtcbiAgICAgICAgICAgICAgd2lkdGg6IDQwMCxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IFwiODAlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KX1cbiAgICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgICAgdGVzdElEPVwiZmxhc2gtbm90aWZpY2F0aW9ucy1ub3RpZmljYXRpb25cIlxuICAgICAgICA+XG4gICAgICAgICAgPFZpZXdcbiAgICAgICAgICAgIHN0eWxlPXt2aWV3U3R5bGVzLnRpdGxlVmlldyB8fD0ge21hcmdpbkJvdHRvbTogNX19XG4gICAgICAgICAgICB0ZXN0SUQ9XCJub3RpZmljYXRpb24tdGl0bGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICAgIHN0eWxlPXt0ZXh0U3R5bGVzLnRpdGxlVGV4dCB8fD0ge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcIiNmZmZcIixcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiA3MDBcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgdGVzdElEPXtgZmxhc2gtbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tJHtjb3VudH0vdGl0bGVgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICAgIDxWaWV3XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFJlYWN0IE5hdGl2ZSB0eXBlcyBkbyBub3QgaW5jbHVkZSB0aGUgd2ViLW9ubHkgZGF0YVNldCBwcm9wLlxuICAgICAgICAgICAgZGF0YVNldD17ZGF0YVNldHNbYG5vdGlmaWNhdGlvbk1lc3NhZ2UtJHtjb3VudH1gXSB8fD0ge2NvdW50OiBgJHtjb3VudH1gfX1cbiAgICAgICAgICAgIHRlc3RJRD1cIm5vdGlmaWNhdGlvbi1tZXNzYWdlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICBzdHlsZT17dGV4dFN0eWxlcy5tZXNzYWdlVGV4dCB8fD0ge2NvbG9yOiBcIiNmZmZcIn19XG4gICAgICAgICAgICAgIHRlc3RJRD17YGZsYXNoLW5vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uLSR7Y291bnR9L21lc3NhZ2VgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7bWVzc2FnZX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgICAgPFByZXNzYWJsZVxuICAgICAgICAgICAgb25QcmVzcz17dGhpcy50dC5vblJlbW92ZWRDbGlja2VkfVxuICAgICAgICAgICAgc3R5bGU9e2JyZWFrcG9pbnQuc3R5bGluZyh7XG4gICAgICAgICAgICAgIGJhc2U6IHtcbiAgICAgICAgICAgICAgICBhbGlnblNlbGY6IFwiZmxleC1zdGFydFwiLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpXCIsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA4LFxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiAxLFxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBcInJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KVwiLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAxNSxcbiAgICAgICAgICAgICAgICBwYWRkaW5nSG9yaXpvbnRhbDogMTQsXG4gICAgICAgICAgICAgICAgcGFkZGluZ1ZlcnRpY2FsOiA4XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgdGVzdElEPVwiZmxhc2gtbm90aWZpY2F0aW9ucy1tb2RhbC1kaXNtaXNzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICBzdHlsZT17dGV4dFN0eWxlcy5kaXNtaXNzVGV4dCB8fD0ge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcIiNmZmZcIixcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiA3MDBcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2Rpc21pc3NMYWJlbH1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1ByZXNzYWJsZT5cbiAgICAgICAgPC9QcmVzc2FibGU+XG4gICAgICA8L0FuaW1hdGVkLlZpZXc+XG4gICAgKVxuICB9XG5cbiAgZ2V0IHdyYXBwZXJTdHlsZSgpIHtcbiAgICBjb25zdCB7bm90aWZpY2F0aW9uLCByZW1vdmluZ30gPSB0aGlzLnBcblxuICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcInJlYWN0LW5hdGl2ZVwiKS5BbmltYXRlZC5XaXRoQW5pbWF0ZWRPYmplY3Q8aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLlZpZXdTdHlsZT59ICovICh7XG4gICAgICBoZWlnaHQ6IG5vdGlmaWNhdGlvbi5tZWFzdXJlZEhlaWdodCA/IG5vdGlmaWNhdGlvbi5oZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgICBtYXJnaW5Cb3R0b206IG5vdGlmaWNhdGlvbi5tYXJnaW5Cb3R0b20sXG4gICAgICBvcGFjaXR5OiBub3RpZmljYXRpb24ub3BhY2l0eSxcbiAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgcG9pbnRlckV2ZW50czogcmVtb3ZpbmcgPyBcIm5vbmVcIiA6IFwiYXV0b1wiXG4gICAgfSlcbiAgfVxuXG4gIGdldCBtb2RhbFdyYXBwZXJTdHlsZSgpIHtcbiAgICBjb25zdCB7bm90aWZpY2F0aW9uLCByZW1vdmluZ30gPSB0aGlzLnBcblxuICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcInJlYWN0LW5hdGl2ZVwiKS5BbmltYXRlZC5XaXRoQW5pbWF0ZWRPYmplY3Q8aW1wb3J0KFwicmVhY3QtbmF0aXZlXCIpLlZpZXdTdHlsZT59ICovICh7XG4gICAgICAvLyBEaW1tZWQgZnVsbC1zY3JlZW4gYmFja2Ryb3Agd2l0aCB0aGUgY2FyZCBjZW50ZXJlZCBvbiB0b3Agb2YgaXQuXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBcInJnYmEoMCwgMCwgMCwgMC40NSlcIixcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgbGVmdDogMCxcbiAgICAgIG9wYWNpdHk6IG5vdGlmaWNhdGlvbi5vcGFjaXR5LFxuICAgICAgcG9pbnRlckV2ZW50czogcmVtb3ZpbmcgPyBcIm5vbmVcIiA6IFwiYXV0b1wiLFxuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfSlcbiAgfVxuXG4gIG9uUmVtb3ZlZENsaWNrZWQgPSAoKSA9PiB0aGlzLnAub25SZW1vdmVkQ2xpY2tlZCh0aGlzLnAubm90aWZpY2F0aW9uKVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInJlYWN0LW5hdGl2ZVwiKS5MYXlvdXRDaGFuZ2VFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkxheW91dCA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHtub3RpZmljYXRpb259ID0gdGhpcy5wXG5cbiAgICBpZiAoIW5vdGlmaWNhdGlvbi5tZWFzdXJlZEhlaWdodCkge1xuICAgICAgdGhpcy5wLm9uTWVhc3VyZWQobm90aWZpY2F0aW9uLCBldmVudC5uYXRpdmVFdmVudC5sYXlvdXQuaGVpZ2h0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0ZsYXNoTm90aWZpY2F0aW9uc05vdGlmaWNhdGlvblByb3BzfSBwcmV2UHJvcHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgaWYgKHByZXZQcm9wcy5wcm9ncmVzcyA9PSB1bmRlZmluZWQgJiYgdGhpcy5wLnByb2dyZXNzICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iYXJTd2VlcEFuaW1hdGlvbj8uc3RvcCgpXG4gICAgICB0aGlzLmJhclN3ZWVwQW5pbWF0aW9uID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnByb2dyZXNzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnAucHJvZ3Jlc3MgPT0gdW5kZWZpbmVkICYmIHRoaXMuYmFyVHJhY2tXaWR0aCkge1xuICAgICAgdGhpcy5zdGFydEJhclN3ZWVwKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydEJhclN3ZWVwKCkge1xuICAgIHRoaXMuYmFyU3dlZXBBbmltYXRpb24/LnN0b3AoKVxuICAgIHRoaXMuYmFyU3dlZXAuc2V0VmFsdWUoLXRoaXMuYmFyVHJhY2tXaWR0aCAqIDAuMylcblxuICAgIGNvbnN0IHN3ZWVwID0gQW5pbWF0ZWQubG9vcChcbiAgICAgIEFuaW1hdGVkLnRpbWluZyh0aGlzLmJhclN3ZWVwLCB7ZHVyYXRpb246IDEwMDAsIHRvVmFsdWU6IHRoaXMuYmFyVHJhY2tXaWR0aCwgdXNlTmF0aXZlRHJpdmVyOiBmYWxzZX0pXG4gICAgKVxuICAgIHN3ZWVwLnN0YXJ0KClcbiAgICB0aGlzLmJhclN3ZWVwQW5pbWF0aW9uID0gc3dlZXBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInJlYWN0LW5hdGl2ZVwiKS5MYXlvdXRDaGFuZ2VFdmVudH0gZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkJhckxheW91dCA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHRyYWNrV2lkdGggPSBldmVudC5uYXRpdmVFdmVudC5sYXlvdXQud2lkdGhcblxuICAgIGlmICghdHJhY2tXaWR0aCB8fCB0aGlzLmJhclRyYWNrV2lkdGggPT0gdHJhY2tXaWR0aCkgcmV0dXJuXG5cbiAgICB0aGlzLmJhclRyYWNrV2lkdGggPSB0cmFja1dpZHRoXG5cbiAgICBpZiAodGhpcy5wLnByb2dyZXNzID09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFydEJhclN3ZWVwKClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbWVtbyhzaGFwZUNvbXBvbmVudChGbGFzaE5vdGlmaWNhdGlvbnNOb3RpZmljYXRpb24pKVxuIl19
|
|
@@ -1,33 +1,94 @@
|
|
|
1
1
|
export default class FlashNotifications {
|
|
2
2
|
/**
|
|
3
3
|
* @param {string} message
|
|
4
|
+
* @param {NotificationOptions} [options]
|
|
4
5
|
* @returns {void}
|
|
5
6
|
*/
|
|
6
|
-
static alert(message: string): void;
|
|
7
|
+
static alert(message: string, options?: NotificationOptions): void;
|
|
7
8
|
/**
|
|
8
9
|
* @param {string} message
|
|
10
|
+
* @param {NotificationOptions} [options]
|
|
9
11
|
* @returns {void}
|
|
10
12
|
*/
|
|
11
|
-
static error(message: string): void;
|
|
13
|
+
static error(message: string, options?: NotificationOptions): void;
|
|
12
14
|
/**
|
|
13
15
|
* @param {unknown} error
|
|
16
|
+
* @param {NotificationOptions} [options]
|
|
14
17
|
* @returns {void}
|
|
15
18
|
*/
|
|
16
|
-
static errorResponse(error: unknown): void;
|
|
19
|
+
static errorResponse(error: unknown, options?: NotificationOptions): void;
|
|
17
20
|
/**
|
|
18
21
|
* @param {string} message
|
|
22
|
+
* @param {NotificationOptions} [options]
|
|
19
23
|
* @returns {void}
|
|
20
24
|
*/
|
|
21
|
-
static success(message: string): void;
|
|
25
|
+
static success(message: string, options?: NotificationOptions): void;
|
|
26
|
+
/**
|
|
27
|
+
* Shows a long-running activity notification with a loading bar. Unlike the
|
|
28
|
+
* other notification types it never auto-dismisses: the returned handle
|
|
29
|
+
* decides when the notification leaves the screen.
|
|
30
|
+
*
|
|
31
|
+
* @param {ActivityArgs} args
|
|
32
|
+
* @returns {ActivityHandle}
|
|
33
|
+
*/
|
|
34
|
+
static activity({ message }: ActivityArgs): ActivityHandle;
|
|
22
35
|
/**
|
|
23
36
|
* @param {object} args
|
|
24
37
|
* @param {string} args.text
|
|
25
38
|
* @param {string} args.type
|
|
39
|
+
* @param {boolean=} args.persistent
|
|
40
|
+
* @param {"toast" | "modal"=} args.presentation
|
|
26
41
|
* @returns {void}
|
|
27
42
|
*/
|
|
28
43
|
static show(args: {
|
|
29
44
|
text: string;
|
|
30
45
|
type: string;
|
|
46
|
+
persistent?: boolean | undefined;
|
|
47
|
+
presentation?: ("toast" | "modal") | undefined;
|
|
31
48
|
}): void;
|
|
32
49
|
}
|
|
50
|
+
export type ActivityArgs = {
|
|
51
|
+
/**
|
|
52
|
+
* Translated display string shown while the activity runs.
|
|
53
|
+
*/
|
|
54
|
+
message: string;
|
|
55
|
+
};
|
|
56
|
+
export type ActivityUpdateArgs = {
|
|
57
|
+
/**
|
|
58
|
+
* Determinate progress in [0, 1]. Omit to keep the bar indeterminate.
|
|
59
|
+
*/
|
|
60
|
+
progress?: number | undefined;
|
|
61
|
+
};
|
|
62
|
+
export type ActivityHandle = {
|
|
63
|
+
/**
|
|
64
|
+
* Moves the loading bar; without a progress value it stays indeterminate.
|
|
65
|
+
*/
|
|
66
|
+
update: (args?: ActivityUpdateArgs) => void;
|
|
67
|
+
/**
|
|
68
|
+
* Flashes the success tone, then dismisses the notification.
|
|
69
|
+
*/
|
|
70
|
+
succeed: (message?: string) => void;
|
|
71
|
+
/**
|
|
72
|
+
* Flashes the error tone, then dismisses the notification.
|
|
73
|
+
*/
|
|
74
|
+
fail: (message?: string) => void;
|
|
75
|
+
/**
|
|
76
|
+
* Dismisses the notification without a tone change.
|
|
77
|
+
*/
|
|
78
|
+
done: () => void;
|
|
79
|
+
};
|
|
80
|
+
export type NotificationOptions = {
|
|
81
|
+
/**
|
|
82
|
+
* When true the notification never auto-dismisses. It stays on
|
|
83
|
+
* screen until it is dismissed, just like an activity notification, but without a progress bar.
|
|
84
|
+
*/
|
|
85
|
+
persistent?: boolean | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* "toast" (the default) renders the notification in the
|
|
88
|
+
* usual stacked toast container. "modal" renders it as a centered dialog over a backdrop that
|
|
89
|
+
* blocks interaction with the app underneath; it can only be left via its explicit dismiss
|
|
90
|
+
* button.
|
|
91
|
+
*/
|
|
92
|
+
presentation?: ("toast" | "modal") | undefined;
|
|
93
|
+
};
|
|
33
94
|
//# sourceMappingURL=flash-notifications.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flash-notifications.d.ts","sourceRoot":"/src/","sources":["flash-notifications.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flash-notifications.d.ts","sourceRoot":"/src/","sources":["flash-notifications.js"],"names":[],"mappings":"AAqCA;IACE;;;;OAIG;IACH,sBAJW,MAAM,YACN,mBAAmB,GACjB,IAAI,CAIhB;IAED;;;;OAIG;IACH,sBAJW,MAAM,YACN,mBAAmB,GACjB,IAAI,CAIhB;IAED;;;;OAIG;IACH,4BAJW,OAAO,YACP,mBAAmB,GACjB,IAAI,CAmDhB;IAED;;;;OAIG;IACH,wBAJW,MAAM,YACN,mBAAmB,GACjB,IAAI,CAIhB;IAED;;;;;;;OAOG;IACH,6BAHW,YAAY,GACV,cAAc,CAgD1B;IAED;;;;;;;OAOG;IACH,kBANG;QAAqB,IAAI,EAAjB,MAAM;QACO,IAAI,EAAjB,MAAM;QACS,UAAU,GAAzB,OAAO,YAAC;QACiB,YAAY,GAArC,CAAA,OAAO,GAAG,OAAO,aAAC;KAC1B,GAAU,IAAI,CAsBhB;CACF;;;;;aArMa,MAAM;;;;;;eAKN,MAAM,YAAC;;;;;;YAKP,CAAC,IAAI,CAAC,EAAE,kBAAkB,KAAK,IAAI;;;;aACnC,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI;;;;UAC1B,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI;;;;UAC1B,MAAM,IAAI;;;;;;;iBAKV,OAAO,YAAC;;;;;;;mBAER,CAAA,OAAO,GAAG,OAAO,aAAC"}
|
|
@@ -2,28 +2,56 @@
|
|
|
2
2
|
import { digg } from "diggerize";
|
|
3
3
|
import configuration from "./configuration.js";
|
|
4
4
|
import events from "./events.js";
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {object} ActivityArgs
|
|
7
|
+
* @property {string} message Translated display string shown while the activity runs.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {object} ActivityUpdateArgs
|
|
11
|
+
* @property {number=} progress Determinate progress in [0, 1]. Omit to keep the bar indeterminate.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {object} ActivityHandle
|
|
15
|
+
* @property {(args?: ActivityUpdateArgs) => void} update Moves the loading bar; without a progress value it stays indeterminate.
|
|
16
|
+
* @property {(message?: string) => void} succeed Flashes the success tone, then dismisses the notification.
|
|
17
|
+
* @property {(message?: string) => void} fail Flashes the error tone, then dismisses the notification.
|
|
18
|
+
* @property {() => void} done Dismisses the notification without a tone change.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* @typedef {object} NotificationOptions
|
|
22
|
+
* @property {boolean=} persistent When true the notification never auto-dismisses. It stays on
|
|
23
|
+
* screen until it is dismissed, just like an activity notification, but without a progress bar.
|
|
24
|
+
* @property {"toast" | "modal"=} presentation "toast" (the default) renders the notification in the
|
|
25
|
+
* usual stacked toast container. "modal" renders it as a centered dialog over a backdrop that
|
|
26
|
+
* blocks interaction with the app underneath; it can only be left via its explicit dismiss
|
|
27
|
+
* button.
|
|
28
|
+
*/
|
|
29
|
+
let activityNotificationCount = 0;
|
|
5
30
|
export default class FlashNotifications {
|
|
6
31
|
/**
|
|
7
32
|
* @param {string} message
|
|
33
|
+
* @param {NotificationOptions} [options]
|
|
8
34
|
* @returns {void}
|
|
9
35
|
*/
|
|
10
|
-
static alert(message) {
|
|
11
|
-
FlashNotifications.show({ type: "alert", text: message });
|
|
36
|
+
static alert(message, options) {
|
|
37
|
+
FlashNotifications.show({ type: "alert", text: message, ...options });
|
|
12
38
|
}
|
|
13
39
|
/**
|
|
14
40
|
* @param {string} message
|
|
41
|
+
* @param {NotificationOptions} [options]
|
|
15
42
|
* @returns {void}
|
|
16
43
|
*/
|
|
17
|
-
static error(message) {
|
|
18
|
-
FlashNotifications.show({ type: "error", text: message });
|
|
44
|
+
static error(message, options) {
|
|
45
|
+
FlashNotifications.show({ type: "error", text: message, ...options });
|
|
19
46
|
}
|
|
20
47
|
/**
|
|
21
48
|
* @param {unknown} error
|
|
49
|
+
* @param {NotificationOptions} [options]
|
|
22
50
|
* @returns {void}
|
|
23
51
|
*/
|
|
24
|
-
static errorResponse(error) {
|
|
52
|
+
static errorResponse(error, options) {
|
|
25
53
|
if (!(error instanceof Error)) {
|
|
26
|
-
FlashNotifications.error(typeof error == "string" ? error : String(error));
|
|
54
|
+
FlashNotifications.error(typeof error == "string" ? error : String(error), options);
|
|
27
55
|
return;
|
|
28
56
|
}
|
|
29
57
|
// @ts-expect-error
|
|
@@ -32,11 +60,11 @@ export default class FlashNotifications {
|
|
|
32
60
|
if (error.hasUnhandledErrors()) {
|
|
33
61
|
// @ts-expect-error
|
|
34
62
|
const unhandledErrorMessages = error.getUnhandledErrors().map((subError) => subError.getFullErrorMessages()).flat();
|
|
35
|
-
FlashNotifications.error(unhandledErrorMessages.join(". "));
|
|
63
|
+
FlashNotifications.error(unhandledErrorMessages.join(". "), options);
|
|
36
64
|
}
|
|
37
65
|
else {
|
|
38
66
|
const defaultValue = "Couldn't submit because of validation errors.";
|
|
39
|
-
FlashNotifications.alert(configuration.translate("js.notification.couldnt_submit_because_of_validation_errors", { defaultValue }));
|
|
67
|
+
FlashNotifications.alert(configuration.translate("js.notification.couldnt_submit_because_of_validation_errors", { defaultValue }), options);
|
|
40
68
|
}
|
|
41
69
|
// @ts-expect-error
|
|
42
70
|
}
|
|
@@ -51,13 +79,13 @@ export default class FlashNotifications {
|
|
|
51
79
|
}
|
|
52
80
|
return digg(error, "message");
|
|
53
81
|
});
|
|
54
|
-
FlashNotifications.error(errorMessages.join(". "));
|
|
82
|
+
FlashNotifications.error(errorMessages.join(". "), options);
|
|
55
83
|
}
|
|
56
84
|
else if (error.message) {
|
|
57
|
-
FlashNotifications.error(error.message);
|
|
85
|
+
FlashNotifications.error(error.message, options);
|
|
58
86
|
}
|
|
59
87
|
else {
|
|
60
|
-
FlashNotifications.error(configuration.translate("js.shared.something_went_wrong", { defaultValue: "Something went wrong." }));
|
|
88
|
+
FlashNotifications.error(configuration.translate("js.shared.something_went_wrong", { defaultValue: "Something went wrong." }), options);
|
|
61
89
|
}
|
|
62
90
|
}
|
|
63
91
|
else {
|
|
@@ -65,20 +93,71 @@ export default class FlashNotifications {
|
|
|
65
93
|
const defaultErrorMessage = configuration.translate("js.shared.something_went_wrong", { defaultValue: "Something went wrong." });
|
|
66
94
|
const message = digg(error, "message");
|
|
67
95
|
console.error(`Didnt know what to do with that ${constructorName}: ${message}`);
|
|
68
|
-
FlashNotifications.error(defaultErrorMessage);
|
|
96
|
+
FlashNotifications.error(defaultErrorMessage, options);
|
|
69
97
|
}
|
|
70
98
|
}
|
|
71
99
|
/**
|
|
72
100
|
* @param {string} message
|
|
101
|
+
* @param {NotificationOptions} [options]
|
|
73
102
|
* @returns {void}
|
|
74
103
|
*/
|
|
75
|
-
static success(message) {
|
|
76
|
-
FlashNotifications.show({ type: "success", text: message });
|
|
104
|
+
static success(message, options) {
|
|
105
|
+
FlashNotifications.show({ type: "success", text: message, ...options });
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Shows a long-running activity notification with a loading bar. Unlike the
|
|
109
|
+
* other notification types it never auto-dismisses: the returned handle
|
|
110
|
+
* decides when the notification leaves the screen.
|
|
111
|
+
*
|
|
112
|
+
* @param {ActivityArgs} args
|
|
113
|
+
* @returns {ActivityHandle}
|
|
114
|
+
*/
|
|
115
|
+
static activity({ message }) {
|
|
116
|
+
activityNotificationCount += 1;
|
|
117
|
+
const id = `activity-${activityNotificationCount}`;
|
|
118
|
+
events.emit("pushNotification", {
|
|
119
|
+
id,
|
|
120
|
+
message,
|
|
121
|
+
title: configuration.translate("js.shared.activity", { defaultValue: "Activity" }),
|
|
122
|
+
type: "activity"
|
|
123
|
+
});
|
|
124
|
+
/**
|
|
125
|
+
* @param {"update" | "succeed" | "fail" | "done"} action
|
|
126
|
+
* @param {object} [payload]
|
|
127
|
+
* @returns {void}
|
|
128
|
+
*/
|
|
129
|
+
const emitControl = (action, payload = {}) => {
|
|
130
|
+
events.emit("activityNotification", { action, id, ...payload });
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
/**
|
|
134
|
+
* @param {ActivityUpdateArgs} [args]
|
|
135
|
+
* @returns {void}
|
|
136
|
+
*/
|
|
137
|
+
update(args = {}) {
|
|
138
|
+
const { progress } = args;
|
|
139
|
+
const normalizedProgress = typeof progress == "number" && !Number.isNaN(progress)
|
|
140
|
+
? Math.min(1, Math.max(0, progress))
|
|
141
|
+
: undefined;
|
|
142
|
+
emitControl("update", { progress: normalizedProgress });
|
|
143
|
+
},
|
|
144
|
+
succeed(message) {
|
|
145
|
+
emitControl("succeed", { message });
|
|
146
|
+
},
|
|
147
|
+
fail(message) {
|
|
148
|
+
emitControl("fail", { message });
|
|
149
|
+
},
|
|
150
|
+
done() {
|
|
151
|
+
emitControl("done");
|
|
152
|
+
}
|
|
153
|
+
};
|
|
77
154
|
}
|
|
78
155
|
/**
|
|
79
156
|
* @param {object} args
|
|
80
157
|
* @param {string} args.text
|
|
81
158
|
* @param {string} args.type
|
|
159
|
+
* @param {boolean=} args.persistent
|
|
160
|
+
* @param {"toast" | "modal"=} args.presentation
|
|
82
161
|
* @returns {void}
|
|
83
162
|
*/
|
|
84
163
|
static show(args) {
|
|
@@ -97,9 +176,11 @@ export default class FlashNotifications {
|
|
|
97
176
|
}
|
|
98
177
|
events.emit("pushNotification", {
|
|
99
178
|
message: args.text,
|
|
179
|
+
persistent: args.persistent,
|
|
180
|
+
presentation: args.presentation,
|
|
100
181
|
title,
|
|
101
182
|
type: args.type
|
|
102
183
|
});
|
|
103
184
|
}
|
|
104
185
|
}
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhc2gtbm90aWZpY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiZmxhc2gtbm90aWZpY2F0aW9ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUU5QixPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFFaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxrQkFBa0I7SUFDckM7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTztRQUNsQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUs7UUFDeEIsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUUxRSxPQUFNO1FBQ1IsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUM1QyxtQkFBbUI7WUFDbkIsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO2dCQUMvQixtQkFB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QUMsQ0FBQyxDQUFBO1FBQzdFLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7WUFDaEMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsRUFBQyxZQUFZLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUM3RSxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLEtBQUssR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLEVBQUMsWUFBWSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7UUFDakYsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxFQUFDLFlBQVksRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO1FBQzNGLENBQUM7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNsQixLQUFLO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuXG5pbXBvcnQgY29uZmlndXJhdGlvbiBmcm9tIFwiLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCBldmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxhc2hOb3RpZmljYXRpb25zIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGFsZXJ0KG1lc3NhZ2UpIHtcbiAgICBGbGFzaE5vdGlmaWNhdGlvbnMuc2hvdyh7dHlwZTogXCJhbGVydFwiLCB0ZXh0OiBtZXNzYWdlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBlcnJvcihtZXNzYWdlKSB7XG4gICAgRmxhc2hOb3RpZmljYXRpb25zLnNob3coe3R5cGU6IFwiZXJyb3JcIiwgdGV4dDogbWVzc2FnZX0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBlcnJvclJlc3BvbnNlKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcih0eXBlb2YgZXJyb3IgPT0gXCJzdHJpbmdcIiA/IGVycm9yIDogU3RyaW5nKGVycm9yKSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGlmIChlcnJvci5hcGlNYWtlclR5cGUgPT0gXCJWYWxpZGF0aW9uRXJyb3JcIikge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgaWYgKGVycm9yLmhhc1VuaGFuZGxlZEVycm9ycygpKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgY29uc3QgdW5oYW5kbGVkRXJyb3JNZXNzYWdlcyA9IGVycm9yLmdldFVuaGFuZGxlZEVycm9ycygpLm1hcCgoc3ViRXJyb3IpID0+IHN1YkVycm9yLmdldEZ1bGxFcnJvck1lc3NhZ2VzKCkpLmZsYXQoKVxuXG4gICAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcih1bmhhbmRsZWRFcnJvck1lc3NhZ2VzLmpvaW4oXCIuIFwiKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IFwiQ291bGRuJ3Qgc3VibWl0IGJlY2F1c2Ugb2YgdmFsaWRhdGlvbiBlcnJvcnMuXCJcblxuICAgICAgICBGbGFzaE5vdGlmaWNhdGlvbnMuYWxlcnQoY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5ub3RpZmljYXRpb24uY291bGRudF9zdWJtaXRfYmVjYXVzZV9vZl92YWxpZGF0aW9uX2Vycm9yc1wiLCB7ZGVmYXVsdFZhbHVlfSkpXG4gICAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIH0gZWxzZSBpZiAoZXJyb3IuYXBpTWFrZXJUeXBlID09IFwiQmFzZUVycm9yXCIpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXJyb3IuYXJncyAmJiBlcnJvci5hcmdzLnJlc3BvbnNlXG4gICAgICBjb25zdCBlcnJvcnMgPSAvKiogQHR5cGUge0FycmF5PHN0cmluZyB8IHttZXNzYWdlOiBzdHJpbmd9W10+IHwgdW5kZWZpbmVkfSAqLyAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZXJyb3JzKVxuXG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMubWFwKChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRpZ2coZXJyb3IsIFwibWVzc2FnZVwiKVxuICAgICAgICB9KVxuXG4gICAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcihlcnJvck1lc3NhZ2VzLmpvaW4oXCIuIFwiKSlcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICBGbGFzaE5vdGlmaWNhdGlvbnMuZXJyb3IoZXJyb3IubWVzc2FnZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcihjb25maWd1cmF0aW9uLnRyYW5zbGF0ZShcImpzLnNoYXJlZC5zb21ldGhpbmdfd2VudF93cm9uZ1wiLCB7ZGVmYXVsdFZhbHVlOiBcIlNvbWV0aGluZyB3ZW50IHdyb25nLlwifSkpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGRpZ2coZXJyb3IsIFwiY29uc3RydWN0b3JcIiwgXCJuYW1lXCIpXG4gICAgICBjb25zdCBkZWZhdWx0RXJyb3JNZXNzYWdlID0gY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5zaGFyZWQuc29tZXRoaW5nX3dlbnRfd3JvbmdcIiwge2RlZmF1bHRWYWx1ZTogXCJTb21ldGhpbmcgd2VudCB3cm9uZy5cIn0pXG4gICAgICBjb25zdCBtZXNzYWdlID0gZGlnZyhlcnJvciwgXCJtZXNzYWdlXCIpXG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoYERpZG50IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoYXQgJHtjb25zdHJ1Y3Rvck5hbWV9OiAke21lc3NhZ2V9YClcbiAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcihkZWZhdWx0RXJyb3JNZXNzYWdlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzdWNjZXNzKG1lc3NhZ2UpIHtcbiAgICBGbGFzaE5vdGlmaWNhdGlvbnMuc2hvdyh7dHlwZTogXCJzdWNjZXNzXCIsIHRleHQ6IG1lc3NhZ2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudHlwZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzaG93KGFyZ3MpIHtcbiAgICBsZXQgdGl0bGVcblxuICAgIGlmIChhcmdzLnR5cGUgPT0gXCJhbGVydFwiKSB7XG4gICAgICB0aXRsZSA9IGNvbmZpZ3VyYXRpb24udHJhbnNsYXRlKFwianMuc2hhcmVkLmFsZXJ0XCIsIHtkZWZhdWx0VmFsdWU6IFwiQWxlcnRcIn0pXG4gICAgfSBlbHNlIGlmIChhcmdzLnR5cGUgPT0gXCJlcnJvclwiKSB7XG4gICAgICB0aXRsZSA9IGNvbmZpZ3VyYXRpb24udHJhbnNsYXRlKFwianMuc2hhcmVkLmVycm9yXCIsIHtkZWZhdWx0VmFsdWU6IFwiRXJyb3JcIn0pXG4gICAgfSBlbHNlIGlmIChhcmdzLnR5cGUgPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgIHRpdGxlID0gY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5zaGFyZWQuc3VjY2Vzc1wiLCB7ZGVmYXVsdFZhbHVlOiBcIlN1Y2Nlc3NcIn0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRpdGxlID0gY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5zaGFyZWQubm90aWZpY2F0aW9uXCIsIHtkZWZhdWx0VmFsdWU6IFwiTm90aWZpY2F0aW9uXCJ9KVxuICAgIH1cblxuICAgIGV2ZW50cy5lbWl0KFwicHVzaE5vdGlmaWNhdGlvblwiLCB7XG4gICAgICBtZXNzYWdlOiBhcmdzLnRleHQsXG4gICAgICB0aXRsZSxcbiAgICAgIHR5cGU6IGFyZ3MudHlwZVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhc2gtbm90aWZpY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiZmxhc2gtbm90aWZpY2F0aW9ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUU5QixPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFFaEM7OztHQUdHO0FBRUg7OztHQUdHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCxJQUFJLHlCQUF5QixHQUFHLENBQUMsQ0FBQTtBQUVqQyxNQUFNLENBQUMsT0FBTyxPQUFPLGtCQUFrQjtJQUNyQzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTztRQUMzQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTztRQUMzQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTztRQUNqQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixrQkFBa0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxP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LElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixLQUFLO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuXG5pbXBvcnQgY29uZmlndXJhdGlvbiBmcm9tIFwiLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCBldmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBY3Rpdml0eUFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXNzYWdlIFRyYW5zbGF0ZWQgZGlzcGxheSBzdHJpbmcgc2hvd24gd2hpbGUgdGhlIGFjdGl2aXR5IHJ1bnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBY3Rpdml0eVVwZGF0ZUFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyPX0gcHJvZ3Jlc3MgRGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgaW4gWzAsIDFdLiBPbWl0IHRvIGtlZXAgdGhlIGJhciBpbmRldGVybWluYXRlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWN0aXZpdHlIYW5kbGVcbiAqIEBwcm9wZXJ0eSB7KGFyZ3M/OiBBY3Rpdml0eVVwZGF0ZUFyZ3MpID0+IHZvaWR9IHVwZGF0ZSBNb3ZlcyB0aGUgbG9hZGluZyBiYXI7IHdpdGhvdXQgYSBwcm9ncmVzcyB2YWx1ZSBpdCBzdGF5cyBpbmRldGVybWluYXRlLlxuICogQHByb3BlcnR5IHsobWVzc2FnZT86IHN0cmluZykgPT4gdm9pZH0gc3VjY2VlZCBGbGFzaGVzIHRoZSBzdWNjZXNzIHRvbmUsIHRoZW4gZGlzbWlzc2VzIHRoZSBub3RpZmljYXRpb24uXG4gKiBAcHJvcGVydHkgeyhtZXNzYWdlPzogc3RyaW5nKSA9PiB2b2lkfSBmYWlsIEZsYXNoZXMgdGhlIGVycm9yIHRvbmUsIHRoZW4gZGlzbWlzc2VzIHRoZSBub3RpZmljYXRpb24uXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGRvbmUgRGlzbWlzc2VzIHRoZSBub3RpZmljYXRpb24gd2l0aG91dCBhIHRvbmUgY2hhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpY2F0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFuPX0gcGVyc2lzdGVudCBXaGVuIHRydWUgdGhlIG5vdGlmaWNhdGlvbiBuZXZlciBhdXRvLWRpc21pc3Nlcy4gSXQgc3RheXMgb25cbiAqICAgc2NyZWVuIHVudGlsIGl0IGlzIGRpc21pc3NlZCwganVzdCBsaWtlIGFuIGFjdGl2aXR5IG5vdGlmaWNhdGlvbiwgYnV0IHdpdGhvdXQgYSBwcm9ncmVzcyBiYXIuXG4gKiBAcHJvcGVydHkge1widG9hc3RcIiB8IFwibW9kYWxcIj19IHByZXNlbnRhdGlvbiBcInRvYXN0XCIgKHRoZSBkZWZhdWx0KSByZW5kZXJzIHRoZSBub3RpZmljYXRpb24gaW4gdGhlXG4gKiAgIHVzdWFsIHN0YWNrZWQgdG9hc3QgY29udGFpbmVyLiBcIm1vZGFsXCIgcmVuZGVycyBpdCBhcyBhIGNlbnRlcmVkIGRpYWxvZyBvdmVyIGEgYmFja2Ryb3AgdGhhdFxuICogICBibG9ja3MgaW50ZXJhY3Rpb24gd2l0aCB0aGUgYXBwIHVuZGVybmVhdGg7IGl0IGNhbiBvbmx5IGJlIGxlZnQgdmlhIGl0cyBleHBsaWNpdCBkaXNtaXNzXG4gKiAgIGJ1dHRvbi5cbiAqL1xuXG5sZXQgYWN0aXZpdHlOb3RpZmljYXRpb25Db3VudCA9IDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxhc2hOb3RpZmljYXRpb25zIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9uT3B0aW9uc30gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGFsZXJ0KG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICBGbGFzaE5vdGlmaWNhdGlvbnMuc2hvdyh7dHlwZTogXCJhbGVydFwiLCB0ZXh0OiBtZXNzYWdlLCAuLi5vcHRpb25zfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge05vdGlmaWNhdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBlcnJvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgRmxhc2hOb3RpZmljYXRpb25zLnNob3coe3R5cGU6IFwiZXJyb3JcIiwgdGV4dDogbWVzc2FnZSwgLi4ub3B0aW9uc30pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICAgKiBAcGFyYW0ge05vdGlmaWNhdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBlcnJvclJlc3BvbnNlKGVycm9yLCBvcHRpb25zKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcih0eXBlb2YgZXJyb3IgPT0gXCJzdHJpbmdcIiA/IGVycm9yIDogU3RyaW5nKGVycm9yKSwgb3B0aW9ucylcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGlmIChlcnJvci5hcGlNYWtlclR5cGUgPT0gXCJWYWxpZGF0aW9uRXJyb3JcIikge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgaWYgKGVycm9yLmhhc1VuaGFuZGxlZEVycm9ycygpKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgY29uc3QgdW5oYW5kbGVkRXJyb3JNZXNzYWdlcyA9IGVycm9yLmdldFVuaGFuZGxlZEVycm9ycygpLm1hcCgoc3ViRXJyb3IpID0+IHN1YkVycm9yLmdldEZ1bGxFcnJvck1lc3NhZ2VzKCkpLmZsYXQoKVxuXG4gICAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcih1bmhhbmRsZWRFcnJvck1lc3NhZ2VzLmpvaW4oXCIuIFwiKSwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IFwiQ291bGRuJ3Qgc3VibWl0IGJlY2F1c2Ugb2YgdmFsaWRhdGlvbiBlcnJvcnMuXCJcblxuICAgICAgICBGbGFzaE5vdGlmaWNhdGlvbnMuYWxlcnQoY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5ub3RpZmljYXRpb24uY291bGRudF9zdWJtaXRfYmVjYXVzZV9vZl92YWxpZGF0aW9uX2Vycm9yc1wiLCB7ZGVmYXVsdFZhbHVlfSksIG9wdGlvbnMpXG4gICAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIH0gZWxzZSBpZiAoZXJyb3IuYXBpTWFrZXJUeXBlID09IFwiQmFzZUVycm9yXCIpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXJyb3IuYXJncyAmJiBlcnJvci5hcmdzLnJlc3BvbnNlXG4gICAgICBjb25zdCBlcnJvcnMgPSAvKiogQHR5cGUge0FycmF5PHN0cmluZyB8IHttZXNzYWdlOiBzdHJpbmd9W10+IHwgdW5kZWZpbmVkfSAqLyAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZXJyb3JzKVxuXG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMubWFwKChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRpZ2coZXJyb3IsIFwibWVzc2FnZVwiKVxuICAgICAgICB9KVxuXG4gICAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcihlcnJvck1lc3NhZ2VzLmpvaW4oXCIuIFwiKSwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICBGbGFzaE5vdGlmaWNhdGlvbnMuZXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcihjb25maWd1cmF0aW9uLnRyYW5zbGF0ZShcImpzLnNoYXJlZC5zb21ldGhpbmdfd2VudF93cm9uZ1wiLCB7ZGVmYXVsdFZhbHVlOiBcIlNvbWV0aGluZyB3ZW50IHdyb25nLlwifSksIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGRpZ2coZXJyb3IsIFwiY29uc3RydWN0b3JcIiwgXCJuYW1lXCIpXG4gICAgICBjb25zdCBkZWZhdWx0RXJyb3JNZXNzYWdlID0gY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5zaGFyZWQuc29tZXRoaW5nX3dlbnRfd3JvbmdcIiwge2RlZmF1bHRWYWx1ZTogXCJTb21ldGhpbmcgd2VudCB3cm9uZy5cIn0pXG4gICAgICBjb25zdCBtZXNzYWdlID0gZGlnZyhlcnJvciwgXCJtZXNzYWdlXCIpXG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoYERpZG50IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoYXQgJHtjb25zdHJ1Y3Rvck5hbWV9OiAke21lc3NhZ2V9YClcbiAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvcihkZWZhdWx0RXJyb3JNZXNzYWdlLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge05vdGlmaWNhdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzdWNjZXNzKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICBGbGFzaE5vdGlmaWNhdGlvbnMuc2hvdyh7dHlwZTogXCJzdWNjZXNzXCIsIHRleHQ6IG1lc3NhZ2UsIC4uLm9wdGlvbnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbG9uZy1ydW5uaW5nIGFjdGl2aXR5IG5vdGlmaWNhdGlvbiB3aXRoIGEgbG9hZGluZyBiYXIuIFVubGlrZSB0aGVcbiAgICogb3RoZXIgbm90aWZpY2F0aW9uIHR5cGVzIGl0IG5ldmVyIGF1dG8tZGlzbWlzc2VzOiB0aGUgcmV0dXJuZWQgaGFuZGxlXG4gICAqIGRlY2lkZXMgd2hlbiB0aGUgbm90aWZpY2F0aW9uIGxlYXZlcyB0aGUgc2NyZWVuLlxuICAgKlxuICAgKiBAcGFyYW0ge0FjdGl2aXR5QXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7QWN0aXZpdHlIYW5kbGV9XG4gICAqL1xuICBzdGF0aWMgYWN0aXZpdHkoe21lc3NhZ2V9KSB7XG4gICAgYWN0aXZpdHlOb3RpZmljYXRpb25Db3VudCArPSAxXG4gICAgY29uc3QgaWQgPSBgYWN0aXZpdHktJHthY3Rpdml0eU5vdGlmaWNhdGlvbkNvdW50fWBcblxuICAgIGV2ZW50cy5lbWl0KFwicHVzaE5vdGlmaWNhdGlvblwiLCB7XG4gICAgICBpZCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aXRsZTogY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5zaGFyZWQuYWN0aXZpdHlcIiwge2RlZmF1bHRWYWx1ZTogXCJBY3Rpdml0eVwifSksXG4gICAgICB0eXBlOiBcImFjdGl2aXR5XCJcbiAgICB9KVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtcInVwZGF0ZVwiIHwgXCJzdWNjZWVkXCIgfCBcImZhaWxcIiB8IFwiZG9uZVwifSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW3BheWxvYWRdXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgY29uc3QgZW1pdENvbnRyb2wgPSAoYWN0aW9uLCBwYXlsb2FkID0ge30pID0+IHtcbiAgICAgIGV2ZW50cy5lbWl0KFwiYWN0aXZpdHlOb3RpZmljYXRpb25cIiwge2FjdGlvbiwgaWQsIC4uLnBheWxvYWR9KVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7QWN0aXZpdHlVcGRhdGVBcmdzfSBbYXJnc11cbiAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAgICovXG4gICAgICB1cGRhdGUoYXJncyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHtwcm9ncmVzc30gPSBhcmdzXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm9ncmVzcyA9IHR5cGVvZiBwcm9ncmVzcyA9PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNOYU4ocHJvZ3Jlc3MpXG4gICAgICAgICAgPyBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBwcm9ncmVzcykpXG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICBlbWl0Q29udHJvbChcInVwZGF0ZVwiLCB7cHJvZ3Jlc3M6IG5vcm1hbGl6ZWRQcm9ncmVzc30pXG4gICAgICB9LFxuXG4gICAgICBzdWNjZWVkKG1lc3NhZ2UpIHtcbiAgICAgICAgZW1pdENvbnRyb2woXCJzdWNjZWVkXCIsIHttZXNzYWdlfSlcbiAgICAgIH0sXG5cbiAgICAgIGZhaWwobWVzc2FnZSkge1xuICAgICAgICBlbWl0Q29udHJvbChcImZhaWxcIiwge21lc3NhZ2V9KVxuICAgICAgfSxcblxuICAgICAgZG9uZSgpIHtcbiAgICAgICAgZW1pdENvbnRyb2woXCJkb25lXCIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudHlwZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBhcmdzLnBlcnNpc3RlbnRcbiAgICogQHBhcmFtIHtcInRvYXN0XCIgfCBcIm1vZGFsXCI9fSBhcmdzLnByZXNlbnRhdGlvblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzaG93KGFyZ3MpIHtcbiAgICBsZXQgdGl0bGVcblxuICAgIGlmIChhcmdzLnR5cGUgPT0gXCJhbGVydFwiKSB7XG4gICAgICB0aXRsZSA9IGNvbmZpZ3VyYXRpb24udHJhbnNsYXRlKFwianMuc2hhcmVkLmFsZXJ0XCIsIHtkZWZhdWx0VmFsdWU6IFwiQWxlcnRcIn0pXG4gICAgfSBlbHNlIGlmIChhcmdzLnR5cGUgPT0gXCJlcnJvclwiKSB7XG4gICAgICB0aXRsZSA9IGNvbmZpZ3VyYXRpb24udHJhbnNsYXRlKFwianMuc2hhcmVkLmVycm9yXCIsIHtkZWZhdWx0VmFsdWU6IFwiRXJyb3JcIn0pXG4gICAgfSBlbHNlIGlmIChhcmdzLnR5cGUgPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgIHRpdGxlID0gY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5zaGFyZWQuc3VjY2Vzc1wiLCB7ZGVmYXVsdFZhbHVlOiBcIlN1Y2Nlc3NcIn0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRpdGxlID0gY29uZmlndXJhdGlvbi50cmFuc2xhdGUoXCJqcy5zaGFyZWQubm90aWZpY2F0aW9uXCIsIHtkZWZhdWx0VmFsdWU6IFwiTm90aWZpY2F0aW9uXCJ9KVxuICAgIH1cblxuICAgIGV2ZW50cy5lbWl0KFwicHVzaE5vdGlmaWNhdGlvblwiLCB7XG4gICAgICBtZXNzYWdlOiBhcmdzLnRleHQsXG4gICAgICBwZXJzaXN0ZW50OiBhcmdzLnBlcnNpc3RlbnQsXG4gICAgICBwcmVzZW50YXRpb246IGFyZ3MucHJlc2VudGF0aW9uLFxuICAgICAgdGl0bGUsXG4gICAgICB0eXBlOiBhcmdzLnR5cGVcbiAgICB9KVxuICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flash-notifications",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.49",
|
|
4
4
|
"description": "My new module",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -67,5 +67,10 @@
|
|
|
67
67
|
"react-native": "*",
|
|
68
68
|
"set-state-compare": "^1.0.84"
|
|
69
69
|
},
|
|
70
|
+
"peerDependenciesMeta": {
|
|
71
|
+
"expo": {
|
|
72
|
+
"optional": true
|
|
73
|
+
}
|
|
74
|
+
},
|
|
70
75
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
|
71
76
|
}
|