simpo-component-library 1.5.0 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. package/esm2022/lib/components/hover-elements/hover-elements.component.mjs +7 -5
  2. package/esm2022/lib/constants/business.constant.mjs +14 -0
  3. package/esm2022/lib/directive/background-directive.mjs +1 -1
  4. package/esm2022/lib/directive/border-directive.mjs +23 -11
  5. package/esm2022/lib/directive/spacing-horizontal.directive.mjs +48 -0
  6. package/esm2022/lib/directive/wrap-containers.directive.mjs +31 -0
  7. package/esm2022/lib/ecommerce/sections/address/address.component.mjs +134 -28
  8. package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +104 -39
  9. package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +296 -61
  10. package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
  11. package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +13 -3
  12. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +13 -4
  13. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +212 -42
  14. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +11 -2
  15. package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +11 -0
  16. package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +77 -10
  17. package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +13 -7
  18. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +272 -39
  19. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
  20. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +252 -33
  21. package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
  22. package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +44 -17
  23. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.component.mjs +300 -28
  24. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
  25. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +124 -0
  26. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +2 -0
  27. package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +183 -17
  28. package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +11 -3
  29. package/esm2022/lib/ecommerce/styles/cart.modal.mjs +2 -1
  30. package/esm2022/lib/ecommerce/styles/product.modal.mjs +10 -1
  31. package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
  32. package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
  33. package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
  34. package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
  35. package/esm2022/lib/pipes/amount.pipe.mjs +35 -0
  36. package/esm2022/lib/pipes/gender.pipe.mjs +36 -0
  37. package/esm2022/lib/sections/BaseSection.mjs +1 -1
  38. package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
  39. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +9 -4
  40. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.model.mjs +1 -1
  41. package/esm2022/lib/sections/banner-section/banner-section.component.mjs +3 -3
  42. package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
  43. package/esm2022/lib/sections/carousel-banner/carousel-banner.component.mjs +12 -12
  44. package/esm2022/lib/sections/carousel-banner/carousel-banner.model.mjs +1 -1
  45. package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +2 -2
  46. package/esm2022/lib/sections/contact-us/contact-us.component.mjs +7 -5
  47. package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
  48. package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
  49. package/esm2022/lib/sections/footer-section/footer-section.component.mjs +3 -3
  50. package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
  51. package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
  52. package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
  53. package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
  54. package/esm2022/lib/sections/location-section/location-section.component.mjs +2 -2
  55. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
  56. package/esm2022/lib/sections/navbar-section/navbar-section.component.mjs +42 -18
  57. package/esm2022/lib/sections/navbar-section/navbar-section.model.mjs +1 -1
  58. package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
  59. package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
  60. package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
  61. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +3 -3
  62. package/esm2022/lib/sections/service-section/service-section.component.mjs +1 -1
  63. package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +1 -1
  64. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
  65. package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
  66. package/esm2022/lib/sections/text-image-section/text-image-section.component.mjs +3 -3
  67. package/esm2022/lib/sections/text-section/text-section.component.mjs +2 -2
  68. package/esm2022/lib/sections/video-section/video-section.component.mjs +11 -3
  69. package/esm2022/lib/sections/view-blog/view-blog.component.mjs +3 -3
  70. package/esm2022/lib/services/cart.service.mjs +54 -120
  71. package/esm2022/lib/services/endUser.service.mjs +28 -0
  72. package/esm2022/lib/services/events.service.mjs +4 -1
  73. package/esm2022/lib/services/rest.service.mjs +58 -16
  74. package/esm2022/lib/services/storage.service.mjs +103 -35
  75. package/esm2022/lib/styles/index.mjs +8 -1
  76. package/esm2022/lib/styles/style.model.mjs +1 -1
  77. package/esm2022/lib/styles/types.mjs +1 -1
  78. package/esm2022/public-api.mjs +4 -1
  79. package/fesm2022/simpo-component-library.mjs +2518 -712
  80. package/fesm2022/simpo-component-library.mjs.map +1 -1
  81. package/lib/components/hover-elements/hover-elements.component.d.ts +2 -1
  82. package/lib/constants/business.constant.d.ts +11 -0
  83. package/lib/directive/spacing-horizontal.directive.d.ts +18 -0
  84. package/lib/directive/wrap-containers.directive.d.ts +14 -0
  85. package/lib/ecommerce/sections/address/address.component.d.ts +30 -9
  86. package/lib/ecommerce/sections/authenticate-user/authenticate-user.component.d.ts +31 -6
  87. package/lib/ecommerce/sections/cart/cart.component.d.ts +26 -11
  88. package/lib/ecommerce/sections/cart/cart.modal.d.ts +10 -1
  89. package/lib/ecommerce/sections/checkout/checkout.component.d.ts +2 -0
  90. package/lib/ecommerce/sections/featured-category/featured-category.component.d.ts +2 -0
  91. package/lib/ecommerce/sections/featured-products/featured-products.component.d.ts +27 -9
  92. package/lib/ecommerce/sections/featured-products/featured-products.modal.d.ts +5 -1
  93. package/lib/ecommerce/sections/item-varient/item-varient.component.d.ts +5 -0
  94. package/lib/ecommerce/sections/order-details/order-details.component.d.ts +16 -2
  95. package/lib/ecommerce/sections/pagnination/pagnination.component.d.ts +3 -2
  96. package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +33 -4
  97. package/lib/ecommerce/sections/product-desc/product-desc.modal.d.ts +4 -1
  98. package/lib/ecommerce/sections/product-list/product-list.component.d.ts +39 -3
  99. package/lib/ecommerce/sections/product-list/product-list.modal.d.ts +2 -0
  100. package/lib/ecommerce/sections/user-basic-info/user-basic-info.component.d.ts +11 -1
  101. package/lib/ecommerce/sections/user-profile/user-profile.component.d.ts +52 -13
  102. package/lib/ecommerce/sections/user-profile/user-profile.modal.d.ts +6 -8
  103. package/lib/ecommerce/sections/verify-payment/verify-payment.component.d.ts +34 -0
  104. package/lib/ecommerce/sections/verify-payment/verify-payment.model.d.ts +23 -0
  105. package/lib/ecommerce/sections/whislist/whislist.component.d.ts +22 -6
  106. package/lib/ecommerce/styles/OrderedItems.modal.d.ts +6 -2
  107. package/lib/ecommerce/styles/cart.modal.d.ts +1 -0
  108. package/lib/ecommerce/styles/product.modal.d.ts +4 -0
  109. package/lib/ecommerce/styles/user.modal.d.ts +3 -3
  110. package/lib/pipes/amount.pipe.d.ts +7 -0
  111. package/lib/pipes/gender.pipe.d.ts +8 -0
  112. package/lib/sections/banner-grid-section/banner-grid-section.component.d.ts +1 -0
  113. package/lib/sections/banner-grid-section/banner-grid-section.model.d.ts +1 -0
  114. package/lib/sections/carousel-banner/carousel-banner.component.d.ts +7 -5
  115. package/lib/sections/carousel-banner/carousel-banner.model.d.ts +41 -26
  116. package/lib/sections/navbar-section/navbar-section.component.d.ts +6 -1
  117. package/lib/sections/navbar-section/navbar-section.model.d.ts +1 -1
  118. package/lib/sections/video-section/video-section.component.d.ts +4 -2
  119. package/lib/services/cart.service.d.ts +13 -8
  120. package/lib/services/endUser.service.d.ts +13 -0
  121. package/lib/services/events.service.d.ts +5 -2
  122. package/lib/services/rest.service.d.ts +16 -2
  123. package/lib/services/storage.service.d.ts +11 -44
  124. package/lib/styles/index.d.ts +6 -0
  125. package/lib/styles/style.model.d.ts +4 -1
  126. package/lib/styles/types.d.ts +2 -0
  127. package/package.json +1 -1
  128. package/public-api.d.ts +3 -0
  129. package/simpo-component-library-1.5.2.tgz +0 -0
  130. package/esm2022/lib/ecommerce/json/user-cart.json +0 -40
  131. package/esm2022/lib/ecommerce/json/user-details.json +0 -15
  132. package/esm2022/lib/ecommerce/json/user-favourite.json +0 -32
  133. package/simpo-component-library-1.5.0.tgz +0 -0
@@ -1,27 +1,39 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Input, Optional, Inject, Output, EventEmitter } from '@angular/core';
2
2
  import { MatIcon } from '@angular/material/icon';
3
3
  import { CommonModule } from '@angular/common';
4
- import UserDetails from './../../json/user-details.json';
5
4
  import { FormsModule } from '@angular/forms';
6
5
  import { AuthenticateUserComponent } from '../authenticate-user/authenticate-user.component';
7
- import { MatDialogModule } from '@angular/material/dialog';
6
+ import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
7
+ import { KEYBOARD_KEYS } from '../../../constants/business.constant';
8
+ import { HoverDirective } from '../../../directive/hover-element-directive';
9
+ import BaseSection from '../../../sections/BaseSection';
10
+ import { DeleteHoverElementComponent } from '../../../components/delete-hover-element/delete-hover-element.component';
11
+ import { HoverElementsComponent } from '../../../components/hover-elements/hover-elements.component';
12
+ import { MatBottomSheetModule } from '@angular/material/bottom-sheet';
8
13
  import * as i0 from "@angular/core";
9
14
  import * as i1 from "../../../services/rest.service";
10
15
  import * as i2 from "@angular/material/dialog";
11
- import * as i3 from "@angular/router";
12
- import * as i4 from "../../../services/storage.service";
13
- import * as i5 from "@angular/common";
14
- import * as i6 from "@angular/forms";
15
- export class AddressComponent {
16
- constructor(ngZone, restService, matDialog, router, storageService
17
- // private readonly matDialogRef: MatDialogRef<AddressComponent>
18
- ) {
16
+ import * as i3 from "@angular/material/bottom-sheet";
17
+ import * as i4 from "@angular/router";
18
+ import * as i5 from "../../../services/storage.service";
19
+ import * as i6 from "../../../services/events.service";
20
+ import * as i7 from "@angular/common";
21
+ import * as i8 from "@angular/forms";
22
+ export class AddressComponent extends BaseSection {
23
+ constructor(ngZone, restService, matDialog, matBottomsheet, router, storageService, _eventService, matData, matDialogRef) {
24
+ super();
19
25
  this.ngZone = ngZone;
20
26
  this.restService = restService;
21
27
  this.matDialog = matDialog;
28
+ this.matBottomsheet = matBottomsheet;
22
29
  this.router = router;
23
30
  this.storageService = storageService;
31
+ this._eventService = _eventService;
32
+ this.matData = matData;
33
+ this.matDialogRef = matDialogRef;
24
34
  this.addressList = [];
35
+ this.selectedAddressIdx = 0;
36
+ this.selectedAddress = new EventEmitter();
25
37
  this.address = {
26
38
  "receiverName": "",
27
39
  "receiverPhone": "",
@@ -34,16 +46,18 @@ export class AddressComponent {
34
46
  "landmark": "",
35
47
  "zipCode": "",
36
48
  "stateCode": "",
37
- "addressType": "",
49
+ "addressType": "HOME",
38
50
  "geolocation": {
39
51
  "latitude": 0,
40
52
  "longitude": 0
41
53
  }
42
54
  };
43
55
  this.isCart = false;
56
+ this.editIndex = -1;
44
57
  this.latitute = null;
45
58
  this.longitute = null;
46
59
  this.addNewAddress = false;
60
+ this.isLoading = false;
47
61
  this.mapCenter = {
48
62
  lat: 0,
49
63
  lng: 0
@@ -54,7 +68,6 @@ export class AddressComponent {
54
68
  };
55
69
  this.markerOptions = { draggable: true };
56
70
  this.geocoder = new google.maps.Geocoder();
57
- this.selectedAddressIdx = -1;
58
71
  this.addessType = [
59
72
  { key: "HOME", status: false },
60
73
  { key: "WORK", status: false },
@@ -63,15 +76,38 @@ export class AddressComponent {
63
76
  }
64
77
  ngOnInit() {
65
78
  this.getCurrentLocation();
79
+ this.addNewAddress = this.responseData?.length == 0;
80
+ if (this.matData) {
81
+ this.responseData = this.matData.addressList;
82
+ this.data = this.matData?.data;
83
+ if (this.matData?.address) {
84
+ this.address = { ...this.matData.address };
85
+ this.editIndex = this.matData?.editIndex ?? -1;
86
+ }
87
+ this.addNewAddress = true;
88
+ }
89
+ else {
90
+ this.addressList = this.responseData;
91
+ }
92
+ if (this.addNewAddress && !this.matData) {
93
+ const userDetails = this.storageService.getUser();
94
+ this.address = {
95
+ ...this.address,
96
+ receiverName: userDetails?.contact.name ?? "",
97
+ receiverEmail: userDetails?.contact.email ?? "",
98
+ receiverPhone: userDetails?.contact.mobile ?? ""
99
+ };
100
+ }
66
101
  }
67
102
  ngOnChanges(changes) {
68
- this.addressList = this.responseData;
103
+ // this.addressList = this.responseData;
69
104
  }
70
105
  checkAddressType(address) {
71
106
  this.addessType.forEach((add) => add.status = (add.key == address.key));
72
107
  this.address.addressType = address.key;
73
108
  }
74
109
  close() {
110
+ this.matDialogRef.close();
75
111
  }
76
112
  getCurrentLocation() {
77
113
  if (navigator.geolocation) {
@@ -129,25 +165,54 @@ export class AddressComponent {
129
165
  // this.city = data.long_name;
130
166
  });
131
167
  }
168
+ addressSelected(index) {
169
+ this.selectedAddressIdx = index;
170
+ this.selectedAddress.emit(index);
171
+ }
172
+ goToHome() {
173
+ this.router.navigate(['/profile']);
174
+ }
132
175
  updateAddress() {
133
176
  const userDetails = this.storageService.getUser();
134
- console.log(userDetails);
135
177
  if (userDetails) {
178
+ const addressList = userDetails?.addressDetailsList;
179
+ if (this.matData?.editIndex) {
180
+ this.addressList.forEach((address, idx) => {
181
+ if (idx == this.matData.editIndx) {
182
+ address = this.address;
183
+ }
184
+ });
185
+ }
186
+ else {
187
+ addressList.push(this.address);
188
+ }
136
189
  const payload = {
137
190
  "userId": userDetails.userId,
138
- "addressDetailsList": [...(userDetails?.addressDetailsList ?? []), this.address],
191
+ "businessId": userDetails.businessId,
192
+ "addressDetailsList": addressList,
139
193
  "contact": userDetails?.contact ?? {},
140
194
  "gender": userDetails?.gender?.length > 0 ? userDetails?.gender : null
141
195
  };
196
+ this.isLoading = true;
142
197
  this.restService.addUserAddress(payload).subscribe((response) => {
198
+ this.isLoading = false;
143
199
  this.addNewAddress = false;
144
- UserDetails.user = userDetails;
145
- UserDetails.user.addressDetailsList.push(this.address);
200
+ if (this.isMobile) {
201
+ document.body.scrollTop = 0;
202
+ document.documentElement.scrollTop = 0;
203
+ }
204
+ if (userDetails) {
205
+ userDetails.addressDetailsList.push(this.address);
206
+ this.storageService.setUser(userDetails);
207
+ }
208
+ }, (error) => {
209
+ this.isLoading = false;
146
210
  });
147
211
  }
148
212
  else {
149
- if (window.innerWidth <= 475)
150
- this.router.navigate(['/auth']);
213
+ if (window.innerWidth <= 475) {
214
+ this.matBottomsheet.open(AuthenticateUserComponent, { data: this.data });
215
+ }
151
216
  else {
152
217
  this.matDialog.open(AuthenticateUserComponent, {
153
218
  height: '50vh',
@@ -157,8 +222,32 @@ export class AddressComponent {
157
222
  }
158
223
  }
159
224
  }
160
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AddressComponent, deps: [{ token: i0.NgZone }, { token: i1.RestService }, { token: i2.MatDialog }, { token: i3.Router }, { token: i4.StorageServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
161
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: AddressComponent, isStandalone: true, selector: "simpo-address", inputs: { responseData: "responseData", data: "data", isCart: "isCart", selectedAddressIdx: "selectedAddressIdx" }, usesOnChanges: true, ngImport: i0, template: "<section class=\"address-sec\">\r\n <div class=\"header\">\r\n <h3>{{isCart ? 'Shipping To' : 'New Address'}}</h3>\r\n <mat-icon (click)=\"close()\" *ngIf=\"!isCart\">close</mat-icon>\r\n <span class=\"add-address\" *ngIf=\"addressList.length && !addNewAddress\" (click)=\"addNewAddress = true\">+ add address</span>\r\n </div>\r\n <ng-container *ngIf=\"!addressList?.length || addNewAddress\">\r\n <p (click)=\"getCurrentLocation()\" class=\"d-flex align-items-center\" style=\"cursor: pointer;\">\r\n <mat-icon>my_location</mat-icon>\r\n <span>take my current location</span>\r\n </p>\r\n <div class=\"forms d-flex flex-wrap\">\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Name</div>\r\n <input type=\"text\" placeholder=\"Enter name\" [(ngModel)]=\"address.receiverName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Mobile</div>\r\n <input type=\"text\" placeholder=\"Enter mobile\" [(ngModel)]=\"address.receiverPhone\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Email</div>\r\n <input type=\"text\" placeholder=\"Enter email\" [(ngModel)]=\"address.receiverEmail\">\r\n </div>\r\n <div class=\"form-control-full-group\">\r\n <div class=\"label\">Address</div>\r\n <input type=\"text\" placeholder=\"Enter address\" matGoogleMapsAutocomplete\r\n (onAutocompleteSelected)=\"onAutocompleteSelected($event)\"\r\n (onLocationSelected)=\"onLocationSelected($event)\" [(ngModel)]=\"address.addressLine1\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Locality</div>\r\n <input type=\"text\" placeholder=\"Enter locality\" [(ngModel)]=\"address.localityName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Landmark</div>\r\n <input type=\"text\" placeholder=\"Enter landmark\" [(ngModel)]=\"address.landmark\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Pincode</div>\r\n <input type=\"text\" placeholder=\"Enter pincode\" [(ngModel)]=\"address.zipCode\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">City</div>\r\n <input type=\"text\" placeholder=\"Enter city\" [(ngModel)]=\"address.cityName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">State</div>\r\n <input type=\"text\" placeholder=\"Enter state\" [(ngModel)]=\"address.stateName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Address Type</div>\r\n <div class=\"d-flex\">\r\n <ng-container *ngFor=\"let address of addessType\">\r\n <span class=\"address-type\" (click)=\"checkAddressType(address)\" [ngClass]=\"{'active-address': address.status}\">{{address.key}}</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"address-list\" *ngIf=\"addressList.length && !addNewAddress\">\r\n <ng-container *ngFor=\"let address of addressList; let idx = index\">\r\n <div class=\"address\" (click)=\"selectedAddressIdx = idx\" [ngClass]=\"{'selected-address': selectedAddressIdx == idx}\">\r\n <div class=\"address-left\">\r\n <div class=\"top\">\r\n <span class=\"fw-bold mr-2\">{{address?.receiverName}}</span>\r\n <span class=\"address-type\">{{address?.addressType}}</span>\r\n </div>\r\n <div class=\"address-det\">{{address.addressLine1}}</div>\r\n <div class=\"phone\">\r\n <span>Phone:</span>\r\n <span class=\"address-phone\">{{address.receiverPhone}}</span>\r\n </div>\r\n </div>\r\n <div class=\"address-right\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"action-btn\" *ngIf=\"!addressList.length || addNewAddress\">\r\n <button (click)=\"updateAddress()\">Update</button>\r\n </div>\r\n</section>", styles: [".address-sec{padding:20px;position:relative}.address-sec .header{display:flex;justify-content:space-between;margin-bottom:20px}.mat-icon{cursor:pointer;margin-right:5px}.action-btn{position:absolute;bottom:-50px;right:10px}.action-btn button{background-color:#0267c1;color:#fff;padding:10px;width:200px!important;border:none}.label:after{content:\"*\"}.active-address{background-color:#0267c1!important;color:#fff!important}.forms{gap:10px;justify-content:space-between}.form-control-group,.form-control-full-group{width:48%}:is(.form-control-group,.form-control-full-group) input{width:100%;padding:10px;border-radius:3px;border:1.5px solid lightgray}.form-control-full-group{width:100%!important}.address-type{width:150px;padding:10px;background-color:#d3d3d35c;color:#000;text-align:center;border-radius:5px;margin:0 5px;cursor:pointer}.address-list{display:flex;flex-direction:column;gap:10px}.address-list .address{display:flex;padding:15px;border-radius:5px;box-shadow:0 1px 1px #0000,0 1px 1px #00000030;border:1px solid #d3d3d3b1}.address-list .address-left{width:80%}.address-list .address-right{width:20%}.address-list .address-phone{margin-left:10px}.address-list .address-type{background-color:#d3d3d34a;padding:5px 10px;text-align:center;border-radius:5px;margin-left:15px}.address-list .address-det{margin:10px 0}.add-address{color:#0267c1;cursor:pointer;font-weight:600}.address-active{background-color:#0267c1;color:#fff}.selected-address{border:2px solid #0267C1!important}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatDialogModule }] }); }
225
+ validateMobile(event) {
226
+ if ((!isNaN(Number(event.key)) || event.keyCode == KEYBOARD_KEYS.BACKSPACE || event.keyCode == KEYBOARD_KEYS.TAB) && event.keyCode != KEYBOARD_KEYS.SPACE) {
227
+ return;
228
+ }
229
+ event.preventDefault();
230
+ }
231
+ validateName(event) {
232
+ if ((event.keyCode >= KEYBOARD_KEYS.CHARACTER_A && event.keyCode <= KEYBOARD_KEYS.CHARACTER_Z) || event.keyCode == 16 || event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46 || event.keyCode == 9) {
233
+ return;
234
+ }
235
+ event.preventDefault();
236
+ }
237
+ editSection() {
238
+ this._eventService.toggleEditorEvent.emit(false);
239
+ setTimeout(() => {
240
+ this._eventService.editSection.emit({ data: this.data });
241
+ }, 100);
242
+ }
243
+ get isEmailValid() {
244
+ return this.address?.receiverEmail?.includes("@") && this.address?.receiverEmail.includes(".com") || (this.address?.receiverEmail?.length == 0);
245
+ }
246
+ get isMobile() {
247
+ return window.innerWidth <= 475;
248
+ }
249
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AddressComponent, deps: [{ token: i0.NgZone }, { token: i1.RestService }, { token: i2.MatDialog }, { token: i3.MatBottomSheet }, { token: i4.Router }, { token: i5.StorageServiceService }, { token: i6.EventsService }, { token: MAT_DIALOG_DATA, optional: true }, { token: i2.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
250
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: AddressComponent, isStandalone: true, selector: "simpo-address", inputs: { responseData: "responseData", data: "data", index: "index", edit: "edit", delete: "delete", isCart: "isCart" }, outputs: { selectedAddress: "selectedAddress" }, providers: [], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section class=\"address-sec\" (click)=\"editSection()\" simpoHover (hovering)=\"showEditTabs($event)\" >\r\n <div class=\"header\">\r\n <div class=\"new-address-header\">\r\n <mat-icon (click)=\"goToHome()\" *ngIf=\"!isCart\">keyboard_arrow_left</mat-icon>\r\n <h3>{{isCart ? 'Shipping To' : 'New Address'}}</h3>\r\n </div>\r\n <span class=\"add-address\" *ngIf=\"!addNewAddress\" (click)=\"addNewAddress = true\">+ add address</span>\r\n </div>\r\n <ng-container *ngIf=\"addNewAddress\">\r\n <!-- <p (click)=\"getCurrentLocation()\" class=\"d-flex align-items-center\" style=\"cursor: pointer;\">\r\n <mat-icon>my_location</mat-icon>\r\n <span>Take my current location</span>\r\n </p> -->\r\n <div class=\"forms d-flex flex-wrap\">\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Name</div>\r\n <input type=\"text\" placeholder=\"Enter name\" [(ngModel)]=\"address.receiverName\" (keydown)=\"validateName($event)\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Mobile</div>\r\n <input type=\"text\" placeholder=\"Enter mobile\" [(ngModel)]=\"address.receiverPhone\" (keydown)=\"validateMobile($event)\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Email</div>\r\n <input type=\"text\" placeholder=\"Enter email\" [(ngModel)]=\"address.receiverEmail\">\r\n </div>\r\n <div class=\"form-control-full-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Address</div>\r\n <input type=\"text\" placeholder=\"Enter address\" matGoogleMapsAutocomplete\r\n (onAutocompleteSelected)=\"onAutocompleteSelected($event)\"\r\n (onLocationSelected)=\"onLocationSelected($event)\" [(ngModel)]=\"address.addressLine1\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Locality</div>\r\n <input type=\"text\" placeholder=\"Enter locality\" [(ngModel)]=\"address.localityName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\" [style.color]=\"data?.styles?.background?.accentColor\">Landmark</div>\r\n <input type=\"text\" placeholder=\"Enter landmark\" [(ngModel)]=\"address.landmark\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Pincode</div>\r\n <input type=\"text\" placeholder=\"Enter pincode\" [(ngModel)]=\"address.zipCode\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">City</div>\r\n <input type=\"text\" placeholder=\"Enter city\" [(ngModel)]=\"address.cityName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">State</div>\r\n <input type=\"text\" placeholder=\"Enter state\" [(ngModel)]=\"address.stateName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Address Type</div>\r\n <div class=\"d-flex\">\r\n <ng-container *ngFor=\"let address of addessType\">\r\n <span class=\"address-type\" (click)=\"checkAddressType(address)\" [ngClass]=\"{'active-address': address.status}\">{{address.key}}</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"address-list\" *ngIf=\"!addNewAddress\">\r\n <ng-container *ngFor=\"let address of addressList; let idx = index\">\r\n <div class=\"address\" (click)=\"addressSelected(idx)\" [ngClass]=\"{'selected-address': selectedAddressIdx == idx}\">\r\n <div class=\"address-left\">\r\n <div class=\"top\">\r\n <span class=\"fw-bold mr-2\">{{address?.receiverName}}</span>\r\n <span class=\"address-type\">{{address?.addressType}}</span>\r\n </div>\r\n <div class=\"address-det\">{{address.addressLine1}}</div>\r\n <div class=\"phone\">\r\n <span>Phone:</span>\r\n <span class=\"address-phone\">{{address.receiverPhone}}</span>\r\n </div>\r\n </div>\r\n <div class=\"address-right\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"action-btn\" *ngIf=\"addNewAddress\">\r\n <div class=\"error-message\">\r\n <span *ngIf=\"address.receiverPhone?.length != 10 && address.receiverPhone?.length\">*Mobile number is invalid</span>\r\n <span *ngIf=\"!isEmailValid\">*Email is invalid</span>\r\n </div>\r\n <button [disabled]=\"\r\n !address.receiverName || \r\n !address.receiverPhone ||\r\n address.receiverPhone?.length != 10 ||\r\n !isEmailValid || \r\n !address.addressLine1 || \r\n !address.localityName || \r\n !address.zipCode || \r\n !address.cityName ||\r\n !address.stateName || \r\n !address.addressType || isLoading\r\n \" (click)=\"updateAddress()\">{{isLoading ? 'Loading' : 'Update'}}</button>\r\n </div>\r\n</section>\r\n\r\n\r\n<div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n</div>\r\n<div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n</div>", styles: [".address-sec{padding:20px;position:relative}.address-sec .header{display:flex;align-items:center;justify-content:space-between;gap:5px;margin-bottom:20px}.new-address-header{display:flex;align-items:center}.mat-icon{cursor:pointer;margin-right:5px}.action-btn{margin-left:auto;bottom:-20px;position:relative;right:0;display:flex;flex-direction:column;align-items:flex-end}.action-btn button{background-color:#0267c1;color:#fff;padding:10px;width:200px!important;border:none;border-radius:5px}.label:after{content:\"*\"}.active-address{background-color:#0267c1!important;color:#fff!important}.forms{gap:10px;justify-content:space-between}.form-control-group,.form-control-full-group{width:48%}:is(.form-control-group,.form-control-full-group) input{width:100%;padding:10px;border-radius:3px;border:1.5px solid lightgray}.form-control-full-group{width:100%!important}.address-type{width:150px;padding:10px;background-color:#d3d3d35c;color:#000;text-align:center;border-radius:5px;margin:0 5px;cursor:pointer}.address{display:flex;padding:15px;border-radius:5px;box-shadow:0 1px 1px #0000,0 1px 1px #00000030;border:1px solid #d3d3d3b1}.address-list{display:flex;flex-direction:column;gap:10px;height:500px;overflow-y:auto}.address-list .address-left{width:80%}.address-list .address-right{width:20%}.address-list .address-phone{margin-left:10px}.address-list .address-type{background-color:#d3d3d34a;padding:5px 10px;text-align:center;border-radius:5px;margin-left:15px}.address-list .address-det{margin:10px 0}.add-address{color:#0267c1;cursor:pointer;font-weight:600}.address-active{background-color:#0267c1;color:#fff}.selected-address{border:2px solid #0267C1!important}.error-message{color:tomato;display:flex;flex-direction:column;width:100%}@media only screen and (max-width: 475px){.address-list{height:fit-content;max-height:230px}.forms{flex-direction:column}.form-control-group{width:100%}.label{padding-bottom:10px}.address-type-options{position:relative;right:4px}.action-btn{position:relative;bottom:0;top:19px;right:0}.action-btn button{width:100%!important}.address-type{padding:10px 27px}.address-sec{padding:20px 4px}}button:disabled{background-color:#d3d3d3!important}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }] }); }
162
251
  }
163
252
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AddressComponent, decorators: [{
164
253
  type: Component,
@@ -166,15 +255,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
166
255
  MatIcon,
167
256
  CommonModule,
168
257
  FormsModule,
169
- MatDialogModule
170
- ], template: "<section class=\"address-sec\">\r\n <div class=\"header\">\r\n <h3>{{isCart ? 'Shipping To' : 'New Address'}}</h3>\r\n <mat-icon (click)=\"close()\" *ngIf=\"!isCart\">close</mat-icon>\r\n <span class=\"add-address\" *ngIf=\"addressList.length && !addNewAddress\" (click)=\"addNewAddress = true\">+ add address</span>\r\n </div>\r\n <ng-container *ngIf=\"!addressList?.length || addNewAddress\">\r\n <p (click)=\"getCurrentLocation()\" class=\"d-flex align-items-center\" style=\"cursor: pointer;\">\r\n <mat-icon>my_location</mat-icon>\r\n <span>take my current location</span>\r\n </p>\r\n <div class=\"forms d-flex flex-wrap\">\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Name</div>\r\n <input type=\"text\" placeholder=\"Enter name\" [(ngModel)]=\"address.receiverName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Mobile</div>\r\n <input type=\"text\" placeholder=\"Enter mobile\" [(ngModel)]=\"address.receiverPhone\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Email</div>\r\n <input type=\"text\" placeholder=\"Enter email\" [(ngModel)]=\"address.receiverEmail\">\r\n </div>\r\n <div class=\"form-control-full-group\">\r\n <div class=\"label\">Address</div>\r\n <input type=\"text\" placeholder=\"Enter address\" matGoogleMapsAutocomplete\r\n (onAutocompleteSelected)=\"onAutocompleteSelected($event)\"\r\n (onLocationSelected)=\"onLocationSelected($event)\" [(ngModel)]=\"address.addressLine1\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Locality</div>\r\n <input type=\"text\" placeholder=\"Enter locality\" [(ngModel)]=\"address.localityName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Landmark</div>\r\n <input type=\"text\" placeholder=\"Enter landmark\" [(ngModel)]=\"address.landmark\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Pincode</div>\r\n <input type=\"text\" placeholder=\"Enter pincode\" [(ngModel)]=\"address.zipCode\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">City</div>\r\n <input type=\"text\" placeholder=\"Enter city\" [(ngModel)]=\"address.cityName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">State</div>\r\n <input type=\"text\" placeholder=\"Enter state\" [(ngModel)]=\"address.stateName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\">Address Type</div>\r\n <div class=\"d-flex\">\r\n <ng-container *ngFor=\"let address of addessType\">\r\n <span class=\"address-type\" (click)=\"checkAddressType(address)\" [ngClass]=\"{'active-address': address.status}\">{{address.key}}</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"address-list\" *ngIf=\"addressList.length && !addNewAddress\">\r\n <ng-container *ngFor=\"let address of addressList; let idx = index\">\r\n <div class=\"address\" (click)=\"selectedAddressIdx = idx\" [ngClass]=\"{'selected-address': selectedAddressIdx == idx}\">\r\n <div class=\"address-left\">\r\n <div class=\"top\">\r\n <span class=\"fw-bold mr-2\">{{address?.receiverName}}</span>\r\n <span class=\"address-type\">{{address?.addressType}}</span>\r\n </div>\r\n <div class=\"address-det\">{{address.addressLine1}}</div>\r\n <div class=\"phone\">\r\n <span>Phone:</span>\r\n <span class=\"address-phone\">{{address.receiverPhone}}</span>\r\n </div>\r\n </div>\r\n <div class=\"address-right\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"action-btn\" *ngIf=\"!addressList.length || addNewAddress\">\r\n <button (click)=\"updateAddress()\">Update</button>\r\n </div>\r\n</section>", styles: [".address-sec{padding:20px;position:relative}.address-sec .header{display:flex;justify-content:space-between;margin-bottom:20px}.mat-icon{cursor:pointer;margin-right:5px}.action-btn{position:absolute;bottom:-50px;right:10px}.action-btn button{background-color:#0267c1;color:#fff;padding:10px;width:200px!important;border:none}.label:after{content:\"*\"}.active-address{background-color:#0267c1!important;color:#fff!important}.forms{gap:10px;justify-content:space-between}.form-control-group,.form-control-full-group{width:48%}:is(.form-control-group,.form-control-full-group) input{width:100%;padding:10px;border-radius:3px;border:1.5px solid lightgray}.form-control-full-group{width:100%!important}.address-type{width:150px;padding:10px;background-color:#d3d3d35c;color:#000;text-align:center;border-radius:5px;margin:0 5px;cursor:pointer}.address-list{display:flex;flex-direction:column;gap:10px}.address-list .address{display:flex;padding:15px;border-radius:5px;box-shadow:0 1px 1px #0000,0 1px 1px #00000030;border:1px solid #d3d3d3b1}.address-list .address-left{width:80%}.address-list .address-right{width:20%}.address-list .address-phone{margin-left:10px}.address-list .address-type{background-color:#d3d3d34a;padding:5px 10px;text-align:center;border-radius:5px;margin-left:15px}.address-list .address-det{margin:10px 0}.add-address{color:#0267c1;cursor:pointer;font-weight:600}.address-active{background-color:#0267c1;color:#fff}.selected-address{border:2px solid #0267C1!important}\n"] }]
171
- }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.RestService }, { type: i2.MatDialog }, { type: i3.Router }, { type: i4.StorageServiceService }], propDecorators: { responseData: [{
258
+ HoverDirective,
259
+ MatDialogModule,
260
+ MatBottomSheetModule,
261
+ DeleteHoverElementComponent,
262
+ HoverElementsComponent
263
+ ], providers: [], template: "<section class=\"address-sec\" (click)=\"editSection()\" simpoHover (hovering)=\"showEditTabs($event)\" >\r\n <div class=\"header\">\r\n <div class=\"new-address-header\">\r\n <mat-icon (click)=\"goToHome()\" *ngIf=\"!isCart\">keyboard_arrow_left</mat-icon>\r\n <h3>{{isCart ? 'Shipping To' : 'New Address'}}</h3>\r\n </div>\r\n <span class=\"add-address\" *ngIf=\"!addNewAddress\" (click)=\"addNewAddress = true\">+ add address</span>\r\n </div>\r\n <ng-container *ngIf=\"addNewAddress\">\r\n <!-- <p (click)=\"getCurrentLocation()\" class=\"d-flex align-items-center\" style=\"cursor: pointer;\">\r\n <mat-icon>my_location</mat-icon>\r\n <span>Take my current location</span>\r\n </p> -->\r\n <div class=\"forms d-flex flex-wrap\">\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Name</div>\r\n <input type=\"text\" placeholder=\"Enter name\" [(ngModel)]=\"address.receiverName\" (keydown)=\"validateName($event)\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Mobile</div>\r\n <input type=\"text\" placeholder=\"Enter mobile\" [(ngModel)]=\"address.receiverPhone\" (keydown)=\"validateMobile($event)\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Email</div>\r\n <input type=\"text\" placeholder=\"Enter email\" [(ngModel)]=\"address.receiverEmail\">\r\n </div>\r\n <div class=\"form-control-full-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Address</div>\r\n <input type=\"text\" placeholder=\"Enter address\" matGoogleMapsAutocomplete\r\n (onAutocompleteSelected)=\"onAutocompleteSelected($event)\"\r\n (onLocationSelected)=\"onLocationSelected($event)\" [(ngModel)]=\"address.addressLine1\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Locality</div>\r\n <input type=\"text\" placeholder=\"Enter locality\" [(ngModel)]=\"address.localityName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label\" [style.color]=\"data?.styles?.background?.accentColor\">Landmark</div>\r\n <input type=\"text\" placeholder=\"Enter landmark\" [(ngModel)]=\"address.landmark\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Pincode</div>\r\n <input type=\"text\" placeholder=\"Enter pincode\" [(ngModel)]=\"address.zipCode\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">City</div>\r\n <input type=\"text\" placeholder=\"Enter city\" [(ngModel)]=\"address.cityName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">State</div>\r\n <input type=\"text\" placeholder=\"Enter state\" [(ngModel)]=\"address.stateName\">\r\n </div>\r\n <div class=\"form-control-group\">\r\n <div class=\"label required\" [style.color]=\"data?.styles?.background?.accentColor\">Address Type</div>\r\n <div class=\"d-flex\">\r\n <ng-container *ngFor=\"let address of addessType\">\r\n <span class=\"address-type\" (click)=\"checkAddressType(address)\" [ngClass]=\"{'active-address': address.status}\">{{address.key}}</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"address-list\" *ngIf=\"!addNewAddress\">\r\n <ng-container *ngFor=\"let address of addressList; let idx = index\">\r\n <div class=\"address\" (click)=\"addressSelected(idx)\" [ngClass]=\"{'selected-address': selectedAddressIdx == idx}\">\r\n <div class=\"address-left\">\r\n <div class=\"top\">\r\n <span class=\"fw-bold mr-2\">{{address?.receiverName}}</span>\r\n <span class=\"address-type\">{{address?.addressType}}</span>\r\n </div>\r\n <div class=\"address-det\">{{address.addressLine1}}</div>\r\n <div class=\"phone\">\r\n <span>Phone:</span>\r\n <span class=\"address-phone\">{{address.receiverPhone}}</span>\r\n </div>\r\n </div>\r\n <div class=\"address-right\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"action-btn\" *ngIf=\"addNewAddress\">\r\n <div class=\"error-message\">\r\n <span *ngIf=\"address.receiverPhone?.length != 10 && address.receiverPhone?.length\">*Mobile number is invalid</span>\r\n <span *ngIf=\"!isEmailValid\">*Email is invalid</span>\r\n </div>\r\n <button [disabled]=\"\r\n !address.receiverName || \r\n !address.receiverPhone ||\r\n address.receiverPhone?.length != 10 ||\r\n !isEmailValid || \r\n !address.addressLine1 || \r\n !address.localityName || \r\n !address.zipCode || \r\n !address.cityName ||\r\n !address.stateName || \r\n !address.addressType || isLoading\r\n \" (click)=\"updateAddress()\">{{isLoading ? 'Loading' : 'Update'}}</button>\r\n </div>\r\n</section>\r\n\r\n\r\n<div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n</div>\r\n<div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n</div>", styles: [".address-sec{padding:20px;position:relative}.address-sec .header{display:flex;align-items:center;justify-content:space-between;gap:5px;margin-bottom:20px}.new-address-header{display:flex;align-items:center}.mat-icon{cursor:pointer;margin-right:5px}.action-btn{margin-left:auto;bottom:-20px;position:relative;right:0;display:flex;flex-direction:column;align-items:flex-end}.action-btn button{background-color:#0267c1;color:#fff;padding:10px;width:200px!important;border:none;border-radius:5px}.label:after{content:\"*\"}.active-address{background-color:#0267c1!important;color:#fff!important}.forms{gap:10px;justify-content:space-between}.form-control-group,.form-control-full-group{width:48%}:is(.form-control-group,.form-control-full-group) input{width:100%;padding:10px;border-radius:3px;border:1.5px solid lightgray}.form-control-full-group{width:100%!important}.address-type{width:150px;padding:10px;background-color:#d3d3d35c;color:#000;text-align:center;border-radius:5px;margin:0 5px;cursor:pointer}.address{display:flex;padding:15px;border-radius:5px;box-shadow:0 1px 1px #0000,0 1px 1px #00000030;border:1px solid #d3d3d3b1}.address-list{display:flex;flex-direction:column;gap:10px;height:500px;overflow-y:auto}.address-list .address-left{width:80%}.address-list .address-right{width:20%}.address-list .address-phone{margin-left:10px}.address-list .address-type{background-color:#d3d3d34a;padding:5px 10px;text-align:center;border-radius:5px;margin-left:15px}.address-list .address-det{margin:10px 0}.add-address{color:#0267c1;cursor:pointer;font-weight:600}.address-active{background-color:#0267c1;color:#fff}.selected-address{border:2px solid #0267C1!important}.error-message{color:tomato;display:flex;flex-direction:column;width:100%}@media only screen and (max-width: 475px){.address-list{height:fit-content;max-height:230px}.forms{flex-direction:column}.form-control-group{width:100%}.label{padding-bottom:10px}.address-type-options{position:relative;right:4px}.action-btn{position:relative;bottom:0;top:19px;right:0}.action-btn button{width:100%!important}.address-type{padding:10px 27px}.address-sec{padding:20px 4px}}button:disabled{background-color:#d3d3d3!important}\n"] }]
264
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.RestService }, { type: i2.MatDialog }, { type: i3.MatBottomSheet }, { type: i4.Router }, { type: i5.StorageServiceService }, { type: i6.EventsService }, { type: undefined, decorators: [{
265
+ type: Optional
266
+ }, {
267
+ type: Inject,
268
+ args: [MAT_DIALOG_DATA]
269
+ }] }, { type: i2.MatDialogRef, decorators: [{
270
+ type: Optional
271
+ }] }], propDecorators: { responseData: [{
172
272
  type: Input
173
273
  }], data: [{
174
274
  type: Input
175
- }], isCart: [{
275
+ }], index: [{
176
276
  type: Input
177
- }], selectedAddressIdx: [{
277
+ }], edit: [{
278
+ type: Input
279
+ }], delete: [{
280
+ type: Input
281
+ }], selectedAddress: [{
282
+ type: Output
283
+ }], isCart: [{
178
284
  type: Input
179
285
  }] } });
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2Vjb21tZXJjZS9zZWN0aW9ucy9hZGRyZXNzL2FkZHJlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvYWRkcmVzcy9hZGRyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWtCLEtBQUssRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLFdBQVcsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDN0YsT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7OztBQW1CdEUsTUFBTSxPQUFPLGdCQUFnQjtJQUszQixZQUNtQixNQUFjLEVBQ2QsV0FBd0IsRUFDeEIsU0FBb0IsRUFDcEIsTUFBYyxFQUNkLGNBQXFDO0lBQ3RELGdFQUFnRTs7UUFML0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUlqRCxnQkFBVyxHQUFVLEVBQUUsQ0FBQztRQUN4QixZQUFPLEdBQVE7WUFDcEIsY0FBYyxFQUFFLEVBQUU7WUFDbEIs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LE9BQWdCLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLEdBQUc7Z0JBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDN0IsQ0FBQztnQkFDSixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtvQkFDN0MsTUFBTSxFQUFFLE1BQU07b0JBQ2QsS0FBSyxFQUFFLE1BQU07b0JBQ2IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2lCQUNoQixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7OEdBOUpVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLGtOQzNCN0Isd2xKQWlGVSw4Z0REOUROLE9BQU8sMElBQ1AsWUFBWSw2VkFDWixXQUFXLDhtQkFDWCxlQUFlOzsyRkFLTixnQkFBZ0I7a0JBWjVCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUDt3QkFDUCxPQUFPO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxlQUFlO3FCQUNoQjtzTEFNUSxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkErQkcsTUFBTTtzQkFBZCxLQUFLO2dCQW9CRyxrQkFBa0I7c0JBQTFCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgTmdab25lLCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci1tYXRlcmlhbC1leHRlbnNpb25zL2dvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCBVc2VyRGV0YWlscyBmcm9tICcuLy4uLy4uL2pzb24vdXNlci1kZXRhaWxzLmpzb24nO1xyXG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3Jlc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGVVc2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vYXV0aGVudGljYXRlLXVzZXIvYXV0aGVudGljYXRlLXVzZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vc3R5bGVzL3VzZXIubW9kYWwnO1xyXG5cclxuZGVjbGFyZSB2YXIgZ29vZ2xlOiBhbnk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLWFkZHJlc3MnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWF0SWNvbixcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nTW9kdWxlXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWRkcmVzcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FkZHJlc3MuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZHJlc3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGRhdGE6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hdERpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZVxyXG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxBZGRyZXNzQ29tcG9uZW50PlxyXG4gICkge31cclxuXHJcbiAgcHVibGljIGFkZHJlc3NMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyBhZGRyZXNzOiBhbnkgPSB7XHJcbiAgICBcInJlY2VpdmVyTmFtZVwiOiBcIlwiLFxyXG4gICAgXCJyZWNlaXZlclBob25lXCI6IFwiXCIsXHJcbiAgICBcInJlY2VpdmVyRW1haWxcIjogXCJcIixcclxuICAgIFwiY291bnRyeU5hbWVcIjogXCJcIixcclxuICAgIFwic3RhdGVOYW1lXCI6IFwiXCIsXHJcbiAgICBcImNpdHlOYW1lXCI6IFwiXCIsXHJcbiAgICBcImxvY2FsaXR5TmFtZVwiOiBcIlwiLFxyXG4gICAgXCJhZGRyZXNzTGluZTFcIjogXCJcIixcclxuICAgIFwibGFuZG1hcmtcIjogXCJcIixcclxuICAgIFwiemlwQ29kZVwiOiBcIlwiLFxyXG4gICAgXCJzdGF0ZUNvZGVcIjogXCJcIixcclxuICAgIFwiYWRkcmVzc1R5cGVcIjogXCJcIixcclxuICAgIFwiZ2VvbG9jYXRpb25cIjoge1xyXG4gICAgICBcImxhdGl0dWRlXCI6IDAsXHJcbiAgICAgIFwibG9uZ2l0dWRlXCI6IDBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGlzQ2FydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGxhdGl0dXRlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvbmdpdHV0ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIGFkZE5ld0FkZHJlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIG1hcENlbnRlcjogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCA9IHtcclxuICAgIGxhdDogMCxcclxuICAgIGxuZzogMFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtYXJrZXJQb3NpdGlvbjogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCA9IHtcclxuICAgIGxhdDogMCxcclxuICAgIGxuZzogMFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtYXJrZXJPcHRpb25zOiBnb29nbGUubWFwcy5NYXJrZXJPcHRpb25zID0geyBkcmFnZ2FibGU6IHRydWUgfTtcclxuXHJcbiAgcHJpdmF0ZSBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xyXG5cclxuICBASW5wdXQoKSBzZWxlY3RlZEFkZHJlc3NJZHg6IG51bWJlciA9IC0xO1xyXG4gIHB1YmxpYyBhZGRlc3NUeXBlOiB7IGtleTogc3RyaW5nLCBzdGF0dXM6IGJvb2xlYW4gfVtdID0gW1xyXG4gICAgeyBrZXk6IFwiSE9NRVwiLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IGtleTogXCJXT1JLXCIsIHN0YXR1czogZmFsc2UgfSxcclxuICAgIHsga2V5OiBcIk9USEVSXCIsIHN0YXR1czogZmFsc2UgfVxyXG4gIF07XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmdldEN1cnJlbnRMb2NhdGlvbigpO1xyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuYWRkcmVzc0xpc3QgPSB0aGlzLnJlc3BvbnNlRGF0YTtcclxuICB9XHJcblxyXG4gIGNoZWNrQWRkcmVzc1R5cGUoYWRkcmVzczogeyBrZXk6IHN0cmluZywgc3RhdHVzOiBib29sZWFuIH0pIHtcclxuICAgIHRoaXMuYWRkZXNzVHlwZS5mb3JFYWNoKChhZGQpPT4gYWRkLnN0YXR1cyA9IChhZGQua2V5ID09IGFkZHJlc3Mua2V5KSk7XHJcbiAgICB0aGlzLmFkZHJlc3MuYWRkcmVzc1R5cGUgPSBhZGRyZXNzLmtleTtcclxuICB9XHJcbiAgY2xvc2UoKSB7XHJcblxyXG4gIH1cclxuICBnZXRDdXJyZW50TG9jYXRpb24oKSB7XHJcbiAgICBpZiAobmF2aWdhdG9yLmdlb2xvY2F0aW9uKSB7XHJcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKHZhbHVlcykgPT4ge1xyXG4gICAgICAgIHRoaXMubGF0aXR1dGUgPSB2YWx1ZXMuY29vcmRzLmxhdGl0dWRlO1xyXG4gICAgICAgIHRoaXMubG9uZ2l0dXRlID0gdmFsdWVzLmNvb3Jkcy5sb25naXR1ZGU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRBZGRyZXNzKCkge1xyXG4gICAgdGhpcy5nZW9jb2Rlci5nZW9jb2RlKHsgbG9jYXRpb246IHRoaXMubWFya2VyUG9zaXRpb24gfSwgKHJlc3VsdHM6IGFueSwgc3RhdHVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHN0YXR1cyA9PT0gJ09LJyAmJiByZXN1bHRzWzBdKSB7XHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgIC8vIHRoaXMuYWRkcmVzcyA9IHJlc3VsdHNbMF0uZm9ybWF0dGVkX2FkZHJlc3M7XHJcbiAgICAgICAgICByZXN1bHRzWzBdLmFkZHJlc3NfY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IGNvbXBvbmVudC50eXBlcztcclxuICAgICAgICAgICAgaWYgKHR5cGVzLmluY2x1ZGVzKFwibG9jYWxpdHlcIikpIHtcclxuICAgICAgICAgICAgICAvLyB0aGlzLmNpdHkgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyhcImFkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMVwiKSkge1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuc3RhdGUgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyhcImNvdW50cnlcIikpIHtcclxuICAgICAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkQ291bnRyeSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVzLmluY2x1ZGVzKFwicG9zdGFsX2NvZGVcIikpIHtcclxuICAgICAgICAgICAgICAvLyB0aGlzLnppcCA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgb25Mb2NhdGlvblNlbGVjdGVkKGxvY2F0aW9uOiBhbnkpIHtcclxuICAgIFxyXG4gICAgdGhpcy5sYXRpdHV0ZSA9IGxvY2F0aW9uLmxhdGl0dWRlO1xyXG4gICAgdGhpcy5sb25naXR1dGUgPSBsb2NhdGlvbi5sb25naXR1ZGU7XHJcbiAgICAgIC8vIHRoaXMuc2V0UG9zaXRpb24oKTsgIC8vIFVwZGF0ZSBtYXAgcG9zaXRpb25cclxuICAgIC8vIHRoaXMudXBkYXRlQWRkcmVzc0ZpZWxkcygpO1xyXG4gIH1cclxuICBvbkF1dG9jb21wbGV0ZVNlbGVjdGVkKHJlc3VsdDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xyXG4gICAgLy8gdGhpcy5zZWxlY3RlZENvdW50cnkgPSBudWxsO1xyXG4gICAgLy8gdGhpcy56aXAgPSBcIlwiO1xyXG4gICAgLy8gdGhpcy5zdGF0ZSA9IFwiXCI7XHJcbiAgICAvLyB0aGlzLmNpdHkgPSBcIlwiO1xyXG4gICAgLy8gdGhpcy5hZGRyZXNzID0gcmVzdWx0Py5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgIHJlc3VsdD8uYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2goKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZGF0YT8udHlwZXMuaW5jbHVkZXMoXCJjb3VudHJ5XCIpKXt9XHJcbiAgICAgICAgLy8gdGhpcy5zZWxlY3RlZENvdW50cnkgPSBkYXRhLmxvbmdfbmFtZTtcclxuICAgICAgZWxzZSBpZiAoZGF0YT8udHlwZXMuaW5jbHVkZXMoXCJwb3N0YWxfY29kZVwiKSl7fVxyXG4gICAgICAgIC8vIHRoaXMuemlwID0gZGF0YS5sb25nX25hbWU7XHJcbiAgICAgIGVsc2UgaWYgKGRhdGE/LnR5cGVzLmluY2x1ZGVzKFwiYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xXCIpKXt9XHJcbiAgICAgICAgLy8gdGhpcy5zdGF0ZSA9IGRhdGEubG9uZ19uYW1lO1xyXG4gICAgICBlbHNlIGlmIChkYXRhPy50eXBlcy5pbmNsdWRlcyhcImxvY2FsaXR5XCIpKXt9XHJcbiAgICAgICAgLy8gdGhpcy5jaXR5ID0gZGF0YS5sb25nX25hbWU7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgdXBkYXRlQWRkcmVzcygpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXIpO1xyXG4gICAgY29uc29sZS5sb2codXNlckRldGFpbHMpO1xyXG4gICAgaWYgKHVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgXCJ1c2VySWRcIjogdXNlckRldGFpbHMudXNlcklkLFxyXG4gICAgICAgIFwiYWRkcmVzc0RldGFpbHNMaXN0XCI6IFsuLi4odXNlckRldGFpbHM/LmFkZHJlc3NEZXRhaWxzTGlzdCA/PyBbXSksIHRoaXMuYWRkcmVzc10sXHJcbiAgICAgICAgXCJjb250YWN0XCI6IHVzZXJEZXRhaWxzPy5jb250YWN0ID8/IHt9LFxyXG4gICAgICAgIFwiZ2VuZGVyXCI6IHVzZXJEZXRhaWxzPy5nZW5kZXI/Lmxlbmd0aCA+IDAgPyB1c2VyRGV0YWlscz8uZ2VuZGVyICA6ICBudWxsXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXN0U2VydmljZS5hZGRVc2VyQWRkcmVzcyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKT0+IHtcclxuICAgICAgICB0aGlzLmFkZE5ld0FkZHJlc3MgPSBmYWxzZTtcclxuICAgICAgICBVc2VyRGV0YWlscy51c2VyID0gdXNlckRldGFpbHMgYXMgbmV2ZXI7XHJcbiAgICAgICAgVXNlckRldGFpbHMudXNlci5hZGRyZXNzRGV0YWlsc0xpc3QucHVzaCh0aGlzLmFkZHJlc3MgYXMgbmV2ZXIpO1xyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDQ3NSlcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hdXRoJ10pO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLm1hdERpYWxvZy5vcGVuKEF1dGhlbnRpY2F0ZVVzZXJDb21wb25lbnQsIHtcclxuICAgICAgICAgIGhlaWdodDogJzUwdmgnLFxyXG4gICAgICAgICAgd2lkdGg6ICczNXZ3JyxcclxuICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwiYWRkcmVzcy1zZWNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICAgICAgICA8aDM+e3tpc0NhcnQgPyAnU2hpcHBpbmcgVG8nIDogJ05ldyBBZGRyZXNzJ319PC9oMz5cclxuICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cImNsb3NlKClcIiAqbmdJZj1cIiFpc0NhcnRcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtYWRkcmVzc1wiICpuZ0lmPVwiYWRkcmVzc0xpc3QubGVuZ3RoICYmICFhZGROZXdBZGRyZXNzXCIgKGNsaWNrKT1cImFkZE5ld0FkZHJlc3MgPSB0cnVlXCI+KyBhZGQgYWRkcmVzczwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFhZGRyZXNzTGlzdD8ubGVuZ3RoIHx8IGFkZE5ld0FkZHJlc3NcIj5cclxuICAgICAgICA8cCAoY2xpY2spPVwiZ2V0Q3VycmVudExvY2F0aW9uKClcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPm15X2xvY2F0aW9uPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPHNwYW4+dGFrZSBteSBjdXJyZW50IGxvY2F0aW9uPC9zcGFuPlxyXG4gICAgICAgIDwvcD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybXMgZC1mbGV4IGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj5OYW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIG5hbWVcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3MucmVjZWl2ZXJOYW1lXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj5Nb2JpbGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgbW9iaWxlXCIgWyhuZ01vZGVsKV09XCJhZGRyZXNzLnJlY2VpdmVyUGhvbmVcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiPkVtYWlsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGVtYWlsXCIgWyhuZ01vZGVsKV09XCJhZGRyZXNzLnJlY2VpdmVyRW1haWxcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZnVsbC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+QWRkcmVzczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBhZGRyZXNzXCIgbWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgIChvbkF1dG9jb21wbGV0ZVNlbGVjdGVkKT1cIm9uQXV0b2NvbXBsZXRlU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uTG9jYXRpb25TZWxlY3RlZCk9XCJvbkxvY2F0aW9uU2VsZWN0ZWQoJGV2ZW50KVwiIFsobmdNb2RlbCldPVwiYWRkcmVzcy5hZGRyZXNzTGluZTFcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiPkxvY2FsaXR5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGxvY2FsaXR5XCIgWyhuZ01vZGVsKV09XCJhZGRyZXNzLmxvY2FsaXR5TmFtZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+TGFuZG1hcms8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgbGFuZG1hcmtcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3MubGFuZG1hcmtcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiPlBpbmNvZGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgcGluY29kZVwiIFsobmdNb2RlbCldPVwiYWRkcmVzcy56aXBDb2RlXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj5DaXR5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGNpdHlcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3MuY2l0eU5hbWVcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiPlN0YXRlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHN0YXRlXCIgWyhuZ01vZGVsKV09XCJhZGRyZXNzLnN0YXRlTmFtZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+QWRkcmVzcyBUeXBlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWRkcmVzcyBvZiBhZGRlc3NUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkcmVzcy10eXBlXCIgKGNsaWNrKT1cImNoZWNrQWRkcmVzc1R5cGUoYWRkcmVzcylcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZS1hZGRyZXNzJzogYWRkcmVzcy5zdGF0dXN9XCI+e3thZGRyZXNzLmtleX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzcy1saXN0XCIgKm5nSWY9XCJhZGRyZXNzTGlzdC5sZW5ndGggJiYgIWFkZE5ld0FkZHJlc3NcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhZGRyZXNzIG9mIGFkZHJlc3NMaXN0OyBsZXQgaWR4ID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3NcIiAoY2xpY2spPVwic2VsZWN0ZWRBZGRyZXNzSWR4ID0gaWR4XCIgW25nQ2xhc3NdPVwieydzZWxlY3RlZC1hZGRyZXNzJzogc2VsZWN0ZWRBZGRyZXNzSWR4ID09IGlkeH1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRyZXNzLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctYm9sZCBtci0yXCI+e3thZGRyZXNzPy5yZWNlaXZlck5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGRyZXNzLXR5cGVcIj57e2FkZHJlc3M/LmFkZHJlc3NUeXBlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtZGV0XCI+e3thZGRyZXNzLmFkZHJlc3NMaW5lMX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBob25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlBob25lOjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGRyZXNzLXBob25lXCI+e3thZGRyZXNzLnJlY2VpdmVyUGhvbmV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtcmlnaHRcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnRuXCIgKm5nSWY9XCIhYWRkcmVzc0xpc3QubGVuZ3RoIHx8IGFkZE5ld0FkZHJlc3NcIj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ1cGRhdGVBZGRyZXNzKClcIj5VcGRhdGU8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L3NlY3Rpb24+Il19
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2Vjb21tZXJjZS9zZWN0aW9ucy9hZGRyZXNzL2FkZHJlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvYWRkcmVzcy9hZGRyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWtCLEtBQUssRUFBNEIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25JLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxlQUFlLEVBQWEsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBS3JHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFNUUsT0FBTyxXQUFXLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUVBQXlFLENBQUM7QUFDdEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFFckcsT0FBTyxFQUFrQixvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7O0FBdUJ0RixNQUFNLE9BQU8sZ0JBQWlCLFNB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Q0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xKLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDVixPQUFPLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDO0lBQ2xDLENBQUM7OEdBMVBVLGdCQUFnQixrTkFtQkwsZUFBZTtrR0FuQjFCLGdCQUFnQix1T0FOaEIsRUFFVixzRUNyQ0gsazhNQTBHTSxxc0VEaEZGLE9BQU8sMElBQ1AsWUFBWSw2VkFDWixXQUFXLCttQkFDWCxjQUFjLCtFQUNkLGVBQWUsOEJBQ2Ysb0JBQW9CLCtCQUNwQiwyQkFBMkIscUhBQzNCLHNCQUFzQjs7MkZBUWIsZ0JBQWdCO2tCQW5CNUIsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQO3dCQUNQLE9BQU87d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixvQkFBb0I7d0JBQ3BCLDJCQUEyQjt3QkFDM0Isc0JBQXNCO3FCQUN2QixhQUNVLEVBRVY7OzBCQXVCRSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGVBQWU7OzBCQUNsQyxRQUFRO3lDQWxCRixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFHSSxlQUFlO3NCQUF4QixNQUFNO2dCQW1DRSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgTmdab25lLCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPcHRpb25hbCwgSW5qZWN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZVVzZXJDb21wb25lbnQgfSBmcm9tICcuLi9hdXRoZW50aWNhdGUtdXNlci9hdXRoZW50aWNhdGUtdXNlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZywgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBRERSRVNTX1RZUEUsIEFkZHJlc3NEZXRhaWxzLCBVc2VyIH0gZnJvbSAnLi4vLi4vc3R5bGVzL3VzZXIubW9kYWwnO1xyXG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBLRVlCT0FSRF9LRVlTIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2J1c2luZXNzLmNvbnN0YW50JztcclxuaW1wb3J0IHsgSG92ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvaG92ZXItZWxlbWVudC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyLW1hdGVyaWFsLWV4dGVuc2lvbnMvZ29vZ2xlLW1hcHMtYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NlY3Rpb25zL0Jhc2VTZWN0aW9uJztcclxuaW1wb3J0IHsgRGVsZXRlSG92ZXJFbGVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9kZWxldGUtaG92ZXItZWxlbWVudC9kZWxldGUtaG92ZXItZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBIb3ZlckVsZW1lbnRzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9ob3Zlci1lbGVtZW50cy9ob3Zlci1lbGVtZW50cy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBZGRyZXNzIH0gZnJvbSAnLi4vY2FydC9jYXJ0Lm1vZGFsJztcclxuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQsIE1hdEJvdHRvbVNoZWV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0JztcclxuXHJcbmRlY2xhcmUgdmFyIGdvb2dsZTogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby1hZGRyZXNzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdEljb24sXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIEhvdmVyRGlyZWN0aXZlLFxyXG4gICAgTWF0RGlhbG9nTW9kdWxlLFxyXG4gICAgTWF0Qm90dG9tU2hlZXRNb2R1bGUsXHJcbiAgICBEZWxldGVIb3ZlckVsZW1lbnRDb21wb25lbnQsXHJcbiAgICBIb3ZlckVsZW1lbnRzQ29tcG9uZW50XHJcbiAgXSxcclxuICBwcm92aWRlcnM6IFtcclxuXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWRkcmVzcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FkZHJlc3MuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZHJlc3NDb21wb25lbnQgZXh0ZW5kcyBCYXNlU2VjdGlvbiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQElucHV0KCkgcmVzcG9uc2VEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgZGF0YTogYW55OyBcclxuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcclxuICBASW5wdXQoKSBlZGl0PzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkZWxldGU/OiBib29sZWFuO1xyXG4gIHB1YmxpYyBhZGRyZXNzTGlzdDogYW55ID0gW107XHJcbiAgc2VsZWN0ZWRBZGRyZXNzSWR4OiBudW1iZXIgPSAwO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEFkZHJlc3M6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF0Qm90dG9tc2hlZXQ6IE1hdEJvdHRvbVNoZWV0LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgbWF0RGF0YTogYW55LFxyXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIG1hdERpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFkZHJlc3NDb21wb25lbnQ+XHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZHJlc3M6IEFkZHJlc3NEZXRhaWxzID0ge1xyXG4gICAgXCJyZWNlaXZlck5hbWVcIjogXCJcIixcclxuICAgIFwicmVjZWl2ZXJQaG9uZVwiOiBcIlwiLFxyXG4gICAgXCJyZWNlaXZlckVtYWlsXCI6IFwiXCIsXHJcbiAgICBcImNvdW50cnlOYW1lXCI6IFwiXCIsXHJcbiAgICBcInN0YXRlTmFtZVwiOiBcIlwiLFxyXG4gICAgXCJjaXR5TmFtZVwiOiBcIlwiLFxyXG4gICAgXCJsb2NhbGl0eU5hbWVcIjogXCJcIixcclxuICAgIFwiYWRkcmVzc0xpbmUxXCI6IFwiXCIsXHJcbiAgICBcImxhbmRtYXJrXCI6IFwiXCIsXHJcbiAgICBcInppcENvZGVcIjogXCJcIixcclxuICAgIFwic3RhdGVDb2RlXCI6IFwiXCIsXHJcbiAgICBcImFkZHJlc3NUeXBlXCI6IFwiSE9NRVwiLFxyXG4gICAgXCJnZW9sb2NhdGlvblwiOiB7XHJcbiAgICAgIFwibGF0aXR1ZGVcIjogMCxcclxuICAgICAgXCJsb25naXR1ZGVcIjogMFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgaXNDYXJ0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZWRpdEluZGV4OiBudW1iZXIgPSAtMTtcclxuICBwcml2YXRlIGxhdGl0dXRlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvbmdpdHV0ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIGFkZE5ld0FkZHJlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIG1hcENlbnRlcjogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCA9IHtcclxuICAgIGxhdDogMCxcclxuICAgIGxuZzogMFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtYXJrZXJQb3NpdGlvbjogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCA9IHtcclxuICAgIGxhdDogMCxcclxuICAgIGxuZzogMFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtYXJrZXJPcHRpb25zOiBnb29nbGUubWFwcy5NYXJrZXJPcHRpb25zID0geyBkcmFnZ2FibGU6IHRydWUgfTtcclxuXHJcbiAgcHJpdmF0ZSBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xyXG5cclxuICBwdWJsaWMgYWRkZXNzVHlwZTogeyBrZXk6IHN0cmluZywgc3RhdHVzOiBib29sZWFuIH1bXSA9IFtcclxuICAgIHsga2V5OiBcIkhPTUVcIiwgc3RhdHVzOiBmYWxzZSB9LFxyXG4gICAgeyBrZXk6IFwiV09SS1wiLCBzdGF0dXM6IGZhbHNlIH0sXHJcbiAgICB7IGtleTogXCJPVEhFUlwiLCBzdGF0dXM6IGZhbHNlIH1cclxuICBdO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0Q3VycmVudExvY2F0aW9uKCk7XHJcbiAgICBcclxuICAgIHRoaXMuYWRkTmV3QWRkcmVzcyA9IHRoaXMucmVzcG9uc2VEYXRhPy5sZW5ndGggPT0gMDtcclxuICAgIGlmICh0aGlzLm1hdERhdGEpIHtcclxuICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSB0aGlzLm1hdERhdGEuYWRkcmVzc0xpc3Q7XHJcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMubWF0RGF0YT8uZGF0YTtcclxuICAgICAgaWYgKHRoaXMubWF0RGF0YT8uYWRkcmVzcykge1xyXG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IHsuLi50aGlzLm1hdERhdGEuYWRkcmVzc307XHJcbiAgICAgICAgdGhpcy5lZGl0SW5kZXggPSB0aGlzLm1hdERhdGE/LmVkaXRJbmRleCA/PyAtMTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFkZE5ld0FkZHJlc3MgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hZGRyZXNzTGlzdCA9IHRoaXMucmVzcG9uc2VEYXRhO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYWRkTmV3QWRkcmVzcyAmJiAhdGhpcy5tYXREYXRhKSB7XHJcbiAgICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XHJcbiAgICAgIHRoaXMuYWRkcmVzcyA9IHsgXHJcbiAgICAgICAgLi4udGhpcy5hZGRyZXNzLFxyXG4gICAgICAgIHJlY2VpdmVyTmFtZTogdXNlckRldGFpbHM/LmNvbnRhY3QubmFtZSA/PyBcIlwiLFxyXG4gICAgICAgIHJlY2VpdmVyRW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0LmVtYWlsID8/IFwiXCIsXHJcbiAgICAgICAgcmVjZWl2ZXJQaG9uZTogdXNlckRldGFpbHM/LmNvbnRhY3QubW9iaWxlID8/IFwiXCJcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAvLyB0aGlzLmFkZHJlc3NMaXN0ID0gdGhpcy5yZXNwb25zZURhdGE7XHJcbiAgfVxyXG5cclxuICBjaGVja0FkZHJlc3NUeXBlKGFkZHJlc3M6IHsga2V5OiBzdHJpbmcsIHN0YXR1czogYm9vbGVhbiB9KSB7XHJcbiAgICB0aGlzLmFkZGVzc1R5cGUuZm9yRWFjaCgoYWRkKT0+IGFkZC5zdGF0dXMgPSAoYWRkLmtleSA9PSBhZGRyZXNzLmtleSkpO1xyXG4gICAgdGhpcy5hZGRyZXNzLmFkZHJlc3NUeXBlID0gYWRkcmVzcy5rZXkgYXMgQUREUkVTU19UWVBFO1xyXG4gIH1cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMubWF0RGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgfVxyXG4gIGdldEN1cnJlbnRMb2NhdGlvbigpIHtcclxuICAgIFxyXG4gICAgaWYgKG5hdmlnYXRvci5nZW9sb2NhdGlvbikge1xyXG4gICAgICBcclxuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigodmFsdWVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sYXRpdHV0ZSA9IHZhbHVlcy5jb29yZHMubGF0aXR1ZGU7XHJcbiAgICAgICAgdGhpcy5sb25naXR1dGUgPSB2YWx1ZXMuY29vcmRzLmxvbmdpdHVkZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEFkZHJlc3MoKSB7XHJcbiAgICB0aGlzLmdlb2NvZGVyLmdlb2NvZGUoeyBsb2NhdGlvbjogdGhpcy5tYXJrZXJQb3NpdGlvbiB9LCAocmVzdWx0czogYW55LCBzdGF0dXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoc3RhdHVzID09PSAnT0snICYmIHJlc3VsdHNbMF0pIHtcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgLy8gdGhpcy5hZGRyZXNzID0gcmVzdWx0c1swXS5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgICAgICAgIHJlc3VsdHNbMF0uYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2goKGNvbXBvbmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGVzID0gY29tcG9uZW50LnR5cGVzO1xyXG4gICAgICAgICAgICBpZiAodHlwZXMuaW5jbHVkZXMoXCJsb2NhbGl0eVwiKSkge1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuY2l0eSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVzLmluY2x1ZGVzKFwiYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xXCIpKSB7XHJcbiAgICAgICAgICAgICAgLy8gdGhpcy5zdGF0ZSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVzLmluY2x1ZGVzKFwiY291bnRyeVwiKSkge1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRDb3VudHJ5ID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZXMuaW5jbHVkZXMoXCJwb3N0YWxfY29kZVwiKSkge1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuemlwID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBvbkxvY2F0aW9uU2VsZWN0ZWQobG9jYXRpb246IGFueSkge1xyXG4gICAgXHJcbiAgICB0aGlzLmxhdGl0dXRlID0gbG9jYXRpb24ubGF0aXR1ZGU7XHJcbiAgICB0aGlzLmxvbmdpdHV0ZSA9IGxvY2F0aW9uLmxvbmdpdHVkZTtcclxuICAgICAgLy8gdGhpcy5zZXRQb3NpdGlvbigpOyAgLy8gVXBkYXRlIG1hcCBwb3NpdGlvblxyXG4gICAgLy8gdGhpcy51cGRhdGVBZGRyZXNzRmllbGRzKCk7XHJcbiAgfVxyXG4gIG9uQXV0b2NvbXBsZXRlU2VsZWN0ZWQocmVzdWx0OiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkQ291bnRyeSA9IG51bGw7XHJcbiAgICAvLyB0aGlzLnppcCA9IFwiXCI7XHJcbiAgICAvLyB0aGlzLnN0YXRlID0gXCJcIjtcclxuICAgIC8vIHRoaXMuY2l0eSA9IFwiXCI7XHJcbiAgICAvLyB0aGlzLmFkZHJlc3MgPSByZXN1bHQ/LmZvcm1hdHRlZF9hZGRyZXNzO1xyXG4gICAgcmVzdWx0Py5hZGRyZXNzX2NvbXBvbmVudHMuZm9yRWFjaCgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChkYXRhPy50eXBlcy5pbmNsdWRlcyhcImNvdW50cnlcIikpe31cclxuICAgICAgICAvLyB0aGlzLnNlbGVjdGVkQ291bnRyeSA9IGRhdGEubG9uZ19uYW1lO1xyXG4gICAgICBlbHNlIGlmIChkYXRhPy50eXBlcy5pbmNsdWRlcyhcInBvc3RhbF9jb2RlXCIpKXt9XHJcbiAgICAgICAgLy8gdGhpcy56aXAgPSBkYXRhLmxvbmdfbmFtZTtcclxuICAgICAgZWxzZSBpZiAoZGF0YT8udHlwZXMuaW5jbHVkZXMoXCJhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzFcIikpe31cclxuICAgICAgICAvLyB0aGlzLnN0YXRlID0gZGF0YS5sb25nX25hbWU7XHJcbiAgICAgIGVsc2UgaWYgKGRhdGE/LnR5cGVzLmluY2x1ZGVzKFwibG9jYWxpdHlcIikpe31cclxuICAgICAgICAvLyB0aGlzLmNpdHkgPSBkYXRhLmxvbmdfbmFtZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBhZGRyZXNzU2VsZWN0ZWQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZWxlY3RlZEFkZHJlc3NJZHggPSBpbmRleDtcclxuICAgIHRoaXMuc2VsZWN0ZWRBZGRyZXNzLmVtaXQoaW5kZXgpO1xyXG4gIH1cclxuICBnb1RvSG9tZSgpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3Byb2ZpbGUnXSlcclxuICB9XHJcbiAgdXBkYXRlQWRkcmVzcygpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXIpO1xyXG4gICAgaWYgKHVzZXJEZXRhaWxzKSB7XHJcblxyXG4gICAgICBjb25zdCBhZGRyZXNzTGlzdCA9IHVzZXJEZXRhaWxzPy5hZGRyZXNzRGV0YWlsc0xpc3Q7XHJcbiAgICAgIGlmICh0aGlzLm1hdERhdGE/LmVkaXRJbmRleCkge1xyXG4gICAgICAgIHRoaXMuYWRkcmVzc0xpc3QuZm9yRWFjaCgoYWRkcmVzczogYW55LCBpZHg6IG51bWJlcik9PiB7XHJcbiAgICAgICAgICBpZiAoaWR4ID09IHRoaXMubWF0RGF0YS5lZGl0SW5keCkge1xyXG4gICAgICAgICAgICBhZGRyZXNzID0gdGhpcy5hZGRyZXNzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYWRkcmVzc0xpc3QucHVzaCh0aGlzLmFkZHJlc3MpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIFwidXNlcklkXCI6IHVzZXJEZXRhaWxzLnVzZXJJZCxcclxuICAgICAgICBcImJ1c2luZXNzSWRcIjogdXNlckRldGFpbHMuYnVzaW5lc3NJZCxcclxuICAgICAgICBcImFkZHJlc3NEZXRhaWxzTGlzdFwiOiBhZGRyZXNzTGlzdCxcclxuICAgICAgICBcImNvbnRhY3RcIjogdXNlckRldGFpbHM/LmNvbnRhY3QgPz8ge30sXHJcbiAgICAgICAgXCJnZW5kZXJcIjogdXNlckRldGFpbHM/LmdlbmRlcj8ubGVuZ3RoID4gMCA/IHVzZXJEZXRhaWxzPy5nZW5kZXIgIDogIG51bGxcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuYWRkVXNlckFkZHJlc3MocGF5bG9hZCkuc3Vic2NyaWJlKChyZXNwb25zZSk9PiB7XHJcbiAgICAgICBcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmFkZE5ld0FkZHJlc3MgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh1c2VyRGV0YWlscykge1xyXG4gICAgICAgICAgICB1c2VyRGV0YWlscy5hZGRyZXNzRGV0YWlsc0xpc3QucHVzaCh0aGlzLmFkZHJlc3MgYXMgbmV2ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFVzZXIodXNlckRldGFpbHMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9LCAoZXJyb3IpPT4ge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gNDc1KSB7XHJcbiAgICAgICAgdGhpcy5tYXRCb3R0b21zaGVldC5vcGVuKEF1dGhlbnRpY2F0ZVVzZXJDb21wb25lbnQsIHtkYXRhOiB0aGlzLmRhdGF9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLm1hdERpYWxvZy5vcGVuKEF1dGhlbnRpY2F0ZVVzZXJDb21wb25lbnQsIHtcclxuICAgICAgICAgIGhlaWdodDogJzUwdmgnLFxyXG4gICAgICAgICAgd2lkdGg6ICczNXZ3JyxcclxuICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHZhbGlkYXRlTW9iaWxlKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoKCFpc05hTihOdW1iZXIoZXZlbnQua2V5KSkgfHwgZXZlbnQua2V5Q29kZSA9PSBLRVlCT0FSRF9LRVlTLkJBQ0tTUEFDRSB8fCBldmVudC5rZXlDb2RlID09IEtFWUJPQVJEX0tFWVMuVEFCKSAmJiBldmVudC5rZXlDb2RlICE9IEtFWUJPQVJEX0tFWVMuU1BBQ0UpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcbiAgdmFsaWRhdGVOYW1lKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoKGV2ZW50LmtleUNvZGUgPj0gS0VZQk9BUkRfS0VZUy5DSEFSQUNURVJfQSAmJiBldmVudC5rZXlDb2RlIDw9IEtFWUJPQVJEX0tFWVMuQ0hBUkFDVEVSX1opIHx8IGV2ZW50LmtleUNvZGUgPT0gMTYgfHwgZXZlbnQua2V5Q29kZSA9PSA4IHx8IGV2ZW50LmtleUNvZGUgPT0gMzIgfHwgZXZlbnQua2V5Q29kZSA9PSA0NiB8fCBldmVudC5rZXlDb2RlID09IDkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcbiAgZWRpdFNlY3Rpb24oKXtcclxuICAgIFxyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLnRvZ2dsZUVkaXRvckV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgc2V0VGltZW91dCgoKT0+IHtcclxuICAgICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmVkaXRTZWN0aW9uLmVtaXQoe2RhdGE6dGhpcy5kYXRhfSk7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuICBnZXQgaXNFbWFpbFZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRkcmVzcz8ucmVjZWl2ZXJFbWFpbD8uaW5jbHVkZXMoXCJAXCIpICYmIHRoaXMuYWRkcmVzcz8ucmVjZWl2ZXJFbWFpbC5pbmNsdWRlcyhcIi5jb21cIikgfHwgKHRoaXMuYWRkcmVzcz8ucmVjZWl2ZXJFbWFpbD8ubGVuZ3RoID09IDApO1xyXG4gIH1cclxuICBnZXQgaXNNb2JpbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPD0gNDc1O1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJhZGRyZXNzLXNlY1wiIChjbGljayk9XCJlZGl0U2VjdGlvbigpXCIgc2ltcG9Ib3ZlciAoaG92ZXJpbmcpPVwic2hvd0VkaXRUYWJzKCRldmVudClcIiA+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy1hZGRyZXNzLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cImdvVG9Ib21lKClcIiAqbmdJZj1cIiFpc0NhcnRcIj5rZXlib2FyZF9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPGgzPnt7aXNDYXJ0ID8gJ1NoaXBwaW5nIFRvJyA6ICdOZXcgQWRkcmVzcyd9fTwvaDM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtYWRkcmVzc1wiICpuZ0lmPVwiIWFkZE5ld0FkZHJlc3NcIiAoY2xpY2spPVwiYWRkTmV3QWRkcmVzcyA9IHRydWVcIj4rIGFkZCBhZGRyZXNzPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWRkTmV3QWRkcmVzc1wiPlxyXG4gICAgICAgIDwhLS0gPHAgKGNsaWNrKT1cImdldEN1cnJlbnRMb2NhdGlvbigpXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5teV9sb2NhdGlvbjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPlRha2UgbXkgY3VycmVudCBsb2NhdGlvbjwvc3Bhbj5cclxuICAgICAgICA8L3A+IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtcyBkLWZsZXggZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbCByZXF1aXJlZFwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+TmFtZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBuYW1lXCIgWyhuZ01vZGVsKV09XCJhZGRyZXNzLnJlY2VpdmVyTmFtZVwiIChrZXlkb3duKT1cInZhbGlkYXRlTmFtZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwgcmVxdWlyZWRcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPk1vYmlsZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBtb2JpbGVcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3MucmVjZWl2ZXJQaG9uZVwiIChrZXlkb3duKT1cInZhbGlkYXRlTW9iaWxlKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbCByZXF1aXJlZFwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+RW1haWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgZW1haWxcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3MucmVjZWl2ZXJFbWFpbFwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC1mdWxsLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwgcmVxdWlyZWRcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPkFkZHJlc3M8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgYWRkcmVzc1wiIG1hdEdvb2dsZU1hcHNBdXRvY29tcGxldGVcclxuICAgICAgICAgICAgICAgICAgICAob25BdXRvY29tcGxldGVTZWxlY3RlZCk9XCJvbkF1dG9jb21wbGV0ZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvbkxvY2F0aW9uU2VsZWN0ZWQpPVwib25Mb2NhdGlvblNlbGVjdGVkKCRldmVudClcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3MuYWRkcmVzc0xpbmUxXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwgcmVxdWlyZWRcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPkxvY2FsaXR5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGxvY2FsaXR5XCIgWyhuZ01vZGVsKV09XCJhZGRyZXNzLmxvY2FsaXR5TmFtZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5MYW5kbWFyazwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBsYW5kbWFya1wiIFsobmdNb2RlbCldPVwiYWRkcmVzcy5sYW5kbWFya1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsIHJlcXVpcmVkXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5QaW5jb2RlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHBpbmNvZGVcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3MuemlwQ29kZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsIHJlcXVpcmVkXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5DaXR5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGNpdHlcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3MuY2l0eU5hbWVcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbCByZXF1aXJlZFwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+U3RhdGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgc3RhdGVcIiBbKG5nTW9kZWwpXT1cImFkZHJlc3Muc3RhdGVOYW1lXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwgcmVxdWlyZWRcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPkFkZHJlc3MgVHlwZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFkZHJlc3Mgb2YgYWRkZXNzVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZHJlc3MtdHlwZVwiIChjbGljayk9XCJjaGVja0FkZHJlc3NUeXBlKGFkZHJlc3MpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtYWRkcmVzcyc6IGFkZHJlc3Muc3RhdHVzfVwiPnt7YWRkcmVzcy5rZXl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtbGlzdFwiICpuZ0lmPVwiIWFkZE5ld0FkZHJlc3NcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhZGRyZXNzIG9mIGFkZHJlc3NMaXN0OyBsZXQgaWR4ID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3NcIiAoY2xpY2spPVwiYWRkcmVzc1NlbGVjdGVkKGlkeClcIiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLWFkZHJlc3MnOiBzZWxlY3RlZEFkZHJlc3NJZHggPT0gaWR4fVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1ib2xkIG1yLTJcIj57e2FkZHJlc3M/LnJlY2VpdmVyTmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZHJlc3MtdHlwZVwiPnt7YWRkcmVzcz8uYWRkcmVzc1R5cGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzcy1kZXRcIj57e2FkZHJlc3MuYWRkcmVzc0xpbmUxfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGhvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UGhvbmU6PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZHJlc3MtcGhvbmVcIj57e2FkZHJlc3MucmVjZWl2ZXJQaG9uZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzcy1yaWdodFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idG5cIiAqbmdJZj1cImFkZE5ld0FkZHJlc3NcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFkZHJlc3MucmVjZWl2ZXJQaG9uZT8ubGVuZ3RoICE9IDEwICYmIGFkZHJlc3MucmVjZWl2ZXJQaG9uZT8ubGVuZ3RoXCI+Kk1vYmlsZSBudW1iZXIgaXMgaW52YWxpZDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNFbWFpbFZhbGlkXCI+KkVtYWlsIGlzIGludmFsaWQ8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICFhZGRyZXNzLnJlY2VpdmVyTmFtZSB8fCBcclxuICAgICAgICAgICAgIWFkZHJlc3MucmVjZWl2ZXJQaG9uZSB8fFxyXG4gICAgICAgICAgICBhZGRyZXNzLnJlY2VpdmVyUGhvbmU/Lmxlbmd0aCAhPSAxMCB8fFxyXG4gICAgICAgICAgICAhaXNFbWFpbFZhbGlkIHx8IFxyXG4gICAgICAgICAgICAhYWRkcmVzcy5hZGRyZXNzTGluZTEgfHwgXHJcbiAgICAgICAgICAgICFhZGRyZXNzLmxvY2FsaXR5TmFtZSB8fCBcclxuICAgICAgICAgICAgIWFkZHJlc3MuemlwQ29kZSB8fCBcclxuICAgICAgICAgICAgIWFkZHJlc3MuY2l0eU5hbWUgfHxcclxuICAgICAgICAgICAgIWFkZHJlc3Muc3RhdGVOYW1lIHx8IFxyXG4gICAgICAgICAgICAhYWRkcmVzcy5hZGRyZXNzVHlwZSB8fCBpc0xvYWRpbmdcclxuICAgICAgICAgICAgXCIgKGNsaWNrKT1cInVwZGF0ZUFkZHJlc3MoKVwiPnt7aXNMb2FkaW5nID8gJ0xvYWRpbmcnIDogJ1VwZGF0ZSd9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcblxyXG48ZGl2IFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZWRpdH1cIiAqbmdJZj1cInNob3dFZGl0b3JzXCI+XHJcbiAgICA8c2ltcG8taG92ZXItZWxlbWVudHMgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiIFtlZGl0T3B0aW9uc109XCJlZGl0XCI+PC9zaW1wby1ob3Zlci1lbGVtZW50cz5cclxuPC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJzaG93RGVsZXRlXCIgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBkZWxldGV9XCI+XHJcbiAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XHJcbjwvZGl2PiJdfQ==