simpo-component-library 1.5.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +3 -3
  3. package/esm2022/lib/components/hover-elements/hover-elements.component.mjs +7 -5
  4. package/esm2022/lib/constants/business.constant.mjs +14 -0
  5. package/esm2022/lib/directive/background-directive.mjs +1 -1
  6. package/esm2022/lib/directive/blur-content.directive.mjs +1 -1
  7. package/esm2022/lib/directive/border-directive.mjs +23 -11
  8. package/esm2022/lib/directive/borderlessImage.directive.mjs +1 -1
  9. package/esm2022/lib/directive/button-directive.directive.mjs +1 -1
  10. package/esm2022/lib/directive/color.directive.mjs +1 -1
  11. package/esm2022/lib/directive/column-directive.directive.mjs +1 -1
  12. package/esm2022/lib/directive/container-alignment.directive.mjs +1 -1
  13. package/esm2022/lib/directive/container-fir.directive.mjs +1 -1
  14. package/esm2022/lib/directive/content-title-spacing.directive.mjs +1 -1
  15. package/esm2022/lib/directive/corner-directive.mjs +1 -1
  16. package/esm2022/lib/directive/hoverborder.directive.mjs +1 -1
  17. package/esm2022/lib/directive/image-container.directive.mjs +1 -1
  18. package/esm2022/lib/directive/image-directive.directive.mjs +1 -1
  19. package/esm2022/lib/directive/image-position.directive.mjs +1 -1
  20. package/esm2022/lib/directive/position-layout-directive.directive.mjs +1 -1
  21. package/esm2022/lib/directive/spacing-horizontal.directive.mjs +48 -0
  22. package/esm2022/lib/directive/sticky-directive.mjs +1 -1
  23. package/esm2022/lib/directive/text-background-directive.directive.mjs +1 -1
  24. package/esm2022/lib/directive/text-size.directive.mjs +1 -1
  25. package/esm2022/lib/directive/wrap-containers.directive.mjs +31 -0
  26. package/esm2022/lib/ecommerce/sections/address/address.component.mjs +134 -28
  27. package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +104 -39
  28. package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +296 -61
  29. package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
  30. package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +13 -3
  31. package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
  32. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +13 -4
  33. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
  34. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +212 -42
  35. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +11 -2
  36. package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +11 -0
  37. package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +77 -10
  38. package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +13 -7
  39. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +272 -39
  40. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
  41. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +252 -33
  42. package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
  43. package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +44 -17
  44. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.component.mjs +300 -28
  45. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
  46. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +124 -0
  47. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +2 -0
  48. package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +183 -17
  49. package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
  50. package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
  51. package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +11 -3
  52. package/esm2022/lib/ecommerce/styles/cart.modal.mjs +2 -1
  53. package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
  54. package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
  55. package/esm2022/lib/ecommerce/styles/product.modal.mjs +10 -1
  56. package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
  57. package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
  58. package/esm2022/lib/elements/button/button.component.mjs +3 -3
  59. package/esm2022/lib/elements/button/button.model.mjs +1 -1
  60. package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
  61. package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
  62. package/esm2022/lib/elements/index.mjs +1 -1
  63. package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +3 -3
  64. package/esm2022/lib/elements/text/text.component.mjs +3 -3
  65. package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
  66. package/esm2022/lib/pipes/amount.pipe.mjs +35 -0
  67. package/esm2022/lib/pipes/gender.pipe.mjs +36 -0
  68. package/esm2022/lib/sections/BaseSection.mjs +1 -1
  69. package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
  70. package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
  71. package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
  72. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +9 -4
  73. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.model.mjs +1 -1
  74. package/esm2022/lib/sections/banner-section/banner-section.component.mjs +3 -3
  75. package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
  76. package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
  77. package/esm2022/lib/sections/carousel-banner/carousel-banner.component.mjs +12 -12
  78. package/esm2022/lib/sections/carousel-banner/carousel-banner.model.mjs +1 -1
  79. package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +3 -3
  80. package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
  81. package/esm2022/lib/sections/contact-us/contact-us.component.mjs +7 -5
  82. package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
  83. package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
  84. package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
  85. package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
  86. package/esm2022/lib/sections/footer-section/footer-section.component.mjs +3 -3
  87. package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
  88. package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
  89. package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
  90. package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
  91. package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
  92. package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
  93. package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
  94. package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
  95. package/esm2022/lib/sections/location-section/location-section.component.mjs +3 -3
  96. package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
  97. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
  98. package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
  99. package/esm2022/lib/sections/navbar-section/navbar-section.component.mjs +42 -18
  100. package/esm2022/lib/sections/navbar-section/navbar-section.model.mjs +1 -1
  101. package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
  102. package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
  103. package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
  104. package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
  105. package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
  106. package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
  107. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +3 -3
  108. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
  109. package/esm2022/lib/sections/service-section/service-section.component.mjs +3 -3
  110. package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
  111. package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
  112. package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +3 -3
  113. package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
  114. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
  115. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
  116. package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
  117. package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
  118. package/esm2022/lib/sections/text-image-section/text-image-section.component.mjs +3 -3
  119. package/esm2022/lib/sections/text-section/text-section.component.mjs +2 -2
  120. package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
  121. package/esm2022/lib/sections/video-section/video-section.component.mjs +11 -3
  122. package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
  123. package/esm2022/lib/sections/view-blog/view-blog.component.mjs +3 -3
  124. package/esm2022/lib/services/cart.service.mjs +54 -120
  125. package/esm2022/lib/services/endUser.service.mjs +28 -0
  126. package/esm2022/lib/services/events.service.mjs +4 -1
  127. package/esm2022/lib/services/rest.service.mjs +58 -16
  128. package/esm2022/lib/services/storage.service.mjs +103 -35
  129. package/esm2022/lib/styles/index.mjs +8 -1
  130. package/esm2022/lib/styles/style.model.mjs +1 -1
  131. package/esm2022/lib/styles/types.mjs +1 -1
  132. package/esm2022/public-api.mjs +4 -1
  133. package/fesm2022/simpo-component-library.mjs +2535 -729
  134. package/fesm2022/simpo-component-library.mjs.map +1 -1
  135. package/lib/components/hover-elements/hover-elements.component.d.ts +2 -1
  136. package/lib/constants/business.constant.d.ts +11 -0
  137. package/lib/directive/spacing-horizontal.directive.d.ts +18 -0
  138. package/lib/directive/wrap-containers.directive.d.ts +14 -0
  139. package/lib/ecommerce/sections/address/address.component.d.ts +30 -9
  140. package/lib/ecommerce/sections/authenticate-user/authenticate-user.component.d.ts +31 -6
  141. package/lib/ecommerce/sections/cart/cart.component.d.ts +26 -11
  142. package/lib/ecommerce/sections/cart/cart.modal.d.ts +10 -1
  143. package/lib/ecommerce/sections/checkout/checkout.component.d.ts +2 -0
  144. package/lib/ecommerce/sections/featured-category/featured-category.component.d.ts +2 -0
  145. package/lib/ecommerce/sections/featured-products/featured-products.component.d.ts +27 -9
  146. package/lib/ecommerce/sections/featured-products/featured-products.modal.d.ts +5 -1
  147. package/lib/ecommerce/sections/item-varient/item-varient.component.d.ts +5 -0
  148. package/lib/ecommerce/sections/order-details/order-details.component.d.ts +16 -2
  149. package/lib/ecommerce/sections/pagnination/pagnination.component.d.ts +3 -2
  150. package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +33 -4
  151. package/lib/ecommerce/sections/product-desc/product-desc.modal.d.ts +4 -1
  152. package/lib/ecommerce/sections/product-list/product-list.component.d.ts +39 -3
  153. package/lib/ecommerce/sections/product-list/product-list.modal.d.ts +2 -0
  154. package/lib/ecommerce/sections/user-basic-info/user-basic-info.component.d.ts +11 -1
  155. package/lib/ecommerce/sections/user-profile/user-profile.component.d.ts +52 -13
  156. package/lib/ecommerce/sections/user-profile/user-profile.modal.d.ts +6 -8
  157. package/lib/ecommerce/sections/verify-payment/verify-payment.component.d.ts +34 -0
  158. package/lib/ecommerce/sections/verify-payment/verify-payment.model.d.ts +23 -0
  159. package/lib/ecommerce/sections/whislist/whislist.component.d.ts +22 -6
  160. package/lib/ecommerce/styles/OrderedItems.modal.d.ts +6 -2
  161. package/lib/ecommerce/styles/cart.modal.d.ts +1 -0
  162. package/lib/ecommerce/styles/product.modal.d.ts +4 -0
  163. package/lib/ecommerce/styles/user.modal.d.ts +3 -3
  164. package/lib/pipes/amount.pipe.d.ts +7 -0
  165. package/lib/pipes/gender.pipe.d.ts +8 -0
  166. package/lib/sections/banner-grid-section/banner-grid-section.component.d.ts +1 -0
  167. package/lib/sections/banner-grid-section/banner-grid-section.model.d.ts +1 -0
  168. package/lib/sections/carousel-banner/carousel-banner.component.d.ts +7 -5
  169. package/lib/sections/carousel-banner/carousel-banner.model.d.ts +41 -26
  170. package/lib/sections/navbar-section/navbar-section.component.d.ts +6 -1
  171. package/lib/sections/navbar-section/navbar-section.model.d.ts +1 -1
  172. package/lib/sections/video-section/video-section.component.d.ts +4 -2
  173. package/lib/services/cart.service.d.ts +13 -8
  174. package/lib/services/endUser.service.d.ts +13 -0
  175. package/lib/services/events.service.d.ts +5 -2
  176. package/lib/services/rest.service.d.ts +16 -2
  177. package/lib/services/storage.service.d.ts +11 -44
  178. package/lib/styles/index.d.ts +6 -0
  179. package/lib/styles/style.model.d.ts +4 -1
  180. package/lib/styles/types.d.ts +2 -0
  181. package/package.json +1 -1
  182. package/public-api.d.ts +3 -0
  183. package/esm2022/lib/ecommerce/json/user-cart.json +0 -40
  184. package/esm2022/lib/ecommerce/json/user-details.json +0 -15
  185. package/esm2022/lib/ecommerce/json/user-favourite.json +0 -32
  186. package/simpo-component-library-1.5.0.tgz +0 -0
@@ -11,47 +11,75 @@ import { MatIcon } from '@angular/material/icon';
11
11
  import { MatSliderModule } from '@angular/material/slider';
12
12
  import { MatSelectModule } from '@angular/material/select';
13
13
  import { PagninationComponent } from '../pagnination/pagnination.component';
14
+ import { OrderedItems } from '../../styles/OrderedItems.modal';
15
+ import { MatBottomSheetModule } from '@angular/material/bottom-sheet';
16
+ import { MatRadioModule } from '@angular/material/radio';
17
+ import { BUSINESS_CONSTANTS } from '../../../constants/business.constant';
18
+ import { FormateAmount } from '../../../pipes/amount.pipe';
19
+ import { ToastModule } from 'primeng/toast';
20
+ import { MessageService } from 'primeng/api';
21
+ import { BackgroundDirective } from '../../../directive/background-directive';
22
+ import { CdkDrag } from '@angular/cdk/drag-drop';
14
23
  import * as i0 from "@angular/core";
15
24
  import * as i1 from ".././../../services/events.service";
16
25
  import * as i2 from ".././../../services/rest.service";
17
26
  import * as i3 from "@angular/router";
18
- import * as i4 from "@angular/common";
19
- import * as i5 from "@angular/forms";
20
- import * as i6 from "../../../components/hover-elements/hover-elements.component";
21
- import * as i7 from "../../../components/delete-hover-element/delete-hover-element.component";
22
- import * as i8 from "ngx-skeleton-loader";
23
- import * as i9 from "@angular/material/slider";
27
+ import * as i4 from "../../../services/storage.service";
28
+ import * as i5 from "@angular/material/bottom-sheet";
29
+ import * as i6 from "@angular/material/dialog";
30
+ import * as i7 from "../../../services/cart.service";
31
+ import * as i8 from "primeng/api";
32
+ import * as i9 from "@angular/common";
33
+ import * as i10 from "@angular/forms";
34
+ import * as i11 from "../../../components/hover-elements/hover-elements.component";
35
+ import * as i12 from "../../../components/delete-hover-element/delete-hover-element.component";
36
+ import * as i13 from "ngx-skeleton-loader";
37
+ import * as i14 from "@angular/material/slider";
38
+ import * as i15 from "@angular/material/radio";
39
+ import * as i16 from "primeng/toast";
24
40
  export class ProductListComponent extends BaseSection {
25
- constructor(platformId, _eventService, restService, router, activatedRoute) {
41
+ constructor(platformId, _eventService, restService, router, activatedRoute, storageService, matBottomSheet, matDialog, cartService, messageService) {
26
42
  super();
27
43
  this.platformId = platformId;
28
44
  this._eventService = _eventService;
29
45
  this.restService = restService;
30
46
  this.router = router;
31
47
  this.activatedRoute = activatedRoute;
48
+ this.storageService = storageService;
49
+ this.matBottomSheet = matBottomSheet;
50
+ this.matDialog = matDialog;
51
+ this.cartService = cartService;
52
+ this.messageService = messageService;
32
53
  this.isLoading = false;
54
+ this.totalPages = 0;
55
+ this.filterBottomSheetRef = null;
56
+ // private sortingDialogRef: MatDialogRef<unknown> | null = null;
57
+ this.sortingDialogRef = null;
33
58
  this.pricingMin = 0;
34
- this.pricingMax = 100;
59
+ this.pricingMax = 0;
35
60
  this.sortBy = null;
61
+ this.searchText = "";
62
+ this.USER_CART = null;
63
+ this.USER_WISHLIST = null;
64
+ this.minProductPrice = 0;
65
+ this.maxProductPrice = 0;
36
66
  // will come from backend as shop and resturant can have diffrent filters
37
67
  this.filteringArray = [
38
68
  { name: "Lowest First", value: "lowestPrice" },
39
69
  { name: "Highest First", value: "highestPrice" }
40
70
  ];
41
71
  this.screenWidth = 0;
42
- this.filterList = [];
72
+ this.filterList = ["Women", "Men"];
43
73
  this.totalCount = 0;
44
74
  this.pageNo = 0;
45
- this.size = 5;
75
+ this.size = 20;
46
76
  this.searchTxt = "";
77
+ this.filterLoading = false;
47
78
  this.categories = [];
48
79
  this.collections = [];
49
80
  if (isPlatformBrowser(this.platformId)) {
50
81
  this.getScreenSize();
51
82
  }
52
- this._eventService.showLoadingScreen.subscribe((response) => {
53
- this.isLoading = response;
54
- });
55
83
  }
56
84
  getScreenSize() {
57
85
  this.screenWidth = window.innerWidth;
@@ -60,13 +88,19 @@ export class ProductListComponent extends BaseSection {
60
88
  this.content = this.data?.content;
61
89
  this.styles = this.data?.styles;
62
90
  this.button = this.data?.action.buttons[0];
91
+ this._eventService.showLoadingScreen.subscribe((response) => {
92
+ this.isLoading = response;
93
+ });
63
94
  this.getAllCategories();
64
95
  this.getAllCollections();
96
+ this.minProductPrice = this.pricingMin = this.data?.styles.minPrice ?? 0;
97
+ this.maxProductPrice = this.pricingMax = this.data?.styles.maxPrice ?? 1000;
65
98
  this.activatedRoute.queryParams.subscribe((qParam) => {
66
99
  this.searchTxt = qParam["searchTxt"];
67
- this.sortBy = qParam["sorting"];
68
- this.pricingMin = isNaN(Number(qParam["minPrice"])) ? 0 : Number(qParam["minPrice"]);
69
- this.pricingMax = isNaN(Number(qParam["maxPrice"])) ? 1000 : Number(qParam["maxPrice"]);
100
+ this.pageNo = qParam["pageNo"] ? Number(qParam["pageNo"]) : 1;
101
+ this.sortBy = qParam["sorting"] ?? "lowestPrice";
102
+ this.pricingMin = isNaN(Number(qParam["minPrice"])) ? this.minProductPrice : Number(qParam["minPrice"]);
103
+ this.pricingMax = isNaN(Number(qParam["maxPrice"])) ? this.maxProductPrice : Number(qParam["maxPrice"]);
70
104
  this.filterByCategoryCollectionParam(qParam["category"], qParam["collections"]);
71
105
  });
72
106
  }
@@ -85,7 +119,7 @@ export class ProductListComponent extends BaseSection {
85
119
  }
86
120
  getAllCategories() {
87
121
  this.restService.getAllCategories().subscribe((response) => {
88
- this.categories = response.filter((category) => category.featuredCollection || true).map((category) => { return { option: category.categoryName, id: category.categoryId, status: false }; });
122
+ this.categories = response.filter((category) => category.featuredCollection || true).map((category) => { return { option: category.categoryName, id: category.categoryId, imgUrl: category.imgUrl?.[0], status: false }; });
89
123
  const qParamCollections = this.activatedRoute.snapshot.queryParams["collections"];
90
124
  const qParamCategory = this.activatedRoute.snapshot.queryParams["category"];
91
125
  this.filterByCategoryCollectionParam(qParamCategory, qParamCollections);
@@ -104,8 +138,9 @@ export class ProductListComponent extends BaseSection {
104
138
  const filterListIds = this.filterList.map((filter) => filter.id);
105
139
  this.categories.forEach((category) => category.status = filterListIds.includes(category.id));
106
140
  this.collections.forEach((collection) => collection.status = filterListIds.includes(collection.id));
141
+ this.pageNo = 1;
107
142
  // sorting should add
108
- this.navigateFilter("");
143
+ this.navigateFilter(this.sortBy ?? "lowestPrice");
109
144
  }
110
145
  getProductWidth() {
111
146
  return this.screenWidth > 475 ? (this.screenWidth < 1025 ? '25%' : 'calc(' + ((100 / (this.styles?.elementInRow || 4))) + '%)') : (this.styles?.mobileColumn === 1 ? '100%' : '50%');
@@ -117,16 +152,108 @@ export class ProductListComponent extends BaseSection {
117
152
  clearFilter() {
118
153
  this.categories.forEach((category) => category.status = false);
119
154
  this.collections.forEach((collection) => collection.status = false);
120
- this.pricingMin = 0;
121
- this.pricingMax = 100;
155
+ this.pricingMin = this.minProductPrice;
156
+ this.pricingMax = this.maxProductPrice;
122
157
  this.router.navigate(['list']);
123
158
  }
159
+ toggleItemToFav(event, product, type) {
160
+ if (type == 'ADD') {
161
+ product.whislist = true;
162
+ this.messageService.add({ severity: 'success', summary: 'Wishlist', detail: 'Item added to your wishlist' });
163
+ if (product?.itemVariant?.length) {
164
+ const itemVarient = this.getItemVarient(product, product.varientId);
165
+ if (itemVarient) {
166
+ itemVarient.wishlist = true;
167
+ this.cartService.addItemToFavourite(product, itemVarient.variantId);
168
+ }
169
+ }
170
+ else {
171
+ this.cartService.addItemToFavourite(product);
172
+ }
173
+ }
174
+ else {
175
+ product.whislist = false;
176
+ this.messageService.add({ severity: 'info', summary: 'Wishlist', detail: 'Item removed from your wishlist' });
177
+ this.cartService.removeItemFromFavourite(product.varientId);
178
+ }
179
+ if (product.whislist) {
180
+ this.USER_WISHLIST?.push(new OrderedItems(product, product.varientId));
181
+ }
182
+ else {
183
+ this.USER_WISHLIST = this.USER_WISHLIST?.filter((item) => item.varientId != product.varientId) ?? [];
184
+ }
185
+ event.stopPropagation();
186
+ }
187
+ addItemToCart(event, product, type) {
188
+ if (this.isItemOutOfStock(product)) {
189
+ this.messageService.add({ severity: 'warn', summary: 'Cart', detail: 'Item is not available as of now. We will notify you once available' });
190
+ return;
191
+ }
192
+ product.quantity += (type == 'ADD' ? 1 : -1);
193
+ if (product?.itemVariant?.length) {
194
+ const itemVarient = this.getItemVarient(product, product.varientId);
195
+ if (itemVarient) {
196
+ itemVarient.quantity = product.quantity;
197
+ this.cartService.addItemToCart(product, itemVarient.variantId);
198
+ }
199
+ }
200
+ else {
201
+ this.cartService.addItemToCart(product);
202
+ }
203
+ if (product.quantity) {
204
+ let isPresent = false;
205
+ this.USER_CART?.forEach((item) => {
206
+ if (item.varientId == product.varientId) {
207
+ item.quantity = product.quantity;
208
+ isPresent = true;
209
+ }
210
+ });
211
+ if (!isPresent)
212
+ this.USER_CART?.push(new OrderedItems(product, product.varientId));
213
+ }
214
+ else {
215
+ this.USER_CART = this.USER_CART?.filter((item) => item.varientId != product.varientId) ?? [];
216
+ }
217
+ }
218
+ searchProduct() {
219
+ this.navigateFilter(this.sortBy ?? "lowestPrice");
220
+ }
221
+ selectVarient(product, varient) {
222
+ // nedd to change
223
+ product.varientId = varient.variantId;
224
+ product.itemImages = varient.variantImages;
225
+ product.price = varient.itemVariantPrice;
226
+ product.itemInventory = varient.itemInventory;
227
+ product.quantity = this.getVarientQuantity(varient);
228
+ product.whislist = this.isVarientPresentInWishtlist(varient);
229
+ }
230
+ getVarientQuantity(productVarient) {
231
+ let itemQuantity = 0;
232
+ this.USER_CART?.forEach((item) => {
233
+ if (productVarient.variantId == item.varientId)
234
+ itemQuantity = item.quantity;
235
+ });
236
+ return itemQuantity;
237
+ }
238
+ isVarientPresentInWishtlist(productVarient) {
239
+ let present = false;
240
+ this.USER_WISHLIST?.forEach((item) => {
241
+ if (productVarient.variantId == item.varientId)
242
+ present = true;
243
+ });
244
+ return present;
245
+ }
246
+ goToHome() {
247
+ this.router.navigate(['/']);
248
+ }
124
249
  applyFilter(category, type) {
125
250
  let sorting = "";
251
+ this.pageNo = 1;
126
252
  if (type == "FILTER")
127
253
  category.status = !category.status;
128
254
  else if (type == "SORT")
129
255
  sorting = category?.target?.value;
256
+ this.filterBottomSheetRef?.dismiss();
130
257
  this.navigateFilter(sorting);
131
258
  }
132
259
  navigateFilter(sorting) {
@@ -144,23 +271,109 @@ export class ProductListComponent extends BaseSection {
144
271
  slug: collection.option.replaceAll(" ", "_")
145
272
  };
146
273
  }).forEach((collection) => selectedCollection += (collection.slug + "+"));
147
- this.router.navigate(['list'], { queryParams: { minPrice: this.pricingMin, maxPrice: this.pricingMax, category: selectedCategory, collections: selectedCollection, sorting: sorting } });
274
+ this.sortingDialogRef?.dismiss();
275
+ this.router.navigate(['list'], { queryParams: { minPrice: this.pricingMin, maxPrice: this.pricingMax, category: selectedCategory, collections: selectedCollection, sorting: sorting, pageNo: this.pageNo, searchTxt: this.searchText } });
148
276
  }
149
277
  filterItemList() {
150
278
  const collectionIds = this.collections.filter((collection) => collection.status).map((collection) => collection.id);
151
279
  const categoryIds = this.categories.filter((category) => category.status).map((category) => category.id);
152
- this.restService.getFilteredProduct(collectionIds, categoryIds, this.searchTxt, this.pricingMin, this.pricingMax, this.sortBy ?? "", this.pageNo, this.size).subscribe((response) => {
153
- this.responseData = response.data.data;
154
- this.totalCount = response.data.count;
280
+ this.filterLoading = true;
281
+ this.restService.getFilteredProduct(collectionIds, categoryIds, this.searchTxt, this.pricingMin, this.pricingMax, this.sortBy ?? "lowestPrice", this.pageNo - 1, this.size).subscribe((response) => {
282
+ this.responseData = response.data;
283
+ this.totalCount = response.count;
284
+ this.totalPages = Math.ceil(response.count / this.size);
285
+ this.storageService.getUserCart().then((cartResponse) => {
286
+ cartResponse.onsuccess = (cartData) => {
287
+ this.USER_CART = cartData.target.result;
288
+ this.responseData?.forEach((product) => {
289
+ this.USER_CART?.forEach((item) => {
290
+ if (item.itemId == product.itemId) {
291
+ if (product?.itemVariant?.length > 0) {
292
+ const itemVarient = product?.itemVariant?.[0];
293
+ if (itemVarient.variantId == item.varientId) {
294
+ product.itemImages = itemVarient.variantImages ?? [];
295
+ product.price = itemVarient.itemVariantPrice;
296
+ product.quantity = item.quantity;
297
+ }
298
+ }
299
+ else {
300
+ product.quantity = item.quantity;
301
+ }
302
+ }
303
+ });
304
+ });
305
+ };
306
+ });
307
+ this.storageService.getUserWhishlist().then((wishlistResponse) => {
308
+ wishlistResponse.onsuccess = (whislistData) => {
309
+ this.USER_WISHLIST = whislistData.target.result;
310
+ this.responseData?.forEach((product) => {
311
+ this.USER_WISHLIST?.forEach((item) => {
312
+ if (item.itemId == product.itemId) {
313
+ if (product?.itemVariant?.length > 0) {
314
+ const itemVarient = product?.itemVariant?.[0];
315
+ if (itemVarient.variantId == item.varientId) {
316
+ product.itemImages = itemVarient?.variantImages ?? [];
317
+ product.price = itemVarient.itemVariantPrice;
318
+ product.whislist = true;
319
+ }
320
+ }
321
+ else {
322
+ product.whislist = true;
323
+ }
324
+ }
325
+ });
326
+ });
327
+ };
328
+ });
329
+ this.filterLoading = false;
155
330
  });
156
331
  }
157
- get getTotalPage() {
158
- return Math.ceil(this.totalCount / this.size);
332
+ openFilter(FilterSection) {
333
+ this.filterBottomSheetRef = this.matBottomSheet.open(FilterSection);
334
+ }
335
+ openSorting(SortingSection) {
336
+ this.sortingDialogRef = this.matBottomSheet.open(SortingSection, {});
337
+ }
338
+ paginationChange(page) {
339
+ this.pageNo = page;
340
+ this.navigateFilter(this.sortBy ?? "lowestPrice");
341
+ document.body.scrollTop = 0;
342
+ document.documentElement.scrollTop = 0;
343
+ }
344
+ closeDialog() {
345
+ this.sortingDialogRef?.dismiss();
346
+ }
347
+ isItemOutOfStock(product) {
348
+ return product.itemInventory?.openingStock == 0;
349
+ }
350
+ getItemVarient(product, varientId) {
351
+ let selectedVarient = null;
352
+ product?.itemVariant?.forEach((varient) => {
353
+ if (varient.variantId == varientId)
354
+ selectedVarient = varient;
355
+ });
356
+ return selectedVarient;
357
+ }
358
+ editSection() {
359
+ this._eventService.toggleEditorEvent.emit(false);
360
+ setTimeout(() => {
361
+ this._eventService.editSection.emit({ data: this.data });
362
+ }, 100);
363
+ }
364
+ get isMobile() {
365
+ return window.innerWidth < 475;
366
+ }
367
+ get currency() {
368
+ return BUSINESS_CONSTANTS.CURRENCY;
369
+ }
370
+ get minSize() {
371
+ return Math.min(this.totalCount, (((this.pageNo - 1) * this.size + 1) + this.size));
159
372
  }
160
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductListComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.RestService }, { token: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
161
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: ProductListComponent, isStandalone: true, selector: "simpo-product-list", inputs: { responseData: "responseData", data: "data", index: "index", edit: "edit", delete: "delete" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\r\n <section class=\"container-fluid total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" simpoHover\r\n (hovering)=\"showEditTabs($event)\">\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\" style=\"width: 20%;\">\r\n <div class=\"filter body-large\">\r\n Filters\r\n </div>\r\n <div class=\"clear\" (click)=\"clearFilter()\">\r\n Clear all\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-content-between\" style=\"width: 80%;\">\r\n <div style=\"color: #6c757d82;\" class=\"fs-6 fw-normal\">Showing {{pageNo*size +1}}-{{size}} of {{ totalCount }} Results</div>\r\n <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\r\n <div class=\"fs-6 fw-normal mr-3\" style=\"color: #6c757d82;\">Sort by</div>\r\n <select (change)=\"applyFilter($event, 'SORT')\">\r\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{filter.name}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"filter-side\">\r\n\r\n <div class=\"d-flex flex-column m-auto\" style=\"width: 95%;\">\r\n <ng-container *ngFor=\"let filter of filterList\">\r\n <div class=\"d-flex justify-content-between w-100 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer;\" (click)=\"removeFilter(filter)\">X</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"categories-section\" *ngIf=\"categories?.length\">\r\n <div class=\"categories heading-small\">\r\n Shop by categories\r\n </div>\r\n <div class=\"category-options\" *ngFor=\"let category of categories\" (click)=\"applyFilter(category, 'FILTER')\">\r\n <input type=\"checkbox\" name=\"\" id=\"\" [checked]=\"category.status\" />\r\n <div>{{category.option | uppercase}}</div>\r\n </div>\r\n </div>\r\n <div class=\"categories-section\" *ngIf=\"collections?.length\">\r\n <div class=\"categories heading-small\">\r\n Shop by collections\r\n </div>\r\n <div class=\"category-options\" *ngFor=\"let collection of collections\" (click)=\"applyFilter(collection, 'FILTER')\">\r\n <input type=\"checkbox\" name=\"\" id=\"\" [checked]=\"collection.status\" />\r\n <div>{{collection.option | uppercase}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"price-section\">\r\n <div class=\"categories heading-small\">\r\n Shop by price\r\n </div>\r\n <div>\r\n <mat-slider min=\"0\" max=\"1000\" style=\"width: 250px;\">\r\n <input matSliderStartThumb [(ngModel)]=\"pricingMin\">\r\n <input matSliderEndThumb [(ngModel)]=\"pricingMax\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"price-button-section\">\r\n <div class=\"button-section\">\r\n <button (click)=\"applyFilter()\">Filter</button>\r\n </div>\r\n <div class=\"price-range\">\r\n Price: ${{ pricingMin }} - ${{ pricingMax }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\">\r\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\r\n <div *ngFor=\"let product of responseData\" class=\"product\" [style.width]=\"getProductWidth()\" (click)=\"proceedToProductDesc(product.itemId)\" style=\"cursor: pointer;\">\r\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\" class=\"default-image\">\r\n <img src=\"https://www.svgrepo.com/show/149861/t-shirt-black-silhouette.svg\" alt=\"\">\r\n </div>\r\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\">\r\n <img [src]=\"product.itemImages?.[0]?.imgUrl\" alt=\"\" class=\"product-img\">\r\n </div>\r\n <div class=\"mt-2\">\r\n <div class=\"product-name heading-large text-left\">\r\n {{product.name}}</div>\r\n <div class=\"price body-large text-left\">\r\n ${{product.price.sellingPrice}}\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div *ngIf=\"content?.display?.showButton\" class=\"add-to-cart-btn\">\r\n <button simpoButtonDirective [id]=\"data?.id+(button?.id || '')\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"styles?.background?.accentColor\">{{content?.button}}</button>\r\n </div> -->\r\n <simpo-pagnination style=\"width: 100%;\" class=\"mt-15\" [totalPages]=\"getTotalPage\" [currentPage]=\"pageNo +1\" ></simpo-pagnination>\r\n </div>\r\n \r\n <section class=\"empty-cart\" *ngIf=\"responseData?.length == 0\">\r\n <div>\r\n <div class=\"cart-image\">\r\n <img style=\"height: 150px; width: 150px;\" src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\" alt=\"\">\r\n </div>\r\n <div class=\"cart-text\">\r\n <div class=\"heading-medium d-flex justify-content-center\">\r\n Product list is empty\r\n </div>\r\n <div class=\"description d-flex justify-content-center mt-4\">\r\n Looks like no item is present with filter. Go ahead & explore top categories.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\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>\r\n </section>\r\n</ng-container>\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>", styles: [".product-parent{display:flex;flex-wrap:wrap;margin-top:15px}.product{padding:10px;cursor:pointer}.product-img{height:310px;width:100%}.price{color:#222;font-size:16px;font-weight:600;line-height:normal;text-align:left}.product-name{color:#222;font-size:16px;line-height:26px;margin-bottom:5px;text-align:left}.add-product-button{width:20%}.mt-15{margin-top:15px}.default-image{background-color:#f2f3f5;text-align:center}.default-image img{width:70%;height:310px}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.add-to-cart-btn{margin-top:15px}.add-to-cart-btn button{height:35px;font-size:16px!important}.filter-side{width:20%}.filter-top-section{padding:0 2rem}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.categories{display:flex;padding:1rem 2rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 2rem;gap:11px}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem}.button-section button{position:relative;background:#0267c1;color:#fff;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px}.chip{background:#0267c1;padding:8px 15px;border-radius:3px;margin:3px 0;color:#fff;transition:.3s opacity ease}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;justify-content:space-between}.price-range{padding-right:22px;color:#93959e;font-size:15px}.right-side{width:80%}@media screen and (max-width: 475px){.product-img{height:250px}.default-image img{height:250px}.filter-side{display:none}.right-side{width:100%}}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i6.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged"], outputs: ["edit"] }, { kind: "component", type: i7.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i8.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i9.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i9.MatSliderRangeThumb, selector: "input[matSliderStartThumb], input[matSliderEndThumb]", exportAs: ["matSliderRangeThumb"] }, { kind: "component", type: PagninationComponent, selector: "simpo-pagnination", inputs: ["totalPages", "currentPage"] }, { kind: "directive", type:
373
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductListComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.RestService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.StorageServiceService }, { token: i5.MatBottomSheet }, { token: i6.MatDialog }, { token: i7.CartService }, { token: i8.MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
374
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: ProductListComponent, isStandalone: true, selector: "simpo-product-list", inputs: { responseData: "responseData", data: "data", index: "index", edit: "edit", delete: "delete" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], usesInheritance: true, ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"></p-toast>\n\n<div class=\"input-group\" *ngIf=\"isMobile\">\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\" [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\n</div>\n\n<ng-container *ngIf=\"!isLoading\">\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" (click)=\"editSection()\" simpoHover\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\" [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\">\n\n <!-- <div *ngIf=\"isMobile\" class=\"back-to-home\" cdkDrag (click)=\"goToHome()\">\n <mat-icon>home</mat-icon>\n </div> -->\n\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\" style=\"width: 20%;\">\n <div class=\"filter body-large\" [style.color]=\"styles?.background?.accentColor\">\n Filters\n </div>\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\n Clear all\n </div>\n </div>\n <div class=\"d-flex align-items-center justify-content-between\" style=\"width: 80%;margin-left: 10px;\">\n <div class=\"fs-6 fw-normal\" [style.color]=\"styles?.background?.accentColor\">Showing {{(pageNo -1)*size +1}}-{{minSize}} of {{ totalCount }} Results</div>\n <div class=\"d-flex align-items-center\" style=\"gap: 10px;\" [style.color]=\"styles?.background?.accentColor\">\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\n <select (change)=\"applyFilter($event, 'SORT')\">\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{filter.name}}</option>\n </select>\n </div>\n </div>\n </div>\n <div class=\"d-flex w-100 onlyMobile\" style=\"gap: 5px; overflow-x: auto;\" [style.color]=\"styles?.background?.accentColor\">\n <ng-container *ngFor=\"let filter of filterList\">\n <div class=\"d-flex justify-content-between w-100 chip\" [style.color]=\"styles?.background?.accentColor\">\n <span>{{filter.name}}</span>\n <span style=\"cursor: pointer; margin-left: 5px;\" (click)=\"removeFilter(filter)\">X</span>\n </div>\n </ng-container>\n </div>\n <div class=\"d-flex justify-content-between\">\n <div class=\"filter-side onlyDesktop\">\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\n </div>\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\">\n <ng-container *ngIf=\"!filterLoading\">\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\n <div *ngFor=\"let product of responseData\" class=\"product\" [style.width]=\"getProductWidth()\" style=\"cursor: pointer;\">\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\" class=\"default-image position-relative\" (click)=\"proceedToProductDesc(product.itemId)\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\">\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\n </div>\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\" class=\"default-image position-relative\" (click)=\"proceedToProductDesc(product.itemId)\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"product?.itemImages?.[0]?.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\" class=\"product-img\">\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\n </div>\n <div class=\"mt-2 w-100\">\n <div class=\"product-name heading-large w-100 text-left trim-text\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"varient.variantImages?.[0]?.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\" class=\"varient\" [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\" [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\" (click)=\"selectVarient(product, varient)\">\n </ng-container>\n </div>\n <div class=\"d-flex align-item-center justify-content-between\">\n <div class=\"price body-large text-left d-flex align-items-center\">\n <div class=\"discounted-price\"[style.color]=\"styles?.background?.accentColor\">\n <span [innerHTML]='currency'></span>\n {{product.price.discountedPrice}}\n </div>\n </div>\n <div *ngIf=\"content?.display?.showButton\" class=\"add-to-cart-btn\">\n <button simpoButtonDirective [id]=\"data?.id+(button?.id || '')\" [buttonStyle]=\"button?.styles\"\n [color]=\"styles?.background?.accentColor\" *ngIf=\"!product.quantity && !isItemOutOfStock(product)\" (click)=\"addItemToCart($event, product, 'ADD')\">{{button?.content?.label ?? 'Add to Cart'}}</button>\n <div class=\"quantity\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\" [style.borderColor]=\"styles?.background?.accentColor\" [style.color]=\"styles?.background?.accentColor\">\n <span (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\n <span>{{product.quantity}}</span>\n <span (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\n </div>\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\n </div>\n </div>\n </div>\n </div>\n <simpo-pagnination style=\"width: 100%; margin-top: 30px;\" [totalPages]=\"totalPages\" [currentPage]=\"pageNo\" (paginationChange)=\"paginationChange($event)\"></simpo-pagnination>\n </div>\n\n <section class=\"empty-cart\" *ngIf=\"responseData?.length == 0\">\n <div>\n <div class=\"cart-image\">\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\" src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\" alt=\"\">\n </div>\n <div class=\"cart-text\">\n <div class=\"heading-medium d-flex justify-content-center\" [style.color]=\"styles?.background?.accentColor\">\n Product list is empty\n </div>\n <div class=\"description d-flex justify-content-center mt-4\" [style.color]=\"styles?.background?.accentColor\">\n Looks like no item is present with filter. Go ahead & explore top categories.\n </div>\n </div>\n </div>\n </section>\n </ng-container>\n <ngx-skeleton-loader *ngIf=\"filterLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '100%',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n }\" />\n </div>\n\n <div class=\"bottom-filter\"[style.color]=\"styles?.background?.accentColor\">\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\n <mat-icon>sort</mat-icon>\n <span>Sort by</span>\n </div>\n <div class=\"divider\"></div>\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\n <mat-icon>filter_list</mat-icon>\n <span>Filter</span>\n </div>\n </div>\n </div>\n\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\" [isEcommerce]=\"true\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n<ng-template #FavouriteTags let-product=\"data\">\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border</mat-icon>\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite</mat-icon>\n</ng-template>\n\n<ng-template #FilterSection>\n <section>\n <div class=\"d-flex flex-column m-auto\" style=\"width: 95%;\">\n <ng-container *ngFor=\"let filter of filterList\">\n <div class=\"d-flex justify-content-between w-100 chip\" [style.color]=\"styles?.background?.accentColor\">\n <span>{{filter.name}}</span>\n <span style=\"cursor: pointer;\" (click)=\"removeFilter(filter)\">X</span>\n </div>\n </ng-container>\n </div>\n <div class=\"categories-section\" *ngIf=\"categories?.length\">\n <div class=\"categories heading-small\" [style.color]=\"styles?.background?.accentColor\">\n Shop by categories\n </div>\n <div class=\"category-options\" *ngFor=\"let category of categories\" (click)=\"applyFilter(category, 'FILTER')\" [style.color]=\"styles?.background?.accentColor\">\n <input type=\"checkbox\" name=\"\" id=\"\" [checked]=\"category.status\" />\n <div class=\"trim-text\">{{category.option | uppercase}}</div>\n </div>\n </div>\n <div class=\"categories-section\" *ngIf=\"collections?.length\" [style.color]=\"styles?.background?.accentColor\">\n <div class=\"categories heading-small\">\n Shop by collections\n </div>\n <div class=\"category-options\" *ngFor=\"let collection of collections\" (click)=\"applyFilter(collection, 'FILTER')\">\n <input type=\"checkbox\" name=\"\" id=\"\" [checked]=\"collection.status\" />\n <div class=\"trim-text\">{{collection.option | uppercase}}</div>\n </div>\n </div>\n\n <div class=\"price-section\">\n <div class=\"categories heading-small\" [style.color]=\"styles?.background?.accentColor\">\n Shop by price\n </div>\n <div>\n <mat-slider class=\"mat-slider\" [min]=\"minProductPrice\" [max]=\"maxProductPrice\" style=\"width: 250px;\">\n <input matSliderStartThumb [(ngModel)]=\"pricingMin\">\n <input matSliderEndThumb [(ngModel)]=\"pricingMax\">\n </mat-slider>\n </div>\n <div class=\"price-button-section\">\n <div class=\"button-section\">\n <button (click)=\"applyFilter()\">Filter</button>\n </div>\n <div class=\"price-range\">\n Price: <span [innerHtml]='currency'></span>{{ pricingMin }} - <span [innerHtml]='currency'></span>{{ pricingMax | formateAmount }}\n </div>\n </div>\n </div>\n </section>\n</ng-template>\n<ng-template #CategoryFilterSection>\n <section>\n <ng-container *ngFor=\"let category of categories\">\n <div class=\"category\">\n <img [src]=\"category.imgUrl\">\n <span>{{ category.option }}</span>\n </div>\n </ng-container>\n </section>\n</ng-template>\n\n<ng-template #SortingSection>\n <section style=\"padding: 10px\">\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\n <span>Sort by</span>\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\n </div>\n <mat-radio-group class=\"d-flex flex-column\">\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"applyFilter($event, 'SORT')\">{{sortingType.name}}</mat-radio-button>\n </mat-radio-group>\n </section>\n</ng-template>\n", styles: [".product-parent{display:flex;flex-wrap:wrap;margin-top:15px}.product{padding:10px;cursor:pointer}.product-img{height:40vh;width:100%}.price{color:#222;font-size:16px;font-weight:600;line-height:normal;text-align:left}.product-name{color:#222;font-size:16px;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px}.add-product-button{width:20%}.mt-15{margin-top:15px}.default-image{background-color:#f2f3f5;text-align:center}.default-image img{width:100%;height:40vh}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.add-to-cart-btn button{height:35px;font-size:16px!important}.fav-icon{position:absolute;z-index:1000;padding:5px;right:3px;top:3px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.discounted-price{margin-top:-3px}.filter-side{width:19%;position:sticky;top:0;height:fit-content}.filter-top-section{padding:0 2rem}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.categories{display:flex;padding:1rem 2rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 2rem;gap:11px}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem}.button-section button{position:relative;background:#0267c1;color:#fff;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px}.chip{background:#0267c1;padding:8px 15px;border-radius:3px;margin:3px 0;color:#fff;transition:.3s opacity ease}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;justify-content:space-between}.price-range{padding-right:22px;color:#93959e;font-size:15px}.right-side{width:80%;margin-left:10px}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:30px;width:30px;border-radius:50%;cursor:pointer;border:1px solid lightgray}.varient-list .selected-varient{border:1px solid transparent}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:10px!important}.product{padding:5px!important;margin-top:10px!important}.out-of-stock{font-size:12px!important}.discounted-price,.add-to-cart-btn button{font-size:14px!important}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:block!important}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:10000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:220px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important}}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group{position:relative;width:95%;outline:none;border:none;border-radius:5px;height:45px;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i9.UpperCasePipe, name: "uppercase" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i11.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i12.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i13.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i14.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i14.MatSliderRangeThumb, selector: "input[matSliderStartThumb], input[matSliderEndThumb]", exportAs: ["matSliderRangeThumb"] }, { kind: "component", type: PagninationComponent, selector: "simpo-pagnination", inputs: ["totalPages", "currentPage"], outputs: ["paginationChange"] }, { kind: "directive", type:
162
375
  //directive
163
- AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }] }); }
376
+ AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i15.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i15.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "pipe", type: FormateAmount, name: "formateAmount" }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i16.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
164
377
  }
165
378
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductListComponent, decorators: [{
166
379
  type: Component,
@@ -173,15 +386,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
173
386
  PagninationComponent,
174
387
  //directive
175
388
  AnimationDirective,
389
+ CdkDrag,
390
+ BackgroundDirective,
176
391
  ContentFitDirective,
177
392
  HoverDirective,
178
393
  ButtonDirectiveDirective,
179
- MatIcon
180
- ], template: "<ng-container *ngIf=\"!isLoading\">\r\n <section class=\"container-fluid total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" simpoHover\r\n (hovering)=\"showEditTabs($event)\">\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\" style=\"width: 20%;\">\r\n <div class=\"filter body-large\">\r\n Filters\r\n </div>\r\n <div class=\"clear\" (click)=\"clearFilter()\">\r\n Clear all\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-content-between\" style=\"width: 80%;\">\r\n <div style=\"color: #6c757d82;\" class=\"fs-6 fw-normal\">Showing {{pageNo*size +1}}-{{size}} of {{ totalCount }} Results</div>\r\n <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\r\n <div class=\"fs-6 fw-normal mr-3\" style=\"color: #6c757d82;\">Sort by</div>\r\n <select (change)=\"applyFilter($event, 'SORT')\">\r\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{filter.name}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"filter-side\">\r\n\r\n <div class=\"d-flex flex-column m-auto\" style=\"width: 95%;\">\r\n <ng-container *ngFor=\"let filter of filterList\">\r\n <div class=\"d-flex justify-content-between w-100 chip\">\r\n <span>{{filter.name}}</span>\r\n <span style=\"cursor: pointer;\" (click)=\"removeFilter(filter)\">X</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"categories-section\" *ngIf=\"categories?.length\">\r\n <div class=\"categories heading-small\">\r\n Shop by categories\r\n </div>\r\n <div class=\"category-options\" *ngFor=\"let category of categories\" (click)=\"applyFilter(category, 'FILTER')\">\r\n <input type=\"checkbox\" name=\"\" id=\"\" [checked]=\"category.status\" />\r\n <div>{{category.option | uppercase}}</div>\r\n </div>\r\n </div>\r\n <div class=\"categories-section\" *ngIf=\"collections?.length\">\r\n <div class=\"categories heading-small\">\r\n Shop by collections\r\n </div>\r\n <div class=\"category-options\" *ngFor=\"let collection of collections\" (click)=\"applyFilter(collection, 'FILTER')\">\r\n <input type=\"checkbox\" name=\"\" id=\"\" [checked]=\"collection.status\" />\r\n <div>{{collection.option | uppercase}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"price-section\">\r\n <div class=\"categories heading-small\">\r\n Shop by price\r\n </div>\r\n <div>\r\n <mat-slider min=\"0\" max=\"1000\" style=\"width: 250px;\">\r\n <input matSliderStartThumb [(ngModel)]=\"pricingMin\">\r\n <input matSliderEndThumb [(ngModel)]=\"pricingMax\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"price-button-section\">\r\n <div class=\"button-section\">\r\n <button (click)=\"applyFilter()\">Filter</button>\r\n </div>\r\n <div class=\"price-range\">\r\n Price: ${{ pricingMin }} - ${{ pricingMax }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\">\r\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\r\n <div *ngFor=\"let product of responseData\" class=\"product\" [style.width]=\"getProductWidth()\" (click)=\"proceedToProductDesc(product.itemId)\" style=\"cursor: pointer;\">\r\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\" class=\"default-image\">\r\n <img src=\"https://www.svgrepo.com/show/149861/t-shirt-black-silhouette.svg\" alt=\"\">\r\n </div>\r\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\">\r\n <img [src]=\"product.itemImages?.[0]?.imgUrl\" alt=\"\" class=\"product-img\">\r\n </div>\r\n <div class=\"mt-2\">\r\n <div class=\"product-name heading-large text-left\">\r\n {{product.name}}</div>\r\n <div class=\"price body-large text-left\">\r\n ${{product.price.sellingPrice}}\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div *ngIf=\"content?.display?.showButton\" class=\"add-to-cart-btn\">\r\n <button simpoButtonDirective [id]=\"data?.id+(button?.id || '')\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"styles?.background?.accentColor\">{{content?.button}}</button>\r\n </div> -->\r\n <simpo-pagnination style=\"width: 100%;\" class=\"mt-15\" [totalPages]=\"getTotalPage\" [currentPage]=\"pageNo +1\" ></simpo-pagnination>\r\n </div>\r\n \r\n <section class=\"empty-cart\" *ngIf=\"responseData?.length == 0\">\r\n <div>\r\n <div class=\"cart-image\">\r\n <img style=\"height: 150px; width: 150px;\" src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\" alt=\"\">\r\n </div>\r\n <div class=\"cart-text\">\r\n <div class=\"heading-medium d-flex justify-content-center\">\r\n Product list is empty\r\n </div>\r\n <div class=\"description d-flex justify-content-center mt-4\">\r\n Looks like no item is present with filter. Go ahead & explore top categories.\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\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>\r\n </section>\r\n</ng-container>\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>", styles: [".product-parent{display:flex;flex-wrap:wrap;margin-top:15px}.product{padding:10px;cursor:pointer}.product-img{height:310px;width:100%}.price{color:#222;font-size:16px;font-weight:600;line-height:normal;text-align:left}.product-name{color:#222;font-size:16px;line-height:26px;margin-bottom:5px;text-align:left}.add-product-button{width:20%}.mt-15{margin-top:15px}.default-image{background-color:#f2f3f5;text-align:center}.default-image img{width:70%;height:310px}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.add-to-cart-btn{margin-top:15px}.add-to-cart-btn button{height:35px;font-size:16px!important}.filter-side{width:20%}.filter-top-section{padding:0 2rem}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.categories{display:flex;padding:1rem 2rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 2rem;gap:11px}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem}.button-section button{position:relative;background:#0267c1;color:#fff;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px}.chip{background:#0267c1;padding:8px 15px;border-radius:3px;margin:3px 0;color:#fff;transition:.3s opacity ease}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;justify-content:space-between}.price-range{padding-right:22px;color:#93959e;font-size:15px}.right-side{width:80%}@media screen and (max-width: 475px){.product-img{height:250px}.default-image img{height:250px}.filter-side{display:none}.right-side{width:100%}}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}\n"] }]
394
+ MatIcon,
395
+ MatBottomSheetModule,
396
+ MatRadioModule,
397
+ FormateAmount,
398
+ ToastModule
399
+ ], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"></p-toast>\n\n<div class=\"input-group\" *ngIf=\"isMobile\">\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Product..\" aria-label=\"Search Product\" [(ngModel)]=\"searchText\" (ngModelChange)=\"searchProduct()\">\n</div>\n\n<ng-container *ngIf=\"!isLoading\">\n <section [id]=\"data?.id\" class=\"container-fluid total-container\" [simpoLayout]=\"styles?.layout\" (click)=\"editSection()\" simpoHover\n (hovering)=\"showEditTabs($event)\" [simpoBackground]=\"styles?.background\" [style.paddingTop.px]=\"isMobile ? '0 !important' : ''\">\n\n <!-- <div *ngIf=\"isMobile\" class=\"back-to-home\" cdkDrag (click)=\"goToHome()\">\n <mat-icon>home</mat-icon>\n </div> -->\n\n <div class=\"d-flex justify-content-between align-items-center w-100 onlyDesktop\">\n <div class=\"filter-top-section d-flex justify-content-between align-items-baseline\" style=\"width: 20%;\">\n <div class=\"filter body-large\" [style.color]=\"styles?.background?.accentColor\">\n Filters\n </div>\n <div class=\"clear\" (click)=\"clearFilter()\" [style.color]=\"styles?.background?.accentColor\">\n Clear all\n </div>\n </div>\n <div class=\"d-flex align-items-center justify-content-between\" style=\"width: 80%;margin-left: 10px;\">\n <div class=\"fs-6 fw-normal\" [style.color]=\"styles?.background?.accentColor\">Showing {{(pageNo -1)*size +1}}-{{minSize}} of {{ totalCount }} Results</div>\n <div class=\"d-flex align-items-center\" style=\"gap: 10px;\" [style.color]=\"styles?.background?.accentColor\">\n <div class=\"fs-6 fw-normal mr-3\">Sort by</div>\n <select (change)=\"applyFilter($event, 'SORT')\">\n <option [value]=\"filter.value\" *ngFor=\"let filter of filteringArray\">{{filter.name}}</option>\n </select>\n </div>\n </div>\n </div>\n <div class=\"d-flex w-100 onlyMobile\" style=\"gap: 5px; overflow-x: auto;\" [style.color]=\"styles?.background?.accentColor\">\n <ng-container *ngFor=\"let filter of filterList\">\n <div class=\"d-flex justify-content-between w-100 chip\" [style.color]=\"styles?.background?.accentColor\">\n <span>{{filter.name}}</span>\n <span style=\"cursor: pointer; margin-left: 5px;\" (click)=\"removeFilter(filter)\">X</span>\n </div>\n </ng-container>\n </div>\n <div class=\"d-flex justify-content-between\">\n <div class=\"filter-side onlyDesktop\">\n <ng-container *ngTemplateOutlet=\"FilterSection\"></ng-container>\n </div>\n <div [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" class=\"right-side\">\n <ng-container *ngIf=\"!filterLoading\">\n <div class=\"product-parent\" *ngIf=\"responseData && responseData.length > 0\">\n <div *ngFor=\"let product of responseData\" class=\"product\" [style.width]=\"getProductWidth()\" style=\"cursor: pointer;\">\n <div *ngIf=\"!(product.itemImages?.length && product.itemImages?.[0]?.imgUrl)\" class=\"default-image position-relative\" (click)=\"proceedToProductDesc(product.itemId)\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\">\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\n </div>\n <div *ngIf=\"product.itemImages?.length && product.itemImages?.[0]?.imgUrl\" class=\"default-image position-relative\" (click)=\"proceedToProductDesc(product.itemId)\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"product?.itemImages?.[0]?.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\" class=\"product-img\">\n <ng-container *ngTemplateOutlet=\"FavouriteTags; context: {data: product}\"></ng-container>\n </div>\n <div class=\"mt-2 w-100\">\n <div class=\"product-name heading-large w-100 text-left trim-text\" [style.color]=\"styles?.background?.accentColor\">{{ product.name }}</div>\n <div class=\"varient-list\" *ngIf=\"product?.itemVariant?.length\">\n <ng-container *ngFor=\"let varient of product?.itemVariant; let idx = index\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"varient.variantImages?.[0]?.imgUrl ?? 'https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" alt=\"\" class=\"varient\" [ngClass]=\"{'selected-varient': varient.variantId == product.varientId}\" [style.borderColor]=\"varient.variantId == product.varientId ? 'blue' : 'transparent'\" (click)=\"selectVarient(product, varient)\">\n </ng-container>\n </div>\n <div class=\"d-flex align-item-center justify-content-between\">\n <div class=\"price body-large text-left d-flex align-items-center\">\n <div class=\"discounted-price\"[style.color]=\"styles?.background?.accentColor\">\n <span [innerHTML]='currency'></span>\n {{product.price.discountedPrice}}\n </div>\n </div>\n <div *ngIf=\"content?.display?.showButton\" class=\"add-to-cart-btn\">\n <button simpoButtonDirective [id]=\"data?.id+(button?.id || '')\" [buttonStyle]=\"button?.styles\"\n [color]=\"styles?.background?.accentColor\" *ngIf=\"!product.quantity && !isItemOutOfStock(product)\" (click)=\"addItemToCart($event, product, 'ADD')\">{{button?.content?.label ?? 'Add to Cart'}}</button>\n <div class=\"quantity\" *ngIf=\"product.quantity && !isItemOutOfStock(product)\" [style.borderColor]=\"styles?.background?.accentColor\" [style.color]=\"styles?.background?.accentColor\">\n <span (click)=\"addItemToCart($event, product, 'SUBSTRACT')\">-</span>\n <span>{{product.quantity}}</span>\n <span (click)=\"addItemToCart($event, product, 'ADD')\">+</span>\n </div>\n <button disabled class=\"out-of-stock\" *ngIf=\"isItemOutOfStock(product)\">Out Of Stock</button>\n </div>\n </div>\n </div>\n </div>\n <simpo-pagnination style=\"width: 100%; margin-top: 30px;\" [totalPages]=\"totalPages\" [currentPage]=\"pageNo\" (paginationChange)=\"paginationChange($event)\"></simpo-pagnination>\n </div>\n\n <section class=\"empty-cart\" *ngIf=\"responseData?.length == 0\">\n <div>\n <div class=\"cart-image\">\n <img loading=\"lazy\" style=\"height: 150px; width: 150px;\" src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/107213c1716543334040empty-cart.png\" alt=\"\">\n </div>\n <div class=\"cart-text\">\n <div class=\"heading-medium d-flex justify-content-center\" [style.color]=\"styles?.background?.accentColor\">\n Product list is empty\n </div>\n <div class=\"description d-flex justify-content-center mt-4\" [style.color]=\"styles?.background?.accentColor\">\n Looks like no item is present with filter. Go ahead & explore top categories.\n </div>\n </div>\n </div>\n </section>\n </ng-container>\n <ngx-skeleton-loader *ngIf=\"filterLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '100%',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n }\" />\n </div>\n\n <div class=\"bottom-filter\"[style.color]=\"styles?.background?.accentColor\">\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openSorting(SortingSection)\">\n <mat-icon>sort</mat-icon>\n <span>Sort by</span>\n </div>\n <div class=\"divider\"></div>\n <div class=\"d-flex filter-text\" style=\"gap: 10px\" (click)=\"openFilter(FilterSection)\">\n <mat-icon>filter_list</mat-icon>\n <span>Filter</span>\n </div>\n </div>\n </div>\n\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\" [isEcommerce]=\"true\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n<ng-template #FavouriteTags let-product=\"data\">\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"toggleItemToFav($event, product, 'ADD')\" *ngIf=\"!product.whislist\">favorite_border</mat-icon>\n <mat-icon class=\"fav-icon\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"toggleItemToFav($event, product, 'REMOVE')\" *ngIf=\"product.whislist\">favorite</mat-icon>\n</ng-template>\n\n<ng-template #FilterSection>\n <section>\n <div class=\"d-flex flex-column m-auto\" style=\"width: 95%;\">\n <ng-container *ngFor=\"let filter of filterList\">\n <div class=\"d-flex justify-content-between w-100 chip\" [style.color]=\"styles?.background?.accentColor\">\n <span>{{filter.name}}</span>\n <span style=\"cursor: pointer;\" (click)=\"removeFilter(filter)\">X</span>\n </div>\n </ng-container>\n </div>\n <div class=\"categories-section\" *ngIf=\"categories?.length\">\n <div class=\"categories heading-small\" [style.color]=\"styles?.background?.accentColor\">\n Shop by categories\n </div>\n <div class=\"category-options\" *ngFor=\"let category of categories\" (click)=\"applyFilter(category, 'FILTER')\" [style.color]=\"styles?.background?.accentColor\">\n <input type=\"checkbox\" name=\"\" id=\"\" [checked]=\"category.status\" />\n <div class=\"trim-text\">{{category.option | uppercase}}</div>\n </div>\n </div>\n <div class=\"categories-section\" *ngIf=\"collections?.length\" [style.color]=\"styles?.background?.accentColor\">\n <div class=\"categories heading-small\">\n Shop by collections\n </div>\n <div class=\"category-options\" *ngFor=\"let collection of collections\" (click)=\"applyFilter(collection, 'FILTER')\">\n <input type=\"checkbox\" name=\"\" id=\"\" [checked]=\"collection.status\" />\n <div class=\"trim-text\">{{collection.option | uppercase}}</div>\n </div>\n </div>\n\n <div class=\"price-section\">\n <div class=\"categories heading-small\" [style.color]=\"styles?.background?.accentColor\">\n Shop by price\n </div>\n <div>\n <mat-slider class=\"mat-slider\" [min]=\"minProductPrice\" [max]=\"maxProductPrice\" style=\"width: 250px;\">\n <input matSliderStartThumb [(ngModel)]=\"pricingMin\">\n <input matSliderEndThumb [(ngModel)]=\"pricingMax\">\n </mat-slider>\n </div>\n <div class=\"price-button-section\">\n <div class=\"button-section\">\n <button (click)=\"applyFilter()\">Filter</button>\n </div>\n <div class=\"price-range\">\n Price: <span [innerHtml]='currency'></span>{{ pricingMin }} - <span [innerHtml]='currency'></span>{{ pricingMax | formateAmount }}\n </div>\n </div>\n </div>\n </section>\n</ng-template>\n<ng-template #CategoryFilterSection>\n <section>\n <ng-container *ngFor=\"let category of categories\">\n <div class=\"category\">\n <img [src]=\"category.imgUrl\">\n <span>{{ category.option }}</span>\n </div>\n </ng-container>\n </section>\n</ng-template>\n\n<ng-template #SortingSection>\n <section style=\"padding: 10px\">\n <div class=\"categories heading-small d-flex justify-content-between align-item-center \" style=\"padding: 0px;\">\n <span>Sort by</span>\n <mat-icon (click)=\"closeDialog()\">close</mat-icon>\n </div>\n <mat-radio-group class=\"d-flex flex-column\">\n <mat-radio-button *ngFor=\"let sortingType of filteringArray\" (click)=\"applyFilter($event, 'SORT')\">{{sortingType.name}}</mat-radio-button>\n </mat-radio-group>\n </section>\n</ng-template>\n", styles: [".product-parent{display:flex;flex-wrap:wrap;margin-top:15px}.product{padding:10px;cursor:pointer}.product-img{height:40vh;width:100%}.price{color:#222;font-size:16px;font-weight:600;line-height:normal;text-align:left}.product-name{color:#222;font-size:16px;line-height:26px;margin-bottom:5px;text-align:left!important;width:220px}.add-product-button{width:20%}.mt-15{margin-top:15px}.default-image{background-color:#f2f3f5;text-align:center}.default-image img{width:100%;height:40vh}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.add-to-cart-btn button{height:35px;font-size:16px!important}.fav-icon{position:absolute;z-index:1000;padding:5px;right:3px;top:3px;height:fit-content;width:fit-content;background-color:#ffffff78;border-radius:50%}.out-of-stock{background-color:#d3d3d333;color:#000;border-radius:5px;border:none}.selling-price{text-decoration:line-through;font-size:14px!important;margin-right:8px;color:#d3d3d3}.discounted-price{margin-top:-3px}.filter-side{width:19%;position:sticky;top:0;height:fit-content}.filter-top-section{padding:0 2rem}.filter{font-size:22px;font-weight:600;line-height:26px;color:#000}.clear{color:#e60101;font-size:14px;cursor:pointer;font-weight:600}.categories{display:flex;padding:1rem 2rem;padding-bottom:0;color:#000;font-size:18px!important;font-weight:500}.category-options{display:flex;align-items:center;cursor:pointer;padding:.75rem 2rem;gap:11px}.category-options div{font-size:14px}.button-section{width:26%;margin:2rem}.button-section button{position:relative;background:#0267c1;color:#fff;border:none;padding:5px;width:100px!important;font-weight:600;left:-10px;border-radius:4px}.chip{background:#0267c1;padding:8px 15px;border-radius:3px;margin:3px 0;color:#fff;transition:.3s opacity ease}.chip:hover{opacity:.8}.price-button-section{display:flex;align-items:center;justify-content:space-between}.price-range{padding-right:22px;color:#93959e;font-size:15px}.right-side{width:80%;margin-left:10px}.bottom-filter{display:none}.onlyMobile{display:none!important}.quantity{display:flex;justify-content:space-between;align-items:center;border:1.5px solid lightgray;border-radius:3px;padding:5px;font-weight:600;width:95px}.varient-list{display:flex;gap:5px;margin-bottom:5px;width:100%;overflow-x:auto}.varient-list .varient{height:30px;width:30px;border-radius:50%;cursor:pointer;border:1px solid lightgray}.varient-list .selected-varient{border:1px solid transparent}@media screen and (max-width: 475px){.container-fluid{padding-left:5px!important;padding-right:5px!important;padding-top:10px!important}.product{padding:5px!important;margin-top:10px!important}.out-of-stock{font-size:12px!important}.discounted-price,.add-to-cart-btn button{font-size:14px!important}.filter-text{gap:10px;font-size:16px;align-items:center;font-weight:500;cursor:pointer}.mat-slider{width:304px!important}.price-range{font-size:16px}.chip{min-width:fit-content!important}.onlyMobile{display:block!important}.category-options{padding-left:8px;padding-right:0}.categories{padding-left:0}.button-section{margin-left:15px}.button-section button{width:120px!important;padding:10px!important}.bottom-filter{position:fixed!important;display:block;z-index:10000001;width:100%;margin-left:-5px;position:absolute;bottom:-5px;display:flex;border-top:1px solid #80808045;justify-content:space-evenly;align-items:center;height:64px;background:#fff;box-shadow:#0000001a 0 4px 12px}.divider{height:60%;width:.5px;border:1px solid #d3d3d378}.onlyDesktop{display:none!important}.product-img{height:100%}.default-image img{width:100%;height:220px}.filter-side{display:none}.right-side{width:100%;margin-left:0!important}}select{width:200px;font-size:16px;padding:10px;border:1px solid lightgray;border-radius:3px;cursor:pointer}input[type=checkbox]{height:16px;width:16px}.input-group{position:relative;width:95%;outline:none;border:none;border-radius:5px;height:45px;display:flex;align-items:center;background-color:#fff;border:1.5px solid #8080801c;box-shadow:0 0 0 1px #edececd6;margin:15px auto}.input-group .fa-search{color:gray;background-color:transparent;width:10%;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;top:1px}.input-group input{height:100%;width:80%;background-color:transparent;border:none;outline:none;font-size:16px;padding-bottom:6px;box-shadow:none}.back-to-home{background-color:#9b9a9a1c;padding:5px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:fixed;right:3px;top:50%;cursor:pointer}.back-to-home .mat-icon{font-size:16px;height:16px;width:16px}\n"] }]
181
400
  }], ctorParameters: () => [{ type: Object, decorators: [{
182
401
  type: Inject,
183
402
  args: [PLATFORM_ID]
184
- }] }, { type: i1.EventsService }, { type: i2.RestService }, { type: i3.Router }, { type: i3.ActivatedRoute }], propDecorators: { responseData: [{
403
+ }] }, { type: i1.EventsService }, { type: i2.RestService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.StorageServiceService }, { type: i5.MatBottomSheet }, { type: i6.MatDialog }, { type: i7.CartService }, { type: i8.MessageService }], propDecorators: { responseData: [{
185
404
  type: Input
186
405
  }], data: [{
187
406
  type: Input
@@ -195,4 +414,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
195
414
  type: HostListener,
196
415
  args: ["window: resize", ["$event"]]
197
416
  }] } });
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwRixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUt4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9C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QWtCLHlGQUNsQixtQkFBbUIsbUZBQ25CLGNBQWM7OzJGQU9MLG9CQUFvQjtrQkFwQmhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCxvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2Ysb0JBQW9CO3dCQUNwQixXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixjQUFjO3dCQUNkLHdCQUF3Qjt3QkFDeEIsT0FBTztxQkFDUjs7MEJBZUUsTUFBTTsyQkFBQyxXQUFXO2lKQVZaLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQWlDTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29udGVudEZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb250ZW50LWZpdC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xyXG5pbXBvcnQgQmFzZVNlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc2VjdGlvbnMvQmFzZVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBQcm9kdWN0TGlzdENvbnRlbnRNb2RhbCwgUHJvZHVjdExpc3RNb2RhbCwgUHJvZHVjdExpc3RTdHlsZXNNb2RhbCB9IGZyb20gJy4vcHJvZHVjdC1saXN0Lm1vZGFsJztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uLy4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMvc3R5bGUubW9kZWwnO1xyXG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFNsaWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBQYWduaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ25pbmF0aW9uL3BhZ25pbmF0aW9uLmNvbXBvbmVudCc7XHJcblxyXG5pbnRlcmZhY2UgQmFzZU1vZGVsIHtcclxuICBvcHRpb246IHN0cmluZyxcclxuICBpZDogc3RyaW5nLFxyXG4gIHN0YXR1czogYm9vbGVhblxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLXByb2R1Y3QtbGlzdCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsIFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBTaW1wb0NvbXBvbmVudE1vZHVsZSxcclxuICAgIE1hdFNsaWRlck1vZHVsZSxcclxuICAgIFBhZ25pbmF0aW9uQ29tcG9uZW50LFxyXG4gICAgLy9kaXJlY3RpdmVcclxuICAgIEFuaW1hdGlvbkRpcmVjdGl2ZSxcclxuICAgIENvbnRlbnRGaXREaXJlY3RpdmUsXHJcbiAgICBIb3ZlckRpcmVjdGl2ZSxcclxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcclxuICAgIE1hdEljb25cclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3RMaXN0Q29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24ge1xyXG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YT86IFByb2R1Y3RbXVxyXG4gIEBJbnB1dCgpIGRhdGE/OiBQcm9kdWN0TGlzdE1vZGFsXHJcbiAgQElucHV0KCkgaW5kZXg/IDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGVkaXQ/IDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkZWxldGU/IDogYm9vbGVhbjtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjb250ZW50PzogUHJvZHVjdExpc3RDb250ZW50TW9kYWw7XHJcbiAgYnV0dG9uPzogQnV0dG9uTW9kZWxcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZSA6IEV2ZW50c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICB0aGlzLmdldFNjcmVlblNpemUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKT0+IHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSByZXNwb25zZTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcHJpY2luZ01pbjogbnVtYmVyID0gMDtcclxuICBwdWJsaWMgcHJpY2luZ01heDogbnVtYmVyID0gMTAwO1xyXG4gIHB1YmxpYyBzb3J0Qnk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyB3aWxsIGNvbWUgZnJvbSBiYWNrZW5kIGFzIHNob3AgYW5kIHJlc3R1cmFudCBjYW4gaGF2ZSBkaWZmcmVudCBmaWx0ZXJzXHJcbiAgcHVibGljIGZpbHRlcmluZ0FycmF5ID0gW1xyXG4gICAgeyBuYW1lOiBcIkxvd2VzdCBGaXJzdFwiLCB2YWx1ZTogXCJsb3dlc3RQcmljZVwiIH0sXHJcbiAgICB7IG5hbWU6IFwiSGlnaGVzdCBGaXJzdFwiLCB2YWx1ZTogXCJoaWdoZXN0UHJpY2VcIiB9XHJcbiAgXTtcclxuXHJcbiAgc2NyZWVuV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcclxuICBnZXRTY3JlZW5TaXplKCkge1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyTGlzdDogYW55W10gPSBbXTtcclxuICBzdHlsZXM/OiBQcm9kdWN0TGlzdFN0eWxlc01vZGFsO1xyXG4gIHRvdGFsQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgcGFnZU5vOiBudW1iZXIgPSAwO1xyXG4gIHNpemU6IG51bWJlciA9IDU7XHJcbiAgc2VhcmNoVHh0OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBuZ09uSW5pdCgpe1xyXG4gICAgdGhpcy5jb250ZW50ID0gdGhpcy5kYXRhPy5jb250ZW50O1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5kYXRhPy5hY3Rpb24uYnV0dG9uc1swXTtcclxuXHJcbiAgICB0aGlzLmdldEFsbENhdGVnb3JpZXMoKTtcclxuICAgIHRoaXMuZ2V0QWxsQ29sbGVjdGlvbnMoKTtcclxuXHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocVBhcmFtOiBhbnkpPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaFR4dCA9IHFQYXJhbVtcInNlYXJjaFR4dFwiXTtcclxuICAgICAgdGhpcy5zb3J0QnkgPSBxUGFyYW1bXCJzb3J0aW5nXCJdO1xyXG4gICAgICB0aGlzLnByaWNpbmdNaW4gPSBpc05hTihOdW1iZXIocVBhcmFtW1wibWluUHJpY2VcIl0pKSA/IDAgOiBOdW1iZXIocVBhcmFtW1wibWluUHJpY2VcIl0pO1xyXG4gICAgICB0aGlzLnByaWNpbmdNYXggPSBpc05hTihOdW1iZXIocVBhcmFtW1wibWF4UHJpY2VcIl0pKSA/IDEwMDAgOiBOdW1iZXIocVBhcmFtW1wibWF4UHJpY2VcIl0pO1xyXG4gICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtW1wiY2F0ZWdvcnlcIl0sIHFQYXJhbVtcImNvbGxlY3Rpb25zXCJdKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKHFDYXRlZ29yaWVzOiBhbnksIHFDb2xsZWN0aW9uczogYW55KSB7XHJcbiAgICBjb25zdCBjYXRlZ29yaWVzID0gcUNhdGVnb3JpZXM/LnNwbGl0KFwiK1wiKT8ubWFwKChjYXRlZ29yeTogc3RyaW5nKT0+IGNhdGVnb3J5LnJlcGxhY2VBbGwoXCJfXCIsIFwiIFwiKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoKGNhdGVnb3J5OiBzdHJpbmcpPT4gY2F0ZWdvcnkubGVuZ3RoID4gMCk7XHJcbiAgICBjb25zdCBjb2xsZWN0aW9ucyA9IHFDb2xsZWN0aW9ucz8uc3BsaXQoXCIrXCIpPy5tYXAoKGNvbGxlY3Rpb246IHN0cmluZyk9PiBjb2xsZWN0aW9uLnJlcGxhY2VBbGwoXCJfXCIsIFwiIFwiKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoKGNvbGxlY3Rpb246IHN0cmluZyk9PiBjb2xsZWN0aW9uLmxlbmd0aCA+IDApO1xyXG4gICAgICBcclxuICAgIHRoaXMuY2F0ZWdvcmllcz8uZm9yRWFjaCgoY2F0ZWdvcnkpPT4gY2F0ZWdvcnkuc3RhdHVzID0gY2F0ZWdvcmllcz8uaW5jbHVkZXMoY2F0ZWdvcnk/Lm9wdGlvbj8udG9Mb3dlckNhc2UoKSkgPz8gZmFsc2UpO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9ucz8uZm9yRWFjaCgoY29sbGVjdGlvbik9PiBjb2xsZWN0aW9uLnN0YXR1cyA9IGNvbGxlY3Rpb25zPy5pbmNsdWRlcyhjb2xsZWN0aW9uPy5vcHRpb24/LnRvTG93ZXJDYXNlKCkpID8/IGZhbHNlKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuY2F0ZWdvcmllcywgdGhpcy5jb2xsZWN0aW9ucyk7XHJcbiAgICB0aGlzLmZpbHRlckxpc3QgPSBbXHJcbiAgICAgIC4uLnRoaXMuY2F0ZWdvcmllcz8uZmlsdGVyKChjYXRlZ29yeTogYW55KT0+IGNhdGVnb3J5LnN0YXR1cykubWFwKChjYXRlZ29yeSk9PiB7IHJldHVybiB7IGlkOiBjYXRlZ29yeS5pZCwgbmFtZTogY2F0ZWdvcnkub3B0aW9uIH0gfSksXHJcbiAgICAgIC4uLnRoaXMuY29sbGVjdGlvbnM/LmZpbHRlcigoY29sbGVjdGlvbjogYW55KT0+IGNvbGxlY3Rpb24uc3RhdHVzKS5tYXAoKGNvbGxlY3Rpb24pID0+IHsgcmV0dXJuIHsgaWQ6IGNvbGxlY3Rpb24uaWQsIG5hbWU6IGNvbGxlY3Rpb24ub3B0aW9uIH0gfSlcclxuICAgIF07XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmZpbHRlckxpc3QpO1xyXG4gICAgdGhpcy5maWx0ZXJJdGVtTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsQ2F0ZWdvcmllcygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQ2F0ZWdvcmllcygpLnN1YnNjcmliZSgocmVzcG9uc2UpPT4ge1xyXG4gICAgICB0aGlzLmNhdGVnb3JpZXMgPSByZXNwb25zZS5maWx0ZXIoKGNhdGVnb3J5OiBhbnkpPT4gY2F0ZWdvcnkuZmVhdHVyZWRDb2xsZWN0aW9uIHx8IHRydWUpLm1hcCgoY2F0ZWdvcnk6IGFueSk9PiB7IHJldHVybiB7IG9wdGlvbjogY2F0ZWdvcnkuY2F0ZWdvcnlOYW1lLCBpZDogY2F0ZWdvcnkuY2F0ZWdvcnlJZCwgc3RhdHVzOiBmYWxzZSB9IH0pO1xyXG4gICAgICBjb25zdCBxUGFyYW1Db2xsZWN0aW9ucyA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjb2xsZWN0aW9uc1wiXTtcclxuICAgICAgY29uc3QgcVBhcmFtQ2F0ZWdvcnkgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY2F0ZWdvcnlcIl07XHJcbiAgICAgIHRoaXMuZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShxUGFyYW1DYXRlZ29yeSwgcVBhcmFtQ29sbGVjdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldEFsbENvbGxlY3Rpb25zKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDb2xsZWN0aW9ucygpLnN1YnNjcmliZSgocmVzcG9uc2UpPT4ge1xyXG4gICAgICB0aGlzLmNvbGxlY3Rpb25zID0gcmVzcG9uc2UuZmlsdGVyKChjb2xsZWN0aW9uOiBhbnkpPT4gY29sbGVjdGlvbi5mZWF0dXJlZENhdGVnb3J5IHx8IHRydWUpLm1hcCgoY29sbGVjdGlvbjogYW55KT0+IHsgcmV0dXJuIHsgb3B0aW9uOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25OYW1lLCBpZDogY29sbGVjdGlvbi5jb2xsZWN0aW9uSWQsIHN0YXR1czogZmFsc2UgfSB9KTsgXHJcbiAgICAgIGNvbnN0IHFQYXJhbUNvbGxlY3Rpb25zID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcImNvbGxlY3Rpb25zXCJdO1xyXG4gICAgICBjb25zdCBxUGFyYW1DYXRlZ29yeSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjYXRlZ29yeVwiXTtcclxuICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3J5Q29sbGVjdGlvblBhcmFtKHFQYXJhbUNhdGVnb3J5LCBxUGFyYW1Db2xsZWN0aW9ucyk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRmlsdGVyKGZpbHRlcjogYW55KSB7XHJcbiAgICB0aGlzLmZpbHRlckxpc3QgPSB0aGlzLmZpbHRlckxpc3QuZmlsdGVyKChmKT0+IGYuaWQgIT0gZmlsdGVyLmlkKTtcclxuICAgIGNvbnN0IGZpbHRlckxpc3RJZHMgPSB0aGlzLmZpbHRlckxpc3QubWFwKChmaWx0ZXIpPT4gZmlsdGVyLmlkKTsgXHJcbiAgICB0aGlzLmNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnkpPT4gY2F0ZWdvcnkuc3RhdHVzID0gZmlsdGVyTGlzdElkcy5pbmNsdWRlcyhjYXRlZ29yeS5pZCkpO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9ucy5mb3JFYWNoKChjb2xsZWN0aW9uKT0+IGNvbGxlY3Rpb24uc3RhdHVzID0gZmlsdGVyTGlzdElkcy5pbmNsdWRlcyhjb2xsZWN0aW9uLmlkKSk7XHJcbiAgICAvLyBzb3J0aW5nIHNob3VsZCBhZGRcclxuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIoXCJcIik7XHJcbiAgfVxyXG5cclxuICBnZXRQcm9kdWN0V2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zY3JlZW5XaWR0aCA+IDQ3NSA/ICh0aGlzLnNjcmVlbldpZHRoIDwgMTAyNSA/ICcyNSUnIDogJ2NhbGMoJyArICgoMTAwIC8gKHRoaXMuc3R5bGVzPy5lbGVtZW50SW5Sb3cgfHwgNCkpKSArICclKScpIDogKHRoaXMuc3R5bGVzPy5tb2JpbGVDb2x1bW4gPT09IDEgPyAnMTAwJScgOiAnNTAlJylcclxuICB9XHJcblxyXG4gIHByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3RJZDogYW55KXtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZGV0YWlscyddLCB7IHF1ZXJ5UGFyYW1zOiB7IGlkOiBwcm9kdWN0SWQgfSB9KTtcclxuICAgIC8vIHRoaXMuX2V2ZW50U2VydmljZS5yZWRpcmVjdFRvUGFnZS5lbWl0KHtyZWRpcmVjdFRvOiAnL2RldGFpbHMnLCBkYXRhOiB7cHJvZHVjdElkOiBwcm9kdWN0SWR9fSlcclxuICB9XHJcbiAgY2xlYXJGaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnkpPT4gY2F0ZWdvcnkuc3RhdHVzID0gZmFsc2UpO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9ucy5mb3JFYWNoKChjb2xsZWN0aW9uKT0+IGNvbGxlY3Rpb24uc3RhdHVzID0gZmFsc2UpO1xyXG4gICAgdGhpcy5wcmljaW5nTWluID0gMDtcclxuICAgIHRoaXMucHJpY2luZ01heCA9IDEwMDtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbGlzdCddKTtcclxuICB9XHJcblxyXG4gIGNhdGVnb3JpZXM6IEJhc2VNb2RlbFtdID0gW107XHJcbiAgY29sbGVjdGlvbnM6IEJhc2VNb2RlbFtdID0gW107XHJcbiAgYXBwbHlGaWx0ZXIoY2F0ZWdvcnk/OmFueSwgdHlwZT86ICdTT1JUJ3wnRklMVEVSJykge1xyXG4gICAgbGV0IHNvcnRpbmcgPSBcIlwiO1xyXG5cclxuICAgIGlmICh0eXBlID09IFwiRklMVEVSXCIpXHJcbiAgICAgIGNhdGVnb3J5LnN0YXR1cyA9ICFjYXRlZ29yeS5zdGF0dXM7XHJcbiAgICBlbHNlIGlmICh0eXBlID09IFwiU09SVFwiKVxyXG4gICAgICBzb3J0aW5nID0gY2F0ZWdvcnk/LnRhcmdldD8udmFsdWU7XHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcihzb3J0aW5nKTtcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlRmlsdGVyKHNvcnRpbmc6IHN0cmluZykge1xyXG4gICAgXHJcbiAgICBsZXQgc2VsZWN0ZWRDYXRlZ29yeSA9IFwiXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRDb2xsZWN0aW9uID0gXCJcIjtcclxuICAgIHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoKGNhdGVnb3J5KT0+IGNhdGVnb3J5LnN0YXR1cykubWFwKChjYXRlZ29yeSk9PiB7IFxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmNhdGVnb3J5LFxyXG4gICAgICAgIHNsdWc6IGNhdGVnb3J5Lm9wdGlvbi5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcclxuICAgICAgfVxyXG4gICAgfSkuZm9yRWFjaCgoY2F0ZWdvcnkpPT4gc2VsZWN0ZWRDYXRlZ29yeSArPSAoY2F0ZWdvcnkuc2x1ZyArIFwiK1wiKSk7XHJcblxyXG4gICAgdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoKGNvbGxlY3Rpb24pPT4gY29sbGVjdGlvbi5zdGF0dXMpLm1hcCgoY29sbGVjdGlvbik9PiB7IFxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmNvbGxlY3Rpb24sXHJcbiAgICAgICAgc2x1ZzogY29sbGVjdGlvbi5vcHRpb24ucmVwbGFjZUFsbChcIiBcIiwgXCJfXCIpXHJcbiAgICAgIH1cclxuICAgIH0pLmZvckVhY2goKGNvbGxlY3Rpb24pPT4gc2VsZWN0ZWRDb2xsZWN0aW9uICs9IChjb2xsZWN0aW9uLnNsdWcgKyBcIitcIikpO1xyXG5cclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2xpc3QnXSwge3F1ZXJ5UGFyYW1zOiB7bWluUHJpY2U6IHRoaXMucHJpY2luZ01pbiwgbWF4UHJpY2U6IHRoaXMucHJpY2luZ01heCwgY2F0ZWdvcnk6IHNlbGVjdGVkQ2F0ZWdvcnksIGNvbGxlY3Rpb25zOiBzZWxlY3RlZENvbGxlY3Rpb24sIHNvcnRpbmc6IHNvcnRpbmd9fSk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJJdGVtTGlzdCgpIHtcclxuICAgIGNvbnN0IGNvbGxlY3Rpb25JZHMgPSB0aGlzLmNvbGxlY3Rpb25zLmZpbHRlcigoY29sbGVjdGlvbik9PiBjb2xsZWN0aW9uLnN0YXR1cykubWFwKChjb2xsZWN0aW9uKT0+IGNvbGxlY3Rpb24uaWQpO1xyXG4gICAgY29uc3QgY2F0ZWdvcnlJZHMgPSB0aGlzLmNhdGVnb3JpZXMuZmlsdGVyKChjYXRlZ29yeSk9PiBjYXRlZ29yeS5zdGF0dXMpLm1hcCgoY2F0ZWdvcnkpPT4gY2F0ZWdvcnkuaWQpOyAgICBcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RmlsdGVyZWRQcm9kdWN0KGNvbGxlY3Rpb25JZHMsIGNhdGVnb3J5SWRzLCB0aGlzLnNlYXJjaFR4dCwgdGhpcy5wcmljaW5nTWluLCB0aGlzLnByaWNpbmdNYXgsIHRoaXMuc29ydEJ5ID8/IFwiXCIsIHRoaXMucGFnZU5vLCB0aGlzLnNpemUpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSk9PiB7XHJcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xyXG4gICAgICB0aGlzLnRvdGFsQ291bnQgPSByZXNwb25zZS5kYXRhLmNvdW50O1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBnZXRUb3RhbFBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy50b3RhbENvdW50IC8gdGhpcy5zaXplKTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cclxuICA8c2VjdGlvbiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCB0b3RhbC1jb250YWluZXJcIiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiBzaW1wb0hvdmVyXHJcbiAgICAoaG92ZXJpbmcpPVwic2hvd0VkaXRUYWJzKCRldmVudClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItdG9wLXNlY3Rpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWJhc2VsaW5lXCIgc3R5bGU9XCJ3aWR0aDogMjAlO1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXIgYm9keS1sYXJnZVwiPlxyXG4gICAgICAgICAgRmlsdGVyc1xyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhclwiIChjbGljayk9XCJjbGVhckZpbHRlcigpXCI+XHJcbiAgICAgICAgICBDbGVhciBhbGxcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCIgc3R5bGU9XCJ3aWR0aDogODAlO1wiPlxyXG4gICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICM2Yzc1N2Q4MjtcIiBjbGFzcz1cImZzLTYgZnctbm9ybWFsXCI+U2hvd2luZyB7e3BhZ2VObypzaXplICsxfX0te3tzaXplfX0gb2Yge3sgdG90YWxDb3VudCB9fSBSZXN1bHRzPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDEwcHg7XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtNiBmdy1ub3JtYWwgbXItM1wiIHN0eWxlPVwiY29sb3I6ICM2Yzc1N2Q4MjtcIj5Tb3J0IGJ5PC9kaXY+XHJcbiAgICAgICAgICA8c2VsZWN0IChjaGFuZ2UpPVwiYXBwbHlGaWx0ZXIoJGV2ZW50LCAnU09SVCcpXCI+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiZmlsdGVyLnZhbHVlXCIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJpbmdBcnJheVwiPnt7ZmlsdGVyLm5hbWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItc2lkZVwiPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIG0tYXV0b1wiIHN0eWxlPVwid2lkdGg6IDk1JTtcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJMaXN0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy0xMDAgY2hpcFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7ZmlsdGVyLm5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGZpbHRlcilcIj5YPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cImNhdGVnb3JpZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbFwiPlxyXG4gICAgICAgICAgICBTaG9wIGJ5IGNhdGVnb3JpZXNcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgY2F0ZWdvcmllc1wiIChjbGljayk9XCJhcHBseUZpbHRlcihjYXRlZ29yeSwgJ0ZJTFRFUicpXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiXCIgaWQ9XCJcIiBbY2hlY2tlZF09XCJjYXRlZ29yeS5zdGF0dXNcIiAvPlxyXG4gICAgICAgICAgICA8ZGl2Pnt7Y2F0ZWdvcnkub3B0aW9uIHwgdXBwZXJjYXNlfX08L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLXNlY3Rpb25cIiAqbmdJZj1cImNvbGxlY3Rpb25zPy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzIGhlYWRpbmctc21hbGxcIj5cclxuICAgICAgICAgICAgU2hvcCBieSBjb2xsZWN0aW9uc1xyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktb3B0aW9uc1wiICpuZ0Zvcj1cImxldCBjb2xsZWN0aW9uIG9mIGNvbGxlY3Rpb25zXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVyKGNvbGxlY3Rpb24sICdGSUxURVInKVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cIlwiIGlkPVwiXCIgW2NoZWNrZWRdPVwiY29sbGVjdGlvbi5zdGF0dXNcIiAvPlxyXG4gICAgICAgICAgICA8ZGl2Pnt7Y29sbGVjdGlvbi5vcHRpb24gfCB1cHBlcmNhc2V9fTwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsXCI+XHJcbiAgICAgICAgICAgIFNob3AgYnkgcHJpY2VcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPG1hdC1zbGlkZXIgbWluPVwiMFwiIG1heD1cIjEwMDBcIiBzdHlsZT1cIndpZHRoOiAyNTBweDtcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0U2xpZGVyU3RhcnRUaHVtYiBbKG5nTW9kZWwpXT1cInByaWNpbmdNaW5cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0U2xpZGVyRW5kVGh1bWIgWyhuZ01vZGVsKV09XCJwcmljaW5nTWF4XCI+XHJcbiAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLWJ1dHRvbi1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFwcGx5RmlsdGVyKClcIj5GaWx0ZXI8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1yYW5nZVwiPlxyXG4gICAgICAgICAgICAgIFByaWNlOiAke3sgcHJpY2luZ01pbiB9fSAtICR7eyBwcmljaW5nTWF4IH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgW2lkXT1cImRhdGE/LmlkXCIgW3NpbXBvQW5pbWF0aW9uXT1cInN0eWxlcz8uYW5pbWF0aW9uXCIgY2xhc3M9XCJyaWdodC1zaWRlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtcGFyZW50XCIgKm5nSWY9XCJyZXNwb25zZURhdGEgJiYgcmVzcG9uc2VEYXRhLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgcmVzcG9uc2VEYXRhXCIgY2xhc3M9XCJwcm9kdWN0XCIgW3N0eWxlLndpZHRoXT1cImdldFByb2R1Y3RXaWR0aCgpXCIgKGNsaWNrKT1cInByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3QuaXRlbUlkKVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIShwcm9kdWN0Lml0ZW1JbWFnZXM/Lmxlbmd0aCAmJiBwcm9kdWN0Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsKVwiIGNsYXNzPVwiZGVmYXVsdC1pbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly93d3cuc3ZncmVwby5jb20vc2hvdy8xNDk4NjEvdC1zaGlydC1ibGFjay1zaWxob3VldHRlLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb2R1Y3QuaXRlbUltYWdlcz8ubGVuZ3RoICYmIHByb2R1Y3QuaXRlbUltYWdlcz8uWzBdPy5pbWdVcmxcIj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwicHJvZHVjdC5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybFwiIGFsdD1cIlwiIGNsYXNzPVwicHJvZHVjdC1pbWdcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtbmFtZSBoZWFkaW5nLWxhcmdlIHRleHQtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAge3twcm9kdWN0Lm5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZSBib2R5LWxhcmdlIHRleHQtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgJHt7cHJvZHVjdC5wcmljZS5zZWxsaW5nUHJpY2V9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiY29udGVudD8uZGlzcGxheT8uc2hvd0J1dHRvblwiIGNsYXNzPVwiYWRkLXRvLWNhcnQtYnRuXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImRhdGE/LmlkKyhidXR0b24/LmlkIHx8ICcnKVwiIFtidXR0b25TdHlsZV09XCJidXR0b24/LnN0eWxlc1wiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj57e2NvbnRlbnQ/LmJ1dHRvbn19PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDxzaW1wby1wYWduaW5hdGlvbiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGNsYXNzPVwibXQtMTVcIiBbdG90YWxQYWdlc109XCJnZXRUb3RhbFBhZ2VcIiBbY3VycmVudFBhZ2VdPVwicGFnZU5vICsxXCIgPjwvc2ltcG8tcGFnbmluYXRpb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJlbXB0eS1jYXJ0XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC1pbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxpbWcgc3R5bGU9XCJoZWlnaHQ6IDE1MHB4OyB3aWR0aDogMTUwcHg7XCIgc3JjPVwiaHR0cHM6Ly9wcm9kLXNpbXBvLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9wcm9kLWltYWdlcy8xMDcyMTNjMTcxNjU0MzMzNDA0MGVtcHR5LWNhcnQucG5nXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmctbWVkaXVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICBQcm9kdWN0IGxpc3QgaXMgZW1wdHlcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgbXQtNFwiPlxyXG4gICAgICAgICAgICAgICAgTG9va3MgbGlrZSBubyBpdGVtIGlzIHByZXNlbnQgd2l0aCBmaWx0ZXIuIEdvIGFoZWFkICYgZXhwbG9yZSB0b3AgY2F0ZWdvcmllcy5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGVkaXR9XCIgKm5nSWY9XCJzaG93RWRpdG9yc1wiPlxyXG4gICAgICA8c2ltcG8taG92ZXItZWxlbWVudHMgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiIFtlZGl0T3B0aW9uc109XCJlZGl0XCI+PC9zaW1wby1ob3Zlci1lbGVtZW50cz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dEZWxldGVcIiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGRlbGV0ZX1cIj5cclxuICAgICAgPHNpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50IFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIj48L3NpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9zZWN0aW9uPlxyXG48L25nLWNvbnRhaW5lcj5cclxuPG5neC1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmdcIiBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcclxuICB3aWR0aDogJzEwMCUnLFxyXG4gIGhlaWdodDogJzQwdmgnLFxyXG4gICdib3JkZXItcmFkaXVzJzogJzEwcHgnLFxyXG4gICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsXHJcbiAgJ3JpZ2h0JzogJzVweCdcclxufVwiPlxyXG48L25neC1za2VsZXRvbi1sb2FkZXI+Il19
417
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwRixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUt4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9C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LFdBQVc7Z0JBQ1gsa0JBQWtCLHlGQUVsQixtQkFBbUIsMEdBQ25CLG1CQUFtQixtRkFDbkIsY0FBYyxnRkFDZCx3QkFBd0Isb0hBQ3hCLE9BQU8sMElBQ1Asb0JBQW9CLDhCQUNwQixjQUFjLG9pQkFDZCxhQUFhLHFEQUNiLFdBQVc7OzJGQU1GLG9CQUFvQjtrQkEzQmhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCxvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2Ysb0JBQW9CO3dCQUNwQixXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsT0FBTzt3QkFDUCxtQkFBbUI7d0JBQ25CLG1CQUFtQjt3QkFDbkIsY0FBYzt3QkFDZCx3QkFBd0I7d0JBQ3hCLE9BQU87d0JBQ1Asb0JBQW9CO3dCQUNwQixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsV0FBVztxQkFDWixhQUNVLENBQUMsY0FBYyxDQUFDOzswQkFnQnhCLE1BQU07MkJBQUMsV0FBVztpU0FYWixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkErQ04sYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJdGVtVmFyaWFudCwgUHJvZHVjdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb250ZW50Rml0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbnRlbnQtZml0LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NlY3Rpb25zL0Jhc2VTZWN0aW9uJztcbmltcG9ydCB7IFByb2R1Y3RMaXN0Q29udGVudE1vZGFsLCBQcm9kdWN0TGlzdE1vZGFsLCBQcm9kdWN0TGlzdFN0eWxlc01vZGFsIH0gZnJvbSAnLi9wcm9kdWN0LWxpc3QubW9kYWwnO1xuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLy4uLy4uL3NlcnZpY2VzL3Jlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBCdXR0b25Nb2RlbCB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0U2xpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGVyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IFBhZ25pbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFnbmluYXRpb24vcGFnbmluYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE9yZGVyZWRJdGVtcyB9IGZyb20gJy4uLy4uL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdEJvdHRvbVNoZWV0LCBNYXRCb3R0b21TaGVldE1vZHVsZSwgTWF0Qm90dG9tU2hlZXRSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9ib3R0b20tc2hlZXQnO1xuaW1wb3J0IHtNYXRSYWRpb01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEJVU0lORVNTX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9idXNpbmVzcy5jb25zdGFudCc7XG5pbXBvcnQgeyBGb3JtYXRlQW1vdW50IH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvYW1vdW50LnBpcGUnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XG5pbXBvcnQge0RyYWdEcm9wTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7Q2RrRHJhZ30gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbnRlcmZhY2UgQmFzZU1vZGVsIHtcbiAgb3B0aW9uOiBzdHJpbmcsXG4gIGlkOiBzdHJpbmcsXG4gIGltZ1VybDogc3RyaW5nLFxuICBzdGF0dXM6IGJvb2xlYW5cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ltcG8tcHJvZHVjdC1saXN0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgU2ltcG9Db21wb25lbnRNb2R1bGUsXG4gICAgTWF0U2xpZGVyTW9kdWxlLFxuICAgIFBhZ25pbmF0aW9uQ29tcG9uZW50LFxuICAgIC8vZGlyZWN0aXZlXG4gICAgQW5pbWF0aW9uRGlyZWN0aXZlLFxuICAgIENka0RyYWcsXG4gICAgQmFja2dyb3VuZERpcmVjdGl2ZSxcbiAgICBDb250ZW50Rml0RGlyZWN0aXZlLFxuICAgIEhvdmVyRGlyZWN0aXZlLFxuICAgIEJ1dHRvbkRpcmVjdGl2ZURpcmVjdGl2ZSxcbiAgICBNYXRJY29uLFxuICAgIE1hdEJvdHRvbVNoZWV0TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIEZvcm1hdGVBbW91bnQsXG4gICAgVG9hc3RNb2R1bGVcbiAgXSxcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2R1Y3QtbGlzdC5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TGlzdENvbXBvbmVudCBleHRlbmRzIEJhc2VTZWN0aW9uIHtcbiAgQElucHV0KCkgcmVzcG9uc2VEYXRhPzogUHJvZHVjdFtdXG4gIEBJbnB1dCgpIGRhdGE/OiBQcm9kdWN0TGlzdE1vZGFsO1xuICBASW5wdXQoKSBpbmRleD8gOiBudW1iZXI7XG4gIEBJbnB1dCgpIGVkaXQ/IDogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVsZXRlPyA6IGJvb2xlYW47XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBjb250ZW50PzogUHJvZHVjdExpc3RDb250ZW50TW9kYWw7XG4gIGJ1dHRvbj86IEJ1dHRvbk1vZGVsO1xuICB0b3RhbFBhZ2VzOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZSA6IEV2ZW50c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXRCb3R0b21TaGVldDogTWF0Qm90dG9tU2hlZXQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmdldFNjcmVlblNpemUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckJvdHRvbVNoZWV0UmVmOiBNYXRCb3R0b21TaGVldFJlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuICAvLyBwcml2YXRlIHNvcnRpbmdEaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNvcnRpbmdEaWFsb2dSZWY6IE1hdEJvdHRvbVNoZWV0UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHByaWNpbmdNaW46IG51bWJlciA9IDA7XG4gIHB1YmxpYyBwcmljaW5nTWF4OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgc29ydEJ5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHNlYXJjaFRleHQ6IHN0cmluZyA9IFwiXCI7XG5cbiAgcHJpdmF0ZSBVU0VSX0NBUlQ6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgVVNFUl9XSVNITElTVDogT3JkZXJlZEl0ZW1zW10gfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgbWluUHJvZHVjdFByaWNlOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgbWF4UHJvZHVjdFByaWNlOiBudW1iZXIgPSAwO1xuXG4gIC8vIHdpbGwgY29tZSBmcm9tIGJhY2tlbmQgYXMgc2hvcCBhbmQgcmVzdHVyYW50IGNhbiBoYXZlIGRpZmZyZW50IGZpbHRlcnNcbiAgcHVibGljIGZpbHRlcmluZ0FycmF5ID0gW1xuICAgIHsgbmFtZTogXCJMb3dlc3QgRmlyc3RcIiwgdmFsdWU6IFwibG93ZXN0UHJpY2VcIiB9LFxuICAgIHsgbmFtZTogXCJIaWdoZXN0IEZpcnN0XCIsIHZhbHVlOiBcImhpZ2hlc3RQcmljZVwiIH1cbiAgXTtcblxuICBzY3JlZW5XaWR0aDogbnVtYmVyID0gMDtcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgZ2V0U2NyZWVuU2l6ZSgpIHtcbiAgICB0aGlzLnNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIH1cblxuICBmaWx0ZXJMaXN0OiBhbnlbXSA9IFtcIldvbWVuXCIsIFwiTWVuXCJdO1xuICBzdHlsZXM/OiBQcm9kdWN0TGlzdFN0eWxlc01vZGFsO1xuICB0b3RhbENvdW50OiBudW1iZXIgPSAwO1xuICBwYWdlTm86IG51bWJlciA9IDA7XG4gIHNpemU6IG51bWJlciA9IDIwO1xuICBzZWFyY2hUeHQ6IHN0cmluZyA9IFwiXCI7XG4gIGZpbHRlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpe1xuICAgIHRoaXMuY29udGVudCA9IHRoaXMuZGF0YT8uY29udGVudDtcbiAgICB0aGlzLnN0eWxlcyA9IHRoaXMuZGF0YT8uc3R5bGVzO1xuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5kYXRhPy5hY3Rpb24uYnV0dG9uc1swXTtcbiAgICB0aGlzLl9ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uc3Vic2NyaWJlKChyZXNwb25zZSk9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xuICAgIH0pXG4gICAgdGhpcy5nZXRBbGxDYXRlZ29yaWVzKCk7XG4gICAgdGhpcy5nZXRBbGxDb2xsZWN0aW9ucygpO1xuXG4gICAgdGhpcy5taW5Qcm9kdWN0UHJpY2UgPSB0aGlzLnByaWNpbmdNaW4gPSB0aGlzLmRhdGE/LnN0eWxlcy5taW5QcmljZSA/PyAwO1xuICAgIHRoaXMubWF4UHJvZHVjdFByaWNlID0gdGhpcy5wcmljaW5nTWF4ID0gdGhpcy5kYXRhPy5zdHlsZXMubWF4UHJpY2UgPz8gMTAwMDtcblxuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChxUGFyYW06IGFueSk9PiB7XG4gICAgICB0aGlzLnNlYXJjaFR4dCA9IHFQYXJhbVtcInNlYXJjaFR4dFwiXTtcbiAgICAgIHRoaXMucGFnZU5vID0gcVBhcmFtW1wicGFnZU5vXCJdID8gTnVtYmVyKHFQYXJhbVtcInBhZ2VOb1wiXSkgOiAxO1xuICAgICAgdGhpcy5zb3J0QnkgPSBxUGFyYW1bXCJzb3J0aW5nXCJdID8/IFwibG93ZXN0UHJpY2VcIjtcbiAgICAgIHRoaXMucHJpY2luZ01pbiA9IGlzTmFOKE51bWJlcihxUGFyYW1bXCJtaW5QcmljZVwiXSkpID8gdGhpcy5taW5Qcm9kdWN0UHJpY2UgOiBOdW1iZXIocVBhcmFtW1wibWluUHJpY2VcIl0pO1xuICAgICAgdGhpcy5wcmljaW5nTWF4ID0gaXNOYU4oTnVtYmVyKHFQYXJhbVtcIm1heFByaWNlXCJdKSkgPyB0aGlzLm1heFByb2R1Y3RQcmljZSA6IE51bWJlcihxUGFyYW1bXCJtYXhQcmljZVwiXSk7XG4gICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlDb2xsZWN0aW9uUGFyYW0ocVBhcmFtW1wiY2F0ZWdvcnlcIl0sIHFQYXJhbVtcImNvbGxlY3Rpb25zXCJdKTtcbiAgICB9KVxuICB9XG5cbiAgZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShxQ2F0ZWdvcmllczogYW55LCBxQ29sbGVjdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBxQ2F0ZWdvcmllcz8uc3BsaXQoXCIrXCIpPy5tYXAoKGNhdGVnb3J5OiBzdHJpbmcpPT4gY2F0ZWdvcnkucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpLnRvTG93ZXJDYXNlKCkpLmZpbHRlcigoY2F0ZWdvcnk6IHN0cmluZyk9PiBjYXRlZ29yeS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBjb2xsZWN0aW9ucyA9IHFDb2xsZWN0aW9ucz8uc3BsaXQoXCIrXCIpPy5tYXAoKGNvbGxlY3Rpb246IHN0cmluZyk9PiBjb2xsZWN0aW9uLnJlcGxhY2VBbGwoXCJfXCIsIFwiIFwiKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoKGNvbGxlY3Rpb246IHN0cmluZyk9PiBjb2xsZWN0aW9uLmxlbmd0aCA+IDApO1xuXG4gICAgdGhpcy5jYXRlZ29yaWVzPy5mb3JFYWNoKChjYXRlZ29yeSk9PiBjYXRlZ29yeS5zdGF0dXMgPSBjYXRlZ29yaWVzPy5pbmNsdWRlcyhjYXRlZ29yeT8ub3B0aW9uPy50b0xvd2VyQ2FzZSgpKSA/PyBmYWxzZSk7XG4gICAgdGhpcy5jb2xsZWN0aW9ucz8uZm9yRWFjaCgoY29sbGVjdGlvbik9PiBjb2xsZWN0aW9uLnN0YXR1cyA9IGNvbGxlY3Rpb25zPy5pbmNsdWRlcyhjb2xsZWN0aW9uPy5vcHRpb24/LnRvTG93ZXJDYXNlKCkpID8/IGZhbHNlKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmNhdGVnb3JpZXMsIHRoaXMuY29sbGVjdGlvbnMpO1xuICAgIHRoaXMuZmlsdGVyTGlzdCA9IFtcbiAgICAgIC4uLnRoaXMuY2F0ZWdvcmllcz8uZmlsdGVyKChjYXRlZ29yeTogYW55KT0+IGNhdGVnb3J5LnN0YXR1cykubWFwKChjYXRlZ29yeSk9PiB7IHJldHVybiB7IGlkOiBjYXRlZ29yeS5pZCwgbmFtZTogY2F0ZWdvcnkub3B0aW9uIH0gfSksXG4gICAgICAuLi50aGlzLmNvbGxlY3Rpb25zPy5maWx0ZXIoKGNvbGxlY3Rpb246IGFueSk9PiBjb2xsZWN0aW9uLnN0YXR1cykubWFwKChjb2xsZWN0aW9uKSA9PiB7IHJldHVybiB7IGlkOiBjb2xsZWN0aW9uLmlkLCBuYW1lOiBjb2xsZWN0aW9uLm9wdGlvbiB9IH0pXG4gICAgXTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmZpbHRlckxpc3QpO1xuICAgIHRoaXMuZmlsdGVySXRlbUxpc3QoKTtcbiAgfVxuXG4gIGdldEFsbENhdGVnb3JpZXMoKSB7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDYXRlZ29yaWVzKCkuc3Vic2NyaWJlKChyZXNwb25zZSk9PiB7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMgPSByZXNwb25zZS5maWx0ZXIoKGNhdGVnb3J5OiBhbnkpPT4gY2F0ZWdvcnkuZmVhdHVyZWRDb2xsZWN0aW9uIHx8IHRydWUpLm1hcCgoY2F0ZWdvcnk6IGFueSk9PiB7IHJldHVybiB7IG9wdGlvbjogY2F0ZWdvcnkuY2F0ZWdvcnlOYW1lLCBpZDogY2F0ZWdvcnkuY2F0ZWdvcnlJZCwgaW1nVXJsOiBjYXRlZ29yeS5pbWdVcmw/LlswXSwgc3RhdHVzOiBmYWxzZSB9IH0pO1xuICAgICAgY29uc3QgcVBhcmFtQ29sbGVjdGlvbnMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY29sbGVjdGlvbnNcIl07XG4gICAgICBjb25zdCBxUGFyYW1DYXRlZ29yeSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjYXRlZ29yeVwiXTtcbiAgICAgIHRoaXMuZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShxUGFyYW1DYXRlZ29yeSwgcVBhcmFtQ29sbGVjdGlvbnMpO1xuICAgIH0pO1xuICB9XG4gIGdldEFsbENvbGxlY3Rpb25zKCkge1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQ29sbGVjdGlvbnMoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKT0+IHtcbiAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSByZXNwb25zZS5maWx0ZXIoKGNvbGxlY3Rpb246IGFueSk9PiBjb2xsZWN0aW9uLmZlYXR1cmVkQ2F0ZWdvcnkgfHwgdHJ1ZSkubWFwKChjb2xsZWN0aW9uOiBhbnkpPT4geyByZXR1cm4geyBvcHRpb246IGNvbGxlY3Rpb24uY29sbGVjdGlvbk5hbWUsIGlkOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25JZCwgc3RhdHVzOiBmYWxzZSB9IH0pO1xuICAgICAgY29uc3QgcVBhcmFtQ29sbGVjdGlvbnMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiY29sbGVjdGlvbnNcIl07XG4gICAgICBjb25zdCBxUGFyYW1DYXRlZ29yeSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJjYXRlZ29yeVwiXTtcbiAgICAgIHRoaXMuZmlsdGVyQnlDYXRlZ29yeUNvbGxlY3Rpb25QYXJhbShxUGFyYW1DYXRlZ29yeSwgcVBhcmFtQ29sbGVjdGlvbnMpO1xuICAgIH0pXG4gIH1cblxuICByZW1vdmVGaWx0ZXIoZmlsdGVyOiBhbnkpIHtcbiAgICB0aGlzLmZpbHRlckxpc3QgPSB0aGlzLmZpbHRlckxpc3QuZmlsdGVyKChmKT0+IGYuaWQgIT0gZmlsdGVyLmlkKTtcbiAgICBjb25zdCBmaWx0ZXJMaXN0SWRzID0gdGhpcy5maWx0ZXJMaXN0Lm1hcCgoZmlsdGVyKT0+IGZpbHRlci5pZCk7XG4gICAgdGhpcy5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5KT0+IGNhdGVnb3J5LnN0YXR1cyA9IGZpbHRlckxpc3RJZHMuaW5jbHVkZXMoY2F0ZWdvcnkuaWQpKTtcbiAgICB0aGlzLmNvbGxlY3Rpb25zLmZvckVhY2goKGNvbGxlY3Rpb24pPT4gY29sbGVjdGlvbi5zdGF0dXMgPSBmaWx0ZXJMaXN0SWRzLmluY2x1ZGVzKGNvbGxlY3Rpb24uaWQpKTtcbiAgICB0aGlzLnBhZ2VObyA9IDE7XG4gICAgLy8gc29ydGluZyBzaG91bGQgYWRkXG4gICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcih0aGlzLnNvcnRCeSA/PyBcImxvd2VzdFByaWNlXCIpO1xuICB9XG5cbiAgZ2V0UHJvZHVjdFdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLnNjcmVlbldpZHRoID4gNDc1ID8gKHRoaXMuc2NyZWVuV2lkdGggPCAxMDI1ID8gJzI1JScgOiAnY2FsYygnICsgKCgxMDAgLyAodGhpcy5zdHlsZXM/LmVsZW1lbnRJblJvdyB8fCA0KSkpICsgJyUpJykgOiAodGhpcy5zdHlsZXM/Lm1vYmlsZUNvbHVtbiA9PT0gMSA/ICcxMDAlJyA6ICc1MCUnKVxuICB9XG5cbiAgcHJvY2VlZFRvUHJvZHVjdERlc2MocHJvZHVjdElkOiBhbnkpe1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZGV0YWlscyddLCB7IHF1ZXJ5UGFyYW1zOiB7IGlkOiBwcm9kdWN0SWQgfSB9KTtcbiAgICAvLyB0aGlzLl9ldmVudFNlcnZpY2UucmVkaXJlY3RUb1BhZ2UuZW1pdCh7cmVkaXJlY3RUbzogJy9kZXRhaWxzJywgZGF0YToge3Byb2R1Y3RJZDogcHJvZHVjdElkfX0pXG4gIH1cbiAgY2xlYXJGaWx0ZXIoKSB7XG4gICAgdGhpcy5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5KT0+IGNhdGVnb3J5LnN0YXR1cyA9IGZhbHNlKTtcbiAgICB0aGlzLmNvbGxlY3Rpb25zLmZvckVhY2goKGNvbGxlY3Rpb24pPT4gY29sbGVjdGlvbi5zdGF0dXMgPSBmYWxzZSk7XG4gICAgdGhpcy5wcmljaW5nTWluID0gdGhpcy5taW5Qcm9kdWN0UHJpY2U7XG4gICAgdGhpcy5wcmljaW5nTWF4ID0gdGhpcy5tYXhQcm9kdWN0UHJpY2U7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydsaXN0J10pO1xuICB9XG4gIHRvZ2dsZUl0ZW1Ub0ZhdihldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCwgcHJvZHVjdDogUHJvZHVjdCwgdHlwZTogJ0FERCcgfCAnUkVNT1ZFJykge1xuICAgIGlmICh0eXBlID09ICdBREQnKSB7XG4gICAgICBwcm9kdWN0LndoaXNsaXN0ID0gdHJ1ZTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1dpc2hsaXN0JywgZGV0YWlsOiAnSXRlbSBhZGRlZCB0byB5b3VyIHdpc2hsaXN0JyB9KTtcbiAgICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKTtcbiAgICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XG4gICAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlOyBcbiAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0Zhdm91cml0ZShwcm9kdWN0IGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50LnZhcmlhbnRJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHByb2R1Y3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSBmYWxzZTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ1dpc2hsaXN0JywgZGV0YWlsOiAnSXRlbSByZW1vdmVkIGZyb20geW91ciB3aXNobGlzdCcgfSk7XG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHByb2R1Y3QudmFyaWVudElkKTtcbiAgICB9XG4gICAgaWYgKHByb2R1Y3Qud2hpc2xpc3QpIHtcbiAgICAgIHRoaXMuVVNFUl9XSVNITElTVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHByb2R1Y3QsIHByb2R1Y3QudmFyaWVudElkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHRoaXMuVVNFUl9XSVNITElTVD8uZmlsdGVyKChpdGVtOiBPcmRlcmVkSXRlbXMpPT4gaXRlbS52YXJpZW50SWQgIT0gcHJvZHVjdC52YXJpZW50SWQpID8/IFtdO1xuICAgIH1cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBhZGRJdGVtVG9DYXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50LCBwcm9kdWN0OiBQcm9kdWN0LCB0eXBlOiAnQUREJyB8ICdTVUJTVFJBQ1QnKSB7XG4gICAgaWYgKHRoaXMuaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KSkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3dhcm4nLCBzdW1tYXJ5OiAnQ2FydCcsIGRldGFpbDogJ0l0ZW0gaXMgbm90IGF2YWlsYWJsZSBhcyBvZiBub3cuIFdlIHdpbGwgbm90aWZ5IHlvdSBvbmNlIGF2YWlsYWJsZScgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2R1Y3QucXVhbnRpdHkgKz0gKHR5cGUgPT0gJ0FERCcgPyAxIDogLTEpOyBcbiAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpO1xuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XG4gICAgICAgIGl0ZW1WYXJpZW50LnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHByb2R1Y3QsIGl0ZW1WYXJpZW50LnZhcmlhbnRJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvQ2FydChwcm9kdWN0KTtcbiAgICB9XG4gICAgaWYgKHByb2R1Y3QucXVhbnRpdHkpIHtcbiAgICAgIGxldCBpc1ByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpPT4ge1xuICAgICAgICBpZiAoaXRlbS52YXJpZW50SWQgPT0gcHJvZHVjdC52YXJpZW50SWQpIHtcbiAgICAgICAgICBpdGVtLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgICAgICAgICBpc1ByZXNlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKCFpc1ByZXNlbnQpXG4gICAgICAgIHRoaXMuVVNFUl9DQVJUPy5wdXNoKG5ldyBPcmRlcmVkSXRlbXMocHJvZHVjdCwgcHJvZHVjdC52YXJpZW50SWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5VU0VSX0NBUlQgPSB0aGlzLlVTRVJfQ0FSVD8uZmlsdGVyKChpdGVtOiBPcmRlcmVkSXRlbXMpPT4gaXRlbS52YXJpZW50SWQgIT0gcHJvZHVjdC52YXJpZW50SWQpID8/IFtdO1xuICAgIH1cbiAgfVxuICBzZWFyY2hQcm9kdWN0KCkge1xuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkgPz8gXCJsb3dlc3RQcmljZVwiKTtcbiAgfVxuICBcbiAgc2VsZWN0VmFyaWVudChwcm9kdWN0OiBQcm9kdWN0LCB2YXJpZW50OiBJdGVtVmFyaWFudCkge1xuICAgIC8vIG5lZGQgdG8gY2hhbmdlXG4gICAgcHJvZHVjdC52YXJpZW50SWQgPSB2YXJpZW50LnZhcmlhbnRJZDtcbiAgICBwcm9kdWN0Lml0ZW1JbWFnZXMgPSB2YXJpZW50LnZhcmlhbnRJbWFnZXM7XG4gICAgcHJvZHVjdC5wcmljZSA9IHZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcbiAgICBwcm9kdWN0Lml0ZW1JbnZlbnRvcnkgPSB2YXJpZW50Lml0ZW1JbnZlbnRvcnk7XG4gICAgcHJvZHVjdC5xdWFudGl0eSA9IHRoaXMuZ2V0VmFyaWVudFF1YW50aXR5KHZhcmllbnQpO1xuICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0aGlzLmlzVmFyaWVudFByZXNlbnRJbldpc2h0bGlzdCh2YXJpZW50KTtcbiAgfVxuICBwcml2YXRlIGdldFZhcmllbnRRdWFudGl0eShwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBudW1iZXIge1xuICAgIGxldCBpdGVtUXVhbnRpdHk6IG51bWJlciA9IDA7XG4gICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcyk9PiB7XG4gICAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIFxuICAgICAgICAgIGl0ZW1RdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XG4gICAgfSlcbiAgICByZXR1cm4gaXRlbVF1YW50aXR5O1xuICB9XG4gIHByaXZhdGUgaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IGJvb2xlYW4ge1xuICAgIGxldCBwcmVzZW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpPT4ge1xuICAgICAgICBpZiAocHJvZHVjdFZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKSBcbiAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcbiAgICB9KVxuICAgIHJldHVybiBwcmVzZW50O1xuICB9XG4gIGdvVG9Ib21lKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcbiAgfVxuXG4gIGNhdGVnb3JpZXM6IEJhc2VNb2RlbFtdID0gW107XG4gIGNvbGxlY3Rpb25zOiBCYXNlTW9kZWxbXSA9IFtdO1xuICBhcHBseUZpbHRlcihjYXRlZ29yeT86YW55LCB0eXBlPzogJ1NPUlQnfCdGSUxURVInKSB7XG4gICAgbGV0IHNvcnRpbmcgPSBcIlwiO1xuICAgIHRoaXMucGFnZU5vID0gMTtcblxuICAgIGlmICh0eXBlID09IFwiRklMVEVSXCIpXG4gICAgICBjYXRlZ29yeS5zdGF0dXMgPSAhY2F0ZWdvcnkuc3RhdHVzO1xuICAgIGVsc2UgaWYgKHR5cGUgPT0gXCJTT1JUXCIpXG4gICAgICBzb3J0aW5nID0gY2F0ZWdvcnk/LnRhcmdldD8udmFsdWU7XG5cbiAgICB0aGlzLmZpbHRlckJvdHRvbVNoZWV0UmVmPy5kaXNtaXNzKCk7XG4gICAgdGhpcy5uYXZpZ2F0ZUZpbHRlcihzb3J0aW5nKTtcbiAgfVxuXG4gIG5hdmlnYXRlRmlsdGVyKHNvcnRpbmc6IHN0cmluZykge1xuXG4gICAgbGV0IHNlbGVjdGVkQ2F0ZWdvcnkgPSBcIlwiO1xuICAgIGxldCBzZWxlY3RlZENvbGxlY3Rpb24gPSBcIlwiO1xuICAgIHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoKGNhdGVnb3J5KT0+IGNhdGVnb3J5LnN0YXR1cykubWFwKChjYXRlZ29yeSk9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jYXRlZ29yeSxcbiAgICAgICAgc2x1ZzogY2F0ZWdvcnkub3B0aW9uLnJlcGxhY2VBbGwoXCIgXCIsIFwiX1wiKVxuICAgICAgfVxuICAgIH0pLmZvckVhY2goKGNhdGVnb3J5KT0+IHNlbGVjdGVkQ2F0ZWdvcnkgKz0gKGNhdGVnb3J5LnNsdWcgKyBcIitcIikpO1xuXG4gICAgdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoKGNvbGxlY3Rpb24pPT4gY29sbGVjdGlvbi5zdGF0dXMpLm1hcCgoY29sbGVjdGlvbik9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb2xsZWN0aW9uLFxuICAgICAgICBzbHVnOiBjb2xsZWN0aW9uLm9wdGlvbi5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcbiAgICAgIH1cbiAgICB9KS5mb3JFYWNoKChjb2xsZWN0aW9uKT0+IHNlbGVjdGVkQ29sbGVjdGlvbiArPSAoY29sbGVjdGlvbi5zbHVnICsgXCIrXCIpKTtcblxuICAgIHRoaXMuc29ydGluZ0RpYWxvZ1JlZj8uZGlzbWlzcygpO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbGlzdCddLCB7cXVlcnlQYXJhbXM6IHttaW5QcmljZTogdGhpcy5wcmljaW5nTWluLCBtYXhQcmljZTogdGhpcy5wcmljaW5nTWF4LCBjYXRlZ29yeTogc2VsZWN0ZWRDYXRlZ29yeSwgY29sbGVjdGlvbnM6IHNlbGVjdGVkQ29sbGVjdGlvbiwgc29ydGluZzogc29ydGluZywgcGFnZU5vOiB0aGlzLnBhZ2VObywgc2VhcmNoVHh0OiB0aGlzLnNlYXJjaFRleHR9fSk7XG4gIH1cblxuICBmaWx0ZXJJdGVtTGlzdCgpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uSWRzID0gdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoKGNvbGxlY3Rpb24pPT4gY29sbGVjdGlvbi5zdGF0dXMpLm1hcCgoY29sbGVjdGlvbik9PiBjb2xsZWN0aW9uLmlkKTtcbiAgICBjb25zdCBjYXRlZ29yeUlkcyA9IHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoKGNhdGVnb3J5KT0+IGNhdGVnb3J5LnN0YXR1cykubWFwKChjYXRlZ29yeSk9PiBjYXRlZ29yeS5pZCk7XG4gICAgdGhpcy5maWx0ZXJMb2FkaW5nID0gdHJ1ZTtcbiAgICBcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEZpbHRlcmVkUHJvZHVjdChjb2xsZWN0aW9uSWRzLCBjYXRlZ29yeUlkcywgdGhpcy5zZWFyY2hUeHQsIHRoaXMucHJpY2luZ01pbiwgdGhpcy5wcmljaW5nTWF4LCB0aGlzLnNvcnRCeSA/PyBcImxvd2VzdFByaWNlXCIsIHRoaXMucGFnZU5vIC0xLCB0aGlzLnNpemUpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSk9PiB7XG4gICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICB0aGlzLnRvdGFsQ291bnQgPSByZXNwb25zZS5jb3VudDtcbiAgICAgIHRoaXMudG90YWxQYWdlcyA9IE1hdGguY2VpbChyZXNwb25zZS5jb3VudCAvIHRoaXMuc2l6ZSk7XG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJDYXJ0KCkudGhlbigoY2FydFJlc3BvbnNlKT0+IHtcbiAgICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5VU0VSX0NBUlQgPSBjYXJ0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/LmZvckVhY2goKHByb2R1Y3Q6IFByb2R1Y3QpPT4ge1xuICAgICAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcyk9PiB7XG4gICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0Lml0ZW1JZCkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0Py5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50ID0gcHJvZHVjdD8uaXRlbVZhcmlhbnQ/LlswXTtcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcyA/PyBbXTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wcmljZSA9IGl0ZW1WYXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwcm9kdWN0LnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcldoaXNobGlzdCgpLnRoZW4oKHdpc2hsaXN0UmVzcG9uc2UpPT4ge1xuICAgICAgICB3aXNobGlzdFJlc3BvbnNlLm9uc3VjY2VzcyA9ICh3aGlzbGlzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHdoaXNsaXN0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/LmZvckVhY2goKHByb2R1Y3Q6IFByb2R1Y3QpPT4ge1xuICAgICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpPT4ge1xuICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gcHJvZHVjdC5pdGVtSWQpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCA9IHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5bMF07XG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50Py52YXJpYW50SW1hZ2VzID8/IFtdO1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LnByaWNlID0gaXRlbVZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC53aGlzbGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3Qud2hpc2xpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgXG4gICAgICB0aGlzLmZpbHRlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KVxuICB9XG5cbiAgb3BlbkZpbHRlcihGaWx0ZXJTZWN0aW9uOiBhbnkpIHtcblxuICAgIHRoaXMuZmlsdGVyQm90dG9tU2hlZXRSZWYgPSB0aGlzLm1hdEJvdHRvbVNoZWV0Lm9wZW4oRmlsdGVyU2VjdGlvbik7XG4gIH1cbiAgb3BlblNvcnRpbmcoU29ydGluZ1NlY3Rpb246IGFueSkge1xuICAgIHRoaXMuc29ydGluZ0RpYWxvZ1JlZiA9IHRoaXMubWF0Qm90dG9tU2hlZXQub3BlbihTb3J0aW5nU2VjdGlvbiwge30pO1xuICB9XG4gIHBhZ2luYXRpb25DaGFuZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdlTm8gPSBwYWdlO1xuICAgIHRoaXMubmF2aWdhdGVGaWx0ZXIodGhpcy5zb3J0QnkgPz8gXCJsb3dlc3RQcmljZVwiKTtcbiAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gIH1cblxuICBjbG9zZURpYWxvZygpIHtcbiAgICB0aGlzLnNvcnRpbmdEaWFsb2dSZWY/LmRpc21pc3MoKTtcbiAgfVxuXG4gIGlzSXRlbU91dE9mU3RvY2socHJvZHVjdDogUHJvZHVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwcm9kdWN0Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA9PSAwO1xuICB9XG4gIGdldEl0ZW1WYXJpZW50KHByb2R1Y3Q6IFByb2R1Y3QsIHZhcmllbnRJZDogc3RyaW5nKTogSXRlbVZhcmlhbnQgfCBudWxsIHtcbiAgICBsZXQgc2VsZWN0ZWRWYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSBudWxsO1xuICAgIHByb2R1Y3Q/Lml0ZW1WYXJpYW50Py5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCk9PiB7XG4gICAgICBpZiAodmFyaWVudC52YXJpYW50SWQgPT0gdmFyaWVudElkKVxuICAgICAgICBzZWxlY3RlZFZhcmllbnQgPSB2YXJpZW50O1xuICAgIH0pXG4gICAgXG4gICAgcmV0dXJuIHNlbGVjdGVkVmFyaWVudDtcbiAgfVxuICBlZGl0U2VjdGlvbigpe1xuICAgIFxuICAgIHRoaXMuX2V2ZW50U2VydmljZS50b2dnbGVFZGl0b3JFdmVudC5lbWl0KGZhbHNlKTtcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmVkaXRTZWN0aW9uLmVtaXQoe2RhdGE6dGhpcy5kYXRhfSk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPCA0NzU7XG4gIH1cbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEJVU0lORVNTX0NPTlNUQU5UUy5DVVJSRU5DWTtcbiAgfVxuICBnZXQgbWluU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnRvdGFsQ291bnQsICgoKHRoaXMucGFnZU5vIC0xKSp0aGlzLnNpemUgKzEpICsgdGhpcy5zaXplKSk7XG4gIH1cbn1cbiIsIjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCI+PC9wLXRvYXN0PlxuXG48ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIiAqbmdJZj1cImlzTW9iaWxlXCI+XG4gIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFByb2R1Y3QuLlwiIGFyaWEtbGFiZWw9XCJTZWFyY2ggUHJvZHVjdFwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFByb2R1Y3QoKVwiPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XG4gIDxzZWN0aW9uIFtpZF09XCJkYXRhPy5pZFwiIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHRvdGFsLWNvbnRhaW5lclwiIFtzaW1wb0xheW91dF09XCJzdHlsZXM/LmxheW91dFwiIChjbGljayk9XCJlZGl0U2VjdGlvbigpXCIgIHNpbXBvSG92ZXJcbiAgICAoaG92ZXJpbmcpPVwic2hvd0VkaXRUYWJzKCRldmVudClcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtzdHlsZS5wYWRkaW5nVG9wLnB4XT1cImlzTW9iaWxlID8gJzAgIWltcG9ydGFudCcgOiAnJ1wiPlxuXG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaXNNb2JpbGVcIiBjbGFzcz1cImJhY2stdG8taG9tZVwiIGNka0RyYWcgKGNsaWNrKT1cImdvVG9Ib21lKClcIj5cbiAgICAgIDxtYXQtaWNvbj5ob21lPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj4gLS0+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMCBvbmx5RGVza3RvcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci10b3Atc2VjdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtYmFzZWxpbmVcIiBzdHlsZT1cIndpZHRoOiAyMCU7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXIgYm9keS1sYXJnZVwiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICAgICAgRmlsdGVyc1xuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCIgKGNsaWNrKT1cImNsZWFyRmlsdGVyKClcIiBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgICAgIENsZWFyIGFsbFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiBzdHlsZT1cIndpZHRoOiA4MCU7bWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtNiBmdy1ub3JtYWxcIiBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlNob3dpbmcge3socGFnZU5vIC0xKSpzaXplICsxfX0te3ttaW5TaXplfX0gb2Yge3sgdG90YWxDb3VudCB9fSBSZXN1bHRzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwiZ2FwOiAxMHB4O1wiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTYgZnctbm9ybWFsIG1yLTNcIj5Tb3J0IGJ5PC9kaXY+XG4gICAgICAgICAgPHNlbGVjdCAoY2hhbmdlKT1cImFwcGx5RmlsdGVyKCRldmVudCwgJ1NPUlQnKVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJmaWx0ZXIudmFsdWVcIiAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGZpbHRlcmluZ0FycmF5XCI+e3tmaWx0ZXIubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBvbmx5TW9iaWxlXCIgc3R5bGU9XCJnYXA6IDVweDsgb3ZlcmZsb3cteDogYXV0bztcIiBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGZpbHRlckxpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiB3LTEwMCBjaGlwXCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgICAgICA8c3Bhbj57e2ZpbHRlci5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7IG1hcmdpbi1sZWZ0OiA1cHg7XCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihmaWx0ZXIpXCI+WDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXNpZGUgb25seURlc2t0b3BcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkZpbHRlclNlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9BbmltYXRpb25dPVwic3R5bGVzPy5hbmltYXRpb25cIiBjbGFzcz1cInJpZ2h0LXNpZGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXJMb2FkaW5nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1wYXJlbnRcIiAqbmdJZj1cInJlc3BvbnNlRGF0YSAmJiByZXNwb25zZURhdGEubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIHJlc3BvbnNlRGF0YVwiIGNsYXNzPVwicHJvZHVjdFwiIFtzdHlsZS53aWR0aF09XCJnZXRQcm9kdWN0V2lkdGgoKVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhKHByb2R1Y3QuaXRlbUltYWdlcz8ubGVuZ3RoICYmIHByb2R1Y3QuaXRlbUltYWdlcz8uWzBdPy5pbWdVcmwpXCIgY2xhc3M9XCJkZWZhdWx0LWltYWdlIHBvc2l0aW9uLXJlbGF0aXZlXCIgKGNsaWNrKT1cInByb2NlZWRUb1Byb2R1Y3REZXNjKHByb2R1Y3QuaXRlbUlkKVwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJGYXZvdXJpdGVUYWdzOyBjb250ZXh0OiB7ZGF0YTogcHJvZHVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvZHVjdC5pdGVtSW1hZ2VzPy5sZW5ndGggJiYgcHJvZHVjdC5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybFwiIGNsYXNzPVwiZGVmYXVsdC1pbWFnZSBwb3NpdGlvbi1yZWxhdGl2ZVwiIChjbGljayk9XCJwcm9jZWVkVG9Qcm9kdWN0RGVzYyhwcm9kdWN0Lml0ZW1JZClcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgICBbc3JjXT1cInByb2R1Y3Q/Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsID8/ICdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiIGFsdD1cIlwiIGNsYXNzPVwicHJvZHVjdC1pbWdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJGYXZvdXJpdGVUYWdzOyBjb250ZXh0OiB7ZGF0YTogcHJvZHVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiB3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtbmFtZSBoZWFkaW5nLWxhcmdlIHctMTAwIHRleHQtbGVmdCB0cmltLXRleHRcIiBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7IHByb2R1Y3QubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQtbGlzdFwiICpuZ0lmPVwicHJvZHVjdD8uaXRlbVZhcmlhbnQ/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpZW50IG9mIHByb2R1Y3Q/Lml0ZW1WYXJpYW50OyBsZXQgaWR4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiICAgW3NyY109XCJ2YXJpZW50LnZhcmlhbnRJbWFnZXM/LlswXT8uaW1nVXJsID8/ICdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiIGFsdD1cIlwiIGNsYXNzPVwidmFyaWVudFwiIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQtdmFyaWVudCc6IHZhcmllbnQudmFyaWFudElkID09IHByb2R1Y3QudmFyaWVudElkfVwiIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJ2YXJpZW50LnZhcmlhbnRJZCA9PSBwcm9kdWN0LnZhcmllbnRJZCA/ICdibHVlJyA6ICd0cmFuc3BhcmVudCdcIiAoY2xpY2spPVwic2VsZWN0VmFyaWVudChwcm9kdWN0LCB2YXJpZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2UgYm9keS1sYXJnZSB0ZXh0LWxlZnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjb3VudGVkLXByaWNlXCJbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e3Byb2R1Y3QucHJpY2UuZGlzY291bnRlZFByaWNlfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5kaXNwbGF5Py5zaG93QnV0dG9uXCIgY2xhc3M9XCJhZGQtdG8tY2FydC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtpZF09XCJkYXRhPy5pZCsoYnV0dG9uPy5pZCB8fCAnJylcIiBbYnV0dG9uU3R5bGVdPVwiYnV0dG9uPy5zdHlsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAqbmdJZj1cIiFwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpXCIgKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnQUREJylcIj57e2J1dHRvbj8uY29udGVudD8ubGFiZWwgPz8gJ0FkZCB0byBDYXJ0J319PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1YW50aXR5XCIgKm5nSWY9XCJwcm9kdWN0LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKHByb2R1Y3QpXCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImFkZEl0ZW1Ub0NhcnQoJGV2ZW50LCBwcm9kdWN0LCAnU1VCU1RSQUNUJylcIj4tPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3twcm9kdWN0LnF1YW50aXR5fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiYWRkSXRlbVRvQ2FydCgkZXZlbnQsIHByb2R1Y3QsICdBREQnKVwiPis8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cIm91dC1vZi1zdG9ja1wiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9jayhwcm9kdWN0KVwiPk91dCBPZiBTdG9jazwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNpbXBvLXBhZ25pbmF0aW9uIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDMwcHg7XCIgW3RvdGFsUGFnZXNdPVwidG90YWxQYWdlc1wiIFtjdXJyZW50UGFnZV09XCJwYWdlTm9cIiAocGFnaW5hdGlvbkNoYW5nZSk9XCJwYWdpbmF0aW9uQ2hhbmdlKCRldmVudClcIj48L3NpbXBvLXBhZ25pbmF0aW9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZW1wdHktY2FydFwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5sZW5ndGggPT0gMFwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0LWltYWdlXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgc3R5bGU9XCJoZWlnaHQ6IDE1MHB4OyB3aWR0aDogMTUwcHg7XCIgc3JjPVwiaHR0cHM6Ly9wcm9kLXNpbXBvLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9wcm9kLWltYWdlcy8xMDcyMTNjMTcxNjU0MzMzNDA0MGVtcHR5LWNhcnQucG5nXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmctbWVkaXVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBsaXN0IGlzIGVtcHR5XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBtdC00XCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgTG9va3MgbGlrZSBubyBpdGVtIGlzIHByZXNlbnQgd2l0aCBmaWx0ZXIuIEdvIGFoZWFkICYgZXhwbG9yZSB0b3AgY2F0ZWdvcmllcy5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiZmlsdGVyTG9hZGluZ1wiIGNvdW50PVwiMVwiIGFwcGVhcmFuY2U9XCJjaXJjbGVcIiBbdGhlbWVdPVwie1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsXG4gICAgICAgICAgJ3Bvc2l0aW9uJzogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAncmlnaHQnOiAnNXB4J1xuICAgICAgICB9XCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWZpbHRlclwiW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmaWx0ZXItdGV4dFwiIHN0eWxlPVwiZ2FwOiAxMHB4XCIgKGNsaWNrKT1cIm9wZW5Tb3J0aW5nKFNvcnRpbmdTZWN0aW9uKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5zb3J0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3Bhbj5Tb3J0IGJ5PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmaWx0ZXItdGV4dFwiIHN0eWxlPVwiZ2FwOiAxMHB4XCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXIoRmlsdGVyU2VjdGlvbilcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0fVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cbiAgICAgIDxzaW1wby1ob3Zlci1lbGVtZW50cyBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCIgW2VkaXRPcHRpb25zXT1cImVkaXRcIiBbaXNFY29tbWVyY2VdPVwidHJ1ZVwiPjwvc2ltcG8taG92ZXItZWxlbWVudHM+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInNob3dEZWxldGVcIiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGRlbGV0ZX1cIj5cbiAgICAgIDxzaW1wby1kZWxldGUtaG92ZXItZWxlbWVudCBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCI+PC9zaW1wby1kZWxldGUtaG92ZXItZWxlbWVudD5cbiAgICA8L2Rpdj5cbiAgPC9zZWN0aW9uPlxuPC9uZy1jb250YWluZXI+XG48bmd4LXNrZWxldG9uLWxvYWRlciAqbmdJZj1cImlzTG9hZGluZ1wiIGNvdW50PVwiMVwiIGFwcGVhcmFuY2U9XCJjaXJjbGVcIiBbdGhlbWVdPVwie1xuICB3aWR0aDogJzEwMCUnLFxuICBoZWlnaHQ6ICc0MHZoJyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsXG4gICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsXG4gICdyaWdodCc6ICc1cHgnXG59XCI+XG48L25neC1za2VsZXRvbi1sb2FkZXI+XG48bmctdGVtcGxhdGUgI0Zhdm91cml0ZVRhZ3MgbGV0LXByb2R1Y3Q9XCJkYXRhXCI+XG4gIDxtYXQtaWNvbiBjbGFzcz1cImZhdi1pY29uXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwidG9nZ2xlSXRlbVRvRmF2KCRldmVudCwgcHJvZHVjdCwgJ0FERCcpXCIgKm5nSWY9XCIhcHJvZHVjdC53aGlzbGlzdFwiPmZhdm9yaXRlX2JvcmRlcjwvbWF0LWljb24+XG4gIDxtYXQtaWNvbiBjbGFzcz1cImZhdi1pY29uXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwidG9nZ2xlSXRlbVRvRmF2KCRldmVudCwgcHJvZHVjdCwgJ1JFTU9WRScpXCIgKm5nSWY9XCJwcm9kdWN0LndoaXNsaXN0XCI+ZmF2b3JpdGU8L21hdC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNGaWx0ZXJTZWN0aW9uPlxuICA8c2VjdGlvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIG0tYXV0b1wiIHN0eWxlPVwid2lkdGg6IDk1JTtcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJMaXN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy0xMDAgY2hpcFwiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICAgICAgPHNwYW4+e3tmaWx0ZXIubmFtZX19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoZmlsdGVyKVwiPlg8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwiY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsXCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cbiAgICAgICAgU2hvcCBieSBjYXRlZ29yaWVzXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1vcHRpb25zXCIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXNcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoY2F0ZWdvcnksICdGSUxURVInKVwiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiXCIgaWQ9XCJcIiBbY2hlY2tlZF09XCJjYXRlZ29yeS5zdGF0dXNcIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidHJpbS10ZXh0XCI+e3tjYXRlZ29yeS5vcHRpb24gfCB1cHBlcmNhc2V9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2VjdGlvblwiICpuZ0lmPVwiY29sbGVjdGlvbnM/Lmxlbmd0aFwiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsXCI+XG4gICAgICAgIFNob3AgYnkgY29sbGVjdGlvbnNcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW9wdGlvbnNcIiAqbmdGb3I9XCJsZXQgY29sbGVjdGlvbiBvZiBjb2xsZWN0aW9uc1wiIChjbGljayk9XCJhcHBseUZpbHRlcihjb2xsZWN0aW9uLCAnRklMVEVSJylcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJcIiBpZD1cIlwiIFtjaGVja2VkXT1cImNvbGxlY3Rpb24uc3RhdHVzXCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRyaW0tdGV4dFwiPnt7Y29sbGVjdGlvbi5vcHRpb24gfCB1cHBlcmNhc2V9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwicHJpY2Utc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMgaGVhZGluZy1zbWFsbFwiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XG4gICAgICAgIFNob3AgYnkgcHJpY2VcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1zbGlkZXIgY2xhc3M9XCJtYXQtc2xpZGVyXCIgW21pbl09XCJtaW5Qcm9kdWN0UHJpY2VcIiBbbWF4XT1cIm1heFByb2R1Y3RQcmljZVwiIHN0eWxlPVwid2lkdGg6IDI1MHB4O1wiPlxuICAgICAgICAgIDxpbnB1dCBtYXRTbGlkZXJTdGFydFRodW1iIFsobmdNb2RlbCldPVwicHJpY2luZ01pblwiPlxuICAgICAgICAgIDxpbnB1dCBtYXRTbGlkZXJFbmRUaHVtYiBbKG5nTW9kZWwpXT1cInByaWNpbmdNYXhcIj5cbiAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2UtYnV0dG9uLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1zZWN0aW9uXCI+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoKVwiPkZpbHRlcjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByaWNlLXJhbmdlXCI+XG4gICAgICAgICAgUHJpY2U6IDxzcGFuIFtpbm5lckh0bWxdPSdjdXJyZW5jeSc+PC9zcGFuPnt7IHByaWNpbmdNaW4gfX0gLSA8c3BhbiBbaW5uZXJIdG1sXT0nY3VycmVuY3knPjwvc3Bhbj57eyBwcmljaW5nTWF4IHwgZm9ybWF0ZUFtb3VudCB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNDYXRlZ29yeUZpbHRlclNlY3Rpb24+XG4gIDxzZWN0aW9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeVwiPlxuICAgICAgICA8aW1nIFtzcmNdPVwiY2F0ZWdvcnkuaW1nVXJsXCI+XG4gICAgICAgIDxzcGFuPnt7IGNhdGVnb3J5Lm9wdGlvbiB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3NlY3Rpb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI1NvcnRpbmdTZWN0aW9uPlxuICA8c2VjdGlvbiBzdHlsZT1cInBhZGRpbmc6IDEwcHhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcyBoZWFkaW5nLXNtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtLWNlbnRlciBcIiBzdHlsZT1cInBhZGRpbmc6IDBweDtcIj5cbiAgICAgIDxzcGFuPlNvcnQgYnk8L3NwYW4+XG4gICAgICA8bWF0LWljb24gKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9kaXY+XG4gICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAqbmdGb3I9XCJsZXQgc29ydGluZ1R5cGUgb2YgZmlsdGVyaW5nQXJyYXlcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoJGV2ZW50LCAnU09SVCcpXCI+e3tzb3J0aW5nVHlwZS5uYW1lfX08L21hdC1yYWRpby1idXR0b24+XG4gICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gIDwvc2VjdGlvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=