@wizishop/img-manager 15.2.39 → 15.2.41

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.
@@ -1,7 +1,7 @@
1
1
  import { Component, Input, ViewChild, ElementRef, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';
2
2
  import { ImgManagerService } from '../../services/img-manager.service';
3
- import { Subject } from 'rxjs';
4
- import { debounceTime, take } from 'rxjs/operators';
3
+ import { Subject, combineLatest } from 'rxjs';
4
+ import { filter, map, take } from 'rxjs/operators';
5
5
  import { ImgEventService } from '../../services/img-event.service';
6
6
  import { ImgSelectionService } from '../../services/img-selection.service';
7
7
  import { UserSettingsService } from '../../services/user-settings.service';
@@ -35,15 +35,6 @@ export class ImagesViewComponent {
35
35
  this.listDisplayed = false; // Display format list or mosaic
36
36
  this.multipleImgMode = false;
37
37
  this.switchDisplayWindow = new EventEmitter();
38
- // Data filters
39
- this.tableFilters = {
40
- sort: undefined,
41
- order: undefined,
42
- searchValue: '',
43
- totalItems: 0,
44
- itemsPerPage: 0,
45
- currentPage: 1
46
- };
47
38
  this.widthLargeCard = 219; // Default value of a card width 199 + margin 20
48
39
  this.widthSmallCard = 160; // Default value of a card width 140 + margin 20
49
40
  this.nbFakeImg = 0;
@@ -114,46 +105,58 @@ export class ImagesViewComponent {
114
105
  smallImgWidthFactor: 0.125
115
106
  }
116
107
  ];
117
- this.searchQueryChanged = new Subject();
118
- this.filtersChanged = new Subject();
119
- this.picturesList = [];
120
- this.savePictureList = [];
121
108
  this.nbImgToDelSelected = 0;
122
109
  this.disable = false; // Use to disable action during server request
123
- this.isLoading = true;
124
- this.isTotalRetrieved = false;
125
110
  this.delListImgLoader = false;
126
111
  this.initComponent = true;
127
112
  this.failLoaded = false;
128
- this.displayPexelsResults = false; // Use when no img find by name, display img from Pexels
129
113
  this.confirmImgSup = false;
130
- // Paginator Params
131
- this.pageIndex = 0;
132
- this.length = 0;
133
- this.pageSize = 30; // Default value
134
- this.pageSizeOptions = [25, 50, 100, 250];
135
114
  this.errorGetAllImg = 'ImgManager.ImgLib.errorGetAllImg';
136
115
  this.errorGetTotalImg = 'ImgManager.ImgLib.errorGetTotalImg';
137
116
  this.errorGetImg = 'ImgManager.ImgLib.errorGetCanvaImg';
138
- this.msgNoImgFound = 'ImgManager.ImgLib.noImgFound';
139
117
  this.errorRemoveImg = 'ImgManager.ImgList.errorRemoveImg';
118
+ this.destroy$ = new Subject();
119
+ this.vm$ = combineLatest({
120
+ imageSelection: this.imgSelectionService.imgSelection$,
121
+ imageListData: this.imgManager.imageList$,
122
+ isLoading: this.imgManager.isLoading$,
123
+ searchImagesParameters: this.imgManager.searchImagesParameters$,
124
+ }).pipe(map(({ imageSelection, imageListData: { imageList, imageTotal }, isLoading, searchImagesParameters }) => {
125
+ this.initVariables(true);
126
+ this.calculateNbImgFake(imageList.data.length);
127
+ const picturesList = this.setSelectedProperty(imageSelection, imageList.data);
128
+ this.renamePictureService.setPicturesList(picturesList);
129
+ const tableFilters = this.getTableFilters(searchImagesParameters, imageTotal);
130
+ const keepImagesDisplayed = (this.tabDisplayed === 'img-upload' && searchImagesParameters.page === '1') || (this.tabDisplayed === 'images-view' && imageList.data.length && searchImagesParameters.page === '1');
131
+ const skipSetImagesToDisplay = !!picturesList?.length && this.tabDisplayed === 'img-upload' && searchImagesParameters.page === '1';
132
+ const hideUntilFetchedFirstPageImagesForTabUpload = this.tabDisplayed === 'img-upload' && (searchImagesParameters.page !== '1' || imageList?.page !== 1);
133
+ return {
134
+ isLoading: hideUntilFetchedFirstPageImagesForTabUpload || !keepImagesDisplayed && isLoading,
135
+ displayPexelsResults: !isLoading && imageTotal === 0,
136
+ picturesList,
137
+ imageTotal,
138
+ tableFilters,
139
+ skipSetImagesToDisplay
140
+ };
141
+ }));
140
142
  }
141
- ngOnInit() {
142
- /* if (this.maxLengthCardShow) {
143
- this.reducePictureListMaxLength();
144
- } */
145
- this.setEvents();
146
- this.imgSelectedList = this.imgSelectionService.getImgSelection();
143
+ get searchImagesParameters$() {
144
+ return this.imgManager.searchImagesParameters$;
147
145
  }
148
- ngAfterViewInit() {
149
- this.setNbImgToDisplay();
150
- this._getImgList();
151
- if (!this.savePictureList) {
152
- this.savePictureList = this.picturesList;
153
- }
146
+ getTableFilters(searchImagesParameters, imageTotal) {
147
+ return {
148
+ sort: undefined,
149
+ order: undefined,
150
+ searchValue: searchImagesParameters.search,
151
+ totalItems: imageTotal,
152
+ itemsPerPage: parseInt(searchImagesParameters.limit),
153
+ currentPage: parseInt(searchImagesParameters.page)
154
+ };
154
155
  }
155
- getImgList() {
156
- this.filtersChanged.next();
156
+ ngAfterViewInit() {
157
+ this.vm$.pipe(take(1), filter(({ skipSetImagesToDisplay }) => !skipSetImagesToDisplay)).subscribe(({ tableFilters }) => {
158
+ this.setNbImgToDisplay(tableFilters);
159
+ });
157
160
  }
158
161
  /**
159
162
  * true : go to list display
@@ -168,19 +171,14 @@ export class ImagesViewComponent {
168
171
  /**
169
172
  * Calcul the number of img selected for masse deletion
170
173
  */
171
- onImgSelected() {
172
- this.setNbImgToDelSelected();
173
- }
174
- onShowImgUploaded() {
175
- this.searchText = null;
176
- this.searchedValue = null;
177
- this.getImgList();
174
+ onImgSelected(picturesList) {
175
+ this.setNbImgToDelSelected(picturesList);
178
176
  }
179
177
  onRenamePicture(pictureRenamed) {
180
178
  console.log('onRenamePicture pictureRenamed', pictureRenamed);
181
179
  this.renamePictureService.renamePicture(pictureRenamed);
182
180
  }
183
- removeListImg() {
181
+ removeListImg(picturesList) {
184
182
  if (this.disable) {
185
183
  return;
186
184
  }
@@ -190,26 +188,28 @@ export class ImagesViewComponent {
190
188
  // Get the id of the img to remove
191
189
  // And add deleted property
192
190
  const idImgToRemove = [];
193
- this.picturesList.forEach(img => {
191
+ picturesList.forEach(img => {
194
192
  if (img.delSelected) {
195
193
  img.deleted = true;
196
194
  idImgToRemove.push(img.id_file);
197
195
  }
198
196
  });
199
- this.imgManager.removeMultipleImg(idImgToRemove).subscribe(() => {
200
- this.getImgList();
201
- this.imgSelectionService.removeImgSelectionByIds(idImgToRemove);
202
- }, error => {
203
- this.getImgList();
204
- this.alertService.openAlert(this.errorRemoveImg);
197
+ this.imgManager.removeMultipleImg(idImgToRemove).subscribe({
198
+ next: () => {
199
+ this.imgSelectionService.removeImgSelectionByIds(idImgToRemove);
200
+ },
201
+ error: error => {
202
+ this.imgManager.refreshImageList$.next();
203
+ this.alertService.openAlert(this.errorRemoveImg);
204
+ }
205
205
  });
206
206
  }
207
- selectImgChosen() {
207
+ selectImgChosen(picturesList) {
208
208
  if (this.disable) {
209
209
  return;
210
210
  }
211
211
  const picturesListSelected = [];
212
- this.picturesList.map(img => {
212
+ picturesList.map(img => {
213
213
  if (img.delSelected) {
214
214
  img.delSelected = false;
215
215
  img.selected = true;
@@ -218,7 +218,7 @@ export class ImagesViewComponent {
218
218
  picturesListSelected.push(img);
219
219
  }
220
220
  });
221
- this.setNbImgToDelSelected();
221
+ this.setNbImgToDelSelected(picturesList);
222
222
  this.imgSelectionService.setImgSelection(picturesListSelected);
223
223
  }
224
224
  displayConfirmImgSup() {
@@ -233,17 +233,14 @@ export class ImagesViewComponent {
233
233
  /**
234
234
  * Event emit when a img selected in order to delete
235
235
  */
236
- onPicturesListChange() {
237
- this.setNbImgToDelSelected();
238
- }
239
- onFiltersChange() {
240
- this.getImgList();
236
+ onPicturesListChange(picturesList) {
237
+ this.setNbImgToDelSelected(picturesList);
241
238
  }
242
239
  /**
243
240
  * Set default number of img per page to display at the initialisation
244
241
  * This number is between 30 and 50
245
242
  */
246
- setNbImgToDisplay() {
243
+ setNbImgToDisplay(tableFilters) {
247
244
  const containerWidth = this.imgLibContainer.nativeElement.offsetWidth + 30; // + 30px -> left + right margin
248
245
  const scrollWidth = window.innerWidth - document.body.offsetWidth;
249
246
  const [maxImgWidthFactor, minImgWidthFactor] = this.getImgWidthFactors();
@@ -251,7 +248,11 @@ export class ImagesViewComponent {
251
248
  const maxImgWidth = Math.ceil((containerWidth + scrollWidth) * maxImgWidthFactor);
252
249
  this.nbMaxImgPerLine = Math.floor(containerWidth / minImgWidth);
253
250
  this.nbMinImgPerLine = Math.floor((containerWidth + scrollWidth) / maxImgWidth);
254
- this.pageSize = this.getTotalImgPerPage();
251
+ this.searchImagesParameters$.next(this.getParams({
252
+ ...tableFilters,
253
+ itemsPerPage: this.getTotalImgPerPage(),
254
+ currentPage: 1
255
+ }));
255
256
  }
256
257
  getImgWidthFactors() {
257
258
  const screenWidth = window.innerWidth;
@@ -282,40 +283,30 @@ export class ImagesViewComponent {
282
283
  }
283
284
  return total;
284
285
  }
285
- setParams() {
286
- this.params = {
287
- limit: this.maxLengthCardShow?.toString() || (this.tableFilters.itemsPerPage ? this.tableFilters.itemsPerPage.toString() : this.pageSize.toString()),
288
- page: this.tableFilters.currentPage.toString()
286
+ getParams(tableFilters) {
287
+ return {
288
+ limit: tableFilters.itemsPerPage.toString(),
289
+ page: tableFilters.currentPage.toString(),
290
+ ...(tableFilters.searchValue && { search: tableFilters.searchValue.toString() }),
289
291
  };
290
- if (this.tableFilters.searchValue) {
291
- this.params.search = this.tableFilters.searchValue.toString();
292
- }
293
292
  }
294
293
  initVariables(loadingSuccess) {
295
294
  this.nbImgToDelSelected = 0;
296
295
  this.disable = false;
297
- this.isLoading = false;
298
296
  this.delListImgLoader = false;
299
297
  this.initComponent = false;
300
- this.displayPexelsResults = false;
301
298
  this.failLoaded = !loadingSuccess;
302
299
  this.nbFakeImg = 0;
303
300
  }
304
- selectImgSelected() {
305
- if (!this.imgSelectedList || !this.imgSelectedList.length) {
306
- return;
307
- }
308
- const idImgSlectedList = [];
309
- this.imgSelectedList.forEach(img => idImgSlectedList.push(img.id_file));
310
- this.picturesList.forEach(picture => {
311
- if (idImgSlectedList.indexOf(picture.id_file) !== -1) {
312
- picture.selected = true;
301
+ setSelectedProperty(imgSelectedList, picturesList) {
302
+ const picturesListSelected = JSON.parse(JSON.stringify(picturesList));
303
+ imgSelectedList.forEach(img => {
304
+ const selectedImg = picturesListSelected.find(picture => picture.id_file === img.id_file);
305
+ if (selectedImg) {
306
+ selectedImg.selected = true;
313
307
  }
314
308
  });
315
- }
316
- displayPexelsLib() {
317
- this.displayPexelsResults = true;
318
- this.alertService.openAlert(this.msgNoImgFound);
309
+ return picturesListSelected;
319
310
  }
320
311
  /**
321
312
  * Set a img list in order to fill properly all the line of images displayed in mosaic.
@@ -323,139 +314,32 @@ export class ImagesViewComponent {
323
314
  */
324
315
  calculateNbImgFake(nbImgDisplayed) {
325
316
  const nbImgPerLine = this.stateDisplayed === 'small' || this.tabDisplayed === 'img-upload' ? this.nbMaxImgPerLine : this.nbMinImgPerLine;
326
- if (nbImgDisplayed % nbImgPerLine !== 0) {
327
- this.nbFakeImg = nbImgPerLine - nbImgDisplayed % nbImgPerLine;
317
+ if (isNaN(nbImgDisplayed % nbImgPerLine)) {
318
+ this.nbFakeImg = 0;
319
+ return;
328
320
  }
329
- }
330
- getImg(id_file) {
331
- this.imgManager.getShopImg(id_file).pipe(take(1)).subscribe({
332
- next: (picture) => {
333
- if (!this.imgAlreadyExist(picture.id_file)) {
334
- // check the img is not already present
335
- this.picturesList.unshift(picture);
336
- this.length += 1;
337
- }
338
- },
339
- error: () => {
340
- this.alertService.openAlert(this.errorGetImg);
341
- }
342
- });
343
- }
344
- imgAlreadyExist(id_file) {
345
- for (const img of this.picturesList) {
346
- if (img.id_file === id_file) {
347
- return true;
348
- }
321
+ if (nbImgDisplayed % nbImgPerLine !== 0) {
322
+ setTimeout(() => {
323
+ this.nbFakeImg = nbImgPerLine - nbImgDisplayed % nbImgPerLine;
324
+ }, 0);
349
325
  }
350
- return false;
351
326
  }
352
- setNbImgToDelSelected() {
353
- this.nbImgToDelSelected = this.picturesList.filter(img => img.delSelected).length;
327
+ setNbImgToDelSelected(picturesList) {
328
+ this.nbImgToDelSelected = picturesList.filter(img => img.delSelected).length;
354
329
  if (!this.nbImgToDelSelected) {
355
330
  this.confirmImgSup = false;
356
331
  }
357
332
  }
358
- setEvents() {
359
- // Add a timer to retrieve img when the search bar or the paginator are used
360
- this.searchQueryChanged
361
- .pipe(debounceTime(400)) // wait 0.5 sec after the last event before emitting last event
362
- .subscribe(data => {
363
- this.getImgList();
364
- });
365
- this.filtersChanged
366
- .pipe(debounceTime(800)) // wait 0.8 sec after the last event before emitting last event
367
- .subscribe(data => {
368
- this._getImgList();
369
- });
370
- // Reload img when img is/are removed
371
- this.imgRemovedEvent = this.imgEventService.imgRemoved$.subscribe(id_file => {
372
- this.getImgList();
373
- });
374
- // Create img from Canva
375
- this.imgAddedEvent = this.imgEventService.getImgAddedEventListner().subscribe(id_file => {
376
- if (id_file && !this.imgAlreadyExist(id_file)) {
377
- this.getImg(id_file);
378
- }
379
- });
380
- this.imgSelectionChange = this.imgSelectionService.imgSelection$.subscribe(imgSelection => {
381
- if (this.listDisplayed) {
382
- return;
383
- }
384
- const idFileList = [];
385
- imgSelection.map(img => idFileList.push(img.id_file));
386
- for (const picture of this.picturesList) {
387
- if (idFileList.indexOf(picture.id_file) === -1) {
388
- picture.selected = false;
389
- }
390
- }
391
- });
392
- }
393
- _getImgList() {
394
- this.isLoading = true;
395
- this.displayPexelsResults = false;
396
- this.setParams();
397
- this.refreshTotalImgList();
398
- const forceToUpdate = this.isLastImgRemovedInList();
399
- this.imgManager.getShopImgList(this.params, forceToUpdate).pipe(take(1)).subscribe({
400
- next: (data) => {
401
- this.initVariables(true);
402
- const nbImgDisplayed = data.data.length;
403
- this.calculateNbImgFake(nbImgDisplayed);
404
- this.picturesList = data.data;
405
- this.renamePictureService.setPicturesList(this.picturesList);
406
- this.selectImgSelected();
407
- this.length = this.isTotalRetrieved ? this.length : data.totalRecords;
408
- this.tableFilters.totalItems = this.isTotalRetrieved ? this.tableFilters.totalItems : data.totalRecords;
409
- console.log('this.tableFilters.totalItems 1', this.tableFilters.totalItems);
410
- this.tableFilters.itemsPerPage = this.tableFilters.itemsPerPage ? this.tableFilters.itemsPerPage : this.pageSize;
411
- // Display Pexels if no result
412
- if (data.totalRecords === 0) {
413
- this.displayPexelsLib();
414
- }
415
- this.changeDetectorRef.markForCheck(); // In wizi-admin, the change detection is not working properly
416
- },
417
- error: error => {
418
- this.alertService.openAlert(this.errorGetAllImg);
419
- this.initVariables(false);
420
- }
421
- });
422
- }
423
- refreshTotalImgList() {
424
- const searchValue = this.tableFilters.searchValue;
425
- if (this.isTotalRetrieved && searchValue === this.previousSearchValue) {
426
- // Keep current total result
427
- return;
428
- }
429
- this.isTotalRetrieved = false;
430
- this.imgManager.getShopTotalImgList(this.params).pipe(take(1)).subscribe({
431
- next: total => {
432
- this.previousSearchValue = searchValue;
433
- this.isTotalRetrieved = true;
434
- this.length = total;
435
- this.tableFilters.totalItems = total;
436
- console.log('this.tableFilters.totalItems 1', this.tableFilters.totalItems);
437
- },
438
- error: error => {
439
- //this.alertService.openAlert(this.errorGetTotalImg);
440
- this.initVariables(false);
441
- }
442
- });
443
- }
444
333
  switchDisplayWindowMosaic() {
445
334
  this.switchDisplayWindow.emit(true);
446
335
  }
447
- isLastImgRemovedInList() {
448
- return this.picturesList.some(picture => picture.id_file === this.imgEventService.imgRemoved$.getValue());
449
- }
450
336
  ngOnDestroy() {
451
- this.searchQueryChanged.unsubscribe();
452
- this.imgRemovedEvent.unsubscribe();
453
- this.imgAddedEvent.unsubscribe();
454
- this.imgSelectionChange.unsubscribe();
337
+ this.destroy$.next();
338
+ this.destroy$.complete();
455
339
  }
456
340
  }
457
341
  ImagesViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ImagesViewComponent, deps: [{ token: i1.ImgManagerService }, { token: i2.ImgEventService }, { token: i3.ImgSelectionService }, { token: i4.AlertService }, { token: i5.UserSettingsService }, { token: i6.RenamePictureService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
458
- ImagesViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: ImagesViewComponent, selector: "images-view", inputs: { stateDisplayed: "stateDisplayed", tabDisplayed: "tabDisplayed", fullSize: "fullSize", maxLengthCardShow: "maxLengthCardShow", nbRowToShow: "nbRowToShow", listDisplayed: "listDisplayed", multipleImgMode: "multipleImgMode" }, outputs: { switchDisplayWindow: "switchDisplayWindow" }, viewQueries: [{ propertyName: "imgLibContainer", first: true, predicate: ["imgLibContainer"], descendants: true }], ngImport: i0, template: "<div class=\"images-view\" [ngClass]=\"{'fullSize': fullSize, 'small': stateDisplayed === 'small'}\" [@easeInOut]=\"'in'\">\n <!-- Subheader : Img number and actions btn (sup img list, switch forma display) -->\n <div\n *ngIf=\"(stateDisplayed !== 'small' || tabDisplayed === 'img-upload')\"\n class=\"images-view__container\"\n [ngClass]=\"{'images-view__container--uploadTab': tabDisplayed === 'img-upload', 'images-view__container--window': stateDisplayed === 'window'}\"\n >\n\n <div *ngIf=\"tabDisplayed !== 'img-upload'\">\n <p class=\"mainColor\" [ngClass]=\"{'images-view__container__total--hide': displayPexelsResults}\">{{ 'ImgManager.ImgLib.nbImg' | translate }} : {{length}}</p>\n </div>\n <div *ngIf=\"tabDisplayed === 'img-upload'\">\n <p class=\"mainColor\">{{ 'ImgManager.ImgLib.lastImgs' | translate }}</p>\n </div>\n\n <div class=\"field has-addons subHeaderActions\" *ngIf=\"tabDisplayed !== 'img-upload'\">\n\n <!-- For listforma : Display btn del multiple img & Confirm action -->\n <div class=\"images-view__container__boxAction\">\n\n\n <!-- Select -->\n <button\n class=\"button success images-view__container__boxAction__import\"\n @insertRemoveAnnim\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup && !delListImgLoader && multipleImgMode\"\n (click)=\"selectImgChosen()\"\n type=\"button\"\n >\n <i class=\"fal fa-check\"></i>\n {{ 'ImgManager.ImgLib.select' | translate }} ({{nbImgToDelSelected}})\n </button>\n\n <!-- Display btn del multiple img -->\n <button\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup\"\n (click)=\"displayConfirmImgSup()\"\n class=\"button images-view__container__boxAction__delBtn danger\"\n @insertRemoveAnnim\n type=\"button\"\n >\n <i class=\"fal fa-times\"></i>{{ 'ImgManager.ImgLib.delMlt' | translate }} ({{nbImgToDelSelected}})\n <span btnLoadingAnim *ngIf=\"delListImgLoader\" class=\"btnLoadingAnnimation\"></span>\n </button>\n\n <!-- Confirm action -->\n <div\n class=\"images-view__container__boxAction__confirmSup\"\n [ngClass]=\"{'images-view__container__boxAction__confirmSup--visible': confirmImgSup}\">\n <p *ngIf=\"nbImgToDelSelected > 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestions' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <p *ngIf=\"nbImgToDelSelected === 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestion' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <div>\n <button\n class=\"button images-view__container__boxAction__confirmSup__cancel\"\n (click)=\"cancelSup()\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <button\n (click)=\"removeListImg()\"\n class=\"button images-view__container__delBtn danger\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.confirm' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n <!-- Swith mosaic/list forma -->\n <div class=\"field has-addons images-view__container__buttonBox\">\n <div class=\"control\">\n <div\n class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': !listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(false)\"\n >\n <span class=\"icon is-small\">\n <i class=\"far fa-th\"></i>\n </span>\n </div>\n </div>\n\n <div class=\"control\">\n <div class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(true)\"\n >\n <span class=\"icon is-small\">\n <i class=\"fas fa-bars\"></i>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n <!-- Images section -->\n<ng-scrollbar\n class=\"images-view__scroll\"\n [ngClass]=\"{\n 'images-view__scroll--hide--mosaic': displayPexelsResults && !listDisplayed,\n 'images-view__scroll--hide--table': displayPexelsResults && listDisplayed,\n 'images-view__scroll--full': stateDisplayed === 'full',\n 'images-view__scroll--smallDisplay' : stateDisplayed === 'small' && tabDisplayed !== 'img-upload',\n 'images-view__scroll--smallUploadDisplay' : stateDisplayed === 'small' && tabDisplayed === 'img-upload',\n 'images-view__scroll--window': stateDisplayed === 'window'\n}\"\n>\n <div #imgLibContainer class=\"images-view__wrapper\">\n <div *ngIf=\"!listDisplayed || stateDisplayed === 'small'\" [@easeInOut]=\"'in'\">\n <mosaic-view\n [picturesList]=\"picturesList\"\n (picturesListChange)=\"onPicturesListChange()\"\n [tableFilters]=\"tableFilters\"\n (filtersChange)=\"onFiltersChange()\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n (switchDisplayWindow)=\"switchDisplayWindowMosaic()\"\n [nbFakeImg]=\"nbFakeImg\"\n [stateDisplayed]=\"stateDisplayed\"\n [tabDisplayed]=\"tabDisplayed\"\n [displayPexelsResults]=\"displayPexelsResults\"\n [isLoading]=\"isLoading\"\n [fullSize]=\"fullSize\"\n >\n </mosaic-view>\n </div>\n\n <div *ngIf=\"listDisplayed && stateDisplayed !== 'small'\" [@easeInOut]=\"'in'\">\n <table-view\n [picturesList]=\"picturesList\"\n (picturesListChange)=\"onPicturesListChange()\"\n [tableFilters]=\"tableFilters\"\n (filtersChange)=\"onFiltersChange()\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n [displayPexelsResults]=\"displayPexelsResults\"\n [stateDisplayed]=\"stateDisplayed\"\n [isLoading]=\"isLoading\"\n >\n </table-view>\n </div>\n\n </div>\n</ng-scrollbar>\n\n<!-- Pexels Section - When no img found -->\n<div\n *ngIf=\"displayPexelsResults\"\n class=\"images-view--pexels\"\n [@easeInOut]=\"'in'\">\n <pexels-lib\n [searchValue]=\"tableFilters.searchValue\"\n (showImgUploaded)=\"onShowImgUploaded()\"\n [disableSearch]=\"true\"\n >\n </pexels-lib>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.NgScrollbar, selector: "ng-scrollbar", inputs: ["disabled", "sensorDisabled", "pointerEventsDisabled", "viewportPropagateMouseMove", "autoHeightDisabled", "autoWidthDisabled", "viewClass", "trackClass", "thumbClass", "minThumbSize", "trackClickScrollDuration", "pointerEventsMethod", "track", "visibility", "appearance", "position", "sensorDebounce", "scrollAuditTime"], outputs: ["updated"], exportAs: ["ngScrollbar"] }, { kind: "component", type: i9.PexelLibComponent, selector: "pexels-lib", inputs: ["stateDisplayed", "searchValue", "disableSearch"], outputs: ["showImgUploaded"] }, { kind: "component", type: i10.MosaicViewComponent, selector: "mosaic-view", inputs: ["tabDisplayed", "fullSize", "nbFakeImg"], outputs: ["switchDisplayWindow"] }, { kind: "component", type: i11.TableViewComponent, selector: "table-view" }, { kind: "directive", type: i12.LoadingDirective, selector: "[btnLoadingAnim]" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], animations: [
342
+ ImagesViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: ImagesViewComponent, selector: "images-view", inputs: { stateDisplayed: "stateDisplayed", tabDisplayed: "tabDisplayed", fullSize: "fullSize", nbRowToShow: "nbRowToShow", listDisplayed: "listDisplayed", multipleImgMode: "multipleImgMode" }, outputs: { switchDisplayWindow: "switchDisplayWindow" }, viewQueries: [{ propertyName: "imgLibContainer", first: true, predicate: ["imgLibContainer"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"vm$ | async as vm\">\n\n <div class=\"images-view\" [ngClass]=\"{'fullSize': fullSize, 'small': stateDisplayed === 'small'}\" [@easeInOut]=\"'in'\">\n <!-- Subheader : Img number and actions btn (sup img list, switch forma display) -->\n <div\n *ngIf=\"(stateDisplayed !== 'small' || tabDisplayed === 'img-upload')\"\n class=\"images-view__container\"\n [ngClass]=\"{'images-view__container--uploadTab': tabDisplayed === 'img-upload', 'images-view__container--window': stateDisplayed === 'window'}\"\n >\n\n <div *ngIf=\"tabDisplayed !== 'img-upload'\">\n <p class=\"mainColor\" [ngClass]=\"{'images-view__container__total--hide': vm.displayPexelsResults}\">{{ 'ImgManager.ImgLib.nbImg' | translate }} : {{vm.imageTotal}}</p>\n </div>\n <div *ngIf=\"tabDisplayed === 'img-upload'\">\n <p class=\"mainColor\">{{ 'ImgManager.ImgLib.lastImgs' | translate }}</p>\n </div>\n\n <div class=\"field has-addons subHeaderActions\" *ngIf=\"tabDisplayed !== 'img-upload'\">\n\n <!-- For listforma : Display btn del multiple img & Confirm action -->\n <div class=\"images-view__container__boxAction\">\n\n\n <!-- Select -->\n <button\n class=\"button success images-view__container__boxAction__import\"\n @insertRemoveAnnim\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup && !delListImgLoader && multipleImgMode\"\n (click)=\"selectImgChosen(vm.picturesList)\"\n type=\"button\"\n >\n <i class=\"fal fa-check\"></i>\n {{ 'ImgManager.ImgLib.select' | translate }} ({{nbImgToDelSelected}})\n </button>\n\n <!-- Display btn del multiple img -->\n <button\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup\"\n (click)=\"displayConfirmImgSup()\"\n class=\"button images-view__container__boxAction__delBtn danger\"\n @insertRemoveAnnim\n type=\"button\"\n >\n <i class=\"fal fa-times\"></i>{{ 'ImgManager.ImgLib.delMlt' | translate }} ({{nbImgToDelSelected}})\n <span btnLoadingAnim *ngIf=\"delListImgLoader\" class=\"btnLoadingAnnimation\"></span>\n </button>\n\n <!-- Confirm action -->\n <div\n class=\"images-view__container__boxAction__confirmSup\"\n [ngClass]=\"{'images-view__container__boxAction__confirmSup--visible': confirmImgSup}\">\n <p *ngIf=\"nbImgToDelSelected > 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestions' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <p *ngIf=\"nbImgToDelSelected === 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestion' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <div>\n <button\n class=\"button images-view__container__boxAction__confirmSup__cancel\"\n (click)=\"cancelSup()\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <button\n (click)=\"removeListImg(vm.picturesList)\"\n class=\"button images-view__container__delBtn danger\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.confirm' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n <!-- Swith mosaic/list forma -->\n <div class=\"field has-addons images-view__container__buttonBox\">\n <div class=\"control\">\n <div\n class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': !listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(false)\"\n >\n <span class=\"icon is-small\">\n <i class=\"far fa-th\"></i>\n </span>\n </div>\n </div>\n\n <div class=\"control\">\n <div class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(true)\"\n >\n <span class=\"icon is-small\">\n <i class=\"fas fa-bars\"></i>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n <!-- Images section -->\n <ng-scrollbar\n class=\"images-view__scroll\"\n [ngClass]=\"{\n 'images-view__scroll--hide--mosaic': vm.displayPexelsResults && !listDisplayed,\n 'images-view__scroll--hide--table': vm.displayPexelsResults && listDisplayed,\n 'images-view__scroll--full': stateDisplayed === 'full',\n 'images-view__scroll--smallDisplay' : stateDisplayed === 'small' && tabDisplayed !== 'img-upload',\n 'images-view__scroll--smallUploadDisplay' : stateDisplayed === 'small' && tabDisplayed === 'img-upload',\n 'images-view__scroll--window': stateDisplayed === 'window'\n }\"\n >\n <div #imgLibContainer class=\"images-view__wrapper\">\n\n <div *ngIf=\"!listDisplayed || stateDisplayed === 'small'\" [@easeInOut]=\"'in'\">\n <mosaic-view\n [picturesList]=\"vm.picturesList\"\n (picturesListChange)=\"onPicturesListChange(vm.picturesList)\"\n [tableFilters]=\"vm.tableFilters\"\n (filtersChange)=\"searchImagesParameters$.next(getParams(vm.tableFilters));\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n (switchDisplayWindow)=\"switchDisplayWindowMosaic()\"\n [nbFakeImg]=\"nbFakeImg\"\n [stateDisplayed]=\"stateDisplayed\"\n [tabDisplayed]=\"tabDisplayed\"\n [displayPexelsResults]=\"vm.displayPexelsResults\"\n [isLoading]=\"vm.isLoading\"\n [fullSize]=\"fullSize\"\n >\n </mosaic-view>\n </div>\n\n <div *ngIf=\"listDisplayed && stateDisplayed !== 'small'\" [@easeInOut]=\"'in'\">\n <table-view\n [picturesList]=\"vm.picturesList\"\n (picturesListChange)=\"onPicturesListChange(vm.picturesList)\"\n [tableFilters]=\"vm.tableFilters\"\n (filtersChange)=\"searchImagesParameters$.next(getParams(vm.tableFilters));\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n [displayPexelsResults]=\"vm.displayPexelsResults\"\n [stateDisplayed]=\"stateDisplayed\"\n [isLoading]=\"vm.isLoading\"\n >\n </table-view>\n </div>\n </div>\n </ng-scrollbar>\n\n <!-- Pexels Section - When no img found -->\n <div\n *ngIf=\"vm.displayPexelsResults\"\n class=\"images-view--pexels\"\n [@easeInOut]=\"'in'\">\n <pexels-lib\n [searchValue]=\"vm.tableFilters.searchValue\"\n [disableSearch]=\"true\"\n >\n </pexels-lib>\n </div>\n</ng-container>", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.NgScrollbar, selector: "ng-scrollbar", inputs: ["disabled", "sensorDisabled", "pointerEventsDisabled", "viewportPropagateMouseMove", "autoHeightDisabled", "autoWidthDisabled", "viewClass", "trackClass", "thumbClass", "minThumbSize", "trackClickScrollDuration", "pointerEventsMethod", "track", "visibility", "appearance", "position", "sensorDebounce", "scrollAuditTime"], outputs: ["updated"], exportAs: ["ngScrollbar"] }, { kind: "component", type: i9.PexelLibComponent, selector: "pexels-lib", inputs: ["stateDisplayed", "searchValue", "disableSearch"] }, { kind: "component", type: i10.MosaicViewComponent, selector: "mosaic-view", inputs: ["tabDisplayed", "fullSize", "nbFakeImg"], outputs: ["switchDisplayWindow"] }, { kind: "component", type: i11.TableViewComponent, selector: "table-view" }, { kind: "directive", type: i12.LoadingDirective, selector: "[btnLoadingAnim]" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], animations: [
459
343
  easeInOut,
460
344
  insertRemove
461
345
  ] });
@@ -464,15 +348,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
464
348
  args: [{ selector: 'images-view', animations: [
465
349
  easeInOut,
466
350
  insertRemove
467
- ], template: "<div class=\"images-view\" [ngClass]=\"{'fullSize': fullSize, 'small': stateDisplayed === 'small'}\" [@easeInOut]=\"'in'\">\n <!-- Subheader : Img number and actions btn (sup img list, switch forma display) -->\n <div\n *ngIf=\"(stateDisplayed !== 'small' || tabDisplayed === 'img-upload')\"\n class=\"images-view__container\"\n [ngClass]=\"{'images-view__container--uploadTab': tabDisplayed === 'img-upload', 'images-view__container--window': stateDisplayed === 'window'}\"\n >\n\n <div *ngIf=\"tabDisplayed !== 'img-upload'\">\n <p class=\"mainColor\" [ngClass]=\"{'images-view__container__total--hide': displayPexelsResults}\">{{ 'ImgManager.ImgLib.nbImg' | translate }} : {{length}}</p>\n </div>\n <div *ngIf=\"tabDisplayed === 'img-upload'\">\n <p class=\"mainColor\">{{ 'ImgManager.ImgLib.lastImgs' | translate }}</p>\n </div>\n\n <div class=\"field has-addons subHeaderActions\" *ngIf=\"tabDisplayed !== 'img-upload'\">\n\n <!-- For listforma : Display btn del multiple img & Confirm action -->\n <div class=\"images-view__container__boxAction\">\n\n\n <!-- Select -->\n <button\n class=\"button success images-view__container__boxAction__import\"\n @insertRemoveAnnim\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup && !delListImgLoader && multipleImgMode\"\n (click)=\"selectImgChosen()\"\n type=\"button\"\n >\n <i class=\"fal fa-check\"></i>\n {{ 'ImgManager.ImgLib.select' | translate }} ({{nbImgToDelSelected}})\n </button>\n\n <!-- Display btn del multiple img -->\n <button\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup\"\n (click)=\"displayConfirmImgSup()\"\n class=\"button images-view__container__boxAction__delBtn danger\"\n @insertRemoveAnnim\n type=\"button\"\n >\n <i class=\"fal fa-times\"></i>{{ 'ImgManager.ImgLib.delMlt' | translate }} ({{nbImgToDelSelected}})\n <span btnLoadingAnim *ngIf=\"delListImgLoader\" class=\"btnLoadingAnnimation\"></span>\n </button>\n\n <!-- Confirm action -->\n <div\n class=\"images-view__container__boxAction__confirmSup\"\n [ngClass]=\"{'images-view__container__boxAction__confirmSup--visible': confirmImgSup}\">\n <p *ngIf=\"nbImgToDelSelected > 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestions' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <p *ngIf=\"nbImgToDelSelected === 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestion' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <div>\n <button\n class=\"button images-view__container__boxAction__confirmSup__cancel\"\n (click)=\"cancelSup()\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <button\n (click)=\"removeListImg()\"\n class=\"button images-view__container__delBtn danger\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.confirm' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n <!-- Swith mosaic/list forma -->\n <div class=\"field has-addons images-view__container__buttonBox\">\n <div class=\"control\">\n <div\n class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': !listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(false)\"\n >\n <span class=\"icon is-small\">\n <i class=\"far fa-th\"></i>\n </span>\n </div>\n </div>\n\n <div class=\"control\">\n <div class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(true)\"\n >\n <span class=\"icon is-small\">\n <i class=\"fas fa-bars\"></i>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n <!-- Images section -->\n<ng-scrollbar\n class=\"images-view__scroll\"\n [ngClass]=\"{\n 'images-view__scroll--hide--mosaic': displayPexelsResults && !listDisplayed,\n 'images-view__scroll--hide--table': displayPexelsResults && listDisplayed,\n 'images-view__scroll--full': stateDisplayed === 'full',\n 'images-view__scroll--smallDisplay' : stateDisplayed === 'small' && tabDisplayed !== 'img-upload',\n 'images-view__scroll--smallUploadDisplay' : stateDisplayed === 'small' && tabDisplayed === 'img-upload',\n 'images-view__scroll--window': stateDisplayed === 'window'\n}\"\n>\n <div #imgLibContainer class=\"images-view__wrapper\">\n <div *ngIf=\"!listDisplayed || stateDisplayed === 'small'\" [@easeInOut]=\"'in'\">\n <mosaic-view\n [picturesList]=\"picturesList\"\n (picturesListChange)=\"onPicturesListChange()\"\n [tableFilters]=\"tableFilters\"\n (filtersChange)=\"onFiltersChange()\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n (switchDisplayWindow)=\"switchDisplayWindowMosaic()\"\n [nbFakeImg]=\"nbFakeImg\"\n [stateDisplayed]=\"stateDisplayed\"\n [tabDisplayed]=\"tabDisplayed\"\n [displayPexelsResults]=\"displayPexelsResults\"\n [isLoading]=\"isLoading\"\n [fullSize]=\"fullSize\"\n >\n </mosaic-view>\n </div>\n\n <div *ngIf=\"listDisplayed && stateDisplayed !== 'small'\" [@easeInOut]=\"'in'\">\n <table-view\n [picturesList]=\"picturesList\"\n (picturesListChange)=\"onPicturesListChange()\"\n [tableFilters]=\"tableFilters\"\n (filtersChange)=\"onFiltersChange()\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n [displayPexelsResults]=\"displayPexelsResults\"\n [stateDisplayed]=\"stateDisplayed\"\n [isLoading]=\"isLoading\"\n >\n </table-view>\n </div>\n\n </div>\n</ng-scrollbar>\n\n<!-- Pexels Section - When no img found -->\n<div\n *ngIf=\"displayPexelsResults\"\n class=\"images-view--pexels\"\n [@easeInOut]=\"'in'\">\n <pexels-lib\n [searchValue]=\"tableFilters.searchValue\"\n (showImgUploaded)=\"onShowImgUploaded()\"\n [disableSearch]=\"true\"\n >\n </pexels-lib>\n</div>\n" }]
351
+ ], template: "<ng-container *ngIf=\"vm$ | async as vm\">\n\n <div class=\"images-view\" [ngClass]=\"{'fullSize': fullSize, 'small': stateDisplayed === 'small'}\" [@easeInOut]=\"'in'\">\n <!-- Subheader : Img number and actions btn (sup img list, switch forma display) -->\n <div\n *ngIf=\"(stateDisplayed !== 'small' || tabDisplayed === 'img-upload')\"\n class=\"images-view__container\"\n [ngClass]=\"{'images-view__container--uploadTab': tabDisplayed === 'img-upload', 'images-view__container--window': stateDisplayed === 'window'}\"\n >\n\n <div *ngIf=\"tabDisplayed !== 'img-upload'\">\n <p class=\"mainColor\" [ngClass]=\"{'images-view__container__total--hide': vm.displayPexelsResults}\">{{ 'ImgManager.ImgLib.nbImg' | translate }} : {{vm.imageTotal}}</p>\n </div>\n <div *ngIf=\"tabDisplayed === 'img-upload'\">\n <p class=\"mainColor\">{{ 'ImgManager.ImgLib.lastImgs' | translate }}</p>\n </div>\n\n <div class=\"field has-addons subHeaderActions\" *ngIf=\"tabDisplayed !== 'img-upload'\">\n\n <!-- For listforma : Display btn del multiple img & Confirm action -->\n <div class=\"images-view__container__boxAction\">\n\n\n <!-- Select -->\n <button\n class=\"button success images-view__container__boxAction__import\"\n @insertRemoveAnnim\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup && !delListImgLoader && multipleImgMode\"\n (click)=\"selectImgChosen(vm.picturesList)\"\n type=\"button\"\n >\n <i class=\"fal fa-check\"></i>\n {{ 'ImgManager.ImgLib.select' | translate }} ({{nbImgToDelSelected}})\n </button>\n\n <!-- Display btn del multiple img -->\n <button\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup\"\n (click)=\"displayConfirmImgSup()\"\n class=\"button images-view__container__boxAction__delBtn danger\"\n @insertRemoveAnnim\n type=\"button\"\n >\n <i class=\"fal fa-times\"></i>{{ 'ImgManager.ImgLib.delMlt' | translate }} ({{nbImgToDelSelected}})\n <span btnLoadingAnim *ngIf=\"delListImgLoader\" class=\"btnLoadingAnnimation\"></span>\n </button>\n\n <!-- Confirm action -->\n <div\n class=\"images-view__container__boxAction__confirmSup\"\n [ngClass]=\"{'images-view__container__boxAction__confirmSup--visible': confirmImgSup}\">\n <p *ngIf=\"nbImgToDelSelected > 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestions' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <p *ngIf=\"nbImgToDelSelected === 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestion' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <div>\n <button\n class=\"button images-view__container__boxAction__confirmSup__cancel\"\n (click)=\"cancelSup()\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <button\n (click)=\"removeListImg(vm.picturesList)\"\n class=\"button images-view__container__delBtn danger\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.confirm' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n <!-- Swith mosaic/list forma -->\n <div class=\"field has-addons images-view__container__buttonBox\">\n <div class=\"control\">\n <div\n class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': !listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(false)\"\n >\n <span class=\"icon is-small\">\n <i class=\"far fa-th\"></i>\n </span>\n </div>\n </div>\n\n <div class=\"control\">\n <div class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(true)\"\n >\n <span class=\"icon is-small\">\n <i class=\"fas fa-bars\"></i>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n <!-- Images section -->\n <ng-scrollbar\n class=\"images-view__scroll\"\n [ngClass]=\"{\n 'images-view__scroll--hide--mosaic': vm.displayPexelsResults && !listDisplayed,\n 'images-view__scroll--hide--table': vm.displayPexelsResults && listDisplayed,\n 'images-view__scroll--full': stateDisplayed === 'full',\n 'images-view__scroll--smallDisplay' : stateDisplayed === 'small' && tabDisplayed !== 'img-upload',\n 'images-view__scroll--smallUploadDisplay' : stateDisplayed === 'small' && tabDisplayed === 'img-upload',\n 'images-view__scroll--window': stateDisplayed === 'window'\n }\"\n >\n <div #imgLibContainer class=\"images-view__wrapper\">\n\n <div *ngIf=\"!listDisplayed || stateDisplayed === 'small'\" [@easeInOut]=\"'in'\">\n <mosaic-view\n [picturesList]=\"vm.picturesList\"\n (picturesListChange)=\"onPicturesListChange(vm.picturesList)\"\n [tableFilters]=\"vm.tableFilters\"\n (filtersChange)=\"searchImagesParameters$.next(getParams(vm.tableFilters));\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n (switchDisplayWindow)=\"switchDisplayWindowMosaic()\"\n [nbFakeImg]=\"nbFakeImg\"\n [stateDisplayed]=\"stateDisplayed\"\n [tabDisplayed]=\"tabDisplayed\"\n [displayPexelsResults]=\"vm.displayPexelsResults\"\n [isLoading]=\"vm.isLoading\"\n [fullSize]=\"fullSize\"\n >\n </mosaic-view>\n </div>\n\n <div *ngIf=\"listDisplayed && stateDisplayed !== 'small'\" [@easeInOut]=\"'in'\">\n <table-view\n [picturesList]=\"vm.picturesList\"\n (picturesListChange)=\"onPicturesListChange(vm.picturesList)\"\n [tableFilters]=\"vm.tableFilters\"\n (filtersChange)=\"searchImagesParameters$.next(getParams(vm.tableFilters));\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n [displayPexelsResults]=\"vm.displayPexelsResults\"\n [stateDisplayed]=\"stateDisplayed\"\n [isLoading]=\"vm.isLoading\"\n >\n </table-view>\n </div>\n </div>\n </ng-scrollbar>\n\n <!-- Pexels Section - When no img found -->\n <div\n *ngIf=\"vm.displayPexelsResults\"\n class=\"images-view--pexels\"\n [@easeInOut]=\"'in'\">\n <pexels-lib\n [searchValue]=\"vm.tableFilters.searchValue\"\n [disableSearch]=\"true\"\n >\n </pexels-lib>\n </div>\n</ng-container>" }]
468
352
  }], ctorParameters: function () { return [{ type: i1.ImgManagerService }, { type: i2.ImgEventService }, { type: i3.ImgSelectionService }, { type: i4.AlertService }, { type: i5.UserSettingsService }, { type: i6.RenamePictureService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { stateDisplayed: [{
469
353
  type: Input
470
354
  }], tabDisplayed: [{
471
355
  type: Input
472
356
  }], fullSize: [{
473
357
  type: Input
474
- }], maxLengthCardShow: [{
475
- type: Input
476
358
  }], nbRowToShow: [{
477
359
  type: Input
478
360
  }], listDisplayed: [{
@@ -485,4 +367,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
485
367
  type: ViewChild,
486
368
  args: ['imgLibContainer']
487
369
  }] } });
488
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd3otaW1nLW1hbmFnZXIvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlcy12aWV3L2ltYWdlcy12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3d6LWltZy1tYW5hZ2VyL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZXMtdmlldy9pbWFnZXMtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFpQixNQUFNLEVBQUUsWUFBWSxFQUFtQyxpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV2SyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUczRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRXJGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBVTVELE1BQU0sT0FBTyxtQkFBbUI7SUF3STlC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bkIsbUJBQW1CLDBjQ3hCaEMsazROQW9LQSx5c0NEakpjO1FBQ1YsU0FBUztRQUNULFlBQVk7S0FDYjsyRkFFVSxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsYUFBYSxjQUVYO3dCQUNWLFNBQVM7d0JBQ1QsWUFBWTtxQkFDYjt3U0FJUSxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRU4sbUJBQW1CO3NCQURsQixNQUFNO2dCQWF1QixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbWdQaWN0dXJlRFRPLCBJbWdQaWN0dXJlc0RUTywgUGFyYW1zSW1nTWFuYWdlckRUTyB9IGZyb20gJy4uLy4uL2R0by9pbWctbWFuYWdlci5kdG8nO1xuaW1wb3J0IHsgSW1nTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWdFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJbWdTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW1nLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91c2VyLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVGaWx0ZXJzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFibGUvZmlsdGVycy10YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBpY3R1cmVOYW1lVXBkYXRlIH0gZnJvbSAnLi4vLi4vZHRvL3BpY3R1cmUtbmFtZS11cGRhdGUuZHRvJztcbmltcG9ydCB7IGVhc2VJbk91dCB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvZWFzZUluT3V0L2Vhc2UtaW4tb3V0LmFuaW1hdGlvbic7XG5pbXBvcnQgeyBpbnNlcnRSZW1vdmUgfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL2luc2VydFJlbW92ZS9pbnNlcnQtcmVtb3ZlLmFuaW1hdGlvbic7XG5pbXBvcnQgeyBzdGF0ZURpc3BsYXllZCwgdGFiRGlzcGxheWVkIH0gZnJvbSAnLi4vLi4vZHRvL2V4cG9ydC1kdG9zLmFwaSc7XG5pbXBvcnQgeyBSZW5hbWVQaWN0dXJlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlbmFtZS1waWN0dXJlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWxlcnQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltYWdlcy12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlcy12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgYW5pbWF0aW9uczogW1xuICAgIGVhc2VJbk91dCxcbiAgICBpbnNlcnRSZW1vdmVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBJbWFnZXNWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcblxuICBASW5wdXQoKSBzdGF0ZURpc3BsYXllZDogc3RhdGVEaXNwbGF5ZWQ7XG4gIEBJbnB1dCgpIHRhYkRpc3BsYXllZDogdGFiRGlzcGxheWVkO1xuICBASW5wdXQoKSBmdWxsU2l6ZTogYm9vbGVhbjtcbiAgQElucHV0KCkgbWF4TGVuZ3RoQ2FyZFNob3c6IG51bWJlcjtcbiAgQElucHV0KCkgbmJSb3dUb1Nob3c6IG51bWJlcjtcbiAgQElucHV0KCkgbGlzdERpc3BsYXllZCA9IGZhbHNlOyAvLyBEaXNwbGF5IGZvcm1hdCBsaXN0IG9yIG1vc2FpY1xuICBASW5wdXQoKSBtdWx0aXBsZUltZ01vZGUgPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIHN3aXRjaERpc3BsYXlXaW5kb3c6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBEYXRhIGZpbHRlcnNcbiAgdGFibGVGaWx0ZXJzOiBUYWJsZUZpbHRlcnMgPSB7XG4gICAgc29ydDogdW5kZWZpbmVkLFxuICAgIG9yZGVyOiB1bmRlZmluZWQsXG4gICAgc2VhcmNoVmFsdWU6ICcnLFxuICAgIHRvdGFsSXRlbXM6IDAsXG4gICAgaXRlbXNQZXJQYWdlOiAwLFxuICAgIGN1cnJlbnRQYWdlOiAxXG4gIH07XG5cbiAgQFZpZXdDaGlsZCgnaW1nTGliQ29udGFpbmVyJykgaW1nTGliQ29udGFpbmVyIDogRWxlbWVudFJlZjtcbiAgd2lkdGhMYXJnZUNhcmQ6IG51bWJlciA9IDIxOTsgLy8gRGVmYXVsdCB2YWx1ZSBvZiBhIGNhcmQgd2lkdGggMTk5ICsgbWFyZ2luIDIwXG4gIHdpZHRoU21hbGxDYXJkOiBudW1iZXIgPSAxNjA7IC8vIERlZmF1bHQgdmFsdWUgb2YgYSBjYXJkIHdpZHRoIDE0MCArIG1hcmdpbiAyMFxuICBuYk1pbkltZ1BlckxpbmU6IG51bWJlcjtcbiAgbmJNYXhJbWdQZXJMaW5lOiBudW1iZXI7XG4gIG5iRmFrZUltZzogbnVtYmVyID0gMDtcblxuICBpbWdGdWxsV2lkdGhDb25maWc6YW55ID0gW1xuICAgIHtcbiAgICAgIG1heDogNDE5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDEsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC41XG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDQ5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAxLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuNVxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiA3MTksIC8vIHRhYmxldFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuNSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjMzMzNcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTAyMywgLy8gZGVza29wXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4zMzMzLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMlxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxMzk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xMjVcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTU5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjIsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xMTExXG4gICAgfSxcbiAgICB7XG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4xNjY2LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMVxuICAgIH1cbiAgXTtcblxuICBpbWdXaWR0aENvbmZpZzphbnkgPSBbXG4gICAge1xuICAgICAgbWF4OiAxMDI0LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xMjVcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTE5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjMzMzMsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4yXG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDEyOTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4zMzMzLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTY2NlxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxMzk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xNjY2XG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDE1OTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4yNSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjE0XG4gICAgfSxcbiAgICB7XG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4yNSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjEyNVxuICAgIH1cbiAgXTtcblxuICBpbWdTdWJzY3JpYmU6IFN1YnNjcmlwdGlvbjtcbiAgaW1nUmVtb3ZlZEV2ZW50OiBTdWJzY3JpcHRpb247XG4gIGltZ0FkZGVkRXZlbnQ6IFN1YnNjcmlwdGlvbjtcbiAgaW1nU2VsZWN0aW9uQ2hhbmdlOiBTdWJzY3JpcHRpb247XG4gIHNlYXJjaFF1ZXJ5Q2hhbmdlZDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBmaWx0ZXJzQ2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcGljdHVyZXNMaXN0OiBJbWdQaWN0dXJlRFRPW10gPSBbXTtcbiAgc2F2ZVBpY3R1cmVMaXN0OiBJbWdQaWN0dXJlRFRPW10gPSBbXTtcbiAgaW1nU2VsZWN0ZWRMaXN0OiBJbWdQaWN0dXJlRFRPW107XG4gIHNlYXJjaGVkVmFsdWU6IHN0cmluZzsgLy8gVmFsdWUgZnJvbSB0aGUgc2VhcmNoIGJhciBvciBpbWcgYWRkZWQgYnkgY2FudmFcbiAgbmJJbWdUb0RlbFNlbGVjdGVkOiBudW1iZXIgPSAwO1xuICBkaXNhYmxlOiBib29sZWFuID0gZmFsc2U7IC8vIFVzZSB0byBkaXNhYmxlIGFjdGlvbiBkdXJpbmcgc2VydmVyIHJlcXVlc3RcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNUb3RhbFJldHJpZXZlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBkZWxMaXN0SW1nTG9hZGVyID0gZmFsc2U7XG4gIGluaXRDb21wb25lbnQ6IGJvb2xlYW4gPSB0cnVlO1xuICBmYWlsTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGRpc3BsYXlQZXhlbHNSZXN1bHRzOiBib29sZWFuID0gZmFsc2U7IC8vIFVzZSB3aGVuIG5vIGltZyBmaW5kIGJ5IG5hbWUsIGRpc3BsYXkgaW1nIGZyb20gUGV4ZWxzXG4gIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgY29uZmlybUltZ1N1cDpib29sZWFuID0gZmFsc2U7XG4gIHByZXZpb3VzU2VhcmNoVmFsdWU6IHN0cmluZztcblxuICAvLyBQYWdpbmF0b3IgUGFyYW1zXG4gIHBhZ2VJbmRleDogbnVtYmVyID0wO1xuICBsZW5ndGg6IG51bWJlciA9IDA7XG4gIHBhZ2VTaXplOiBudW1iZXIgPSAzMDsgLy8gRGVmYXVsdCB2YWx1ZVxuICBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gWzI1LCA1MCwgMTAwLCAyNTBdO1xuXG4gIC8vIEFwaSBJbWcgbWFuYWdlciBQYXJhbXNcbiAgcGFyYW1zOlBhcmFtc0ltZ01hbmFnZXJEVE87XG5cbiAgcHJpdmF0ZSBlcnJvckdldEFsbEltZyA9ICdJbWdNYW5hZ2VyLkltZ0xpYi5lcnJvckdldEFsbEltZyc7XG4gIHByaXZhdGUgZXJyb3JHZXRUb3RhbEltZyA9ICdJbWdNYW5hZ2VyLkltZ0xpYi5lcnJvckdldFRvdGFsSW1nJztcbiAgcHJpdmF0ZSBlcnJvckdldEltZyA9ICdJbWdNYW5hZ2VyLkltZ0xpYi5lcnJvckdldENhbnZhSW1nJztcbiAgcHJpdmF0ZSBtc2dOb0ltZ0ZvdW5kID0gJ0ltZ01hbmFnZXIuSW1nTGliLm5vSW1nRm91bmQnO1xuICBwcml2YXRlIGVycm9yUmVtb3ZlSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGlzdC5lcnJvclJlbW92ZUltZyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbWdNYW5hZ2VyOiBJbWdNYW5hZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIGltZ0V2ZW50U2VydmljZTogSW1nRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW1nU2VsZWN0aW9uU2VydmljZTogSW1nU2VsZWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclNldHRpbmdzU2VydmljZTogVXNlclNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmFtZVBpY3R1cmVTZXJ2aWNlOiBSZW5hbWVQaWN0dXJlU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLyogaWYgKHRoaXMubWF4TGVuZ3RoQ2FyZFNob3cpIHtcbiAgICAgIHRoaXMucmVkdWNlUGljdHVyZUxpc3RNYXhMZW5ndGgoKTtcbiAgICB9ICovXG4gICAgdGhpcy5zZXRFdmVudHMoKTtcbiAgICB0aGlzLmltZ1NlbGVjdGVkTGlzdCA9IHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5nZXRJbWdTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnNldE5iSW1nVG9EaXNwbGF5KCk7XG4gICAgdGhpcy5fZ2V0SW1nTGlzdCgpO1xuICAgIGlmICghdGhpcy5zYXZlUGljdHVyZUxpc3QpIHtcbiAgICAgIHRoaXMuc2F2ZVBpY3R1cmVMaXN0ID0gdGhpcy5waWN0dXJlc0xpc3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0SW1nTGlzdCgpIHtcbiAgICB0aGlzLmZpbHRlcnNDaGFuZ2VkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cnVlIDogZ28gdG8gbGlzdCBkaXNwbGF5XG4gICAqIGZhbHNlIDogZ28gdG8gbW9zYWljIGRpc3BsYXlcbiAgICogQHBhcmFtIGFjdGl2YXRlXG4gICAqL1xuICBvblN3aXRjaEZvcm1hdERpc3BsYXllZChhY3RpdmF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMubGlzdERpc3BsYXllZCA9IGFjdGl2YXRlO1xuICAgIHRoaXMudXNlclNldHRpbmdzU2VydmljZS5zZXRVc2VyRGlzcGxheVByZWZlcmVuY2UoYWN0aXZhdGUpO1xuICAgIHRoaXMuaW1nRXZlbnRTZXJ2aWNlLmVtaXRsaXN0RGlzcGxheWVkQ2hhbmdlKGFjdGl2YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWwgdGhlIG51bWJlciBvZiBpbWcgc2VsZWN0ZWQgZm9yIG1hc3NlIGRlbGV0aW9uXG4gICAqL1xuICBvbkltZ1NlbGVjdGVkKCkge1xuICAgIHRoaXMuc2V0TmJJbWdUb0RlbFNlbGVjdGVkKCk7XG4gIH1cblxuICBvblNob3dJbWdVcGxvYWRlZCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBudWxsO1xuICAgIHRoaXMuc2VhcmNoZWRWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5nZXRJbWdMaXN0KCk7XG4gIH1cblxuICBvblJlbmFtZVBpY3R1cmUocGljdHVyZVJlbmFtZWQ6IFBpY3R1cmVOYW1lVXBkYXRlKSB7XG4gICAgY29uc29sZS5sb2coJ29uUmVuYW1lUGljdHVyZSBwaWN0dXJlUmVuYW1lZCcsIHBpY3R1cmVSZW5hbWVkKTtcbiAgICB0aGlzLnJlbmFtZVBpY3R1cmVTZXJ2aWNlLnJlbmFtZVBpY3R1cmUocGljdHVyZVJlbmFtZWQpO1xuICB9XG5cbiAgcmVtb3ZlTGlzdEltZygpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZSA9IHRydWU7XG4gICAgdGhpcy5kZWxMaXN0SW1nTG9hZGVyID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpcm1JbWdTdXAgPSBmYWxzZTtcblxuICAgIC8vIEdldCB0aGUgaWQgb2YgdGhlIGltZyB0byByZW1vdmVcbiAgICAvLyBBbmQgYWRkIGRlbGV0ZWQgcHJvcGVydHlcbiAgICBjb25zdCBpZEltZ1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRoaXMucGljdHVyZXNMaXN0LmZvckVhY2goIGltZyA9PiB7XG4gICAgICBpZiAoaW1nLmRlbFNlbGVjdGVkKSB7XG4gICAgICAgIGltZy5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgaWRJbWdUb1JlbW92ZS5wdXNoKGltZy5pZF9maWxlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuaW1nTWFuYWdlci5yZW1vdmVNdWx0aXBsZUltZyhpZEltZ1RvUmVtb3ZlKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0SW1nTGlzdCgpO1xuICAgICAgICB0aGlzLmltZ1NlbGVjdGlvblNlcnZpY2UucmVtb3ZlSW1nU2VsZWN0aW9uQnlJZHMoaWRJbWdUb1JlbW92ZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmdldEltZ0xpc3QoKTtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uub3BlbkFsZXJ0KHRoaXMuZXJyb3JSZW1vdmVJbWcpO1xuICAgICAgfVxuICAgICk7XG5cblxuICB9XG5cbiAgc2VsZWN0SW1nQ2hvc2VuKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGljdHVyZXNMaXN0U2VsZWN0ZWQ6IEltZ1BpY3R1cmVEVE9bXSA9IFtdO1xuICAgIHRoaXMucGljdHVyZXNMaXN0Lm1hcChpbWcgPT4ge1xuICAgICAgaWYoaW1nLmRlbFNlbGVjdGVkKSB7XG4gICAgICAgIGltZy5kZWxTZWxlY3RlZCA9ZmFsc2U7XG4gICAgICAgIGltZy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaW1nLnNlbGVjdGVkKSB7XG4gICAgICAgIHBpY3R1cmVzTGlzdFNlbGVjdGVkLnB1c2goaW1nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNldE5iSW1nVG9EZWxTZWxlY3RlZCgpO1xuICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5zZXRJbWdTZWxlY3Rpb24ocGljdHVyZXNMaXN0U2VsZWN0ZWQpO1xuICB9XG5cbiAgZGlzcGxheUNvbmZpcm1JbWdTdXAoKXtcbiAgICBpZiAodGhpcy5kaXNhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29uZmlybUltZ1N1cCA9IHRydWU7XG4gIH1cblxuICBjYW5jZWxTdXAoKSB7XG4gICAgdGhpcy5jb25maXJtSW1nU3VwID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZW1pdCB3aGVuIGEgaW1nIHNlbGVjdGVkIGluIG9yZGVyIHRvIGRlbGV0ZVxuICAgKi9cbiAgb25QaWN0dXJlc0xpc3RDaGFuZ2UoKSB7XG4gICAgdGhpcy5zZXROYkltZ1RvRGVsU2VsZWN0ZWQoKTtcbiAgfVxuXG4gIG9uRmlsdGVyc0NoYW5nZSgpIHtcbiAgICB0aGlzLmdldEltZ0xpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGVmYXVsdCBudW1iZXIgb2YgaW1nIHBlciBwYWdlIHRvIGRpc3BsYXkgYXQgdGhlIGluaXRpYWxpc2F0aW9uXG4gICAqIFRoaXMgbnVtYmVyIGlzIGJldHdlZW4gMzAgYW5kIDUwXG4gICAqL1xuICBwcml2YXRlIHNldE5iSW1nVG9EaXNwbGF5KCkge1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5pbWdMaWJDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIDMwOyAvLyArIDMwcHggLT4gbGVmdCArIHJpZ2h0IG1hcmdpblxuICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoO1xuXG4gICAgY29uc3QgW21heEltZ1dpZHRoRmFjdG9yLCBtaW5JbWdXaWR0aEZhY3Rvcl0gPSB0aGlzLmdldEltZ1dpZHRoRmFjdG9ycygpO1xuXG4gICAgY29uc3QgbWluSW1nV2lkdGggPSBNYXRoLmZsb29yKGNvbnRhaW5lcldpZHRoICogbWluSW1nV2lkdGhGYWN0b3IpO1xuICAgIGNvbnN0IG1heEltZ1dpZHRoID0gTWF0aC5jZWlsKChjb250YWluZXJXaWR0aCArIHNjcm9sbFdpZHRoICkgKiBtYXhJbWdXaWR0aEZhY3Rvcik7XG5cbiAgICB0aGlzLm5iTWF4SW1nUGVyTGluZSA9IE1hdGguZmxvb3IoY29udGFpbmVyV2lkdGggLyBtaW5JbWdXaWR0aCk7XG4gICAgdGhpcy5uYk1pbkltZ1BlckxpbmUgPSBNYXRoLmZsb29yKCAoY29udGFpbmVyV2lkdGggKyBzY3JvbGxXaWR0aCApIC8gbWF4SW1nV2lkdGgpO1xuXG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZ2V0VG90YWxJbWdQZXJQYWdlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEltZ1dpZHRoRmFjdG9ycygpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgc2NyZWVuV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBsZXQgbWluV2lkdGg6bnVtYmVyID0gMDtcbiAgICBsZXQgaW1nU2l6ZXNDb25maWc6IG51bWJlcltdID0gW107XG5cbiAgICBjb25zdCBjdXJyZW50SW1nV2lkdGhDb25maWcgPSB0aGlzLmZ1bGxTaXplID8gdGhpcy5pbWdGdWxsV2lkdGhDb25maWcgOiB0aGlzLmltZ1dpZHRoQ29uZmlnO1xuXG4gICAgZm9yIChjb25zdCB3aWR0aENvbmZpZyBvZiBjdXJyZW50SW1nV2lkdGhDb25maWcpIHtcbiAgICAgICAgaWYgKCF3aWR0aENvbmZpZy5tYXgpIHtcbiAgICAgICAgICBpbWdTaXplc0NvbmZpZyA9IFt3aWR0aENvbmZpZy5sYXJnZUltZ1dpZHRoRmFjdG9yLCB3aWR0aENvbmZpZy5zbWFsbEltZ1dpZHRoRmFjdG9yXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWluV2lkdGggPCBzY3JlZW5XaWR0aCAmJiBzY3JlZW5XaWR0aCA8PSB3aWR0aENvbmZpZy5tYXgpIHtcbiAgICAgICAgICBpbWdTaXplc0NvbmZpZyA9IFt3aWR0aENvbmZpZy5sYXJnZUltZ1dpZHRoRmFjdG9yLCB3aWR0aENvbmZpZy5zbWFsbEltZ1dpZHRoRmFjdG9yXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBtaW5XaWR0aCA9IHdpZHRoQ29uZmlnLm1heDtcbiAgICB9XG4gICAgcmV0dXJuIGltZ1NpemVzQ29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb3RhbEltZ1BlclBhZ2UoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5uYlJvd1RvU2hvdykge1xuICAgICAgY29uc3QgbmJJbWdQZXJMaW5lID0gdGhpcy5zdGF0ZURpc3BsYXllZCA9PT0gJ2Z1bGwnID8gdGhpcy5uYk1pbkltZ1BlckxpbmUgOiB0aGlzLm5iTWF4SW1nUGVyTGluZTtcbiAgICAgIHJldHVybiBuYkltZ1BlckxpbmUgKiB0aGlzLm5iUm93VG9TaG93O1xuICAgIH1cblxuICAgIGxldCB0b3RhbCA9IHRoaXMubmJNaW5JbWdQZXJMaW5lO1xuXG4gICAgd2hpbGUgKHRvdGFsIDwgMzAgfHwgdG90YWwgJSB0aGlzLm5iTWF4SW1nUGVyTGluZSAhPT0gMCB8fCAgdG90YWwgJSB0aGlzLm5iTWluSW1nUGVyTGluZSAhPT0gMCkge1xuICAgICAgdG90YWwgKz0gdGhpcy5uYk1pbkltZ1BlckxpbmU7XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGFyYW1zKCkge1xuICAgIHRoaXMucGFyYW1zID0ge1xuICAgICAgbGltaXQ6IHRoaXMubWF4TGVuZ3RoQ2FyZFNob3c/LnRvU3RyaW5nKCkgfHwgKHRoaXMudGFibGVGaWx0ZXJzLml0ZW1zUGVyUGFnZSA/IHRoaXMudGFibGVGaWx0ZXJzLml0ZW1zUGVyUGFnZS50b1N0cmluZygpIDogdGhpcy5wYWdlU2l6ZS50b1N0cmluZygpKSxcbiAgICAgIHBhZ2U6IHRoaXMudGFibGVGaWx0ZXJzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKClcbiAgICB9O1xuICAgIGlmICh0aGlzLnRhYmxlRmlsdGVycy5zZWFyY2hWYWx1ZSkge1xuICAgICAgdGhpcy5wYXJhbXMuc2VhcmNoID0gdGhpcy50YWJsZUZpbHRlcnMuc2VhcmNoVmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRWYXJpYWJsZXMobG9hZGluZ1N1Y2Nlc3M6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm5iSW1nVG9EZWxTZWxlY3RlZCA9IDA7XG4gICAgdGhpcy5kaXNhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRlbExpc3RJbWdMb2FkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmluaXRDb21wb25lbnQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BsYXlQZXhlbHNSZXN1bHRzID0gZmFsc2U7XG4gICAgdGhpcy5mYWlsTG9hZGVkID0gIWxvYWRpbmdTdWNjZXNzO1xuICAgIHRoaXMubmJGYWtlSW1nID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0SW1nU2VsZWN0ZWQgKCkge1xuICAgIGlmICghdGhpcy5pbWdTZWxlY3RlZExpc3QgfHwgIXRoaXMuaW1nU2VsZWN0ZWRMaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlkSW1nU2xlY3RlZExpc3Q6IHN0cmluZ1tdID0gW107XG5cbiAgICB0aGlzLmltZ1NlbGVjdGVkTGlzdC5mb3JFYWNoKGltZyA9PlxuICAgICAgaWRJbWdTbGVjdGVkTGlzdC5wdXNoKGltZy5pZF9maWxlKVxuICAgICk7XG5cbiAgICB0aGlzLnBpY3R1cmVzTGlzdC5mb3JFYWNoKHBpY3R1cmUgPT4ge1xuICAgICAgaWYgKGlkSW1nU2xlY3RlZExpc3QuaW5kZXhPZihwaWN0dXJlLmlkX2ZpbGUpICE9PSAtMSkge1xuICAgICAgICBwaWN0dXJlLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGxheVBleGVsc0xpYiAoKSB7XG4gICAgdGhpcy5kaXNwbGF5UGV4ZWxzUmVzdWx0cyA9IHRydWU7XG4gICAgdGhpcy5hbGVydFNlcnZpY2Uub3BlbkFsZXJ0KHRoaXMubXNnTm9JbWdGb3VuZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgaW1nIGxpc3QgaW4gb3JkZXIgdG8gZmlsbCBwcm9wZXJseSBhbGwgdGhlIGxpbmUgb2YgaW1hZ2VzIGRpc3BsYXllZCBpbiBtb3NhaWMuXG4gICAqIE90aGVyd2lzZSwgdGhlIHNwYWNlLWJldHdlZW4gY3NzIHdpbGwgZG8gYSBiYWQgZGlzcGxheVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVOYkltZ0Zha2UobmJJbWdEaXNwbGF5ZWQ6IG51bWJlcikge1xuICAgIGNvbnN0IG5iSW1nUGVyTGluZSA9IHRoaXMuc3RhdGVEaXNwbGF5ZWQgPT09ICdzbWFsbCcgfHwgdGhpcy50YWJEaXNwbGF5ZWQgPT09ICdpbWctdXBsb2FkJyA/IHRoaXMubmJNYXhJbWdQZXJMaW5lIDogdGhpcy5uYk1pbkltZ1BlckxpbmU7XG5cbiAgICBpZiAobmJJbWdEaXNwbGF5ZWQgJSBuYkltZ1BlckxpbmUgIT09IDApIHtcbiAgICAgIHRoaXMubmJGYWtlSW1nID0gbmJJbWdQZXJMaW5lIC0gbmJJbWdEaXNwbGF5ZWQgJSBuYkltZ1BlckxpbmU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbWcgKGlkX2ZpbGU6IHN0cmluZykge1xuICAgIHRoaXMuaW1nTWFuYWdlci5nZXRTaG9wSW1nKGlkX2ZpbGUpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChwaWN0dXJlKSA9PiB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmltZ0FscmVhZHlFeGlzdChwaWN0dXJlLmlkX2ZpbGUpKSB7XG4gICAgICAgICAgLy8gY2hlY2sgdGhlIGltZyBpcyBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICAgICAgdGhpcy5waWN0dXJlc0xpc3QudW5zaGlmdChwaWN0dXJlKTtcbiAgICAgICAgICB0aGlzLmxlbmd0aCArPSAxO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uub3BlbkFsZXJ0KHRoaXMuZXJyb3JHZXRJbWcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbWdBbHJlYWR5RXhpc3QgKGlkX2ZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgaW1nIG9mIHRoaXMucGljdHVyZXNMaXN0KSB7XG4gICAgICBpZiAoaW1nLmlkX2ZpbGUgPT09IGlkX2ZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TmJJbWdUb0RlbFNlbGVjdGVkICgpIHtcbiAgICB0aGlzLm5iSW1nVG9EZWxTZWxlY3RlZCA9IHRoaXMucGljdHVyZXNMaXN0LmZpbHRlcihpbWcgPT5cbiAgICAgIGltZy5kZWxTZWxlY3RlZCkubGVuZ3RoO1xuXG4gICAgaWYgKCF0aGlzLm5iSW1nVG9EZWxTZWxlY3RlZCkge1xuICAgICAgdGhpcy5jb25maXJtSW1nU3VwID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFdmVudHMoKSB7XG4gICAgLy8gQWRkIGEgdGltZXIgdG8gcmV0cmlldmUgaW1nIHdoZW4gdGhlIHNlYXJjaCBiYXIgb3IgdGhlIHBhZ2luYXRvciBhcmUgdXNlZFxuICAgIHRoaXMuc2VhcmNoUXVlcnlDaGFuZ2VkXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNDAwKSkgLy8gd2FpdCAwLjUgc2VjIGFmdGVyIHRoZSBsYXN0IGV2ZW50IGJlZm9yZSBlbWl0dGluZyBsYXN0IGV2ZW50XG4gICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMuZ2V0SW1nTGlzdCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5maWx0ZXJzQ2hhbmdlZFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpIC8vIHdhaXQgMC44IHNlYyBhZnRlciB0aGUgbGFzdCBldmVudCBiZWZvcmUgZW1pdHRpbmcgbGFzdCBldmVudFxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLl9nZXRJbWdMaXN0KCk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWxvYWQgaW1nIHdoZW4gaW1nIGlzL2FyZSByZW1vdmVkXG4gICAgdGhpcy5pbWdSZW1vdmVkRXZlbnQgPSB0aGlzLmltZ0V2ZW50U2VydmljZS5pbWdSZW1vdmVkJC5zdWJzY3JpYmUoaWRfZmlsZSA9PntcbiAgICAgIHRoaXMuZ2V0SW1nTGlzdCgpO1xuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGltZyBmcm9tIENhbnZhXG4gICAgdGhpcy5pbWdBZGRlZEV2ZW50ID0gdGhpcy5pbWdFdmVudFNlcnZpY2UuZ2V0SW1nQWRkZWRFdmVudExpc3RuZXIoKS5zdWJzY3JpYmUoaWRfZmlsZSA9PntcbiAgICAgIGlmIChpZF9maWxlICYmICF0aGlzLmltZ0FscmVhZHlFeGlzdChpZF9maWxlKSkge1xuICAgICAgICB0aGlzLmdldEltZyhpZF9maWxlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuaW1nU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLmltZ1NlbGVjdGlvbiQuc3Vic2NyaWJlKGltZ1NlbGVjdGlvbiA9PntcbiAgICAgIGlmICh0aGlzLmxpc3REaXNwbGF5ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaWRGaWxlTGlzdCA9IFtdO1xuICAgICAgaW1nU2VsZWN0aW9uLm1hcChpbWcgPT4gaWRGaWxlTGlzdC5wdXNoKGltZy5pZF9maWxlKSk7XG4gICAgICBmb3IgKGNvbnN0IHBpY3R1cmUgb2YgdGhpcy5waWN0dXJlc0xpc3QpIHtcbiAgICAgICAgaWYgKGlkRmlsZUxpc3QuaW5kZXhPZihwaWN0dXJlLmlkX2ZpbGUpID09PSAtMSkge1xuICAgICAgICAgIHBpY3R1cmUuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0SW1nTGlzdCgpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5UGV4ZWxzUmVzdWx0cyA9IGZhbHNlO1xuICAgIHRoaXMuc2V0UGFyYW1zKCk7XG5cbiAgICB0aGlzLnJlZnJlc2hUb3RhbEltZ0xpc3QoKTtcblxuICAgIGNvbnN0IGZvcmNlVG9VcGRhdGUgPSB0aGlzLmlzTGFzdEltZ1JlbW92ZWRJbkxpc3QoKTtcbiAgICB0aGlzLmltZ01hbmFnZXIuZ2V0U2hvcEltZ0xpc3QodGhpcy5wYXJhbXMsIGZvcmNlVG9VcGRhdGUpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdFZhcmlhYmxlcyh0cnVlKTtcbiAgICAgICAgY29uc3QgbmJJbWdEaXNwbGF5ZWQgPSBkYXRhLmRhdGEubGVuZ3RoO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZU5iSW1nRmFrZShuYkltZ0Rpc3BsYXllZCk7XG4gICAgICAgIHRoaXMucGljdHVyZXNMaXN0ID0gZGF0YS5kYXRhO1xuICAgICAgICB0aGlzLnJlbmFtZVBpY3R1cmVTZXJ2aWNlLnNldFBpY3R1cmVzTGlzdCh0aGlzLnBpY3R1cmVzTGlzdCk7XG4gICAgICAgIHRoaXMuc2VsZWN0SW1nU2VsZWN0ZWQoKTtcblxuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuaXNUb3RhbFJldHJpZXZlZCA/IHRoaXMubGVuZ3RoIDogZGF0YS50b3RhbFJlY29yZHM7XG4gICAgICAgIHRoaXMudGFibGVGaWx0ZXJzLnRvdGFsSXRlbXMgPSB0aGlzLmlzVG90YWxSZXRyaWV2ZWQgPyB0aGlzLnRhYmxlRmlsdGVycy50b3RhbEl0ZW1zIDogZGF0YS50b3RhbFJlY29yZHM7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLnRhYmxlRmlsdGVycy50b3RhbEl0ZW1zIDEnLCB0aGlzLnRhYmxlRmlsdGVycy50b3RhbEl0ZW1zKTtcbiAgICAgICAgdGhpcy50YWJsZUZpbHRlcnMuaXRlbXNQZXJQYWdlID0gIHRoaXMudGFibGVGaWx0ZXJzLml0ZW1zUGVyUGFnZSA/ICB0aGlzLnRhYmxlRmlsdGVycy5pdGVtc1BlclBhZ2UgOiB0aGlzLnBhZ2VTaXplO1xuXG4gICAgICAgIC8vIERpc3BsYXkgUGV4ZWxzIGlmIG5vIHJlc3VsdFxuICAgICAgICBpZiAoZGF0YS50b3RhbFJlY29yZHMgPT09IDApIHtcbiAgICAgICAgICB0aGlzLmRpc3BsYXlQZXhlbHNMaWIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7IC8vIEluIHdpemktYWRtaW4sIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGlzIG5vdCB3b3JraW5nIHByb3Blcmx5XG5cbiAgICB9LFxuICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5vcGVuQWxlcnQodGhpcy5lcnJvckdldEFsbEltZyk7XG4gICAgICB0aGlzLmluaXRWYXJpYWJsZXMoZmFsc2UpO1xuICAgIH19KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFRvdGFsSW1nTGlzdCgpIHtcbiAgICBjb25zdCBzZWFyY2hWYWx1ZSA9IHRoaXMudGFibGVGaWx0ZXJzLnNlYXJjaFZhbHVlO1xuXG4gICAgaWYgKHRoaXMuaXNUb3RhbFJldHJpZXZlZCAmJiBzZWFyY2hWYWx1ZSA9PT0gdGhpcy5wcmV2aW91c1NlYXJjaFZhbHVlKSB7XG4gICAgICAvLyBLZWVwIGN1cnJlbnQgdG90YWwgcmVzdWx0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1RvdGFsUmV0cmlldmVkID0gZmFsc2U7XG5cbiAgICB0aGlzLmltZ01hbmFnZXIuZ2V0U2hvcFRvdGFsSW1nTGlzdCh0aGlzLnBhcmFtcykucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogdG90YWwgPT4ge1xuICAgICAgICB0aGlzLnByZXZpb3VzU2VhcmNoVmFsdWUgPSBzZWFyY2hWYWx1ZTtcbiAgICAgICAgdGhpcy5pc1RvdGFsUmV0cmlldmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0b3RhbDtcbiAgICAgICAgdGhpcy50YWJsZUZpbHRlcnMudG90YWxJdGVtcyA9IHRvdGFsO1xuICAgICAgICBjb25zb2xlLmxvZygndGhpcy50YWJsZUZpbHRlcnMudG90YWxJdGVtcyAxJywgdGhpcy50YWJsZUZpbHRlcnMudG90YWxJdGVtcyk7XG5cbiAgICAgIH0sXG5cbiAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgIC8vdGhpcy5hbGVydFNlcnZpY2Uub3BlbkFsZXJ0KHRoaXMuZXJyb3JHZXRUb3RhbEltZyk7XG4gICAgICAgIHRoaXMuaW5pdFZhcmlhYmxlcyhmYWxzZSk7XG4gICAgfX0pO1xuICB9XG5cbiAgc3dpdGNoRGlzcGxheVdpbmRvd01vc2FpYygpIHtcbiAgICB0aGlzLnN3aXRjaERpc3BsYXlXaW5kb3cuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIGlzTGFzdEltZ1JlbW92ZWRJbkxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucGljdHVyZXNMaXN0LnNvbWUocGljdHVyZSA9PiBwaWN0dXJlLmlkX2ZpbGUgPT09IHRoaXMuaW1nRXZlbnRTZXJ2aWNlLmltZ1JlbW92ZWQkLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hRdWVyeUNoYW5nZWQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmltZ1JlbW92ZWRFdmVudC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW1nQWRkZWRFdmVudC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW1nU2VsZWN0aW9uQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbWFnZXMtdmlld1wiIFtuZ0NsYXNzXT1cInsnZnVsbFNpemUnOiBmdWxsU2l6ZSwgJ3NtYWxsJzogc3RhdGVEaXNwbGF5ZWQgPT09ICdzbWFsbCd9XCIgW0BlYXNlSW5PdXRdPVwiJ2luJ1wiPlxuICA8IS0tIFN1YmhlYWRlciA6IEltZyBudW1iZXIgYW5kIGFjdGlvbnMgYnRuIChzdXAgaW1nIGxpc3QsIHN3aXRjaCBmb3JtYSBkaXNwbGF5KSAtLT5cbiAgPGRpdlxuICAqbmdJZj1cIihzdGF0ZURpc3BsYXllZCAhPT0gJ3NtYWxsJyB8fCB0YWJEaXNwbGF5ZWQgPT09ICdpbWctdXBsb2FkJylcIlxuICBjbGFzcz1cImltYWdlcy12aWV3X19jb250YWluZXJcIlxuICBbbmdDbGFzc109XCJ7J2ltYWdlcy12aWV3X19jb250YWluZXItLXVwbG9hZFRhYic6IHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnLCAnaW1hZ2VzLXZpZXdfX2NvbnRhaW5lci0td2luZG93Jzogc3RhdGVEaXNwbGF5ZWQgPT09ICd3aW5kb3cnfVwiXG4gID5cblxuICAgIDxkaXYgKm5nSWY9XCJ0YWJEaXNwbGF5ZWQgIT09ICdpbWctdXBsb2FkJ1wiPlxuICAgICAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiIFtuZ0NsYXNzXT1cInsnaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fdG90YWwtLWhpZGUnOiBkaXNwbGF5UGV4ZWxzUmVzdWx0c31cIj57eyAnSW1nTWFuYWdlci5JbWdMaWIubmJJbWcnIHwgdHJhbnNsYXRlIH19IDoge3tsZW5ndGh9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwidGFiRGlzcGxheWVkID09PSAnaW1nLXVwbG9hZCdcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJtYWluQ29sb3JcIj57eyAnSW1nTWFuYWdlci5JbWdMaWIubGFzdEltZ3MnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgc3ViSGVhZGVyQWN0aW9uc1wiICpuZ0lmPVwidGFiRGlzcGxheWVkICE9PSAnaW1nLXVwbG9hZCdcIj5cblxuICAgICAgICA8IS0tIEZvciBsaXN0Zm9ybWEgOiBEaXNwbGF5IGJ0biBkZWwgbXVsdGlwbGUgaW1nICYgQ29uZmlybSBhY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25cIj5cblxuXG4gICAgICAgICAgICA8IS0tIFNlbGVjdCAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gc3VjY2VzcyBpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25fX2ltcG9ydFwiXG4gICAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVBbm5pbVxuICAgICAgICAgICAgICAqbmdJZj1cImxpc3REaXNwbGF5ZWQgJiYgbmJJbWdUb0RlbFNlbGVjdGVkICYmICFjb25maXJtSW1nU3VwICYmICFkZWxMaXN0SW1nTG9hZGVyICYmIG11bHRpcGxlSW1nTW9kZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbWdDaG9zZW4oKVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgICAgICAgICAge3sgJ0ltZ01hbmFnZXIuSW1nTGliLnNlbGVjdCcgfCB0cmFuc2xhdGUgfX0gKHt7bmJJbWdUb0RlbFNlbGVjdGVkfX0pXG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBEaXNwbGF5IGJ0biBkZWwgbXVsdGlwbGUgaW1nIC0tPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImxpc3REaXNwbGF5ZWQgJiYgbmJJbWdUb0RlbFNlbGVjdGVkICYmICFjb25maXJtSW1nU3VwXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlDb25maXJtSW1nU3VwKClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25fX2RlbEJ0biBkYW5nZXJcIlxuICAgICAgICAgICAgICBAaW5zZXJ0UmVtb3ZlQW5uaW1cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtdGltZXNcIj48L2k+e3sgJ0ltZ01hbmFnZXIuSW1nTGliLmRlbE1sdCcgfCB0cmFuc2xhdGUgfX0gKHt7bmJJbWdUb0RlbFNlbGVjdGVkfX0pXG4gICAgICAgICAgICAgICAgPHNwYW4gYnRuTG9hZGluZ0FuaW0gKm5nSWY9XCJkZWxMaXN0SW1nTG9hZGVyXCIgY2xhc3M9XCJidG5Mb2FkaW5nQW5uaW1hdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIENvbmZpcm0gYWN0aW9uIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fY29uZmlybVN1cFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwLS12aXNpYmxlJzogY29uZmlybUltZ1N1cH1cIj5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIm5iSW1nVG9EZWxTZWxlY3RlZCA+IDFcIiBjbGFzcz1cImltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fY29uZmlybVN1cF9fdGV4dFwiPnt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5jb25maXJtU3VwUXVlc3Rpb25zJyB8IHRyYW5zbGF0ZTp7bmJJbWFnZTogbmJJbWdUb0RlbFNlbGVjdGVkfSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIm5iSW1nVG9EZWxTZWxlY3RlZCA9PT0gMVwiIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwX190ZXh0XCI+e3sgJ0ltZ01hbmFnZXIuSW1nTGliLmNvbmZpcm1TdXBRdWVzdGlvbicgfCB0cmFuc2xhdGU6e25iSW1hZ2U6IG5iSW1nVG9EZWxTZWxlY3RlZH0gfX08L3A+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fY29uZmlybVN1cF9fY2FuY2VsXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsU3VwKClcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ0ltZ01hbmFnZXIuSW1nTGliLmNhbmNlbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlTGlzdEltZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpbWFnZXMtdmlld19fY29udGFpbmVyX19kZWxCdG4gZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDwhLS0gU3dpdGggbW9zYWljL2xpc3QgZm9ybWEgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zIGltYWdlcy12aWV3X19jb250YWluZXJfX2J1dHRvbkJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1saWdodGVkIGltYWdlcy12aWV3X19jb250YWluZXJfX2J1dHRvbkJveF9fYnRuXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aWZEaXNwbGF5ZWQnOiAhbGlzdERpc3BsYXllZH1cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3dpdGNoRm9ybWF0RGlzcGxheWVkKGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXRoXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uIGlzLWxpZ2h0ZWQgaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYnV0dG9uQm94X19idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpZkRpc3BsYXllZCc6IGxpc3REaXNwbGF5ZWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN3aXRjaEZvcm1hdERpc3BsYXllZCh0cnVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYmFyc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuICA8IS0tIEltYWdlcyBzZWN0aW9uIC0tPlxuPG5nLXNjcm9sbGJhclxuICBjbGFzcz1cImltYWdlcy12aWV3X19zY3JvbGxcIlxuICBbbmdDbGFzc109XCJ7XG4gICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLWhpZGUtLW1vc2FpYyc6IGRpc3BsYXlQZXhlbHNSZXN1bHRzICYmICFsaXN0RGlzcGxheWVkLFxuICAgICdpbWFnZXMtdmlld19fc2Nyb2xsLS1oaWRlLS10YWJsZSc6IGRpc3BsYXlQZXhlbHNSZXN1bHRzICYmIGxpc3REaXNwbGF5ZWQsXG4gICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLWZ1bGwnOiBzdGF0ZURpc3BsYXllZCA9PT0gJ2Z1bGwnLFxuICAgICdpbWFnZXMtdmlld19fc2Nyb2xsLS1zbWFsbERpc3BsYXknIDogc3RhdGVEaXNwbGF5ZWQgPT09ICdzbWFsbCcgJiYgdGFiRGlzcGxheWVkICE9PSAnaW1nLXVwbG9hZCcsXG4gICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLXNtYWxsVXBsb2FkRGlzcGxheScgOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJyAmJiB0YWJEaXNwbGF5ZWQgPT09ICdpbWctdXBsb2FkJyxcbiAgICAnaW1hZ2VzLXZpZXdfX3Njcm9sbC0td2luZG93Jzogc3RhdGVEaXNwbGF5ZWQgPT09ICd3aW5kb3cnXG59XCJcbj5cbiAgPGRpdiAjaW1nTGliQ29udGFpbmVyIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX3dyYXBwZXJcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiIWxpc3REaXNwbGF5ZWQgfHwgc3RhdGVEaXNwbGF5ZWQgPT09ICdzbWFsbCdcIiBbQGVhc2VJbk91dF09XCInaW4nXCI+XG4gICAgICA8bW9zYWljLXZpZXdcbiAgICAgICAgW3BpY3R1cmVzTGlzdF09XCJwaWN0dXJlc0xpc3RcIlxuICAgICAgICAocGljdHVyZXNMaXN0Q2hhbmdlKT1cIm9uUGljdHVyZXNMaXN0Q2hhbmdlKClcIlxuICAgICAgICBbdGFibGVGaWx0ZXJzXT1cInRhYmxlRmlsdGVyc1wiXG4gICAgICAgIChmaWx0ZXJzQ2hhbmdlKT1cIm9uRmlsdGVyc0NoYW5nZSgpXCJcbiAgICAgICAgWyhkaXNhYmxlKV09XCJkaXNhYmxlXCJcbiAgICAgICAgKHBpY3R1cmVOYW1lQ2hhbmdlKT1cIm9uUmVuYW1lUGljdHVyZSgkZXZlbnQpXCJcbiAgICAgICAgKHN3aXRjaERpc3BsYXlXaW5kb3cpPVwic3dpdGNoRGlzcGxheVdpbmRvd01vc2FpYygpXCJcbiAgICAgICAgW25iRmFrZUltZ109XCJuYkZha2VJbWdcIlxuICAgICAgICBbc3RhdGVEaXNwbGF5ZWRdPVwic3RhdGVEaXNwbGF5ZWRcIlxuICAgICAgICBbdGFiRGlzcGxheWVkXT1cInRhYkRpc3BsYXllZFwiXG4gICAgICAgIFtkaXNwbGF5UGV4ZWxzUmVzdWx0c109XCJkaXNwbGF5UGV4ZWxzUmVzdWx0c1wiXG4gICAgICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgW2Z1bGxTaXplXT1cImZ1bGxTaXplXCJcbiAgICAgID5cbiAgICAgIDwvbW9zYWljLXZpZXc+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibGlzdERpc3BsYXllZCAmJiBzdGF0ZURpc3BsYXllZCAhPT0gJ3NtYWxsJ1wiIFtAZWFzZUluT3V0XT1cIidpbidcIj5cbiAgICAgIDx0YWJsZS12aWV3XG4gICAgICAgIFtwaWN0dXJlc0xpc3RdPVwicGljdHVyZXNMaXN0XCJcbiAgICAgICAgKHBpY3R1cmVzTGlzdENoYW5nZSk9XCJvblBpY3R1cmVzTGlzdENoYW5nZSgpXCJcbiAgICAgICAgW3RhYmxlRmlsdGVyc109XCJ0YWJsZUZpbHRlcnNcIlxuICAgICAgICAoZmlsdGVyc0NoYW5nZSk9XCJvbkZpbHRlcnNDaGFuZ2UoKVwiXG4gICAgICAgIFsoZGlzYWJsZSldPVwiZGlzYWJsZVwiXG4gICAgICAgIChwaWN0dXJlTmFtZUNoYW5nZSk9XCJvblJlbmFtZVBpY3R1cmUoJGV2ZW50KVwiXG4gICAgICAgIFtkaXNwbGF5UGV4ZWxzUmVzdWx0c109XCJkaXNwbGF5UGV4ZWxzUmVzdWx0c1wiXG4gICAgICAgIFtzdGF0ZURpc3BsYXllZF09XCJzdGF0ZURpc3BsYXllZFwiXG4gICAgICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgPC90YWJsZS12aWV3PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuPC9uZy1zY3JvbGxiYXI+XG5cbjwhLS0gUGV4ZWxzIFNlY3Rpb24gLSBXaGVuIG5vIGltZyBmb3VuZCAtLT5cbjxkaXZcbiAgKm5nSWY9XCJkaXNwbGF5UGV4ZWxzUmVzdWx0c1wiXG4gIGNsYXNzPVwiaW1hZ2VzLXZpZXctLXBleGVsc1wiXG4gIFtAZWFzZUluT3V0XT1cIidpbidcIj5cbiAgPHBleGVscy1saWJcbiAgICBbc2VhcmNoVmFsdWVdPVwidGFibGVGaWx0ZXJzLnNlYXJjaFZhbHVlXCJcbiAgICAoc2hvd0ltZ1VwbG9hZGVkKT1cIm9uU2hvd0ltZ1VwbG9hZGVkKClcIlxuICAgIFtkaXNhYmxlU2VhcmNoXT1cInRydWVcIlxuICA+XG4gIDwvcGV4ZWxzLWxpYj5cbjwvZGl2PlxuIl19
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd3otaW1nLW1hbmFnZXIvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlcy12aWV3L2ltYWdlcy12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3d6LWltZy1tYW5hZ2VyL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZXMtdmlldy9pbWFnZXMtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFpQixNQUFNLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTlILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUczRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRXJGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBVTVELE1BQU0s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LENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7O2dIQXhYVSxtQkFBbUI7b0dBQW5CLG1CQUFtQixrYUN4QmhDLGc3T0FxS2UsZ3VDRGxKRDtRQUNWLFNBQVM7UUFDVCxZQUFZO0tBQ2I7MkZBRVUsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGFBQWEsY0FFWDt3QkFDVixTQUFTO3dCQUNULFlBQVk7cUJBQ2I7d1NBSVEsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRU4sbUJBQW1CO3NCQURsQixNQUFNO2dCQUd1QixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW1nUGljdHVyZURUTywgUGFyYW1zSW1nTWFuYWdlckRUTyB9IGZyb20gJy4uLy4uL2R0by9pbWctbWFuYWdlci5kdG8nO1xuaW1wb3J0IHsgSW1nTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YmplY3QsIGNvbWJpbmVMYXRlc3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEltZ0V2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ltZy1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEltZ1NlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXItc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZUZpbHRlcnMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS9maWx0ZXJzLXRhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGljdHVyZU5hbWVVcGRhdGUgfSBmcm9tICcuLi8uLi9kdG8vcGljdHVyZS1uYW1lLXVwZGF0ZS5kdG8nO1xuaW1wb3J0IHsgZWFzZUluT3V0IH0gZnJvbSAnLi4vLi4vYW5pbWF0aW9ucy9lYXNlSW5PdXQvZWFzZS1pbi1vdXQuYW5pbWF0aW9uJztcbmltcG9ydCB7IGluc2VydFJlbW92ZSB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvaW5zZXJ0UmVtb3ZlL2luc2VydC1yZW1vdmUuYW5pbWF0aW9uJztcbmltcG9ydCB7IHN0YXRlRGlzcGxheWVkLCB0YWJEaXNwbGF5ZWQgfSBmcm9tICcuLi8uLi9kdG8vZXhwb3J0LWR0b3MuYXBpJztcbmltcG9ydCB7IFJlbmFtZVBpY3R1cmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVuYW1lLXBpY3R1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbGVydC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW1hZ2VzLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2VzLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBhbmltYXRpb25zOiBbXG4gICAgZWFzZUluT3V0LFxuICAgIGluc2VydFJlbW92ZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlc1ZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblxuICBASW5wdXQoKSBzdGF0ZURpc3BsYXllZDogc3RhdGVEaXNwbGF5ZWQ7XG4gIEBJbnB1dCgpIHRhYkRpc3BsYXllZDogdGFiRGlzcGxheWVkO1xuICBASW5wdXQoKSBmdWxsU2l6ZTogYm9vbGVhbjtcbiAgQElucHV0KCkgbmJSb3dUb1Nob3c6IG51bWJlcjtcbiAgQElucHV0KCkgbGlzdERpc3BsYXllZCA9IGZhbHNlOyAvLyBEaXNwbGF5IGZvcm1hdCBsaXN0IG9yIG1vc2FpY1xuICBASW5wdXQoKSBtdWx0aXBsZUltZ01vZGUgPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIHN3aXRjaERpc3BsYXlXaW5kb3c6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdpbWdMaWJDb250YWluZXInKSBpbWdMaWJDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gIHdpZHRoTGFyZ2VDYXJkOiBudW1iZXIgPSAyMTk7IC8vIERlZmF1bHQgdmFsdWUgb2YgYSBjYXJkIHdpZHRoIDE5OSArIG1hcmdpbiAyMFxuICB3aWR0aFNtYWxsQ2FyZDogbnVtYmVyID0gMTYwOyAvLyBEZWZhdWx0IHZhbHVlIG9mIGEgY2FyZCB3aWR0aCAxNDAgKyBtYXJnaW4gMjBcbiAgbmJNaW5JbWdQZXJMaW5lOiBudW1iZXI7XG4gIG5iTWF4SW1nUGVyTGluZTogbnVtYmVyO1xuICBuYkZha2VJbWc6IG51bWJlciA9IDA7XG5cbiAgaW1nRnVsbFdpZHRoQ29uZmlnOmFueSA9IFtcbiAgICB7XG4gICAgICBtYXg6IDQxOSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAxLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuNVxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiA0OTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjVcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogNzE5LCAvLyB0YWJsZXRcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4zMzMzXG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDEwMjMsIC8vIGRlc2tvcFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMzMzMyxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjJcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTM5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjI1LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTI1XG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDE1OTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4yLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTExMVxuICAgIH0sXG4gICAge1xuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMTY2NixcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjFcbiAgICB9XG4gIF07XG5cbiAgaW1nV2lkdGhDb25maWc6YW55ID0gW1xuICAgIHtcbiAgICAgIG1heDogMTAyNCxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjI1LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTI1XG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDExOTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4zMzMzLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMlxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxMjk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMzMzMyxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjE2NjZcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTM5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjI1LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTY2NlxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxNTk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xNFxuICAgIH0sXG4gICAge1xuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xMjVcbiAgICB9XG4gIF07XG5cbiAgbmJJbWdUb0RlbFNlbGVjdGVkOiBudW1iZXIgPSAwO1xuICBkaXNhYmxlOiBib29sZWFuID0gZmFsc2U7IC8vIFVzZSB0byBkaXNhYmxlIGFjdGlvbiBkdXJpbmcgc2VydmVyIHJlcXVlc3RcbiAgZGVsTGlzdEltZ0xvYWRlciA9IGZhbHNlO1xuICBpbml0Q29tcG9uZW50OiBib29sZWFuID0gdHJ1ZTtcbiAgZmFpbExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25maXJtSW1nU3VwOmJvb2xlYW4gPSBmYWxzZTtcbiAgcHJldmlvdXNTZWFyY2hWYWx1ZTogc3RyaW5nO1xuXG4gIGdldCBzZWFyY2hJbWFnZXNQYXJhbWV0ZXJzJCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbWdNYW5hZ2VyLnNlYXJjaEltYWdlc1BhcmFtZXRlcnMkO1xuICB9XG5cbiAgLy8gQXBpIEltZyBtYW5hZ2VyIFBhcmFtc1xuICBwYXJhbXM6UGFyYW1zSW1nTWFuYWdlckRUTztcblxuICBwcml2YXRlIGVycm9yR2V0QWxsSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0QWxsSW1nJztcbiAgcHJpdmF0ZSBlcnJvckdldFRvdGFsSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0VG90YWxJbWcnO1xuICBwcml2YXRlIGVycm9yR2V0SW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0Q2FudmFJbWcnO1xuICBwcml2YXRlIGVycm9yUmVtb3ZlSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGlzdC5lcnJvclJlbW92ZUltZyc7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgdm0kID0gY29tYmluZUxhdGVzdCh7XG4gICAgaW1hZ2VTZWxlY3Rpb246IHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5pbWdTZWxlY3Rpb24kLFxuICAgIGltYWdlTGlzdERhdGE6IHRoaXMuaW1nTWFuYWdlci5pbWFnZUxpc3QkLFxuICAgIGlzTG9hZGluZzogdGhpcy5pbWdNYW5hZ2VyLmlzTG9hZGluZyQsXG4gICAgc2VhcmNoSW1hZ2VzUGFyYW1ldGVyczogdGhpcy5pbWdNYW5hZ2VyLnNlYXJjaEltYWdlc1BhcmFtZXRlcnMkLFxuICB9KS5waXBlKFxuICAgIG1hcCgoe2ltYWdlU2VsZWN0aW9uLCBpbWFnZUxpc3REYXRhOiB7aW1hZ2VMaXN0LCBpbWFnZVRvdGFsfSwgaXNMb2FkaW5nLCBzZWFyY2hJbWFnZXNQYXJhbWV0ZXJzfSkgPT4ge1xuICAgICAgdGhpcy5pbml0VmFyaWFibGVzKHRydWUpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVOYkltZ0Zha2UoaW1hZ2VMaXN0LmRhdGEubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHBpY3R1cmVzTGlzdCA9IHRoaXMuc2V0U2VsZWN0ZWRQcm9wZXJ0eShpbWFnZVNlbGVjdGlvbiwgaW1hZ2VMaXN0LmRhdGEpO1xuICAgICAgdGhpcy5yZW5hbWVQaWN0dXJlU2VydmljZS5zZXRQaWN0dXJlc0xpc3QocGljdHVyZXNMaXN0KTtcblxuICAgICAgY29uc3QgdGFibGVGaWx0ZXJzIDogVGFibGVGaWx0ZXJzID0gdGhpcy5nZXRUYWJsZUZpbHRlcnMoc2VhcmNoSW1hZ2VzUGFyYW1ldGVycywgaW1hZ2VUb3RhbCk7XG4gICAgICBjb25zdCBrZWVwSW1hZ2VzRGlzcGxheWVkID0gKHRoaXMudGFiRGlzcGxheWVkID09PSAnaW1nLXVwbG9hZCcgJiYgc2VhcmNoSW1hZ2VzUGFyYW1ldGVycy5wYWdlID09PSAnMScpIHx8ICh0aGlzLnRhYkRpc3BsYXllZCA9PT0gJ2ltYWdlcy12aWV3JyAmJiBpbWFnZUxpc3QuZGF0YS5sZW5ndGggJiYgc2VhcmNoSW1hZ2VzUGFyYW1ldGVycy5wYWdlID09PSAnMScpO1xuXG4gICAgICBjb25zdCBza2lwU2V0SW1hZ2VzVG9EaXNwbGF5ID0gISFwaWN0dXJlc0xpc3Q/Lmxlbmd0aCAmJiB0aGlzLnRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnICYmIHNlYXJjaEltYWdlc1BhcmFtZXRlcnMucGFnZSA9PT0gJzEnO1xuICAgICAgY29uc3QgaGlkZVVudGlsRmV0Y2hlZEZpcnN0UGFnZUltYWdlc0ZvclRhYlVwbG9hZCA9IHRoaXMudGFiRGlzcGxheWVkID09PSAnaW1nLXVwbG9hZCcgJiYgKHNlYXJjaEltYWdlc1BhcmFtZXRlcnMucGFnZSAhPT0gJzEnIHx8IGltYWdlTGlzdD8ucGFnZSAhPT0gMSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTG9hZGluZzogaGlkZVVudGlsRmV0Y2hlZEZpcnN0UGFnZUltYWdlc0ZvclRhYlVwbG9hZCB8fCAha2VlcEltYWdlc0Rpc3BsYXllZCAmJiBpc0xvYWRpbmcsXG4gICAgICAgIGRpc3BsYXlQZXhlbHNSZXN1bHRzOiAhaXNMb2FkaW5nICYmIGltYWdlVG90YWwgPT09IDAsXG4gICAgICAgIHBpY3R1cmVzTGlzdCxcbiAgICAgICAgaW1hZ2VUb3RhbCxcbiAgICAgICAgdGFibGVGaWx0ZXJzLFxuICAgICAgICBza2lwU2V0SW1hZ2VzVG9EaXNwbGF5XG4gICAgICB9XG4gICAgfSlcbiAgKVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW1nTWFuYWdlcjogSW1nTWFuYWdlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbWdFdmVudFNlcnZpY2U6IEltZ0V2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGltZ1NlbGVjdGlvblNlcnZpY2U6IEltZ1NlbGVjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJTZXR0aW5nc1NlcnZpY2U6IFVzZXJTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5hbWVQaWN0dXJlU2VydmljZTogUmVuYW1lUGljdHVyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gIHByaXZhdGUgZ2V0VGFibGVGaWx0ZXJzKHNlYXJjaEltYWdlc1BhcmFtZXRlcnM6IGFueSwgaW1hZ2VUb3RhbDogYW55KTogVGFibGVGaWx0ZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgc29ydDogdW5kZWZpbmVkLFxuICAgICAgb3JkZXI6IHVuZGVmaW5lZCxcbiAgICAgIHNlYXJjaFZhbHVlOiBzZWFyY2hJbWFnZXNQYXJhbWV0ZXJzLnNlYXJjaCxcbiAgICAgIHRvdGFsSXRlbXM6IGltYWdlVG90YWwsXG4gICAgICBpdGVtc1BlclBhZ2U6IHBhcnNlSW50KHNlYXJjaEltYWdlc1BhcmFtZXRlcnMubGltaXQpLFxuICAgICAgY3VycmVudFBhZ2U6IHBhcnNlSW50KHNlYXJjaEltYWdlc1BhcmFtZXRlcnMucGFnZSlcbiAgICB9O1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudm0kLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgZmlsdGVyKCh7c2tpcFNldEltYWdlc1RvRGlzcGxheX0pID0+ICFza2lwU2V0SW1hZ2VzVG9EaXNwbGF5KVxuICAgICAgKS5zdWJzY3JpYmUoKHt0YWJsZUZpbHRlcnN9KSA9PntcbiAgICAgICAgIHRoaXMuc2V0TmJJbWdUb0Rpc3BsYXkodGFibGVGaWx0ZXJzKVxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cnVlIDogZ28gdG8gbGlzdCBkaXNwbGF5XG4gICAqIGZhbHNlIDogZ28gdG8gbW9zYWljIGRpc3BsYXlcbiAgICogQHBhcmFtIGFjdGl2YXRlXG4gICAqL1xuICBvblN3aXRjaEZvcm1hdERpc3BsYXllZChhY3RpdmF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMubGlzdERpc3BsYXllZCA9IGFjdGl2YXRlO1xuICAgIHRoaXMudXNlclNldHRpbmdzU2VydmljZS5zZXRVc2VyRGlzcGxheVByZWZlcmVuY2UoYWN0aXZhdGUpO1xuICAgIHRoaXMuaW1nRXZlbnRTZXJ2aWNlLmVtaXRsaXN0RGlzcGxheWVkQ2hhbmdlKGFjdGl2YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWwgdGhlIG51bWJlciBvZiBpbWcgc2VsZWN0ZWQgZm9yIG1hc3NlIGRlbGV0aW9uXG4gICAqL1xuICBvbkltZ1NlbGVjdGVkKHBpY3R1cmVzTGlzdDogSW1nUGljdHVyZURUT1tdKSB7XG4gICAgdGhpcy5zZXROYkltZ1RvRGVsU2VsZWN0ZWQocGljdHVyZXNMaXN0KTtcbiAgfVxuXG4gIG9uUmVuYW1lUGljdHVyZShwaWN0dXJlUmVuYW1lZDogUGljdHVyZU5hbWVVcGRhdGUpIHtcbiAgICBjb25zb2xlLmxvZygnb25SZW5hbWVQaWN0dXJlIHBpY3R1cmVSZW5hbWVkJywgcGljdHVyZVJlbmFtZWQpO1xuICAgIHRoaXMucmVuYW1lUGljdHVyZVNlcnZpY2UucmVuYW1lUGljdHVyZShwaWN0dXJlUmVuYW1lZCk7XG4gIH1cblxuICByZW1vdmVMaXN0SW1nKHBpY3R1cmVzTGlzdDogSW1nUGljdHVyZURUT1tdKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGUgPSB0cnVlO1xuICAgIHRoaXMuZGVsTGlzdEltZ0xvYWRlciA9IHRydWU7XG4gICAgdGhpcy5jb25maXJtSW1nU3VwID0gZmFsc2U7XG5cbiAgICAvLyBHZXQgdGhlIGlkIG9mIHRoZSBpbWcgdG8gcmVtb3ZlXG4gICAgLy8gQW5kIGFkZCBkZWxldGVkIHByb3BlcnR5XG4gICAgY29uc3QgaWRJbWdUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcbiAgICBwaWN0dXJlc0xpc3QuZm9yRWFjaCggaW1nID0+IHtcbiAgICAgIGlmIChpbWcuZGVsU2VsZWN0ZWQpIHtcbiAgICAgICAgaW1nLmRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICBpZEltZ1RvUmVtb3ZlLnB1c2goaW1nLmlkX2ZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5pbWdNYW5hZ2VyLnJlbW92ZU11bHRpcGxlSW1nKGlkSW1nVG9SZW1vdmUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5yZW1vdmVJbWdTZWxlY3Rpb25CeUlkcyhpZEltZ1RvUmVtb3ZlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmltZ01hbmFnZXIucmVmcmVzaEltYWdlTGlzdCQubmV4dCgpO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5vcGVuQWxlcnQodGhpcy5lcnJvclJlbW92ZUltZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RJbWdDaG9zZW4ocGljdHVyZXNMaXN0OiBJbWdQaWN0dXJlRFRPW10pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBpY3R1cmVzTGlzdFNlbGVjdGVkOiBJbWdQaWN0dXJlRFRPW10gPSBbXTtcbiAgICBwaWN0dXJlc0xpc3QubWFwKGltZyA9PiB7XG4gICAgICBpZihpbWcuZGVsU2VsZWN0ZWQpIHtcbiAgICAgICAgaW1nLmRlbFNlbGVjdGVkID1mYWxzZTtcbiAgICAgICAgaW1nLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbWcuc2VsZWN0ZWQpIHtcbiAgICAgICAgcGljdHVyZXNMaXN0U2VsZWN0ZWQucHVzaChpbWcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2V0TmJJbWdUb0RlbFNlbGVjdGVkKHBpY3R1cmVzTGlzdCk7XG4gICAgdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLnNldEltZ1NlbGVjdGlvbihwaWN0dXJlc0xpc3RTZWxlY3RlZCk7XG4gIH1cblxuICBkaXNwbGF5Q29uZmlybUltZ1N1cCgpe1xuICAgIGlmICh0aGlzLmRpc2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb25maXJtSW1nU3VwID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbmNlbFN1cCgpIHtcbiAgICB0aGlzLmNvbmZpcm1JbWdTdXAgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0IHdoZW4gYSBpbWcgc2VsZWN0ZWQgaW4gb3JkZXIgdG8gZGVsZXRlXG4gICAqL1xuICBvblBpY3R1cmVzTGlzdENoYW5nZShwaWN0dXJlc0xpc3Q6IEltZ1BpY3R1cmVEVE9bXSkge1xuICAgIHRoaXMuc2V0TmJJbWdUb0RlbFNlbGVjdGVkKHBpY3R1cmVzTGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgbnVtYmVyIG9mIGltZyBwZXIgcGFnZSB0byBkaXNwbGF5IGF0IHRoZSBpbml0aWFsaXNhdGlvblxuICAgKiBUaGlzIG51bWJlciBpcyBiZXR3ZWVuIDMwIGFuZCA1MFxuICAgKi9cbiAgcHJpdmF0ZSBzZXROYkltZ1RvRGlzcGxheSh0YWJsZUZpbHRlcnM6IFRhYmxlRmlsdGVycykge1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5pbWdMaWJDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIDMwOyAvLyArIDMwcHggLT4gbGVmdCArIHJpZ2h0IG1hcmdpblxuICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoO1xuXG4gICAgY29uc3QgW21heEltZ1dpZHRoRmFjdG9yLCBtaW5JbWdXaWR0aEZhY3Rvcl0gPSB0aGlzLmdldEltZ1dpZHRoRmFjdG9ycygpO1xuXG4gICAgY29uc3QgbWluSW1nV2lkdGggPSBNYXRoLmZsb29yKGNvbnRhaW5lcldpZHRoICogbWluSW1nV2lkdGhGYWN0b3IpO1xuICAgIGNvbnN0IG1heEltZ1dpZHRoID0gTWF0aC5jZWlsKChjb250YWluZXJXaWR0aCArIHNjcm9sbFdpZHRoICkgKiBtYXhJbWdXaWR0aEZhY3Rvcik7XG5cbiAgICB0aGlzLm5iTWF4SW1nUGVyTGluZSA9IE1hdGguZmxvb3IoY29udGFpbmVyV2lkdGggLyBtaW5JbWdXaWR0aCk7XG4gICAgdGhpcy5uYk1pbkltZ1BlckxpbmUgPSBNYXRoLmZsb29yKCAoY29udGFpbmVyV2lkdGggKyBzY3JvbGxXaWR0aCApIC8gbWF4SW1nV2lkdGgpO1xuXG4gICAgdGhpcy5zZWFyY2hJbWFnZXNQYXJhbWV0ZXJzJC5uZXh0KHRoaXMuZ2V0UGFyYW1zKHtcbiAgICAgIC4uLnRhYmxlRmlsdGVycyxcbiAgICAgIGl0ZW1zUGVyUGFnZTogdGhpcy5nZXRUb3RhbEltZ1BlclBhZ2UoKSxcbiAgICAgIGN1cnJlbnRQYWdlOiAxXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbWdXaWR0aEZhY3RvcnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgbGV0IG1pbldpZHRoOm51bWJlciA9IDA7XG4gICAgbGV0IGltZ1NpemVzQ29uZmlnOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgY29uc3QgY3VycmVudEltZ1dpZHRoQ29uZmlnID0gdGhpcy5mdWxsU2l6ZSA/IHRoaXMuaW1nRnVsbFdpZHRoQ29uZmlnIDogdGhpcy5pbWdXaWR0aENvbmZpZztcblxuICAgIGZvciAoY29uc3Qgd2lkdGhDb25maWcgb2YgY3VycmVudEltZ1dpZHRoQ29uZmlnKSB7XG4gICAgICAgIGlmICghd2lkdGhDb25maWcubWF4KSB7XG4gICAgICAgICAgaW1nU2l6ZXNDb25maWcgPSBbd2lkdGhDb25maWcubGFyZ2VJbWdXaWR0aEZhY3Rvciwgd2lkdGhDb25maWcuc21hbGxJbWdXaWR0aEZhY3Rvcl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbldpZHRoIDwgc2NyZWVuV2lkdGggJiYgc2NyZWVuV2lkdGggPD0gd2lkdGhDb25maWcubWF4KSB7XG4gICAgICAgICAgaW1nU2l6ZXNDb25maWcgPSBbd2lkdGhDb25maWcubGFyZ2VJbWdXaWR0aEZhY3Rvciwgd2lkdGhDb25maWcuc21hbGxJbWdXaWR0aEZhY3Rvcl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbWluV2lkdGggPSB3aWR0aENvbmZpZy5tYXg7XG4gICAgfVxuICAgIHJldHVybiBpbWdTaXplc0NvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG90YWxJbWdQZXJQYWdlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubmJSb3dUb1Nob3cpIHtcbiAgICAgIGNvbnN0IG5iSW1nUGVyTGluZSA9IHRoaXMuc3RhdGVEaXNwbGF5ZWQgPT09ICdmdWxsJyA/IHRoaXMubmJNaW5JbWdQZXJMaW5lIDogdGhpcy5uYk1heEltZ1BlckxpbmU7XG4gICAgICByZXR1cm4gbmJJbWdQZXJMaW5lICogdGhpcy5uYlJvd1RvU2hvdztcbiAgICB9XG5cbiAgICBsZXQgdG90YWwgPSB0aGlzLm5iTWluSW1nUGVyTGluZTtcblxuICAgIHdoaWxlICh0b3RhbCA8IDMwIHx8IHRvdGFsICUgdGhpcy5uYk1heEltZ1BlckxpbmUgIT09IDAgfHwgIHRvdGFsICUgdGhpcy5uYk1pbkltZ1BlckxpbmUgIT09IDApIHtcbiAgICAgIHRvdGFsICs9IHRoaXMubmJNaW5JbWdQZXJMaW5lO1xuICAgIH1cblxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIGdldFBhcmFtcyh0YWJsZUZpbHRlcnM6IFRhYmxlRmlsdGVycykge1xuICAgIHJldHVybiB7XG4gICAgICBsaW1pdDogdGFibGVGaWx0ZXJzLml0ZW1zUGVyUGFnZS50b1N0cmluZygpLFxuICAgICAgcGFnZTogdGFibGVGaWx0ZXJzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKCksXG4gICAgICAgLi4uKHRhYmxlRmlsdGVycy5zZWFyY2hWYWx1ZSAmJiB7IHNlYXJjaDogdGFibGVGaWx0ZXJzLnNlYXJjaFZhbHVlLnRvU3RyaW5nKCkgfSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFZhcmlhYmxlcyhsb2FkaW5nU3VjY2VzczogYm9vbGVhbikge1xuICAgIHRoaXMubmJJbWdUb0RlbFNlbGVjdGVkID0gMDtcbiAgICB0aGlzLmRpc2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmRlbExpc3RJbWdMb2FkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmluaXRDb21wb25lbnQgPSBmYWxzZTtcbiAgICB0aGlzLmZhaWxMb2FkZWQgPSAhbG9hZGluZ1N1Y2Nlc3M7XG4gICAgdGhpcy5uYkZha2VJbWcgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTZWxlY3RlZFByb3BlcnR5KGltZ1NlbGVjdGVkTGlzdDogSW1nUGljdHVyZURUT1tdLCBwaWN0dXJlc0xpc3Q6IEltZ1BpY3R1cmVEVE9bXSkge1xuICAgIGNvbnN0IHBpY3R1cmVzTGlzdFNlbGVjdGVkOiBJbWdQaWN0dXJlRFRPW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBpY3R1cmVzTGlzdCkpO1xuICAgIGltZ1NlbGVjdGVkTGlzdC5mb3JFYWNoKGltZyA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZEltZyA9IHBpY3R1cmVzTGlzdFNlbGVjdGVkLmZpbmQocGljdHVyZSA9PiBwaWN0dXJlLmlkX2ZpbGUgPT09IGltZy5pZF9maWxlKTtcbiAgICAgIGlmIChzZWxlY3RlZEltZykge1xuICAgICAgICBzZWxlY3RlZEltZy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHBpY3R1cmVzTGlzdFNlbGVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGltZyBsaXN0IGluIG9yZGVyIHRvIGZpbGwgcHJvcGVybHkgYWxsIHRoZSBsaW5lIG9mIGltYWdlcyBkaXNwbGF5ZWQgaW4gbW9zYWljLlxuICAgKiBPdGhlcndpc2UsIHRoZSBzcGFjZS1iZXR3ZWVuIGNzcyB3aWxsIGRvIGEgYmFkIGRpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlTmJJbWdGYWtlKG5iSW1nRGlzcGxheWVkOiBudW1iZXIpIHtcbiAgICBjb25zdCBuYkltZ1BlckxpbmUgPSB0aGlzLnN0YXRlRGlzcGxheWVkID09PSAnc21hbGwnIHx8IHRoaXMudGFiRGlzcGxheWVkID09PSAnaW1nLXVwbG9hZCcgPyB0aGlzLm5iTWF4SW1nUGVyTGluZSA6IHRoaXMubmJNaW5JbWdQZXJMaW5lO1xuXG4gICAgaWYgKGlzTmFOKG5iSW1nRGlzcGxheWVkICUgbmJJbWdQZXJMaW5lKSkge1xuICAgICAgdGhpcy5uYkZha2VJbWcgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChuYkltZ0Rpc3BsYXllZCAlIG5iSW1nUGVyTGluZSAhPT0gMCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubmJGYWtlSW1nID0gbmJJbWdQZXJMaW5lIC0gbmJJbWdEaXNwbGF5ZWQgJSBuYkltZ1BlckxpbmU7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE5iSW1nVG9EZWxTZWxlY3RlZCAocGljdHVyZXNMaXN0OiBJbWdQaWN0dXJlRFRPW10pIHtcbiAgICB0aGlzLm5iSW1nVG9EZWxTZWxlY3RlZCA9IHBpY3R1cmVzTGlzdC5maWx0ZXIoaW1nID0+IGltZy5kZWxTZWxlY3RlZCkubGVuZ3RoO1xuXG4gICAgaWYgKCF0aGlzLm5iSW1nVG9EZWxTZWxlY3RlZCkge1xuICAgICAgdGhpcy5jb25maXJtSW1nU3VwID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoRGlzcGxheVdpbmRvd01vc2FpYygpIHtcbiAgICB0aGlzLnN3aXRjaERpc3BsYXlXaW5kb3cuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInZtJCB8IGFzeW5jIGFzIHZtXCI+XG5cbiAgPGRpdiBjbGFzcz1cImltYWdlcy12aWV3XCIgW25nQ2xhc3NdPVwieydmdWxsU2l6ZSc6IGZ1bGxTaXplLCAnc21hbGwnOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJ31cIiBbQGVhc2VJbk91dF09XCInaW4nXCI+XG4gICAgPCEtLSBTdWJoZWFkZXIgOiBJbWcgbnVtYmVyIGFuZCBhY3Rpb25zIGJ0biAoc3VwIGltZyBsaXN0LCBzd2l0Y2ggZm9ybWEgZGlzcGxheSkgLS0+XG4gICAgPGRpdlxuICAgICpuZ0lmPVwiKHN0YXRlRGlzcGxheWVkICE9PSAnc21hbGwnIHx8IHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnKVwiXG4gICAgY2xhc3M9XCJpbWFnZXMtdmlld19fY29udGFpbmVyXCJcbiAgICBbbmdDbGFzc109XCJ7J2ltYWdlcy12aWV3X19jb250YWluZXItLXVwbG9hZFRhYic6IHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnLCAnaW1hZ2VzLXZpZXdfX2NvbnRhaW5lci0td2luZG93Jzogc3RhdGVEaXNwbGF5ZWQgPT09ICd3aW5kb3cnfVwiXG4gICAgPlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwidGFiRGlzcGxheWVkICE9PSAnaW1nLXVwbG9hZCdcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiIFtuZ0NsYXNzXT1cInsnaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fdG90YWwtLWhpZGUnOiB2bS5kaXNwbGF5UGV4ZWxzUmVzdWx0c31cIj57eyAnSW1nTWFuYWdlci5JbWdMaWIubmJJbWcnIHwgdHJhbnNsYXRlIH19IDoge3t2bS5pbWFnZVRvdGFsfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJ0YWJEaXNwbGF5ZWQgPT09ICdpbWctdXBsb2FkJ1wiPlxuICAgICAgICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+e3sgJ0ltZ01hbmFnZXIuSW1nTGliLmxhc3RJbWdzJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9ucyBzdWJIZWFkZXJBY3Rpb25zXCIgKm5nSWY9XCJ0YWJEaXNwbGF5ZWQgIT09ICdpbWctdXBsb2FkJ1wiPlxuXG4gICAgICAgICAgPCEtLSBGb3IgbGlzdGZvcm1hIDogRGlzcGxheSBidG4gZGVsIG11bHRpcGxlIGltZyAmIENvbmZpcm0gYWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25cIj5cblxuXG4gICAgICAgICAgICAgIDwhLS0gU2VsZWN0IC0tPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gc3VjY2VzcyBpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25fX2ltcG9ydFwiXG4gICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZUFubmltXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJsaXN0RGlzcGxheWVkICYmIG5iSW1nVG9EZWxTZWxlY3RlZCAmJiAhY29uZmlybUltZ1N1cCAmJiAhZGVsTGlzdEltZ0xvYWRlciAmJiBtdWx0aXBsZUltZ01vZGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbWdDaG9zZW4odm0ucGljdHVyZXNMaXN0KVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgICAgICAgICAgICB7eyAnSW1nTWFuYWdlci5JbWdMaWIuc2VsZWN0JyB8IHRyYW5zbGF0ZSB9fSAoe3tuYkltZ1RvRGVsU2VsZWN0ZWR9fSlcbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPCEtLSBEaXNwbGF5IGJ0biBkZWwgbXVsdGlwbGUgaW1nIC0tPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJsaXN0RGlzcGxheWVkICYmIG5iSW1nVG9EZWxTZWxlY3RlZCAmJiAhY29uZmlybUltZ1N1cFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlDb25maXJtSW1nU3VwKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fZGVsQnRuIGRhbmdlclwiXG4gICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZUFubmltXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFsIGZhLXRpbWVzXCI+PC9pPnt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5kZWxNbHQnIHwgdHJhbnNsYXRlIH19ICh7e25iSW1nVG9EZWxTZWxlY3RlZH19KVxuICAgICAgICAgICAgICAgICAgPHNwYW4gYnRuTG9hZGluZ0FuaW0gKm5nSWY9XCJkZWxMaXN0SW1nTG9hZGVyXCIgY2xhc3M9XCJidG5Mb2FkaW5nQW5uaW1hdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPCEtLSBDb25maXJtIGFjdGlvbiAtLT5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fY29uZmlybVN1cC0tdmlzaWJsZSc6IGNvbmZpcm1JbWdTdXB9XCI+XG4gICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIm5iSW1nVG9EZWxTZWxlY3RlZCA+IDFcIiBjbGFzcz1cImltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fY29uZmlybVN1cF9fdGV4dFwiPnt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5jb25maXJtU3VwUXVlc3Rpb25zJyB8IHRyYW5zbGF0ZTp7bmJJbWFnZTogbmJJbWdUb0RlbFNlbGVjdGVkfSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwibmJJbWdUb0RlbFNlbGVjdGVkID09PSAxXCIgY2xhc3M9XCJpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25fX2NvbmZpcm1TdXBfX3RleHRcIj57eyAnSW1nTWFuYWdlci5JbWdMaWIuY29uZmlybVN1cFF1ZXN0aW9uJyB8IHRyYW5zbGF0ZTp7bmJJbWFnZTogbmJJbWdUb0RlbFNlbGVjdGVkfSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwX19jYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbFN1cCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5jYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUxpc3RJbWcodm0ucGljdHVyZXNMaXN0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpbWFnZXMtdmlld19fY29udGFpbmVyX19kZWxCdG4gZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICA8IS0tIFN3aXRoIG1vc2FpYy9saXN0IGZvcm1hIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zIGltYWdlcy12aWV3X19jb250YWluZXJfX2J1dHRvbkJveFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1saWdodGVkIGltYWdlcy12aWV3X19jb250YWluZXJfX2J1dHRvbkJveF9fYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpZkRpc3BsYXllZCc6ICFsaXN0RGlzcGxheWVkfVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN3aXRjaEZvcm1hdERpc3BsYXllZChmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS10aFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24gaXMtbGlnaHRlZCBpbWFnZXMtdmlld19fY29udGFpbmVyX19idXR0b25Cb3hfX2J0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aWZEaXNwbGF5ZWQnOiBsaXN0RGlzcGxheWVkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN3aXRjaEZvcm1hdERpc3BsYXllZCh0cnVlKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYmFyc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuXG4gICAgPCEtLSBJbWFnZXMgc2VjdGlvbiAtLT5cbiAgPG5nLXNjcm9sbGJhclxuICAgIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX3Njcm9sbFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLWhpZGUtLW1vc2FpYyc6IHZtLmRpc3BsYXlQZXhlbHNSZXN1bHRzICYmICFsaXN0RGlzcGxheWVkLFxuICAgICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLWhpZGUtLXRhYmxlJzogdm0uZGlzcGxheVBleGVsc1Jlc3VsdHMgJiYgbGlzdERpc3BsYXllZCxcbiAgICAgICdpbWFnZXMtdmlld19fc2Nyb2xsLS1mdWxsJzogc3RhdGVEaXNwbGF5ZWQgPT09ICdmdWxsJyxcbiAgICAgICdpbWFnZXMtdmlld19fc2Nyb2xsLS1zbWFsbERpc3BsYXknIDogc3RhdGVEaXNwbGF5ZWQgPT09ICdzbWFsbCcgJiYgdGFiRGlzcGxheWVkICE9PSAnaW1nLXVwbG9hZCcsXG4gICAgICAnaW1hZ2VzLXZpZXdfX3Njcm9sbC0tc21hbGxVcGxvYWREaXNwbGF5JyA6IHN0YXRlRGlzcGxheWVkID09PSAnc21hbGwnICYmIHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnLFxuICAgICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLXdpbmRvdyc6IHN0YXRlRGlzcGxheWVkID09PSAnd2luZG93J1xuICB9XCJcbiAgPlxuICAgIDxkaXYgI2ltZ0xpYkNvbnRhaW5lciBjbGFzcz1cImltYWdlcy12aWV3X193cmFwcGVyXCI+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsaXN0RGlzcGxheWVkIHx8IHN0YXRlRGlzcGxheWVkID09PSAnc21hbGwnXCIgW0BlYXNlSW5PdXRdPVwiJ2luJ1wiPlxuICAgICAgICAgIDxtb3NhaWMtdmlld1xuICAgICAgICAgICAgW3BpY3R1cmVzTGlzdF09XCJ2bS5waWN0dXJlc0xpc3RcIlxuICAgICAgICAgICAgKHBpY3R1cmVzTGlzdENoYW5nZSk9XCJvblBpY3R1cmVzTGlzdENoYW5nZSh2bS5waWN0dXJlc0xpc3QpXCJcbiAgICAgICAgICAgIFt0YWJsZUZpbHRlcnNdPVwidm0udGFibGVGaWx0ZXJzXCJcbiAgICAgICAgICAgIChmaWx0ZXJzQ2hhbmdlKT1cInNlYXJjaEltYWdlc1BhcmFtZXRlcnMkLm5leHQoZ2V0UGFyYW1zKHZtLnRhYmxlRmlsdGVycykpO1wiXG4gICAgICAgICAgICBbKGRpc2FibGUpXT1cImRpc2FibGVcIlxuICAgICAgICAgICAgKHBpY3R1cmVOYW1lQ2hhbmdlKT1cIm9uUmVuYW1lUGljdHVyZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzd2l0Y2hEaXNwbGF5V2luZG93KT1cInN3aXRjaERpc3BsYXlXaW5kb3dNb3NhaWMoKVwiXG4gICAgICAgICAgICBbbmJGYWtlSW1nXT1cIm5iRmFrZUltZ1wiXG4gICAgICAgICAgICBbc3RhdGVEaXNwbGF5ZWRdPVwic3RhdGVEaXNwbGF5ZWRcIlxuICAgICAgICAgICAgW3RhYkRpc3BsYXllZF09XCJ0YWJEaXNwbGF5ZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlQZXhlbHNSZXN1bHRzXT1cInZtLmRpc3BsYXlQZXhlbHNSZXN1bHRzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmddPVwidm0uaXNMb2FkaW5nXCJcbiAgICAgICAgICAgIFtmdWxsU2l6ZV09XCJmdWxsU2l6ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbW9zYWljLXZpZXc+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJsaXN0RGlzcGxheWVkICYmIHN0YXRlRGlzcGxheWVkICE9PSAnc21hbGwnXCIgW0BlYXNlSW5PdXRdPVwiJ2luJ1wiPlxuICAgICAgICAgIDx0YWJsZS12aWV3XG4gICAgICAgICAgICBbcGljdHVyZXNMaXN0XT1cInZtLnBpY3R1cmVzTGlzdFwiXG4gICAgICAgICAgICAocGljdHVyZXNMaXN0Q2hhbmdlKT1cIm9uUGljdHVyZXNMaXN0Q2hhbmdlKHZtLnBpY3R1cmVzTGlzdClcIlxuICAgICAgICAgICAgW3RhYmxlRmlsdGVyc109XCJ2bS50YWJsZUZpbHRlcnNcIlxuICAgICAgICAgICAgKGZpbHRlcnNDaGFuZ2UpPVwic2VhcmNoSW1hZ2VzUGFyYW1ldGVycyQubmV4dChnZXRQYXJhbXModm0udGFibGVGaWx0ZXJzKSk7XCJcbiAgICAgICAgICAgIFsoZGlzYWJsZSldPVwiZGlzYWJsZVwiXG4gICAgICAgICAgICAocGljdHVyZU5hbWVDaGFuZ2UpPVwib25SZW5hbWVQaWN0dXJlKCRldmVudClcIlxuICAgICAgICAgICAgW2Rpc3BsYXlQZXhlbHNSZXN1bHRzXT1cInZtLmRpc3BsYXlQZXhlbHNSZXN1bHRzXCJcbiAgICAgICAgICAgIFtzdGF0ZURpc3BsYXllZF09XCJzdGF0ZURpc3BsYXllZFwiXG4gICAgICAgICAgICBbaXNMb2FkaW5nXT1cInZtLmlzTG9hZGluZ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC90YWJsZS12aWV3PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1zY3JvbGxiYXI+XG5cbiAgPCEtLSBQZXhlbHMgU2VjdGlvbiAtIFdoZW4gbm8gaW1nIGZvdW5kIC0tPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJ2bS5kaXNwbGF5UGV4ZWxzUmVzdWx0c1wiXG4gICAgY2xhc3M9XCJpbWFnZXMtdmlldy0tcGV4ZWxzXCJcbiAgICBbQGVhc2VJbk91dF09XCInaW4nXCI+XG4gICAgPHBleGVscy1saWJcbiAgICAgIFtzZWFyY2hWYWx1ZV09XCJ2bS50YWJsZUZpbHRlcnMuc2VhcmNoVmFsdWVcIlxuICAgICAgW2Rpc2FibGVTZWFyY2hdPVwidHJ1ZVwiXG4gICAgPlxuICAgIDwvcGV4ZWxzLWxpYj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj4iXX0=