@provoly/dashboard 0.23.3 → 0.23.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.d.ts +11 -7
  2. package/admin/i18n/fr.translations.d.ts +1 -0
  3. package/assets/svgs/six_dot.svg +15 -0
  4. package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +9 -4
  5. package/esm2022/admin/i18n/fr.translations.mjs +3 -2
  6. package/esm2022/lib/core/components/share/group-share/group-share.component.mjs +28 -15
  7. package/esm2022/lib/core/components/share/share.utils.mjs +19 -0
  8. package/esm2022/lib/core/public-api.mjs +2 -1
  9. package/esm2022/lib/dashboard/store/dashboard.effects.mjs +2 -2
  10. package/esm2022/lib/dashboard/store/manifest.service.mjs +1 -1
  11. package/esm2022/presentation/components/presentation.component.mjs +23 -4
  12. package/esm2022/toolbox/components/save-view/save-view.component.mjs +1 -1
  13. package/esm2022/toolbox/components/share/share.component.mjs +1 -1
  14. package/fesm2022/provoly-dashboard-admin.mjs +10 -4
  15. package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
  16. package/fesm2022/provoly-dashboard-presentation.mjs +22 -3
  17. package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
  18. package/fesm2022/provoly-dashboard-toolbox.mjs +2 -2
  19. package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
  20. package/fesm2022/provoly-dashboard.mjs +47 -15
  21. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  22. package/lib/core/components/share/group-share/group-share.component.d.ts +12 -3
  23. package/lib/core/components/share/share.utils.d.ts +4 -0
  24. package/lib/core/public-api.d.ts +1 -0
  25. package/lib/dashboard/store/manifest.service.d.ts +1 -5
  26. package/package.json +42 -42
  27. package/presentation/components/presentation.component.d.ts +5 -1
  28. package/styles-theme/components-theme/_a-btn.theme.scss +0 -1
@@ -1,7 +1,7 @@
1
1
  import { OverlayConfig } from '@angular/cdk/overlay';
2
2
  import { TemplatePortal } from '@angular/cdk/portal';
3
3
  import { Component, Input, TemplateRef, ViewChild } from '@angular/core';
4
- import { DashboardActions, DashboardGridLayout, DashboardSelectors, SubscriptionnerDirective, ViewMode } from '@provoly/dashboard';
4
+ import { DashboardActions, DashboardGridLayout, DashboardSelectors, DataSourceSelectors, PryVisibilityType, SubscriptionnerDirective, ViewMode, canManifestBeMadePublic, getCommonDatasourceGroupsForManifest } from '@provoly/dashboard';
5
5
  import { BehaviorSubject, combineLatest, map, startWith } from 'rxjs';
6
6
  import { v4 } from 'uuid';
7
7
  import * as i0 from "@angular/core";
@@ -69,6 +69,25 @@ export class PryPresentationComponent extends SubscriptionnerDirective {
69
69
  (!!inputSearchQuery && (name.includes(inputSearchQuery) || description?.includes(inputSearchQuery)))
70
70
  : true;
71
71
  })));
72
+ this.disableShareRadios$ = combineLatest([
73
+ this.selectedPresentation$,
74
+ this.store.select(DataSourceSelectors.datasets)
75
+ ]).pipe(map(([presentation, datasets]) => {
76
+ return {
77
+ [PryVisibilityType.PRIVATE]: false,
78
+ [PryVisibilityType.PUBLIC]: presentation ? !canManifestBeMadePublic(presentation, datasets) : true,
79
+ [PryVisibilityType.RESTRICTED]: presentation
80
+ ? !(canManifestBeMadePublic(presentation, datasets) ||
81
+ getCommonDatasourceGroupsForManifest(presentation, datasets).length > 0)
82
+ : true
83
+ };
84
+ }));
85
+ this.allowedShareGroups$ = combineLatest([
86
+ this.selectedPresentation$,
87
+ this.store.select(DataSourceSelectors.datasets)
88
+ ]).pipe(map(([presentation, datasets]) => {
89
+ return presentation ? getCommonDatasourceGroupsForManifest(presentation, datasets) : [];
90
+ }));
72
91
  this.subscriptions.add(this.store.select(DashboardSelectors.presentation).subscribe((presentation) => {
73
92
  this.selectedMode = presentation?.viewMode ?? this.ViewMode.CATALOG;
74
93
  this.selectedPresentation$.next(presentation.current ?? null);
@@ -200,11 +219,11 @@ export class PryPresentationComponent extends SubscriptionnerDirective {
200
219
  });
201
220
  }
202
221
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PryPresentationComponent, deps: [{ token: i1.Store }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i3.Router }, { token: i4.PryTitleService }, { token: i3.ActivatedRoute }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
203
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: PryPresentationComponent, selector: "pry-presentation", inputs: { editionStartUrl: "editionStartUrl", consultStartUrl: "consultStartUrl", meAsOwner: "meAsOwner", mode: "mode", listOfManifests: "listOfManifests", hideToolbox: "hideToolbox", search: "search" }, viewQueries: [{ propertyName: "templateModalActions", first: true, predicate: ["modalActions"], descendants: true, read: TemplateRef }, { propertyName: "template", first: true, predicate: ["modal"], descendants: true, read: TemplateRef }, { propertyName: "openModal", first: true, predicate: ["openModal"], descendants: true }, { propertyName: "confirm", first: true, predicate: ["confirm"], descendants: true }, { propertyName: "submit", first: true, predicate: ["submit"], descendants: true }, { propertyName: "cross", first: true, predicate: ["cross"], descendants: true }, { propertyName: "crossVisibility", first: true, predicate: ["crossVisibility"], descendants: true }, { propertyName: "visibilityModal", first: true, predicate: ["visibilityModal"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-presentation-css></pry-presentation-css>\n<div class=\"o-manifest-layout\" [ngSwitch]=\"selectedMode\">\n <ng-container *ngSwitchDefault>\n <div class=\"o-manifest-layout__toolbox\" [class.-u-hidden]=\"hideToolbox\">\n <button\n class=\"a-btn a-btn--primary\"\n type=\"button\"\n (click)=\"creation()\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'create' }\"\n >\n <pry-icon iconSvg=\"add\"></pry-icon>\n {{ '@pry.presentation.create' | i18n }}\n </button>\n <div>\n <div class=\"o-manifest-layout__toolbox__search\">\n <label id=\"catalog-search-label\" for=\"catalog-search\" class=\"u-visually-hidden\">\n <span>{{ '@pry.toolbox.catalog.filter.name' | i18n }}</span>\n </label>\n <input\n id=\"catalog-search\"\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'@pry.presentation.search' | i18n\"\n [ngModel]=\"search$ | async\"\n (ngModelChange)=\"this.search$.next($event)\"\n />\n <pry-icon class=\"search-icon\" iconSvg=\"search\" [width]=\"17\" [height]=\"17\"></pry-icon>\n </div>\n </div>\n </div>\n <div class=\"o-manifest-layout__content\">\n <h1 class=\"a-h1\">{{ '@pry.presentation.title' | i18n }}</h1>\n <div class=\"o-presentation-wrapper\">\n <ul class=\"o-presentation\">\n <li\n class=\"o-presentation__item\"\n *ngFor=\"let presentation of filteredPresentations$ | async; let index = index\"\n >\n <div class=\"o-presentation__item__header\">\n <ng-container *ngIf=\"presentation.groups.length === 0\">\n <pry-icon\n iconSvg=\"private\"\n class=\"is-private a-tooltip -tooltip-no-wrap\"\n [attr.data-tooltip]=\"'@pry.presentation.private' | i18n\"\n [height]=\"17\"\n [width]=\"17\"\n ></pry-icon>\n </ng-container>\n <div\n class=\"a-tooltip -tooltip-no-wrap\"\n (click)=\"fetch(presentation)\"\n [attr.data-tooltip]=\"'@pry.presentation.view' | i18n\"\n >\n <div class=\"o-presentation__item__image\">\n <img\n alt=\"\"\n [class.is-full-width]=\"presentation.cover\"\n [src]=\"presentation.image | getSecuredImage | async\"\n />\n </div>\n </div>\n <ng-container *ngIf=\"presentation.owner\">\n <div class=\"more-button\" *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'share' }\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--more a-tooltip -tooltip-no-wrap\"\n [id]=\"'more-button-' + index\"\n [attr.data-tooltip]=\"'@pry.restitution.more' | i18n\"\n (click)=\"$event.stopPropagation(); toggleModalActions(presentation, button)\"\n #button\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"more_horiz\"></pry-icon>\n </button>\n </div>\n </ng-container>\n </div>\n <div class=\"o-presentation__item__txt\" (click)=\"fetch(presentation)\">\n <div class=\"o-presentation__item__title-container\" ellipsis textElementSelector=\".a-h3\">\n <h3 class=\"a-h3\">{{ presentation.name }}</h3>\n </div>\n <div class=\"o-presentation__item__description-container\" ellipsis textElementSelector=\".a-p\">\n <div class=\"o-presentation__item__description a-p\">\n {{ presentation.description }}\n </div>\n </div>\n <p class=\"a-p -date\">{{ presentation.modificationDate | sinceDate }}</p>\n </div>\n <div\n class=\"o-presentation__item__footer a-tooltip -tooltip-no-wrap\"\n (click)=\"fetch(presentation)\"\n [attr.data-tooltip]=\"'@pry.presentation.view' | i18n\"\n >\n <button class=\"a-btn\">\n {{ '@pry.presentation.consult' | i18n }}\n <pry-icon [width]=\"20\" [height]=\"20\" iconSvg=\"arrow_right\"></pry-icon>\n </button>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"ViewMode.CREATION\">\n <pry-add-edit-presentation\n [selectedPresentation]=\"selectedPresentation$ | async\"\n (goBack)=\"closeRestitution()\"\n [editionStartUrl]=\"editionStartUrl\"\n [edition]=\"false\"\n [mode]=\"mode\"\n ></pry-add-edit-presentation>\n </ng-container>\n <ng-container *ngSwitchCase=\"ViewMode.EDITION\">\n <pry-add-edit-presentation\n [selectedPresentation]=\"selectedPresentation$ | async\"\n (goBack)=\"closeRestitution()\"\n [editionStartUrl]=\"editionStartUrl\"\n [edition]=\"true\"\n [mode]=\"mode\"\n ></pry-add-edit-presentation>\n </ng-container>\n</div>\n\n<ng-template #modal>\n <div\n class=\"o-modal\"\n #visibilityModal\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog change visibility\"\n *ngIf=\"selectedPresentation$ | async as selectedPresentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">{{ '@pry.toolbox.share' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button\n class=\"a-btn a-btn--icon-only\"\n #crossVisibility\n (keydown.shift.tab)=\"focusValidation()\"\n (click)=\"toggleModal()\"\n >\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-group-share [ngModel]=\"selectedPresentation.groups\" (ngModelChange)=\"accessGroups = $event\"></pry-group-share>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"toggleModal()\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n class=\"a-btn a-btn--primary\"\n #submit\n (keydown.tab)=\"focusCrossElement()\"\n (click)=\"changeVisibility(selectedPresentation)\"\n >\n {{ '@pry.toolbox.manifest.check' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n<ng-template #modalActions>\n <div class=\"m-context-menu\">\n <ul\n class=\"m-context-menu__list\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog presentation options\"\n *ngIf=\"selectedPresentation$ | async as selectedPresentation\"\n >\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n (click)=\"edit(selectedPresentation)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'edit' }\"\n >\n {{ '@pry.presentation.edition' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n (click)=\"editContent(selectedPresentation)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'edit' }\"\n >\n {{ '@pry.presentation.editionContent' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n (click)=\"toggleModal(selectedPresentation)\"\n class=\"a-btn -link-like\"\n aria-haspopup=\"dialog\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'share' }\"\n >\n {{ '@pry.presentation.share' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n #openModal\n (click)=\"delete(selectedPresentation.id)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'delete' }\"\n >\n {{ '@pry.presentation.delete' | i18n }}\n </button>\n </li>\n </ul>\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i4.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "directive", type: i4.EllipsisDirective, selector: "[ellipsis]", inputs: ["textElementSelector"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i4.PryGroupShareComponent, selector: "pry-group-share" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i7.PryAddEditPresentationComponent, selector: "pry-add-edit-presentation", inputs: ["edition", "editionStartUrl", "selectedPresentation", "mode"], outputs: ["goBack"] }, { kind: "component", type: i8.PryPresentationCssComponent, selector: "pry-presentation-css" }, { kind: "pipe", type: i4.GetSecuredImagePipe, name: "getSecuredImage" }, { kind: "pipe", type: i9.PrySinceDatePipe, name: "sinceDate" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
222
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: PryPresentationComponent, selector: "pry-presentation", inputs: { editionStartUrl: "editionStartUrl", consultStartUrl: "consultStartUrl", meAsOwner: "meAsOwner", mode: "mode", listOfManifests: "listOfManifests", hideToolbox: "hideToolbox", search: "search" }, viewQueries: [{ propertyName: "templateModalActions", first: true, predicate: ["modalActions"], descendants: true, read: TemplateRef }, { propertyName: "template", first: true, predicate: ["modal"], descendants: true, read: TemplateRef }, { propertyName: "openModal", first: true, predicate: ["openModal"], descendants: true }, { propertyName: "confirm", first: true, predicate: ["confirm"], descendants: true }, { propertyName: "submit", first: true, predicate: ["submit"], descendants: true }, { propertyName: "cross", first: true, predicate: ["cross"], descendants: true }, { propertyName: "crossVisibility", first: true, predicate: ["crossVisibility"], descendants: true }, { propertyName: "visibilityModal", first: true, predicate: ["visibilityModal"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-presentation-css></pry-presentation-css>\n<div class=\"o-manifest-layout\" [ngSwitch]=\"selectedMode\">\n <ng-container *ngSwitchDefault>\n <div class=\"o-manifest-layout__toolbox\" [class.-u-hidden]=\"hideToolbox\">\n <button\n class=\"a-btn a-btn--primary\"\n type=\"button\"\n (click)=\"creation()\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'create' }\"\n >\n <pry-icon iconSvg=\"add\"></pry-icon>\n {{ '@pry.presentation.create' | i18n }}\n </button>\n <div>\n <div class=\"o-manifest-layout__toolbox__search\">\n <label id=\"catalog-search-label\" for=\"catalog-search\" class=\"u-visually-hidden\">\n <span>{{ '@pry.toolbox.catalog.filter.name' | i18n }}</span>\n </label>\n <input\n id=\"catalog-search\"\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'@pry.presentation.search' | i18n\"\n [ngModel]=\"search$ | async\"\n (ngModelChange)=\"this.search$.next($event)\"\n />\n <pry-icon class=\"search-icon\" iconSvg=\"search\" [width]=\"17\" [height]=\"17\"></pry-icon>\n </div>\n </div>\n </div>\n <div class=\"o-manifest-layout__content\">\n <h1 class=\"a-h1\">{{ '@pry.presentation.title' | i18n }}</h1>\n <div class=\"o-presentation-wrapper\">\n <ul class=\"o-presentation\">\n <li\n class=\"o-presentation__item\"\n *ngFor=\"let presentation of filteredPresentations$ | async; let index = index\"\n >\n <div class=\"o-presentation__item__header\">\n <ng-container *ngIf=\"presentation.groups.length === 0\">\n <pry-icon\n iconSvg=\"private\"\n class=\"is-private a-tooltip -tooltip-no-wrap\"\n [attr.data-tooltip]=\"'@pry.presentation.private' | i18n\"\n [height]=\"17\"\n [width]=\"17\"\n ></pry-icon>\n </ng-container>\n <div\n class=\"a-tooltip -tooltip-no-wrap\"\n (click)=\"fetch(presentation)\"\n [attr.data-tooltip]=\"'@pry.presentation.view' | i18n\"\n >\n <div class=\"o-presentation__item__image\">\n <img\n alt=\"\"\n [class.is-full-width]=\"presentation.cover\"\n [src]=\"presentation.image | getSecuredImage | async\"\n />\n </div>\n </div>\n <ng-container *ngIf=\"presentation.owner\">\n <div class=\"more-button\" *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'share' }\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--more a-tooltip -tooltip-no-wrap\"\n [id]=\"'more-button-' + index\"\n [attr.data-tooltip]=\"'@pry.restitution.more' | i18n\"\n (click)=\"$event.stopPropagation(); toggleModalActions(presentation, button)\"\n #button\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"more_horiz\"></pry-icon>\n </button>\n </div>\n </ng-container>\n </div>\n <div class=\"o-presentation__item__txt\" (click)=\"fetch(presentation)\">\n <div class=\"o-presentation__item__title-container\" ellipsis textElementSelector=\".a-h3\">\n <h3 class=\"a-h3\">{{ presentation.name }}</h3>\n </div>\n <div class=\"o-presentation__item__description-container\" ellipsis textElementSelector=\".a-p\">\n <div class=\"o-presentation__item__description a-p\">\n {{ presentation.description }}\n </div>\n </div>\n <p class=\"a-p -date\">{{ presentation.modificationDate | sinceDate }}</p>\n </div>\n <div\n class=\"o-presentation__item__footer a-tooltip -tooltip-no-wrap\"\n (click)=\"fetch(presentation)\"\n [attr.data-tooltip]=\"'@pry.presentation.view' | i18n\"\n >\n <button class=\"a-btn\">\n {{ '@pry.presentation.consult' | i18n }}\n <pry-icon [width]=\"20\" [height]=\"20\" iconSvg=\"arrow_right\"></pry-icon>\n </button>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"ViewMode.CREATION\">\n <pry-add-edit-presentation\n [selectedPresentation]=\"selectedPresentation$ | async\"\n (goBack)=\"closeRestitution()\"\n [editionStartUrl]=\"editionStartUrl\"\n [edition]=\"false\"\n [mode]=\"mode\"\n ></pry-add-edit-presentation>\n </ng-container>\n <ng-container *ngSwitchCase=\"ViewMode.EDITION\">\n <pry-add-edit-presentation\n [selectedPresentation]=\"selectedPresentation$ | async\"\n (goBack)=\"closeRestitution()\"\n [editionStartUrl]=\"editionStartUrl\"\n [edition]=\"true\"\n [mode]=\"mode\"\n ></pry-add-edit-presentation>\n </ng-container>\n</div>\n\n<ng-template #modal>\n <div\n class=\"o-modal\"\n #visibilityModal\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog change visibility\"\n *ngIf=\"selectedPresentation$ | async as selectedPresentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">{{ '@pry.toolbox.share' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button\n class=\"a-btn a-btn--icon-only\"\n #crossVisibility\n (keydown.shift.tab)=\"focusValidation()\"\n (click)=\"toggleModal()\"\n >\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-group-share\n [ngModel]=\"selectedPresentation.groups\"\n (ngModelChange)=\"accessGroups = $event\"\n [disableRadios]=\"disableShareRadios$ | async\"\n [allowedGroups]=\"allowedShareGroups$ | async\"\n ></pry-group-share>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"toggleModal()\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n class=\"a-btn a-btn--primary\"\n #submit\n (keydown.tab)=\"focusCrossElement()\"\n (click)=\"changeVisibility(selectedPresentation)\"\n >\n {{ '@pry.toolbox.manifest.check' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n<ng-template #modalActions>\n <div class=\"m-context-menu\">\n <ul\n class=\"m-context-menu__list\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog presentation options\"\n *ngIf=\"selectedPresentation$ | async as selectedPresentation\"\n >\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n (click)=\"edit(selectedPresentation)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'edit' }\"\n >\n {{ '@pry.presentation.edition' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n (click)=\"editContent(selectedPresentation)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'edit' }\"\n >\n {{ '@pry.presentation.editionContent' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n (click)=\"toggleModal(selectedPresentation)\"\n class=\"a-btn -link-like\"\n aria-haspopup=\"dialog\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'share' }\"\n >\n {{ '@pry.presentation.share' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n #openModal\n (click)=\"delete(selectedPresentation.id)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'delete' }\"\n >\n {{ '@pry.presentation.delete' | i18n }}\n </button>\n </li>\n </ul>\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i4.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "directive", type: i4.EllipsisDirective, selector: "[ellipsis]", inputs: ["textElementSelector"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i4.PryGroupShareComponent, selector: "pry-group-share", inputs: ["disableRadios", "allowedGroups"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i7.PryAddEditPresentationComponent, selector: "pry-add-edit-presentation", inputs: ["edition", "editionStartUrl", "selectedPresentation", "mode"], outputs: ["goBack"] }, { kind: "component", type: i8.PryPresentationCssComponent, selector: "pry-presentation-css" }, { kind: "pipe", type: i4.GetSecuredImagePipe, name: "getSecuredImage" }, { kind: "pipe", type: i9.PrySinceDatePipe, name: "sinceDate" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
204
223
  }
205
224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PryPresentationComponent, decorators: [{
206
225
  type: Component,
207
- args: [{ selector: 'pry-presentation', template: "<pry-presentation-css></pry-presentation-css>\n<div class=\"o-manifest-layout\" [ngSwitch]=\"selectedMode\">\n <ng-container *ngSwitchDefault>\n <div class=\"o-manifest-layout__toolbox\" [class.-u-hidden]=\"hideToolbox\">\n <button\n class=\"a-btn a-btn--primary\"\n type=\"button\"\n (click)=\"creation()\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'create' }\"\n >\n <pry-icon iconSvg=\"add\"></pry-icon>\n {{ '@pry.presentation.create' | i18n }}\n </button>\n <div>\n <div class=\"o-manifest-layout__toolbox__search\">\n <label id=\"catalog-search-label\" for=\"catalog-search\" class=\"u-visually-hidden\">\n <span>{{ '@pry.toolbox.catalog.filter.name' | i18n }}</span>\n </label>\n <input\n id=\"catalog-search\"\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'@pry.presentation.search' | i18n\"\n [ngModel]=\"search$ | async\"\n (ngModelChange)=\"this.search$.next($event)\"\n />\n <pry-icon class=\"search-icon\" iconSvg=\"search\" [width]=\"17\" [height]=\"17\"></pry-icon>\n </div>\n </div>\n </div>\n <div class=\"o-manifest-layout__content\">\n <h1 class=\"a-h1\">{{ '@pry.presentation.title' | i18n }}</h1>\n <div class=\"o-presentation-wrapper\">\n <ul class=\"o-presentation\">\n <li\n class=\"o-presentation__item\"\n *ngFor=\"let presentation of filteredPresentations$ | async; let index = index\"\n >\n <div class=\"o-presentation__item__header\">\n <ng-container *ngIf=\"presentation.groups.length === 0\">\n <pry-icon\n iconSvg=\"private\"\n class=\"is-private a-tooltip -tooltip-no-wrap\"\n [attr.data-tooltip]=\"'@pry.presentation.private' | i18n\"\n [height]=\"17\"\n [width]=\"17\"\n ></pry-icon>\n </ng-container>\n <div\n class=\"a-tooltip -tooltip-no-wrap\"\n (click)=\"fetch(presentation)\"\n [attr.data-tooltip]=\"'@pry.presentation.view' | i18n\"\n >\n <div class=\"o-presentation__item__image\">\n <img\n alt=\"\"\n [class.is-full-width]=\"presentation.cover\"\n [src]=\"presentation.image | getSecuredImage | async\"\n />\n </div>\n </div>\n <ng-container *ngIf=\"presentation.owner\">\n <div class=\"more-button\" *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'share' }\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--more a-tooltip -tooltip-no-wrap\"\n [id]=\"'more-button-' + index\"\n [attr.data-tooltip]=\"'@pry.restitution.more' | i18n\"\n (click)=\"$event.stopPropagation(); toggleModalActions(presentation, button)\"\n #button\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"more_horiz\"></pry-icon>\n </button>\n </div>\n </ng-container>\n </div>\n <div class=\"o-presentation__item__txt\" (click)=\"fetch(presentation)\">\n <div class=\"o-presentation__item__title-container\" ellipsis textElementSelector=\".a-h3\">\n <h3 class=\"a-h3\">{{ presentation.name }}</h3>\n </div>\n <div class=\"o-presentation__item__description-container\" ellipsis textElementSelector=\".a-p\">\n <div class=\"o-presentation__item__description a-p\">\n {{ presentation.description }}\n </div>\n </div>\n <p class=\"a-p -date\">{{ presentation.modificationDate | sinceDate }}</p>\n </div>\n <div\n class=\"o-presentation__item__footer a-tooltip -tooltip-no-wrap\"\n (click)=\"fetch(presentation)\"\n [attr.data-tooltip]=\"'@pry.presentation.view' | i18n\"\n >\n <button class=\"a-btn\">\n {{ '@pry.presentation.consult' | i18n }}\n <pry-icon [width]=\"20\" [height]=\"20\" iconSvg=\"arrow_right\"></pry-icon>\n </button>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"ViewMode.CREATION\">\n <pry-add-edit-presentation\n [selectedPresentation]=\"selectedPresentation$ | async\"\n (goBack)=\"closeRestitution()\"\n [editionStartUrl]=\"editionStartUrl\"\n [edition]=\"false\"\n [mode]=\"mode\"\n ></pry-add-edit-presentation>\n </ng-container>\n <ng-container *ngSwitchCase=\"ViewMode.EDITION\">\n <pry-add-edit-presentation\n [selectedPresentation]=\"selectedPresentation$ | async\"\n (goBack)=\"closeRestitution()\"\n [editionStartUrl]=\"editionStartUrl\"\n [edition]=\"true\"\n [mode]=\"mode\"\n ></pry-add-edit-presentation>\n </ng-container>\n</div>\n\n<ng-template #modal>\n <div\n class=\"o-modal\"\n #visibilityModal\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog change visibility\"\n *ngIf=\"selectedPresentation$ | async as selectedPresentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">{{ '@pry.toolbox.share' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button\n class=\"a-btn a-btn--icon-only\"\n #crossVisibility\n (keydown.shift.tab)=\"focusValidation()\"\n (click)=\"toggleModal()\"\n >\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-group-share [ngModel]=\"selectedPresentation.groups\" (ngModelChange)=\"accessGroups = $event\"></pry-group-share>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"toggleModal()\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n class=\"a-btn a-btn--primary\"\n #submit\n (keydown.tab)=\"focusCrossElement()\"\n (click)=\"changeVisibility(selectedPresentation)\"\n >\n {{ '@pry.toolbox.manifest.check' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n<ng-template #modalActions>\n <div class=\"m-context-menu\">\n <ul\n class=\"m-context-menu__list\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog presentation options\"\n *ngIf=\"selectedPresentation$ | async as selectedPresentation\"\n >\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n (click)=\"edit(selectedPresentation)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'edit' }\"\n >\n {{ '@pry.presentation.edition' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n (click)=\"editContent(selectedPresentation)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'edit' }\"\n >\n {{ '@pry.presentation.editionContent' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n (click)=\"toggleModal(selectedPresentation)\"\n class=\"a-btn -link-like\"\n aria-haspopup=\"dialog\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'share' }\"\n >\n {{ '@pry.presentation.share' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n #openModal\n (click)=\"delete(selectedPresentation.id)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'delete' }\"\n >\n {{ '@pry.presentation.delete' | i18n }}\n </button>\n </li>\n </ul>\n </div>\n</ng-template>\n" }]
226
+ args: [{ selector: 'pry-presentation', template: "<pry-presentation-css></pry-presentation-css>\n<div class=\"o-manifest-layout\" [ngSwitch]=\"selectedMode\">\n <ng-container *ngSwitchDefault>\n <div class=\"o-manifest-layout__toolbox\" [class.-u-hidden]=\"hideToolbox\">\n <button\n class=\"a-btn a-btn--primary\"\n type=\"button\"\n (click)=\"creation()\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'create' }\"\n >\n <pry-icon iconSvg=\"add\"></pry-icon>\n {{ '@pry.presentation.create' | i18n }}\n </button>\n <div>\n <div class=\"o-manifest-layout__toolbox__search\">\n <label id=\"catalog-search-label\" for=\"catalog-search\" class=\"u-visually-hidden\">\n <span>{{ '@pry.toolbox.catalog.filter.name' | i18n }}</span>\n </label>\n <input\n id=\"catalog-search\"\n type=\"text\"\n class=\"a-form-field\"\n [placeholder]=\"'@pry.presentation.search' | i18n\"\n [ngModel]=\"search$ | async\"\n (ngModelChange)=\"this.search$.next($event)\"\n />\n <pry-icon class=\"search-icon\" iconSvg=\"search\" [width]=\"17\" [height]=\"17\"></pry-icon>\n </div>\n </div>\n </div>\n <div class=\"o-manifest-layout__content\">\n <h1 class=\"a-h1\">{{ '@pry.presentation.title' | i18n }}</h1>\n <div class=\"o-presentation-wrapper\">\n <ul class=\"o-presentation\">\n <li\n class=\"o-presentation__item\"\n *ngFor=\"let presentation of filteredPresentations$ | async; let index = index\"\n >\n <div class=\"o-presentation__item__header\">\n <ng-container *ngIf=\"presentation.groups.length === 0\">\n <pry-icon\n iconSvg=\"private\"\n class=\"is-private a-tooltip -tooltip-no-wrap\"\n [attr.data-tooltip]=\"'@pry.presentation.private' | i18n\"\n [height]=\"17\"\n [width]=\"17\"\n ></pry-icon>\n </ng-container>\n <div\n class=\"a-tooltip -tooltip-no-wrap\"\n (click)=\"fetch(presentation)\"\n [attr.data-tooltip]=\"'@pry.presentation.view' | i18n\"\n >\n <div class=\"o-presentation__item__image\">\n <img\n alt=\"\"\n [class.is-full-width]=\"presentation.cover\"\n [src]=\"presentation.image | getSecuredImage | async\"\n />\n </div>\n </div>\n <ng-container *ngIf=\"presentation.owner\">\n <div class=\"more-button\" *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'share' }\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--more a-tooltip -tooltip-no-wrap\"\n [id]=\"'more-button-' + index\"\n [attr.data-tooltip]=\"'@pry.restitution.more' | i18n\"\n (click)=\"$event.stopPropagation(); toggleModalActions(presentation, button)\"\n #button\n >\n <pry-icon [height]=\"25\" [width]=\"25\" iconSvg=\"more_horiz\"></pry-icon>\n </button>\n </div>\n </ng-container>\n </div>\n <div class=\"o-presentation__item__txt\" (click)=\"fetch(presentation)\">\n <div class=\"o-presentation__item__title-container\" ellipsis textElementSelector=\".a-h3\">\n <h3 class=\"a-h3\">{{ presentation.name }}</h3>\n </div>\n <div class=\"o-presentation__item__description-container\" ellipsis textElementSelector=\".a-p\">\n <div class=\"o-presentation__item__description a-p\">\n {{ presentation.description }}\n </div>\n </div>\n <p class=\"a-p -date\">{{ presentation.modificationDate | sinceDate }}</p>\n </div>\n <div\n class=\"o-presentation__item__footer a-tooltip -tooltip-no-wrap\"\n (click)=\"fetch(presentation)\"\n [attr.data-tooltip]=\"'@pry.presentation.view' | i18n\"\n >\n <button class=\"a-btn\">\n {{ '@pry.presentation.consult' | i18n }}\n <pry-icon [width]=\"20\" [height]=\"20\" iconSvg=\"arrow_right\"></pry-icon>\n </button>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"ViewMode.CREATION\">\n <pry-add-edit-presentation\n [selectedPresentation]=\"selectedPresentation$ | async\"\n (goBack)=\"closeRestitution()\"\n [editionStartUrl]=\"editionStartUrl\"\n [edition]=\"false\"\n [mode]=\"mode\"\n ></pry-add-edit-presentation>\n </ng-container>\n <ng-container *ngSwitchCase=\"ViewMode.EDITION\">\n <pry-add-edit-presentation\n [selectedPresentation]=\"selectedPresentation$ | async\"\n (goBack)=\"closeRestitution()\"\n [editionStartUrl]=\"editionStartUrl\"\n [edition]=\"true\"\n [mode]=\"mode\"\n ></pry-add-edit-presentation>\n </ng-container>\n</div>\n\n<ng-template #modal>\n <div\n class=\"o-modal\"\n #visibilityModal\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog change visibility\"\n *ngIf=\"selectedPresentation$ | async as selectedPresentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">{{ '@pry.toolbox.share' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button\n class=\"a-btn a-btn--icon-only\"\n #crossVisibility\n (keydown.shift.tab)=\"focusValidation()\"\n (click)=\"toggleModal()\"\n >\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-group-share\n [ngModel]=\"selectedPresentation.groups\"\n (ngModelChange)=\"accessGroups = $event\"\n [disableRadios]=\"disableShareRadios$ | async\"\n [allowedGroups]=\"allowedShareGroups$ | async\"\n ></pry-group-share>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"toggleModal()\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n class=\"a-btn a-btn--primary\"\n #submit\n (keydown.tab)=\"focusCrossElement()\"\n (click)=\"changeVisibility(selectedPresentation)\"\n >\n {{ '@pry.toolbox.manifest.check' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n<ng-template #modalActions>\n <div class=\"m-context-menu\">\n <ul\n class=\"m-context-menu__list\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog presentation options\"\n *ngIf=\"selectedPresentation$ | async as selectedPresentation\"\n >\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n (click)=\"edit(selectedPresentation)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'edit' }\"\n >\n {{ '@pry.presentation.edition' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n (click)=\"editContent(selectedPresentation)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'edit' }\"\n >\n {{ '@pry.presentation.editionContent' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n (click)=\"toggleModal(selectedPresentation)\"\n class=\"a-btn -link-like\"\n aria-haspopup=\"dialog\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'share' }\"\n >\n {{ '@pry.presentation.share' | i18n }}\n </button>\n </li>\n <li class=\"m-context-menu__list__item\">\n <button\n class=\"a-btn -link-like\"\n #openModal\n (click)=\"delete(selectedPresentation.id)\"\n [disabled]=\"!selectedPresentation.owner\"\n *pryAccess=\"{ module: 'dashboard', page: 'manifest', action: 'delete' }\"\n >\n {{ '@pry.presentation.delete' | i18n }}\n </button>\n </li>\n </ul>\n </div>\n</ng-template>\n" }]
208
227
  }], ctorParameters: () => [{ type: i1.Store }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i3.Router }, { type: i4.PryTitleService }, { type: i3.ActivatedRoute }, { type: i0.NgZone }], propDecorators: { templateModalActions: [{
209
228
  type: ViewChild,
210
229
  args: ['modalActions', { read: TemplateRef }]
@@ -244,4 +263,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImpor
244
263
  }], search: [{
245
264
  type: Input
246
265
  }] } });
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2VudGF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3ByZXNlbnRhdGlvbi9jb21wb25lbnRzL3ByZXNlbnRhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9wcmVzZW50YXRpb24vY29tcG9uZW50cy9wcmVzZW50YXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFXLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxXQUFXLEVBQUUsU0FBUyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUcvRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUVuQixrQkFBa0IsRUFHbEIsd0JBQXdCLEVBQ3hCLFFBQVEsRUFDVCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7QUFNMUIsTUFBTSxPQUFPLHdCQUF5QixTQUFRLHdCQUF3QjtJQTBCcEUsSUFBYSxlQUFlLENBQUMsU0FBdUM7UUFDbEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFJRCxJQUFhLE1BQU0sQ0FBQyxLQUFhO1FBQy9CLElBQUksQ0FB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QkFBWixLQUFLO2dCQUVPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFFTyxNQUFNO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBOZ1pvbmUsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBEYXNoYm9hcmRBY3Rpb25zLFxuICBEYXNoYm9hcmRHcmlkTGF5b3V0LFxuICBEYXNoYm9hcmRNYW5pZmVzdCxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBNYW5pZmVzdERlc2NyaXB0aW9uLFxuICBQcnlUaXRsZVNlcnZpY2UsXG4gIFN1YnNjcmlwdGlvbm5lckRpcmVjdGl2ZSxcbiAgVmlld01vZGVcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBzdGFydFdpdGggfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHY0IH0gZnJvbSAndXVpZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS1wcmVzZW50YXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJlc2VudGF0aW9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBQcnlQcmVzZW50YXRpb25Db21wb25lbnQgZXh0ZW5kcyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUge1xuICBtYW5pZmVzdHMkOiBPYnNlcnZhYmxlPE1hbmlmZXN0RGVzY3JpcHRpb25bXT47XG4gIHNlbGVjdGVkUHJlc2VudGF0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWFuaWZlc3REZXNjcmlwdGlvbiB8IG51bGw+KG51bGwpO1xuICBwcmVzZW50YXRpb24/OiBNYW5pZmVzdERlc2NyaXB0aW9uO1xuICBzdGF0aWNNYW5pZmVzdCQ/OiBPYnNlcnZhYmxlPERhc2hib2FyZE1hbmlmZXN0PjtcbiAgc2VsZWN0ZWRNb2RlOiBWaWV3TW9kZSA9IFZpZXdNb2RlLkNBVEFMT0c7XG4gIG1vZGFsT3BlbmVkID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ21vZGFsQWN0aW9ucycsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgdGVtcGxhdGVNb2RhbEFjdGlvbnMhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdtb2RhbCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgdGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdvcGVuTW9kYWwnKSBvcGVuTW9kYWwhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY29uZmlybScpIGNvbmZpcm0hOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc3VibWl0Jykgc3VibWl0ITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Nyb3NzJykgY3Jvc3MhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnY3Jvc3NWaXNpYmlsaXR5JykgY3Jvc3NWaXNpYmlsaXR5ITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3Zpc2liaWxpdHlNb2RhbCcpIHZpc2liaWxpdHlNb2RhbCE6IEVsZW1lbnRSZWY7XG4gIG92ZXJsYXlSZWY/OiBPdmVybGF5UmVmO1xuICBhY2Nlc3NHcm91cHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIGVkaXRpb25TdGFydFVybDogc3RyaW5nID0gJy8nO1xuICBASW5wdXQoKSBjb25zdWx0U3RhcnRVcmw6IHN0cmluZyA9ICcvJztcbiAgQElucHV0KCkgbWVBc093bmVyPzogc3RyaW5nO1xuICBWaWV3TW9kZSA9IFZpZXdNb2RlO1xuICBzZWFyY2gkID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIGZpbHRlcmVkUHJlc2VudGF0aW9ucyQ6IE9ic2VydmFibGU8TWFuaWZlc3REZXNjcmlwdGlvbltdPjtcbiAgbGlzdE9mTWFuaWZlc3RzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWFuaWZlc3REZXNjcmlwdGlvbltdIHwgbnVsbD4obnVsbCk7XG4gIEBJbnB1dCgpIG1vZGU6ICd0aGVtZScgfCAnbWV0YScgPSAnbWV0YSc7XG5cbiAgQElucHV0KCkgc2V0IGxpc3RPZk1hbmlmZXN0cyhtYW5pZmVzdHM6IE1hbmlmZXN0RGVzY3JpcHRpb25bXSB8IG51bGwpIHtcbiAgICB0aGlzLmxpc3RPZk1hbmlmZXN0cyQubmV4dChBcnJheS5pc0FycmF5KG1hbmlmZXN0cykgPyBtYW5pZmVzdHMgOiBudWxsKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGhpZGVUb29sYm94ID0gZmFsc2U7XG4gIGlucHV0U2VhcmNoJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICBASW5wdXQoKSBzZXQgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlucHV0U2VhcmNoJC5uZXh0KHF1ZXJ5KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBzdG9yZTogU3RvcmU8YW55PixcbiAgICBwcm90ZWN0ZWQgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcm90ZWN0ZWQgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIHRpdGxlU2VydmljZTogUHJ5VGl0bGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJvdGVjdGVkIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHBhcmFtc1snY3JlYXRlJ10pIHtcbiAgICAgICAgICB0aGlzLmNyZWF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuZmV0Y2hNYW5pZmVzdHNMaXN0KCkpO1xuICAgIHRoaXMubWFuaWZlc3RzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZVxuICAgICAgICAuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5tYW5pZmVzdHNMaXN0KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKG1hbmlmZXN0TGlzdCkgPT5cbiAgICAgICAgICAgIFsuLi5tYW5pZmVzdExpc3RdLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgIGEubW9kaWZpY2F0aW9uRGF0ZSA/IGIubW9kaWZpY2F0aW9uRGF0ZS5sb2NhbGVDb21wYXJlKGEubW9kaWZpY2F0aW9uRGF0ZSkgOiAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgdGhpcy5saXN0T2ZNYW5pZmVzdHMkXG4gICAgXSkucGlwZShtYXAoKFtkeW5hbWljcywgc3RhdGljc10pID0+IHN0YXRpY3MgPz8gZHluYW1pY3MpKTtcblxuICAgIHRoaXMuc3RhdGljTWFuaWZlc3QkID0gdGhpcy5zdG9yZVxuICAgICAgLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuc3RhdGljTWFuaWZlc3QpXG4gICAgICAucGlwZShtYXAoKHN0YXRpY00pID0+IHN0YXRpY00ud2luZG93c1swXSkpO1xuICAgIHRoaXMuZmlsdGVyZWRQcmVzZW50YXRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5tYW5pZmVzdHMkLFxuICAgICAgdGhpcy5zZWFyY2gkLFxuICAgICAgdGhpcy5pbnB1dFNlYXJjaCQucGlwZShzdGFydFdpdGgoJycpKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtwcmVzZW50YXRpb25zLCBzZWFyY2gsIGlucHV0U2VhcmNoXSkgPT5cbiAgICAgICAgcHJlc2VudGF0aW9ucy5maWx0ZXIoKHByZXNlbnRhdGlvbnMpID0+IHtcbiAgICAgICAgICBjb25zdCBbbmFtZSwgZGVzY3JpcHRpb25dID0gW3ByZXNlbnRhdGlvbnMubmFtZS50b0xvd2VyQ2FzZSgpLCBwcmVzZW50YXRpb25zLmRlc2NyaXB0aW9uPy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICBjb25zdCBbc2VhcmNoUXVlcnksIGlucHV0U2VhcmNoUXVlcnldID0gW3NlYXJjaD8udG9Mb3dlckNhc2UoKSwgaW5wdXRTZWFyY2g/LnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgIHJldHVybiAhIXNlYXJjaFF1ZXJ5IHx8ICEhaW5wdXRTZWFyY2hRdWVyeVxuICAgICAgICAgICAgPyAoISFzZWFyY2hRdWVyeSAmJiAobmFtZS5pbmNsdWRlcyhzZWFyY2hRdWVyeSkgfHwgZGVzY3JpcHRpb24/LmluY2x1ZGVzKHNlYXJjaFF1ZXJ5KSkpIHx8XG4gICAgICAgICAgICAgICAgKCEhaW5wdXRTZWFyY2hRdWVyeSAmJiAobmFtZS5pbmNsdWRlcyhpbnB1dFNlYXJjaFF1ZXJ5KSB8fCBkZXNjcmlwdGlvbj8uaW5jbHVkZXMoaW5wdXRTZWFyY2hRdWVyeSkpKVxuICAgICAgICAgICAgOiB0cnVlO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5wcmVzZW50YXRpb24pLnN1YnNjcmliZSgocHJlc2VudGF0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlID0gcHJlc2VudGF0aW9uPy52aWV3TW9kZSA/PyB0aGlzLlZpZXdNb2RlLkNBVEFMT0c7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZW50YXRpb24kLm5leHQocHJlc2VudGF0aW9uLmN1cnJlbnQgPz8gbnVsbCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy50aXRsZVNlcnZpY2UuY2hhbmdlVGl0bGUoJ0BwcnkucHJlc2VudGF0aW9uLnRpdGxlJyk7XG4gIH1cblxuICBjbG9zZVJlc3RpdHV0aW9uKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRQcmVzZW50YXRpb24kLm5leHQobnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZE1vZGUgPSBWaWV3TW9kZS5DQVRBTE9HO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5zZWxlY3RQcmVzZW50YXRpb24oeyBwcmVzZW50YXRpb246IHVuZGVmaW5lZCwgdmlld01vZGU6IFZpZXdNb2RlLkNBVEFMT0cgfSkpO1xuICB9XG5cbiAgZmV0Y2gocHJlc2VudGF0aW9uOiBNYW5pZmVzdERlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmxvYWRQcmVzZW50YXRpb24oeyBwcmVzZW50YXRpb24sIHZpZXdNb2RlOiBWaWV3TW9kZS5DT05TVUxUIH0pKTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3V0ZXI/Lm5hdmlnYXRlQnlVcmwodGhpcy5jb25zdWx0U3RhcnRVcmwpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRpb24oKSB7XG4gICAgdGhpcy5zZWxlY3RlZE1vZGUgPSBWaWV3TW9kZS5DUkVBVElPTjtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlTWFuaWZlc3QoeyBtYW5pZmVzdDogeyB3aW5kb3dzOiBbXSB9LCBzZWxlY3RlZElkczogW10gfSkpO1xuICAgIGNvbnN0IG5ld1ByZXNlbnRhdGlvbiA9IHtcbiAgICAgIHByZXNlbnRhdGlvbjoge1xuICAgICAgICBpZDogdjQoKSxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIGdyb3VwczogW10gYXMgc3RyaW5nW10sXG4gICAgICAgIG93bmVyOiB0cnVlXG4gICAgICB9IGFzIE1hbmlmZXN0RGVzY3JpcHRpb24sXG4gICAgICB2aWV3TW9kZTogVmlld01vZGUuQ1JFQVRJT05cbiAgICB9O1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5zZWxlY3RQcmVzZW50YXRpb24obmV3UHJlc2VudGF0aW9uKSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnNldEdyaWRMYXlvdXQoeyBsYXlvdXQ6IERhc2hib2FyZEdyaWRMYXlvdXQuRlVMTCB9KSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZURpc3BsYXlPcHRpb25zKHsgbW9kZTogVmlld01vZGUuQ1JFQVRJT04gfSkpO1xuICB9XG5cbiAgZWRpdChwcmVzZW50YXRpb246IE1hbmlmZXN0RGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZSA9IFZpZXdNb2RlLkVESVRJT047XG4gICAgdGhpcy5zZWxlY3RlZFByZXNlbnRhdGlvbiQubmV4dChwcmVzZW50YXRpb24pO1xuICAgIHRoaXMudGl0bGVTZXJ2aWNlLmNoYW5nZVRpdGxlKHByZXNlbnRhdGlvbi5uYW1lKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuc2VsZWN0UHJlc2VudGF0aW9uKHsgcHJlc2VudGF0aW9uLCB2aWV3TW9kZTogVmlld01vZGUuRURJVElPTiB9KSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmZldGNoU3RhdGljTWFuaWZlc3QoeyBpZDogcHJlc2VudGF0aW9uLmlkIH0pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGlzcGxheU9wdGlvbnMoeyBtb2RlOiBWaWV3TW9kZS5FRElUSU9OIH0pKTtcbiAgICB0aGlzLm92ZXJsYXlSZWY/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWxldGUoaWQ6IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5jb25maXJtTWFuaWZlc3REZWxldGlvbih7IGlkIH0pKTtcbiAgICB0aGlzLnRvZ2dsZU1vZGFsQWN0aW9ucygpO1xuICB9XG5cbiAgdG9nZ2xlTW9kYWxBY3Rpb25zKHByZXNlbnRhdGlvbj86IE1hbmlmZXN0RGVzY3JpcHRpb24gfCBudWxsLCBtb3JlQnV0dG9uPzogSFRNTEJ1dHRvbkVsZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZiAmJiBwcmVzZW50YXRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZW50YXRpb24kLm5leHQocHJlc2VudGF0aW9uKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5zZWxlY3RQcmVzZW50YXRpb24oeyBwcmVzZW50YXRpb24sIHZpZXdNb2RlOiBWaWV3TW9kZS5DQVRBTE9HIH0pKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5sb2FkTWFuaWZlc3QoeyBpZDogcHJlc2VudGF0aW9uLmlkIH0pKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ20tY29udGV4dC1tZW51LXdyYXBwZXInXSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AnXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2dnbGVNb2RhbEFjdGlvbnMocHJlc2VudGF0aW9uKSk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlTW9kYWxBY3Rpb25zLCB0aGlzLnZpZXdDb250YWluZXJSZWYpKTtcbiAgICAgIGNvbnN0IGNvbnRleHRNZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZGl2Lm0tY29udGV4dC1tZW51JykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBpZiAoISFjb250ZXh0TWVudSAmJiBtb3JlQnV0dG9uKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBtb3JlQnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb250ZXh0TWVudS5zdHlsZS5taW5XaWR0aCA9ICcxODVweCc7XG4gICAgICAgIGNvbnRleHRNZW51LnN0eWxlLmxlZnQgPSAocmVjdD8ubGVmdCA/PyAwKSAtIChjb250ZXh0TWVudT8uY2xpZW50V2lkdGggPz8gMCkgKyAyMyArICdweCc7XG4gICAgICAgIGNvbnRleHRNZW51LnN0eWxlLnRvcCA9IChyZWN0Py50b3AgPz8gMCkgKyAzMCArICdweCc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zZWxlY3RlZFByZXNlbnRhdGlvbiQubmV4dChudWxsKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVNb2RhbChwcmVzZW50YXRpb24/OiBNYW5pZmVzdERlc2NyaXB0aW9uIHwgbnVsbCkge1xuICAgIHRoaXMubW9kYWxPcGVuZWQgPSAhdGhpcy5tb2RhbE9wZW5lZDtcbiAgICBpZiAodGhpcy5tb2RhbE9wZW5lZCAmJiBwcmVzZW50YXRpb24pIHtcbiAgICAgIHRoaXMudG9nZ2xlTW9kYWxBY3Rpb25zKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2VudGF0aW9uJC5uZXh0KHByZXNlbnRhdGlvbik7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuc2VsZWN0UHJlc2VudGF0aW9uKHsgcHJlc2VudGF0aW9uLCB2aWV3TW9kZTogVmlld01vZGUuQ0FUQUxPRyB9KSk7XG4gICAgICAvKiB3ZSBuZWVkIHRvIGxvYWQgbWFuaWZlc3QgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzYXZlIGl0IGxhdGVyICovXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMubG9hZE1hbmlmZXN0KHsgaWQ6IHByZXNlbnRhdGlvbi5pZCB9KSk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLW1vZGFsLXdyYXBwZXInXSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AnXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2dnbGVNb2RhbChwcmVzZW50YXRpb24pKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMudGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy52aXNpYmlsaXR5TW9kYWwubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXS5jaGlsZHJlblsxXS5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICAgICAgZm9jdXMuZm9jdXMoKTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vdmVybGF5UmVmPy5kaXNwb3NlKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2VudGF0aW9uJC5uZXh0KG51bGwpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVZpc2liaWxpdHkocHJlc2VudGF0aW9uPzogTWFuaWZlc3REZXNjcmlwdGlvbikge1xuICAgIGlmIChwcmVzZW50YXRpb24pIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgIERhc2hib2FyZEFjdGlvbnMuc2F2ZU1hbmlmZXN0KHtcbiAgICAgICAgICBpZDogcHJlc2VudGF0aW9uLmlkID8/ICcnLFxuICAgICAgICAgIG5hbWU6IHByZXNlbnRhdGlvbi5uYW1lID8/ICcnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwcmVzZW50YXRpb24uZGVzY3JpcHRpb24sXG4gICAgICAgICAgaW1hZ2U6IHByZXNlbnRhdGlvbi5pbWFnZSA/PyAnJyxcbiAgICAgICAgICBjb3ZlcjogcHJlc2VudGF0aW9uLmNvdmVyID8/IGZhbHNlLFxuICAgICAgICAgIGdyb3VwczogdGhpcy5hY2Nlc3NHcm91cHNcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudG9nZ2xlTW9kYWwocHJlc2VudGF0aW9uKTtcbiAgfVxuXG4gIGZvY3VzQ3Jvc3NFbGVtZW50KCkge1xuICAgIGlmICh0aGlzLmNyb3NzVmlzaWJpbGl0eSkge1xuICAgICAgdGhpcy5jcm9zc1Zpc2liaWxpdHk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgdGhpcy5jcm9zcz8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgZm9jdXNWYWxpZGF0aW9uKCkge1xuICAgIGlmICh0aGlzLmNvbmZpcm0pIHtcbiAgICAgIHRoaXMuY29uZmlybS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIHRoaXMuc3VibWl0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGVkaXRDb250ZW50KHNlbGVjdGVkUHJlc2VudGF0aW9uOiBNYW5pZmVzdERlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMubG9hZFByZXNlbnRhdGlvbih7IHByZXNlbnRhdGlvbjogc2VsZWN0ZWRQcmVzZW50YXRpb24sIHZpZXdNb2RlOiBWaWV3TW9kZS5FRElUSU9OIH0pXG4gICAgKTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3V0ZXI/Lm5hdmlnYXRlQnlVcmwodGhpcy5jb25zdWx0U3RhcnRVcmwpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8cHJ5LXByZXNlbnRhdGlvbi1jc3M+PC9wcnktcHJlc2VudGF0aW9uLWNzcz5cbjxkaXYgY2xhc3M9XCJvLW1hbmlmZXN0LWxheW91dFwiIFtuZ1N3aXRjaF09XCJzZWxlY3RlZE1vZGVcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgIDxkaXYgY2xhc3M9XCJvLW1hbmlmZXN0LWxheW91dF9fdG9vbGJveFwiIFtjbGFzcy4tdS1oaWRkZW5dPVwiaGlkZVRvb2xib3hcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiY3JlYXRpb24oKVwiXG4gICAgICAgICpwcnlBY2Nlc3M9XCJ7IG1vZHVsZTogJ2Rhc2hib2FyZCcsIHBhZ2U6ICdtYW5pZmVzdCcsIGFjdGlvbjogJ2NyZWF0ZScgfVwiXG4gICAgICA+XG4gICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiYWRkXCI+PC9wcnktaWNvbj5cbiAgICAgICAge3sgJ0BwcnkucHJlc2VudGF0aW9uLmNyZWF0ZScgfCBpMThuIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvLW1hbmlmZXN0LWxheW91dF9fdG9vbGJveF9fc2VhcmNoXCI+XG4gICAgICAgICAgPGxhYmVsIGlkPVwiY2F0YWxvZy1zZWFyY2gtbGFiZWxcIiBmb3I9XCJjYXRhbG9nLXNlYXJjaFwiIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdAcHJ5LnRvb2xib3guY2F0YWxvZy5maWx0ZXIubmFtZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cImNhdGFsb2ctc2VhcmNoXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQHByeS5wcmVzZW50YXRpb24uc2VhcmNoJyB8IGkxOG5cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRoaXMuc2VhcmNoJC5uZXh0KCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHByeS1pY29uIGNsYXNzPVwic2VhcmNoLWljb25cIiBpY29uU3ZnPVwic2VhcmNoXCIgW3dpZHRoXT1cIjE3XCIgW2hlaWdodF09XCIxN1wiPjwvcHJ5LWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm8tbWFuaWZlc3QtbGF5b3V0X19jb250ZW50XCI+XG4gICAgICA8aDEgY2xhc3M9XCJhLWgxXCI+e3sgJ0BwcnkucHJlc2VudGF0aW9uLnRpdGxlJyB8IGkxOG4gfX08L2gxPlxuICAgICAgPGRpdiBjbGFzcz1cIm8tcHJlc2VudGF0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgPHVsIGNsYXNzPVwiby1wcmVzZW50YXRpb25cIj5cbiAgICAgICAgICA8bGlcbiAgICAgICAgICAgIGNsYXNzPVwiby1wcmVzZW50YXRpb25fX2l0ZW1cIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByZXNlbnRhdGlvbiBvZiBmaWx0ZXJlZFByZXNlbnRhdGlvbnMkIHwgYXN5bmM7IGxldCBpbmRleCA9IGluZGV4XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1wcmVzZW50YXRpb25fX2l0ZW1fX2hlYWRlclwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJlc2VudGF0aW9uLmdyb3Vwcy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgIGljb25Tdmc9XCJwcml2YXRlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXMtcHJpdmF0ZSBhLXRvb2x0aXAgLXRvb2x0aXAtbm8td3JhcFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0BwcnkucHJlc2VudGF0aW9uLnByaXZhdGUnIHwgaTE4blwiXG4gICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE3XCJcbiAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxN1wiXG4gICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhLXRvb2x0aXAgLXRvb2x0aXAtbm8td3JhcFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImZldGNoKHByZXNlbnRhdGlvbilcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS5wcmVzZW50YXRpb24udmlldycgfCBpMThuXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLXByZXNlbnRhdGlvbl9faXRlbV9faW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWZ1bGwtd2lkdGhdPVwicHJlc2VudGF0aW9uLmNvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJwcmVzZW50YXRpb24uaW1hZ2UgfCBnZXRTZWN1cmVkSW1hZ2UgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZXNlbnRhdGlvbi5vd25lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3JlLWJ1dHRvblwiICpwcnlBY2Nlc3M9XCJ7IG1vZHVsZTogJ2Rhc2hib2FyZCcsIHBhZ2U6ICdtYW5pZmVzdCcsIGFjdGlvbjogJ3NoYXJlJyB9XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1tb3JlIGEtdG9vbHRpcCAtdG9vbHRpcC1uby13cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidtb3JlLWJ1dHRvbi0nICsgaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0BwcnkucmVzdGl0dXRpb24ubW9yZScgfCBpMThuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlTW9kYWxBY3Rpb25zKHByZXNlbnRhdGlvbiwgYnV0dG9uKVwiXG4gICAgICAgICAgICAgICAgICAgICNidXR0b25cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMjVcIiBbd2lkdGhdPVwiMjVcIiBpY29uU3ZnPVwibW9yZV9ob3JpelwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLXByZXNlbnRhdGlvbl9faXRlbV9fdHh0XCIgKGNsaWNrKT1cImZldGNoKHByZXNlbnRhdGlvbilcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8tcHJlc2VudGF0aW9uX19pdGVtX190aXRsZS1jb250YWluZXJcIiBlbGxpcHNpcyB0ZXh0RWxlbWVudFNlbGVjdG9yPVwiLmEtaDNcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJhLWgzXCI+e3sgcHJlc2VudGF0aW9uLm5hbWUgfX08L2gzPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8tcHJlc2VudGF0aW9uX19pdGVtX19kZXNjcmlwdGlvbi1jb250YWluZXJcIiBlbGxpcHNpcyB0ZXh0RWxlbWVudFNlbGVjdG9yPVwiLmEtcFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLXByZXNlbnRhdGlvbl9faXRlbV9fZGVzY3JpcHRpb24gYS1wXCI+XG4gICAgICAgICAgICAgICAgICB7eyBwcmVzZW50YXRpb24uZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYS1wIC1kYXRlXCI+e3sgcHJlc2VudGF0aW9uLm1vZGlmaWNhdGlvbkRhdGUgfCBzaW5jZURhdGUgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJvLXByZXNlbnRhdGlvbl9faXRlbV9fZm9vdGVyIGEtdG9vbHRpcCAtdG9vbHRpcC1uby13cmFwXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZldGNoKHByZXNlbnRhdGlvbilcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0BwcnkucHJlc2VudGF0aW9uLnZpZXcnIHwgaTE4blwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0blwiPlxuICAgICAgICAgICAgICAgIHt7ICdAcHJ5LnByZXNlbnRhdGlvbi5jb25zdWx0JyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICA8cHJ5LWljb24gW3dpZHRoXT1cIjIwXCIgW2hlaWdodF09XCIyMFwiIGljb25Tdmc9XCJhcnJvd19yaWdodFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVmlld01vZGUuQ1JFQVRJT05cIj5cbiAgICA8cHJ5LWFkZC1lZGl0LXByZXNlbnRhdGlvblxuICAgICAgW3NlbGVjdGVkUHJlc2VudGF0aW9uXT1cInNlbGVjdGVkUHJlc2VudGF0aW9uJCB8IGFzeW5jXCJcbiAgICAgIChnb0JhY2spPVwiY2xvc2VSZXN0aXR1dGlvbigpXCJcbiAgICAgIFtlZGl0aW9uU3RhcnRVcmxdPVwiZWRpdGlvblN0YXJ0VXJsXCJcbiAgICAgIFtlZGl0aW9uXT1cImZhbHNlXCJcbiAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgID48L3ByeS1hZGQtZWRpdC1wcmVzZW50YXRpb24+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJWaWV3TW9kZS5FRElUSU9OXCI+XG4gICAgPHByeS1hZGQtZWRpdC1wcmVzZW50YXRpb25cbiAgICAgIFtzZWxlY3RlZFByZXNlbnRhdGlvbl09XCJzZWxlY3RlZFByZXNlbnRhdGlvbiQgfCBhc3luY1wiXG4gICAgICAoZ29CYWNrKT1cImNsb3NlUmVzdGl0dXRpb24oKVwiXG4gICAgICBbZWRpdGlvblN0YXJ0VXJsXT1cImVkaXRpb25TdGFydFVybFwiXG4gICAgICBbZWRpdGlvbl09XCJ0cnVlXCJcbiAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgID48L3ByeS1hZGQtZWRpdC1wcmVzZW50YXRpb24+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWw+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm8tbW9kYWxcIlxuICAgICN2aXNpYmlsaXR5TW9kYWxcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nIGNoYW5nZSB2aXNpYmlsaXR5XCJcbiAgICAqbmdJZj1cInNlbGVjdGVkUHJlc2VudGF0aW9uJCB8IGFzeW5jIGFzIHNlbGVjdGVkUHJlc2VudGF0aW9uXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX3RpdGxlXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImEtaDJcIiBpZD1cImRpYWxvZ190aXRsZVwiPnt7ICdAcHJ5LnRvb2xib3guc2hhcmUnIHwgaTE4biB9fTwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX2Nsb3NlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAgICNjcm9zc1Zpc2liaWxpdHlcbiAgICAgICAgICAoa2V5ZG93bi5zaGlmdC50YWIpPVwiZm9jdXNWYWxpZGF0aW9uKClcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNb2RhbCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiY2xvc2VcIiBbaGVpZ2h0XT1cIjM1XCIgW3dpZHRoXT1cIjM1XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkudG9vbGJveC5jbG9zZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwcnktZ3JvdXAtc2hhcmUgW25nTW9kZWxdPVwic2VsZWN0ZWRQcmVzZW50YXRpb24uZ3JvdXBzXCIgKG5nTW9kZWxDaGFuZ2UpPVwiYWNjZXNzR3JvdXBzID0gJGV2ZW50XCI+PC9wcnktZ3JvdXAtc2hhcmU+XG4gICAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnlcIiAoY2xpY2spPVwidG9nZ2xlTW9kYWwoKVwiPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiXG4gICAgICAgICNzdWJtaXRcbiAgICAgICAgKGtleWRvd24udGFiKT1cImZvY3VzQ3Jvc3NFbGVtZW50KClcIlxuICAgICAgICAoY2xpY2spPVwiY2hhbmdlVmlzaWJpbGl0eShzZWxlY3RlZFByZXNlbnRhdGlvbilcIlxuICAgICAgPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNoZWNrJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI21vZGFsQWN0aW9ucz5cbiAgPGRpdiBjbGFzcz1cIm0tY29udGV4dC1tZW51XCI+XG4gICAgPHVsXG4gICAgICBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0XCJcbiAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nIHByZXNlbnRhdGlvbiBvcHRpb25zXCJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRQcmVzZW50YXRpb24kIHwgYXN5bmMgYXMgc2VsZWN0ZWRQcmVzZW50YXRpb25cIlxuICAgID5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImEtYnRuIC1saW5rLWxpa2VcIlxuICAgICAgICAgIChjbGljayk9XCJlZGl0KHNlbGVjdGVkUHJlc2VudGF0aW9uKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFByZXNlbnRhdGlvbi5vd25lclwiXG4gICAgICAgICAgKnByeUFjY2Vzcz1cInsgbW9kdWxlOiAnZGFzaGJvYXJkJywgcGFnZTogJ21hbmlmZXN0JywgYWN0aW9uOiAnZWRpdCcgfVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAnQHByeS5wcmVzZW50YXRpb24uZWRpdGlvbicgfCBpMThuIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImEtYnRuIC1saW5rLWxpa2VcIlxuICAgICAgICAgIChjbGljayk9XCJlZGl0Q29udGVudChzZWxlY3RlZFByZXNlbnRhdGlvbilcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRQcmVzZW50YXRpb24ub3duZXJcIlxuICAgICAgICAgICpwcnlBY2Nlc3M9XCJ7IG1vZHVsZTogJ2Rhc2hib2FyZCcsIHBhZ2U6ICdtYW5pZmVzdCcsIGFjdGlvbjogJ2VkaXQnIH1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0BwcnkucHJlc2VudGF0aW9uLmVkaXRpb25Db250ZW50JyB8IGkxOG4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNb2RhbChzZWxlY3RlZFByZXNlbnRhdGlvbilcIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gLWxpbmstbGlrZVwiXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImRpYWxvZ1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFByZXNlbnRhdGlvbi5vd25lclwiXG4gICAgICAgICAgKnByeUFjY2Vzcz1cInsgbW9kdWxlOiAnZGFzaGJvYXJkJywgcGFnZTogJ21hbmlmZXN0JywgYWN0aW9uOiAnc2hhcmUnIH1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0BwcnkucHJlc2VudGF0aW9uLnNoYXJlJyB8IGkxOG4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gLWxpbmstbGlrZVwiXG4gICAgICAgICAgI29wZW5Nb2RhbFxuICAgICAgICAgIChjbGljayk9XCJkZWxldGUoc2VsZWN0ZWRQcmVzZW50YXRpb24uaWQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkUHJlc2VudGF0aW9uLm93bmVyXCJcbiAgICAgICAgICAqcHJ5QWNjZXNzPVwieyBtb2R1bGU6ICdkYXNoYm9hcmQnLCBwYWdlOiAnbWFuaWZlc3QnLCBhY3Rpb246ICdkZWxldGUnIH1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0BwcnkucHJlc2VudGF0aW9uLmRlbGV0ZScgfCBpMThuIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2VudGF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3ByZXNlbnRhdGlvbi9jb21wb25lbnRzL3ByZXNlbnRhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9wcmVzZW50YXRpb24vY29tcG9uZW50cy9wcmVzZW50YXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFXLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxXQUFXLEVBQUUsU0FBUyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUcvRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUVuQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBR25CLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsUUFBUSxFQUNSLHVCQUF1QixFQUN2QixvQ0FBb0MsRUFDckMsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7O0FBTTFCLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSx3QkFBd0I7SUE2QnBFLElBQWEsZUFBZSxDQUFDLFNBQXVDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FB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O3NCQUF2QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBUUcsSUFBSTtzQkFBWixLQUFLO2dCQUVPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFFTyxNQUFNO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBOZ1pvbmUsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBEYXNoYm9hcmRBY3Rpb25zLFxuICBEYXNoYm9hcmRHcmlkTGF5b3V0LFxuICBEYXNoYm9hcmRNYW5pZmVzdCxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBEYXRhU291cmNlU2VsZWN0b3JzLFxuICBNYW5pZmVzdERlc2NyaXB0aW9uLFxuICBQcnlUaXRsZVNlcnZpY2UsXG4gIFByeVZpc2liaWxpdHlUeXBlLFxuICBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUsXG4gIFZpZXdNb2RlLFxuICBjYW5NYW5pZmVzdEJlTWFkZVB1YmxpYyxcbiAgZ2V0Q29tbW9uRGF0YXNvdXJjZUdyb3Vwc0Zvck1hbmlmZXN0XG59IGZyb20gJ0Bwcm92b2x5L2Rhc2hib2FyZCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG1hcCwgT2JzZXJ2YWJsZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktcHJlc2VudGF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ByZXNlbnRhdGlvbi5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUHJ5UHJlc2VudGF0aW9uQ29tcG9uZW50IGV4dGVuZHMgU3Vic2NyaXB0aW9ubmVyRGlyZWN0aXZlIHtcbiAgbWFuaWZlc3RzJDogT2JzZXJ2YWJsZTxNYW5pZmVzdERlc2NyaXB0aW9uW10+O1xuICBzZWxlY3RlZFByZXNlbnRhdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1hbmlmZXN0RGVzY3JpcHRpb24gfCBudWxsPihudWxsKTtcbiAgcHJlc2VudGF0aW9uPzogTWFuaWZlc3REZXNjcmlwdGlvbjtcbiAgc3RhdGljTWFuaWZlc3QkPzogT2JzZXJ2YWJsZTxEYXNoYm9hcmRNYW5pZmVzdD47XG4gIHNlbGVjdGVkTW9kZTogVmlld01vZGUgPSBWaWV3TW9kZS5DQVRBTE9HO1xuICBtb2RhbE9wZW5lZCA9IGZhbHNlO1xuICBAVmlld0NoaWxkKCdtb2RhbEFjdGlvbnMnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHRlbXBsYXRlTW9kYWxBY3Rpb25zITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgnbW9kYWwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgnb3Blbk1vZGFsJykgb3Blbk1vZGFsITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NvbmZpcm0nKSBjb25maXJtITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdCcpIHN1Ym1pdCE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdjcm9zcycpIGNyb3NzITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Nyb3NzVmlzaWJpbGl0eScpIGNyb3NzVmlzaWJpbGl0eSE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd2aXNpYmlsaXR5TW9kYWwnKSB2aXNpYmlsaXR5TW9kYWwhOiBFbGVtZW50UmVmO1xuICBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcbiAgYWNjZXNzR3JvdXBzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBlZGl0aW9uU3RhcnRVcmw6IHN0cmluZyA9ICcvJztcbiAgQElucHV0KCkgY29uc3VsdFN0YXJ0VXJsOiBzdHJpbmcgPSAnLyc7XG4gIEBJbnB1dCgpIG1lQXNPd25lcj86IHN0cmluZztcbiAgVmlld01vZGUgPSBWaWV3TW9kZTtcbiAgc2VhcmNoJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICBmaWx0ZXJlZFByZXNlbnRhdGlvbnMkOiBPYnNlcnZhYmxlPE1hbmlmZXN0RGVzY3JpcHRpb25bXT47XG4gIGxpc3RPZk1hbmlmZXN0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1hbmlmZXN0RGVzY3JpcHRpb25bXSB8IG51bGw+KG51bGwpO1xuICBkaXNhYmxlU2hhcmVSYWRpb3MkOiBPYnNlcnZhYmxlPHsgW2tleSBpbiBQcnlWaXNpYmlsaXR5VHlwZV06IGJvb2xlYW4gfT47XG4gIGFsbG93ZWRTaGFyZUdyb3VwcyQ6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuXG4gIEBJbnB1dCgpIG1vZGU6ICd0aGVtZScgfCAnbWV0YScgPSAnbWV0YSc7XG5cbiAgQElucHV0KCkgc2V0IGxpc3RPZk1hbmlmZXN0cyhtYW5pZmVzdHM6IE1hbmlmZXN0RGVzY3JpcHRpb25bXSB8IG51bGwpIHtcbiAgICB0aGlzLmxpc3RPZk1hbmlmZXN0cyQubmV4dChBcnJheS5pc0FycmF5KG1hbmlmZXN0cykgPyBtYW5pZmVzdHMgOiBudWxsKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGhpZGVUb29sYm94ID0gZmFsc2U7XG4gIGlucHV0U2VhcmNoJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICBASW5wdXQoKSBzZXQgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlucHV0U2VhcmNoJC5uZXh0KHF1ZXJ5KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBzdG9yZTogU3RvcmU8YW55PixcbiAgICBwcm90ZWN0ZWQgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcm90ZWN0ZWQgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIHRpdGxlU2VydmljZTogUHJ5VGl0bGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJvdGVjdGVkIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHBhcmFtc1snY3JlYXRlJ10pIHtcbiAgICAgICAgICB0aGlzLmNyZWF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuZmV0Y2hNYW5pZmVzdHNMaXN0KCkpO1xuICAgIHRoaXMubWFuaWZlc3RzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZVxuICAgICAgICAuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5tYW5pZmVzdHNMaXN0KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKG1hbmlmZXN0TGlzdCkgPT5cbiAgICAgICAgICAgIFsuLi5tYW5pZmVzdExpc3RdLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgIGEubW9kaWZpY2F0aW9uRGF0ZSA/IGIubW9kaWZpY2F0aW9uRGF0ZS5sb2NhbGVDb21wYXJlKGEubW9kaWZpY2F0aW9uRGF0ZSkgOiAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgdGhpcy5saXN0T2ZNYW5pZmVzdHMkXG4gICAgXSkucGlwZShtYXAoKFtkeW5hbWljcywgc3RhdGljc10pID0+IHN0YXRpY3MgPz8gZHluYW1pY3MpKTtcblxuICAgIHRoaXMuc3RhdGljTWFuaWZlc3QkID0gdGhpcy5zdG9yZVxuICAgICAgLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuc3RhdGljTWFuaWZlc3QpXG4gICAgICAucGlwZShtYXAoKHN0YXRpY00pID0+IHN0YXRpY00ud2luZG93c1swXSkpO1xuICAgIHRoaXMuZmlsdGVyZWRQcmVzZW50YXRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5tYW5pZmVzdHMkLFxuICAgICAgdGhpcy5zZWFyY2gkLFxuICAgICAgdGhpcy5pbnB1dFNlYXJjaCQucGlwZShzdGFydFdpdGgoJycpKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtwcmVzZW50YXRpb25zLCBzZWFyY2gsIGlucHV0U2VhcmNoXSkgPT5cbiAgICAgICAgcHJlc2VudGF0aW9ucy5maWx0ZXIoKHByZXNlbnRhdGlvbnMpID0+IHtcbiAgICAgICAgICBjb25zdCBbbmFtZSwgZGVzY3JpcHRpb25dID0gW3ByZXNlbnRhdGlvbnMubmFtZS50b0xvd2VyQ2FzZSgpLCBwcmVzZW50YXRpb25zLmRlc2NyaXB0aW9uPy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICBjb25zdCBbc2VhcmNoUXVlcnksIGlucHV0U2VhcmNoUXVlcnldID0gW3NlYXJjaD8udG9Mb3dlckNhc2UoKSwgaW5wdXRTZWFyY2g/LnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgIHJldHVybiAhIXNlYXJjaFF1ZXJ5IHx8ICEhaW5wdXRTZWFyY2hRdWVyeVxuICAgICAgICAgICAgPyAoISFzZWFyY2hRdWVyeSAmJiAobmFtZS5pbmNsdWRlcyhzZWFyY2hRdWVyeSkgfHwgZGVzY3JpcHRpb24/LmluY2x1ZGVzKHNlYXJjaFF1ZXJ5KSkpIHx8XG4gICAgICAgICAgICAgICAgKCEhaW5wdXRTZWFyY2hRdWVyeSAmJiAobmFtZS5pbmNsdWRlcyhpbnB1dFNlYXJjaFF1ZXJ5KSB8fCBkZXNjcmlwdGlvbj8uaW5jbHVkZXMoaW5wdXRTZWFyY2hRdWVyeSkpKVxuICAgICAgICAgICAgOiB0cnVlO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5kaXNhYmxlU2hhcmVSYWRpb3MkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2VudGF0aW9uJCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZGF0YXNldHMpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ByZXNlbnRhdGlvbiwgZGF0YXNldHNdKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1ByeVZpc2liaWxpdHlUeXBlLlBSSVZBVEVdOiBmYWxzZSxcbiAgICAgICAgICBbUHJ5VmlzaWJpbGl0eVR5cGUuUFVCTElDXTogcHJlc2VudGF0aW9uID8gIWNhbk1hbmlmZXN0QmVNYWRlUHVibGljKHByZXNlbnRhdGlvbiwgZGF0YXNldHMpIDogdHJ1ZSxcbiAgICAgICAgICBbUHJ5VmlzaWJpbGl0eVR5cGUuUkVTVFJJQ1RFRF06IHByZXNlbnRhdGlvblxuICAgICAgICAgICAgPyAhKFxuICAgICAgICAgICAgICAgIGNhbk1hbmlmZXN0QmVNYWRlUHVibGljKHByZXNlbnRhdGlvbiwgZGF0YXNldHMpIHx8XG4gICAgICAgICAgICAgICAgZ2V0Q29tbW9uRGF0YXNvdXJjZUdyb3Vwc0Zvck1hbmlmZXN0KHByZXNlbnRhdGlvbiwgZGF0YXNldHMpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hbGxvd2VkU2hhcmVHcm91cHMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2VudGF0aW9uJCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZGF0YXNldHMpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ByZXNlbnRhdGlvbiwgZGF0YXNldHNdKSA9PiB7XG4gICAgICAgIHJldHVybiBwcmVzZW50YXRpb24gPyBnZXRDb21tb25EYXRhc291cmNlR3JvdXBzRm9yTWFuaWZlc3QocHJlc2VudGF0aW9uLCBkYXRhc2V0cykgOiBbXTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnByZXNlbnRhdGlvbikuc3Vic2NyaWJlKChwcmVzZW50YXRpb24pID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vZGUgPSBwcmVzZW50YXRpb24/LnZpZXdNb2RlID8/IHRoaXMuVmlld01vZGUuQ0FUQUxPRztcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNlbnRhdGlvbiQubmV4dChwcmVzZW50YXRpb24uY3VycmVudCA/PyBudWxsKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnRpdGxlU2VydmljZS5jaGFuZ2VUaXRsZSgnQHByeS5wcmVzZW50YXRpb24udGl0bGUnKTtcbiAgfVxuXG4gIGNsb3NlUmVzdGl0dXRpb24oKSB7XG4gICAgdGhpcy5zZWxlY3RlZFByZXNlbnRhdGlvbiQubmV4dChudWxsKTtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZSA9IFZpZXdNb2RlLkNBVEFMT0c7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnNlbGVjdFByZXNlbnRhdGlvbih7IHByZXNlbnRhdGlvbjogdW5kZWZpbmVkLCB2aWV3TW9kZTogVmlld01vZGUuQ0FUQUxPRyB9KSk7XG4gIH1cblxuICBmZXRjaChwcmVzZW50YXRpb246IE1hbmlmZXN0RGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMubG9hZFByZXNlbnRhdGlvbih7IHByZXNlbnRhdGlvbiwgdmlld01vZGU6IFZpZXdNb2RlLkNPTlNVTFQgfSkpO1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvdXRlcj8ubmF2aWdhdGVCeVVybCh0aGlzLmNvbnN1bHRTdGFydFVybCk7XG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGlvbigpIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZSA9IFZpZXdNb2RlLkNSRUFUSU9OO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVNYW5pZmVzdCh7IG1hbmlmZXN0OiB7IHdpbmRvd3M6IFtdIH0sIHNlbGVjdGVkSWRzOiBbXSB9KSk7XG4gICAgY29uc3QgbmV3UHJlc2VudGF0aW9uID0ge1xuICAgICAgcHJlc2VudGF0aW9uOiB7XG4gICAgICAgIGlkOiB2NCgpLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgZ3JvdXBzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgb3duZXI6IHRydWVcbiAgICAgIH0gYXMgTWFuaWZlc3REZXNjcmlwdGlvbixcbiAgICAgIHZpZXdNb2RlOiBWaWV3TW9kZS5DUkVBVElPTlxuICAgIH07XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnNlbGVjdFByZXNlbnRhdGlvbihuZXdQcmVzZW50YXRpb24pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuc2V0R3JpZExheW91dCh7IGxheW91dDogRGFzaGJvYXJkR3JpZExheW91dC5GVUxMIH0pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGlzcGxheU9wdGlvbnMoeyBtb2RlOiBWaWV3TW9kZS5DUkVBVElPTiB9KSk7XG4gIH1cblxuICBlZGl0KHByZXNlbnRhdGlvbjogTWFuaWZlc3REZXNjcmlwdGlvbikge1xuICAgIHRoaXMuc2VsZWN0ZWRNb2RlID0gVmlld01vZGUuRURJVElPTjtcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2VudGF0aW9uJC5uZXh0KHByZXNlbnRhdGlvbik7XG4gICAgdGhpcy50aXRsZVNlcnZpY2UuY2hhbmdlVGl0bGUocHJlc2VudGF0aW9uLm5hbWUpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5zZWxlY3RQcmVzZW50YXRpb24oeyBwcmVzZW50YXRpb24sIHZpZXdNb2RlOiBWaWV3TW9kZS5FRElUSU9OIH0pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuZmV0Y2hTdGF0aWNNYW5pZmVzdCh7IGlkOiBwcmVzZW50YXRpb24uaWQgfSkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEaXNwbGF5T3B0aW9ucyh7IG1vZGU6IFZpZXdNb2RlLkVESVRJT04gfSkpO1xuICAgIHRoaXMub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xuICAgIHRoaXMub3ZlcmxheVJlZiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlbGV0ZShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmNvbmZpcm1NYW5pZmVzdERlbGV0aW9uKHsgaWQgfSkpO1xuICAgIHRoaXMudG9nZ2xlTW9kYWxBY3Rpb25zKCk7XG4gIH1cblxuICB0b2dnbGVNb2RhbEFjdGlvbnMocHJlc2VudGF0aW9uPzogTWFuaWZlc3REZXNjcmlwdGlvbiB8IG51bGwsIG1vcmVCdXR0b24/OiBIVE1MQnV0dG9uRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5vdmVybGF5UmVmICYmIHByZXNlbnRhdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZFByZXNlbnRhdGlvbiQubmV4dChwcmVzZW50YXRpb24pO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnNlbGVjdFByZXNlbnRhdGlvbih7IHByZXNlbnRhdGlvbiwgdmlld01vZGU6IFZpZXdNb2RlLkNBVEFMT0cgfSkpO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmxvYWRNYW5pZmVzdCh7IGlkOiBwcmVzZW50YXRpb24uaWQgfSkpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnbS1jb250ZXh0LW1lbnUtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCdcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvZ2dsZU1vZGFsQWN0aW9ucyhwcmVzZW50YXRpb24pKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMudGVtcGxhdGVNb2RhbEFjdGlvbnMsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgY29uc3QgY29udGV4dE1lbnUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkaXYubS1jb250ZXh0LW1lbnUnKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgIGlmICghIWNvbnRleHRNZW51ICYmIG1vcmVCdXR0b24pIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IG1vcmVCdXR0b24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnRleHRNZW51LnN0eWxlLm1pbldpZHRoID0gJzE4NXB4JztcbiAgICAgICAgY29udGV4dE1lbnUuc3R5bGUubGVmdCA9IChyZWN0Py5sZWZ0ID8/IDApIC0gKGNvbnRleHRNZW51Py5jbGllbnRXaWR0aCA/PyAwKSArIDIzICsgJ3B4JztcbiAgICAgICAgY29udGV4dE1lbnUuc3R5bGUudG9wID0gKHJlY3Q/LnRvcCA/PyAwKSArIDMwICsgJ3B4JztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vdmVybGF5UmVmPy5kaXNwb3NlKCk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2VudGF0aW9uJC5uZXh0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZU1vZGFsKHByZXNlbnRhdGlvbj86IE1hbmlmZXN0RGVzY3JpcHRpb24gfCBudWxsKSB7XG4gICAgdGhpcy5tb2RhbE9wZW5lZCA9ICF0aGlzLm1vZGFsT3BlbmVkO1xuICAgIGlmICh0aGlzLm1vZGFsT3BlbmVkICYmIHByZXNlbnRhdGlvbikge1xuICAgICAgdGhpcy50b2dnbGVNb2RhbEFjdGlvbnMoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZW50YXRpb24kLm5leHQocHJlc2VudGF0aW9uKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5zZWxlY3RQcmVzZW50YXRpb24oeyBwcmVzZW50YXRpb24sIHZpZXdNb2RlOiBWaWV3TW9kZS5DQVRBTE9HIH0pKTtcbiAgICAgIC8qIHdlIG5lZWQgdG8gbG9hZCBtYW5pZmVzdCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHNhdmUgaXQgbGF0ZXIgKi9cbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5sb2FkTWFuaWZlc3QoeyBpZDogcHJlc2VudGF0aW9uLmlkIH0pKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ28tbW9kYWwtd3JhcHBlciddLFxuICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYWNrZHJvcCdcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnRvZ2dsZU1vZGFsKHByZXNlbnRhdGlvbikpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmF0dGFjaChuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy50ZW1wbGF0ZSwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLnZpc2liaWxpdHlNb2RhbC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgICAgICBmb2N1cy5mb2N1cygpO1xuICAgICAgfSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWY/LmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZW50YXRpb24kLm5leHQobnVsbCk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlVmlzaWJpbGl0eShwcmVzZW50YXRpb24/OiBNYW5pZmVzdERlc2NyaXB0aW9uKSB7XG4gICAgaWYgKHByZXNlbnRhdGlvbikge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgRGFzaGJvYXJkQWN0aW9ucy5zYXZlTWFuaWZlc3Qoe1xuICAgICAgICAgIGlkOiBwcmVzZW50YXRpb24uaWQgPz8gJycsXG4gICAgICAgICAgbmFtZTogcHJlc2VudGF0aW9uLm5hbWUgPz8gJycsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHByZXNlbnRhdGlvbi5kZXNjcmlwdGlvbixcbiAgICAgICAgICBpbWFnZTogcHJlc2VudGF0aW9uLmltYWdlID8/ICcnLFxuICAgICAgICAgIGNvdmVyOiBwcmVzZW50YXRpb24uY292ZXIgPz8gZmFsc2UsXG4gICAgICAgICAgZ3JvdXBzOiB0aGlzLmFjY2Vzc0dyb3Vwc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVNb2RhbChwcmVzZW50YXRpb24pO1xuICB9XG5cbiAgZm9jdXNDcm9zc0VsZW1lbnQoKSB7XG4gICAgaWYgKHRoaXMuY3Jvc3NWaXNpYmlsaXR5KSB7XG4gICAgICB0aGlzLmNyb3NzVmlzaWJpbGl0eT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmNyb3NzPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBmb2N1c1ZhbGlkYXRpb24oKSB7XG4gICAgaWYgKHRoaXMuY29uZmlybSkge1xuICAgICAgdGhpcy5jb25maXJtLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgdGhpcy5zdWJtaXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgZWRpdENvbnRlbnQoc2VsZWN0ZWRQcmVzZW50YXRpb246IE1hbmlmZXN0RGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgRGFzaGJvYXJkQWN0aW9ucy5sb2FkUHJlc2VudGF0aW9uKHsgcHJlc2VudGF0aW9uOiBzZWxlY3RlZFByZXNlbnRhdGlvbiwgdmlld01vZGU6IFZpZXdNb2RlLkVESVRJT04gfSlcbiAgICApO1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvdXRlcj8ubmF2aWdhdGVCeVVybCh0aGlzLmNvbnN1bHRTdGFydFVybCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxwcnktcHJlc2VudGF0aW9uLWNzcz48L3ByeS1wcmVzZW50YXRpb24tY3NzPlxuPGRpdiBjbGFzcz1cIm8tbWFuaWZlc3QtbGF5b3V0XCIgW25nU3dpdGNoXT1cInNlbGVjdGVkTW9kZVwiPlxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgPGRpdiBjbGFzcz1cIm8tbWFuaWZlc3QtbGF5b3V0X190b29sYm94XCIgW2NsYXNzLi11LWhpZGRlbl09XCJoaWRlVG9vbGJveFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJjcmVhdGlvbigpXCJcbiAgICAgICAgKnByeUFjY2Vzcz1cInsgbW9kdWxlOiAnZGFzaGJvYXJkJywgcGFnZTogJ21hbmlmZXN0JywgYWN0aW9uOiAnY3JlYXRlJyB9XCJcbiAgICAgID5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJhZGRcIj48L3ByeS1pY29uPlxuICAgICAgICB7eyAnQHByeS5wcmVzZW50YXRpb24uY3JlYXRlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm8tbWFuaWZlc3QtbGF5b3V0X190b29sYm94X19zZWFyY2hcIj5cbiAgICAgICAgICA8bGFiZWwgaWQ9XCJjYXRhbG9nLXNlYXJjaC1sYWJlbFwiIGZvcj1cImNhdGFsb2ctc2VhcmNoXCIgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0BwcnkudG9vbGJveC5jYXRhbG9nLmZpbHRlci5uYW1lJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGlkPVwiY2F0YWxvZy1zZWFyY2hcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidAcHJ5LnByZXNlbnRhdGlvbi5zZWFyY2gnIHwgaTE4blwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2gkIHwgYXN5bmNcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidGhpcy5zZWFyY2gkLm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cHJ5LWljb24gY2xhc3M9XCJzZWFyY2gtaWNvblwiIGljb25Tdmc9XCJzZWFyY2hcIiBbd2lkdGhdPVwiMTdcIiBbaGVpZ2h0XT1cIjE3XCI+PC9wcnktaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tYW5pZmVzdC1sYXlvdXRfX2NvbnRlbnRcIj5cbiAgICAgIDxoMSBjbGFzcz1cImEtaDFcIj57eyAnQHByeS5wcmVzZW50YXRpb24udGl0bGUnIHwgaTE4biB9fTwvaDE+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1wcmVzZW50YXRpb24td3JhcHBlclwiPlxuICAgICAgICA8dWwgY2xhc3M9XCJvLXByZXNlbnRhdGlvblwiPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgY2xhc3M9XCJvLXByZXNlbnRhdGlvbl9faXRlbVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJlc2VudGF0aW9uIG9mIGZpbHRlcmVkUHJlc2VudGF0aW9ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLXByZXNlbnRhdGlvbl9faXRlbV9faGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcmVzZW50YXRpb24uZ3JvdXBzLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgICAgaWNvblN2Zz1cInByaXZhdGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1wcml2YXRlIGEtdG9vbHRpcCAtdG9vbHRpcC1uby13cmFwXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS5wcmVzZW50YXRpb24ucHJpdmF0ZScgfCBpMThuXCJcbiAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTdcIlxuICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE3XCJcbiAgICAgICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImEtdG9vbHRpcCAtdG9vbHRpcC1uby13cmFwXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmV0Y2gocHJlc2VudGF0aW9uKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LnByZXNlbnRhdGlvbi52aWV3JyB8IGkxOG5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8tcHJlc2VudGF0aW9uX19pdGVtX19pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtZnVsbC13aWR0aF09XCJwcmVzZW50YXRpb24uY292ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cInByZXNlbnRhdGlvbi5pbWFnZSB8IGdldFNlY3VyZWRJbWFnZSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJlc2VudGF0aW9uLm93bmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vcmUtYnV0dG9uXCIgKnByeUFjY2Vzcz1cInsgbW9kdWxlOiAnZGFzaGJvYXJkJywgcGFnZTogJ21hbmlmZXN0JywgYWN0aW9uOiAnc2hhcmUnIH1cIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLW1vcmUgYS10b29sdGlwIC10b29sdGlwLW5vLXdyYXBcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ21vcmUtYnV0dG9uLScgKyBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS5yZXN0aXR1dGlvbi5tb3JlJyB8IGkxOG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVNb2RhbEFjdGlvbnMocHJlc2VudGF0aW9uLCBidXR0b24pXCJcbiAgICAgICAgICAgICAgICAgICAgI2J1dHRvblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIyNVwiIFt3aWR0aF09XCIyNVwiIGljb25Tdmc9XCJtb3JlX2hvcml6XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8tcHJlc2VudGF0aW9uX19pdGVtX190eHRcIiAoY2xpY2spPVwiZmV0Y2gocHJlc2VudGF0aW9uKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1wcmVzZW50YXRpb25fX2l0ZW1fX3RpdGxlLWNvbnRhaW5lclwiIGVsbGlwc2lzIHRleHRFbGVtZW50U2VsZWN0b3I9XCIuYS1oM1wiPlxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImEtaDNcIj57eyBwcmVzZW50YXRpb24ubmFtZSB9fTwvaDM+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1wcmVzZW50YXRpb25fX2l0ZW1fX2Rlc2NyaXB0aW9uLWNvbnRhaW5lclwiIGVsbGlwc2lzIHRleHRFbGVtZW50U2VsZWN0b3I9XCIuYS1wXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8tcHJlc2VudGF0aW9uX19pdGVtX19kZXNjcmlwdGlvbiBhLXBcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHByZXNlbnRhdGlvbi5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhLXAgLWRhdGVcIj57eyBwcmVzZW50YXRpb24ubW9kaWZpY2F0aW9uRGF0ZSB8IHNpbmNlRGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm8tcHJlc2VudGF0aW9uX19pdGVtX19mb290ZXIgYS10b29sdGlwIC10b29sdGlwLW5vLXdyYXBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZmV0Y2gocHJlc2VudGF0aW9uKVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS5wcmVzZW50YXRpb24udmlldycgfCBpMThuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuXCI+XG4gICAgICAgICAgICAgICAge3sgJ0BwcnkucHJlc2VudGF0aW9uLmNvbnN1bHQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgIDxwcnktaWNvbiBbd2lkdGhdPVwiMjBcIiBbaGVpZ2h0XT1cIjIwXCIgaWNvblN2Zz1cImFycm93X3JpZ2h0XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJWaWV3TW9kZS5DUkVBVElPTlwiPlxuICAgIDxwcnktYWRkLWVkaXQtcHJlc2VudGF0aW9uXG4gICAgICBbc2VsZWN0ZWRQcmVzZW50YXRpb25dPVwic2VsZWN0ZWRQcmVzZW50YXRpb24kIHwgYXN5bmNcIlxuICAgICAgKGdvQmFjayk9XCJjbG9zZVJlc3RpdHV0aW9uKClcIlxuICAgICAgW2VkaXRpb25TdGFydFVybF09XCJlZGl0aW9uU3RhcnRVcmxcIlxuICAgICAgW2VkaXRpb25dPVwiZmFsc2VcIlxuICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgPjwvcHJ5LWFkZC1lZGl0LXByZXNlbnRhdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlZpZXdNb2RlLkVESVRJT05cIj5cbiAgICA8cHJ5LWFkZC1lZGl0LXByZXNlbnRhdGlvblxuICAgICAgW3NlbGVjdGVkUHJlc2VudGF0aW9uXT1cInNlbGVjdGVkUHJlc2VudGF0aW9uJCB8IGFzeW5jXCJcbiAgICAgIChnb0JhY2spPVwiY2xvc2VSZXN0aXR1dGlvbigpXCJcbiAgICAgIFtlZGl0aW9uU3RhcnRVcmxdPVwiZWRpdGlvblN0YXJ0VXJsXCJcbiAgICAgIFtlZGl0aW9uXT1cInRydWVcIlxuICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgPjwvcHJ5LWFkZC1lZGl0LXByZXNlbnRhdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNtb2RhbD5cbiAgPGRpdlxuICAgIGNsYXNzPVwiby1tb2RhbFwiXG4gICAgI3Zpc2liaWxpdHlNb2RhbFxuICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICBhcmlhLWxhYmVsbGVkYnk9XCJkaWFsb2cgY2hhbmdlIHZpc2liaWxpdHlcIlxuICAgICpuZ0lmPVwic2VsZWN0ZWRQcmVzZW50YXRpb24kIHwgYXN5bmMgYXMgc2VsZWN0ZWRQcmVzZW50YXRpb25cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fdGl0bGVcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwiYS1oMlwiIGlkPVwiZGlhbG9nX3RpdGxlXCI+e3sgJ0BwcnkudG9vbGJveC5zaGFyZScgfCBpMThuIH19PC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm8tbW9kYWxfX3RvcF9fY2xvc2VcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiXG4gICAgICAgICAgI2Nyb3NzVmlzaWJpbGl0eVxuICAgICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJmb2N1c1ZhbGlkYXRpb24oKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1vZGFsKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJjbG9zZVwiIFtoZWlnaHRdPVwiMzVcIiBbd2lkdGhdPVwiMzVcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS50b29sYm94LmNsb3NlJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHByeS1ncm91cC1zaGFyZVxuICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRQcmVzZW50YXRpb24uZ3JvdXBzXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImFjY2Vzc0dyb3VwcyA9ICRldmVudFwiXG4gICAgICBbZGlzYWJsZVJhZGlvc109XCJkaXNhYmxlU2hhcmVSYWRpb3MkIHwgYXN5bmNcIlxuICAgICAgW2FsbG93ZWRHcm91cHNdPVwiYWxsb3dlZFNoYXJlR3JvdXBzJCB8IGFzeW5jXCJcbiAgICA+PC9wcnktZ3JvdXAtc2hhcmU+XG4gICAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImEtYnRuIGEtYnRuLS1zZWNvbmRhcnlcIiAoY2xpY2spPVwidG9nZ2xlTW9kYWwoKVwiPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiXG4gICAgICAgICNzdWJtaXRcbiAgICAgICAgKGtleWRvd24udGFiKT1cImZvY3VzQ3Jvc3NFbGVtZW50KClcIlxuICAgICAgICAoY2xpY2spPVwiY2hhbmdlVmlzaWJpbGl0eShzZWxlY3RlZFByZXNlbnRhdGlvbilcIlxuICAgICAgPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNoZWNrJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI21vZGFsQWN0aW9ucz5cbiAgPGRpdiBjbGFzcz1cIm0tY29udGV4dC1tZW51XCI+XG4gICAgPHVsXG4gICAgICBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0XCJcbiAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nIHByZXNlbnRhdGlvbiBvcHRpb25zXCJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRQcmVzZW50YXRpb24kIHwgYXN5bmMgYXMgc2VsZWN0ZWRQcmVzZW50YXRpb25cIlxuICAgID5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImEtYnRuIC1saW5rLWxpa2VcIlxuICAgICAgICAgIChjbGljayk9XCJlZGl0KHNlbGVjdGVkUHJlc2VudGF0aW9uKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFByZXNlbnRhdGlvbi5vd25lclwiXG4gICAgICAgICAgKnByeUFjY2Vzcz1cInsgbW9kdWxlOiAnZGFzaGJvYXJkJywgcGFnZTogJ21hbmlmZXN0JywgYWN0aW9uOiAnZWRpdCcgfVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAnQHByeS5wcmVzZW50YXRpb24uZWRpdGlvbicgfCBpMThuIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzcz1cIm0tY29udGV4dC1tZW51X19saXN0X19pdGVtXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImEtYnRuIC1saW5rLWxpa2VcIlxuICAgICAgICAgIChjbGljayk9XCJlZGl0Q29udGVudChzZWxlY3RlZFByZXNlbnRhdGlvbilcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRQcmVzZW50YXRpb24ub3duZXJcIlxuICAgICAgICAgICpwcnlBY2Nlc3M9XCJ7IG1vZHVsZTogJ2Rhc2hib2FyZCcsIHBhZ2U6ICdtYW5pZmVzdCcsIGFjdGlvbjogJ2VkaXQnIH1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0BwcnkucHJlc2VudGF0aW9uLmVkaXRpb25Db250ZW50JyB8IGkxOG4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNb2RhbChzZWxlY3RlZFByZXNlbnRhdGlvbilcIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gLWxpbmstbGlrZVwiXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImRpYWxvZ1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFByZXNlbnRhdGlvbi5vd25lclwiXG4gICAgICAgICAgKnByeUFjY2Vzcz1cInsgbW9kdWxlOiAnZGFzaGJvYXJkJywgcGFnZTogJ21hbmlmZXN0JywgYWN0aW9uOiAnc2hhcmUnIH1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0BwcnkucHJlc2VudGF0aW9uLnNoYXJlJyB8IGkxOG4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzPVwibS1jb250ZXh0LW1lbnVfX2xpc3RfX2l0ZW1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gLWxpbmstbGlrZVwiXG4gICAgICAgICAgI29wZW5Nb2RhbFxuICAgICAgICAgIChjbGljayk9XCJkZWxldGUoc2VsZWN0ZWRQcmVzZW50YXRpb24uaWQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkUHJlc2VudGF0aW9uLm93bmVyXCJcbiAgICAgICAgICAqcHJ5QWNjZXNzPVwieyBtb2R1bGU6ICdkYXNoYm9hcmQnLCBwYWdlOiAnbWFuaWZlc3QnLCBhY3Rpb246ICdkZWxldGUnIH1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0BwcnkucHJlc2VudGF0aW9uLmRlbGV0ZScgfCBpMThuIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -173,7 +173,7 @@ export class SaveViewComponent extends ToolboxActionComponent {
173
173
  }
174
174
  }
175
175
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SaveViewComponent, deps: [{ token: i1.Store }, { token: i2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
176
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: SaveViewComponent, selector: "pry-save-view", inputs: { mode: "mode" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "saveAs", first: true, predicate: ["saveAs"], descendants: true }, { propertyName: "directiveSave", first: true, predicate: ["directiveSave"], descendants: true }, { propertyName: "firstFocusdirective", first: true, predicate: ["firstFocusdirective"], descendants: true }, { propertyName: "cross", first: true, predicate: ["cross"], descendants: true }, { propertyName: "confirm", first: true, predicate: ["confirm"], descendants: true }, { propertyName: "cancel", first: true, predicate: ["cancel"], descendants: true }, { propertyName: "templateSaveAs", first: true, predicate: ["templateSaveAs"], descendants: true, read: TemplateRef }, { propertyName: "templateDirectSaveType", first: true, predicate: ["templateDirectSaveType"], descendants: true, read: TemplateRef }], usesInheritance: true, ngImport: i0, template: "<ng-container *pryAccess=\"{ module: 'dashboard', page: 'toolbox', action: 'save' }\">\n <ng-container *ngIf=\"mode === 'directSave'\">\n <div [attr.aria-expanded]=\"saveTypeOpened\" aria-controls=\"directiveSave\" aria-describedby=\"infoTooltip_directSave\">\n <button\n type=\"button\"\n #directiveSave\n class=\"a-btn a-btn--primary\"\n (click)=\"directSave()\"\n [disabled]=\"!(isCurrentPresentationModified$ | async)\"\n [hidden]=\"!(isCurrentPresentationOwner$ | async)\"\n >\n <ng-container *ngIf=\"displayLabels\">{{ '@pry.toolbox.save' | i18n }} ({{ nbPages }})</ng-container>\n </button>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mode === 'saveAs'\">\n <div\n class=\"save-manifest-container\"\n [attr.aria-expanded]=\"saveAsOpened\"\n aria-controls=\"saveModal\"\n aria-describedby=\"infoTooltip_saveAs\"\n >\n <button\n type=\"button\"\n #saveAs\n class=\"a-btn a-btn--secondary\"\n (click)=\"toggleSaveAs()\"\n aria-haspopup=\"dialog\"\n >\n <ng-container *ngIf=\"displayLabels\">{{ '@pry.toolbox.rename' | i18n }} ({{ nbPages }})</ng-container>\n </button>\n </div>\n </ng-container>\n</ng-container>\n<ng-template #templateSaveAs>\n <div\n class=\"o-modal\"\n (click)=\"$event.stopPropagation()\"\n id=\"saveModal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_saveModal\"\n (keydown.escape)=\"closeModals()\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">{{ '@pry.toolbox.rename' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #cross (keydown.shift.tab)=\"focusValidation()\" (click)=\"toggleSaveAs()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-stepper #stepper>\n <pry-step>\n <h4 class=\"m-stepper-item__title\" *stepTitle>{{ '@pry.presentation.add.info' | i18n }}</h4>\n <form>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" id=\"label-name\" for=\"input-name\">{{ '@pry.toolbox.manifest.name' | i18n }}</label>\n <input\n type=\"text\"\n id=\"input-name\"\n name=\"input-name\"\n class=\"a-form-field\"\n placeholder=\"{{ '@pry.toolbox.manifest.name' | i18n }}\"\n [ngModel]=\"currentManifest!.name\"\n (ngModelChange)=\"changeValue($event)\"\n aria-labelledby=\"label-name\"\n maxlength=\"50\"\n #input\n />\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" id=\"label-descr\" for=\"input-descr\">{{\n '@pry.toolbox.manifest.description' | i18n\n }}</label>\n <input\n type=\"text\"\n id=\"input-descr\"\n name=\"input-descr\"\n class=\"a-form-field\"\n placeholder=\"{{ '@pry.toolbox.manifest.description' | i18n }}\"\n [ngModel]=\"currentManifest!.description\"\n (ngModelChange)=\"changeDescr($event)\"\n aria-labelledby=\"label-name\"\n maxlength=\"200\"\n />\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"presentation_image\">{{ '@pry.presentation.form.image' | i18n }}</label>\n <div class=\"o-file-input\">\n <pry-select-image\n id=\"presentation_image\"\n (changed)=\"currentManifest!.image = $event\"\n [iconUrl]=\"currentManifest!.image\"\n [mode]=\"type\"\n ></pry-select-image>\n <pry-checkbox [(ngModel)]=\"currentManifest!.cover\" name=\"cover\">\n {{ '@pry.presentation.form.cover' | i18n }}\n </pry-checkbox>\n </div>\n </div>\n\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--secondary\"\n #cancel\n (click)=\"toggleSaveAs()\"\n (keydown.tab)=\"disableNextStep()\"\n >\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n class=\"a-btn a-btn--primary\"\n (click)=\"stepper.next()\"\n [disabled]=\"!isValid()\"\n (keydown.tab)=\"focusCrossElement()\"\n >\n {{ '@pry.action.next' | i18n }}\n </button>\n </div>\n </form>\n </pry-step>\n <pry-step>\n <h4 class=\"m-stepper-item__title\" *stepTitle>{{ '@pry.restitution.share' | i18n }}</h4>\n <pry-group-share [(ngModel)]=\"accessGroups\" (ngModelChange)=\"changeAccessGroups($event)\"></pry-group-share>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"stepper.prev()\">\n {{ '@pry.action.back' | i18n }}\n </button>\n <button\n type=\"submit\"\n class=\"a-btn a-btn--primary\"\n #confirm\n (click)=\"save()\"\n (keydown.tab)=\"focusCrossElement()\"\n >\n {{ '@pry.restitution.share' | i18n }}\n </button>\n </div>\n </pry-step>\n </pry-stepper>\n </div>\n</ng-template>\n\n<ng-template #templateDirectSaveType>\n <div\n class=\"o-modal\"\n (click)=\"$event.stopPropagation()\"\n id=\"directiveSave\"\n role=\"dialog\"\n aria-labelledby=\"dialog_title\"\n (keydown.escape)=\"closeModals()\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title_\">{{ '@pry.toolbox.save' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #firstFocusdirective (click)=\"toggleDirectSaveType()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div>\n <h3>{{ '@pry.snack.pagesChanged' | i18n }}</h3>\n </div>\n <div class=\"m-btn-group\">\n <button class=\"a-btn a-btn--primary\" (click)=\"save()\">\n {{ '@pry.toolbox.save' | i18n }}\n </button>\n <button class=\"a-btn a-btn--primary\" (click)=\"rename()\">\n {{ '@pry.toolbox.rename' | i18n }}\n </button>\n <button class=\"a-btn a-btn--primary\" (click)=\"restore()\" (keydown.tab)=\"closeModals()\">\n {{ '@pry.toolbox.restore' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "component", type: i5.PrySelectImageComponent, selector: "pry-select-image", inputs: ["iconUrl", "size", "mode"], outputs: ["toggled", "changed"] }, { kind: "component", type: i5.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i6.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "component", type: i7.PryStepperComponent, selector: "pry-stepper", inputs: ["isConsultMode"], outputs: ["lastStepCompleted"] }, { kind: "component", type: i7.PryStepComponent, selector: "pry-step", inputs: ["setActiveState"] }, { kind: "directive", type: i7.PryStepTitleDirective, selector: "[stepTitle]" }, { kind: "component", type: i5.PryGroupShareComponent, selector: "pry-group-share" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] }); }
176
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: SaveViewComponent, selector: "pry-save-view", inputs: { mode: "mode" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "saveAs", first: true, predicate: ["saveAs"], descendants: true }, { propertyName: "directiveSave", first: true, predicate: ["directiveSave"], descendants: true }, { propertyName: "firstFocusdirective", first: true, predicate: ["firstFocusdirective"], descendants: true }, { propertyName: "cross", first: true, predicate: ["cross"], descendants: true }, { propertyName: "confirm", first: true, predicate: ["confirm"], descendants: true }, { propertyName: "cancel", first: true, predicate: ["cancel"], descendants: true }, { propertyName: "templateSaveAs", first: true, predicate: ["templateSaveAs"], descendants: true, read: TemplateRef }, { propertyName: "templateDirectSaveType", first: true, predicate: ["templateDirectSaveType"], descendants: true, read: TemplateRef }], usesInheritance: true, ngImport: i0, template: "<ng-container *pryAccess=\"{ module: 'dashboard', page: 'toolbox', action: 'save' }\">\n <ng-container *ngIf=\"mode === 'directSave'\">\n <div [attr.aria-expanded]=\"saveTypeOpened\" aria-controls=\"directiveSave\" aria-describedby=\"infoTooltip_directSave\">\n <button\n type=\"button\"\n #directiveSave\n class=\"a-btn a-btn--primary\"\n (click)=\"directSave()\"\n [disabled]=\"!(isCurrentPresentationModified$ | async)\"\n [hidden]=\"!(isCurrentPresentationOwner$ | async)\"\n >\n <ng-container *ngIf=\"displayLabels\">{{ '@pry.toolbox.save' | i18n }} ({{ nbPages }})</ng-container>\n </button>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mode === 'saveAs'\">\n <div\n class=\"save-manifest-container\"\n [attr.aria-expanded]=\"saveAsOpened\"\n aria-controls=\"saveModal\"\n aria-describedby=\"infoTooltip_saveAs\"\n >\n <button\n type=\"button\"\n #saveAs\n class=\"a-btn a-btn--secondary\"\n (click)=\"toggleSaveAs()\"\n aria-haspopup=\"dialog\"\n >\n <ng-container *ngIf=\"displayLabels\">{{ '@pry.toolbox.rename' | i18n }} ({{ nbPages }})</ng-container>\n </button>\n </div>\n </ng-container>\n</ng-container>\n<ng-template #templateSaveAs>\n <div\n class=\"o-modal\"\n (click)=\"$event.stopPropagation()\"\n id=\"saveModal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog_saveModal\"\n (keydown.escape)=\"closeModals()\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">{{ '@pry.toolbox.rename' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #cross (keydown.shift.tab)=\"focusValidation()\" (click)=\"toggleSaveAs()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-stepper #stepper>\n <pry-step>\n <h4 class=\"m-stepper-item__title\" *stepTitle>{{ '@pry.presentation.add.info' | i18n }}</h4>\n <form>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" id=\"label-name\" for=\"input-name\">{{ '@pry.toolbox.manifest.name' | i18n }}</label>\n <input\n type=\"text\"\n id=\"input-name\"\n name=\"input-name\"\n class=\"a-form-field\"\n placeholder=\"{{ '@pry.toolbox.manifest.name' | i18n }}\"\n [ngModel]=\"currentManifest!.name\"\n (ngModelChange)=\"changeValue($event)\"\n aria-labelledby=\"label-name\"\n maxlength=\"50\"\n #input\n />\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" id=\"label-descr\" for=\"input-descr\">{{\n '@pry.toolbox.manifest.description' | i18n\n }}</label>\n <input\n type=\"text\"\n id=\"input-descr\"\n name=\"input-descr\"\n class=\"a-form-field\"\n placeholder=\"{{ '@pry.toolbox.manifest.description' | i18n }}\"\n [ngModel]=\"currentManifest!.description\"\n (ngModelChange)=\"changeDescr($event)\"\n aria-labelledby=\"label-name\"\n maxlength=\"200\"\n />\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"presentation_image\">{{ '@pry.presentation.form.image' | i18n }}</label>\n <div class=\"o-file-input\">\n <pry-select-image\n id=\"presentation_image\"\n (changed)=\"currentManifest!.image = $event\"\n [iconUrl]=\"currentManifest!.image\"\n [mode]=\"type\"\n ></pry-select-image>\n <pry-checkbox [(ngModel)]=\"currentManifest!.cover\" name=\"cover\">\n {{ '@pry.presentation.form.cover' | i18n }}\n </pry-checkbox>\n </div>\n </div>\n\n <div class=\"m-btn-group\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--secondary\"\n #cancel\n (click)=\"toggleSaveAs()\"\n (keydown.tab)=\"disableNextStep()\"\n >\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button\n type=\"submit\"\n class=\"a-btn a-btn--primary\"\n (click)=\"stepper.next()\"\n [disabled]=\"!isValid()\"\n (keydown.tab)=\"focusCrossElement()\"\n >\n {{ '@pry.action.next' | i18n }}\n </button>\n </div>\n </form>\n </pry-step>\n <pry-step>\n <h4 class=\"m-stepper-item__title\" *stepTitle>{{ '@pry.restitution.share' | i18n }}</h4>\n <pry-group-share [(ngModel)]=\"accessGroups\" (ngModelChange)=\"changeAccessGroups($event)\"></pry-group-share>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"stepper.prev()\">\n {{ '@pry.action.back' | i18n }}\n </button>\n <button\n type=\"submit\"\n class=\"a-btn a-btn--primary\"\n #confirm\n (click)=\"save()\"\n (keydown.tab)=\"focusCrossElement()\"\n >\n {{ '@pry.restitution.share' | i18n }}\n </button>\n </div>\n </pry-step>\n </pry-stepper>\n </div>\n</ng-template>\n\n<ng-template #templateDirectSaveType>\n <div\n class=\"o-modal\"\n (click)=\"$event.stopPropagation()\"\n id=\"directiveSave\"\n role=\"dialog\"\n aria-labelledby=\"dialog_title\"\n (keydown.escape)=\"closeModals()\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title_\">{{ '@pry.toolbox.save' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #firstFocusdirective (click)=\"toggleDirectSaveType()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div>\n <h3>{{ '@pry.snack.pagesChanged' | i18n }}</h3>\n </div>\n <div class=\"m-btn-group\">\n <button class=\"a-btn a-btn--primary\" (click)=\"save()\">\n {{ '@pry.toolbox.save' | i18n }}\n </button>\n <button class=\"a-btn a-btn--primary\" (click)=\"rename()\">\n {{ '@pry.toolbox.rename' | i18n }}\n </button>\n <button class=\"a-btn a-btn--primary\" (click)=\"restore()\" (keydown.tab)=\"closeModals()\">\n {{ '@pry.toolbox.restore' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "component", type: i5.PrySelectImageComponent, selector: "pry-select-image", inputs: ["iconUrl", "size", "mode"], outputs: ["toggled", "changed"] }, { kind: "component", type: i5.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i6.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "component", type: i7.PryStepperComponent, selector: "pry-stepper", inputs: ["isConsultMode"], outputs: ["lastStepCompleted"] }, { kind: "component", type: i7.PryStepComponent, selector: "pry-step", inputs: ["setActiveState"] }, { kind: "directive", type: i7.PryStepTitleDirective, selector: "[stepTitle]" }, { kind: "component", type: i5.PryGroupShareComponent, selector: "pry-group-share", inputs: ["disableRadios", "allowedGroups"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] }); }
177
177
  }
178
178
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SaveViewComponent, decorators: [{
179
179
  type: Component,
@@ -58,7 +58,7 @@ export class ShareComponent extends ToolboxActionComponent {
58
58
  this.toggleModal();
59
59
  }
60
60
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ShareComponent, deps: [{ token: i1.Store }, { token: i2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
61
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: ShareComponent, selector: "pry-share-pres", viewQueries: [{ propertyName: "template", first: true, predicate: ["modal"], descendants: true, read: TemplateRef }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"this.presentation?.current?.owner\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"trigger()\">\n <ng-container *ngIf=\"displayLabels\">{{ '@pry.toolbox.share' | i18n }}</ng-container>\n </button>\n</ng-container>\n<ng-template #modal>\n <div\n class=\"o-modal\"\n #visibilityModal\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog change visibility\"\n *ngIf=\"presentation as selectedPresentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">{{ '@pry.toolbox.share' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #crossVisibility (click)=\"toggleModal()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-group-share\n [ngModel]=\"selectedPresentation.current?.groups\"\n (ngModelChange)=\"accessGroups = $event\"\n ></pry-group-share>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"toggleModal()\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" class=\"a-btn a-btn--primary\" #submit (click)=\"changeVisibility()\">\n {{ '@pry.toolbox.manifest.check' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryGroupShareComponent, selector: "pry-group-share" }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] }); }
61
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: ShareComponent, selector: "pry-share-pres", viewQueries: [{ propertyName: "template", first: true, predicate: ["modal"], descendants: true, read: TemplateRef }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"this.presentation?.current?.owner\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"trigger()\">\n <ng-container *ngIf=\"displayLabels\">{{ '@pry.toolbox.share' | i18n }}</ng-container>\n </button>\n</ng-container>\n<ng-template #modal>\n <div\n class=\"o-modal\"\n #visibilityModal\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog change visibility\"\n *ngIf=\"presentation as selectedPresentation\"\n >\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">{{ '@pry.toolbox.share' | i18n }}</h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" #crossVisibility (click)=\"toggleModal()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <pry-group-share\n [ngModel]=\"selectedPresentation.current?.groups\"\n (ngModelChange)=\"accessGroups = $event\"\n ></pry-group-share>\n <div class=\"m-btn-group\">\n <button type=\"button\" class=\"a-btn a-btn--secondary\" (click)=\"toggleModal()\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" class=\"a-btn a-btn--primary\" #submit (click)=\"changeVisibility()\">\n {{ '@pry.toolbox.manifest.check' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryGroupShareComponent, selector: "pry-group-share", inputs: ["disableRadios", "allowedGroups"] }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] }); }
62
62
  }
63
63
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ShareComponent, decorators: [{
64
64
  type: Component,
@@ -2780,7 +2780,8 @@ class AdminSelectDatasetComponent extends SubscriptionnerDirective {
2780
2780
  this.datasetMetadata$ = this.store.select(DataSourceSelectors.selectedDatasetMetadata);
2781
2781
  this.associations$ = this.store.select(AdminSelectors.selectedAssociation);
2782
2782
  this.editable$ = this.store.select(MetadataSelectors.editable);
2783
- this.missingGroups$ = this.store.select(DataSourceSelectors.selectedDatasetMissingGroups).pipe(withLatestFrom(this.store.select(DashboardSelectors.manifestsList)), map(([conflict, manifests]) => {
2783
+ this.selectedDatasetMissingGroups$ = this.store.select(DataSourceSelectors.selectedDatasetMissingGroups);
2784
+ this.missingGroups$ = this.selectedDatasetMissingGroups$.pipe(withLatestFrom(this.store.select(DashboardSelectors.manifestsList)), map(([conflict, manifests]) => {
2784
2785
  const result = {};
2785
2786
  Object.keys(conflict ?? {}).forEach((entityId) => {
2786
2787
  result[entityId] = {
@@ -2869,12 +2870,16 @@ class AdminSelectDatasetComponent extends SubscriptionnerDirective {
2869
2870
  const label = this.i18n.instant(i18nBase + groupName);
2870
2871
  return label.startsWith(i18nBase) ? groupName : label;
2871
2872
  }
2873
+ changeGroup($event) {
2874
+ this.accessGroups = $event;
2875
+ this.store.dispatch(DataSourceActions.dataset.setMissingGroups({ missingGroups: undefined }));
2876
+ }
2872
2877
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AdminSelectDatasetComponent, deps: [{ token: i1.Store }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i4.PryI18nService }], target: i0.ɵɵFactoryTarget.Component }); }
2873
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: AdminSelectDatasetComponent, selector: "pry-admin-select-dataset", usesInheritance: true, ngImport: i0, template: "<div\n *ngIf=\"selectedDataset$ | async as dataset\"\n [id]=\"'panel-dataset-' + dataset.id\"\n [attr.aria-labelledby]=\"'button-dataset-' + dataset.id\"\n class=\"o-panel o-pry-admin-dataset-select\"\n>\n <div class=\"o-panel__header\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"closePanel()\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.closePanel' | i18n }}</span>\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n\n <h3 class=\"a-h3\">\n {{ '@pry.admin.dataset.details' | i18n }}\n </h3>\n </div>\n\n <pry-tab-group translationStringBase=\"@pry.admin.\">\n <pry-tab [templateRef]=\"datasetMetadata\" name=\"metadata.title\"></pry-tab>\n <pry-tab [templateRef]=\"datasetAssociations\" name=\"classes.associations\"></pry-tab>\n <pry-tab *ngIf=\"dataset.owner\" [templateRef]=\"shareDataset\" name=\"share\"></pry-tab>\n </pry-tab-group>\n\n <ng-template #datasetMetadata>\n <pry-metadata-editor\n [targetId]=\"(selectedDataset$ | async)?.id ?? ''\"\n [isModification]=\"(editable$ | async) ?? false\"\n [metadata]=\"(datasetMetadata$ | async) ?? []\"\n (removeMeta)=\"removeMetadata($event)\"\n (addMeta)=\"addDatasetMetadata($event)\"\n [type]=\"'meta'\"\n ></pry-metadata-editor>\n </ng-template>\n\n <ng-template #datasetAssociations>\n <div *ngIf=\"associations$ | async as associations\" class=\"o-tabs__panels__item__content\">\n <h4 class=\"a-h4\">{{ '@pry.admin.classes.associations' | i18n }}</h4>\n <pry-association [associations]=\"associations\"></pry-association>\n </div>\n </ng-template>\n\n <ng-template #shareDataset>\n <div class=\"o-pry-admin-dataset-select__share\">\n <pry-group-share [ngModel]=\"dataset.groups\" (ngModelChange)=\"accessGroups = $event\"></pry-group-share>\n <button type=\"submit\" class=\"a-btn a-btn--primary u-self-end\" #submit (click)=\"share(dataset)\">\n {{ '@pry.admin.validate' | i18n }}\n </button>\n @if(missingGroups$ | async; as missingGroups) {\n <div class=\"u-display-flex -column\">\n <span>{{ '@pry.admin.dataset.conflict' | i18n }}</span>\n @for(missing of missingGroups | keyvalue; track missing.key) {\n <div>\n {{ '@pry.admin.dataset.entities.dashboard' | i18n }} <strong>{{ missing.value.entityName }}</strong>\n <div class=\"u-display-flex\">\n @for(group of missing.value.groups; track group) {\n <span class=\"a-chip\">{{ getGroupLabel(group) }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TabGroupComponent, selector: "pry-tab-group", inputs: ["translationStringBase"] }, { kind: "component", type: i4.TabComponent, selector: "pry-tab", inputs: ["name", "templateRef", "index"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.PryMetadataEditorComponent, selector: "pry-metadata-editor", inputs: ["isModification", "targetId", "type", "metadata"], outputs: ["addMeta", "removeMeta"] }, { kind: "component", type: i4.PryGroupShareComponent, selector: "pry-group-share" }, { kind: "component", type: PryAssociationComponent, selector: "pry-association", inputs: ["associations"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }] }); }
2878
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: AdminSelectDatasetComponent, selector: "pry-admin-select-dataset", usesInheritance: true, ngImport: i0, template: "<div\n *ngIf=\"selectedDataset$ | async as dataset\"\n [id]=\"'panel-dataset-' + dataset.id\"\n [attr.aria-labelledby]=\"'button-dataset-' + dataset.id\"\n class=\"o-panel o-pry-admin-dataset-select\"\n>\n <div class=\"o-panel__header\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"closePanel()\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.closePanel' | i18n }}</span>\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n\n <h3 class=\"a-h3\">\n {{ '@pry.admin.dataset.details' | i18n }}\n </h3>\n </div>\n\n <pry-tab-group translationStringBase=\"@pry.admin.\">\n <pry-tab [templateRef]=\"datasetMetadata\" name=\"metadata.title\"></pry-tab>\n <pry-tab [templateRef]=\"datasetAssociations\" name=\"classes.associations\"></pry-tab>\n <pry-tab *ngIf=\"dataset.owner\" [templateRef]=\"shareDataset\" name=\"share\"></pry-tab>\n </pry-tab-group>\n\n <ng-template #datasetMetadata>\n <pry-metadata-editor\n [targetId]=\"(selectedDataset$ | async)?.id ?? ''\"\n [isModification]=\"(editable$ | async) ?? false\"\n [metadata]=\"(datasetMetadata$ | async) ?? []\"\n (removeMeta)=\"removeMetadata($event)\"\n (addMeta)=\"addDatasetMetadata($event)\"\n [type]=\"'meta'\"\n ></pry-metadata-editor>\n </ng-template>\n\n <ng-template #datasetAssociations>\n <div *ngIf=\"associations$ | async as associations\" class=\"o-tabs__panels__item__content\">\n <h4 class=\"a-h4\">{{ '@pry.admin.classes.associations' | i18n }}</h4>\n <pry-association [associations]=\"associations\"></pry-association>\n </div>\n </ng-template>\n\n <ng-template #shareDataset>\n <div class=\"o-pry-admin-dataset-select__share\">\n <pry-group-share [ngModel]=\"dataset.groups\" (ngModelChange)=\"changeGroup($event)\"></pry-group-share>\n <button type=\"submit\" class=\"a-btn a-btn--primary u-self-end\" #submit (click)=\"share(dataset)\">\n {{ '@pry.admin.validate' | i18n }}\n </button>\n @if(selectedDatasetMissingGroups$ | async) {\n <h4 class=\"a-h4\">{{ '@pry.admin.dataset.success' | i18n }}</h4>\n }\n @if(missingGroups$ | async; as missingGroups) {\n <div class=\"u-display-flex -column\">\n <span>{{ '@pry.admin.dataset.conflict' | i18n }}</span>\n @for(missing of missingGroups | keyvalue; track missing.key) {\n <div>\n {{ '@pry.admin.dataset.entities.dashboard' | i18n }} <strong>{{ missing.value.entityName }}</strong>\n <div class=\"u-display-flex\">\n @for(group of missing.value.groups; track group) {\n <span class=\"a-chip\">{{ getGroupLabel(group) }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TabGroupComponent, selector: "pry-tab-group", inputs: ["translationStringBase"] }, { kind: "component", type: i4.TabComponent, selector: "pry-tab", inputs: ["name", "templateRef", "index"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.PryMetadataEditorComponent, selector: "pry-metadata-editor", inputs: ["isModification", "targetId", "type", "metadata"], outputs: ["addMeta", "removeMeta"] }, { kind: "component", type: i4.PryGroupShareComponent, selector: "pry-group-share", inputs: ["disableRadios", "allowedGroups"] }, { kind: "component", type: PryAssociationComponent, selector: "pry-association", inputs: ["associations"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }] }); }
2874
2879
  }
2875
2880
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AdminSelectDatasetComponent, decorators: [{
2876
2881
  type: Component,
2877
- args: [{ selector: 'pry-admin-select-dataset', template: "<div\n *ngIf=\"selectedDataset$ | async as dataset\"\n [id]=\"'panel-dataset-' + dataset.id\"\n [attr.aria-labelledby]=\"'button-dataset-' + dataset.id\"\n class=\"o-panel o-pry-admin-dataset-select\"\n>\n <div class=\"o-panel__header\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"closePanel()\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.closePanel' | i18n }}</span>\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n\n <h3 class=\"a-h3\">\n {{ '@pry.admin.dataset.details' | i18n }}\n </h3>\n </div>\n\n <pry-tab-group translationStringBase=\"@pry.admin.\">\n <pry-tab [templateRef]=\"datasetMetadata\" name=\"metadata.title\"></pry-tab>\n <pry-tab [templateRef]=\"datasetAssociations\" name=\"classes.associations\"></pry-tab>\n <pry-tab *ngIf=\"dataset.owner\" [templateRef]=\"shareDataset\" name=\"share\"></pry-tab>\n </pry-tab-group>\n\n <ng-template #datasetMetadata>\n <pry-metadata-editor\n [targetId]=\"(selectedDataset$ | async)?.id ?? ''\"\n [isModification]=\"(editable$ | async) ?? false\"\n [metadata]=\"(datasetMetadata$ | async) ?? []\"\n (removeMeta)=\"removeMetadata($event)\"\n (addMeta)=\"addDatasetMetadata($event)\"\n [type]=\"'meta'\"\n ></pry-metadata-editor>\n </ng-template>\n\n <ng-template #datasetAssociations>\n <div *ngIf=\"associations$ | async as associations\" class=\"o-tabs__panels__item__content\">\n <h4 class=\"a-h4\">{{ '@pry.admin.classes.associations' | i18n }}</h4>\n <pry-association [associations]=\"associations\"></pry-association>\n </div>\n </ng-template>\n\n <ng-template #shareDataset>\n <div class=\"o-pry-admin-dataset-select__share\">\n <pry-group-share [ngModel]=\"dataset.groups\" (ngModelChange)=\"accessGroups = $event\"></pry-group-share>\n <button type=\"submit\" class=\"a-btn a-btn--primary u-self-end\" #submit (click)=\"share(dataset)\">\n {{ '@pry.admin.validate' | i18n }}\n </button>\n @if(missingGroups$ | async; as missingGroups) {\n <div class=\"u-display-flex -column\">\n <span>{{ '@pry.admin.dataset.conflict' | i18n }}</span>\n @for(missing of missingGroups | keyvalue; track missing.key) {\n <div>\n {{ '@pry.admin.dataset.entities.dashboard' | i18n }} <strong>{{ missing.value.entityName }}</strong>\n <div class=\"u-display-flex\">\n @for(group of missing.value.groups; track group) {\n <span class=\"a-chip\">{{ getGroupLabel(group) }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n</div>\n" }]
2882
+ args: [{ selector: 'pry-admin-select-dataset', template: "<div\n *ngIf=\"selectedDataset$ | async as dataset\"\n [id]=\"'panel-dataset-' + dataset.id\"\n [attr.aria-labelledby]=\"'button-dataset-' + dataset.id\"\n class=\"o-panel o-pry-admin-dataset-select\"\n>\n <div class=\"o-panel__header\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"closePanel()\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.closePanel' | i18n }}</span>\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n\n <h3 class=\"a-h3\">\n {{ '@pry.admin.dataset.details' | i18n }}\n </h3>\n </div>\n\n <pry-tab-group translationStringBase=\"@pry.admin.\">\n <pry-tab [templateRef]=\"datasetMetadata\" name=\"metadata.title\"></pry-tab>\n <pry-tab [templateRef]=\"datasetAssociations\" name=\"classes.associations\"></pry-tab>\n <pry-tab *ngIf=\"dataset.owner\" [templateRef]=\"shareDataset\" name=\"share\"></pry-tab>\n </pry-tab-group>\n\n <ng-template #datasetMetadata>\n <pry-metadata-editor\n [targetId]=\"(selectedDataset$ | async)?.id ?? ''\"\n [isModification]=\"(editable$ | async) ?? false\"\n [metadata]=\"(datasetMetadata$ | async) ?? []\"\n (removeMeta)=\"removeMetadata($event)\"\n (addMeta)=\"addDatasetMetadata($event)\"\n [type]=\"'meta'\"\n ></pry-metadata-editor>\n </ng-template>\n\n <ng-template #datasetAssociations>\n <div *ngIf=\"associations$ | async as associations\" class=\"o-tabs__panels__item__content\">\n <h4 class=\"a-h4\">{{ '@pry.admin.classes.associations' | i18n }}</h4>\n <pry-association [associations]=\"associations\"></pry-association>\n </div>\n </ng-template>\n\n <ng-template #shareDataset>\n <div class=\"o-pry-admin-dataset-select__share\">\n <pry-group-share [ngModel]=\"dataset.groups\" (ngModelChange)=\"changeGroup($event)\"></pry-group-share>\n <button type=\"submit\" class=\"a-btn a-btn--primary u-self-end\" #submit (click)=\"share(dataset)\">\n {{ '@pry.admin.validate' | i18n }}\n </button>\n @if(selectedDatasetMissingGroups$ | async) {\n <h4 class=\"a-h4\">{{ '@pry.admin.dataset.success' | i18n }}</h4>\n }\n @if(missingGroups$ | async; as missingGroups) {\n <div class=\"u-display-flex -column\">\n <span>{{ '@pry.admin.dataset.conflict' | i18n }}</span>\n @for(missing of missingGroups | keyvalue; track missing.key) {\n <div>\n {{ '@pry.admin.dataset.entities.dashboard' | i18n }} <strong>{{ missing.value.entityName }}</strong>\n <div class=\"u-display-flex\">\n @for(group of missing.value.groups; track group) {\n <span class=\"a-chip\">{{ getGroupLabel(group) }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n</div>\n" }]
2878
2883
  }], ctorParameters: () => [{ type: i1.Store }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i4.PryI18nService }] });
2879
2884
 
2880
2885
  class AdminEnvironmentSelectComponent {
@@ -6351,7 +6356,8 @@ const frTranslations = {
6351
6356
  OPEN: 'Ouvert',
6352
6357
  CLOSED: 'Fermé',
6353
6358
  MODIFIABLE: 'Modifiable',
6354
- conflict: "Attention les tableaux de bord suivant sont partagés à des groupes qui n'auront plus accès aux données :",
6359
+ success: 'Modification effectuée avec succès',
6360
+ conflict: "Attention, les tableaux de bord suivants sont partagés à des groupes qui n'auront plus accès aux données :",
6355
6361
  entities: {
6356
6362
  dashboard: 'Tableaux de bord'
6357
6363
  }