@sumaris-net/ngx-components 1.22.11-rc6 → 1.22.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +565 -359
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/esm2015/public_api.js +2 -2
  6. package/esm2015/src/app/admin/users/list/users.js +2 -3
  7. package/esm2015/src/app/core/form/entity-editor-modal.class.js +3 -2
  8. package/esm2015/src/app/core/form/entity-editor.class.js +5 -4
  9. package/esm2015/src/app/core/menu/menu.component.js +1 -1
  10. package/esm2015/src/app/core/services/account.service.js +2 -2
  11. package/esm2015/src/app/core/services/model/person.model.js +4 -2
  12. package/esm2015/src/app/shared/file/file.service.js +18 -18
  13. package/esm2015/src/app/shared/file/file.utils.js +1 -1
  14. package/esm2015/src/app/shared/file/images.utils.js +166 -0
  15. package/esm2015/src/app/social/job/progression/job-progression.list.js +1 -1
  16. package/esm2015/src/app/social/user-event/notification/user-event-notification.icon.js +8 -7
  17. package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +56 -28
  18. package/esm2015/src/app/social/user-event/testing/user-event.testing.js +77 -9
  19. package/esm2015/src/app/social/user-event/testing/user-event.testing.model.js +103 -0
  20. package/esm2015/src/app/social/user-event/testing/user-event.testing.service.js +40 -31
  21. package/esm2015/src/app/social/user-event/user-event.model.js +2 -106
  22. package/esm2015/src/app/social/user-event/user-event.module.js +4 -2
  23. package/esm2015/src/app/social/user-event/user-event.service.js +66 -49
  24. package/fesm2015/sumaris-net.ngx-components.js +433 -317
  25. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  26. package/package.json +1 -1
  27. package/public_api.d.ts +1 -1
  28. package/src/app/admin/users/list/users.d.ts +0 -2
  29. package/src/app/core/form/entity-editor.class.d.ts +1 -1
  30. package/src/app/shared/file/file.service.d.ts +5 -5
  31. package/src/app/shared/file/images.utils.d.ts +19 -0
  32. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +18 -13
  33. package/src/app/social/user-event/testing/user-event.testing.d.ts +12 -3
  34. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +41 -0
  35. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +7 -6
  36. package/src/app/social/user-event/user-event.model.d.ts +11 -44
  37. package/src/app/social/user-event/user-event.service.d.ts +9 -8
  38. package/src/theme/_ngx-components.scss +12 -0
  39. package/sumaris-net.ngx-components.metadata.json +1 -1
  40. package/esm2015/src/app/shared/file/base64-image-reader.js +0 -141
  41. package/esm2015/src/app/social/user-event/user-event.fragments.js +0 -27
  42. package/src/app/shared/file/base64-image-reader.d.ts +0 -18
  43. package/src/app/social/user-event/user-event.fragments.d.ts +0 -4
@@ -7,6 +7,7 @@ import { LocalSettingsService } from '../../../core/services/local-settings.serv
7
7
  import { removeDuplicatesFromArray } from '../../../shared/functions';
8
8
  import { fromScrollEndEvent } from '../../../shared/events';
9
9
  import { waitFor } from '../../../shared/observables';
10
+ import { debounceTime, distinctUntilChanged, filter, switchMap } from 'rxjs/operators';
10
11
  export class UserEventNotificationList {
11
12
  constructor(cd, popoverController, settings, userEventService) {
12
13
  var _a;
@@ -14,55 +15,70 @@ export class UserEventNotificationList {
14
15
  this.popoverController = popoverController;
15
16
  this.settings = settings;
16
17
  this.userEventService = userEventService;
17
- this.subscriptions = new Subscription();
18
- this._fetchingMore = false;
18
+ this._subscriptions = new Subscription();
19
+ this._$pageSize = new BehaviorSubject(20);
20
+ this.fetchingMore = false;
21
+ this.$items = new BehaviorSubject(undefined);
22
+ this.$itemCount = new BehaviorSubject(undefined);
19
23
  this.debug = false;
20
- this.pageSize = 10;
21
24
  this.sortBy = 'creationDate';
22
25
  this.sortDirection = 'desc';
23
26
  this.enableInfiniteScroll = true;
24
- this.$items = new BehaviorSubject(undefined);
25
- this.$itemCount = new BehaviorSubject(undefined);
26
27
  this.mobile = ((_a = this.settings) === null || _a === void 0 ? void 0 : _a.mobile) || false;
27
28
  }
29
+ set pageSize(value) {
30
+ if (value > 0 && value !== this._$pageSize.value)
31
+ this._$pageSize.next(value);
32
+ }
33
+ get pageSize() {
34
+ return this._$pageSize.value;
35
+ }
28
36
  get canFetchMore() {
29
- return !!this._fetchMoreFn;
37
+ return this.enableInfiniteScroll && !!this._fetchMoreFn;
30
38
  }
31
39
  ngOnInit() {
32
40
  // Watch all user events
33
41
  if (this.userEventService) {
34
- this.subscriptions.add(this.userEventService
35
- .watchAll(0, this.pageSize, this.sortBy, this.sortDirection, this.filter)
42
+ this._subscriptions.add(this._$pageSize.pipe(distinctUntilChanged(), switchMap(pageSize => this.userEventService.watchAll(0, pageSize, this.sortBy, this.sortDirection, this.filter)))
36
43
  .subscribe(result => {
37
44
  var _a;
38
45
  if (this.debug)
39
- console.debug(`[user-event-notification-list] receiving ${result.total} user events`, result.data);
46
+ console.debug(`[user-event-notification-list] Receiving ${result.total} user events`, result.data);
40
47
  this.$items.next(result.data);
41
48
  this.$itemCount.next(result.total || ((_a = result.data) === null || _a === void 0 ? void 0 : _a.length) || 0);
42
49
  this._fetchMoreFn = result.fetchMore;
50
+ this.fetchingMore = false; // Allow to refetch more
43
51
  this.markForCheck();
44
52
  }));
45
53
  // Listen changes
46
- this.subscriptions.add(this.userEventService.listenChanges(undefined)
54
+ this._subscriptions.add(this.userEventService.listenAllChanges(this.filter)
47
55
  .subscribe(data => {
48
56
  if (this.debug)
49
- console.debug(`[user-event-notification-list] receiving ${data.length} new user events`, data);
57
+ console.debug(`[user-event-notification-list] Receiving ${data.length} new user events (by WS)`, data);
50
58
  }));
59
+ if (this.enableInfiniteScroll)
60
+ this.initInfiniteScroll();
51
61
  }
52
62
  }
53
63
  ngOnDestroy() {
54
- this.subscriptions.unsubscribe();
64
+ this._subscriptions.unsubscribe();
65
+ this.$items.complete();
66
+ this.$itemCount.complete();
55
67
  }
56
68
  click(event, userEvent) {
57
69
  if (!userEvent)
58
70
  return; // Skip
59
71
  // MarkAsRead
60
72
  this.markAsRead(event, userEvent);
61
- const action = ((userEvent === null || userEvent === void 0 ? void 0 : userEvent.actions) || []).find(a => a.name === 'click' || a.name === 'default');
62
- if (action) {
63
- this.executeAction(event, action, userEvent);
73
+ // Get the default action (if any)
74
+ const defaultAction = ((userEvent === null || userEvent === void 0 ? void 0 : userEvent.actions) || []).find(a => a.default);
75
+ if (defaultAction) {
76
+ this.executeAction(event, defaultAction, userEvent);
64
77
  }
65
78
  }
79
+ isDefaultAction(action) {
80
+ return action && action.default || false;
81
+ }
66
82
  markAsRead(event, userEvent) {
67
83
  var _a;
68
84
  if (userEvent === null || userEvent === void 0 ? void 0 : userEvent.readDate)
@@ -97,47 +113,59 @@ export class UserEventNotificationList {
97
113
  }
98
114
  dismiss() {
99
115
  this.popoverController.dismiss();
116
+ // Reset counter (need if event has been received while popover if open)
117
+ this.userEventService.resetCount();
100
118
  }
101
119
  fetchMore(event) {
102
120
  var _a;
103
121
  return __awaiter(this, void 0, void 0, function* () {
104
- if (!this._fetchMoreFn || this._fetchingMore)
122
+ if (!this._fetchMoreFn || this.fetchingMore)
105
123
  return;
106
124
  console.debug('[user-event-notification-list] Fetching more notifications...', event);
107
- this._fetchingMore = true;
125
+ this.fetchingMore = true;
126
+ const fetchMoreFn = this._fetchMoreFn;
108
127
  try {
109
- const result = yield this._fetchMoreFn();
128
+ const result = yield fetchMoreFn();
110
129
  let data = [
111
130
  ...(this.$items.value || []),
112
131
  ...result.data
113
132
  ];
114
133
  // Remove duplication (e.g. when new user event was added by subscription)
115
134
  data = removeDuplicatesFromArray(data, 'id');
135
+ // fetch more changes (e.g. if watchAll observable as been refreshed)
136
+ if (fetchMoreFn !== this._fetchMoreFn)
137
+ return; // Skip
116
138
  this.$items.next(data);
117
139
  this.$itemCount.next(result.total || ((_a = result.data) === null || _a === void 0 ? void 0 : _a.length) || 0);
118
140
  this._fetchMoreFn = result.fetchMore;
141
+ // Update the page size, to keep same scroll height, after the next refresh
142
+ this.pageSize = Math.max(this.pageSize, data.length);
119
143
  }
120
144
  catch (err) {
121
145
  console.error(err);
122
- this._fetchMoreFn = undefined;
146
+ this._fetchMoreFn = undefined; // Forget the function
123
147
  }
124
148
  finally {
125
149
  this.markForCheck();
126
- this._fetchingMore = false;
150
+ this.fetchingMore = false;
127
151
  }
128
152
  });
129
153
  }
130
- _initInfiniteScroll(threshold) {
154
+ trackByFn(index, item) {
155
+ return item.id;
156
+ }
157
+ initInfiniteScroll(threshold) {
131
158
  return __awaiter(this, void 0, void 0, function* () {
159
+ console.debug('[user-event-notification-list] Init infinite loop');
132
160
  if (this._fetchMoreSubscription)
133
161
  this._fetchMoreSubscription.unsubscribe();
134
162
  threshold = threshold || (this.mobile ? '15%' : '2%');
135
- yield waitFor(() => !!this.ionContent);
163
+ yield waitFor(() => !!this.ionContent, { dueTime: 250, timeout: 1000 });
136
164
  const panel = yield this.ionContent.getScrollElement();
137
165
  // Trigger fetch more, end end scroll reached
138
- this._fetchMoreSubscription = fromScrollEndEvent(panel, threshold, 250 /*force to check when no scrollbar - e.g. in large screen*/)
166
+ this._fetchMoreSubscription = this.$items.pipe(debounceTime(250), filter(() => this.canFetchMore), switchMap(() => fromScrollEndEvent(panel, threshold, 250 /*force to check when no scrollbar - e.g. in large screen*/)))
139
167
  .subscribe(() => this.fetchMore());
140
- this.subscriptions.add(this._fetchMoreSubscription);
168
+ this._subscriptions.add(this._fetchMoreSubscription);
141
169
  });
142
170
  }
143
171
  markForCheck() {
@@ -147,9 +175,9 @@ export class UserEventNotificationList {
147
175
  UserEventNotificationList.decorators = [
148
176
  { type: Component, args: [{
149
177
  selector: 'app-user-event-notification-list',
150
- template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{titleI18n | translate}}</ion-label>\n </ion-col>\n <ion-col class=\"top-action\" *ngIf=\"$items|async|isNotEmptyArray\">\n <ion-text color=\"primary\">\n <a (click)=\"markAllAsRead($event)\">{{'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate}}</a>\n </ion-text>\n </ion-col>\n </ion-row>\n\n <ion-item\n *ngFor=\"let userEvent of $items | async; last as last\"\n [lines]=\"last ? 'none' : undefined\"\n (click)=\"click($event, userEvent)\"\n >\n\n <ion-avatar slot=\"start\">\n\n <img *ngIf=\"userEvent.avatar; else avatarIcon\" src=\"{{ userEvent.avatar }}\">\n\n <ng-template #avatarIcon>\n <app-icon\n *ngIf=\"userEvent.avatarIcon\"\n [ref]=\"userEvent.avatarIcon\"\n height=\"40\"\n width=\"40\"\n ></app-icon>\n </ng-template>\n\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col>\n <p [class.unread]=\"!userEvent.readDate\" [innerHTML]=\"userEvent.message\"></p>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"userEvent.actions?.length\">\n <ion-col>\n <span *ngFor=\"let action of userEvent.actions\" class=\"action\">\n <a (click)=\"executeAction($event, action, userEvent)\" [title]=\"action.title|translate\">\n <app-icon *ngIf=\"action.iconRef\" slot=\"start\" height=\"20\" width=\"20\" [ref]=\"action.iconRef\"></app-icon>\n {{ action.name | translate }}\n </a>\n </span>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <app-icon\n *ngIf=\"userEvent.icon\"\n [ref]=\"userEvent.icon\"\n height=\"16\"\n width=\"16\"\n style=\"vertical-align: sub; margin-right: 3px\"\n ></app-icon>\n <small>\n <span>{{userEvent.creationDate|dateFromNow}}</span>\n <span style=\"color: gray\">{{ ' | ' + (userEvent.creationDate|dateFormat:{time:true}) }}</span>\n </small>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n\n <!-- loading -->\n <ion-item *ngIf=\"!($items|async); else noResult\" lines=\"none\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n\n <!-- no result -->\n <ng-template #noResult>\n <ion-item *ngIf=\"$items|async|isEmptyArray\" lines=\"none\">\n <ion-text color=\"dark\" class=\"text-italic\">{{'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate}}</ion-text>\n </ion-item>\n </ng-template>\n\n <!-- Loading more spinner -->\n <ion-item *ngIf=\"canFetchMore\" (ngInit)=\"_initInfiniteScroll()\" lines=\"none\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n\n <!-- footer -->\n <ion-row *ngIf=\"$itemCount|async; let count\"\n class=\"ion-list-footer column\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </ion-list>\n</ion-content>\n",
178
+ template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{titleI18n | translate}}</ion-label>\n </ion-col>\n <ion-col class=\"top-action\" *ngIf=\"$items|async|isNotEmptyArray\">\n <ion-text color=\"primary\">\n <a (click)=\"markAllAsRead($event)\">{{'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate}}</a>\n </ion-text>\n </ion-col>\n </ion-row>\n\n <ion-item\n *ngFor=\"let item of $items | async; trackBy: trackByFn; last as last\"\n [lines]=\"last ? 'none' : undefined\"\n [class.unread]=\"!item.readDate\"\n [class.tappable]=\"item.actions|arrayFilter:isDefaultAction|isNotEmptyArray\"\n (click)=\"click($event, item)\">\n\n <ion-avatar slot=\"start\">\n\n <img *ngIf=\"item.avatar; else avatarIcon\" src=\"{{ item.avatar }}\">\n\n <ng-template #avatarIcon>\n <app-icon\n *ngIf=\"item.avatarIcon; else generateIcon\"\n [ref]=\"item.avatarIcon\"\n height=\"40\"\n width=\"40\"\n ></app-icon>\n </ng-template>\n\n <ng-template #generateIcon>\n <div class=\"avatar\" *ngIf=\"item.avatarJdenticon\">\n <svg width=\"40\" width=\"40\" [data-jdenticon-value]=\"item.avatarJdenticon\"></svg>\n </div>\n </ng-template>\n\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\n </ion-col>\n </ion-row>\n\n <!-- date -->\n <ion-row>\n <ion-col size=\"12\">\n <app-icon\n *ngIf=\"item.icon\"\n [ref]=\"item.icon\"\n height=\"16\"\n width=\"16\"\n style=\"vertical-align: sub; margin-right: 3px\"\n ></app-icon>\n <small>\n <span>{{item.creationDate|dateFromNow}}</span>\n <span style=\"color: gray\">{{ ' | ' + (item.creationDate|dateFormat:{time:true}) }}</span>\n </small>\n </ion-col>\n </ion-row>\n\n <!-- actions -->\n <ion-row *ngIf=\"item.actions|isNotEmptyArray\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngFor=\"let action of item.actions\">\n <a *ngIf=\"!action.default\" class=\"action\" (click)=\"executeAction($event, action, item)\" [title]=\"(action.title || action.name) |translate\">\n <app-icon *ngIf=\"action.iconRef\" slot=\"start\" height=\"20\" width=\"20\" [ref]=\"action.iconRef\"></app-icon>\n <span>{{ action.name | translate }}</span>\n </a>\n </ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions|arrayFilter: isDefaultAction|isNotEmptyArray\">chevron_right</mat-icon>\n </ion-item>\n\n <!-- loading -->\n <ng-container *ngIf=\"!($items|async); else notLoading\">\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <ng-template #notLoading>\n <!-- no result -->\n <ion-item *ngIf=\"$items|async|isEmptyArray\" lines=\"none\">\n <ion-text color=\"dark\" class=\"text-italic\">{{'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate}}</ion-text>\n </ion-item>\n\n <!-- Fetching more -->\n <ng-container *ngIf=\"fetchingMore; else infiniteLoop\" lines=\"none\" disabled>\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <!-- Infinite loop -->\n <ng-template #infiniteLoop>\n <ng-container *ngIf=\"canFetchMore\" lines=\"none\" disabled\n [ngTemplateOutlet]=\"loadingItem\">\n </ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n <ion-row class=\"ion-list-footer column\">\n <ion-col>\n <ion-text *ngIf=\"$itemCount|async; let count\"\n class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </ion-list>\n</ion-content>\n\n<!-- loading -->\n<ng-template #loadingItem>\n <ion-item lines=\"none\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n</ng-template>\n",
151
179
  changeDetection: ChangeDetectionStrategy.OnPush,
152
- styles: [":host(.popover-viewport){overflow-y:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-height:calc(90vh - 20px)}.unread{font-weight:700}.message{font-size:.9em}.message p{margin-top:5px;margin-bottom:5px}.top-action{text-align:end;margin-right:8px}.top-action a{cursor:pointer;color:var(--ion-color-contrast)}.top-action a:hover{text-decoration:underline}.action a{margin-right:10px;cursor:pointer}.action app-icon{vertical-align:middle}"]
180
+ styles: [":host(.popover-viewport){overflow-y:auto;-webkit-user-select:none;-moz-user-select:none;user-select:none;max-height:calc(90vh - 20px)}ion-list ion-item.tappable{cursor:pointer}ion-list ion-item.tappable:hover{--ion-item-background:var(--ion-item-background-color-hover)}.message{font-size:.9em}.message p{margin-top:5px;margin-bottom:5px}.message p.unread{font-weight:700}.top-action{text-align:end;margin-right:8px}.top-action a{cursor:pointer;color:var(--ion-color-contrast)}.top-action a:hover{text-decoration:underline}a.action{font-size:.9em;margin-right:10px;cursor:pointer}a.action:hover span{text-decoration:underline}a.action app-icon{vertical-align:middle}ion-avatar .avatar svg,ion-avatar img{border:1px solid rgba(var(--ion-color-secondary-rgb,.5));border-radius:50%}"]
153
181
  },] }
154
182
  ];
155
183
  UserEventNotificationList.ctorParameters = () => [
@@ -162,14 +190,14 @@ UserEventNotificationList.propDecorators = {
162
190
  debug: [{ type: Input }],
163
191
  mobile: [{ type: Input }],
164
192
  titleI18n: [{ type: Input }],
165
- pageSize: [{ type: Input }],
166
193
  sortBy: [{ type: Input }],
167
194
  sortDirection: [{ type: Input }],
168
195
  filter: [{ type: Input }],
169
196
  enableInfiniteScroll: [{ type: Input }],
197
+ pageSize: [{ type: Input }],
170
198
  readEvent: [{ type: Output }],
171
199
  readEvents: [{ type: Output }],
172
200
  ionContent: [{ type: ViewChild, args: [IonContent,] }],
173
201
  ionItems: [{ type: ViewChildren, args: [IonItem,] }]
174
202
  };
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBb0Isa0JBQWtCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUVuRixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFnQnBELE1BQU0sT0FBTyx5QkFBeUI7SUE4QnBDLFlBQ1ksRUFBcUIsRUFDckIsaUJBQW9DLEVBQ3hCLFFBQThCLEVBQ0wsZ0JBQTZEOztRQUhsRyxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQXNCO1FBQ0wscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE2QztRQWhDcEcsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFD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Y3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0lVc2VyRXZlbnQsIElVc2VyRXZlbnRGaWx0ZXIsIFVzZXJFdmVudEFjdGlvbn0gZnJvbSAnLi4vdXNlci1ldmVudC5tb2RlbCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7SW9uQ29udGVudCwgSW9uSXRlbSwgUG9wb3ZlckNvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7SVVzZXJFdmVudFNlcnZpY2UsIFVTRVJfRVZFTlRfU0VSVklDRX0gZnJvbSAnLi4vdXNlci1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7TG9jYWxTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQge0ZldGNoTW9yZUZuLCBMb2FkUmVzdWx0fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtyZW1vdmVEdXBsaWNhdGVzRnJvbUFycmF5fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7ZnJvbVNjcm9sbEVuZEV2ZW50fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZXZlbnRzJztcbmltcG9ydCB7d2FpdEZvcn0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7U29ydERpcmVjdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdE9wdGlvbnMge1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIHRpdGxlSTE4bj86IHN0cmluZztcbiAgcmVhZEV2ZW50PzogRXZlbnRFbWl0dGVyPElVc2VyRXZlbnQ8YW55Pj47XG4gIHJlYWRFdmVudHM/OiBFdmVudEVtaXR0ZXI8SVVzZXJFdmVudDxhbnk+W10+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdDxFIGV4dGVuZHMgSVVzZXJFdmVudDxhbnk+ID0gSVVzZXJFdmVudDxhbnk+PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0T3B0aW9ucyB7XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByb3RlY3RlZCBfZmV0Y2hNb3JlRm46IEZldGNoTW9yZUZuPExvYWRSZXN1bHQ8RT4+O1xuICBwcm90ZWN0ZWQgX2ZldGNoaW5nTW9yZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2ZldGNoTW9yZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIEBJbnB1dCgpIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgdGl0bGVJMThuOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcGFnZVNpemUgPSAxMDtcbiAgQElucHV0KCkgc29ydEJ5ID0gJ2NyZWF0aW9uRGF0ZSc7XG4gIEBJbnB1dCgpIHNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gIEBJbnB1dCgpIGZpbHRlcjogUGFydGlhbDxJVXNlckV2ZW50RmlsdGVyPGFueT4+O1xuXG4gIEBJbnB1dCgpIGVuYWJsZUluZmluaXRlU2Nyb2xsID0gdHJ1ZTtcbiAgQE91dHB1dCgpIHJlYWRFdmVudDogRXZlbnRFbWl0dGVyPEU+O1xuXG4gIEBPdXRwdXQoKSByZWFkRXZlbnRzOiBFdmVudEVtaXR0ZXI8RVtdPjtcblxuICBAVmlld0NoaWxkKElvbkNvbnRlbnQpIGlvbkNvbnRlbnQ6IElvbkNvbnRlbnQ7XG4gIEBWaWV3Q2hpbGRyZW4oSW9uSXRlbSkgaW9uSXRlbXM6IFF1ZXJ5TGlzdDxJb25JdGVtPjtcbiAgJGl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFW10+KHVuZGVmaW5lZCk7XG4gICRpdGVtQ291bnQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4odW5kZWZpbmVkKTtcblxuICBnZXQgY2FuRmV0Y2hNb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX2ZldGNoTW9yZUZuO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChVU0VSX0VWRU5UX1NFUlZJQ0UpIHB1YmxpYyB1c2VyRXZlbnRTZXJ2aWNlOiBJVXNlckV2ZW50U2VydmljZTxFLCBJVXNlckV2ZW50RmlsdGVyPGFueT4+XG4gICkge1xuICAgIHRoaXMubW9iaWxlID0gdGhpcy5zZXR0aW5ncz8ubW9iaWxlIHx8IGZhbHNlO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAvLyBXYXRjaCBhbGwgdXNlciBldmVudHNcbiAgICBpZiAodGhpcy51c2VyRXZlbnRTZXJ2aWNlKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2VcbiAgICAgICAgICAud2F0Y2hBbGwoMCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5zb3J0QnksIHRoaXMuc29ydERpcmVjdGlvbiwgdGhpcy5maWx0ZXIpXG4gICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt1c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1saXN0XSByZWNlaXZpbmcgJHtyZXN1bHQudG90YWx9IHVzZXIgZXZlbnRzYCwgcmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgdGhpcy4kaXRlbXMubmV4dChyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLiRpdGVtQ291bnQubmV4dChyZXN1bHQudG90YWwgfHwgcmVzdWx0LmRhdGE/Lmxlbmd0aCB8fCAwKTtcbiAgICAgICAgICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzdWx0LmZldGNoTW9yZTtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIExpc3RlbiBjaGFuZ2VzXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UubGlzdGVuQ2hhbmdlcyh1bmRlZmluZWQpXG4gICAgICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gcmVjZWl2aW5nICR7ZGF0YS5sZW5ndGh9IG5ldyB1c2VyIGV2ZW50c2AsIGRhdGEpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgY2xpY2soZXZlbnQ6IFVJRXZlbnQsIHVzZXJFdmVudDogRSkge1xuICAgIGlmICghdXNlckV2ZW50KSByZXR1cm4gLy8gU2tpcFxuXG4gICAgLy8gTWFya0FzUmVhZFxuICAgIHRoaXMubWFya0FzUmVhZChldmVudCwgdXNlckV2ZW50KTtcblxuICAgIGNvbnN0IGFjdGlvbiA9ICh1c2VyRXZlbnQ/LmFjdGlvbnMgfHwgW10pLmZpbmQoYSA9PiBhLm5hbWUgPT09ICdjbGljaycgfHwgYS5uYW1lID09PSAnZGVmYXVsdCcpO1xuICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24oZXZlbnQsIGFjdGlvbiwgdXNlckV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNSZWFkKGV2ZW50OiBVSUV2ZW50LCB1c2VyRXZlbnQ6IEUpIHtcbiAgICBpZiAodXNlckV2ZW50Py5yZWFkRGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50Py5lbWl0KHVzZXJFdmVudCk7XG4gIH1cblxuICBtYXJrQWxsQXNSZWFkKGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgY29uc3QgdW5yZWFkVXNlckV2ZW50cyA9ICh0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+ICF2YWx1ZS5yZWFkRGF0ZSk7XG4gICAgaWYgKCF1bnJlYWRVc2VyRXZlbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50cz8uZW1pdCh1bnJlYWRVc2VyRXZlbnRzKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVBY3Rpb24oXG4gICAgICBldmVudDogVUlFdmVudCxcbiAgICAgIGFjdGlvbjogVXNlckV2ZW50QWN0aW9uLFxuICAgICAgdXNlckV2ZW50OiBJVXNlckV2ZW50PGFueT4pIHtcblxuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuOyAvLyBTa2lwIGlmIHByZXZlbnRlZFxuXG4gICAgLy8gRGlzYWJsZSBkZWZhdWx0IGFjdGlvbiAoLmUuZyBhdm9pZCB0byBjYWxsIGNsaWNrKCkgZnVuY3Rpb24pXG4gICAgaWYgKGV2ZW50KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGVuIGNsb3NlIHBvcG92ZXJcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYWN0aW9uLmV4ZWN1dGVBY3Rpb24odXNlckV2ZW50KTtcbiAgICAgIHRoaXMuZGlzbWlzcygpO1xuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpIGF3YWl0IHJlcztcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgZGlzbWlzcygpIHtcbiAgICB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmRpc21pc3MoKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShldmVudD86IEN1c3RvbUV2ZW50ICYgeyB0YXJnZXQ/OiBFdmVudFRhcmdldCAmIHsgY29tcGxldGU/OiAoKSA9PiB2b2lkIH19KSB7XG4gICAgaWYgKCF0aGlzLl9mZXRjaE1vcmVGbiB8fCB0aGlzLl9mZXRjaGluZ01vcmUpIHJldHVybjtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1t1c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1saXN0XSBGZXRjaGluZyBtb3JlIG5vdGlmaWNhdGlvbnMuLi4nLCBldmVudCk7XG4gICAgdGhpcy5fZmV0Y2hpbmdNb3JlID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9mZXRjaE1vcmVGbigpO1xuICAgICAgbGV0IGRhdGEgPSBbXG4gICAgICAgIC4uLih0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSksXG4gICAgICAgIC4uLnJlc3VsdC5kYXRhXG4gICAgICBdO1xuXG4gICAgICAvLyBSZW1vdmUgZHVwbGljYXRpb24gKGUuZy4gd2hlbiBuZXcgdXNlciBldmVudCB3YXMgYWRkZWQgYnkgc3Vic2NyaXB0aW9uKVxuICAgICAgZGF0YSA9IHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXkoZGF0YSwgJ2lkJyk7XG5cbiAgICAgIHRoaXMuJGl0ZW1zLm5leHQoZGF0YSk7XG4gICAgICB0aGlzLiRpdGVtQ291bnQubmV4dChyZXN1bHQudG90YWwgfHwgcmVzdWx0LmRhdGE/Lmxlbmd0aCB8fCAwKTtcbiAgICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzdWx0LmZldGNoTW9yZTtcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5fZmV0Y2hpbmdNb3JlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2luaXRJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fZmV0Y2hNb3JlU3Vic2NyaXB0aW9uKSB0aGlzLl9mZXRjaE1vcmVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCB8fCAodGhpcy5tb2JpbGUgPyAnMTUlJyA6ICcyJScpO1xuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4gISF0aGlzLmlvbkNvbnRlbnQpO1xuICAgIGNvbnN0IHBhbmVsID0gYXdhaXQgdGhpcy5pb25Db250ZW50LmdldFNjcm9sbEVsZW1lbnQoKTtcblxuICAgIC8vIFRyaWdnZXIgZmV0Y2ggbW9yZSwgZW5kIGVuZCBzY3JvbGwgcmVhY2hlZFxuICAgIHRoaXMuX2ZldGNoTW9yZVN1YnNjcmlwdGlvbiA9IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkLCAyNTAgLypmb3JjZSB0byBjaGVjayB3aGVuIG5vIHNjcm9sbGJhciAtIGUuZy4gaW4gbGFyZ2Ugc2NyZWVuKi8pXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZmV0Y2hNb3JlKCkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLl9mZXRjaE1vcmVTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQWdCLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQWEsU0FBUyxFQUFFLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUxTCxPQUFPLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBb0Isa0JBQWtCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUVuRixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFcEQsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFtQnJGLE1BQU0sT0FBTyx5QkFBeUI7SUEwQ3BDLFlBQ1ksRUFBcUIsRUFDckIsaUJBQW9DLEVBQ3hCLFFBQThCLEVBQ0wsZ0JBQTZEOztRQUhsRyxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3hCLGFBQVEsR0FBUixRQUFR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VCxRQUFRLEVBQUUsa0NBQWtDO2dCQUM1Qyw0OElBQWtEO2dCQUVsRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQTdCZ0MsaUJBQWlCO1lBR3JCLGlCQUFpQjtZQUV0QyxvQkFBb0IsdUJBc0V2QixRQUFROzRDQUNSLFFBQVEsWUFBSSxNQUFNLFNBQUMsa0JBQWtCOzs7b0JBL0J2QyxLQUFLO3FCQUNMLEtBQUs7d0JBQ0wsS0FBSztxQkFDTCxLQUFLOzRCQUNMLEtBQUs7cUJBQ0wsS0FBSzttQ0FDTCxLQUFLO3VCQUVMLEtBQUs7d0JBUUwsTUFBTTt5QkFDTixNQUFNO3lCQUVOLFNBQVMsU0FBQyxVQUFVO3VCQUNwQixZQUFZLFNBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtJVXNlckV2ZW50LCBJVXNlckV2ZW50RmlsdGVyLCBJVXNlckV2ZW50QWN0aW9ufSBmcm9tICcuLi91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtJb25Db250ZW50LCBJb25JdGVtLCBQb3BvdmVyQ29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtJVXNlckV2ZW50U2VydmljZSwgVVNFUl9FVkVOVF9TRVJWSUNFfSBmcm9tICcuLi91c2VyLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtMb2NhbFNldHRpbmdzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7RmV0Y2hNb3JlRm4sIExvYWRSZXN1bHR9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge3JlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXl9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtmcm9tU2Nyb2xsRW5kRXZlbnR9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9ldmVudHMnO1xuaW1wb3J0IHt3YWl0Rm9yfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtTb3J0RGlyZWN0aW9ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0T3B0aW9uczxcbiAgRSBleHRlbmRzIElVc2VyRXZlbnQ8YW55PiA9IElVc2VyRXZlbnQ8YW55PixcbiAgRiBleHRlbmRzIElVc2VyRXZlbnRGaWx0ZXI8YW55PiA9IElVc2VyRXZlbnRGaWx0ZXI8YW55PlxuICA+IHtcbiAgZGVidWc/OiBib29sZWFuO1xuICB0aXRsZUkxOG4/OiBzdHJpbmc7XG4gIHJlYWRFdmVudD86IEV2ZW50RW1pdHRlcjxFPjtcbiAgcmVhZEV2ZW50cz86IEV2ZW50RW1pdHRlcjxFW10+O1xuICBmaWx0ZXI/OiBQYXJ0aWFsPEY+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdDxcbiAgRSBleHRlbmRzIElVc2VyRXZlbnQ8YW55PiA9IElVc2VyRXZlbnQ8YW55PixcbiAgRiBleHRlbmRzIElVc2VyRXZlbnRGaWx0ZXI8YW55PiA9IElVc2VyRXZlbnRGaWx0ZXI8YW55PlxuICA+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3RPcHRpb25zPEUsIEY+IHtcblxuICBwcm90ZWN0ZWQgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByb3RlY3RlZCBfZmV0Y2hNb3JlRm46IEZldGNoTW9yZUZuPExvYWRSZXN1bHQ8RT4+O1xuICBwcm90ZWN0ZWQgX2ZldGNoTW9yZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgXyRwYWdlU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigyMCk7XG5cbiAgZmV0Y2hpbmdNb3JlID0gZmFsc2U7XG4gICRpdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVtdPih1bmRlZmluZWQpO1xuICAkaXRlbUNvdW50ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KHVuZGVmaW5lZCk7XG5cbiAgQElucHV0KCkgZGVidWcgPSBmYWxzZTtcbiAgQElucHV0KCkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoKSB0aXRsZUkxOG46IHN0cmluZztcbiAgQElucHV0KCkgc29ydEJ5ID0gJ2NyZWF0aW9uRGF0ZSc7XG4gIEBJbnB1dCgpIHNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gIEBJbnB1dCgpIGZpbHRlcjogUGFydGlhbDxGPjtcbiAgQElucHV0KCkgZW5hYmxlSW5maW5pdGVTY3JvbGwgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSAhPT0gdGhpcy5fJHBhZ2VTaXplLnZhbHVlKSB0aGlzLl8kcGFnZVNpemUubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhZ2VTaXplLnZhbHVlO1xuICB9XG5cbiAgQE91dHB1dCgpIHJlYWRFdmVudDogRXZlbnRFbWl0dGVyPEU+O1xuICBAT3V0cHV0KCkgcmVhZEV2ZW50czogRXZlbnRFbWl0dGVyPEVbXT47XG5cbiAgQFZpZXdDaGlsZChJb25Db250ZW50KSBpb25Db250ZW50OiBJb25Db250ZW50O1xuICBAVmlld0NoaWxkcmVuKElvbkl0ZW0pIGlvbkl0ZW1zOiBRdWVyeUxpc3Q8SW9uSXRlbT47XG5cblxuICBnZXQgY2FuRmV0Y2hNb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZUluZmluaXRlU2Nyb2xsICYmICEhdGhpcy5fZmV0Y2hNb3JlRm47XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBwb3BvdmVyQ29udHJvbGxlcjogUG9wb3ZlckNvbnRyb2xsZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFVTRVJfRVZFTlRfU0VSVklDRSkgcHVibGljIHVzZXJFdmVudFNlcnZpY2U6IElVc2VyRXZlbnRTZXJ2aWNlPEUsIElVc2VyRXZlbnRGaWx0ZXI8YW55Pj5cbiAgKSB7XG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLnNldHRpbmdzPy5tb2JpbGUgfHwgZmFsc2U7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFdhdGNoIGFsbCB1c2VyIGV2ZW50c1xuICAgIGlmICh0aGlzLnVzZXJFdmVudFNlcnZpY2UpIHtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICB0aGlzLl8kcGFnZVNpemUucGlwZShcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHN3aXRjaE1hcChwYWdlU2l6ZSA9PiB0aGlzLnVzZXJFdmVudFNlcnZpY2Uud2F0Y2hBbGwoMCwgcGFnZVNpemUsIHRoaXMuc29ydEJ5LCB0aGlzLnNvcnREaXJlY3Rpb24sIHRoaXMuZmlsdGVyKSlcbiAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gUmVjZWl2aW5nICR7cmVzdWx0LnRvdGFsfSB1c2VyIGV2ZW50c2AsIHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuJGl0ZW1zLm5leHQocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgdGhpcy4kaXRlbUNvdW50Lm5leHQocmVzdWx0LnRvdGFsIHx8IHJlc3VsdC5kYXRhPy5sZW5ndGggfHwgMCk7XG4gICAgICAgICAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IHJlc3VsdC5mZXRjaE1vcmU7XG4gICAgICAgICAgICB0aGlzLmZldGNoaW5nTW9yZSA9IGZhbHNlOyAvLyBBbGxvdyB0byByZWZldGNoIG1vcmVcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIExpc3RlbiBjaGFuZ2VzXG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLmxpc3RlbkFsbENoYW5nZXModGhpcy5maWx0ZXIpXG4gICAgICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gUmVjZWl2aW5nICR7ZGF0YS5sZW5ndGh9IG5ldyB1c2VyIGV2ZW50cyAoYnkgV1MpYCwgZGF0YSk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmVuYWJsZUluZmluaXRlU2Nyb2xsKSB0aGlzLmluaXRJbmZpbml0ZVNjcm9sbCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLiRpdGVtcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuJGl0ZW1Db3VudC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgY2xpY2soZXZlbnQ6IFVJRXZlbnQsIHVzZXJFdmVudDogRSkge1xuICAgIGlmICghdXNlckV2ZW50KSByZXR1cm4gLy8gU2tpcFxuXG4gICAgLy8gTWFya0FzUmVhZFxuICAgIHRoaXMubWFya0FzUmVhZChldmVudCwgdXNlckV2ZW50KTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCBhY3Rpb24gKGlmIGFueSlcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gKHVzZXJFdmVudD8uYWN0aW9ucyB8fCBbXSkuZmluZChhID0+IGEuZGVmYXVsdCk7XG5cbiAgICBpZiAoZGVmYXVsdEFjdGlvbikge1xuICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbihldmVudCwgZGVmYXVsdEFjdGlvbiwgdXNlckV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBpc0RlZmF1bHRBY3Rpb24oYWN0aW9uOiBJVXNlckV2ZW50QWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFjdGlvbiAmJiBhY3Rpb24uZGVmYXVsdCB8fCBmYWxzZTtcbiAgfVxuXG4gIG1hcmtBc1JlYWQoZXZlbnQ6IFVJRXZlbnQsIHVzZXJFdmVudDogRSkge1xuICAgIGlmICh1c2VyRXZlbnQ/LnJlYWREYXRlKSByZXR1cm47XG4gICAgdGhpcy5yZWFkRXZlbnQ/LmVtaXQodXNlckV2ZW50KTtcbiAgfVxuXG4gIG1hcmtBbGxBc1JlYWQoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBjb25zdCB1bnJlYWRVc2VyRXZlbnRzID0gKHRoaXMuJGl0ZW1zLnZhbHVlIHx8IFtdKS5maWx0ZXIodmFsdWUgPT4gIXZhbHVlLnJlYWREYXRlKTtcbiAgICBpZiAoIXVucmVhZFVzZXJFdmVudHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5yZWFkRXZlbnRzPy5lbWl0KHVucmVhZFVzZXJFdmVudHMpO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUFjdGlvbihcbiAgICAgIGV2ZW50OiBVSUV2ZW50LFxuICAgICAgYWN0aW9uOiBJVXNlckV2ZW50QWN0aW9uLFxuICAgICAgdXNlckV2ZW50OiBJVXNlckV2ZW50PGFueT4pIHtcblxuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuOyAvLyBTa2lwIGlmIHByZXZlbnRlZFxuXG4gICAgLy8gRGlzYWJsZSBkZWZhdWx0IGFjdGlvbiAoLmUuZyBhdm9pZCB0byBjYWxsIGNsaWNrKCkgZnVuY3Rpb24pXG4gICAgaWYgKGV2ZW50KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGVuIGNsb3NlIHBvcG92ZXJcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYWN0aW9uLmV4ZWN1dGVBY3Rpb24odXNlckV2ZW50KTtcbiAgICAgIHRoaXMuZGlzbWlzcygpO1xuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpIGF3YWl0IHJlcztcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgZGlzbWlzcygpIHtcbiAgICB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmRpc21pc3MoKTtcbiAgICAvLyBSZXNldCBjb3VudGVyIChuZWVkIGlmIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkIHdoaWxlIHBvcG92ZXIgaWYgb3BlbilcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UucmVzZXRDb3VudCgpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb3JlKGV2ZW50PzogQ3VzdG9tRXZlbnQgJiB7IHRhcmdldD86IEV2ZW50VGFyZ2V0ICYgeyBjb21wbGV0ZT86ICgpID0+IHZvaWQgfX0pIHtcbiAgICBpZiAoIXRoaXMuX2ZldGNoTW9yZUZuIHx8IHRoaXMuZmV0Y2hpbmdNb3JlKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmRlYnVnKCdbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gRmV0Y2hpbmcgbW9yZSBub3RpZmljYXRpb25zLi4uJywgZXZlbnQpO1xuICAgIHRoaXMuZmV0Y2hpbmdNb3JlID0gdHJ1ZTtcbiAgICBjb25zdCBmZXRjaE1vcmVGbiA9ICB0aGlzLl9mZXRjaE1vcmVGbjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaE1vcmVGbigpO1xuICAgICAgbGV0IGRhdGEgPSBbXG4gICAgICAgIC4uLih0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSksXG4gICAgICAgIC4uLnJlc3VsdC5kYXRhXG4gICAgICBdO1xuXG4gICAgICAvLyBSZW1vdmUgZHVwbGljYXRpb24gKGUuZy4gd2hlbiBuZXcgdXNlciBldmVudCB3YXMgYWRkZWQgYnkgc3Vic2NyaXB0aW9uKVxuICAgICAgZGF0YSA9IHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXkoZGF0YSwgJ2lkJyk7XG5cbiAgICAgIC8vIGZldGNoIG1vcmUgY2hhbmdlcyAoZS5nLiBpZiB3YXRjaEFsbCBvYnNlcnZhYmxlIGFzIGJlZW4gcmVmcmVzaGVkKVxuICAgICAgaWYgKGZldGNoTW9yZUZuICE9PSB0aGlzLl9mZXRjaE1vcmVGbikgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAgIHRoaXMuJGl0ZW1zLm5leHQoZGF0YSk7XG4gICAgICB0aGlzLiRpdGVtQ291bnQubmV4dChyZXN1bHQudG90YWwgfHwgcmVzdWx0LmRhdGE/Lmxlbmd0aCB8fCAwKTtcbiAgICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzdWx0LmZldGNoTW9yZTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBwYWdlIHNpemUsIHRvIGtlZXAgc2FtZSBzY3JvbGwgaGVpZ2h0LCBhZnRlciB0aGUgbmV4dCByZWZyZXNoXG4gICAgICB0aGlzLnBhZ2VTaXplID0gTWF0aC5tYXgodGhpcy5wYWdlU2l6ZSwgZGF0YS5sZW5ndGgpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gdW5kZWZpbmVkOyAvLyBGb3JnZXQgdGhlIGZ1bmN0aW9uXG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuZmV0Y2hpbmdNb3JlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IEUpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBpbml0SW5maW5pdGVTY3JvbGwodGhyZXNob2xkPzogc3RyaW5nKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLWxpc3RdIEluaXQgaW5maW5pdGUgbG9vcCcpO1xuICAgIGlmICh0aGlzLl9mZXRjaE1vcmVTdWJzY3JpcHRpb24pIHRoaXMuX2ZldGNoTW9yZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhyZXNob2xkID0gdGhyZXNob2xkIHx8ICh0aGlzLm1vYmlsZSA/ICcxNSUnIDogJzIlJyk7XG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiAhIXRoaXMuaW9uQ29udGVudCwge2R1ZVRpbWU6IDI1MCwgdGltZW91dDogMTAwMH0pO1xuICAgIGNvbnN0IHBhbmVsID0gYXdhaXQgdGhpcy5pb25Db250ZW50LmdldFNjcm9sbEVsZW1lbnQoKTtcblxuICAgIC8vIFRyaWdnZXIgZmV0Y2ggbW9yZSwgZW5kIGVuZCBzY3JvbGwgcmVhY2hlZFxuICAgIHRoaXMuX2ZldGNoTW9yZVN1YnNjcmlwdGlvbiA9IHRoaXMuJGl0ZW1zLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jYW5GZXRjaE1vcmUpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gZnJvbVNjcm9sbEVuZEV2ZW50KHBhbmVsLCB0aHJlc2hvbGQsIDI1MCAvKmZvcmNlIHRvIGNoZWNrIHdoZW4gbm8gc2Nyb2xsYmFyIC0gZS5nLiBpbiBsYXJnZSBzY3JlZW4qLykpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZmV0Y2hNb3JlKCkpO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5fZmV0Y2hNb3JlU3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIl19
@@ -1,12 +1,13 @@
1
1
  import { Component, Inject, ViewChild } from '@angular/core';
2
2
  import { USER_EVENT_SERVICE } from '../user-event.service';
3
- import { UserEvent } from '../user-event.model';
4
3
  import { Router } from '@angular/router';
5
4
  import { Alerts } from '../../../shared/alerts';
6
5
  import { AlertController } from '@ionic/angular';
7
6
  import { TranslateService } from '@ngx-translate/core';
8
7
  import * as momentImported from 'moment';
9
8
  import { UserEventTestService } from './user-event.testing.service';
9
+ import { timer } from 'rxjs';
10
+ import { UserEventTest } from './user-event.testing.model';
10
11
  const moment = momentImported;
11
12
  export class UserEventTestingPage {
12
13
  constructor(userEventService, router, alertController, translateService) {
@@ -26,6 +27,12 @@ export class UserEventTestingPage {
26
27
  onRead: (userEvent) => { this.showMessage("debug message read "); }
27
28
  });
28
29
  }
30
+ get timerStarted() {
31
+ return !!this._timerSubscription;
32
+ }
33
+ ngOnDestroy() {
34
+ this.stopTimer();
35
+ }
29
36
  customize(userEvent) {
30
37
  // Choose avatarIcon
31
38
  switch (userEvent.level) {
@@ -56,7 +63,7 @@ export class UserEventTestingPage {
56
63
  }
57
64
  }
58
65
  addNotification() {
59
- this.userEventService.add(UserEvent.fromObject({
66
+ this.userEventService.add(UserEventTest.fromObject({
60
67
  issuer: 'system',
61
68
  recipient: 'me',
62
69
  type: 'message',
@@ -66,7 +73,7 @@ export class UserEventTestingPage {
66
73
  }));
67
74
  }
68
75
  addError() {
69
- this.userEventService.add(UserEvent.fromObject({
76
+ this.userEventService.add(UserEventTest.fromObject({
70
77
  issuer: 'system',
71
78
  recipient: 'me',
72
79
  type: 'upload',
@@ -76,7 +83,7 @@ export class UserEventTestingPage {
76
83
  }));
77
84
  }
78
85
  addWarning() {
79
- this.userEventService.add(UserEvent.fromObject({
86
+ this.userEventService.add(UserEventTest.fromObject({
80
87
  issuer: 'system',
81
88
  recipient: 'me',
82
89
  type: 'download',
@@ -86,7 +93,7 @@ export class UserEventTestingPage {
86
93
  }));
87
94
  }
88
95
  addDebug() {
89
- this.userEventService.add(UserEvent.fromObject({
96
+ this.userEventService.add(UserEventTest.fromObject({
90
97
  issuer: 'system',
91
98
  recipient: 'me',
92
99
  type: 'debug',
@@ -96,7 +103,7 @@ export class UserEventTestingPage {
96
103
  }));
97
104
  }
98
105
  addNotificationWithLink() {
99
- this.userEventService.add(UserEvent.fromObject({
106
+ this.userEventService.add(UserEventTest.fromObject({
100
107
  issuer: 'system',
101
108
  recipient: 'me',
102
109
  type: 'message',
@@ -113,7 +120,7 @@ export class UserEventTestingPage {
113
120
  }));
114
121
  }
115
122
  addNotificationWithAction() {
116
- this.userEventService.add(UserEvent.fromObject({
123
+ this.userEventService.add(UserEventTest.fromObject({
117
124
  issuer: 'system',
118
125
  recipient: 'me',
119
126
  type: 'message',
@@ -140,6 +147,67 @@ export class UserEventTestingPage {
140
147
  ]
141
148
  }));
142
149
  }
150
+ addMany(count) {
151
+ count = count || 20;
152
+ for (let i = 0; i < count; i++) {
153
+ this.addRandom(i);
154
+ }
155
+ }
156
+ startTimer(period) {
157
+ var _a;
158
+ (_a = this._timerSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
159
+ period = period || 1000;
160
+ let counter = 0;
161
+ this._timerSubscription = timer(period, period)
162
+ .subscribe(() => {
163
+ this.addRandom(counter);
164
+ counter++;
165
+ });
166
+ }
167
+ stopTimer() {
168
+ var _a;
169
+ (_a = this._timerSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
170
+ this._timerSubscription = null;
171
+ }
172
+ addRandom(value) {
173
+ switch (value % 6) {
174
+ case 0:
175
+ this.addNotification();
176
+ break;
177
+ case 1:
178
+ this.addError();
179
+ break;
180
+ case 2:
181
+ this.addDebug();
182
+ break;
183
+ case 3:
184
+ this.addNotificationWithLink();
185
+ break;
186
+ case 4:
187
+ this.addNotificationWithAction();
188
+ break;
189
+ case 5:
190
+ this.addNotificationWithDefaultAction();
191
+ break;
192
+ }
193
+ }
194
+ addNotificationWithDefaultAction() {
195
+ this.userEventService.add(UserEventTest.fromObject({
196
+ issuer: 'system',
197
+ recipient: 'me',
198
+ type: 'message',
199
+ level: 'INFO',
200
+ message: 'message with action',
201
+ creationDate: moment(),
202
+ actions: [
203
+ {
204
+ default: true,
205
+ name: 'default',
206
+ executeAction: event => { this.showMessage('default action'); }
207
+ }
208
+ ]
209
+ }));
210
+ }
143
211
  showMessage(text) {
144
212
  return Alerts.showError(text, this.alertController, this.translateService);
145
213
  }
@@ -147,7 +215,7 @@ export class UserEventTestingPage {
147
215
  UserEventTestingPage.decorators = [
148
216
  { type: Component, args: [{
149
217
  selector: 'job-progression-testing',
150
- template: "<ion-toolbar color=\"primary\">\n <ion-title>User events</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n\n <app-user-event-notification-icon #notification [debug]=\"true\"></app-user-event-notification-icon>\n\n <p>\n <ion-button (click)=\"addNotification()\">Add notification</ion-button>\n <ion-button (click)=\"addError()\">Add error</ion-button>\n <ion-button (click)=\"addWarning()\">Add warning</ion-button>\n <ion-button (click)=\"addDebug()\">Add debug</ion-button>\n </p>\n <p>\n <ion-button (click)=\"addNotificationWithLink()\">Add notification with link</ion-button>\n <ion-button (click)=\"addNotificationWithAction()\">Add notification with action</ion-button>\n </p>\n</ion-content>\n"
218
+ template: "<ion-toolbar color=\"primary\">\n <ion-title>User events</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n\n <app-user-event-notification-icon #notification [debug]=\"true\"></app-user-event-notification-icon>\n\n <p>\n <ion-button (click)=\"addNotification()\">Add notification</ion-button>\n <ion-button (click)=\"addError()\">Add error</ion-button>\n <ion-button (click)=\"addWarning()\">Add warning</ion-button>\n <ion-button (click)=\"addDebug()\">Add debug</ion-button>\n </p>\n <p>\n <ion-button (click)=\"addNotificationWithLink()\">Add notification with link</ion-button>\n <ion-button (click)=\"addNotificationWithAction()\">Add notification with action</ion-button>\n <ion-button (click)=\"addNotificationWithDefaultAction()\">Add notification with default action</ion-button>\n </p>\n <p>\n <ion-button (click)=\"addMany()\">Add notifications (x20)</ion-button>\n </p>\n <p>\n <ion-button (click)=\"startTimer()\" *ngIf=\"!timerStarted\">Start timer</ion-button>\n <ion-button (click)=\"stopTimer()\" *ngIf=\"timerStarted\">Stop timer</ion-button>\n </p>\n</ion-content>\n"
151
219
  },] }
152
220
  ];
153
221
  UserEventTestingPage.ctorParameters = () => [
@@ -159,4 +227,4 @@ UserEventTestingPage.ctorParameters = () => [
159
227
  UserEventTestingPage.propDecorators = {
160
228
  notification: [{ type: ViewChild, args: ['notification',] }]
161
229
  };
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC50ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC90ZXN0aW5nL3VzZXItZXZlbnQudGVzdGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssY0FBYyxNQUFNLFFBQVEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUdsRSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFNOUIsTUFBTSxPQUFPLG9CQUFvQjtJQUsvQixZQUN3QyxnQkFBc0MsRUFDbEUsTUFBYyxFQUNkLGVBQWdDLEVBQ2hDLGdCQUFrQztRQUhOLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBc0I7UUFDbEUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRzVDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1lBQ2hDLE1BQU0sRUFBRSxDQUFDLFNBQW9CLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFBLENBQUMsQ0FBQztZ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QkFDVTtvQkFDZixJQUFJLEVBQUUsWUFBWTtvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRSx1QkFBdUI7d0JBQzdCLEtBQUssRUFBRSxTQUFTO3FCQUNqQjtvQkFDRCxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQztpQkFDekQ7Z0JBQ2dCO29CQUNmLElBQUksRUFBRSxjQUFjO29CQUNwQixPQUFPLEVBQUU7d0JBQ1AsT0FBTyxFQUFFLHVCQUF1Qjt3QkFDaEMsS0FBSyxFQUFFLFdBQVc7cUJBQ25CO29CQUNELGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQyxDQUFDO2lCQUMzRDthQUNBO1NBQ0YsQ0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsV0FBVyxDQUFDLElBQVk7UUFDaEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdFLENBQUM7OztZQWpLRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtnQkFDbkMsb3ZCQUFzQzthQUN2Qzs7O1lBUk8sb0JBQW9CLHVCQWV2QixNQUFNLFNBQUMsa0JBQWtCO1lBcEJ0QixNQUFNO1lBRU4sZUFBZTtZQUNmLGdCQUFnQjs7OzJCQWFyQixTQUFTLFNBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1VTRVJfRVZFTlRfU0VSVklDRX0gZnJvbSAnLi4vdXNlci1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7VXNlckV2ZW50LCBVc2VyRXZlbnRBY3Rpb259IGZyb20gJy4uL3VzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0FsZXJ0c30gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2FsZXJ0cyc7XG5pbXBvcnQge0FsZXJ0Q29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCAqIGFzIG1vbWVudEltcG9ydGVkIGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1VzZXJFdmVudFRlc3RTZXJ2aWNlfSBmcm9tICcuL3VzZXItZXZlbnQudGVzdGluZy5zZXJ2aWNlJztcbmltcG9ydCB7QXBwVXNlckV2ZW50Tm90aWZpY2F0aW9uSWNvbn0gZnJvbSAnLi4vbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmljb24nO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnRJbXBvcnRlZDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam9iLXByb2dyZXNzaW9uLXRlc3RpbmcnLFxuICB0ZW1wbGF0ZVVybDogJ3VzZXItZXZlbnQudGVzdGluZy5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnRUZXN0aW5nUGFnZSB7XG5cbiAgQFZpZXdDaGlsZCgnbm90aWZpY2F0aW9uJykgbm90aWZpY2F0aW9uOiBBcHBVc2VyRXZlbnROb3RpZmljYXRpb25JY29uO1xuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChVU0VSX0VWRU5UX1NFUlZJQ0UpIHByb3RlY3RlZCB1c2VyRXZlbnRTZXJ2aWNlOiBVc2VyRXZlbnRUZXN0U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIGFsZXJ0Q29udHJvbGxlcjogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICkge1xuXG4gICAgdXNlckV2ZW50U2VydmljZS5yZWdpc3Rlckxpc3RlbmVyKHtcbiAgICAgIGFjY2VwdDogKHVzZXJFdmVudDogVXNlckV2ZW50KSA9PiB7IHJldHVybiB0cnVlIH0sXG4gICAgICBvblJlY2VpdmVkOiAodXNlckV2ZW50OiBVc2VyRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5jdXN0b21pemUodXNlckV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHVzZXJFdmVudFxuICAgICAgfVxuICAgIH0pXG4gICAgdXNlckV2ZW50U2VydmljZS5yZWdpc3Rlckxpc3RlbmVyKHtcbiAgICAgIGFjY2VwdDogKHVzZXJFdmVudDogVXNlckV2ZW50KSA9PiB7IHJldHVybiB1c2VyRXZlbnQubGV2ZWwgPT0gXCJERUJVR1wiIH0sXG4gICAgICBvblJlYWQ6ICh1c2VyRXZlbnQ6IFVzZXJFdmVudCkgPT4geyB0aGlzLnNob3dNZXNzYWdlKFwiZGVidWcgbWVzc2FnZSByZWFkIFwiKX1cbiAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIGN1c3RvbWl6ZSh1c2VyRXZlbnQ6IFVzZXJFdmVudCkge1xuXG4gICAgLy8gQ2hvb3NlIGF2YXRhckljb25cbiAgICBzd2l0Y2ggKHVzZXJFdmVudC5sZXZlbCkge1xuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICB1c2VyRXZlbnQuYXZhdGFySWNvbiA9IHsgaWNvbjogJ2Nsb3NlLW91dGxpbmUnLCBjb2xvcjogJ2RhbmdlcicgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXQVJOSU5HJzpcbiAgICAgICAgdXNlckV2ZW50LmF2YXRhckljb24gPSB7IGljb246ICd3YXJuaW5nLW91dGxpbmUnLCBjb2xvcjogJ3dhcm5pbmcnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSU5GTyc6XG4gICAgICAgIHVzZXJFdmVudC5hdmF0YXJJY29uID0geyBpY29uOiAnaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmUnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnREVCVUcnOlxuICAgICAgICB1c2VyRXZlbnQuYXZhdGFySWNvbiA9IHsgaWNvbjogJ2NvZycsIGNvbG9yOiBcIm1lZGl1bVwiIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIENob29zZSBpY29uXG4gICAgc3dpdGNoICh1c2VyRXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgICAgIHVzZXJFdmVudC5pY29uID0geyBtYXRJY29uOiAnaW5ib3gnLCBjb2xvcjogJ2FjY2VudCcgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1cGxvYWQnOlxuICAgICAgICB1c2VyRXZlbnQuaWNvbiA9IHsgbWF0SWNvbjogJ2ZpbGVfdXBsb2FkJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rvd25sb2FkJzpcbiAgICAgICAgdXNlckV2ZW50Lmljb24gPSB7IG1hdEljb246ICdmaWxlX2Rvd25sb2FkJyB9O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgfVxuXG4gIGFkZE5vdGlmaWNhdGlvbigpIHtcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UuYWRkKFVzZXJFdmVudC5mcm9tT2JqZWN0KHtcbiAgICAgICAgaXNzdWVyOiAnc3lzdGVtJyxcbiAgICAgICAgcmVjaXBpZW50OiAnbWUnLFxuICAgICAgICB0eXBlOiAnbWVzc2FnZScsXG4gICAgICAgIGxldmVsOiAnSU5GTycsXG4gICAgICAgIG1lc3NhZ2U6ICdtZXNzYWdlIHRlc3QgbWVzc2FnZSB0ZXN0IG1lc3NhZ2UgdGVzdCBtZXNzYWdlIHRlc3QgbWVzc2FnZSB0ZXN0IG1lc3NhZ2UgdGVzdCBtZXNzYWdlIHRlc3QgbWVzc2FnZSB0ZXN0JyxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBtb21lbnQoKSxcbiAgICAgIH1cbiAgICApKTtcbiAgfVxuXG4gIGFkZEVycm9yKCkge1xuICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5hZGQoVXNlckV2ZW50LmZyb21PYmplY3Qoe1xuICAgICAgICBpc3N1ZXI6ICdzeXN0ZW0nLFxuICAgICAgICByZWNpcGllbnQ6ICdtZScsXG4gICAgICAgIHR5cGU6ICd1cGxvYWQnLFxuICAgICAgICBsZXZlbDogJ0VSUk9SJyxcbiAgICAgICAgbWVzc2FnZTogJ21lc3NhZ2UgZXJyb3InLFxuICAgICAgICBjcmVhdGlvbkRhdGU6IG1vbWVudCgpLFxuICAgICAgfVxuICAgICkpO1xuICB9XG5cbiAgYWRkV2FybmluZygpIHtcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UuYWRkKFVzZXJFdmVudC5mcm9tT2JqZWN0KHtcbiAgICAgICAgaXNzdWVyOiAnc3lzdGVtJyxcbiAgICAgICAgcmVjaXBpZW50OiAnbWUnLFxuICAgICAgICB0eXBlOiAnZG93bmxvYWQnLFxuICAgICAgICBsZXZlbDogJ1dBUk5JTkcnLFxuICAgICAgICBtZXNzYWdlOiAnbWVzc2FnZSB3YXJuaW5nJyxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBtb21lbnQoKSxcbiAgICAgIH1cbiAgICApKTtcbiAgfVxuXG4gIGFkZERlYnVnKCkge1xuICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5hZGQoVXNlckV2ZW50LmZyb21PYmplY3Qoe1xuICAgICAgICBpc3N1ZXI6ICdzeXN0ZW0nLFxuICAgICAgICByZWNpcGllbnQ6ICdtZScsXG4gICAgICAgIHR5cGU6ICdkZWJ1ZycsXG4gICAgICAgIGxldmVsOiAnREVCVUcnLFxuICAgICAgICBtZXNzYWdlOiAnbWVzc2FnZSBERUJVRycsXG4gICAgICAgIGNyZWF0aW9uRGF0ZTogbW9tZW50KCksXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBhZGROb3RpZmljYXRpb25XaXRoTGluaygpIHtcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UuYWRkKFVzZXJFdmVudC5mcm9tT2JqZWN0KHtcbiAgICAgICAgaXNzdWVyOiAnc3lzdGVtJyxcbiAgICAgICAgcmVjaXBpZW50OiAnbWUnLFxuICAgICAgICB0eXBlOiAnbWVzc2FnZScsXG4gICAgICAgIGxldmVsOiAnSU5GTycsXG4gICAgICAgIG1lc3NhZ2U6ICdtZXNzYWdlIHdpdGggbGluaycsXG4gICAgICAgIGNyZWF0aW9uRGF0ZTogbW9tZW50KCksXG4gICAgICAgIGFjdGlvbnM6IFs8VXNlckV2ZW50QWN0aW9uPntcbiAgICAgICAgICBuYW1lOiAnY2xpY2sgaGVyZScsXG4gICAgICAgICAgaWNvblJlZjoge1xuICAgICAgICAgICAgaWNvbjogJ2Fycm93LWZvcndhcmQtb3V0bGluZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4ZWN1dGVBY3Rpb246IGV2ZW50ID0+IHsgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycpIH1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICApKTtcbiAgfVxuXG4gIGFkZE5vdGlmaWNhdGlvbldpdGhBY3Rpb24oKSB7XG4gICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLmFkZChVc2VyRXZlbnQuZnJvbU9iamVjdCh7XG4gICAgICAgIGlzc3VlcjogJ3N5c3RlbScsXG4gICAgICAgIHJlY2lwaWVudDogJ21lJyxcbiAgICAgICAgdHlwZTogJ21lc3NhZ2UnLFxuICAgICAgICBsZXZlbDogJ0lORk8nLFxuICAgICAgICBtZXNzYWdlOiAnbWVzc2FnZSB3aXRoIGFjdGlvbicsXG4gICAgICAgIGNyZWF0aW9uRGF0ZTogbW9tZW50KCksXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICA8VXNlckV2ZW50QWN0aW9uPntcbiAgICAgICAgICAgIG5hbWU6ICdjbGljayBoZXJlJyxcbiAgICAgICAgICAgIGljb25SZWY6IHtcbiAgICAgICAgICAgICAgaWNvbjogJ2Fycm93LWZvcndhcmQtb3V0bGluZScsXG4gICAgICAgICAgICAgIGNvbG9yOiAnd2FybmluZydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleGVjdXRlQWN0aW9uOiBldmVudCA9PiB7IHRoaXMuc2hvd01lc3NhZ2UoJ2FjdGlvbiAxJykgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgPFVzZXJFdmVudEFjdGlvbj57XG4gICAgICAgICAgICBuYW1lOiAnY2xpY2sgaGVyZSAyJyxcbiAgICAgICAgICAgIGljb25SZWY6IHtcbiAgICAgICAgICAgICAgbWF0SWNvbjogJ3NldHRpbmdzX2FwcGxpY2F0aW9ucycsXG4gICAgICAgICAgICAgIGNvbG9yOiAnc2Vjb25kYXJ5J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4ZWN1dGVBY3Rpb246IGV2ZW50ID0+IHsgdGhpcy5zaG93TWVzc2FnZSgnYWN0aW9uIDInKSB9XG4gICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgICkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dNZXNzYWdlKHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBBbGVydHMuc2hvd0Vycm9yKHRleHQsIHRoaXMuYWxlcnRDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UpO1xuICB9XG59XG5cbiJdfQ==
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC50ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC90ZXN0aW5nL3VzZXItZXZlbnQudGVzdGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBYSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxLQUFLLGNBQWMsTUFBTSxRQUFRLENBQUM7QUFDekMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFbEUsT0FBTyxFQUFlLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDO0FBTTlCLE1BQU0sT0FBTyxvQkFBb0I7SUFVL0IsWUFDd0MsZ0JBQXNDLEVBQ2xFLE1BQWMsRUFDZCxlQUFnQyxFQUNoQyxnQkFBa0M7UUFITixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXNCO1FBQ2xFLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUc1QyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNoQyxNQUFNLEVBQUUsQ0FBQyxTQUF3QixFQUFFLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQSxDQUFDLENBQUM7WUFDckQsVUFBVSxFQUFFLENBQUMsU0FBd0IsRUFBRSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQixPQUFPLFNBQVMsQ0FBQTtZQUNsQixDQUFDO1NBQ0YsQ0FBQyxDQUFBO1FBQ0YsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7WUFDaEMsTUFBTSxFQUFFLENBQUMsU0FBd0IsRUFBRSxFQUFFLEdBQUcsT0FBTyxTQUFTLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQSxDQUFDLENBQUM7WUFDM0UsTUFBTSxFQUFFLENBQUMsU0FBd0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBLENBQUEsQ0FBQztTQUNqRixDQUFDLENBQUE7SUFDSixDQUFDO0lBdEJELElBQUksWUFBWTtRQUNkLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNuQyxDQUFDO0lBc0JELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVTLFNBQVMsQ0FBQyxTQUF3QjtRQUUxQyxvQkFBb0I7UUFDcEIsUUFBUSxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ3ZCLEtBQUssT0FBTztnQkFDVixTQUFTLENBQUMsVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ2xFLE1BQU07WUFDUixLQUFLLFNBQVM7Z0JBQ1osU0FBUyxDQUFDLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQ3JFLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsU0FBUyxDQUFDLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxDQUFDO2dCQUM5RCxNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLFNBQVMsQ0FBQyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDeEQsTUFBTTtTQUNUO1FBRUQsY0FBYztRQUNkLFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRTtZQUN0QixLQUFLLFNBQVM7Z0JBQ1osU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUN2RCxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0JBQzVDLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQztnQkFDOUMsTUFBTTtTQUNUO0lBRUgsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDL0MsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLElBQUk7WUFDZixJQUFJLEVBQUUsU0FBUztZQUNmLEtBQUssRUFBRSxNQUFNO1lBQ2IsT0FBTyxFQUFFLHlHQUF5RztZQUNsSCxZQUFZLEVBQUUsTUFBTSxFQUFFO1NBQ3ZCLENBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDL0MsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLElBQUk7WUFDZixJQUFJLEVBQUUsUUFBUTtZQUNkLEtBQUssRUFBRSxPQUFPO1lBQ2QsT0FBTyxFQUFFLGVBQWU7WUFDeEIsWUFBWSxFQUFFLE1BQU0sRUFBRTtTQUN2QixDQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO1lBQy9DLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsSUFBSSxFQUFFLFVBQVU7WUFDaEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixZQUFZLEVBQUUsTUFBTSxFQUFFO1NBQ3ZCLENBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDL0MsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLElBQUk7WUFDZixJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxPQUFPO1lBQ2QsT0FBTyxFQUFFLGVBQWU7WUFDeEIsWUFBWSxFQUFFLE1BQU0sRUFBRTtTQUN2QixDQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO1lBQy9DLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsSUFBSSxFQUFFLFNBQVM7WUFDZixLQUFLLEVBQUUsTUFBTTtZQUNiLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsWUFBWSxFQUFFLE1BQU0sRUFBRTtZQUN0QixPQUFPLEVBQUUsQ0FBbUI7b0JBQzFCLElBQUksRUFBRSxZQUFZO29CQUNsQixPQUFPLEVBQUU7d0JBQ1AsSUFBSSxFQUFFLHVCQUF1QjtxQkFDOUI7b0JBQ0QsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxDQUFDO2lCQUMzRCxDQUFDO1NBQ0gsQ0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztZQUMvQyxNQUFNLEVBQUUsUUFBUTtZQUNoQixTQUFTLEVBQUUsSUFBSTtZQUNmLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLE1BQU07WUFDYixPQUFPLEVBQUUscUJBQXFCO1lBQzlCLFlBQVksRUFBRSxNQUFNLEVBQUU7WUFDdEIsT0FBTyxFQUFFO2dCQUNXO29CQUNoQixJQUFJLEVBQUUsWUFBWTtvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRSx1QkFBdUI7d0JBQzdCLEtBQUssRUFBRSxTQUFTO3FCQUNqQjtvQkFDRCxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQztpQkFDekQ7Z0JBQ2lCO29CQUNoQixJQUFJLEVBQUUsY0FBYztvQkFDcEIsT0FBTyxFQUFFO3dCQUNQLE9BQU8sRUFBRSx1QkFBdUI7d0JBQ2hDLEtBQUssRUFBRSxXQUFXO3FCQUNuQjtvQkFDRCxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQztpQkFDM0Q7YUFDQTtTQUNGLENBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFjO1FBQ3BCLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsTUFBZTs7UUFDeEIsTUFBQSxJQUFJLENBQUMsa0JBQWtCLDBDQUFFLFdBQVcsR0FBRztRQUV2QyxNQUFNLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQztRQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFaEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO2FBQzVDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUzs7UUFDUCxNQUFBLElBQUksQ0FBQyxrQkFBa0IsMENBQUUsV0FBVyxHQUFHO1FBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFhO1FBQ3JCLFFBQVEsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNqQixLQUFLLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtnQkFDZixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtnQkFDZixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO2dCQUM5QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFBO2dCQUNoQyxNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFBO2dCQUN2QyxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsZ0NBQWdDO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztZQUMvQyxNQUFNLEVBQUUsUUFBUTtZQUNoQixTQUFTLEVBQUUsSUFBSTtZQUNmLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLE1BQU07WUFDYixPQUFPLEVBQUUscUJBQXFCO1lBQzlCLFlBQVksRUFBRSxNQUFNLEVBQUU7WUFDdEIsT0FBTyxFQUFFO2dCQUNXO29CQUNoQixPQUFPLEVBQUUsSUFBSTtvQkFDYixJQUFJLEVBQUUsU0FBUztvQkFDZixhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUEsQ0FBQyxDQUFDO2lCQUMvRDthQUNGO1NBQ0YsQ0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsV0FBVyxDQUFDLElBQVk7UUFDaEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdFLENBQUM7OztZQTdPRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtnQkFDbkMsbW9DQUFzQzthQUN2Qzs7O1lBVk8sb0JBQW9CLHVCQXNCdkIsTUFBTSxTQUFDLGtCQUFrQjtZQTNCdEIsTUFBTTtZQUVOLGVBQWU7WUFDZixnQkFBZ0I7OzsyQkFpQnJCLFNBQVMsU0FBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtVU0VSX0VWRU5UX1NFUlZJQ0V9IGZyb20gJy4uL3VzZXItZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0lVc2VyRXZlbnRBY3Rpb259IGZyb20gJy4uL3VzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0FsZXJ0c30gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2FsZXJ0cyc7XG5pbXBvcnQge0FsZXJ0Q29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCAqIGFzIG1vbWVudEltcG9ydGVkIGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1VzZXJFdmVudFRlc3RTZXJ2aWNlfSBmcm9tICcuL3VzZXItZXZlbnQudGVzdGluZy5zZXJ2aWNlJztcbmltcG9ydCB7QXBwVXNlckV2ZW50Tm90aWZpY2F0aW9uSWNvbn0gZnJvbSAnLi4vbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmljb24nO1xuaW1wb3J0IHtTdWJzY3JpcHRpb24sIHRpbWVyfSBmcm9tICdyeGpzJztcbmltcG9ydCB7VXNlckV2ZW50VGVzdH0gZnJvbSAnLi91c2VyLWV2ZW50LnRlc3RpbmcubW9kZWwnO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnRJbXBvcnRlZDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam9iLXByb2dyZXNzaW9uLXRlc3RpbmcnLFxuICB0ZW1wbGF0ZVVybDogJ3VzZXItZXZlbnQudGVzdGluZy5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnRUZXN0aW5nUGFnZSBpbXBsZW1lbnRzIE9uRGVzdHJveXtcblxuICBwcml2YXRlIF90aW1lclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIEBWaWV3Q2hpbGQoJ25vdGlmaWNhdGlvbicpIG5vdGlmaWNhdGlvbjogQXBwVXNlckV2ZW50Tm90aWZpY2F0aW9uSWNvbjtcblxuICBnZXQgdGltZXJTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3RpbWVyU3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChVU0VSX0VWRU5UX1NFUlZJQ0UpIHByb3RlY3RlZCB1c2VyRXZlbnRTZXJ2aWNlOiBVc2VyRXZlbnRUZXN0U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIGFsZXJ0Q29udHJvbGxlcjogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICkge1xuXG4gICAgdXNlckV2ZW50U2VydmljZS5yZWdpc3Rlckxpc3RlbmVyKHtcbiAgICAgIGFjY2VwdDogKHVzZXJFdmVudDogVXNlckV2ZW50VGVzdCkgPT4geyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgb25SZWNlaXZlZDogKHVzZXJFdmVudDogVXNlckV2ZW50VGVzdCkgPT4ge1xuICAgICAgICB0aGlzLmN1c3RvbWl6ZSh1c2VyRXZlbnQpO1xuICAgICAgICByZXR1cm4gdXNlckV2ZW50XG4gICAgICB9XG4gICAgfSlcbiAgICB1c2VyRXZlbnRTZXJ2aWNlLnJlZ2lzdGVyTGlzdGVuZXIoe1xuICAgICAgYWNjZXB0OiAodXNlckV2ZW50OiBVc2VyRXZlbnRUZXN0KSA9PiB7IHJldHVybiB1c2VyRXZlbnQubGV2ZWwgPT0gXCJERUJVR1wiIH0sXG4gICAgICBvblJlYWQ6ICh1c2VyRXZlbnQ6IFVzZXJFdmVudFRlc3QpID0+IHsgdGhpcy5zaG93TWVzc2FnZShcImRlYnVnIG1lc3NhZ2UgcmVhZCBcIil9XG4gICAgfSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3VzdG9taXplKHVzZXJFdmVudDogVXNlckV2ZW50VGVzdCkge1xuXG4gICAgLy8gQ2hvb3NlIGF2YXRhckljb25cbiAgICBzd2l0Y2ggKHVzZXJFdmVudC5sZXZlbCkge1xuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICB1c2VyRXZlbnQuYXZhdGFySWNvbiA9IHsgaWNvbjogJ2Nsb3NlLW91dGxpbmUnLCBjb2xvcjogJ2RhbmdlcicgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXQVJOSU5HJzpcbiAgICAgICAgdXNlckV2ZW50LmF2YXRhckljb24gPSB7IGljb246ICd3YXJuaW5nLW91dGxpbmUnLCBjb2xvcjogJ3dhcm5pbmcnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSU5GTyc6XG4gICAgICAgIHVzZXJFdmVudC5hdmF0YXJJY29uID0geyBpY29uOiAnaW5mb3JtYXRpb24tY2lyY2xlLW91dGxpbmUnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnREVCVUcnOlxuICAgICAgICB1c2VyRXZlbnQuYXZhdGFySWNvbiA9IHsgaWNvbjogJ2NvZycsIGNvbG9yOiBcIm1lZGl1bVwiIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIENob29zZSBpY29uXG4gICAgc3dpdGNoICh1c2VyRXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgICAgIHVzZXJFdmVudC5pY29uID0geyBtYXRJY29uOiAnaW5ib3gnLCBjb2xvcjogJ2FjY2VudCcgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1cGxvYWQnOlxuICAgICAgICB1c2VyRXZlbnQuaWNvbiA9IHsgbWF0SWNvbjogJ2ZpbGVfdXBsb2FkJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rvd25sb2FkJzpcbiAgICAgICAgdXNlckV2ZW50Lmljb24gPSB7IG1hdEljb246ICdmaWxlX2Rvd25sb2FkJyB9O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgfVxuXG4gIGFkZE5vdGlmaWNhdGlvbigpIHtcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UuYWRkKFVzZXJFdmVudFRlc3QuZnJvbU9iamVjdCh7XG4gICAgICAgIGlzc3VlcjogJ3N5c3RlbScsXG4gICAgICAgIHJlY2lwaWVudDogJ21lJyxcbiAgICAgICAgdHlwZTogJ21lc3NhZ2UnLFxuICAgICAgICBsZXZlbDogJ0lORk8nLFxuICAgICAgICBtZXNzYWdlOiAnbWVzc2FnZSB0ZXN0IG1lc3NhZ2UgdGVzdCBtZXNzYWdlIHRlc3QgbWVzc2FnZSB0ZXN0IG1lc3NhZ2UgdGVzdCBtZXNzYWdlIHRlc3QgbWVzc2FnZSB0ZXN0IG1lc3NhZ2UgdGVzdCcsXG4gICAgICAgIGNyZWF0aW9uRGF0ZTogbW9tZW50KCksXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBhZGRFcnJvcigpIHtcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UuYWRkKFVzZXJFdmVudFRlc3QuZnJvbU9iamVjdCh7XG4gICAgICAgIGlzc3VlcjogJ3N5c3RlbScsXG4gICAgICAgIHJlY2lwaWVudDogJ21lJyxcbiAgICAgICAgdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgIGxldmVsOiAnRVJST1InLFxuICAgICAgICBtZXNzYWdlOiAnbWVzc2FnZSBlcnJvcicsXG4gICAgICAgIGNyZWF0aW9uRGF0ZTogbW9tZW50KCksXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBhZGRXYXJuaW5nKCkge1xuICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5hZGQoVXNlckV2ZW50VGVzdC5mcm9tT2JqZWN0KHtcbiAgICAgICAgaXNzdWVyOiAnc3lzdGVtJyxcbiAgICAgICAgcmVjaXBpZW50OiAnbWUnLFxuICAgICAgICB0eXBlOiAnZG93bmxvYWQnLFxuICAgICAgICBsZXZlbDogJ1dBUk5JTkcnLFxuICAgICAgICBtZXNzYWdlOiAnbWVzc2FnZSB3YXJuaW5nJyxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBtb21lbnQoKSxcbiAgICAgIH1cbiAgICApKTtcbiAgfVxuXG4gIGFkZERlYnVnKCkge1xuICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5hZGQoVXNlckV2ZW50VGVzdC5mcm9tT2JqZWN0KHtcbiAgICAgICAgaXNzdWVyOiAnc3lzdGVtJyxcbiAgICAgICAgcmVjaXBpZW50OiAnbWUnLFxuICAgICAgICB0eXBlOiAnZGVidWcnLFxuICAgICAgICBsZXZlbDogJ0RFQlVHJyxcbiAgICAgICAgbWVzc2FnZTogJ21lc3NhZ2UgREVCVUcnLFxuICAgICAgICBjcmVhdGlvbkRhdGU6IG1vbWVudCgpLFxuICAgICAgfVxuICAgICkpO1xuICB9XG5cbiAgYWRkTm90aWZpY2F0aW9uV2l0aExpbmsoKSB7XG4gICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLmFkZChVc2VyRXZlbnRUZXN0LmZyb21PYmplY3Qoe1xuICAgICAgICBpc3N1ZXI6ICdzeXN0ZW0nLFxuICAgICAgICByZWNpcGllbnQ6ICdtZScsXG4gICAgICAgIHR5cGU6ICdtZXNzYWdlJyxcbiAgICAgICAgbGV2ZWw6ICdJTkZPJyxcbiAgICAgICAgbWVzc2FnZTogJ21lc3NhZ2Ugd2l0aCBsaW5rJyxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBtb21lbnQoKSxcbiAgICAgICAgYWN0aW9uczogWzxJVXNlckV2ZW50QWN0aW9uPntcbiAgICAgICAgICBuYW1lOiAnY2xpY2sgaGVyZScsXG4gICAgICAgICAgaWNvblJlZjoge1xuICAgICAgICAgICAgaWNvbjogJ2Fycm93LWZvcndhcmQtb3V0bGluZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4ZWN1dGVBY3Rpb246IGV2ZW50ID0+IHsgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycpIH1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICApKTtcbiAgfVxuXG4gIGFkZE5vdGlmaWNhdGlvbldpdGhBY3Rpb24oKSB7XG4gICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLmFkZChVc2VyRXZlbnRUZXN0LmZyb21PYmplY3Qoe1xuICAgICAgICBpc3N1ZXI6ICdzeXN0ZW0nLFxuICAgICAgICByZWNpcGllbnQ6ICdtZScsXG4gICAgICAgIHR5cGU6ICdtZXNzYWdlJyxcbiAgICAgICAgbGV2ZWw6ICdJTkZPJyxcbiAgICAgICAgbWVzc2FnZTogJ21lc3NhZ2Ugd2l0aCBhY3Rpb24nLFxuICAgICAgICBjcmVhdGlvbkRhdGU6IG1vbWVudCgpLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgPElVc2VyRXZlbnRBY3Rpb24+e1xuICAgICAgICAgICAgbmFtZTogJ2NsaWNrIGhlcmUnLFxuICAgICAgICAgICAgaWNvblJlZjoge1xuICAgICAgICAgICAgICBpY29uOiAnYXJyb3ctZm9yd2FyZC1vdXRsaW5lJyxcbiAgICAgICAgICAgICAgY29sb3I6ICd3YXJuaW5nJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4ZWN1dGVBY3Rpb246IGV2ZW50ID0+IHsgdGhpcy5zaG93TWVzc2FnZSgnYWN0aW9uIDEnKSB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICA8SVVzZXJFdmVudEFjdGlvbj57XG4gICAgICAgICAgICBuYW1lOiAnY2xpY2sgaGVyZSAyJyxcbiAgICAgICAgICAgIGljb25SZWY6IHtcbiAgICAgICAgICAgICAgbWF0SWNvbjogJ3NldHRpbmdzX2FwcGxpY2F0aW9ucycsXG4gICAgICAgICAgICAgIGNvbG9yOiAnc2Vjb25kYXJ5J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4ZWN1dGVBY3Rpb246IGV2ZW50ID0+IHsgdGhpcy5zaG93TWVzc2FnZSgnYWN0aW9uIDInKSB9XG4gICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgICkpO1xuICB9XG5cbiAgYWRkTWFueShjb3VudD86IG51bWJlcikge1xuICAgIGNvdW50ID0gY291bnQgfHwgMjA7XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgdGhpcy5hZGRSYW5kb20oaSk7XG4gICAgfVxuICB9XG5cbiAgc3RhcnRUaW1lcihwZXJpb2Q/OiBudW1iZXIpIHtcbiAgICB0aGlzLl90aW1lclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgIHBlcmlvZCA9IHBlcmlvZCB8fCAxMDAwO1xuICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgIHRoaXMuX3RpbWVyU3Vic2NyaXB0aW9uID0gdGltZXIocGVyaW9kLCBwZXJpb2QpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hZGRSYW5kb20oY291bnRlcik7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH0pO1xuICB9XG5cbiAgc3RvcFRpbWVyKCkge1xuICAgIHRoaXMuX3RpbWVyU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3RpbWVyU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgfVxuXG4gIGFkZFJhbmRvbSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgc3dpdGNoICh2YWx1ZSAlIDYpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgdGhpcy5hZGROb3RpZmljYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRoaXMuYWRkRXJyb3IoKVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGhpcy5hZGREZWJ1ZygpXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICB0aGlzLmFkZE5vdGlmaWNhdGlvbldpdGhMaW5rKClcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHRoaXMuYWRkTm90aWZpY2F0aW9uV2l0aEFjdGlvbigpXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1OlxuICAgICAgICB0aGlzLmFkZE5vdGlmaWNhdGlvbldpdGhEZWZhdWx0QWN0aW9uKClcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgYWRkTm90aWZpY2F0aW9uV2l0aERlZmF1bHRBY3Rpb24oKSB7XG4gICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLmFkZChVc2VyRXZlbnRUZXN0LmZyb21PYmplY3Qoe1xuICAgICAgICBpc3N1ZXI6ICdzeXN0ZW0nLFxuICAgICAgICByZWNpcGllbnQ6ICdtZScsXG4gICAgICAgIHR5cGU6ICdtZXNzYWdlJyxcbiAgICAgICAgbGV2ZWw6ICdJTkZPJyxcbiAgICAgICAgbWVzc2FnZTogJ21lc3NhZ2Ugd2l0aCBhY3Rpb24nLFxuICAgICAgICBjcmVhdGlvbkRhdGU6IG1vbWVudCgpLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgPElVc2VyRXZlbnRBY3Rpb24+e1xuICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIGV4ZWN1dGVBY3Rpb246IGV2ZW50ID0+IHsgdGhpcy5zaG93TWVzc2FnZSgnZGVmYXVsdCBhY3Rpb24nKSB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd01lc3NhZ2UodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIEFsZXJ0cy5zaG93RXJyb3IodGV4dCwgdGhpcy5hbGVydENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlU2VydmljZSk7XG4gIH1cbn1cblxuIl19