@sumaris-net/ngx-components 0.24.3 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +860 -835
  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/doc/changelog.md +4 -0
  6. package/esm2015/public_api.js +2 -1
  7. package/esm2015/src/app/admin/users/list/users.js +6 -4
  8. package/esm2015/src/app/core/graphql/graphql.service.js +18 -65
  9. package/esm2015/src/app/core/install/install-upgrade-card.component.js +14 -8
  10. package/esm2015/src/app/core/services/account.service.js +146 -149
  11. package/esm2015/src/app/core/services/config.service.js +21 -14
  12. package/esm2015/src/app/core/services/local-settings.service.js +72 -87
  13. package/esm2015/src/app/core/services/network.service.js +133 -168
  14. package/esm2015/src/app/core/services/platform.service.js +26 -14
  15. package/esm2015/src/app/core/services/storage/entities-storage.service.js +59 -63
  16. package/esm2015/src/app/shared/audio/audio.js +10 -39
  17. package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +2 -2
  18. package/esm2015/src/app/shared/services/startable-service.class.js +74 -0
  19. package/esm2015/src/environments/environment.class.js +1 -1
  20. package/esm2015/src/environments/environment.js +5 -1
  21. package/fesm2015/sumaris-net.ngx-components.js +578 -614
  22. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  23. package/package.json +1 -1
  24. package/public_api.d.ts +1 -0
  25. package/src/app/admin/users/list/users.d.ts +1 -0
  26. package/src/app/core/graphql/graphql.service.d.ts +5 -13
  27. package/src/app/core/services/account.service.d.ts +11 -10
  28. package/src/app/core/services/config.service.d.ts +6 -5
  29. package/src/app/core/services/local-settings.service.d.ts +4 -9
  30. package/src/app/core/services/network.service.d.ts +27 -38
  31. package/src/app/core/services/platform.service.d.ts +1 -1
  32. package/src/app/core/services/storage/entities-storage.service.d.ts +13 -13
  33. package/src/app/shared/audio/audio.d.ts +4 -8
  34. package/src/app/shared/services/startable-service.class.d.ts +25 -0
  35. package/src/environments/environment.class.d.ts +1 -0
  36. package/sumaris-net.ngx-components.metadata.json +1 -1
@@ -4,8 +4,8 @@ import { NativeAudio } from '@ionic-native/native-audio/ngx';
4
4
  import { Vibration } from '@ionic-native/vibration/ngx';
5
5
  import { Platform } from '@ionic/angular';
6
6
  import { AudioManagement } from '@ionic-native/audio-management/ngx';
7
- import { Subject } from 'rxjs';
8
7
  import { isNil, toBoolean } from '../functions';
8
+ import { StartableService } from '../services/startable-service.class';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@ionic/angular";
11
11
  import * as i2 from "@ionic-native/native-audio/ngx/index";
@@ -16,26 +16,18 @@ const SYSTEM_SOUNDS = [
16
16
  { id: 'beep-error', assetPath: 'assets/audio/beep-error.mp3', vibration: 1000 },
17
17
  { id: 'startup', assetPath: 'assets/audio/unfa-ping.mp3', vibration: [1, 500, 250, 750] },
18
18
  ];
19
- export class AudioProvider {
19
+ export class AudioProvider extends StartableService {
20
20
  constructor(platform, nativeAudio, vibration, audioManagement) {
21
+ super(platform);
21
22
  this.platform = platform;
22
23
  this.nativeAudio = nativeAudio;
23
24
  this.vibration = vibration;
24
25
  this.audioManagement = audioManagement;
25
- this._started = false;
26
26
  this._audioMode = AudioManagement.AudioMode.NORMAL;
27
27
  this._preloadedSounds = {};
28
28
  this._htmlAudioCache = {};
29
- this.onStart = new Subject();
30
29
  this.start();
31
30
  }
32
- ready() {
33
- return __awaiter(this, void 0, void 0, function* () {
34
- if (this._started)
35
- return Promise.resolve();
36
- yield this.start();
37
- });
38
- }
39
31
  playBeepConfirm() {
40
32
  return this.play('beep-confirm', {
41
33
  // Vibrate only if in vibration mode
@@ -77,7 +69,7 @@ export class AudioProvider {
77
69
  play(id, opts) {
78
70
  return __awaiter(this, void 0, void 0, function* () {
79
71
  // Make sure provider is ready
80
- if (!this._started)
72
+ if (!this.started)
81
73
  yield this.ready();
82
74
  const sound = this._preloadedSounds[id];
83
75
  if (!sound) {
@@ -138,7 +130,7 @@ export class AudioProvider {
138
130
  }
139
131
  vibrate(timeInMs) {
140
132
  return __awaiter(this, void 0, void 0, function* () {
141
- if (!this._started)
133
+ if (!this.started)
142
134
  yield this.ready();
143
135
  if (!this.vibration)
144
136
  return; // Skip if vibrate plugin
@@ -146,45 +138,24 @@ export class AudioProvider {
146
138
  });
147
139
  }
148
140
  /* -- protected methods -- */
149
- start() {
150
- if (this._startPromise)
151
- return this._startPromise;
152
- if (this._started)
153
- return Promise.resolve();
154
- let cordova;
155
- this._startPromise = this.platform.ready()
156
- .then(() => __awaiter(this, void 0, void 0, function* () {
157
- cordova = this.platform.is('cordova');
141
+ ngOnStart() {
142
+ return __awaiter(this, void 0, void 0, function* () {
143
+ let cordova = this.platform.is('cordova');
158
144
  this._audioType = cordova && this.nativeAudio ? 'native' : 'html5';
159
145
  console.info(`[audio] Starting audio provider {${this._audioType}}...`);
160
146
  // Listen audio mode changed
161
147
  if (cordova && this.audioManagement) {
162
148
  yield this.readAudioMode();
163
149
  }
164
- }))
165
150
  // Pre-loading system sounds
166
- .then(() => {
167
151
  console.debug('[audio] Preloading audio sounds...');
168
- return Promise.all(SYSTEM_SOUNDS.map(s => {
152
+ yield Promise.all(SYSTEM_SOUNDS.map(s => {
169
153
  // Disable vibration is cordova not enabled
170
154
  if (!cordova)
171
155
  s.vibration = undefined;
172
156
  return this.preload(s);
173
157
  }));
174
- })
175
- .then(() => {
176
- this._started = true;
177
- this._startPromise = null;
178
- console.info('[audio] Audio provider started');
179
- // Emit event
180
- this.onStart.next();
181
- })
182
- .catch(err => {
183
- console.error('[audio] Unable to start audio provider: ' + (err && err.message || err), err);
184
- this._started = false;
185
- this._startPromise = null;
186
158
  });
187
- return this._startPromise;
188
159
  }
189
160
  readAudioMode() {
190
161
  return __awaiter(this, void 0, void 0, function* () {
@@ -204,4 +175,4 @@ AudioProvider.ctorParameters = () => [
204
175
  { type: Vibration, decorators: [{ type: Optional }] },
205
176
  { type: AudioManagement, decorators: [{ type: Optional }] }
206
177
  ];
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9hdWRpby9hdWRpby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7Ozs7OztBQVM5QyxNQUFNLGFBQWEsR0FBWTtJQUM3QixFQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLCtCQUErQixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUM7SUFDaEYsRUFBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSw2QkFBNkIsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDO0lBQzdFLEVBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsNEJBQTRCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUM7Q0FDeEYsQ0FBQztBQUdGLE1BQU0sT0FBTyxhQUFhO0lBYXhCLFlBQ1UsUUFBa0IsRUFDTixXQUF3QixFQUN4QixTQUFvQixFQUNwQixlQUFnQztRQUg1QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ04sZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixv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LFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmF0aXZlQXVkaW99IGZyb20gJ0Bpb25pYy1uYXRpdmUvbmF0aXZlLWF1ZGlvL25neCc7XG5pbXBvcnQge1ZpYnJhdGlvbn0gZnJvbSAnQGlvbmljLW5hdGl2ZS92aWJyYXRpb24vbmd4JztcbmltcG9ydCB7UGxhdGZvcm19IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7QXVkaW9NYW5hZ2VtZW50fSBmcm9tICdAaW9uaWMtbmF0aXZlL2F1ZGlvLW1hbmFnZW1lbnQvbmd4JztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2lzTmlsLCB0b0Jvb2xlYW59IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIEF1ZGlvVHlwZSA9ICdodG1sNScgfCAnbmF0aXZlJztcbmV4cG9ydCBpbnRlcmZhY2UgU291bmQge1xuICBpZDogc3RyaW5nO1xuICBhc3NldFBhdGg6IHN0cmluZztcbiAgdmlicmF0aW9uPzogbnVtYmVyfG51bWJlcltdO1xufVxuXG5jb25zdCBTWVNURU1fU09VTkRTOiBTb3VuZFtdID0gW1xuICB7aWQ6ICdiZWVwLWNvbmZpcm0nLCBhc3NldFBhdGg6ICdhc3NldHMvYXVkaW8vYmVlcC1jb25maXJtLm1wMycsIHZpYnJhdGlvbjogMjUwfSxcbiAge2lkOiAnYmVlcC1lcnJvcicsIGFzc2V0UGF0aDogJ2Fzc2V0cy9hdWRpby9iZWVwLWVycm9yLm1wMycsIHZpYnJhdGlvbjogMTAwMH0sXG4gIHtpZDogJ3N0YXJ0dXAnLCBhc3NldFBhdGg6ICdhc3NldHMvYXVkaW8vdW5mYS1waW5nLm1wMycsIHZpYnJhdGlvbjogWzEsIDUwMCwgMjUwLCA3NTBdfSxcbl07XG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIEF1ZGlvUHJvdmlkZXIge1xuXG4gIHByaXZhdGUgX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3RhcnRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuXG4gIHByaXZhdGUgX2F1ZGlvVHlwZTogQXVkaW9UeXBlO1xuICBwcml2YXRlIF9hdWRpb01vZGU6IEF1ZGlvTWFuYWdlbWVudC5BdWRpb01vZGUgPSBBdWRpb01hbmFnZW1lbnQuQXVkaW9Nb2RlLk5PUk1BTDtcblxuICBwcml2YXRlIF9wcmVsb2FkZWRTb3VuZHM6IHtbaWQ6IHN0cmluZ106IFNvdW5kfSA9IHt9O1xuICBwcml2YXRlIF9odG1sQXVkaW9DYWNoZToge1tpZDogc3RyaW5nXTogSFRNTEF1ZGlvRWxlbWVudH0gPSB7fTtcblxuICBwdWJsaWMgb25TdGFydCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBuYXRpdmVBdWRpbzogTmF0aXZlQXVkaW8sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB2aWJyYXRpb246IFZpYnJhdGlvbixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGF1ZGlvTWFuYWdlbWVudDogQXVkaW9NYW5hZ2VtZW50XG4gICkge1xuXG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWR5KCkge1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgcGxheUJlZXBDb25maXJtKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucGxheSgnYmVlcC1jb25maXJtJywge1xuICAgICAgLy8gVmlicmF0ZSBvbmx5IGlmIGluIHZpYnJhdGlvbiBtb2RlXG4gICAgICB2aWJyYXRlOiB0aGlzLl9hdWRpb01vZGUgPT09IEF1ZGlvTWFuYWdlbWVudC5BdWRpb01vZGUuVklCUkFURVxuICAgIH0pO1xuICB9XG5cbiAgcGxheUJlZXBFcnJvcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBsYXkoJ2JlZXAtZXJyb3InLCB7XG4gICAgICAvLyBWaWJyYXRlIG9ubHkgaWYgaW4gdmlicmF0aW9uIG1vZGVcbiAgICAgIHZpYnJhdGU6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHBsYXlTdGFydHVwU291bmQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wbGF5KCdzdGFydHVwJyk7XG4gIH1cblxuICBhc3luYyBwcmVsb2FkKHNvdW5kOiBTb3VuZCkge1xuICAgIGlmIChpc05pbCh0aGlzLl9hdWRpb1R5cGUpKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG5cbiAgICBpZiAodGhpcy5fYXVkaW9UeXBlID09PSAnbmF0aXZlJykge1xuICAgICAgY29uc29sZS5pbmZvKGBbYXVkaW9dIFByZWxvYWRpbmcgYXVkaW8gZmlsZSAnJHtzb3VuZC5hc3NldFBhdGh9Jy4uLmApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5uYXRpdmVBdWRpby5wcmVsb2FkU2ltcGxlKHNvdW5kLmlkLCBzb3VuZC5hc3NldFBhdGgpO1xuICAgICAgICBjb25zb2xlLmluZm8oYFthdWRpb10gUHJlbG9hZGluZyBhdWRpbyBmaWxlICcke3NvdW5kLmFzc2V0UGF0aH0nIFtPS11gKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW2F1ZGlvXSBVbmFibGUgdG8gcHJlbG9hZCBhdWRpbyBmaWxlICcke3NvdW5kLmFzc2V0UGF0aH0nOiAke2VyciAmJiBlcnIubWVzc2FnZSB8fCBlcnJ9YCwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9odG1sQXVkaW9DYWNoZVtzb3VuZC5pZF0gPSAgbmV3IEF1ZGlvKHNvdW5kLmFzc2V0UGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRvIG1hcFxuICAgIHRoaXMuX3ByZWxvYWRlZFNvdW5kc1tzb3VuZC5pZF0gPSBzb3VuZDtcbiAgfVxuXG4gIGFzeW5jIHBsYXkoaWQ6IHN0cmluZywgb3B0cz86IHt2aWJyYXRlPzogYm9vbGVhbjsgdmlicmF0aW9uVGltZXM/OiBudW1iZXJ8bnVtYmVyW119KSB7XG5cbiAgICAvLyBNYWtlIHN1cmUgcHJvdmlkZXIgaXMgcmVhZHlcbiAgICBpZiAoIXRoaXMuX3N0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcblxuICAgIGNvbnN0IHNvdW5kID0gdGhpcy5fcHJlbG9hZGVkU291bmRzW2lkXTtcbiAgICBpZiAoIXNvdW5kKSB7XG4gICAgICB0aHJvdyBFcnJvcignVW5hYmxlIHRvIGZpbmQgYXVkaW8gd2l0aCBpZDogJyArIGlkICsgJy4gUGxlYXNlIGNhbGwgcHJlbG9hZCgpIGJlZm9yZSBwbGF5aW5nIGEgc291bmQuJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgc2lsZW50OiBza2lwXG4gICAgaWYgKHRoaXMuX2F1ZGlvTW9kZSA9PT0gQXVkaW9NYW5hZ2VtZW50LkF1ZGlvTW9kZS5TSUxFTlQpIHJldHVybjtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuXG4gICAgLy8gTm9ybWFsIG1vZGUgPSBjYW4gcGxheSB0aGUgc291bmRcbiAgICBpZiAodGhpcy5fYXVkaW9Nb2RlID09PSBBdWRpb01hbmFnZW1lbnQuQXVkaW9Nb2RlLk5PUk1BTCkge1xuICAgICAgLy8gVXNlIG5hdGl2ZSBhdWRpb1xuICAgICAgaWYgKHRoaXMuX2F1ZGlvVHlwZSA9PT0gJ25hdGl2ZScpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLm5hdGl2ZUF1ZGlvLnBsYXkoc291bmQuaWQpKTtcbiAgICAgIH1cbiAgICAgIC8vIE9yIEhUTUwgNSBhdWRpb1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGF1ZGlvID0gdGhpcy5faHRtbEF1ZGlvQ2FjaGVbaWRdIHx8IG5ldyBBdWRpbyhzb3VuZC5hc3NldFBhdGgpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGF1ZGlvLnBsYXkoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmlicmF0ZSBtb2RlOiBieSBkZWZhdWx0IG1ha2UgdmlicmF0aW9uIGlzIGVuYWJsZVxuICAgIGVsc2UgaWYgKGlzTmlsKHNvdW5kLnZpYnJhdGlvbikgJiYgaXNOaWwob3B0cyAmJiBvcHRzLnZpYnJhdGUpKSB7XG4gICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgIG9wdHMudmlicmF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gRG8gdmlicmF0aW9uIChpZiBzb3VuZCBhcyBkZWZhdWx0IHZpYnJhdGlvbiwgb3IgaWYgdXNlciBhc2sgZm9yIGl0KVxuICAgIGlmICh0b0Jvb2xlYW4ob3B0cyAmJiBvcHRzLnZpYnJhdGUsICEhc291bmQudmlicmF0aW9uKSkge1xuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnZpYnJhdGUob3B0cyAmJiBvcHRzLnZpYnJhdGlvblRpbWVzIHx8IHNvdW5kLnZpYnJhdGlvbikpO1xuICAgIH1cblxuICAgIHJldHVybiAocHJvbWlzZXMubGVuZ3RoID09PSAxID8gcHJvbWlzZXNbMF0gOiBQcm9taXNlLmFsbChwcm9taXNlcykpXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW2F1ZGlvXSBFcnJvciB3aGlsZSBwbGF5aW5nIGF1ZGlvIHNvdW5kICcke2lkfSc6ICR7ZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycn1gLCBlcnIpO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyB1bmxvYWQoaWQ6IHN0cmluZykge1xuICAgIGlmIChpc05pbCh0aGlzLl9hdWRpb1R5cGUpKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBtYXBcbiAgICB0aGlzLl9wcmVsb2FkZWRTb3VuZHNbaWRdID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gTmF0aXZlIHVubG9hZFxuICAgIGlmICh0aGlzLl9hdWRpb1R5cGUgPT09ICduYXRpdmUnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm5hdGl2ZUF1ZGlvLnVubG9hZChpZCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFthdWRpb10gVW5hYmxlIHRvIHVubG9hZCBhdWRpbyAnJHtpZH0nOiAke2VyciAmJiBlcnIubWVzc2FnZSB8fCBlcnJ9YCwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSFRNTDUgYXVkaW8gdW5sb2FkXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9odG1sQXVkaW9DYWNoZVtpZF0ucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9odG1sQXVkaW9DYWNoZVtpZF0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmlicmF0ZSh0aW1lSW5Ncz86IG51bWJlcnxudW1iZXJbXSkge1xuICAgIGlmICghdGhpcy5fc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuXG4gICAgaWYgKCF0aGlzLnZpYnJhdGlvbikgcmV0dXJuOyAvLyBTa2lwIGlmIHZpYnJhdGUgcGx1Z2luXG5cbiAgICB0aGlzLnZpYnJhdGlvbi52aWJyYXRlKHRpbWVJbk1zIHx8IDI1MCk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAgLS0gKi9cblxuICBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fc3RhcnRQcm9taXNlKSByZXR1cm4gdGhpcy5fc3RhcnRQcm9taXNlO1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICBsZXQgY29yZG92YTogYm9vbGVhbjtcbiAgICB0aGlzLl9zdGFydFByb21pc2UgPSB0aGlzLnBsYXRmb3JtLnJlYWR5KClcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29yZG92YSA9IHRoaXMucGxhdGZvcm0uaXMoJ2NvcmRvdmEnKTtcbiAgICAgICAgdGhpcy5fYXVkaW9UeXBlID0gY29yZG92YSAmJiB0aGlzLm5hdGl2ZUF1ZGlvID8gJ25hdGl2ZScgOiAnaHRtbDUnO1xuICAgICAgICBjb25zb2xlLmluZm8oYFthdWRpb10gU3RhcnRpbmcgYXVkaW8gcHJvdmlkZXIgeyR7dGhpcy5fYXVkaW9UeXBlfX0uLi5gKTtcblxuICAgICAgICAvLyBMaXN0ZW4gYXVkaW8gbW9kZSBjaGFuZ2VkXG4gICAgICAgIGlmIChjb3Jkb3ZhICYmIHRoaXMuYXVkaW9NYW5hZ2VtZW50KSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWFkQXVkaW9Nb2RlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIFByZS1sb2FkaW5nIHN5c3RlbSBzb3VuZHNcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW2F1ZGlvXSBQcmVsb2FkaW5nIGF1ZGlvIHNvdW5kcy4uLicpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoU1lTVEVNX1NPVU5EUy5tYXAocyA9PiB7XG4gICAgICAgICAgLy8gRGlzYWJsZSB2aWJyYXRpb24gaXMgY29yZG92YSBub3QgZW5hYmxlZFxuICAgICAgICAgIGlmICghY29yZG92YSkgcy52aWJyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJlbG9hZChzKTtcbiAgICAgICAgfSkpO1xuICAgICAgfSlcblxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fc3RhcnRQcm9taXNlID0gbnVsbDtcblxuICAgICAgICBjb25zb2xlLmluZm8oJ1thdWRpb10gQXVkaW8gcHJvdmlkZXIgc3RhcnRlZCcpO1xuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgdGhpcy5vblN0YXJ0Lm5leHQoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW2F1ZGlvXSBVbmFibGUgdG8gc3RhcnQgYXVkaW8gcHJvdmlkZXI6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciksIGVycik7XG4gICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RhcnRQcm9taXNlID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0UHJvbWlzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZWFkQXVkaW9Nb2RlKCkge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5hdWRpb01hbmFnZW1lbnQuZ2V0QXVkaW9Nb2RlKCk7XG4gICAgdGhpcy5fYXVkaW9Nb2RlID0gdmFsdWUgJiYgdmFsdWUuYXVkaW9Nb2RlIHx8IEF1ZGlvTWFuYWdlbWVudC5BdWRpb01vZGUuTk9STUFMO1xuICAgIGNvbnNvbGUuZGVidWcoYFthdWRpb10gRGV0ZWN0ZWQgZGV2aWNlIGF1ZGlvIG1vZGUgeyR7dmFsdWUubGFiZWx9fSAoJHt0aGlzLl9hdWRpb01vZGV9KWApO1xuICB9XG5cbn1cbiJdfQ==
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9hdWRpby9hdWRpby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE9BQU8sRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7QUFTckUsTUFBTSxhQUFhLEdBQVk7SUFDN0IsRUFBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSwrQkFBK0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDO0lBQ2hGLEVBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsNkJBQTZCLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQztJQUM3RSxFQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLDRCQUE0QixFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFDO0NBQ3hGLENBQUM7QUFHRixNQUFNLE9BQU8sYUFBYyxTQUFRLGdCQUFzQjtJQVF2RCxZQUNZLFFBQWtCLEVBQ1IsV0FBd0IsRUFDeEIsU0FBb0IsRUFDcEIsZUFBZ0M7UUFFcEQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBTE4sYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNSLGdCQUFXLEdB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QWdDWixRQUFRO1lBOUJMLGVBQWUsdUJBK0JsQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05hdGl2ZUF1ZGlvfSBmcm9tICdAaW9uaWMtbmF0aXZlL25hdGl2ZS1hdWRpby9uZ3gnO1xuaW1wb3J0IHtWaWJyYXRpb259IGZyb20gJ0Bpb25pYy1uYXRpdmUvdmlicmF0aW9uL25neCc7XG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge0F1ZGlvTWFuYWdlbWVudH0gZnJvbSAnQGlvbmljLW5hdGl2ZS9hdWRpby1tYW5hZ2VtZW50L25neCc7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtpc05pbCwgdG9Cb29sZWFufSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtTdGFydGFibGVTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5cbmV4cG9ydCB0eXBlIEF1ZGlvVHlwZSA9ICdodG1sNScgfCAnbmF0aXZlJztcbmV4cG9ydCBpbnRlcmZhY2UgU291bmQge1xuICBpZDogc3RyaW5nO1xuICBhc3NldFBhdGg6IHN0cmluZztcbiAgdmlicmF0aW9uPzogbnVtYmVyfG51bWJlcltdO1xufVxuXG5jb25zdCBTWVNURU1fU09VTkRTOiBTb3VuZFtdID0gW1xuICB7aWQ6ICdiZWVwLWNvbmZpcm0nLCBhc3NldFBhdGg6ICdhc3NldHMvYXVkaW8vYmVlcC1jb25maXJtLm1wMycsIHZpYnJhdGlvbjogMjUwfSxcbiAge2lkOiAnYmVlcC1lcnJvcicsIGFzc2V0UGF0aDogJ2Fzc2V0cy9hdWRpby9iZWVwLWVycm9yLm1wMycsIHZpYnJhdGlvbjogMTAwMH0sXG4gIHtpZDogJ3N0YXJ0dXAnLCBhc3NldFBhdGg6ICdhc3NldHMvYXVkaW8vdW5mYS1waW5nLm1wMycsIHZpYnJhdGlvbjogWzEsIDUwMCwgMjUwLCA3NTBdfSxcbl07XG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIEF1ZGlvUHJvdmlkZXIgZXh0ZW5kcyBTdGFydGFibGVTZXJ2aWNlPHZvaWQ+IHtcblxuICBwcml2YXRlIF9hdWRpb1R5cGU6IEF1ZGlvVHlwZTtcbiAgcHJpdmF0ZSBfYXVkaW9Nb2RlOiBBdWRpb01hbmFnZW1lbnQuQXVkaW9Nb2RlID0gQXVkaW9NYW5hZ2VtZW50LkF1ZGlvTW9kZS5OT1JNQUw7XG5cbiAgcHJpdmF0ZSBfcHJlbG9hZGVkU291bmRzOiB7W2lkOiBzdHJpbmddOiBTb3VuZH0gPSB7fTtcbiAgcHJpdmF0ZSBfaHRtbEF1ZGlvQ2FjaGU6IHtbaWQ6IHN0cmluZ106IEhUTUxBdWRpb0VsZW1lbnR9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG5hdGl2ZUF1ZGlvOiBOYXRpdmVBdWRpbyxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHZpYnJhdGlvbjogVmlicmF0aW9uLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgYXVkaW9NYW5hZ2VtZW50OiBBdWRpb01hbmFnZW1lbnRcbiAgKSB7XG4gICAgc3VwZXIocGxhdGZvcm0pO1xuXG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgcGxheUJlZXBDb25maXJtKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucGxheSgnYmVlcC1jb25maXJtJywge1xuICAgICAgLy8gVmlicmF0ZSBvbmx5IGlmIGluIHZpYnJhdGlvbiBtb2RlXG4gICAgICB2aWJyYXRlOiB0aGlzLl9hdWRpb01vZGUgPT09IEF1ZGlvTWFuYWdlbWVudC5BdWRpb01vZGUuVklCUkFURVxuICAgIH0pO1xuICB9XG5cbiAgcGxheUJlZXBFcnJvcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBsYXkoJ2JlZXAtZXJyb3InLCB7XG4gICAgICAvLyBWaWJyYXRlIG9ubHkgaWYgaW4gdmlicmF0aW9uIG1vZGVcbiAgICAgIHZpYnJhdGU6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHBsYXlTdGFydHVwU291bmQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wbGF5KCdzdGFydHVwJyk7XG4gIH1cblxuICBhc3luYyBwcmVsb2FkKHNvdW5kOiBTb3VuZCkge1xuICAgIGlmIChpc05pbCh0aGlzLl9hdWRpb1R5cGUpKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG5cbiAgICBpZiAodGhpcy5fYXVkaW9UeXBlID09PSAnbmF0aXZlJykge1xuICAgICAgY29uc29sZS5pbmZvKGBbYXVkaW9dIFByZWxvYWRpbmcgYXVkaW8gZmlsZSAnJHtzb3VuZC5hc3NldFBhdGh9Jy4uLmApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5uYXRpdmVBdWRpby5wcmVsb2FkU2ltcGxlKHNvdW5kLmlkLCBzb3VuZC5hc3NldFBhdGgpO1xuICAgICAgICBjb25zb2xlLmluZm8oYFthdWRpb10gUHJlbG9hZGluZyBhdWRpbyBmaWxlICcke3NvdW5kLmFzc2V0UGF0aH0nIFtPS11gKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW2F1ZGlvXSBVbmFibGUgdG8gcHJlbG9hZCBhdWRpbyBmaWxlICcke3NvdW5kLmFzc2V0UGF0aH0nOiAke2VyciAmJiBlcnIubWVzc2FnZSB8fCBlcnJ9YCwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9odG1sQXVkaW9DYWNoZVtzb3VuZC5pZF0gPSAgbmV3IEF1ZGlvKHNvdW5kLmFzc2V0UGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRvIG1hcFxuICAgIHRoaXMuX3ByZWxvYWRlZFNvdW5kc1tzb3VuZC5pZF0gPSBzb3VuZDtcbiAgfVxuXG4gIGFzeW5jIHBsYXkoaWQ6IHN0cmluZywgb3B0cz86IHt2aWJyYXRlPzogYm9vbGVhbjsgdmlicmF0aW9uVGltZXM/OiBudW1iZXJ8bnVtYmVyW119KSB7XG5cbiAgICAvLyBNYWtlIHN1cmUgcHJvdmlkZXIgaXMgcmVhZHlcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuXG4gICAgY29uc3Qgc291bmQgPSB0aGlzLl9wcmVsb2FkZWRTb3VuZHNbaWRdO1xuICAgIGlmICghc291bmQpIHtcbiAgICAgIHRocm93IEVycm9yKCdVbmFibGUgdG8gZmluZCBhdWRpbyB3aXRoIGlkOiAnICsgaWQgKyAnLiBQbGVhc2UgY2FsbCBwcmVsb2FkKCkgYmVmb3JlIHBsYXlpbmcgYSBzb3VuZC4nKTtcbiAgICB9XG5cbiAgICAvLyBJZiBzaWxlbnQ6IHNraXBcbiAgICBpZiAodGhpcy5fYXVkaW9Nb2RlID09PSBBdWRpb01hbmFnZW1lbnQuQXVkaW9Nb2RlLlNJTEVOVCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG5cbiAgICAvLyBOb3JtYWwgbW9kZSA9IGNhbiBwbGF5IHRoZSBzb3VuZFxuICAgIGlmICh0aGlzLl9hdWRpb01vZGUgPT09IEF1ZGlvTWFuYWdlbWVudC5BdWRpb01vZGUuTk9STUFMKSB7XG4gICAgICAvLyBVc2UgbmF0aXZlIGF1ZGlvXG4gICAgICBpZiAodGhpcy5fYXVkaW9UeXBlID09PSAnbmF0aXZlJykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMubmF0aXZlQXVkaW8ucGxheShzb3VuZC5pZCkpO1xuICAgICAgfVxuICAgICAgLy8gT3IgSFRNTCA1IGF1ZGlvXG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgYXVkaW8gPSB0aGlzLl9odG1sQXVkaW9DYWNoZVtpZF0gfHwgbmV3IEF1ZGlvKHNvdW5kLmFzc2V0UGF0aCk7XG4gICAgICAgIHByb21pc2VzLnB1c2goYXVkaW8ucGxheSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWaWJyYXRlIG1vZGU6IGJ5IGRlZmF1bHQgbWFrZSB2aWJyYXRpb24gaXMgZW5hYmxlXG4gICAgZWxzZSBpZiAoaXNOaWwoc291bmQudmlicmF0aW9uKSAmJiBpc05pbChvcHRzICYmIG9wdHMudmlicmF0ZSkpIHtcbiAgICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgICAgb3B0cy52aWJyYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBEbyB2aWJyYXRpb24gKGlmIHNvdW5kIGFzIGRlZmF1bHQgdmlicmF0aW9uLCBvciBpZiB1c2VyIGFzayBmb3IgaXQpXG4gICAgaWYgKHRvQm9vbGVhbihvcHRzICYmIG9wdHMudmlicmF0ZSwgISFzb3VuZC52aWJyYXRpb24pKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMudmlicmF0ZShvcHRzICYmIG9wdHMudmlicmF0aW9uVGltZXMgfHwgc291bmQudmlicmF0aW9uKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChwcm9taXNlcy5sZW5ndGggPT09IDEgPyBwcm9taXNlc1swXSA6IFByb21pc2UuYWxsKHByb21pc2VzKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbYXVkaW9dIEVycm9yIHdoaWxlIHBsYXlpbmcgYXVkaW8gc291bmQgJyR7aWR9JzogJHtlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyfWAsIGVycik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVubG9hZChpZDogc3RyaW5nKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuX2F1ZGlvVHlwZSkpIGF3YWl0IHRoaXMucmVhZHkoKTtcblxuICAgIC8vIFJlbW92ZSBmcm9tIG1hcFxuICAgIHRoaXMuX3ByZWxvYWRlZFNvdW5kc1tpZF0gPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBOYXRpdmUgdW5sb2FkXG4gICAgaWYgKHRoaXMuX2F1ZGlvVHlwZSA9PT0gJ25hdGl2ZScpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmF0aXZlQXVkaW8udW5sb2FkKGlkKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW2F1ZGlvXSBVbmFibGUgdG8gdW5sb2FkIGF1ZGlvICcke2lkfSc6ICR7ZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycn1gLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIVE1MNSBhdWRpbyB1bmxvYWRcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2h0bWxBdWRpb0NhY2hlW2lkXS5yZW1vdmUoKTtcbiAgICAgIHRoaXMuX2h0bWxBdWRpb0NhY2hlW2lkXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2aWJyYXRlKHRpbWVJbk1zPzogbnVtYmVyfG51bWJlcltdKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcblxuICAgIGlmICghdGhpcy52aWJyYXRpb24pIHJldHVybjsgLy8gU2tpcCBpZiB2aWJyYXRlIHBsdWdpblxuXG4gICAgdGhpcy52aWJyYXRpb24udmlicmF0ZSh0aW1lSW5NcyB8fCAyNTApO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgIC0tICovXG5cbiAgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgbGV0IGNvcmRvdmEgPSB0aGlzLnBsYXRmb3JtLmlzKCdjb3Jkb3ZhJyk7XG4gICAgdGhpcy5fYXVkaW9UeXBlID0gY29yZG92YSAmJiB0aGlzLm5hdGl2ZUF1ZGlvID8gJ25hdGl2ZScgOiAnaHRtbDUnO1xuICAgIGNvbnNvbGUuaW5mbyhgW2F1ZGlvXSBTdGFydGluZyBhdWRpbyBwcm92aWRlciB7JHt0aGlzLl9hdWRpb1R5cGV9fS4uLmApO1xuXG4gICAgLy8gTGlzdGVuIGF1ZGlvIG1vZGUgY2hhbmdlZFxuICAgIGlmIChjb3Jkb3ZhICYmIHRoaXMuYXVkaW9NYW5hZ2VtZW50KSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYWRBdWRpb01vZGUoKTtcbiAgICB9XG5cbiAgICAvLyBQcmUtbG9hZGluZyBzeXN0ZW0gc291bmRzXG4gICAgY29uc29sZS5kZWJ1ZygnW2F1ZGlvXSBQcmVsb2FkaW5nIGF1ZGlvIHNvdW5kcy4uLicpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFNZU1RFTV9TT1VORFMubWFwKHMgPT4ge1xuICAgICAgLy8gRGlzYWJsZSB2aWJyYXRpb24gaXMgY29yZG92YSBub3QgZW5hYmxlZFxuICAgICAgaWYgKCFjb3Jkb3ZhKSBzLnZpYnJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzLnByZWxvYWQocyk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRBdWRpb01vZGUoKSB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmF1ZGlvTWFuYWdlbWVudC5nZXRBdWRpb01vZGUoKTtcbiAgICB0aGlzLl9hdWRpb01vZGUgPSB2YWx1ZSAmJiB2YWx1ZS5hdWRpb01vZGUgfHwgQXVkaW9NYW5hZ2VtZW50LkF1ZGlvTW9kZS5OT1JNQUw7XG4gICAgY29uc29sZS5kZWJ1ZyhgW2F1ZGlvXSBEZXRlY3RlZCBkZXZpY2UgYXVkaW8gbW9kZSB7JHt2YWx1ZS5sYWJlbH19ICgke3RoaXMuX2F1ZGlvTW9kZX0pYCk7XG4gIH1cblxufVxuIl19
@@ -158,10 +158,10 @@ export class AutocompleteTestPage {
158
158
  AutocompleteTestPage.decorators = [
159
159
  { type: Component, args: [{
160
160
  selector: 'app-autocomplete-test',
161
- template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Autocomplete field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n\n <!-- Tab nav - mobile/desktop mode -->\n <nav mat-tab-nav-bar>\n <a mat-tab-link\n [active]=\"mode==='mobile'\"\n (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='desktop'\"\n (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='memory'\"\n (click)=\"toggleMode('memory')\">\n <mat-label>Memory leak debug</mat-label>\n </a>\n <a mat-tab-link\n [active]=\"mode==='temp'\"\n (click)=\"toggleMode('temp')\">\n <mat-label>Temporary</mat-label>\n </a>\n </nav>\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <!--<ion-grid *ngIf=\"mode === 'temp'\">\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n </ion-grid>-->\n\n\n <ion-grid *ngIf=\"mode === 'memory'\">\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"always\">\n <input matInput type=\"text\" hidden placeholder=\"Items type\">\n <mat-select (selectionChange)=\"memoryAutocompleteFieldName=$event.value\" [value]=\"memoryAutocompleteFieldName\">\n <mat-option value=\"entity-$items\">Observable</mat-option>\n <mat-option value=\"entity-suggestFn\">Suggest function</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"1\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"always\" >\n <input matInput type=\"text\" hidden placeholder=\"Mobile ?\">\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [checked]=\"memoryMobile\">\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\" color=\"tertiary\">Start</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\" color=\"tertiary\">Stop</ion-button>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n *ngIf=\"!memoryHide && memoryAutocompleteFieldName\"\n [config]=\"autocompleteFields.get(memoryAutocompleteFieldName)\"\n [mobile]=\"memoryMobile\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-memory-leak]'\">\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n <!-- Mobile mode -->\n <ion-grid *ngIf=\"mode === 'mobile'\">\n\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Suggest() function\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, suggestFn: (searchText, filter) =&gt; any[]</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-suggestFn')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-1]'\"\n [required]=\"true\"\n placeholder=\"Suggest field\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Items is an Observable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-observable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Change filter\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre></pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <ion-button (click)=\"updateFilter('entity-items-filter')\">Filter on: {{autocompleteFields.get('entity-items-filter').filter?.searchAttribute }}</ion-button>\n </ion-col>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-filter]'\"\n ></mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class=\"min-width-large\"</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"true\"\n class=\"min-width-large\"\n panelWidth=\"400px\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Desktop mode -->\n <ion-grid *ngIf=\"mode === 'desktop'\">\n <ion-row>\n <ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col>\n </ion-row>\n <ion-row>\n\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n items from suggest function\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;\nsuggestLengthThreshold: '3'</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n suggestLengthThreshold=\"3\"\n [logPrefix]=\"'[combo-desktop-suggest]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an array\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: [], value: {{stringify(form.controls.entity.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items')\"\n [logPrefix]=\"'[combo-desktop-array-1]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-missing]'\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size panel\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class: 'mat-autocomplete-panel-full-size'</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [class]=\"'mat-autocomplete-panel-full-size'\"\n [compareWith]=\"compareWithFn\"\n [matAutocompletePosition]=\"'above'\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-disable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\" >\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class=\"mat-autocomplete-panel-full-size\"</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n class=\"mat-autocomplete-panel-full-size\"\n panelWidth=\"100vw\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\" >\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>panelWidth: string</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n panelWidth=\"400px\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Readonly toggle\n </ion-text>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n </mat-checkbox>\n\n <mat-autocomplete-field #readonlyField formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\">\n </mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </form>\n\n</ion-content>\n"
161
+ template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Autocomplete field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <!-- Tab nav - mobile/desktop mode -->\n <nav mat-tab-nav-bar>\n <a mat-tab-link\n [active]=\"mode==='mobile'\"\n (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='desktop'\"\n (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='memory'\"\n (click)=\"toggleMode('memory')\">\n <mat-label>Memory leak debug</mat-label>\n </a>\n <a mat-tab-link\n [active]=\"mode==='temp'\"\n (click)=\"toggleMode('temp')\">\n <mat-label>Temporary</mat-label>\n </a>\n </nav>\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <!--<ion-grid *ngIf=\"mode === 'temp'\">\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n </ion-grid>-->\n\n\n <ion-grid *ngIf=\"mode === 'memory'\">\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"always\">\n <input matInput type=\"text\" hidden placeholder=\"Items type\">\n <mat-select (selectionChange)=\"memoryAutocompleteFieldName=$event.value\" [value]=\"memoryAutocompleteFieldName\">\n <mat-option value=\"entity-$items\">Observable</mat-option>\n <mat-option value=\"entity-suggestFn\">Suggest function</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"1\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"always\" >\n <input matInput type=\"text\" hidden placeholder=\"Mobile ?\">\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [checked]=\"memoryMobile\">\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\" color=\"tertiary\">Start</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\" color=\"tertiary\">Stop</ion-button>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n *ngIf=\"!memoryHide && memoryAutocompleteFieldName\"\n [config]=\"autocompleteFields.get(memoryAutocompleteFieldName)\"\n [mobile]=\"memoryMobile\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-memory-leak]'\">\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n <!-- Mobile mode -->\n <ion-grid *ngIf=\"mode === 'mobile'\">\n\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Suggest() function\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, suggestFn: (searchText, filter) =&gt; any[]</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-suggestFn')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-1]'\"\n [required]=\"true\"\n placeholder=\"Suggest field\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Items is an Observable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-observable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Change filter\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre></pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <ion-button (click)=\"updateFilter('entity-items-filter')\">Filter on: {{autocompleteFields.get('entity-items-filter').filter?.searchAttribute }}</ion-button>\n </ion-col>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-filter]'\"\n ></mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class=\"min-width-large\"</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"true\"\n class=\"min-width-large\"\n panelWidth=\"400px\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Desktop mode -->\n <ion-grid *ngIf=\"mode === 'desktop'\">\n <ion-row>\n <ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col>\n </ion-row>\n <ion-row>\n\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n items from suggest function\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;\nsuggestLengthThreshold: '3'</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n suggestLengthThreshold=\"3\"\n [logPrefix]=\"'[combo-desktop-suggest]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an array\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: [], value: {{stringify(form.controls.entity.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items')\"\n [logPrefix]=\"'[combo-desktop-array-1]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-missing]'\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size panel\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class: 'mat-autocomplete-panel-full-size'</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [class]=\"'mat-autocomplete-panel-full-size'\"\n [compareWith]=\"compareWithFn\"\n [matAutocompletePosition]=\"'above'\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-disable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\" >\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class=\"mat-autocomplete-panel-full-size\"</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n class=\"mat-autocomplete-panel-full-size\"\n panelWidth=\"100vw\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\" >\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>panelWidth: string</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n panelWidth=\"400px\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n\n\n </ion-grid>\n\n </form>\n\n</ion-content>\n"
162
162
  },] }
163
163
  ];
164
164
  AutocompleteTestPage.ctorParameters = () => [
165
165
  { type: FormBuilder }
166
166
  ];
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9hdXRvY29tcGxldGUvdGVzdGluZy9hdXRvY29tcGxldGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUMsV0FBVyxFQUFZLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUlyQyxNQUFNLGVBQWU7Q0FJcEI7QUFFRCxNQUFNLGFBQWEsR0FBRztJQUNwQixFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxRQUFRLEVBQUUsd0NBQXdDLEVBQUM7SUFDakksRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxFQUFFLHdDQUF3QyxFQUFDO0lBQ2pJLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLFFBQVEsRUFBRSx3Q0FBd0MsRUFBQztDQUNsSSxDQUFDO0FBRUYsU0FBUyxRQUFRLENBQUMsTUFBMEIs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RUFBRSxDQUFDO1FBQ2pHLE1BQU0sQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsZUFBZSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM3RixDQUFDO0lBRUQsNkJBQTZCO0lBRTdCLFNBQVMsQ0FBQyxLQUFVO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDOzs7WUFwS0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLG82cUJBQXVDO2FBQ3hDOzs7WUF2Q08sV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQnVpbGRlciwgRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1NoYXJlZFZhbGlkYXRvcnN9IGZyb20gJy4uLy4uLy4uL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyfSBmcm9tICcuLi9tYXRlcmlhbC5hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtpc05pbCwgaXNOb3ROaWwsIHNsZWVwLCBzdWdnZXN0RnJvbUFycmF5fSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtMb2FkUmVzdWx0fSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgVGltZXIgPSBOb2RlSlMuVGltZXI7XG5cbmNsYXNzIEVudGl0eVRlc3RDbGFzcyB7XG4gIGlkOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgRkFLRV9FTlRJVElFUyA9IFtcbiAge2lkOiAxLCBsYWJlbDogJ0FBQScsIG5hbWU6ICdJdGVtIEEnLCBkZXNjcmlwdGlvbjogJ1ZlcnkgbG9uZyBkZXNjcmlwdGlvbiBBJywgY29tbWVudHM6ICdWZXJ5IHZlcnkgbG9uZyBjb21tZW50cy4uLiBhZ2FpbiBmb3IgQSd9LFxuICB7aWQ6IDIsIGxhYmVsOiAnQkJCJywgbmFtZTogJ0l0ZW0gQicsIGRlc2NyaXB0aW9uOiAnVmVyeSBsb25nIGRlc2NyaXB0aW9uIEInLCBjb21tZW50czogJ1ZlcnkgdmVyeSBsb25nIGNvbW1lbnRzLi4uIGFnYWluIGZvciBCJ30sXG4gIHtpZDogMywgbGFiZWw6ICdDQ0MnLCBuYW1lOiAnSXRlbSBDJywgZGVzY3JpcHRpb246ICdWZXJ5IGxvbmcgZGVzY3JpcHRpb24gQycsIGNvbW1lbnRzOiAnVmVyeSB2ZXJ5IGxvbmcgY29tbWVudHMuLi4gYWdhaW4gZm9yIEMnfVxuXTtcblxuZnVuY3Rpb24gZGVlcENvcHkodmFsdWVzPzogRW50aXR5VGVzdENsYXNzW10sIHNpemU/OiBudW1iZXIpOiBFbnRpdHlUZXN0Q2xhc3NbXSB7XG4gIGlmIChpc05pbChzaXplKSkge1xuICAgIHJldHVybiAodmFsdWVzIHx8IEZBS0VfRU5USVRJRVMpLm1hcChlbnRpdHkgPT4gT2JqZWN0LmFzc2lnbih7fSwgZW50aXR5KSk7XG4gIH1cblxuICBsZXQgcmVzdWx0ID0gW107XG4gIGxldCBpID0gMTtcbiAgd2hpbGUgKHJlc3VsdC5sZW5ndGggPCBzaXplKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgodmFsdWVzIHx8IEZBS0VfRU5USVRJRVMpLm1hcChlbnRpdHkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGVudGl0eS5uYW1lICsgJyAjJyArIGk7XG4gICAgICByZXR1cm4gey4uLmVudGl0eSwgaWQ6IGkrKywgbmFtZX07XG4gICAgfSkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuc2xpY2UoMCwgc2l6ZSk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hdXRvY29tcGxldGUtdGVzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUudGVzdC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBdXRvY29tcGxldGVUZXN0UGFnZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgX2l0ZW1zID0gZGVlcENvcHkoRkFLRV9FTlRJVElFUywgMTAwKTtcbiAgJGl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlUZXN0Q2xhc3NbXT4odW5kZWZpbmVkKTtcblxuICBmb3JtOiBGb3JtR3JvdXA7XG4gIGF1dG9jb21wbGV0ZUZpZWxkcyA9IG5ldyBNYXRBdXRvY29tcGxldGVDb25maWdIb2xkZXIoKTtcbiAgbWVtb3J5SGlkZSA9IGZhbHNlO1xuICBtZW1vcnlNb2JpbGUgPSB0cnVlO1xuICBtZW1vcnlBdXRvY29tcGxldGVGaWVsZE5hbWUgPSAnZW50aXR5LSRpdGVtcyc7XG4gIG1lbW9yeVRpbWVyOiBUaW1lcjtcblxuICBtb2RlOiAnbW9iaWxlJ3wnZGVza3RvcCd8J21lbW9yeSd8J3RlbXAnID0gJ21vYmlsZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlclxuICApIHtcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBlbnRpdHk6IFtudWxsLCBTaGFyZWRWYWxpZGF0b3JzLmVudGl0eV0sXG4gICAgICBtaXNzaW5nRW50aXR5OiBbbnVsbCwgU2hhcmVkVmFsaWRhdG9ycy5lbnRpdHldLFxuICAgICAgZGlzYWJsZUVudGl0eTogW251bGwsIFNoYXJlZFZhbGlkYXRvcnMuZW50aXR5XSxcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybS5nZXQoJ2Rpc2FibGVFbnRpdHknKS5kaXNhYmxlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIC8vIEZyb20gc3VnZ2VzdFxuICAgIHRoaXMuYXV0b2NvbXBsZXRlRmllbGRzLmFkZCgnZW50aXR5LXN1Z2dlc3RGbicsIHtcbiAgICAgIHN1Z2dlc3RGbjogKHZhbHVlLCBmaWx0ZXIpID0+IHRoaXMuc3VnZ2VzdCh2YWx1ZSwgZmlsdGVyKSxcbiAgICAgIGF0dHJpYnV0ZXM6IFsnbGFiZWwnLCAnbmFtZSddLFxuICAgICAgZGlzcGxheVdpdGg6IHRoaXMuZW50aXR5VG9TdHJpbmcsXG4gICAgICBzaG93QWxsT25Gb2N1czogZmFsc2VcbiAgICB9KTtcblxuICAgIC8vIEZyb20gaXRlbXMgYXJyYXlcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUZpZWxkcy5hZGQoJ2VudGl0eS1pdGVtcycsIHtcbiAgICAgIGl0ZW1zOiB0aGlzLl9pdGVtcy5zbGljZSgpLFxuICAgICAgYXR0cmlidXRlczogWydsYWJlbCcsICduYW1lJ10sXG4gICAgICBkaXNwbGF5V2l0aDogdGhpcy5lbnRpdHlUb1N0cmluZ1xuICAgIH0pO1xuXG4gICAgLy8gRnJvbSAkaXRlbXMgb2JzZXJ2YWJsZVxuICAgIHRoaXMuYXV0b2NvbXBsZXRlRmllbGRzLmFkZCgnZW50aXR5LSRpdGVtcycsIHtcbiAgICAgIGl0ZW1zOiB0aGlzLiRpdGVtcyxcbiAgICAgIGF0dHJpYnV0ZXM6IFsnbGFiZWwnLCAnbmFtZSddLFxuICAgICAgZGlzcGxheVdpdGg6IHRoaXMuZW50aXR5VG9TdHJpbmdcbiAgICB9KTtcblxuICAgIC8vIEZyb20gJGl0ZW1zIHdpdGggZmlsdGVyXG4gICAgdGhpcy5hdXRvY29tcGxldGVGaWVsZHMuYWRkKCdlbnRpdHktaXRlbXMtZmlsdGVyJywge1xuICAgICAgc2VydmljZToge1xuICAgICAgICBzdWdnZXN0OiAodmFsdWUsIGZpbHRlcikgPT4gdGhpcy5zdWdnZXN0KHZhbHVlLCBmaWx0ZXIpXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczogWydsYWJlbCcsICduYW1lJ10sXG4gICAgICBkaXNwbGF5V2l0aDogdGhpcy5lbnRpdHlUb1N0cmluZ1xuICAgIH0pO1xuXG4gICAgLy8gRnJvbSBpdGVtc1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlRmllbGRzLmFkZCgnZW50aXR5LWl0ZW1zLWxhcmdlJywge1xuICAgICAgaXRlbXM6IEZBS0VfRU5USVRJRVMuc2xpY2UoKSxcbiAgICAgIGF0dHJpYnV0ZXM6IFsnbGFiZWwnLCAnbmFtZScsICdkZXNjcmlwdGlvbicsICdjb21tZW50cyddLFxuICAgICAgZGlzcGxheVdpdGg6IHRoaXMuZW50aXR5VG9TdHJpbmdcbiAgICB9KTtcblxuICAgIHRoaXMubG9hZERhdGEoKTtcblxuICB9XG5cbiAgLy8gTG9hZCB0aGUgZm9ybSB3aXRoIGRhdGFcbiAgYXN5bmMgbG9hZERhdGEoKSB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGVudGl0eTogZGVlcENvcHkoRkFLRV9FTlRJVElFUylbMF0sIC8vIFNlbGVjdCB0aGUgc2Vjb25kXG5cbiAgICAgIC8vIFRoaXMgaXRlbSBpcyBOT1QgaW4gdGhlIGl0ZW1zIGxpc3QgPT4gaSBzaG91bGQgYmUgZGlzcGxheWVkIGFueXdheVxuICAgICAgbWlzc2luZ0VudGl0eToge1xuICAgICAgICBpZDogLTEsIGxhYmVsOiAnPz8nLCBuYW1lOiAnTWlzc2luZyBpdGVtJ1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZUVudGl0eTogZGVlcENvcHkoRkFLRV9FTlRJVElFUylbMl1cbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtLnNldFZhbHVlKGRhdGEpO1xuXG4gICAgLy8gTG9hZCBvYnNlcnZhYmxlc1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb2FkSXRlbXMoKSwgMTAwMCk7XG4gIH1cblxuICBhc3luYyBsb2FkSXRlbXMoKSB7XG4gICAgdGhpcy4kaXRlbXMubmV4dCh0aGlzLl9pdGVtcy5zbGljZSgpKTtcbiAgfVxuXG4gIGVudGl0eVRvU3RyaW5nKGl0ZW06IGFueSkge1xuICAgIHJldHVybiBbaXRlbSAmJiBpdGVtLmxhYmVsIHx8IHVuZGVmaW5lZCwgaXRlbSAmJiBpdGVtLm5hbWUgfHwgdW5kZWZpbmVkXS5maWx0ZXIoaXNOb3ROaWwpLmpvaW4oJyAtICcpO1xuICB9XG5cbiAgYXN5bmMgc3VnZ2VzdCh2YWx1ZTogYW55LCBmaWx0ZXI/OiBhbnkpOiBQcm9taXNlPExvYWRSZXN1bHQ8YW55Pj4ge1xuICAgIGZpbHRlciA9IHtvZmZzZXQ6IDAsIHNpemU6IDMwLCAuLi5maWx0ZXJ9O1xuICAgIGNvbnN0IHJlcyA9IHN1Z2dlc3RGcm9tQXJyYXkodGhpcy5faXRlbXMsIHZhbHVlLCB7XG4gICAgICAuLi5maWx0ZXIsXG4gICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBbJ2xhYmVsJywgJ25hbWUnXVxuICAgIH0pO1xuICAgIC8vIFNpbXVsYXRlIGEgc2l6ZSA9IDMwXG5cbiAgICBjb25zdCB0b3RhbCA9IHJlcy50b3RhbCB8fCByZXMuZGF0YS5sZW5ndGg7XG5cbiAgICBjb25zdCBuZXh0T2Zmc2V0ID0gZmlsdGVyLm9mZnNldCArIHJlcy5kYXRhLmxlbmd0aDtcbiAgICBpZiAobmV4dE9mZnNldCA8IHRvdGFsKSB7XG4gICAgICBmaWx0ZXIgPSB7Li4uZmlsdGVyLCBvZmZzZXQ6IG5leHRPZmZzZXR9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG90YWwsXG4gICAgICAgIGRhdGE6IHJlcy5kYXRhLFxuICAgICAgICBmZXRjaE1vcmU6IGFzeW5jICh2YXJpYWJsZXMpID0+IHtcbiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0KHZhbHVlLCB7Li4uZmlsdGVyLCAuLi52YXJpYWJsZXN9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgZG9TdWJtaXQoZXZlbnQpIHtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1ZhbGlkYXRlIGZvcm06ICcsIHRoaXMuZm9ybS52YWx1ZSk7XG4gIH1cblxuICBjb21wYXJlV2l0aEZuKG8xOiBFbnRpdHlUZXN0Q2xhc3MsIG8yOiBFbnRpdHlUZXN0Q2xhc3MpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbzEgJiYgbzIgJiYgbzEuaWQgPT09IG8yLmlkO1xuICB9XG5cbiAgdG9nZ2xlTW9kZSh2YWx1ZSkge1xuICAgIGlmICh0aGlzLm1vZGUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLm1vZGUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc3RvcE1lbW9yeVRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhcnRNZW1vcnlUaW1lcigpIHtcbiAgICB0aGlzLm1lbW9yeVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5tZW1vcnlIaWRlID0gIXRoaXMubWVtb3J5SGlkZTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBzdG9wTWVtb3J5VGltZXIoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLm1lbW9yeVRpbWVyKTtcbiAgICB0aGlzLm1lbW9yeVRpbWVyID0gbnVsbDtcbiAgICB0aGlzLm1lbW9yeUhpZGUgPSBmYWxzZTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcihmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGZpbHRlcjogeyBzZWFyY2hBdHRyaWJ1dGU/OiBzdHJpbmcgfSA9IHRoaXMuYXV0b2NvbXBsZXRlRmllbGRzLmdldChmaWVsZE5hbWUpLmZpbHRlciB8fCB7fTtcbiAgICBmaWx0ZXIuc2VhcmNoQXR0cmlidXRlID0gKCFmaWx0ZXIgfHwgZmlsdGVyLnNlYXJjaEF0dHJpYnV0ZSAhPT0gJ25hbWUnKSA/ICduYW1lJyA6ICdsYWJlbCc7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHN0cmluZ2lmeSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxufVxuXG4iXX0=
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9hdXRvY29tcGxldGUvdGVzdGluZy9hdXRvY29tcGxldGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUMsV0FBVyxFQUFZLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUlyQyxNQUFNLGVBQWU7Q0FJcEI7QUFFRCxNQUFNLGFBQWEsR0FBRztJQUNwQixFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxRQUFRLEVBQUUsd0NBQXdDLEVBQUM7SUFDakksRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxFQUFFLHdDQUF3QyxFQUFDO0lBQ2pJLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLFFBQVEsRUFBRSx3Q0FBd0MsRUFBQztDQUNsSSxDQUFDO0FBRUYsU0FBUyxRQUFRLENBQUMsTUFBMEIs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RUFBRSxDQUFDO1FBQ2pHLE1BQU0sQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsZUFBZSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM3RixDQUFDO0lBRUQsNkJBQTZCO0lBRTdCLFNBQVMsQ0FBQyxLQUFVO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDOzs7WUFwS0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLHd5b0JBQXVDO2FBQ3hDOzs7WUF2Q08sV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQnVpbGRlciwgRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1NoYXJlZFZhbGlkYXRvcnN9IGZyb20gJy4uLy4uLy4uL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyfSBmcm9tICcuLi9tYXRlcmlhbC5hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtpc05pbCwgaXNOb3ROaWwsIHNsZWVwLCBzdWdnZXN0RnJvbUFycmF5fSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtMb2FkUmVzdWx0fSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgVGltZXIgPSBOb2RlSlMuVGltZXI7XG5cbmNsYXNzIEVudGl0eVRlc3RDbGFzcyB7XG4gIGlkOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgRkFLRV9FTlRJVElFUyA9IFtcbiAge2lkOiAxLCBsYWJlbDogJ0FBQScsIG5hbWU6ICdJdGVtIEEnLCBkZXNjcmlwdGlvbjogJ1ZlcnkgbG9uZyBkZXNjcmlwdGlvbiBBJywgY29tbWVudHM6ICdWZXJ5IHZlcnkgbG9uZyBjb21tZW50cy4uLiBhZ2FpbiBmb3IgQSd9LFxuICB7aWQ6IDIsIGxhYmVsOiAnQkJCJywgbmFtZTogJ0l0ZW0gQicsIGRlc2NyaXB0aW9uOiAnVmVyeSBsb25nIGRlc2NyaXB0aW9uIEInLCBjb21tZW50czogJ1ZlcnkgdmVyeSBsb25nIGNvbW1lbnRzLi4uIGFnYWluIGZvciBCJ30sXG4gIHtpZDogMywgbGFiZWw6ICdDQ0MnLCBuYW1lOiAnSXRlbSBDJywgZGVzY3JpcHRpb246ICdWZXJ5IGxvbmcgZGVzY3JpcHRpb24gQycsIGNvbW1lbnRzOiAnVmVyeSB2ZXJ5IGxvbmcgY29tbWVudHMuLi4gYWdhaW4gZm9yIEMnfVxuXTtcblxuZnVuY3Rpb24gZGVlcENvcHkodmFsdWVzPzogRW50aXR5VGVzdENsYXNzW10sIHNpemU/OiBudW1iZXIpOiBFbnRpdHlUZXN0Q2xhc3NbXSB7XG4gIGlmIChpc05pbChzaXplKSkge1xuICAgIHJldHVybiAodmFsdWVzIHx8IEZBS0VfRU5USVRJRVMpLm1hcChlbnRpdHkgPT4gT2JqZWN0LmFzc2lnbih7fSwgZW50aXR5KSk7XG4gIH1cblxuICBsZXQgcmVzdWx0ID0gW107XG4gIGxldCBpID0gMTtcbiAgd2hpbGUgKHJlc3VsdC5sZW5ndGggPCBzaXplKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgodmFsdWVzIHx8IEZBS0VfRU5USVRJRVMpLm1hcChlbnRpdHkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGVudGl0eS5uYW1lICsgJyAjJyArIGk7XG4gICAgICByZXR1cm4gey4uLmVudGl0eSwgaWQ6IGkrKywgbmFtZX07XG4gICAgfSkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuc2xpY2UoMCwgc2l6ZSk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hdXRvY29tcGxldGUtdGVzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUudGVzdC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBdXRvY29tcGxldGVUZXN0UGFnZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgX2l0ZW1zID0gZGVlcENvcHkoRkFLRV9FTlRJVElFUywgMTAwKTtcbiAgJGl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlUZXN0Q2xhc3NbXT4odW5kZWZpbmVkKTtcblxuICBmb3JtOiBGb3JtR3JvdXA7XG4gIGF1dG9jb21wbGV0ZUZpZWxkcyA9IG5ldyBNYXRBdXRvY29tcGxldGVDb25maWdIb2xkZXIoKTtcbiAgbWVtb3J5SGlkZSA9IGZhbHNlO1xuICBtZW1vcnlNb2JpbGUgPSB0cnVlO1xuICBtZW1vcnlBdXRvY29tcGxldGVGaWVsZE5hbWUgPSAnZW50aXR5LSRpdGVtcyc7XG4gIG1lbW9yeVRpbWVyOiBUaW1lcjtcblxuICBtb2RlOiAnbW9iaWxlJ3wnZGVza3RvcCd8J21lbW9yeSd8J3RlbXAnID0gJ21vYmlsZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlclxuICApIHtcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBlbnRpdHk6IFtudWxsLCBTaGFyZWRWYWxpZGF0b3JzLmVudGl0eV0sXG4gICAgICBtaXNzaW5nRW50aXR5OiBbbnVsbCwgU2hhcmVkVmFsaWRhdG9ycy5lbnRpdHldLFxuICAgICAgZGlzYWJsZUVudGl0eTogW251bGwsIFNoYXJlZFZhbGlkYXRvcnMuZW50aXR5XSxcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybS5nZXQoJ2Rpc2FibGVFbnRpdHknKS5kaXNhYmxlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIC8vIEZyb20gc3VnZ2VzdFxuICAgIHRoaXMuYXV0b2NvbXBsZXRlRmllbGRzLmFkZCgnZW50aXR5LXN1Z2dlc3RGbicsIHtcbiAgICAgIHN1Z2dlc3RGbjogKHZhbHVlLCBmaWx0ZXIpID0+IHRoaXMuc3VnZ2VzdCh2YWx1ZSwgZmlsdGVyKSxcbiAgICAgIGF0dHJpYnV0ZXM6IFsnbGFiZWwnLCAnbmFtZSddLFxuICAgICAgZGlzcGxheVdpdGg6IHRoaXMuZW50aXR5VG9TdHJpbmcsXG4gICAgICBzaG93QWxsT25Gb2N1czogZmFsc2VcbiAgICB9KTtcblxuICAgIC8vIEZyb20gaXRlbXMgYXJyYXlcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUZpZWxkcy5hZGQoJ2VudGl0eS1pdGVtcycsIHtcbiAgICAgIGl0ZW1zOiB0aGlzLl9pdGVtcy5zbGljZSgpLFxuICAgICAgYXR0cmlidXRlczogWydsYWJlbCcsICduYW1lJ10sXG4gICAgICBkaXNwbGF5V2l0aDogdGhpcy5lbnRpdHlUb1N0cmluZ1xuICAgIH0pO1xuXG4gICAgLy8gRnJvbSAkaXRlbXMgb2JzZXJ2YWJsZVxuICAgIHRoaXMuYXV0b2NvbXBsZXRlRmllbGRzLmFkZCgnZW50aXR5LSRpdGVtcycsIHtcbiAgICAgIGl0ZW1zOiB0aGlzLiRpdGVtcyxcbiAgICAgIGF0dHJpYnV0ZXM6IFsnbGFiZWwnLCAnbmFtZSddLFxuICAgICAgZGlzcGxheVdpdGg6IHRoaXMuZW50aXR5VG9TdHJpbmdcbiAgICB9KTtcblxuICAgIC8vIEZyb20gJGl0ZW1zIHdpdGggZmlsdGVyXG4gICAgdGhpcy5hdXRvY29tcGxldGVGaWVsZHMuYWRkKCdlbnRpdHktaXRlbXMtZmlsdGVyJywge1xuICAgICAgc2VydmljZToge1xuICAgICAgICBzdWdnZXN0OiAodmFsdWUsIGZpbHRlcikgPT4gdGhpcy5zdWdnZXN0KHZhbHVlLCBmaWx0ZXIpXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczogWydsYWJlbCcsICduYW1lJ10sXG4gICAgICBkaXNwbGF5V2l0aDogdGhpcy5lbnRpdHlUb1N0cmluZ1xuICAgIH0pO1xuXG4gICAgLy8gRnJvbSBpdGVtc1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlRmllbGRzLmFkZCgnZW50aXR5LWl0ZW1zLWxhcmdlJywge1xuICAgICAgaXRlbXM6IEZBS0VfRU5USVRJRVMuc2xpY2UoKSxcbiAgICAgIGF0dHJpYnV0ZXM6IFsnbGFiZWwnLCAnbmFtZScsICdkZXNjcmlwdGlvbicsICdjb21tZW50cyddLFxuICAgICAgZGlzcGxheVdpdGg6IHRoaXMuZW50aXR5VG9TdHJpbmdcbiAgICB9KTtcblxuICAgIHRoaXMubG9hZERhdGEoKTtcblxuICB9XG5cbiAgLy8gTG9hZCB0aGUgZm9ybSB3aXRoIGRhdGFcbiAgYXN5bmMgbG9hZERhdGEoKSB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGVudGl0eTogZGVlcENvcHkoRkFLRV9FTlRJVElFUylbMF0sIC8vIFNlbGVjdCB0aGUgc2Vjb25kXG5cbiAgICAgIC8vIFRoaXMgaXRlbSBpcyBOT1QgaW4gdGhlIGl0ZW1zIGxpc3QgPT4gaSBzaG91bGQgYmUgZGlzcGxheWVkIGFueXdheVxuICAgICAgbWlzc2luZ0VudGl0eToge1xuICAgICAgICBpZDogLTEsIGxhYmVsOiAnPz8nLCBuYW1lOiAnTWlzc2luZyBpdGVtJ1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZUVudGl0eTogZGVlcENvcHkoRkFLRV9FTlRJVElFUylbMl1cbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtLnNldFZhbHVlKGRhdGEpO1xuXG4gICAgLy8gTG9hZCBvYnNlcnZhYmxlc1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb2FkSXRlbXMoKSwgMTAwMCk7XG4gIH1cblxuICBhc3luYyBsb2FkSXRlbXMoKSB7XG4gICAgdGhpcy4kaXRlbXMubmV4dCh0aGlzLl9pdGVtcy5zbGljZSgpKTtcbiAgfVxuXG4gIGVudGl0eVRvU3RyaW5nKGl0ZW06IGFueSkge1xuICAgIHJldHVybiBbaXRlbSAmJiBpdGVtLmxhYmVsIHx8IHVuZGVmaW5lZCwgaXRlbSAmJiBpdGVtLm5hbWUgfHwgdW5kZWZpbmVkXS5maWx0ZXIoaXNOb3ROaWwpLmpvaW4oJyAtICcpO1xuICB9XG5cbiAgYXN5bmMgc3VnZ2VzdCh2YWx1ZTogYW55LCBmaWx0ZXI/OiBhbnkpOiBQcm9taXNlPExvYWRSZXN1bHQ8YW55Pj4ge1xuICAgIGZpbHRlciA9IHtvZmZzZXQ6IDAsIHNpemU6IDMwLCAuLi5maWx0ZXJ9O1xuICAgIGNvbnN0IHJlcyA9IHN1Z2dlc3RGcm9tQXJyYXkodGhpcy5faXRlbXMsIHZhbHVlLCB7XG4gICAgICAuLi5maWx0ZXIsXG4gICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBbJ2xhYmVsJywgJ25hbWUnXVxuICAgIH0pO1xuICAgIC8vIFNpbXVsYXRlIGEgc2l6ZSA9IDMwXG5cbiAgICBjb25zdCB0b3RhbCA9IHJlcy50b3RhbCB8fCByZXMuZGF0YS5sZW5ndGg7XG5cbiAgICBjb25zdCBuZXh0T2Zmc2V0ID0gZmlsdGVyLm9mZnNldCArIHJlcy5kYXRhLmxlbmd0aDtcbiAgICBpZiAobmV4dE9mZnNldCA8IHRvdGFsKSB7XG4gICAgICBmaWx0ZXIgPSB7Li4uZmlsdGVyLCBvZmZzZXQ6IG5leHRPZmZzZXR9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG90YWwsXG4gICAgICAgIGRhdGE6IHJlcy5kYXRhLFxuICAgICAgICBmZXRjaE1vcmU6IGFzeW5jICh2YXJpYWJsZXMpID0+IHtcbiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0KHZhbHVlLCB7Li4uZmlsdGVyLCAuLi52YXJpYWJsZXN9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgZG9TdWJtaXQoZXZlbnQpIHtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1ZhbGlkYXRlIGZvcm06ICcsIHRoaXMuZm9ybS52YWx1ZSk7XG4gIH1cblxuICBjb21wYXJlV2l0aEZuKG8xOiBFbnRpdHlUZXN0Q2xhc3MsIG8yOiBFbnRpdHlUZXN0Q2xhc3MpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbzEgJiYgbzIgJiYgbzEuaWQgPT09IG8yLmlkO1xuICB9XG5cbiAgdG9nZ2xlTW9kZSh2YWx1ZSkge1xuICAgIGlmICh0aGlzLm1vZGUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLm1vZGUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc3RvcE1lbW9yeVRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhcnRNZW1vcnlUaW1lcigpIHtcbiAgICB0aGlzLm1lbW9yeVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5tZW1vcnlIaWRlID0gIXRoaXMubWVtb3J5SGlkZTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBzdG9wTWVtb3J5VGltZXIoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLm1lbW9yeVRpbWVyKTtcbiAgICB0aGlzLm1lbW9yeVRpbWVyID0gbnVsbDtcbiAgICB0aGlzLm1lbW9yeUhpZGUgPSBmYWxzZTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcihmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGZpbHRlcjogeyBzZWFyY2hBdHRyaWJ1dGU/OiBzdHJpbmcgfSA9IHRoaXMuYXV0b2NvbXBsZXRlRmllbGRzLmdldChmaWVsZE5hbWUpLmZpbHRlciB8fCB7fTtcbiAgICBmaWx0ZXIuc2VhcmNoQXR0cmlidXRlID0gKCFmaWx0ZXIgfHwgZmlsdGVyLnNlYXJjaEF0dHJpYnV0ZSAhPT0gJ25hbWUnKSA/ICduYW1lJyA6ICdsYWJlbCc7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHN0cmluZ2lmeSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxufVxuXG4iXX0=
@@ -0,0 +1,74 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Optional } from '@angular/core';
3
+ import { Subject } from 'rxjs';
4
+ export class StartableService {
5
+ constructor(platform) {
6
+ this.onStart = new Subject();
7
+ this._debug = false;
8
+ this._data = null;
9
+ this._started = false;
10
+ this._startPrerequisite = platform
11
+ ? () => platform.ready()
12
+ : () => Promise.resolve();
13
+ }
14
+ start() {
15
+ if (this._startPromise)
16
+ return this._startPromise;
17
+ if (this._started)
18
+ return Promise.resolve(this._data);
19
+ this._startPromise = this._startPrerequisite()
20
+ .then(() => this.ngOnStart())
21
+ .then(data => {
22
+ this._data = data;
23
+ this._started = true;
24
+ this._startPromise = undefined;
25
+ this.onStart.next(this._data);
26
+ return this._data;
27
+ })
28
+ .catch(err => {
29
+ console.error('Failed to start a service: ' + (err && err.message || err), err);
30
+ this._started = false;
31
+ this._startPromise = null;
32
+ return null;
33
+ });
34
+ return this._startPromise;
35
+ }
36
+ stop() {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ try {
39
+ yield this.ngOnStop();
40
+ this._started = false;
41
+ this._startPromise = undefined;
42
+ }
43
+ catch (err) {
44
+ console.error('Failed to stop a service: ' + (err && err.message || err), err);
45
+ }
46
+ });
47
+ }
48
+ restart() {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ if (this._startPromise)
51
+ yield this._startPromise; // Wait end of previous loading
52
+ if (this._started)
53
+ yield this.stop(); // Then stop if started
54
+ return this.start(); // Then start again
55
+ });
56
+ }
57
+ get started() {
58
+ return this._started;
59
+ }
60
+ ready() {
61
+ if (this._started)
62
+ return Promise.resolve(this._data);
63
+ return this.start();
64
+ }
65
+ ngOnStop() {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ // Can be override by subclasses
68
+ });
69
+ }
70
+ }
71
+ StartableService.ctorParameters = () => [
72
+ { type: undefined, decorators: [{ type: Optional }] }
73
+ ];
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBUzNDLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBV3BDLFlBQ2MsUUFBdUM7UUFWckQsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFLLENBQUM7UUFFakIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFVBQUssR0FBTSxJQUFJLENBQUM7UUFFbEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQU92QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUTtZQUNoQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtZQUN4QixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRTthQUMzQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBRWxCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1lBRS9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU5QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDTCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUdLLElBQUk7O1lBQ1IsSUFBSTtnQkFDRixNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO2FBQ2hDO1lBQ0QsT0FBTyxHQUFHLEVBQUU7Z0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ2hGO1FBQ0gsQ0FBQztLQUFBO0lBRUssT0FBTzs7WUFDWCxJQUFJLElBQUksQ0FBQyxhQUFhO2dCQUFFLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLCtCQUErQjtZQUNqRixJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsdUJBQXVCO1lBQzdELE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsbUJBQW1CO1FBQzFDLENBQUM7S0FBQTtJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFZSxRQUFROztZQUN0QixnQ0FBZ0M7UUFDbEMsQ0FBQztLQUFBOzs7NENBN0RFLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJU3RhcnRhYmxlU2VydmljZTxUID0gYW55PiB7XG4gIHN0YXJ0ZWQ6IGJvb2xlYW47XG4gIHN0YXJ0KCk6IFByb21pc2U8VD47XG4gIHN0b3AoKTogUHJvbWlzZTx2b2lkPjtcbiAgcmVhZHkoKTogUHJvbWlzZTxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YXJ0YWJsZVNlcnZpY2U8VCA9IGFueT4gaW1wbGVtZW50cyBJU3RhcnRhYmxlU2VydmljZTxUPiB7XG5cbiAgb25TdGFydCA9IG5ldyBTdWJqZWN0PFQ+KCk7XG5cbiAgcHJvdGVjdGVkIF9kZWJ1ZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2RhdGE6IFQgPSBudWxsO1xuXG4gIHByaXZhdGUgX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3RhcnRQcm9taXNlOiBQcm9taXNlPFQ+O1xuICBwcml2YXRlIF9zdGFydFByZXJlcXVpc2l0ZTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBwbGF0Zm9ybTogeyByZWFkeTogKCkgPT4gUHJvbWlzZTxhbnk+IH1cbiAgKSB7XG4gICAgdGhpcy5fc3RhcnRQcmVyZXF1aXNpdGUgPSBwbGF0Zm9ybVxuICAgICAgPyAoKSA9PiBwbGF0Zm9ybS5yZWFkeSgpXG4gICAgICA6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgc3RhcnQoKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0UHJvbWlzZSkgcmV0dXJuIHRoaXMuX3N0YXJ0UHJvbWlzZTtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9kYXRhKTtcblxuICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHRoaXMuX3N0YXJ0UHJlcmVxdWlzaXRlKClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMubmdPblN0YXJ0KCkpXG4gICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLm9uU3RhcnQubmV4dCh0aGlzLl9kYXRhKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGEgc2VydmljZTogJyArIChlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyKSwgZXJyKTtcbiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdGFydFByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9zdGFydFByb21pc2U7XG4gIH1cblxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubmdPblN0b3AoKTtcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0b3AgYSBzZXJ2aWNlOiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlc3RhcnQoKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0UHJvbWlzZSkgYXdhaXQgdGhpcy5fc3RhcnRQcm9taXNlOyAvLyBXYWl0IGVuZCBvZiBwcmV2aW91cyBsb2FkaW5nXG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIGF3YWl0IHRoaXMuc3RvcCgpOyAvLyBUaGVuIHN0b3AgaWYgc3RhcnRlZFxuICAgIHJldHVybiB0aGlzLnN0YXJ0KCk7IC8vIFRoZW4gc3RhcnQgYWdhaW5cbiAgfVxuXG4gIGdldCBzdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGFydGVkO1xuICB9XG5cbiAgcmVhZHkoKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDYW4gYmUgb3ZlcnJpZGUgYnkgc3ViY2xhc3Nlc1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5nT25TdGFydCgpOiBQcm9taXNlPFQ+O1xufVxuIl19
@@ -2,4 +2,4 @@ import { InjectionToken } from '@angular/core';
2
2
  export const ENVIRONMENT = new InjectionToken('ENV');
3
3
  export class Environment {
4
4
  }
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFjLEtBQUssQ0FBQyxDQUFDO0FBRWxFLE1BQU0sT0FBTyxXQUFXO0NBK0N2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmV0Y2hQb2xpY3l9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHtTdG9yYWdlQ29uZmlnfSBmcm9tICdAaW9uaWMvc3RvcmFnZSc7XG5pbXBvcnQge0luamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IEVOVklST05NRU5UID0gbmV3IEluamVjdGlvblRva2VuPEVudmlyb25tZW50PignRU5WJyk7XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBwcm9kdWN0aW9uOiBib29sZWFuO1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGxpc3RlblJlbW90ZUNoYW5nZXM/OiBib29sZWFuO1xuXG4gIC8vIEEgcGVlciB0byB1c2UgYXQgc3RhcnR1cCAodXNlZnVsIG9uIGEgd2ViIHNpdGUgZGVwbG95bWVudClcbiAgZGVmYXVsdFBlZXI/OiB7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyOyB1c2VTc2w/OiBib29sZWFuOyBwYXRoPzogc3RyaW5nIH0gfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gIC8vIEEgbGlzdCBvZiBwZWVycywgdG8gc2VsZWN0IGFzIHBlZXIsIGluIHNldHRpbmdzXG4gIGRlZmF1bHRQZWVycz86IHsgaG9zdDogc3RyaW5nOyBwb3J0OiBudW1iZXI7IHVzZVNzbD86IGJvb2xlYW47IHBhdGg/OiBzdHJpbmcgfVtdO1xuXG4gIC8vIE1pbiBjb21wYXRpYmxlIHZlcnNpb24gZm9yIHRoZSBwZWVyXG4gIHBlZXJNaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8vIEVuYWJsZSBjYWNoZSBwZXJzaXN0ZW5jZSA/XG4gIHBlcnNpc3RDYWNoZT86IGJvb2xlYW47XG5cbiAgLy8gRm9yY2Ugb2ZmbGluZSBtb2RlID8gLyFcXCBGb3IgREVWIG9ubHlcbiAgb2ZmbGluZT86IGJvb2xlYW47XG5cbiAgLy8gQXBvbGxvIChncmFwaFFMKSBjb25maWdcbiAgYXBvbGxvRmV0Y2hQb2xpY3k/OiAgRmV0Y2hQb2xpY3k7XG5cbiAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgZGVmYXVsdExvY2FsZTogc3RyaW5nO1xuICBkZWZhdWx0TGF0TG9uZ0Zvcm1hdD86ICdERCcgfCAnRERNTScgfCAnRERNTVNTJztcbiAgZGVmYXVsdERlcGFydG1lbnRJZD86IG51bWJlcjtcbiAgZGVmYXVsdEFwcE5hbWU/OiBzdHJpbmc7XG4gIGRlZmF1bHRBbmRyb2lkSW5zdGFsbFVybD86IHN0cmluZztcblxuICAvLyBTdG9yYWdlXG4gIHN0b3JhZ2U/OiBQYXJ0aWFsPFN0b3JhZ2VDb25maWc+O1xuXG4gIC8vIEFib3V0XG4gIHNvdXJjZVVybD86IHN0cmluZztcbiAgcmVwb3J0SXNzdWVVcmw/OiBzdHJpbmc7XG4gIGZvcnVtVXJsPzogc3RyaW5nO1xuICBoZWxwVXJsPzogc3RyaW5nO1xuXG4gIC8vIERldmVsb3BtZW50XG4gIC8vIChzZWUgdmFsdWVzIGluIHRoZSB0ZXN0IGRhdGFiYXNlIC0gWE1MIGZpbGVzIGluIFBvZCdzIG1vZHVsZSlcbiAgZGVmYXVsdEF1dGhWYWx1ZXM/OiB7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIH07XG59XG4iXX0=
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFjLEtBQUssQ0FBQyxDQUFDO0FBRWxFLE1BQU0sT0FBTyxXQUFXO0NBZ0R2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmV0Y2hQb2xpY3l9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHtTdG9yYWdlQ29uZmlnfSBmcm9tICdAaW9uaWMvc3RvcmFnZSc7XG5pbXBvcnQge0luamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IEVOVklST05NRU5UID0gbmV3IEluamVjdGlvblRva2VuPEVudmlyb25tZW50PignRU5WJyk7XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBwcm9kdWN0aW9uOiBib29sZWFuO1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGxpc3RlblJlbW90ZUNoYW5nZXM/OiBib29sZWFuO1xuXG4gIC8vIEEgcGVlciB0byB1c2UgYXQgc3RhcnR1cCAodXNlZnVsIG9uIGEgd2ViIHNpdGUgZGVwbG95bWVudClcbiAgZGVmYXVsdFBlZXI/OiB7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyOyB1c2VTc2w/OiBib29sZWFuOyBwYXRoPzogc3RyaW5nIH0gfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gIC8vIEEgbGlzdCBvZiBwZWVycywgdG8gc2VsZWN0IGFzIHBlZXIsIGluIHNldHRpbmdzXG4gIGRlZmF1bHRQZWVycz86IHsgaG9zdDogc3RyaW5nOyBwb3J0OiBudW1iZXI7IHVzZVNzbD86IGJvb2xlYW47IHBhdGg/OiBzdHJpbmcgfVtdO1xuXG4gIC8vIE1pbiBjb21wYXRpYmxlIHZlcnNpb24gZm9yIHRoZSBwZWVyXG4gIHBlZXJNaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8vIEVuYWJsZSBjYWNoZSBwZXJzaXN0ZW5jZSA/XG4gIHBlcnNpc3RDYWNoZT86IGJvb2xlYW47XG5cbiAgLy8gRm9yY2Ugb2ZmbGluZSBtb2RlID8gLyFcXCBGb3IgREVWIG9ubHlcbiAgb2ZmbGluZT86IGJvb2xlYW47XG5cbiAgLy8gQXBvbGxvIChncmFwaFFMKSBjb25maWdcbiAgYXBvbGxvRmV0Y2hQb2xpY3k/OiAgRmV0Y2hQb2xpY3k7XG5cbiAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgZGVmYXVsdExvY2FsZTogc3RyaW5nO1xuICBkZWZhdWx0TGF0TG9uZ0Zvcm1hdD86ICdERCcgfCAnRERNTScgfCAnRERNTVNTJztcbiAgZGVmYXVsdERlcGFydG1lbnRJZD86IG51bWJlcjtcbiAgZGVmYXVsdEFwcE5hbWU/OiBzdHJpbmc7XG4gIGRlZmF1bHRBbmRyb2lkSW5zdGFsbFVybD86IHN0cmluZztcblxuICAvLyBTdG9yYWdlXG4gIHN0b3JhZ2U/OiBQYXJ0aWFsPFN0b3JhZ2VDb25maWc+O1xuICBzdG9yYWdlU2F2ZVBlcmlvZE1zPzogbnVtYmVyO1xuXG4gIC8vIEFib3V0XG4gIHNvdXJjZVVybD86IHN0cmluZztcbiAgcmVwb3J0SXNzdWVVcmw/OiBzdHJpbmc7XG4gIGZvcnVtVXJsPzogc3RyaW5nO1xuICBoZWxwVXJsPzogc3RyaW5nO1xuXG4gIC8vIERldmVsb3BtZW50XG4gIC8vIChzZWUgdmFsdWVzIGluIHRoZSB0ZXN0IGRhdGFiYXNlIC0gWE1MIGZpbGVzIGluIFBvZCdzIG1vZHVsZSlcbiAgZGVmYXVsdEF1dGhWYWx1ZXM/OiB7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIH07XG59XG4iXX0=
@@ -40,6 +40,10 @@ export const environment = Object.freeze({
40
40
  {
41
41
  host: 'sih.sfa.sc',
42
42
  port: 80
43
+ },
44
+ {
45
+ host: 'test.sumaris.net',
46
+ port: 443
43
47
  }
44
48
  ],
45
49
  defaultAppName: 'SUMARiS',
@@ -68,4 +72,4 @@ export const environment = Object.freeze({
68
72
  * because it will have performance impact when throw error
69
73
  */
70
74
  import 'zone.js/dist/zone-error';
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsZ0VBQWdFO0FBSWhFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBZ0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNwRCxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLE9BQU8sRUFBRSxHQUFHO0lBQ1osYUFBYSxFQUFFLElBQUk7SUFDbkIsb0JBQW9CLEVBQUUsTUFBTTtJQUM1QixpQkFBaUIsRUFBRSxhQUFhO0lBRWhDLG1EQUFtRDtJQUNuRCxtQkFBbUIsRUFBRSxLQUFLO0lBRTFCLHNCQUFzQjtJQUN0QixZQUFZLEVBQUUsS0FBSztJQUVuQix3QkFBd0I7SUFDeEIsZ0JBQWdCO0lBRWhCLGNBQWMsRUFBRSxPQUFPO0lBRXZCLFlBQVksRUFBRTtRQUNaO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLGNBQWM7WUFDcEIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLGNBQWM7WUFDcEIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLGNBQWM7WUFDcEIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLFlBQVk7WUFDbEIsSUFBSSxFQUFFLEVBQUU7U0FDVDtLQUNGO0lBQ0QsY0FBYyxFQUFFLFNBQVM7SUFDekIsd0JBQXdCLEVBQUUsK0RBQStEO0lBRXpGLFVBQVU7SUFDVixPQUFPLEVBQUU7UUFDUCxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUM7S0FDL0Q7SUFFRCxRQUFRO0lBQ1IsU0FBUyxFQUFFLHFFQUFxRTtJQUNoRixjQUFjLEVBQUUsOEVBQThFO0lBQzlGLFFBQVEsRUFBRSwyQkFBMkI7SUFDckMsT0FBTyxFQUFFLGdHQUFnRztJQUV6RyxjQUFjO0lBQ2QsaUJBQWlCLEVBQUU7UUFFakIscUNBQXFDO1FBQ3JDLHdDQUF3QztRQUV4QyxtQ0FBbUM7UUFDbkMsUUFBUSxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxPQUFPO0tBQ2pEO0NBQ0YsQ0FBQyxDQUFDO0FBRUg7Ozs7O0dBS0c7QUFDSCxPQUFPLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBmaWxlIGNhbiBiZSByZXBsYWNlZCBkdXJpbmcgYnVpbGQgYnkgdXNpbmcgdGhlIGBmaWxlUmVwbGFjZW1lbnRzYCBhcnJheS5cbi8vIGBuZyBidWlsZCAtLS1wcm9kYCByZXBsYWNlcyBgZW52aXJvbm1lbnQudHNgIHdpdGggYGVudmlyb25tZW50LnByb2QudHNgLlxuLy8gVGhlIGxpc3Qgb2YgZmlsZSByZXBsYWNlbWVudHMgY2FuIGJlIGZvdW5kIGluIGBhbmd1bGFyLmpzb25gLlxuXG5pbXBvcnQge0Vudmlyb25tZW50fSBmcm9tICcuL2Vudmlyb25tZW50LmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IE9iamVjdC5mcmVlemUoe1xuICBuYW1lOiAnQHN1bWFyaXMtbmV0L25neC1jb21wb25lbnRzJywgLy8gb3ZlcnJpZGRlbiBieSBFTlZJUk9OTUVOVCB0b2tlblxuICB2ZXJzaW9uOiB1bmRlZmluZWQsIC8vIG92ZXJyaWRkZW4gYnkgRU5WSVJPTk1FTlQgdG9rZW5cbiAgcHJvZHVjdGlvbjogdHJ1ZSwgLy8gbGV0IHRvIHRydWUgISBiZWNhdXNlIHVzZWQgYnkgcGFja2FnZXJcbiAgYmFzZVVybDogJy8nLFxuICBkZWZhdWx0TG9jYWxlOiAnZnInLFxuICBkZWZhdWx0TGF0TG9uZ0Zvcm1hdDogJ0RETU0nLFxuICBhcG9sbG9GZXRjaFBvbGljeTogJ2NhY2hlLWZpcnN0JyxcblxuICAvLyBGSVhNRTogR3JhcGhRTCBzdWJzY3JpcHRpb24gbmV2ZXIgdW5zdWJzY3JpYmUuLi5cbiAgbGlzdGVuUmVtb3RlQ2hhbmdlczogZmFsc2UsXG5cbiAgLy8gRklYTUU6IGVuYWJsZSBjYWNoZVxuICBwZXJzaXN0Q2FjaGU6IGZhbHNlLFxuXG4gIC8vIFRPRE86IG1ha2UgdGhpcyB3b3Jrc1xuICAvL29mZmxpbmU6IHRydWUsXG5cbiAgcGVlck1pblZlcnNpb246ICcxLjguMCcsXG5cbiAgZGVmYXVsdFBlZXJzOiBbXG4gICAge1xuICAgICAgaG9zdDogJ2xvY2FsaG9zdCcsXG4gICAgICBwb3J0OiA4MDgwXG4gICAgfSxcbiAgICB7XG4gICAgICBob3N0OiAnbG9jYWxob3N0JyxcbiAgICAgIHBvcnQ6IDgwODFcbiAgICB9LFxuICAgIHtcbiAgICAgIGhvc3Q6ICcxOTIuMTY4LjAuNDUnLFxuICAgICAgcG9ydDogODA4MFxuICAgIH0sXG4gICAge1xuICAgICAgaG9zdDogJzE5Mi4xNjguMC4yNCcsXG4gICAgICBwb3J0OiA4MDgwXG4gICAgfSxcbiAgICB7XG4gICAgICBob3N0OiAnMTkyLjE2OC4wLjI5JyxcbiAgICAgIHBvcnQ6IDgwODBcbiAgICB9LFxuICAgIHtcbiAgICAgIGhvc3Q6ICdzaWguc2ZhLnNjJyxcbiAgICAgIHBvcnQ6IDgwXG4gICAgfVxuICBdLFxuICBkZWZhdWx0QXBwTmFtZTogJ1NVTUFSaVMnLFxuICBkZWZhdWx0QW5kcm9pZEluc3RhbGxVcmw6ICdodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9hcHBzL2RldGFpbHM/aWQ9bmV0LnN1bWFyaXMuYXBwJyxcblxuICAvLyBTdG9yYWdlXG4gIHN0b3JhZ2U6IHtcbiAgICBkcml2ZXJPcmRlcjogWydzcWxpdGUnLCAnaW5kZXhlZGRiJywgJ3dlYnNxbCcsICdsb2NhbHN0b3JhZ2UnXVxuICB9LFxuXG4gIC8vIEFib3V0XG4gIHNvdXJjZVVybDogJ2h0dHBzOi8vZ2l0bGFiLmlmcmVtZXIuZnIvc2loLXB1YmxpYy9zdW1hcmlzL25neC1zdW1hcmlzLWNvbXBvbmVudHMnLFxuICByZXBvcnRJc3N1ZVVybDogJ2h0dHBzOi8vZ2l0bGFiLmlmcmVtZXIuZnIvc2loLXB1YmxpYy9zdW1hcmlzL25neC1zdW1hcmlzLWNvbXBvbmVudHMvLS9pc3N1ZXMnLFxuICBmb3J1bVVybDogJ2h0dHBzOi8vZm9ydW0uc3VtYXJpcy5uZXQnLFxuICBoZWxwVXJsOiAnaHR0cHM6Ly9naXRsYWIuaWZyZW1lci5mci9zaWgtcHVibGljL3N1bWFyaXMvc3VtYXJpcy1kb2MvLS9ibG9iL21hc3Rlci91c2VyLW1hbnVhbC9pbmRleF9mci5tZCcsXG5cbiAgLy8gRGV2ZWxvcG1lbnRcbiAgZGVmYXVsdEF1dGhWYWx1ZXM6IHtcblxuICAgIC8vIEJhc2ljIGF1dGggKHVzaW5nIFBlcnNvbi51c2VybmFtZSlcbiAgICAvLyB1c2VybmFtZTogJ2FkbXEyJywgcGFzc3dvcmQ6ICdxMjIwMDYnXG5cbiAgICAvLyBUb2tlbiBhdXRoICh1c2luZyBQZXJzb24ucHVia2V5KVxuICAgIHVzZXJuYW1lOiAnYWRtaW5Ac3VtYXJpcy5uZXQnLCBwYXNzd29yZDogJ2FkbWluJyxcbiAgfVxufSk7XG5cbi8qXG4gKiBJbiBkZXZlbG9wbWVudCBtb2RlLCB0byBpZ25vcmUgem9uZSByZWxhdGVkIGVycm9yIHN0YWNrIGZyYW1lcyBzdWNoIGFzXG4gKiBgem9uZS5ydW5gLCBgem9uZURlbGVnYXRlLmludm9rZVRhc2tgIGZvciBlYXNpZXIgZGVidWdnaW5nLCB5b3UgY2FuXG4gKiBpbXBvcnQgdGhlIGZvbGxvd2luZyBmaWxlLCBidXQgcGxlYXNlIGNvbW1lbnQgaXQgb3V0IGluIHByb2R1Y3Rpb24gbW9kZVxuICogYmVjYXVzZSBpdCB3aWxsIGhhdmUgcGVyZm9ybWFuY2UgaW1wYWN0IHdoZW4gdGhyb3cgZXJyb3JcbiAqL1xuaW1wb3J0ICd6b25lLmpzL2Rpc3Qvem9uZS1lcnJvcic7XG4iXX0=
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsZ0VBQWdFO0FBSWhFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBZ0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNwRCxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLE9BQU8sRUFBRSxHQUFHO0lBQ1osYUFBYSxFQUFFLElBQUk7SUFDbkIsb0JBQW9CLEVBQUUsTUFBTTtJQUM1QixpQkFBaUIsRUFBRSxhQUFhO0lBRWhDLG1EQUFtRDtJQUNuRCxtQkFBbUIsRUFBRSxLQUFLO0lBRTFCLHNCQUFzQjtJQUN0QixZQUFZLEVBQUUsS0FBSztJQUVuQix3QkFBd0I7SUFDeEIsZ0JBQWdCO0lBRWhCLGNBQWMsRUFBRSxPQUFPO0lBRXZCLFlBQVksRUFBRTtRQUNaO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLGNBQWM7WUFDcEIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLGNBQWM7WUFDcEIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLGNBQWM7WUFDcEIsSUFBSSxFQUFFLElBQUk7U0FDWDtRQUNEO1lBQ0UsSUFBSSxFQUFFLFlBQVk7WUFDbEIsSUFBSSxFQUFFLEVBQUU7U0FDVDtRQUNEO1lBQ0UsSUFBSSxFQUFFLGtCQUFrQjtZQUN4QixJQUFJLEVBQUUsR0FBRztTQUNWO0tBQ0Y7SUFDRCxjQUFjLEVBQUUsU0FBUztJQUN6Qix3QkFBd0IsRUFBRSwrREFBK0Q7SUFFekYsVUFBVTtJQUNWLE9BQU8sRUFBRTtRQUNQLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQztLQUMvRDtJQUVELFFBQVE7SUFDUixTQUFTLEVBQUUscUVBQXFFO0lBQ2hGLGNBQWMsRUFBRSw4RUFBOEU7SUFDOUYsUUFBUSxFQUFFLDJCQUEyQjtJQUNyQyxPQUFPLEVBQUUsZ0dBQWdHO0lBRXpHLGNBQWM7SUFDZCxpQkFBaUIsRUFBRTtRQUVqQixxQ0FBcUM7UUFDckMsd0NBQXdDO1FBRXhDLG1DQUFtQztRQUNuQyxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLE9BQU87S0FDakQ7Q0FDRixDQUFDLENBQUM7QUFFSDs7Ozs7R0FLRztBQUNILE9BQU8seUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGZpbGUgY2FuIGJlIHJlcGxhY2VkIGR1cmluZyBidWlsZCBieSB1c2luZyB0aGUgYGZpbGVSZXBsYWNlbWVudHNgIGFycmF5LlxuLy8gYG5nIGJ1aWxkIC0tLXByb2RgIHJlcGxhY2VzIGBlbnZpcm9ubWVudC50c2Agd2l0aCBgZW52aXJvbm1lbnQucHJvZC50c2AuXG4vLyBUaGUgbGlzdCBvZiBmaWxlIHJlcGxhY2VtZW50cyBjYW4gYmUgZm91bmQgaW4gYGFuZ3VsYXIuanNvbmAuXG5cbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4vZW52aXJvbm1lbnQuY2xhc3MnO1xuXG5leHBvcnQgY29uc3QgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG5hbWU6ICdAc3VtYXJpcy1uZXQvbmd4LWNvbXBvbmVudHMnLCAvLyBvdmVycmlkZGVuIGJ5IEVOVklST05NRU5UIHRva2VuXG4gIHZlcnNpb246IHVuZGVmaW5lZCwgLy8gb3ZlcnJpZGRlbiBieSBFTlZJUk9OTUVOVCB0b2tlblxuICBwcm9kdWN0aW9uOiB0cnVlLCAvLyBsZXQgdG8gdHJ1ZSAhIGJlY2F1c2UgdXNlZCBieSBwYWNrYWdlclxuICBiYXNlVXJsOiAnLycsXG4gIGRlZmF1bHRMb2NhbGU6ICdmcicsXG4gIGRlZmF1bHRMYXRMb25nRm9ybWF0OiAnRERNTScsXG4gIGFwb2xsb0ZldGNoUG9saWN5OiAnY2FjaGUtZmlyc3QnLFxuXG4gIC8vIEZJWE1FOiBHcmFwaFFMIHN1YnNjcmlwdGlvbiBuZXZlciB1bnN1YnNjcmliZS4uLlxuICBsaXN0ZW5SZW1vdGVDaGFuZ2VzOiBmYWxzZSxcblxuICAvLyBGSVhNRTogZW5hYmxlIGNhY2hlXG4gIHBlcnNpc3RDYWNoZTogZmFsc2UsXG5cbiAgLy8gVE9ETzogbWFrZSB0aGlzIHdvcmtzXG4gIC8vb2ZmbGluZTogdHJ1ZSxcblxuICBwZWVyTWluVmVyc2lvbjogJzEuOC4wJyxcblxuICBkZWZhdWx0UGVlcnM6IFtcbiAgICB7XG4gICAgICBob3N0OiAnbG9jYWxob3N0JyxcbiAgICAgIHBvcnQ6IDgwODBcbiAgICB9LFxuICAgIHtcbiAgICAgIGhvc3Q6ICdsb2NhbGhvc3QnLFxuICAgICAgcG9ydDogODA4MVxuICAgIH0sXG4gICAge1xuICAgICAgaG9zdDogJzE5Mi4xNjguMC40NScsXG4gICAgICBwb3J0OiA4MDgwXG4gICAgfSxcbiAgICB7XG4gICAgICBob3N0OiAnMTkyLjE2OC4wLjI0JyxcbiAgICAgIHBvcnQ6IDgwODBcbiAgICB9LFxuICAgIHtcbiAgICAgIGhvc3Q6ICcxOTIuMTY4LjAuMjknLFxuICAgICAgcG9ydDogODA4MFxuICAgIH0sXG4gICAge1xuICAgICAgaG9zdDogJ3NpaC5zZmEuc2MnLFxuICAgICAgcG9ydDogODBcbiAgICB9LFxuICAgIHtcbiAgICAgIGhvc3Q6ICd0ZXN0LnN1bWFyaXMubmV0JyxcbiAgICAgIHBvcnQ6IDQ0M1xuICAgIH1cbiAgXSxcbiAgZGVmYXVsdEFwcE5hbWU6ICdTVU1BUmlTJyxcbiAgZGVmYXVsdEFuZHJvaWRJbnN0YWxsVXJsOiAnaHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy9kZXRhaWxzP2lkPW5ldC5zdW1hcmlzLmFwcCcsXG5cbiAgLy8gU3RvcmFnZVxuICBzdG9yYWdlOiB7XG4gICAgZHJpdmVyT3JkZXI6IFsnc3FsaXRlJywgJ2luZGV4ZWRkYicsICd3ZWJzcWwnLCAnbG9jYWxzdG9yYWdlJ11cbiAgfSxcblxuICAvLyBBYm91dFxuICBzb3VyY2VVcmw6ICdodHRwczovL2dpdGxhYi5pZnJlbWVyLmZyL3NpaC1wdWJsaWMvc3VtYXJpcy9uZ3gtc3VtYXJpcy1jb21wb25lbnRzJyxcbiAgcmVwb3J0SXNzdWVVcmw6ICdodHRwczovL2dpdGxhYi5pZnJlbWVyLmZyL3NpaC1wdWJsaWMvc3VtYXJpcy9uZ3gtc3VtYXJpcy1jb21wb25lbnRzLy0vaXNzdWVzJyxcbiAgZm9ydW1Vcmw6ICdodHRwczovL2ZvcnVtLnN1bWFyaXMubmV0JyxcbiAgaGVscFVybDogJ2h0dHBzOi8vZ2l0bGFiLmlmcmVtZXIuZnIvc2loLXB1YmxpYy9zdW1hcmlzL3N1bWFyaXMtZG9jLy0vYmxvYi9tYXN0ZXIvdXNlci1tYW51YWwvaW5kZXhfZnIubWQnLFxuXG4gIC8vIERldmVsb3BtZW50XG4gIGRlZmF1bHRBdXRoVmFsdWVzOiB7XG5cbiAgICAvLyBCYXNpYyBhdXRoICh1c2luZyBQZXJzb24udXNlcm5hbWUpXG4gICAgLy8gdXNlcm5hbWU6ICdhZG1xMicsIHBhc3N3b3JkOiAncTIyMDA2J1xuXG4gICAgLy8gVG9rZW4gYXV0aCAodXNpbmcgUGVyc29uLnB1YmtleSlcbiAgICB1c2VybmFtZTogJ2FkbWluQHN1bWFyaXMubmV0JywgcGFzc3dvcmQ6ICdhZG1pbicsXG4gIH1cbn0pO1xuXG4vKlxuICogSW4gZGV2ZWxvcG1lbnQgbW9kZSwgdG8gaWdub3JlIHpvbmUgcmVsYXRlZCBlcnJvciBzdGFjayBmcmFtZXMgc3VjaCBhc1xuICogYHpvbmUucnVuYCwgYHpvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrYCBmb3IgZWFzaWVyIGRlYnVnZ2luZywgeW91IGNhblxuICogaW1wb3J0IHRoZSBmb2xsb3dpbmcgZmlsZSwgYnV0IHBsZWFzZSBjb21tZW50IGl0IG91dCBpbiBwcm9kdWN0aW9uIG1vZGVcbiAqIGJlY2F1c2UgaXQgd2lsbCBoYXZlIHBlcmZvcm1hbmNlIGltcGFjdCB3aGVuIHRocm93IGVycm9yXG4gKi9cbmltcG9ydCAnem9uZS5qcy9kaXN0L3pvbmUtZXJyb3InO1xuIl19