@smarterplan/ngx-smarterplan-admin 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/esm2022/lib/admin/admin.component.mjs +36 -0
  2. package/esm2022/lib/chevron/chevron.component.mjs +19 -0
  3. package/{esm2020 → esm2022}/lib/guest-link/guest-link.component.mjs +70 -62
  4. package/esm2022/lib/guide.guard.mjs +29 -0
  5. package/{esm2020 → esm2022}/lib/helpers.mjs +24 -24
  6. package/esm2022/lib/name-from-id.pipe.mjs +31 -0
  7. package/esm2022/lib/ngx-smarterplan-admin-routing.module.mjs +48 -0
  8. package/esm2022/lib/ngx-smarterplan-admin.module.mjs +89 -0
  9. package/esm2022/lib/ngx-smarterplan-admin.service.mjs +15 -0
  10. package/esm2022/lib/organisation/organisation.component.mjs +182 -0
  11. package/esm2022/lib/sp-admin.guard.mjs +29 -0
  12. package/esm2022/lib/user/detail-organisation/detail-organisation.component.mjs +207 -0
  13. package/esm2022/lib/user/form-mission/form-mission.component.mjs +290 -0
  14. package/esm2022/lib/user/form-organisation/form-organisation.component.mjs +139 -0
  15. package/esm2022/lib/user/user-mission-form/user-mission-form.component.mjs +132 -0
  16. package/esm2022/lib/user/user.component.mjs +353 -0
  17. package/esm2022/lib/visitor/create-batch/create-batch.component.mjs +112 -0
  18. package/esm2022/lib/visitor/template/template.component.mjs +295 -0
  19. package/esm2022/lib/visitor/visitor.component.mjs +318 -0
  20. package/{esm2020 → esm2022}/public-api.mjs +5 -5
  21. package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-admin.mjs +4 -4
  22. package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs +2205 -2065
  23. package/{fesm2015 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
  24. package/index.d.ts +5 -5
  25. package/lib/admin/admin.component.d.ts +13 -13
  26. package/lib/chevron/chevron.component.d.ts +9 -9
  27. package/lib/guest-link/guest-link.component.d.ts +20 -20
  28. package/lib/guide.guard.d.ts +11 -11
  29. package/lib/helpers.d.ts +2 -2
  30. package/lib/name-from-id.pipe.d.ts +11 -11
  31. package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -7
  32. package/lib/ngx-smarterplan-admin.module.d.ts +26 -26
  33. package/lib/ngx-smarterplan-admin.service.d.ts +6 -6
  34. package/lib/organisation/organisation.component.d.ts +54 -54
  35. package/lib/sp-admin.guard.d.ts +11 -11
  36. package/lib/user/detail-organisation/detail-organisation.component.d.ts +49 -49
  37. package/lib/user/form-mission/form-mission.component.d.ts +63 -63
  38. package/lib/user/form-organisation/form-organisation.component.d.ts +32 -32
  39. package/lib/user/user-mission-form/user-mission-form.component.d.ts +32 -32
  40. package/lib/user/user.component.d.ts +102 -102
  41. package/lib/visitor/create-batch/create-batch.component.d.ts +23 -23
  42. package/lib/visitor/template/template.component.d.ts +58 -58
  43. package/lib/visitor/visitor.component.d.ts +70 -70
  44. package/package.json +11 -17
  45. package/public-api.d.ts +2 -2
  46. package/esm2020/lib/admin/admin.component.mjs +0 -34
  47. package/esm2020/lib/chevron/chevron.component.mjs +0 -19
  48. package/esm2020/lib/guide.guard.mjs +0 -26
  49. package/esm2020/lib/name-from-id.pipe.mjs +0 -29
  50. package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +0 -47
  51. package/esm2020/lib/ngx-smarterplan-admin.module.mjs +0 -88
  52. package/esm2020/lib/ngx-smarterplan-admin.service.mjs +0 -14
  53. package/esm2020/lib/organisation/organisation.component.mjs +0 -171
  54. package/esm2020/lib/sp-admin.guard.mjs +0 -26
  55. package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +0 -191
  56. package/esm2020/lib/user/form-mission/form-mission.component.mjs +0 -265
  57. package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +0 -125
  58. package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +0 -121
  59. package/esm2020/lib/user/user.component.mjs +0 -336
  60. package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +0 -106
  61. package/esm2020/lib/visitor/template/template.component.mjs +0 -277
  62. package/esm2020/lib/visitor/visitor.component.mjs +0 -299
  63. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +0 -2245
  64. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs.map +0 -1
@@ -0,0 +1,207 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { deleteFromS3, getSignedFile, removeNullKeysFromObject, uploadFileToS3 } from '@smarterplan/ngx-smarterplan-core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@smarterplan/ngx-smarterplan-core";
5
+ import * as i2 from "@angular/forms";
6
+ import * as i3 from "@ngx-translate/core";
7
+ import * as i4 from "@angular/common";
8
+ class DetailOrganisationComponent {
9
+ organisationService;
10
+ formBuilder;
11
+ propertyService;
12
+ missionService;
13
+ translate;
14
+ org;
15
+ currentOrg;
16
+ isSP;
17
+ orgChanged = new EventEmitter();
18
+ myOrg;
19
+ tokenExpired;
20
+ loading = false;
21
+ connectingStripe = false;
22
+ modalRef;
23
+ errorMessage;
24
+ editForm;
25
+ fileToUpload;
26
+ signedLogo;
27
+ constructor(organisationService,
28
+ // private localStripe: StripeService,
29
+ formBuilder, propertyService, missionService, translate) {
30
+ this.organisationService = organisationService;
31
+ this.formBuilder = formBuilder;
32
+ this.propertyService = propertyService;
33
+ this.missionService = missionService;
34
+ this.translate = translate;
35
+ }
36
+ async ngOnInit() {
37
+ this.myOrg = this.currentOrg.id === this.org.id;
38
+ if (!this.org.connectedAccountStripeID && (this.myOrg || this.isSP)) {
39
+ this.setConnectStripeLink();
40
+ }
41
+ if (this.org.logoUrl) {
42
+ this.signedLogo = await getSignedFile(this.org.logoUrl);
43
+ }
44
+ }
45
+ ngOnChanges() {
46
+ this.myOrg = this.currentOrg.id === this.org.id;
47
+ }
48
+ /**
49
+ * Tokens were supposed to be used if Organisation exists already (created by one account) and it should be resused (by another account) instead of creating a duplicate.
50
+ */
51
+ // async onToken() {
52
+ // const token = uuidv4();
53
+ // const expires = new Date();
54
+ // expires.setDate(expires.getDate() + 7); // 7 days expiration
55
+ // this.org = await this.organisationService.updateOrganisation({
56
+ // id: this.org.id,
57
+ // shareToken: token,
58
+ // tokenExpiresAt: expires.getTime(),
59
+ // });
60
+ // this.orgChanged.emit(true);
61
+ // }
62
+ prettifyToken() {
63
+ const expirationDate = new Date(this.org.tokenExpiresAt);
64
+ const diffTime = expirationDate.getTime() - Date.now();
65
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
66
+ const expirationString = diffTime < 0 ? "expired!" : `expires in ${diffDays} days`;
67
+ return `${this.org.shareToken.slice(0, 6)}... ${expirationString}`;
68
+ }
69
+ /**
70
+ * Created New Stripe Account and launches onboarding procedure (mail, phone, business details..) by Stripe
71
+ * @returns null
72
+ */
73
+ // async onCreateStripe() {
74
+ // this.loading = true;
75
+ // // Make the request
76
+ // const responseAccount = await API.post(
77
+ // "stripeApi",
78
+ // "/create/account",
79
+ // {},
80
+ // );
81
+ // console.log(responseAccount);
82
+ // if (responseAccount.err) {
83
+ // this.handleStripeError(responseAccount);
84
+ // return;
85
+ // }
86
+ // const { account } = responseAccount;
87
+ // // save account id to organisation
88
+ // await this.organisationService.update({
89
+ // id: this.org.id,
90
+ // connectedAccountStripeID: account.id,
91
+ // stripeOnBoardingCompleted: false,
92
+ // });
93
+ // const { origin } = document.location;
94
+ // const responseAccountLinks = await this.localStripe.createAccountLink(
95
+ // account.id,
96
+ // origin,
97
+ // );
98
+ // if (responseAccountLinks.err) {
99
+ // this.handleStripeError(responseAccountLinks);
100
+ // return;
101
+ // }
102
+ // window.location.href = responseAccountLinks.accountLinks.url;
103
+ // this.loading = false;
104
+ // }
105
+ // async onCompleteOnboardingStripe() {
106
+ // this.loading = true;
107
+ // const responseAccountLinks = await this.localStripe.createAccountLink(
108
+ // this.org.connectedAccountStripeID,
109
+ // origin,
110
+ // );
111
+ // if (responseAccountLinks.err) {
112
+ // this.handleStripeError(responseAccountLinks);
113
+ // return;
114
+ // }
115
+ // window.location.href = responseAccountLinks.accountLinks.url;
116
+ // this.loading = false;
117
+ // }
118
+ // handleStripeError(stripeResponse) {
119
+ // alert(stripeResponse.err.raw.message);
120
+ // this.loading = false;
121
+ // }
122
+ /**
123
+ * Generate link for Launching OAuth connection with Stripe: https://stripe.com/docs/connect/oauth-standard-accounts#integrating-oauth
124
+ */
125
+ setConnectStripeLink() {
126
+ setTimeout(() => {
127
+ const hyperlink = document.querySelector("#linkStripe");
128
+ if (hyperlink) {
129
+ const clientID = "ca_KQhYOlgR1ipOxLBBQHfQeCLoaySRVD5P"; // TODO change for live Stripe Account
130
+ const { origin } = document.location;
131
+ const returnUrl = `${origin}/stripe/redirect`;
132
+ hyperlink.setAttribute("href", `https://connect.stripe.com/oauth/authorize?response_type=code&client_id=${clientID}&scope=read_write&redirect_uri=${returnUrl}&state=${this.org.id}`);
133
+ }
134
+ }, 200); // wait until the element is rendered
135
+ }
136
+ /** Edit */
137
+ onEdit() {
138
+ this.editForm = this.formBuilder.group({
139
+ id: this.org.id,
140
+ name: this.org.name,
141
+ siret: this.org.siret,
142
+ city: this.org.city,
143
+ address: this.org.address,
144
+ contactDetails: this.org.contactDetails,
145
+ postal: this.org.postal,
146
+ });
147
+ }
148
+ get name() {
149
+ return this.editForm.get("name");
150
+ }
151
+ async onSubmit() {
152
+ const formValue = this.editForm.value;
153
+ removeNullKeysFromObject(formValue);
154
+ try {
155
+ const updatedOrg = await this.organisationService.updateOrganisation(formValue);
156
+ this.org = updatedOrg;
157
+ if (this.fileToUpload) {
158
+ if (this.org.logoUrl) {
159
+ // delete the previous
160
+ await deleteFromS3(this.org.logoUrl);
161
+ }
162
+ await uploadFileToS3("logos/", this.fileToUpload, this.org.id).then(async (url) => {
163
+ await this.organisationService.updateOrganisation({ id: this.org.id, logoUrl: url });
164
+ });
165
+ }
166
+ }
167
+ catch (error) {
168
+ console.error(JSON.stringify(error));
169
+ }
170
+ this.editForm = null;
171
+ }
172
+ onCancel() {
173
+ this.editForm = null;
174
+ }
175
+ handleFileInput(event) {
176
+ const target = event.target;
177
+ this.fileToUpload = target.files.item(0);
178
+ }
179
+ async onDelete() {
180
+ const message = this.translate.instant("confirm.deleteOrganisation");
181
+ if (window.confirm(message) && this.org.id !== "6e28201f-4679-4c29-9d2d-8a325f57cee9") {
182
+ const propertiesToDelete = await this.propertyService.getPropertiesForOrganisation(this.org.id);
183
+ await this.organisationService.softDeteleOrg(this.org.id);
184
+ (await this.missionService.getMissionsByOrganisation(this.org.id)).map((m) => this.missionService.softDeleteMission(m.id));
185
+ await Promise.all(propertiesToDelete.map(async (property) => {
186
+ await this.propertyService.deleteProperty(property.id);
187
+ }));
188
+ this.orgChanged.emit(true);
189
+ }
190
+ }
191
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DetailOrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.UntypedFormBuilder }, { token: i1.PropertyService }, { token: i1.MissionService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
192
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: { org: "org", currentOrg: "currentOrg", isSP: "isSP" }, outputs: { orgChanged: "orgChanged" }, usesOnChanges: true, ngImport: i0, template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Logo' | translate }}: {{ org.logoUrl ? \"\" : \"No logo uploaded\"}} \r\n <img class=\"logo-img\" *ngIf=\"signedLogo\" [src]=\"signedLogo\">\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <!-- <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" [cdkCopyToClipboard]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li> -->\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\"> {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onDelete()\"> {{'Delete' | translate}}</button>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate token' | translate}}</button> -->\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Logo' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\r\n {{'Add logo image' | translate}}</label>\r\n <p class=\"fileToUploadName\" *ngIf=\"fileToUpload\">{{fileToUpload.name}}</p>\r\n </div>\r\n \r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <!-- <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul> -->\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.logo-img{height:100px;object-fit:contain;margin:4px 10px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
193
+ }
194
+ export { DetailOrganisationComponent };
195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DetailOrganisationComponent, decorators: [{
196
+ type: Component,
197
+ args: [{ selector: 'lib-detail-organisation', template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Logo' | translate }}: {{ org.logoUrl ? \"\" : \"No logo uploaded\"}} \r\n <img class=\"logo-img\" *ngIf=\"signedLogo\" [src]=\"signedLogo\">\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <!-- <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" [cdkCopyToClipboard]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li> -->\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\"> {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onDelete()\"> {{'Delete' | translate}}</button>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate token' | translate}}</button> -->\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Logo' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\r\n {{'Add logo image' | translate}}</label>\r\n <p class=\"fileToUploadName\" *ngIf=\"fileToUpload\">{{fileToUpload.name}}</p>\r\n </div>\r\n \r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <!-- <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul> -->\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.logo-img{height:100px;object-fit:contain;margin:4px 10px}\n"] }]
198
+ }], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.UntypedFormBuilder }, { type: i1.PropertyService }, { type: i1.MissionService }, { type: i3.TranslateService }]; }, propDecorators: { org: [{
199
+ type: Input
200
+ }], currentOrg: [{
201
+ type: Input
202
+ }], isSP: [{
203
+ type: Input
204
+ }], orgChanged: [{
205
+ type: Output
206
+ }] } });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2RldGFpbC1vcmdhbmlzYXRpb24vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2RldGFpbC1vcmdhbmlzYXRpb24vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFDSCxZQUFZLEVBQUUsYUFBYSxFQUMzQix3QkFBd0IsRUFBRSxjQUFjLEVBQzNDLE1BQU0sbUNBQW1DLENBQUM7Ozs7OztBQUkzQyxNQUthLDJCQUEyQjtJQTRCeEI7SUFFQTtJQUNBO0lBQ0E7SUFDQTtJQWhDSCxHQUFHLENBQWU7SUFFbEIsVUFBVSxDQUFlO0lBRXpCLElBQUksQ0FBVTtJQUViLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBRW5ELEtBQUssQ0FBVTtJQUVmLFlBQVksQ0FBVTtJQUV0QixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRWhCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUV6QixRQUFRLENBQUM7SUFFVCxZQUFZLENBQVM7SUFFckIsUUFBUSxDQUFtQjtJQUUzQixZQUFZLENBQU87SUFFbkIsVUFBVSxDQUFTO0lBRW5CLFlBQ1ksbUJBQXdDO0lBQ2hELHNDQUFzQztJQUM5QixXQUErQixFQUMvQixlQUFnQyxFQUNoQyxjQUE4QixFQUM5QixTQUEyQjtRQUwzQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FB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QTNCLDJCQUEyQiwyTENkeEMsMjBOQTJITTs7U0Q3R08sMkJBQTJCOzRGQUEzQiwyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0kseUJBQXlCO3FPQUsxQixHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1CdWlsZGVyLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgICBkZWxldGVGcm9tUzMsIGdldFNpZ25lZEZpbGUsIE9yZ2FuaXNhdGlvbiwgT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICAgIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdCwgdXBsb2FkRmlsZVRvUzMsIFByb3BlcnR5U2VydmljZSwgTWlzc2lvblNlcnZpY2VcclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItZGV0YWlsLW9yZ2FuaXNhdGlvbicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERldGFpbE9yZ2FuaXNhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBASW5wdXQoKSBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBjdXJyZW50T3JnOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgQElucHV0KCkgaXNTUDogYm9vbGVhbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgb3JnQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICBteU9yZzogYm9vbGVhbjtcclxuXHJcbiAgICB0b2tlbkV4cGlyZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgIGNvbm5lY3RpbmdTdHJpcGUgPSBmYWxzZTtcclxuXHJcbiAgICBtb2RhbFJlZjtcclxuXHJcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuXHJcbiAgICBlZGl0Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuXHJcbiAgICBmaWxlVG9VcGxvYWQ6IEZpbGU7XHJcblxyXG4gICAgc2lnbmVkTG9nbzogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgb3JnYW5pc2F0aW9uU2VydmljZTogT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICAgICAgICAvLyBwcml2YXRlIGxvY2FsU3RyaXBlOiBTdHJpcGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHByb3BlcnR5U2VydmljZTogUHJvcGVydHlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLm15T3JnID0gdGhpcy5jdXJyZW50T3JnLmlkID09PSB0aGlzLm9yZy5pZDtcclxuICAgICAgICBpZiAoIXRoaXMub3JnLmNvbm5lY3RlZEFjY291bnRTdHJpcGVJRCAmJiAodGhpcy5teU9yZyB8fCB0aGlzLmlzU1ApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdFN0cmlwZUxpbmsoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3JnLmxvZ29VcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5zaWduZWRMb2dvID0gYXdhaXQgZ2V0U2lnbmVkRmlsZSh0aGlzLm9yZy5sb2dvVXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgICAgIHRoaXMubXlPcmcgPSB0aGlzLmN1cnJlbnRPcmcuaWQgPT09IHRoaXMub3JnLmlkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUb2tlbnMgd2VyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGlmIE9yZ2FuaXNhdGlvbiBleGlzdHMgYWxyZWFkeSAoY3JlYXRlZCBieSBvbmUgYWNjb3VudCkgYW5kIGl0IHNob3VsZCBiZSByZXN1c2VkIChieSBhbm90aGVyIGFjY291bnQpIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBkdXBsaWNhdGUuXHJcbiAgICAgKi9cclxuICAgIC8vIGFzeW5jIG9uVG9rZW4oKSB7XHJcbiAgICAvLyAgICAgY29uc3QgdG9rZW4gPSB1dWlkdjQoKTtcclxuICAgIC8vICAgICBjb25zdCBleHBpcmVzID0gbmV3IERhdGUoKTtcclxuICAgIC8vICAgICBleHBpcmVzLnNldERhdGUoZXhwaXJlcy5nZXREYXRlKCkgKyA3KTsgLy8gNyBkYXlzIGV4cGlyYXRpb25cclxuICAgIC8vICAgICB0aGlzLm9yZyA9IGF3YWl0IHRoaXMub3JnYW5pc2F0aW9uU2VydmljZS51cGRhdGVPcmdhbmlzYXRpb24oe1xyXG4gICAgLy8gICAgICAgICBpZDogdGhpcy5vcmcuaWQsXHJcbiAgICAvLyAgICAgICAgIHNoYXJlVG9rZW46IHRva2VuLFxyXG4gICAgLy8gICAgICAgICB0b2tlbkV4cGlyZXNBdDogZXhwaXJlcy5nZXRUaW1lKCksXHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgICAgdGhpcy5vcmdDaGFuZ2VkLmVtaXQodHJ1ZSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJldHRpZnlUb2tlbigpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGV4cGlyYXRpb25EYXRlID0gbmV3IERhdGUodGhpcy5vcmcudG9rZW5FeHBpcmVzQXQpO1xyXG4gICAgICAgIGNvbnN0IGRpZmZUaW1lID0gZXhwaXJhdGlvbkRhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcclxuICAgICAgICBjb25zdCBkaWZmRGF5cyA9IE1hdGguY2VpbChkaWZmVGltZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcbiAgICAgICAgY29uc3QgZXhwaXJhdGlvblN0cmluZyA9XHJcbiAgICAgICAgICAgIGRpZmZUaW1lIDwgMCA/IFwiZXhwaXJlZCFcIiA6IGBleHBpcmVzIGluICR7ZGlmZkRheXN9IGRheXNgO1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLm9yZy5zaGFyZVRva2VuLnNsaWNlKDAsIDYpfS4uLiAke2V4cGlyYXRpb25TdHJpbmd9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZWQgTmV3IFN0cmlwZSBBY2NvdW50IGFuZCBsYXVuY2hlcyBvbmJvYXJkaW5nIHByb2NlZHVyZSAobWFpbCwgcGhvbmUsIGJ1c2luZXNzIGRldGFpbHMuLikgYnkgU3RyaXBlXHJcbiAgICAgKiBAcmV0dXJucyBudWxsXHJcbiAgICAgKi9cclxuICAgIC8vIGFzeW5jIG9uQ3JlYXRlU3RyaXBlKCkge1xyXG4gICAgLy8gICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAvLyAgICAgLy8gTWFrZSB0aGUgcmVxdWVzdFxyXG4gICAgLy8gICAgIGNvbnN0IHJlc3BvbnNlQWNjb3VudCA9IGF3YWl0IEFQSS5wb3N0KFxyXG4gICAgLy8gICAgICAgICBcInN0cmlwZUFwaVwiLFxyXG4gICAgLy8gICAgICAgICBcIi9jcmVhdGUvYWNjb3VudFwiLFxyXG4gICAgLy8gICAgICAgICB7fSxcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlQWNjb3VudCk7XHJcbiAgICAvLyAgICAgaWYgKHJlc3BvbnNlQWNjb3VudC5lcnIpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oYW5kbGVTdHJpcGVFcnJvcihyZXNwb25zZUFjY291bnQpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCB7IGFjY291bnQgfSA9IHJlc3BvbnNlQWNjb3VudDtcclxuICAgIC8vICAgICAvLyBzYXZlIGFjY291bnQgaWQgdG8gb3JnYW5pc2F0aW9uXHJcbiAgICAvLyAgICAgYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAvLyAgICAgICAgIGlkOiB0aGlzLm9yZy5pZCxcclxuICAgIC8vICAgICAgICAgY29ubmVjdGVkQWNjb3VudFN0cmlwZUlEOiBhY2NvdW50LmlkLFxyXG4gICAgLy8gICAgICAgICBzdHJpcGVPbkJvYXJkaW5nQ29tcGxldGVkOiBmYWxzZSxcclxuICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgeyBvcmlnaW4gfSA9IGRvY3VtZW50LmxvY2F0aW9uO1xyXG4gICAgLy8gICAgIGNvbnN0IHJlc3BvbnNlQWNjb3VudExpbmtzID0gYXdhaXQgdGhpcy5sb2NhbFN0cmlwZS5jcmVhdGVBY2NvdW50TGluayhcclxuICAgIC8vICAgICAgICAgYWNjb3VudC5pZCxcclxuICAgIC8vICAgICAgICAgb3JpZ2luLFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgICAgaWYgKHJlc3BvbnNlQWNjb3VudExpbmtzLmVycikge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmhhbmRsZVN0cmlwZUVycm9yKHJlc3BvbnNlQWNjb3VudExpbmtzKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlQWNjb3VudExpbmtzLmFjY291bnRMaW5rcy51cmw7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gYXN5bmMgb25Db21wbGV0ZU9uYm9hcmRpbmdTdHJpcGUoKSB7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIC8vICAgICBjb25zdCByZXNwb25zZUFjY291bnRMaW5rcyA9IGF3YWl0IHRoaXMubG9jYWxTdHJpcGUuY3JlYXRlQWNjb3VudExpbmsoXHJcbiAgICAvLyAgICAgICAgIHRoaXMub3JnLmNvbm5lY3RlZEFjY291bnRTdHJpcGVJRCxcclxuICAgIC8vICAgICAgICAgb3JpZ2luLFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgICAgaWYgKHJlc3BvbnNlQWNjb3VudExpbmtzLmVycikge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmhhbmRsZVN0cmlwZUVycm9yKHJlc3BvbnNlQWNjb3VudExpbmtzKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlQWNjb3VudExpbmtzLmFjY291bnRMaW5rcy51cmw7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaGFuZGxlU3RyaXBlRXJyb3Ioc3RyaXBlUmVzcG9uc2UpIHtcclxuICAgIC8vICAgICBhbGVydChzdHJpcGVSZXNwb25zZS5lcnIucmF3Lm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgbGluayBmb3IgTGF1bmNoaW5nIE9BdXRoIGNvbm5lY3Rpb24gd2l0aCBTdHJpcGU6IGh0dHBzOi8vc3RyaXBlLmNvbS9kb2NzL2Nvbm5lY3Qvb2F1dGgtc3RhbmRhcmQtYWNjb3VudHMjaW50ZWdyYXRpbmctb2F1dGhcclxuICAgICAqL1xyXG4gICAgc2V0Q29ubmVjdFN0cmlwZUxpbmsoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGh5cGVybGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICAgICBcIiNsaW5rU3RyaXBlXCIsXHJcbiAgICAgICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChoeXBlcmxpbmspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudElEID0gXCJjYV9LUWhZT2xnUjFpcE94TEJCUUhmUWVDTG9heVNSVkQ1UFwiOyAvLyBUT0RPIGNoYW5nZSBmb3IgbGl2ZSBTdHJpcGUgQWNjb3VudFxyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBvcmlnaW4gfSA9IGRvY3VtZW50LmxvY2F0aW9uO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVXJsID0gYCR7b3JpZ2lufS9zdHJpcGUvcmVkaXJlY3RgO1xyXG4gICAgICAgICAgICAgICAgaHlwZXJsaW5rLnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICAgICAgICBcImhyZWZcIixcclxuICAgICAgICAgICAgICAgICAgICBgaHR0cHM6Ly9jb25uZWN0LnN0cmlwZS5jb20vb2F1dGgvYXV0aG9yaXplP3Jlc3BvbnNlX3R5cGU9Y29kZSZjbGllbnRfaWQ9JHtjbGllbnRJRH0mc2NvcGU9cmVhZF93cml0ZSZyZWRpcmVjdF91cmk9JHtyZXR1cm5Vcmx9JnN0YXRlPSR7dGhpcy5vcmcuaWR9YCxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAyMDApOyAvLyB3YWl0IHVudGlsIHRoZSBlbGVtZW50IGlzIHJlbmRlcmVkXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVkaXQgKi9cclxuICAgIG9uRWRpdCgpIHtcclxuICAgICAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLm9yZy5pZCxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5vcmcubmFtZSxcclxuICAgICAgICAgICAgc2lyZXQ6IHRoaXMub3JnLnNpcmV0LFxyXG4gICAgICAgICAgICBjaXR5OiB0aGlzLm9yZy5jaXR5LFxyXG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLm9yZy5hZGRyZXNzLFxyXG4gICAgICAgICAgICBjb250YWN0RGV0YWlsczogdGhpcy5vcmcuY29udGFjdERldGFpbHMsXHJcbiAgICAgICAgICAgIHBvc3RhbDogdGhpcy5vcmcucG9zdGFsLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdEZvcm0uZ2V0KFwibmFtZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN1Ym1pdCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xyXG4gICAgICAgIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdChmb3JtVmFsdWUpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRPcmcgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLnVwZGF0ZU9yZ2FuaXNhdGlvbihmb3JtVmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9yZyA9IHVwZGF0ZWRPcmc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbGVUb1VwbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3JnLmxvZ29VcmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgdGhlIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlRnJvbVMzKHRoaXMub3JnLmxvZ29VcmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdXBsb2FkRmlsZVRvUzMoXCJsb2dvcy9cIiwgdGhpcy5maWxlVG9VcGxvYWQsIHRoaXMub3JnLmlkKS50aGVuKFxyXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jICh1cmwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLnVwZGF0ZU9yZ2FuaXNhdGlvbih7IGlkOiB0aGlzLm9yZy5pZCwgbG9nb1VybDogdXJsIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVkaXRGb3JtID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmVkaXRGb3JtID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVGaWxlSW5wdXQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5maWxlVG9VcGxvYWQgPSB0YXJnZXQuZmlsZXMuaXRlbSgwKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkRlbGV0ZSgpIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcImNvbmZpcm0uZGVsZXRlT3JnYW5pc2F0aW9uXCIpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgd2luZG93LmNvbmZpcm0obWVzc2FnZSkgJiYgdGhpcy5vcmcuaWQgIT09IFwiNmUyODIwMWYtNDY3OS00YzI5LTlkMmQtOGEzMjVmNTdjZWU5XCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllc1RvRGVsZXRlID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvcGVydHlTZXJ2aWNlLmdldFByb3BlcnRpZXNGb3JPcmdhbmlzYXRpb24odGhpcy5vcmcuaWQpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2Uuc29mdERldGVsZU9yZyh0aGlzLm9yZy5pZCk7XHJcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlPcmdhbmlzYXRpb24odGhpcy5vcmcuaWQpKS5tYXAoXHJcbiAgICAgICAgICAgICAgICAobSkgPT4gdGhpcy5taXNzaW9uU2VydmljZS5zb2Z0RGVsZXRlTWlzc2lvbihtLmlkKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9EZWxldGUubWFwKGFzeW5jIChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvcGVydHlTZXJ2aWNlLmRlbGV0ZVByb3BlcnR5KHByb3BlcnR5LmlkKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLm9yZ0NoYW5nZWQuZW1pdCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdj5cclxuICAgIDxoNT57eydPcmdhbmlzYXRpb24gRGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2g1PlxyXG4gICAgPGRpdiAqbmdJZj1cIiFlZGl0Rm9ybVwiPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19OiB7eyBvcmcubmFtZSB9fTwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0xvZ28nIHwgdHJhbnNsYXRlIH19OiB7eyBvcmcubG9nb1VybCA/IFwiXCIgOiBcIk5vIGxvZ28gdXBsb2FkZWRcIn19IFxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImxvZ28taW1nXCIgKm5nSWY9XCJzaWduZWRMb2dvXCIgW3NyY109XCJzaWduZWRMb2dvXCI+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1NJUkVUJyB8IHRyYW5zbGF0ZSB9fToge3tcclxuICAgICAgICAgICAgICAgIG9yZy5zaXJldCA/IG9yZy5zaXJldCA6IChcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZSl9fTwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0FkZHJlc3MnIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgb3JnLmFkZHJlc3MgPyBvcmcuYWRkcmVzcyA6IChcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZSl9fTwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0NpdHknIHwgdHJhbnNsYXRlIH19OiB7e29yZy5jaXR5IH19PC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ29udGFjdCBpbmZvcm1hdGlvbicgfCB0cmFuc2xhdGV9fTpcclxuICAgICAgICAgICAgICAgIHt7IG9yZy5jb250YWN0RGV0YWlscyA/IG9yZy5jb250YWN0RGV0YWlscyA6IChcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZSl9fTwvbGk+XHJcbiAgICAgICAgICAgIDwhLS0gPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJpc1NQXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1sLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydBY3RpdmUgdG9rZW4nIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvcmcuc2hhcmVUb2tlbiA/IHByZXR0aWZ5VG9rZW4oKSA6ICgnTm8nIHwgdHJhbnNsYXRlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcmcuc2hhcmVUb2tlbiAmJiAhdG9rZW5FeHBpcmVkXCIgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJvcmcuc2hhcmVUb2tlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogNXB4OyBtYXgtd2lkdGg6IDIwcHg7XCIgbmdiVG9vbHRpcD1cIkNvcGllZCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImNsaWNrOmJsdXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOmNvbnRlbnQtY29weVwiIGRhdGEtaW5saW5lPVwiZmFsc2VcIiBkYXRhLXdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1oZWlnaHQ9XCIyMFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2xpPiAtLT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTIgbWwtMyBhY3Rpb24tYnV0dG9uXCIgKm5nSWY9XCJpc1NQIHx8IG15T3JnXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXQoKVwiPiB7eydFZGl0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXQtMiBtbC0zIGFjdGlvbi1idXR0b25cIiAqbmdJZj1cImlzU1BcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKClcIj4ge3snRGVsZXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtdC0yIG1sLTMgYWN0aW9uLWJ1dHRvblwiICpuZ0lmPVwiaXNTUFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2tlbigpXCI+e3snR2VuZXJhdGUgdG9rZW4nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tRWRpdCBGb3JtLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiZWRpdEZvcm1cIj5cclxuICAgICAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwiZWRpdEZvcm1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtjbGFzcy5pcy1pbnZhbGlkXT1cIm5hbWUuaW52YWxpZCAmJiBuYW1lLnRvdWNoZWRcIiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snQSBuYW1lIGlzIHJlcXVpcmVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydDb250YWN0IGluZm9ybWF0aW9uJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29udGFjdERldGFpbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7J05hbWUsIHBob25lLCBlbWFpbCcgfCB0cmFuc2xhdGV9fVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0FkZHJlc3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQ2l0eScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydQb3N0YWwgY29kZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBvc3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J1NJUkVUJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic2lyZXRcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydMb2dvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpbGVcIiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiZmlsZVwiIChjaGFuZ2UpPVwiaGFuZGxlRmlsZUlucHV0KCRldmVudClcIiAvPlxyXG4gICAgICAgICAgICAgICAge3snQWRkIGxvZ28gaW1hZ2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmaWxlVG9VcGxvYWROYW1lXCIgKm5nSWY9XCJmaWxlVG9VcGxvYWRcIj57e2ZpbGVUb1VwbG9hZC5uYW1lfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJlZGl0Rm9ybS5pbnZhbGlkXCI+e3snU2F2ZScgfFxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfFxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLUxvYWRpbmctLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS1TdHJpcGUtLT5cclxuICAgIDwhLS0gPGhyPlxyXG4gICAgPGg1Pnt7J3N0cmlwZS5hY2NvdW50JyB8IHRyYW5zbGF0ZSB9fTwvaDU+XHJcbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIihpc1NQIHx8IG15T3JnKSAmJiBvcmcuY29ubmVjdGVkQWNjb3VudFN0cmlwZUlEXCI+XHJcbiAgICAgICAgICAgIHt7J3N0cmlwZS5jb25uZWN0ZWQnIHwgdHJhbnNsYXRlIH19OiB7e29yZy5jb25uZWN0ZWRBY2NvdW50U3RyaXBlSUQuc3Vic3RyaW5nKDAsIDE1KSB9fS4uLjwvbGk+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIoaXNTUCB8fCBteU9yZykgJiYgb3JnLnN0cmlwZU9uQm9hcmRpbmdDb21wbGV0ZWQgIT09IG51bGxcIj5cclxuICAgICAgICAgICAge3snc3RyaXBlLmNvbXBsZXRlZCcgfCB0cmFuc2xhdGUgfX06IHt7b3JnLnN0cmlwZU9uQm9hcmRpbmdDb21wbGV0ZWQgfX08L2xpPlxyXG4gICAgPC91bD4gLS0+XHJcbjwvZGl2PiJdfQ==