@idea-ionic/agenda 8.0.1 → 8.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,125 +1,108 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Input, inject } from '@angular/core';
2
+ import { ModalController, AlertController } from '@ionic/angular';
2
3
  import { Calendar, Check } from 'idea-toolbox';
4
+ import { IDEALoadingService, IDEAAWSAPIService, IDEATinCanService, IDEAMessageService, IDEATranslationsService } from '@idea-ionic/common';
5
+ import { IDEACalendarsService } from './calendars.service';
3
6
  import * as i0 from "@angular/core";
4
- import * as i1 from "./calendars.service";
7
+ import * as i1 from "@angular/forms";
5
8
  import * as i2 from "@ionic/angular";
6
9
  import * as i3 from "@idea-ionic/common";
7
- import * as i4 from "@angular/common";
8
- import * as i5 from "@angular/forms";
9
10
  export class IDEACalendarComponent {
10
- constructor(calendars, modalCtrl, alertCtrl, tc, loading, message, API, t) {
11
- this.calendars = calendars;
12
- this.modalCtrl = modalCtrl;
13
- this.alertCtrl = alertCtrl;
14
- this.tc = tc;
15
- this.loading = loading;
16
- this.message = message;
17
- this.API = API;
18
- this.t = t;
19
- /**
20
- * Errors while validating the entity.
21
- */
11
+ constructor() {
22
12
  this.errors = new Set();
23
- /**
24
- * The default color for a calendar.
25
- */
26
13
  this.DEFAULT_COLOR = '#555';
14
+ this._calendars = inject(IDEACalendarsService);
15
+ this._modal = inject(ModalController);
16
+ this._alert = inject(AlertController);
17
+ this._tc = inject(IDEATinCanService);
18
+ this._loading = inject(IDEALoadingService);
19
+ this._message = inject(IDEAMessageService);
20
+ this._API = inject(IDEAAWSAPIService);
21
+ this._translate = inject(IDEATranslationsService);
27
22
  }
28
- ngOnInit() {
29
- this.membership = this.tc.get('membership');
30
- // work on a copy
31
- this._calendar = new Calendar(this.calendar);
32
- // load the teammates to use for shared calendars permissions
33
- this.API.getResource(`teams/${this.membership.teamId}/memberships`)
34
- .then((memberships) => (this.membershipsChecks = memberships.map(m => new Check({
35
- value: m.userId,
36
- name: m.name,
37
- checked: (this._calendar.usersCanManageAppointments || []).some(x => x === m.userId)
38
- }))))
39
- .catch(() => { });
23
+ async ngOnInit() {
24
+ this.membership = this._tc.get('membership');
25
+ this.calendarWC = new Calendar(this.calendar);
26
+ try {
27
+ const memberships = await this._API.getResource(`teams/${this.membership.teamId}/memberships`);
28
+ this.membershipsChecks = memberships.map(m => new Check({
29
+ value: m.userId,
30
+ name: m.name,
31
+ checked: (this.calendarWC.usersCanManageAppointments || []).some(x => x === m.userId)
32
+ }));
33
+ }
34
+ catch (error) {
35
+ this._message.error('COMMON.COULDNT_LOAD_LIST');
36
+ }
40
37
  }
41
- /**
42
- * Set the support array to display errors in the UI.
43
- */
44
38
  hasFieldAnError(field) {
45
39
  return this.errors.has(field);
46
40
  }
47
- /**
48
- * Save a calendar with the new info.
49
- */
50
41
  async save() {
51
- // set the default color, in case none was selected
52
- if (!this._calendar.color)
53
- this._calendar.color = this.DEFAULT_COLOR;
54
- // map the memberships able to manage appointments
55
- if (this._calendar.isShared() && this.advancedPermissions)
56
- this._calendar.usersCanManageAppointments = this.membershipsChecks
42
+ if (!this.calendarWC.color)
43
+ this.calendarWC.color = this.DEFAULT_COLOR;
44
+ if (this.calendarWC.isShared() && this.advancedPermissions)
45
+ this.calendarWC.usersCanManageAppointments = this.membershipsChecks
57
46
  .filter(x => x.checked)
58
47
  .map(x => String(x.value));
59
48
  else
60
- delete this._calendar.usersCanManageAppointments;
61
- // checkings
62
- this.errors = new Set(this._calendar.validate());
49
+ delete this.calendarWC.usersCanManageAppointments;
50
+ this.errors = new Set(this.calendarWC.validate());
63
51
  if (this.errors.size)
64
- return this.message.error('COMMON.FORM_HAS_ERROR_TO_CHECK');
65
- // send a put request
66
- await this.loading.show();
67
- this.calendars
68
- .putCalendar(this._calendar)
69
- .then((res) => {
52
+ return this._message.error('COMMON.FORM_HAS_ERROR_TO_CHECK');
53
+ try {
54
+ await this._loading.show();
55
+ const res = await this._calendars.putCalendar(this.calendarWC);
70
56
  this.calendar.load(res);
71
- this.message.success('IDEA_AGENDA.CALENDARS.CALENDAR_SAVED');
72
- this.modalCtrl.dismiss(this.calendar);
73
- })
74
- .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
75
- .finally(() => this.loading.hide());
57
+ this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_SAVED');
58
+ this._modal.dismiss(this.calendar);
59
+ }
60
+ catch (error) {
61
+ this._message.error('COMMON.OPERATION_FAILED');
62
+ }
63
+ finally {
64
+ this._loading.hide();
65
+ }
76
66
  }
77
- /**
78
- * Delete the calendar.
79
- */
80
- delete() {
81
- this.alertCtrl
82
- .create({
83
- header: this.t._('COMMON.ARE_YOU_SURE'),
84
- subHeader: this.t._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR'),
85
- message: this.t._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT'),
86
- buttons: [
87
- { text: this.t._('COMMON.CANCEL'), role: 'cancel' },
88
- {
89
- text: this.t._('COMMON.DELETE'),
90
- handler: async () => {
91
- await this.loading.show();
92
- this.calendars
93
- .deleteCalendar(this._calendar)
94
- .then(() => {
95
- this.message.success('IDEA_AGENDA.CALENDARS.CALENDAR_DELETED');
96
- this.modalCtrl.dismiss(true);
97
- })
98
- .catch(() => this.message.error('COMMON.OPERATION_FAILED'))
99
- .finally(() => this.loading.hide());
100
- }
101
- }
102
- ]
103
- })
104
- .then(alert => alert.present());
67
+ async delete() {
68
+ const doDelete = async () => {
69
+ try {
70
+ await this._loading.show();
71
+ await this._calendars.deleteCalendar(this.calendarWC);
72
+ this._message.success('IDEA_AGENDA.CALENDARS.CALENDAR_DELETED');
73
+ this._modal.dismiss(true);
74
+ }
75
+ catch (error) {
76
+ this._message.error('COMMON.OPERATION_FAILED');
77
+ }
78
+ finally {
79
+ this._loading.hide();
80
+ }
81
+ };
82
+ const header = this._translate._('COMMON.ARE_YOU_SURE');
83
+ const subHeader = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR');
84
+ const message = this._translate._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT');
85
+ const buttons = [
86
+ { text: this._translate._('COMMON.CANCEL'), role: 'cancel' },
87
+ { text: this._translate._('COMMON.DELETE'), handler: doDelete }
88
+ ];
89
+ const alert = await this._alert.create({ header, subHeader, message, buttons });
90
+ alert.present();
105
91
  }
106
- /**
107
- * Close the component.
108
- */
109
92
  close() {
110
- this.modalCtrl.dismiss();
93
+ this._modal.dismiss();
111
94
  }
112
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarComponent, deps: [{ token: i1.IDEACalendarsService }, { token: i2.ModalController }, { token: i2.AlertController }, { token: i3.IDEATinCanService }, { token: i3.IDEALoadingService }, { token: i3.IDEAMessageService }, { token: i3.IDEAAWSAPIService }, { token: i3.IDEATranslationsService }], target: i0.ɵɵFactoryTarget.Component }); }
113
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.1", type: IDEACalendarComponent, selector: "idea-calendar", inputs: { calendar: "calendar", advancedPermissions: "advancedPermissions", hideColor: "hideColor" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"t._('COMMON.CLOSE')\" (click)=\"close()\">\n <ion-icon name=\"close-circle\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"t._('COMMON.SAVE')\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <div class=\"maxWidthContainer\" *ngIf=\"_calendar\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.NAME_HINT')\"\n >\n <ion-label position=\"stacked\">{{ 'IDEA_AGENDA.CALENDARS.NAME' | translate }} </ion-label>\n <ion-input [placeholder]=\"t._('IDEA_AGENDA.CALENDARS.NAME_HINT')\" [(ngModel)]=\"_calendar.name\"></ion-input>\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT')\"\n >\n <ion-label position=\"stacked\">{{ 'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate }} </ion-label>\n <ion-input\n [placeholder]=\"t._('IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT')\"\n [(ngModel)]=\"_calendar.description\"\n ></ion-input>\n </ion-item>\n <idea-color-picker\n *ngIf=\"!hideColor\"\n [lines]=\"'inset'\"\n [current]=\"_calendar.color\"\n [label]=\"t._('IDEA_AGENDA.CALENDARS.COLOR')\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (_calendar.color = $event) : null\"\n ></idea-color-picker>\n <idea-checker\n *ngIf=\"membershipsChecks && _calendar.isShared() && advancedPermissions\"\n [data]=\"membershipsChecks\"\n [label]=\"t._('IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS')\"\n [searchPlaceholder]=\"t._('IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS')\"\n [noneText]=\"t._('IDEA_AGENDA.CALENDARS.NOBODY')\"\n [allText]=\"t._('IDEA_AGENDA.CALENDARS.EVERYONE')\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n ></idea-checker>\n </ion-list>\n <ion-list class=\"aList\" *ngIf=\"_calendar.external?.service\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\" *ngIf=\"calendar.userId\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\" *ngIf=\"calendar.teamId\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + _calendar.external.service | translate }}\n <p>{{ _calendar.external.name }} ({{ _calendar.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"calendars.getServiceIcon(_calendar.external.service)\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + _calendar.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\"></ion-icon>\n </ion-item>\n </ion-list>\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button color=\"danger\" [title]=\"t._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT')\" (click)=\"delete()\">\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n</ion-content>\n", styles: [".maxWidthContainer{max-width:500px;padding-top:20px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "component", type: i3.IDEAColorPickerComponent, selector: "idea-color-picker", inputs: ["colors", "current", "label", "placeholder", "icon", "iconColor", "disabled", "obligatory", "lines", "color"], outputs: ["select", "iconSelect"] }, { kind: "component", type: i3.IDEACheckerComponent, selector: "idea-checker", inputs: ["data", "dataProvider", "label", "icon", "iconColor", "searchPlaceholder", "noPreviewText", "noElementsFoundText", "noneEqualsAll", "noneText", "allText", "lines", "color", "disabled", "tappableWhenDisabled", "obligatory", "sortData", "numMaxElementsInPreview", "showAvatars", "limitSelectionToNum", "allowSelectDeselectAll", "category1", "category2", "showCategoriesFilters"], outputs: ["change", "iconSelect"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }] }); }
95
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
96
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEACalendarComponent, selector: "idea-calendar", inputs: { calendar: "calendar", advancedPermissions: "advancedPermissions", hideColor: "hideColor" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.SAVE' | translate\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n @if (calendarWC) {\n <div class=\"maxWidthContainer\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.NAME' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n [(ngModel)]=\"calendarWC.name\"\n />\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n [(ngModel)]=\"calendarWC.description\"\n />\n </ion-item>\n @if (!hideColor) {\n <idea-color-picker\n [lines]=\"'inset'\"\n [current]=\"calendarWC.color\"\n [label]=\"'IDEA_AGENDA.CALENDARS.COLOR' | translate\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (calendarWC.color = $event) : null\"\n />\n }\n @if (membershipsChecks && calendarWC.isShared() && advancedPermissions) {\n <idea-checker\n [data]=\"membershipsChecks\"\n [label]=\"'IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS' | translate\"\n [searchPlaceholder]=\"'IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS' | translate\"\n [noneText]=\"'IDEA_AGENDA.CALENDARS.NOBODY' | translate\"\n [allText]=\"'IDEA_AGENDA.CALENDARS.EVERYONE' | translate\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n />\n }\n </ion-list>\n @if (calendarWC.external?.service) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n @if (calendar.userId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\" />\n </ion-item>\n }\n @if (calendar.teamId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\" />\n </ion-item>\n }\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + calendarWC.external.service | translate }}\n <p>{{ calendarWC.external.name }} ({{ calendarWC.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"calendars.getServiceIcon(calendarWC.external.service)\" />\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + calendarWC.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\" />\n </ion-item>\n </ion-list>\n }\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button\n color=\"danger\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate\"\n (click)=\"delete()\"\n >\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n }\n</ion-content>\n", styles: [".maxWidthContainer{max-width:500px;padding-top:20px}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "component", type: i3.IDEAColorPickerComponent, selector: "idea-color-picker", inputs: ["colors", "current", "label", "placeholder", "icon", "iconColor", "disabled", "obligatory", "lines", "color"], outputs: ["select", "iconSelect"] }, { kind: "component", type: i3.IDEACheckerComponent, selector: "idea-checker", inputs: ["data", "dataProvider", "label", "icon", "iconColor", "searchPlaceholder", "noPreviewText", "noElementsFoundText", "noneEqualsAll", "noneText", "allText", "lines", "color", "disabled", "tappableWhenDisabled", "obligatory", "sortData", "numMaxElementsInPreview", "showAvatars", "limitSelectionToNum", "allowSelectDeselectAll", "category1", "category2", "showCategoriesFilters"], outputs: ["change", "iconSelect"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }] }); }
114
97
  }
115
98
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarComponent, decorators: [{
116
99
  type: Component,
117
- args: [{ selector: 'idea-calendar', template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"t._('COMMON.CLOSE')\" (click)=\"close()\">\n <ion-icon name=\"close-circle\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"t._('COMMON.SAVE')\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <div class=\"maxWidthContainer\" *ngIf=\"_calendar\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.NAME_HINT')\"\n >\n <ion-label position=\"stacked\">{{ 'IDEA_AGENDA.CALENDARS.NAME' | translate }} </ion-label>\n <ion-input [placeholder]=\"t._('IDEA_AGENDA.CALENDARS.NAME_HINT')\" [(ngModel)]=\"_calendar.name\"></ion-input>\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"t._('IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT')\"\n >\n <ion-label position=\"stacked\">{{ 'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate }} </ion-label>\n <ion-input\n [placeholder]=\"t._('IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT')\"\n [(ngModel)]=\"_calendar.description\"\n ></ion-input>\n </ion-item>\n <idea-color-picker\n *ngIf=\"!hideColor\"\n [lines]=\"'inset'\"\n [current]=\"_calendar.color\"\n [label]=\"t._('IDEA_AGENDA.CALENDARS.COLOR')\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (_calendar.color = $event) : null\"\n ></idea-color-picker>\n <idea-checker\n *ngIf=\"membershipsChecks && _calendar.isShared() && advancedPermissions\"\n [data]=\"membershipsChecks\"\n [label]=\"t._('IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS')\"\n [searchPlaceholder]=\"t._('IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS')\"\n [noneText]=\"t._('IDEA_AGENDA.CALENDARS.NOBODY')\"\n [allText]=\"t._('IDEA_AGENDA.CALENDARS.EVERYONE')\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n ></idea-checker>\n </ion-list>\n <ion-list class=\"aList\" *ngIf=\"_calendar.external?.service\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\" *ngIf=\"calendar.userId\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\" *ngIf=\"calendar.teamId\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + _calendar.external.service | translate }}\n <p>{{ _calendar.external.name }} ({{ _calendar.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"calendars.getServiceIcon(_calendar.external.service)\"></ion-icon>\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + _calendar.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\"></ion-icon>\n </ion-item>\n </ion-list>\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button color=\"danger\" [title]=\"t._('IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT')\" (click)=\"delete()\">\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n</ion-content>\n", styles: [".maxWidthContainer{max-width:500px;padding-top:20px}\n"] }]
118
- }], ctorParameters: () => [{ type: i1.IDEACalendarsService }, { type: i2.ModalController }, { type: i2.AlertController }, { type: i3.IDEATinCanService }, { type: i3.IDEALoadingService }, { type: i3.IDEAMessageService }, { type: i3.IDEAAWSAPIService }, { type: i3.IDEATranslationsService }], propDecorators: { calendar: [{
100
+ args: [{ selector: 'idea-calendar', template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ 'IDEA_AGENDA.CALENDARS.EDIT_CALENDAR' | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.SAVE' | translate\" (click)=\"save()\">\n <ion-icon name=\"checkmark-circle\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n @if (calendarWC) {\n <div class=\"maxWidthContainer\">\n <ion-list class=\"aList\">\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('name')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.NAME' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.NAME_HINT' | translate\"\n [(ngModel)]=\"calendarWC.name\"\n />\n </ion-item>\n <ion-item\n lines=\"inset\"\n [class.fieldHasError]=\"hasFieldAnError('description')\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n >\n <ion-input\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION' | translate\"\n [placeholder]=\"'IDEA_AGENDA.CALENDARS.DESCRIPTION_HINT' | translate\"\n [(ngModel)]=\"calendarWC.description\"\n />\n </ion-item>\n @if (!hideColor) {\n <idea-color-picker\n [lines]=\"'inset'\"\n [current]=\"calendarWC.color\"\n [label]=\"'IDEA_AGENDA.CALENDARS.COLOR' | translate\"\n [class.fieldHasError]=\"hasFieldAnError('color')\"\n (select)=\"$event ? (calendarWC.color = $event) : null\"\n />\n }\n @if (membershipsChecks && calendarWC.isShared() && advancedPermissions) {\n <idea-checker\n [data]=\"membershipsChecks\"\n [label]=\"'IDEA_AGENDA.CALENDARS.USERS_ALLOWED_TO_MANAGE_APPOINTMENTS' | translate\"\n [searchPlaceholder]=\"'IDEA_AGENDA.CALENDARS.WHO_CAN_MANAGE_APPOINTMENTS' | translate\"\n [noneText]=\"'IDEA_AGENDA.CALENDARS.NOBODY' | translate\"\n [allText]=\"'IDEA_AGENDA.CALENDARS.EVERYONE' | translate\"\n [allowSelectDeselectAll]=\"true\"\n [lines]=\"'inset'\"\n />\n }\n </ion-list>\n @if (calendarWC.external?.service) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_AGENDA.CALENDARS.INFO_ON_CALENDAR' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n @if (calendar.userId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.PRIVATE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"person\" />\n </ion-item>\n }\n @if (calendar.teamId) {\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.TEAM_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"people\" />\n </ion-item>\n }\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.LINKED_TO' | translate }}\n {{ 'IDEA_AGENDA.CALENDARS.SERVICES.' + calendarWC.external.service | translate }}\n <p>{{ calendarWC.external.name }} ({{ calendarWC.external.email }})</p>\n </ion-label>\n <ion-icon slot=\"end\" [name]=\"calendars.getServiceIcon(calendarWC.external.service)\" />\n </ion-item>\n <ion-item lines=\"inset\">\n <ion-label>\n {{ 'IDEA_AGENDA.CALENDARS.ACCESS_LEVELS.' + calendarWC.external.userAccess | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.BASED_ON_EXTERNAL_SERVICE_SHARING_PERMISSION' | translate }}</p>\n </ion-label>\n <ion-icon slot=\"end\" name=\"shield\" />\n </ion-item>\n </ion-list>\n }\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label color=\"danger\">\n <h2>{{ 'IDEA_AGENDA.CALENDARS.DANGEROUS_ZONE' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n <ion-item lines=\"inset\">\n <ion-label class=\"ion-text-wrap\">\n {{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR' | translate }}\n <p>{{ 'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate }}</p>\n </ion-label>\n <ion-button\n color=\"danger\"\n [title]=\"'IDEA_AGENDA.CALENDARS.DELETE_CALENDAR_HINT' | translate\"\n (click)=\"delete()\"\n >\n {{ 'COMMON.DELETE' | translate }}\n </ion-button>\n </ion-item>\n </ion-list>\n </div>\n }\n</ion-content>\n", styles: [".maxWidthContainer{max-width:500px;padding-top:20px}\n"] }]
101
+ }], propDecorators: { calendar: [{
119
102
  type: Input
120
103
  }], advancedPermissions: [{
121
104
  type: Input
122
105
  }], hideColor: [{
123
106
  type: Input
124
107
  }] } });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbW9kdWxlcy9hZ2VuZGEvc3JjL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL21vZHVsZXMvYWdlbmRhL3NyYy9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBYyxNQUFNLGNBQWMsQ0FBQzs7Ozs7OztBQWdCM0QsTUFBTSxPQUFPLHFCQUFxQjtJQW1DaEMsWUFDUyxTQUErQixFQUMvQixTQUEwQixFQUMxQixTQUEwQixFQUMxQixFQUFxQixFQUNyQixPQUEyQixFQUMzQixPQUEyQixFQUMzQixHQUFzQixFQUN0QixDQUEwQjtRQVAxQixjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixNQUFDLEdBQUQsQ0FBQyxDQUF5QjtRQWpCbkM7O1dBRUc7UUFDSSxXQUFNLEdBQWdCLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0M7O1dBRUc7UUFDSSxrQkFBYSxHQUFHLE1BQU0sQ0FBQztJQVczQixDQUFDO0lBQ0csUUFBUTtRQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFFB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QUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQzs4R0F2SVUscUJBQXFCO2tHQUFyQixxQkFBcUIsMkpDbEJsQyx5MEpBOEdBOzsyRkQ1RmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLGVBQWU7NlRBUVQsUUFBUTtzQkFBdkIsS0FBSztnQkFJVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBSVUsU0FBUztzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBBbGVydENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBDYWxlbmRhciwgQ2hlY2ssIE1lbWJlcnNoaXAgfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHtcbiAgSURFQUxvYWRpbmdTZXJ2aWNlLFxuICBJREVBQVdTQVBJU2VydmljZSxcbiAgSURFQVRpbkNhblNlcnZpY2UsXG4gIElERUFNZXNzYWdlU2VydmljZSxcbiAgSURFQVRyYW5zbGF0aW9uc1NlcnZpY2Vcbn0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUNhbGVuZGFyc1NlcnZpY2UgfSBmcm9tICcuL2NhbGVuZGFycy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWRlYS1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGhlIGNhbGVuZGFyIHRvIG1hbmFnZS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjYWxlbmRhcjogQ2FsZW5kYXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gZW5hYmxlIGFkdmFuY2VkIHBlcm1pc3Npb25zIChiYXNlZCBvbiB0aGUgbWVtYmVyc2hpcHMpIG9uIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBhZHZhbmNlZFBlcm1pc3Npb25zOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FsZW5kYXIgY29sb3IgaXMgYW4gaW1wb3J0YW50IGRldGFpbCBvciBpdCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgaGlkZUNvbG9yOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXb3JraW5nIGNvcHkgb2YgdGhlIGNhbGVuZGFyLCB0byB1cGRhdGUgb25seSB3aGVuIGNvbmZpcm1lZC5cbiAgICovXG4gIHB1YmxpYyBfY2FsZW5kYXI6IENhbGVuZGFyO1xuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IHNlbGVjdGluZyBtZW1iZXJzaGlwcy5cbiAgICovXG4gIHB1YmxpYyBtZW1iZXJzaGlwc0NoZWNrczogQ2hlY2tbXTtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IG1lbWJlcnNoaXAuXG4gICAqL1xuICBwdWJsaWMgbWVtYmVyc2hpcDogTWVtYmVyc2hpcDtcbiAgLyoqXG4gICAqIEVycm9ycyB3aGlsZSB2YWxpZGF0aW5nIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgZXJyb3JzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgY29sb3IgZm9yIGEgY2FsZW5kYXIuXG4gICAqL1xuICBwdWJsaWMgREVGQVVMVF9DT0xPUiA9ICcjNTU1JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY2FsZW5kYXJzOiBJREVBQ2FsZW5kYXJzU2VydmljZSxcbiAgICBwdWJsaWMgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHVibGljIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHB1YmxpYyB0YzogSURFQVRpbkNhblNlcnZpY2UsXG4gICAgcHVibGljIGxvYWRpbmc6IElERUFMb2FkaW5nU2VydmljZSxcbiAgICBwdWJsaWMgbWVzc2FnZTogSURFQU1lc3NhZ2VTZXJ2aWNlLFxuICAgIHB1YmxpYyBBUEk6IElERUFBV1NBUElTZXJ2aWNlLFxuICAgIHB1YmxpYyB0OiBJREVBVHJhbnNsYXRpb25zU2VydmljZVxuICApIHt9XG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1lbWJlcnNoaXAgPSB0aGlzLnRjLmdldCgnbWVtYmVyc2hpcCcpO1xuICAgIC8vIHdvcmsgb24gYSBjb3B5XG4gICAgdGhpcy5fY2FsZW5kYXIgPSBuZXcgQ2FsZW5kYXIodGhpcy5jYWxlbmRhcik7XG4gICAgLy8gbG9hZCB0aGUgdGVhbW1hdGVzIHRvIHVzZSBmb3Igc2hhcmVkIGNhbGVuZGFycyBwZXJtaXNzaW9uc1xuICAgIHRoaXMuQVBJLmdldFJlc291cmNlKGB0ZWFtcy8ke3RoaXMubWVtYmVyc2hpcC50ZWFtSWR9L21lbWJlcnNoaXBzYClcbiAgICAgIC50aGVuKFxuICAgICAgICAobWVtYmVyc2hpcHM6IE1lbWJlcnNoaXBbXSkgPT5cbiAgICAgICAgICAodGhpcy5tZW1iZXJzaGlwc0NoZWNrcyA9IG1lbWJlcnNoaXBzLm1hcChcbiAgICAgICAgICAgIG0gPT5cbiAgICAgICAgICAgICAgbmV3IENoZWNrKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbS51c2VySWQsXG4gICAgICAgICAgICAgICAgbmFtZTogbS5uYW1lLFxuICAgICAgICAgICAgICAgIGNoZWNrZWQ6ICh0aGlzLl9jYWxlbmRhci51c2Vyc0Nhbk1hbmFnZUFwcG9pbnRtZW50cyB8fCBbXSkuc29tZSh4ID0+IHggPT09IG0udXNlcklkKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICkpXG4gICAgICApXG4gICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3VwcG9ydCBhcnJheSB0byBkaXNwbGF5IGVycm9ycyBpbiB0aGUgVUkuXG4gICAqL1xuICBwdWJsaWMgaGFzRmllbGRBbkVycm9yKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMuaGFzKGZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgY2FsZW5kYXIgd2l0aCB0aGUgbmV3IGluZm8uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZSgpIHtcbiAgICAvLyBzZXQgdGhlIGRlZmF1bHQgY29sb3IsIGluIGNhc2Ugbm9uZSB3YXMgc2VsZWN0ZWRcbiAgICBpZiAoIXRoaXMuX2NhbGVuZGFyLmNvbG9yKSB0aGlzLl9jYWxlbmRhci5jb2xvciA9IHRoaXMuREVGQVVMVF9DT0xPUjtcbiAgICAvLyBtYXAgdGhlIG1lbWJlcnNoaXBzIGFibGUgdG8gbWFuYWdlIGFwcG9pbnRtZW50c1xuICAgIGlmICh0aGlzLl9jYWxlbmRhci5pc1NoYXJlZCgpICYmIHRoaXMuYWR2YW5jZWRQZXJtaXNzaW9ucylcbiAgICAgIHRoaXMuX2NhbGVuZGFyLnVzZXJzQ2FuTWFuYWdlQXBwb2ludG1lbnRzID0gdGhpcy5tZW1iZXJzaGlwc0NoZWNrc1xuICAgICAgICAuZmlsdGVyKHggPT4geC5jaGVja2VkKVxuICAgICAgICAubWFwKHggPT4gU3RyaW5nKHgudmFsdWUpKTtcbiAgICBlbHNlIGRlbGV0ZSB0aGlzLl9jYWxlbmRhci51c2Vyc0Nhbk1hbmFnZUFwcG9pbnRtZW50cztcbiAgICAvLyBjaGVja2luZ3NcbiAgICB0aGlzLmVycm9ycyA9IG5ldyBTZXQodGhpcy5fY2FsZW5kYXIudmFsaWRhdGUoKSk7XG4gICAgaWYgKHRoaXMuZXJyb3JzLnNpemUpIHJldHVybiB0aGlzLm1lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5GT1JNX0hBU19FUlJPUl9UT19DSEVDSycpO1xuICAgIC8vIHNlbmQgYSBwdXQgcmVxdWVzdFxuICAgIGF3YWl0IHRoaXMubG9hZGluZy5zaG93KCk7XG4gICAgdGhpcy5jYWxlbmRhcnNcbiAgICAgIC5wdXRDYWxlbmRhcih0aGlzLl9jYWxlbmRhcilcbiAgICAgIC50aGVuKChyZXM6IENhbGVuZGFyKSA9PiB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIubG9hZChyZXMpO1xuICAgICAgICB0aGlzLm1lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX1NBVkVEJyk7XG4gICAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3ModGhpcy5jYWxlbmRhcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHRoaXMubWVzc2FnZS5lcnJvcignQ09NTU9OLk9QRVJBVElPTl9GQUlMRUQnKSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZy5oaWRlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIHRoaXMuYWxlcnRDdHJsXG4gICAgICAuY3JlYXRlKHtcbiAgICAgICAgaGVhZGVyOiB0aGlzLnQuXygnQ09NTU9OLkFSRV9ZT1VfU1VSRScpLFxuICAgICAgICBzdWJIZWFkZXI6IHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSJyksXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSX0hJTlQnKSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHsgdGV4dDogdGhpcy50Ll8oJ0NPTU1PTi5DQU5DRUwnKSwgcm9sZTogJ2NhbmNlbCcgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnQuXygnQ09NTU9OLkRFTEVURScpLFxuICAgICAgICAgICAgaGFuZGxlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRpbmcuc2hvdygpO1xuICAgICAgICAgICAgICB0aGlzLmNhbGVuZGFyc1xuICAgICAgICAgICAgICAgIC5kZWxldGVDYWxlbmRhcih0aGlzLl9jYWxlbmRhcilcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX0RFTEVURUQnKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3ModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gdGhpcy5tZXNzYWdlLmVycm9yKCdDT01NT04uT1BFUkFUSU9OX0ZBSUxFRCcpKVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZy5oaWRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSlcbiAgICAgIC50aGVuKGFsZXJ0ID0+IGFsZXJ0LnByZXNlbnQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpIHtcbiAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYnV0dG9uIFt0aXRsZV09XCJ0Ll8oJ0NPTU1PTi5DTE9TRScpXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1jaXJjbGVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tdGl0bGU+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5FRElUX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICA8aW9uLWJ1dHRvbiBbdGl0bGVdPVwidC5fKCdDT01NT04uU0FWRScpXCIgKGNsaWNrKT1cInNhdmUoKVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZWNrbWFyay1jaXJjbGVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8ZGl2IGNsYXNzPVwibWF4V2lkdGhDb250YWluZXJcIiAqbmdJZj1cIl9jYWxlbmRhclwiPlxuICAgIDxpb24tbGlzdCBjbGFzcz1cImFMaXN0XCI+XG4gICAgICA8aW9uLWl0ZW1cbiAgICAgICAgbGluZXM9XCJpbnNldFwiXG4gICAgICAgIFtjbGFzcy5maWVsZEhhc0Vycm9yXT1cImhhc0ZpZWxkQW5FcnJvcignbmFtZScpXCJcbiAgICAgICAgW3RpdGxlXT1cInQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUVfSElOVCcpXCJcbiAgICAgID5cbiAgICAgICAgPGlvbi1sYWJlbCBwb3NpdGlvbj1cInN0YWNrZWRcIj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUUnIHwgdHJhbnNsYXRlIH19IDwvaW9uLWxhYmVsPlxuICAgICAgICA8aW9uLWlucHV0IFtwbGFjZWhvbGRlcl09XCJ0Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5OQU1FX0hJTlQnKVwiIFsobmdNb2RlbCldPVwiX2NhbGVuZGFyLm5hbWVcIj48L2lvbi1pbnB1dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8aW9uLWl0ZW1cbiAgICAgICAgbGluZXM9XCJpbnNldFwiXG4gICAgICAgIFtjbGFzcy5maWVsZEhhc0Vycm9yXT1cImhhc0ZpZWxkQW5FcnJvcignZGVzY3JpcHRpb24nKVwiXG4gICAgICAgIFt0aXRsZV09XCJ0Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERVNDUklQVElPTl9ISU5UJylcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWxhYmVsIHBvc2l0aW9uPVwic3RhY2tlZFwiPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVTQ1JJUFRJT04nIHwgdHJhbnNsYXRlIH19IDwvaW9uLWxhYmVsPlxuICAgICAgICA8aW9uLWlucHV0XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFU0NSSVBUSU9OX0hJTlQnKVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJfY2FsZW5kYXIuZGVzY3JpcHRpb25cIlxuICAgICAgICA+PC9pb24taW5wdXQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgICAgPGlkZWEtY29sb3ItcGlja2VyXG4gICAgICAgICpuZ0lmPVwiIWhpZGVDb2xvclwiXG4gICAgICAgIFtsaW5lc109XCInaW5zZXQnXCJcbiAgICAgICAgW2N1cnJlbnRdPVwiX2NhbGVuZGFyLmNvbG9yXCJcbiAgICAgICAgW2xhYmVsXT1cInQuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNPTE9SJylcIlxuICAgICAgICBbY2xhc3MuZmllbGRIYXNFcnJvcl09XCJoYXNGaWVsZEFuRXJyb3IoJ2NvbG9yJylcIlxuICAgICAgICAoc2VsZWN0KT1cIiRldmVudCA/IChfY2FsZW5kYXIuY29sb3IgPSAkZXZlbnQpIDogbnVsbFwiXG4gICAgICA+PC9pZGVhLWNvbG9yLXBpY2tlcj5cbiAgICAgIDxpZGVhLWNoZWNrZXJcbiAgICAgICAgKm5nSWY9XCJtZW1iZXJzaGlwc0NoZWNrcyAmJiBfY2FsZW5kYXIuaXNTaGFyZWQoKSAmJiBhZHZhbmNlZFBlcm1pc3Npb25zXCJcbiAgICAgICAgW2RhdGFdPVwibWVtYmVyc2hpcHNDaGVja3NcIlxuICAgICAgICBbbGFiZWxdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuVVNFUlNfQUxMT1dFRF9UT19NQU5BR0VfQVBQT0lOVE1FTlRTJylcIlxuICAgICAgICBbc2VhcmNoUGxhY2Vob2xkZXJdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuV0hPX0NBTl9NQU5BR0VfQVBQT0lOVE1FTlRTJylcIlxuICAgICAgICBbbm9uZVRleHRdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTk9CT0RZJylcIlxuICAgICAgICBbYWxsVGV4dF09XCJ0Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5FVkVSWU9ORScpXCJcbiAgICAgICAgW2FsbG93U2VsZWN0RGVzZWxlY3RBbGxdPVwidHJ1ZVwiXG4gICAgICAgIFtsaW5lc109XCInaW5zZXQnXCJcbiAgICAgID48L2lkZWEtY2hlY2tlcj5cbiAgICA8L2lvbi1saXN0PlxuICAgIDxpb24tbGlzdCBjbGFzcz1cImFMaXN0XCIgKm5nSWY9XCJfY2FsZW5kYXIuZXh0ZXJuYWw/LnNlcnZpY2VcIj5cbiAgICAgIDxpb24tbGlzdC1oZWFkZXI+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgPGgyPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuSU5GT19PTl9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX08L2gyPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWxpc3QtaGVhZGVyPlxuICAgICAgPGlvbi1pdGVtIGxpbmVzPVwiaW5zZXRcIiAqbmdJZj1cImNhbGVuZGFyLnVzZXJJZFwiPlxuICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuUFJJVkFURV9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8cD57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBSSVZBVEVfQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIG5hbWU9XCJwZXJzb25cIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24taXRlbT5cbiAgICAgIDxpb24taXRlbSBsaW5lcz1cImluc2V0XCIgKm5nSWY9XCJjYWxlbmRhci50ZWFtSWRcIj5cbiAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5URUFNX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwicGVvcGxlXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8aW9uLWl0ZW0gbGluZXM9XCJpbnNldFwiPlxuICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTElOS0VEX1RPJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuU0VSVklDRVMuJyArIF9jYWxlbmRhci5leHRlcm5hbC5zZXJ2aWNlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHA+e3sgX2NhbGVuZGFyLmV4dGVybmFsLm5hbWUgfX0gKHt7IF9jYWxlbmRhci5leHRlcm5hbC5lbWFpbCB9fSk8L3A+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIFtuYW1lXT1cImNhbGVuZGFycy5nZXRTZXJ2aWNlSWNvbihfY2FsZW5kYXIuZXh0ZXJuYWwuc2VydmljZSlcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24taXRlbT5cbiAgICAgIDxpb24taXRlbSBsaW5lcz1cImluc2V0XCI+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5BQ0NFU1NfTEVWRUxTLicgKyBfY2FsZW5kYXIuZXh0ZXJuYWwudXNlckFjY2VzcyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuQkFTRURfT05fRVhURVJOQUxfU0VSVklDRV9TSEFSSU5HX1BFUk1JU1NJT04nIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwic2hpZWxkXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9pb24tbGlzdD5cbiAgICA8aW9uLWxpc3QgY2xhc3M9XCJhTGlzdFwiPlxuICAgICAgPGlvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiPlxuICAgICAgICAgIDxoMj57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRBTkdFUk9VU19aT05FJyB8IHRyYW5zbGF0ZSB9fTwvaDI+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICA8aW9uLWl0ZW0gbGluZXM9XCJpbnNldFwiPlxuICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiaW9uLXRleHQtd3JhcFwiPlxuICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDxwPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJkYW5nZXJcIiBbdGl0bGVdPVwidC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSX0hJTlQnKVwiIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgIHt7ICdDT01NT04uREVMRVRFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvaW9uLWxpc3Q+XG4gIDwvZGl2PlxuPC9pb24tY29udGVudD5cbiJdfQ==
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbW9kdWxlcy9hZ2VuZGEvc3JjL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL21vZHVsZXMvYWdlbmRhL3NyYy9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBYyxNQUFNLGNBQWMsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN4QixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztBQU8zRCxNQUFNLE9BQU8scUJBQXFCO0lBTGxDO1FBc0JFLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQzNCLGtCQUFhLEdBQUcsTUFBTSxDQUFDO1FBRWYsZUFBVSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzFDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxTQUFJLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0tBNEV0RDtJQTFFQyxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQWlCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sY0FBYyxDQUFDLENBQUM7WUFDN0csSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQ0YsSUFBSSxLQUFLLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNO2dCQUNmLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDWixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLDBCQUEwQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO2FBQ3RGLENBQUMsQ0FDTCxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN2RSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLG1CQUFtQjtZQUN4RCxJQUFJLENBQUMsVUFBVSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxpQkFBaUI7aUJBQ2hFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7aUJBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7WUFDMUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDO1FBRXZELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRW5GLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDakQsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxRQUFRLEdBQUcsS0FBSyxJQUFtQixFQUFFO1lBQ3pDLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDN0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRixNQUFNLE9BQU8sR0FBRztZQUNkLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDNUQsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtTQUNoRSxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEYsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDOzhHQXRHVSxxQkFBcUI7a0dBQXJCLHFCQUFxQiwySkNsQmxDLHV5S0FpSUE7OzJGRC9HYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsZUFBZTs4QkFRaEIsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIEFsZXJ0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IENhbGVuZGFyLCBDaGVjaywgTWVtYmVyc2hpcCB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQge1xuICBJREVBTG9hZGluZ1NlcnZpY2UsXG4gIElERUFBV1NBUElTZXJ2aWNlLFxuICBJREVBVGluQ2FuU2VydmljZSxcbiAgSURFQU1lc3NhZ2VTZXJ2aWNlLFxuICBJREVBVHJhbnNsYXRpb25zU2VydmljZVxufSBmcm9tICdAaWRlYS1pb25pYy9jb21tb24nO1xuXG5pbXBvcnQgeyBJREVBQ2FsZW5kYXJzU2VydmljZSB9IGZyb20gJy4vY2FsZW5kYXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjYWxlbmRhci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIElERUFDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBUaGUgY2FsZW5kYXIgdG8gbWFuYWdlLlxuICAgKi9cbiAgQElucHV0KCkgY2FsZW5kYXI6IENhbGVuZGFyO1xuICAvKipcbiAgICogV2hldGhlciB3ZSB3YW50IHRvIGVuYWJsZSBhZHZhbmNlZCBwZXJtaXNzaW9ucyAoYmFzZWQgb24gdGhlIG1lbWJlcnNoaXBzKSBvbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBhZHZhbmNlZFBlcm1pc3Npb25zOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FsZW5kYXIgY29sb3IgaXMgYW4gaW1wb3J0YW50IGRldGFpbCBvciBpdCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoKSBoaWRlQ29sb3I6IGJvb2xlYW47XG5cbiAgY2FsZW5kYXJXQzogQ2FsZW5kYXI7XG4gIG1lbWJlcnNoaXBzQ2hlY2tzOiBDaGVja1tdO1xuICBtZW1iZXJzaGlwOiBNZW1iZXJzaGlwO1xuICBlcnJvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgREVGQVVMVF9DT0xPUiA9ICcjNTU1JztcblxuICBwcml2YXRlIF9jYWxlbmRhcnMgPSBpbmplY3QoSURFQUNhbGVuZGFyc1NlcnZpY2UpO1xuICBwcml2YXRlIF9tb2RhbCA9IGluamVjdChNb2RhbENvbnRyb2xsZXIpO1xuICBwcml2YXRlIF9hbGVydCA9IGluamVjdChBbGVydENvbnRyb2xsZXIpO1xuICBwcml2YXRlIF90YyA9IGluamVjdChJREVBVGluQ2FuU2VydmljZSk7XG4gIHByaXZhdGUgX2xvYWRpbmcgPSBpbmplY3QoSURFQUxvYWRpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChJREVBTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIF9BUEkgPSBpbmplY3QoSURFQUFXU0FQSVNlcnZpY2UpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubWVtYmVyc2hpcCA9IHRoaXMuX3RjLmdldCgnbWVtYmVyc2hpcCcpO1xuICAgIHRoaXMuY2FsZW5kYXJXQyA9IG5ldyBDYWxlbmRhcih0aGlzLmNhbGVuZGFyKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWVtYmVyc2hpcHM6IE1lbWJlcnNoaXBbXSA9IGF3YWl0IHRoaXMuX0FQSS5nZXRSZXNvdXJjZShgdGVhbXMvJHt0aGlzLm1lbWJlcnNoaXAudGVhbUlkfS9tZW1iZXJzaGlwc2ApO1xuICAgICAgdGhpcy5tZW1iZXJzaGlwc0NoZWNrcyA9IG1lbWJlcnNoaXBzLm1hcChcbiAgICAgICAgbSA9PlxuICAgICAgICAgIG5ldyBDaGVjayh7XG4gICAgICAgICAgICB2YWx1ZTogbS51c2VySWQsXG4gICAgICAgICAgICBuYW1lOiBtLm5hbWUsXG4gICAgICAgICAgICBjaGVja2VkOiAodGhpcy5jYWxlbmRhcldDLnVzZXJzQ2FuTWFuYWdlQXBwb2ludG1lbnRzIHx8IFtdKS5zb21lKHggPT4geCA9PT0gbS51c2VySWQpXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5DT1VMRE5UX0xPQURfTElTVCcpO1xuICAgIH1cbiAgfVxuXG4gIGhhc0ZpZWxkQW5FcnJvcihmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmhhcyhmaWVsZCk7XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jYWxlbmRhcldDLmNvbG9yKSB0aGlzLmNhbGVuZGFyV0MuY29sb3IgPSB0aGlzLkRFRkFVTFRfQ09MT1I7XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJXQy5pc1NoYXJlZCgpICYmIHRoaXMuYWR2YW5jZWRQZXJtaXNzaW9ucylcbiAgICAgIHRoaXMuY2FsZW5kYXJXQy51c2Vyc0Nhbk1hbmFnZUFwcG9pbnRtZW50cyA9IHRoaXMubWVtYmVyc2hpcHNDaGVja3NcbiAgICAgICAgLmZpbHRlcih4ID0+IHguY2hlY2tlZClcbiAgICAgICAgLm1hcCh4ID0+IFN0cmluZyh4LnZhbHVlKSk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5jYWxlbmRhcldDLnVzZXJzQ2FuTWFuYWdlQXBwb2ludG1lbnRzO1xuXG4gICAgdGhpcy5lcnJvcnMgPSBuZXcgU2V0KHRoaXMuY2FsZW5kYXJXQy52YWxpZGF0ZSgpKTtcbiAgICBpZiAodGhpcy5lcnJvcnMuc2l6ZSkgcmV0dXJuIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5GT1JNX0hBU19FUlJPUl9UT19DSEVDSycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRpbmcuc2hvdygpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fY2FsZW5kYXJzLnB1dENhbGVuZGFyKHRoaXMuY2FsZW5kYXJXQyk7XG4gICAgICB0aGlzLmNhbGVuZGFyLmxvYWQocmVzKTtcbiAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX1NBVkVEJyk7XG4gICAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKHRoaXMuY2FsZW5kYXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9tZXNzYWdlLmVycm9yKCdDT01NT04uT1BFUkFUSU9OX0ZBSUxFRCcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZG9EZWxldGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9sb2FkaW5nLnNob3coKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2FsZW5kYXJzLmRlbGV0ZUNhbGVuZGFyKHRoaXMuY2FsZW5kYXJXQyk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkNBTEVOREFSX0RFTEVURUQnKTtcbiAgICAgICAgdGhpcy5fbW9kYWwuZGlzbWlzcyh0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoJ0NPTU1PTi5PUEVSQVRJT05fRkFJTEVEJyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5BUkVfWU9VX1NVUkUnKTtcbiAgICBjb25zdCBzdWJIZWFkZXIgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFTEVURV9DQUxFTkRBUicpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFTEVURV9DQUxFTkRBUl9ISU5UJyk7XG4gICAgY29uc3QgYnV0dG9ucyA9IFtcbiAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5DQU5DRUwnKSwgcm9sZTogJ2NhbmNlbCcgfSxcbiAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5ERUxFVEUnKSwgaGFuZGxlcjogZG9EZWxldGUgfVxuICAgIF07XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoeyBoZWFkZXIsIHN1YkhlYWRlciwgbWVzc2FnZSwgYnV0dG9ucyB9KTtcbiAgICBhbGVydC5wcmVzZW50KCk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYnV0dG9uIFt0aXRsZV09XCInQ09NTU9OLkNMT1NFJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2xvc2UtY2lyY2xlXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgICA8aW9uLXRpdGxlPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuRURJVF9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX08L2lvbi10aXRsZT5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidDT01NT04uU0FWRScgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwic2F2ZSgpXCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hlY2ttYXJrLWNpcmNsZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG48aW9uLWNvbnRlbnQ+XG4gIEBpZiAoY2FsZW5kYXJXQykge1xuICAgIDxkaXYgY2xhc3M9XCJtYXhXaWR0aENvbnRhaW5lclwiPlxuICAgICAgPGlvbi1saXN0IGNsYXNzPVwiYUxpc3RcIj5cbiAgICAgICAgPGlvbi1pdGVtXG4gICAgICAgICAgbGluZXM9XCJpbnNldFwiXG4gICAgICAgICAgW2NsYXNzLmZpZWxkSGFzRXJyb3JdPVwiaGFzRmllbGRBbkVycm9yKCduYW1lJylcIlxuICAgICAgICAgIFt0aXRsZV09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUVfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJzdGFja2VkXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5BTUVfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjYWxlbmRhcldDLm5hbWVcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIDxpb24taXRlbVxuICAgICAgICAgIGxpbmVzPVwiaW5zZXRcIlxuICAgICAgICAgIFtjbGFzcy5maWVsZEhhc0Vycm9yXT1cImhhc0ZpZWxkQW5FcnJvcignZGVzY3JpcHRpb24nKVwiXG4gICAgICAgICAgW3RpdGxlXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVTQ1JJUFRJT05fSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJzdGFja2VkXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFU0NSSVBUSU9OJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERVNDUklQVElPTl9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNhbGVuZGFyV0MuZGVzY3JpcHRpb25cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIEBpZiAoIWhpZGVDb2xvcikge1xuICAgICAgICAgIDxpZGVhLWNvbG9yLXBpY2tlclxuICAgICAgICAgICAgW2xpbmVzXT1cIidpbnNldCdcIlxuICAgICAgICAgICAgW2N1cnJlbnRdPVwiY2FsZW5kYXJXQy5jb2xvclwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DT0xPUicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2NsYXNzLmZpZWxkSGFzRXJyb3JdPVwiaGFzRmllbGRBbkVycm9yKCdjb2xvcicpXCJcbiAgICAgICAgICAgIChzZWxlY3QpPVwiJGV2ZW50ID8gKGNhbGVuZGFyV0MuY29sb3IgPSAkZXZlbnQpIDogbnVsbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKG1lbWJlcnNoaXBzQ2hlY2tzICYmIGNhbGVuZGFyV0MuaXNTaGFyZWQoKSAmJiBhZHZhbmNlZFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgPGlkZWEtY2hlY2tlclxuICAgICAgICAgICAgW2RhdGFdPVwibWVtYmVyc2hpcHNDaGVja3NcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidJREVBX0FHRU5EQS5DQUxFTkRBUlMuVVNFUlNfQUxMT1dFRF9UT19NQU5BR0VfQVBQT0lOVE1FTlRTJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbc2VhcmNoUGxhY2Vob2xkZXJdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5XSE9fQ0FOX01BTkFHRV9BUFBPSU5UTUVOVFMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtub25lVGV4dF09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLk5PQk9EWScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2FsbFRleHRdPVwiJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5FVkVSWU9ORScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2FsbG93U2VsZWN0RGVzZWxlY3RBbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbGluZXNdPVwiJ2luc2V0J1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgPC9pb24tbGlzdD5cbiAgICAgIEBpZiAoY2FsZW5kYXJXQy5leHRlcm5hbD8uc2VydmljZSkge1xuICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJhTGlzdFwiPlxuICAgICAgICAgIDxpb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8aDI+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5JTkZPX09OX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fTwvaDI+XG4gICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgICBAaWYgKGNhbGVuZGFyLnVzZXJJZCkge1xuICAgICAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwiaW5zZXRcIj5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlBSSVZBVEVfQ0FMRU5EQVInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5QUklWQVRFX0NBTEVOREFSX0hJTlQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwicGVyc29uXCIgLz5cbiAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY2FsZW5kYXIudGVhbUlkKSB7XG4gICAgICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJpbnNldFwiPlxuICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuVEVBTV9DQUxFTkRBUicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8cD57eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlRFQU1fQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIG5hbWU9XCJwZW9wbGVcIiAvPlxuICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwiaW5zZXRcIj5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTElOS0VEX1RPJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICB7eyAnSURFQV9BR0VOREEuQ0FMRU5EQVJTLlNFUlZJQ0VTLicgKyBjYWxlbmRhcldDLmV4dGVybmFsLnNlcnZpY2UgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPHA+e3sgY2FsZW5kYXJXQy5leHRlcm5hbC5uYW1lIH19ICh7eyBjYWxlbmRhcldDLmV4dGVybmFsLmVtYWlsIH19KTwvcD5cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBbbmFtZV09XCJjYWxlbmRhcnMuZ2V0U2VydmljZUljb24oY2FsZW5kYXJXQy5leHRlcm5hbC5zZXJ2aWNlKVwiIC8+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJpbnNldFwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAge3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5BQ0NFU1NfTEVWRUxTLicgKyBjYWxlbmRhcldDLmV4dGVybmFsLnVzZXJBY2Nlc3MgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5CQVNFRF9PTl9FWFRFUk5BTF9TRVJWSUNFX1NIQVJJTkdfUEVSTUlTU0lPTicgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiZW5kXCIgbmFtZT1cInNoaWVsZFwiIC8+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgIH1cbiAgICAgIDxpb24tbGlzdCBjbGFzcz1cImFMaXN0XCI+XG4gICAgICAgIDxpb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiPlxuICAgICAgICAgICAgPGgyPnt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREFOR0VST1VTX1pPTkUnIHwgdHJhbnNsYXRlIH19PC9oMj5cbiAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICAgIDxpb24taXRlbSBsaW5lcz1cImluc2V0XCI+XG4gICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImlvbi10ZXh0LXdyYXBcIj5cbiAgICAgICAgICAgIHt7ICdJREVBX0FHRU5EQS5DQUxFTkRBUlMuREVMRVRFX0NBTEVOREFSJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPHA+e3sgJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5ERUxFVEVfQ0FMRU5EQVJfSElOVCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwiZGFuZ2VyXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInSURFQV9BR0VOREEuQ0FMRU5EQVJTLkRFTEVURV9DQUxFTkRBUl9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdDT01NT04uREVMRVRFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24taXRlbT5cbiAgICAgIDwvaW9uLWxpc3Q+XG4gICAgPC9kaXY+XG4gIH1cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=