@infrab4a/connect-angular 4.2.3-beta.1 → 4.2.3-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/angular-connect.module.d.ts +23 -23
  2. package/angular-elastic-search.module.d.ts +9 -9
  3. package/angular-firebase-auth.module.d.ts +11 -11
  4. package/angular-firestore.module.d.ts +17 -17
  5. package/angular-hasura-graphql.module.d.ts +16 -16
  6. package/consts/backend-url.const.d.ts +1 -1
  7. package/consts/category-structure.d.ts +1 -1
  8. package/consts/default-shop.const.d.ts +1 -1
  9. package/consts/es-config.const.d.ts +1 -1
  10. package/consts/firebase-const.d.ts +3 -3
  11. package/consts/hasura-options.const.d.ts +1 -1
  12. package/consts/index.d.ts +6 -6
  13. package/esm2022/angular-connect.module.mjs +97 -0
  14. package/esm2022/angular-elastic-search.module.mjs +34 -0
  15. package/esm2022/angular-firebase-auth.module.mjs +115 -0
  16. package/esm2022/angular-firestore.module.mjs +483 -0
  17. package/esm2022/angular-hasura-graphql.module.mjs +265 -0
  18. package/{esm2020 → esm2022}/consts/backend-url.const.mjs +1 -1
  19. package/{esm2020 → esm2022}/consts/category-structure.mjs +2 -2
  20. package/{esm2020 → esm2022}/consts/default-shop.const.mjs +2 -2
  21. package/{esm2020 → esm2022}/consts/es-config.const.mjs +2 -2
  22. package/{esm2020 → esm2022}/consts/firebase-const.mjs +4 -4
  23. package/{esm2020 → esm2022}/consts/hasura-options.const.mjs +2 -2
  24. package/{esm2020 → esm2022}/consts/index.mjs +7 -7
  25. package/{esm2020 → esm2022}/helpers/index.mjs +2 -2
  26. package/{esm2020 → esm2022}/helpers/mobile-operation-system-checker.helper.mjs +7 -7
  27. package/{esm2020 → esm2022}/index.mjs +6 -6
  28. package/{esm2020 → esm2022}/infrab4a-connect-angular.mjs +4 -4
  29. package/{esm2020 → esm2022}/services/auth.service.mjs +37 -37
  30. package/{esm2020 → esm2022}/services/cart.service.mjs +281 -285
  31. package/{esm2020 → esm2022}/services/catalog/adapters/category-structure.adapter.mjs +2 -2
  32. package/{esm2020 → esm2022}/services/catalog/adapters/index.mjs +4 -4
  33. package/{esm2020 → esm2022}/services/catalog/adapters/new-category-structure.adapter.mjs +41 -41
  34. package/{esm2020 → esm2022}/services/catalog/adapters/old-category-structure.adapter.mjs +23 -23
  35. package/{esm2020 → esm2022}/services/catalog/catalog.service.mjs +170 -170
  36. package/{esm2020 → esm2022}/services/catalog/category.service.mjs +51 -51
  37. package/{esm2020 → esm2022}/services/catalog/enums/index.mjs +2 -2
  38. package/{esm2020 → esm2022}/services/catalog/enums/product-sorts.enum.mjs +11 -11
  39. package/{esm2020 → esm2022}/services/catalog/index.mjs +7 -7
  40. package/{esm2020 → esm2022}/services/catalog/models/category-with-tree.model.mjs +10 -10
  41. package/{esm2020 → esm2022}/services/catalog/models/index.mjs +2 -2
  42. package/{esm2020 → esm2022}/services/catalog/types/index.mjs +2 -2
  43. package/{esm2020 → esm2022}/services/catalog/types/product-sort.type.mjs +2 -2
  44. package/{esm2020 → esm2022}/services/catalog/wishlist.service.mjs +107 -107
  45. package/{esm2020 → esm2022}/services/checkout-subscription.service.mjs +53 -53
  46. package/{esm2020 → esm2022}/services/checkout.service.mjs +71 -71
  47. package/{esm2020 → esm2022}/services/coupon.service.mjs +218 -218
  48. package/{esm2020 → esm2022}/services/helpers/index.mjs +2 -2
  49. package/{esm2020 → esm2022}/services/helpers/util.helper.mjs +18 -18
  50. package/{esm2020 → esm2022}/services/home-shop.service.mjs +114 -114
  51. package/{esm2020 → esm2022}/services/index.mjs +11 -11
  52. package/{esm2020 → esm2022}/services/order.service.mjs +30 -30
  53. package/{esm2020 → esm2022}/services/shipping.service.mjs +96 -96
  54. package/{esm2020 → esm2022}/services/types/index.mjs +3 -3
  55. package/{esm2020 → esm2022}/services/types/required-checkout-data.type.mjs +2 -2
  56. package/{esm2020 → esm2022}/services/types/required-checkout-subscription-data.type.mjs +2 -2
  57. package/esm2022/services/types/shipping-methods.type.mjs +2 -0
  58. package/{esm2020 → esm2022}/types/firebase-app-config.type.mjs +2 -2
  59. package/{esm2020 → esm2022}/types/index.mjs +2 -2
  60. package/{fesm2020 → fesm2022}/infrab4a-connect-angular.mjs +2159 -2163
  61. package/fesm2022/infrab4a-connect-angular.mjs.map +1 -0
  62. package/helpers/index.d.ts +1 -1
  63. package/helpers/mobile-operation-system-checker.helper.d.ts +3 -3
  64. package/index.d.ts +5 -5
  65. package/package.json +6 -12
  66. package/services/auth.service.d.ts +18 -18
  67. package/services/cart.service.d.ts +42 -42
  68. package/services/catalog/adapters/category-structure.adapter.d.ts +4 -4
  69. package/services/catalog/adapters/index.d.ts +3 -3
  70. package/services/catalog/adapters/new-category-structure.adapter.d.ts +12 -12
  71. package/services/catalog/adapters/old-category-structure.adapter.d.ts +10 -10
  72. package/services/catalog/catalog.service.d.ts +83 -83
  73. package/services/catalog/category.service.d.ts +15 -15
  74. package/services/catalog/enums/index.d.ts +1 -1
  75. package/services/catalog/enums/product-sorts.enum.d.ts +9 -9
  76. package/services/catalog/index.d.ts +6 -6
  77. package/services/catalog/models/category-with-tree.model.d.ts +4 -4
  78. package/services/catalog/models/index.d.ts +1 -1
  79. package/services/catalog/types/index.d.ts +1 -1
  80. package/services/catalog/types/product-sort.type.d.ts +2 -2
  81. package/services/catalog/wishlist.service.d.ts +22 -22
  82. package/services/checkout-subscription.service.d.ts +18 -18
  83. package/services/checkout.service.d.ts +23 -23
  84. package/services/coupon.service.d.ts +28 -28
  85. package/services/helpers/index.d.ts +1 -1
  86. package/services/helpers/util.helper.d.ts +3 -3
  87. package/services/home-shop.service.d.ts +25 -25
  88. package/services/index.d.ts +10 -10
  89. package/services/order.service.d.ts +13 -13
  90. package/services/shipping.service.d.ts +19 -19
  91. package/services/types/index.d.ts +2 -2
  92. package/services/types/required-checkout-data.type.d.ts +2 -2
  93. package/services/types/required-checkout-subscription-data.type.d.ts +2 -2
  94. package/services/types/shipping-methods.type.d.ts +12 -12
  95. package/types/firebase-app-config.type.d.ts +1 -1
  96. package/types/index.d.ts +1 -1
  97. package/esm2020/angular-connect.module.mjs +0 -97
  98. package/esm2020/angular-elastic-search.module.mjs +0 -34
  99. package/esm2020/angular-firebase-auth.module.mjs +0 -115
  100. package/esm2020/angular-firestore.module.mjs +0 -483
  101. package/esm2020/angular-hasura-graphql.module.mjs +0 -265
  102. package/esm2020/services/types/shipping-methods.type.mjs +0 -2
  103. package/fesm2015/infrab4a-connect-angular.mjs +0 -2309
  104. package/fesm2015/infrab4a-connect-angular.mjs.map +0 -1
  105. package/fesm2020/infrab4a-connect-angular.mjs.map +0 -1
@@ -1,218 +1,218 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { CheckoutTypes, CouponTypes, Exclusivities, Shops, Where, } from '@infrab4a/connect';
3
- import { from, of } from 'rxjs';
4
- import { concatMap, map } from 'rxjs/operators';
5
- import { DEFAULT_SHOP } from '../consts';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@infrab4a/connect";
8
- export class CouponService {
9
- constructor(couponRepository, defaultShop, orderRepository, categoryRepository) {
10
- this.couponRepository = couponRepository;
11
- this.defaultShop = defaultShop;
12
- this.orderRepository = orderRepository;
13
- this.categoryRepository = categoryRepository;
14
- this.emailIsFromCollaborator = (userEmail) => !!userEmail?.match(/@b4a.com.br/g);
15
- }
16
- checkCoupon(nickname, checkoutType, checkout, plan) {
17
- return from(this.couponRepository
18
- .find({
19
- filters: {
20
- nickname: { operator: Where.EQUALS, value: nickname },
21
- active: { operator: Where.EQUALS, value: true },
22
- },
23
- })
24
- .then((result) => result.data[0])).pipe(concatMap((coupon) => this.couponValidation(coupon, checkoutType)), concatMap((couponValid) => this.couponRulesValidation(couponValid, checkoutType, checkout, plan)), map((couponValidated) => couponValidated));
25
- }
26
- async couponValidation(coupon, checkoutType) {
27
- if (!coupon)
28
- throw 'Cupom inválido.';
29
- if (coupon?.beginAt && coupon?.beginAt.getTime() > new Date().getTime())
30
- throw 'Cupom inválido.';
31
- if (coupon?.expiresIn && coupon?.expiresIn.getTime() < new Date().getTime())
32
- throw 'Cupom expirado.';
33
- const isInShop = coupon.shopAvailability === Shops.ALL || coupon.shopAvailability === this.defaultShop;
34
- if (!isInShop)
35
- throw 'Cupom inválido para loja.';
36
- const isCheckoutType = coupon.checkoutType === CheckoutTypes.ALL || coupon.checkoutType === checkoutType;
37
- if (!isCheckoutType)
38
- throw 'Cupom inválido. Erro de checkout.';
39
- return coupon;
40
- }
41
- async couponRulesValidation(coupon, checkoutType, checkout, plan) {
42
- if (checkoutType == CheckoutTypes.SUBSCRIPTION) {
43
- if (coupon.plan && coupon.plan.toUpperCase() !== plan.toUpperCase())
44
- throw 'Cupom inválido para sua assinatura.';
45
- return coupon;
46
- }
47
- const validUser = this.coupomUserValidation(coupon, checkout?.user);
48
- if (!validUser)
49
- throw 'Usuário não elegível.';
50
- const couponUseLimits = this.getCouponUseLimits(coupon, checkoutType, checkout.user);
51
- if (!couponUseLimits.unlimited || couponUseLimits.limitedPerUser) {
52
- const orders = await this.getOrdersWithCoupon(coupon);
53
- if (!couponUseLimits.unlimited && couponUseLimits.total && orders.length >= couponUseLimits.total)
54
- throw 'Limite de uso atingido.';
55
- if (couponUseLimits.limitedPerUser) {
56
- const ordersWithUser = this.countOrdersWithUser(orders, checkout.user.email);
57
- if (ordersWithUser > 0)
58
- throw 'Limite de uso por usuário atingido.';
59
- }
60
- }
61
- const hasProductCategories = await this.hasProductCategories(coupon, checkout);
62
- if (!hasProductCategories)
63
- throw 'Seu carrinho não possui produtos elegíveis para desconto.';
64
- const hasMinSubTotal = await this.hasMinSubTotal(coupon, checkout);
65
- if (!hasMinSubTotal)
66
- throw `Valor mínimo de ${Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(coupon.minSubTotalValue)} não atingido`;
67
- return coupon;
68
- }
69
- calcDiscountSubscription(coupon, checkout) {
70
- let discount = 0;
71
- if (coupon.discount.subscription.type == CouponTypes.ABSOLUTE)
72
- discount = coupon.discount.subscription.value;
73
- else
74
- discount = checkout.subscriptionPlan.recurrencePrice * (coupon.discount.subscription.value / 100);
75
- return of(discount);
76
- }
77
- async calcDiscountShopping(coupon, checkout) {
78
- let discount = 0;
79
- if (checkout.user.isSubscriber && coupon.discount.subscriber.value) {
80
- discount = await this.calcDiscountByType(coupon.discount.subscriber.type, coupon.discount.subscriber.value, coupon.productsCategories, checkout);
81
- }
82
- else {
83
- discount = await this.calcDiscountByType(coupon.discount.non_subscriber.type, coupon.discount.non_subscriber.value, coupon.productsCategories, checkout);
84
- }
85
- return discount;
86
- }
87
- async calcDiscountByType(type, value, categories, checkout) {
88
- let discount = 0;
89
- let lineItensDiscount = await this.getLineItensEligebleForDiscount(categories, checkout);
90
- const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user, checkout.shop);
91
- if (type == CouponTypes.ABSOLUTE) {
92
- discount = value > subTotal ? subTotal : value;
93
- }
94
- else {
95
- discount = subTotal * (value / 100);
96
- }
97
- return discount;
98
- }
99
- async hasMinSubTotal(coupon, checkout) {
100
- if (!coupon.minSubTotalValue)
101
- return true;
102
- let lineItensDiscount = await this.getLineItensEligebleForDiscount(coupon.productsCategories, checkout);
103
- const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user, checkout.shop);
104
- if (coupon.minSubTotalValue <= subTotal)
105
- return true;
106
- return false;
107
- }
108
- async hasProductCategories(coupon, checkout) {
109
- if (!coupon.productsCategories || !coupon.productsCategories.length) {
110
- return true;
111
- }
112
- const couponCategories = await this.getCouponCategoriesId(coupon.productsCategories);
113
- const hasCategories = checkout.lineItems?.filter((i) => {
114
- if (!i.categories || !i.categories?.length)
115
- return true;
116
- return i.categories.some((c) => couponCategories.some((cat) => cat == c));
117
- });
118
- return hasCategories.length ? true : false;
119
- }
120
- coupomUserValidation(coupon, user) {
121
- if (!user || coupon.exclusivityType.includes(Exclusivities.ALL_USERS))
122
- return true;
123
- let userTypes = [];
124
- if (coupon.exclusivityType.includes(Exclusivities.COLLABORATORS) && this.emailIsFromCollaborator(user.email))
125
- userTypes.push(Exclusivities.COLLABORATORS);
126
- if (coupon.exclusivityType.includes(Exclusivities.SPECIFIC_USER) && coupon.userExclusiveEmail.includes(user.email))
127
- userTypes.push(Exclusivities.SPECIFIC_USER);
128
- if (coupon.exclusivityType.includes(Exclusivities.ACTIVE_SUBSCRIBER) &&
129
- user.isSubscriber &&
130
- user.subscriptionPlan != '')
131
- userTypes.push(Exclusivities.ACTIVE_SUBSCRIBER);
132
- if (user.isSubscriber &&
133
- user.subscriptionPlan == '' &&
134
- coupon.exclusivityType.includes(Exclusivities.INACTIVE_SUBSCRIBER))
135
- userTypes.push(Exclusivities.INACTIVE_SUBSCRIBER);
136
- if (coupon.exclusivityType.includes(Exclusivities.NON_SUBSCRIBER) && !user.isSubscriber)
137
- userTypes.push(Exclusivities.NON_SUBSCRIBER);
138
- return coupon.exclusivityType.some((r) => userTypes.includes(r));
139
- }
140
- async getCouponCategoriesId(productsCategories) {
141
- const couponCategories = [];
142
- for (let index = 0; index < productsCategories.length; index++) {
143
- const category = await this.categoryRepository.get({
144
- id: productsCategories[index],
145
- });
146
- if (category) {
147
- const children = await this.categoryRepository.getChildren(parseInt(productsCategories[index]));
148
- couponCategories.push(category.id, ...children.map((c) => c.id.toString()));
149
- }
150
- }
151
- return [...new Set(couponCategories)];
152
- }
153
- async getLineItensEligebleForDiscount(productsCategories, checkout) {
154
- let lineItensDiscount = [];
155
- const couponCategories = await this.getCouponCategoriesId(productsCategories);
156
- if (productsCategories && productsCategories.length) {
157
- lineItensDiscount = checkout.lineItems?.filter((i) => {
158
- if (i.categories?.length) {
159
- return i.categories.some((c) => couponCategories.some((cat) => cat == c));
160
- }
161
- return true;
162
- });
163
- }
164
- else {
165
- lineItensDiscount = checkout.lineItems;
166
- }
167
- return lineItensDiscount;
168
- }
169
- calcCheckoutSubtotal(lineItens, user, shop) {
170
- return (lineItens?.reduce((acc, curr) => user?.isSubscriber && curr.price.subscriberPrice
171
- ? acc + curr.price?.subscriberPrice * curr.quantity
172
- : acc + curr.pricePaid * curr.quantity, 0) || 0);
173
- }
174
- async getOrdersWithCoupon(coupon) {
175
- return await this.orderRepository
176
- .find({
177
- filters: {
178
- coupon: { id: coupon.id },
179
- payment: { status: 'paid' },
180
- },
181
- })
182
- .then((result) => result.data);
183
- }
184
- countOrdersWithUser(orders, email) {
185
- return orders.filter((o) => o.user.email == email).length;
186
- }
187
- getCouponUseLimits(coupon, checkoutType, user) {
188
- let couponUseLimits;
189
- if (checkoutType == CheckoutTypes.ECOMMERCE || checkoutType == CheckoutTypes.ALL) {
190
- couponUseLimits = user && user.isSubscriber ? coupon.useLimits.subscriber : coupon.useLimits.non_subscriber;
191
- }
192
- else {
193
- couponUseLimits = coupon.useLimits.subscription;
194
- }
195
- return couponUseLimits;
196
- }
197
- }
198
- CouponServicefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CouponService, deps: [{ token: 'CouponRepository' }, { token: DEFAULT_SHOP }, { token: 'OrderRepository' }, { token: 'CategoryRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
199
- CouponService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CouponService, providedIn: 'root' });
200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CouponService, decorators: [{
201
- type: Injectable,
202
- args: [{
203
- providedIn: 'root',
204
- }]
205
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
206
- type: Inject,
207
- args: ['CouponRepository']
208
- }] }, { type: i1.Shops, decorators: [{
209
- type: Inject,
210
- args: [DEFAULT_SHOP]
211
- }] }, { type: undefined, decorators: [{
212
- type: Inject,
213
- args: ['OrderRepository']
214
- }] }, { type: undefined, decorators: [{
215
- type: Inject,
216
- args: ['CategoryRepository']
217
- }] }]; } });
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFLTCxhQUFhLEVBR2IsV0FBVyxFQUNYLGFBQWEsRUFJYixLQUFLLEVBRUwsS0FBSyxHQUNOLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBOzs7QUFLeEMsTUFBTSxPQUFPLGFBQWE7SUFDeEIsWUFDK0MsZ0JBQWtDLEVBQ3hDLFdBQWtCLEVBQ2IsZUFBZ0MsRUFDN0Isa0JBQXNDO1FBSHhDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDeEMsZ0JBQVcsR0FBWCxXQUFXLENBQU87UUFDYixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDN0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQXdOL0UsNEJBQXVCLEdBQUcsQ0FBQyxTQUFpQixFQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQXZOakcsQ0FBQztJQUVKLFdBQVcsQ0FDVCxRQUFnQixFQUNoQixZQUEyQixFQUMzQixRQUEyQixFQUMzQixJQUFZO1FBRVosT0FBTyxJQUFJLENBQ1QsSUFBSSxDQUFDLGdCQUFnQjthQUNsQixJQUFJLENBQUM7WUFDSixPQUFPLEVBQUU7Z0JBQ1AsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FB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T0FBTyxlQUFlLENBQUE7SUFDeEIsQ0FBQzs7MEdBeFJVLGFBQWEsa0JBRWQsa0JBQWtCLGFBQ2xCLFlBQVksYUFDWixpQkFBaUIsYUFDakIsb0JBQW9COzhHQUxuQixhQUFhLGNBRlosTUFBTTsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBR0ksTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixNQUFNOzJCQUFDLFlBQVk7OzBCQUNuQixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtcclxuICBDYXRlZ29yeSxcclxuICBDYXRlZ29yeVJlcG9zaXRvcnksXHJcbiAgQ2hlY2tvdXQsXHJcbiAgQ2hlY2tvdXRTdWJzY3JpcHRpb24sXHJcbiAgQ2hlY2tvdXRUeXBlcyxcclxuICBDb3Vwb24sXHJcbiAgQ291cG9uUmVwb3NpdG9yeSxcclxuICBDb3Vwb25UeXBlcyxcclxuICBFeGNsdXNpdml0aWVzLFxyXG4gIExpbmVJdGVtLFxyXG4gIE9yZGVyLFxyXG4gIE9yZGVyUmVwb3NpdG9yeSxcclxuICBTaG9wcyxcclxuICBVc2VyLFxyXG4gIFdoZXJlLFxyXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xyXG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IERFRkFVTFRfU0hPUCB9IGZyb20gJy4uL2NvbnN0cydcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3Vwb25TZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ0NvdXBvblJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IGNvdXBvblJlcG9zaXRvcnk6IENvdXBvblJlcG9zaXRvcnksXHJcbiAgICBASW5qZWN0KERFRkFVTFRfU0hPUCkgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0U2hvcDogU2hvcHMsXHJcbiAgICBASW5qZWN0KCdPcmRlclJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IG9yZGVyUmVwb3NpdG9yeTogT3JkZXJSZXBvc2l0b3J5LFxyXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBjYXRlZ29yeVJlcG9zaXRvcnk6IENhdGVnb3J5UmVwb3NpdG9yeSxcclxuICApIHt9XHJcblxyXG4gIGNoZWNrQ291cG9uKFxyXG4gICAgbmlja25hbWU6IHN0cmluZyxcclxuICAgIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcyxcclxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcclxuICAgIHBsYW46IHN0cmluZyxcclxuICApOiBPYnNlcnZhYmxlPENvdXBvbj4ge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMuY291cG9uUmVwb3NpdG9yeVxyXG4gICAgICAgIC5maW5kKHtcclxuICAgICAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICAgICAgbmlja25hbWU6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IG5pY2tuYW1lIH0sXHJcbiAgICAgICAgICAgIGFjdGl2ZTogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhWzBdKSxcclxuICAgICkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChjb3Vwb24pID0+IHRoaXMuY291cG9uVmFsaWRhdGlvbihjb3Vwb24sIGNoZWNrb3V0VHlwZSkpLFxyXG4gICAgICBjb25jYXRNYXAoKGNvdXBvblZhbGlkOiBDb3Vwb24pID0+IHRoaXMuY291cG9uUnVsZXNWYWxpZGF0aW9uKGNvdXBvblZhbGlkLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LCBwbGFuKSksXHJcbiAgICAgIG1hcCgoY291cG9uVmFsaWRhdGVkOiBDb3Vwb24pID0+IGNvdXBvblZhbGlkYXRlZCBhcyBDb3Vwb24pLFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb3Vwb25WYWxpZGF0aW9uKGNvdXBvbjogQ291cG9uLCBjaGVja291dFR5cGU6IENoZWNrb3V0VHlwZXMpIHtcclxuICAgIGlmICghY291cG9uKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvLidcclxuXHJcbiAgICBpZiAoY291cG9uPy5iZWdpbkF0ICYmIGNvdXBvbj8uYmVnaW5BdC5nZXRUaW1lKCkgPiBuZXcgRGF0ZSgpLmdldFRpbWUoKSkgdGhyb3cgJ0N1cG9tIGludsOhbGlkby4nXHJcblxyXG4gICAgaWYgKGNvdXBvbj8uZXhwaXJlc0luICYmIGNvdXBvbj8uZXhwaXJlc0luLmdldFRpbWUoKSA8IG5ldyBEYXRlKCkuZ2V0VGltZSgpKSB0aHJvdyAnQ3Vwb20gZXhwaXJhZG8uJ1xyXG5cclxuICAgIGNvbnN0IGlzSW5TaG9wID0gY291cG9uLnNob3BBdmFpbGFiaWxpdHkgPT09IFNob3BzLkFMTCB8fCBjb3Vwb24uc2hvcEF2YWlsYWJpbGl0eSA9PT0gdGhpcy5kZWZhdWx0U2hvcFxyXG5cclxuICAgIGlmICghaXNJblNob3ApIHRocm93ICdDdXBvbSBpbnbDoWxpZG8gcGFyYSBsb2phLidcclxuXHJcbiAgICBjb25zdCBpc0NoZWNrb3V0VHlwZSA9IGNvdXBvbi5jaGVja291dFR5cGUgPT09IENoZWNrb3V0VHlwZXMuQUxMIHx8IGNvdXBvbi5jaGVja291dFR5cGUgPT09IGNoZWNrb3V0VHlwZVxyXG5cclxuICAgIGlmICghaXNDaGVja291dFR5cGUpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uIEVycm8gZGUgY2hlY2tvdXQuJ1xyXG5cclxuICAgIHJldHVybiBjb3Vwb25cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY291cG9uUnVsZXNWYWxpZGF0aW9uKFxyXG4gICAgY291cG9uOiBDb3Vwb24sXHJcbiAgICBjaGVja291dFR5cGU6IENoZWNrb3V0VHlwZXMsXHJcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXHJcbiAgICBwbGFuOiBzdHJpbmcsXHJcbiAgKSB7XHJcbiAgICBpZiAoY2hlY2tvdXRUeXBlID09IENoZWNrb3V0VHlwZXMuU1VCU0NSSVBUSU9OKSB7XHJcbiAgICAgIGlmIChjb3Vwb24ucGxhbiAmJiBjb3Vwb24ucGxhbi50b1VwcGVyQ2FzZSgpICE9PSBwbGFuLnRvVXBwZXJDYXNlKCkpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8gcGFyYSBzdWEgYXNzaW5hdHVyYS4nXHJcblxyXG4gICAgICByZXR1cm4gY291cG9uXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsaWRVc2VyID0gdGhpcy5jb3Vwb21Vc2VyVmFsaWRhdGlvbihjb3Vwb24sIGNoZWNrb3V0Py51c2VyKVxyXG5cclxuICAgIGlmICghdmFsaWRVc2VyKSB0aHJvdyAnVXN1w6FyaW8gbsOjbyBlbGVnw612ZWwuJ1xyXG5cclxuICAgIGNvbnN0IGNvdXBvblVzZUxpbWl0cyA9IHRoaXMuZ2V0Q291cG9uVXNlTGltaXRzKGNvdXBvbiwgY2hlY2tvdXRUeXBlLCBjaGVja291dC51c2VyKVxyXG5cclxuICAgIGlmICghY291cG9uVXNlTGltaXRzLnVubGltaXRlZCB8fCBjb3Vwb25Vc2VMaW1pdHMubGltaXRlZFBlclVzZXIpIHtcclxuICAgICAgY29uc3Qgb3JkZXJzID0gYXdhaXQgdGhpcy5nZXRPcmRlcnNXaXRoQ291cG9uKGNvdXBvbilcclxuXHJcbiAgICAgIGlmICghY291cG9uVXNlTGltaXRzLnVubGltaXRlZCAmJiBjb3Vwb25Vc2VMaW1pdHMudG90YWwgJiYgb3JkZXJzLmxlbmd0aCA+PSBjb3Vwb25Vc2VMaW1pdHMudG90YWwpXHJcbiAgICAgICAgdGhyb3cgJ0xpbWl0ZSBkZSB1c28gYXRpbmdpZG8uJ1xyXG5cclxuICAgICAgaWYgKGNvdXBvblVzZUxpbWl0cy5saW1pdGVkUGVyVXNlcikge1xyXG4gICAgICAgIGNvbnN0IG9yZGVyc1dpdGhVc2VyID0gdGhpcy5jb3VudE9yZGVyc1dpdGhVc2VyKG9yZGVycywgY2hlY2tvdXQudXNlci5lbWFpbClcclxuXHJcbiAgICAgICAgaWYgKG9yZGVyc1dpdGhVc2VyID4gMCkgdGhyb3cgJ0xpbWl0ZSBkZSB1c28gcG9yIHVzdcOhcmlvIGF0aW5naWRvLidcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1Byb2R1Y3RDYXRlZ29yaWVzID0gYXdhaXQgdGhpcy5oYXNQcm9kdWN0Q2F0ZWdvcmllcyhjb3Vwb24sIGNoZWNrb3V0KVxyXG5cclxuICAgIGlmICghaGFzUHJvZHVjdENhdGVnb3JpZXMpIHRocm93ICdTZXUgY2FycmluaG8gbsOjbyBwb3NzdWkgcHJvZHV0b3MgZWxlZ8OtdmVpcyBwYXJhIGRlc2NvbnRvLidcclxuXHJcbiAgICBjb25zdCBoYXNNaW5TdWJUb3RhbCA9IGF3YWl0IHRoaXMuaGFzTWluU3ViVG90YWwoY291cG9uLCBjaGVja291dClcclxuXHJcbiAgICBpZiAoIWhhc01pblN1YlRvdGFsKVxyXG4gICAgICB0aHJvdyBgVmFsb3IgbcOtbmltbyBkZSAke0ludGwuTnVtYmVyRm9ybWF0KCdwdC1CUicsIHsgc3R5bGU6ICdjdXJyZW5jeScsIGN1cnJlbmN5OiAnQlJMJyB9KS5mb3JtYXQoXHJcbiAgICAgICAgY291cG9uLm1pblN1YlRvdGFsVmFsdWUsXHJcbiAgICAgICl9IG7Do28gYXRpbmdpZG9gXHJcblxyXG4gICAgcmV0dXJuIGNvdXBvblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbGNEaXNjb3VudFN1YnNjcmlwdGlvbihjb3Vwb246IENvdXBvbiwgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXRTdWJzY3JpcHRpb24+KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIGxldCBkaXNjb3VudCA9IDBcclxuXHJcbiAgICBpZiAoY291cG9uLmRpc2NvdW50LnN1YnNjcmlwdGlvbi50eXBlID09IENvdXBvblR5cGVzLkFCU09MVVRFKSBkaXNjb3VudCA9IGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpcHRpb24udmFsdWVcclxuICAgIGVsc2UgZGlzY291bnQgPSBjaGVja291dC5zdWJzY3JpcHRpb25QbGFuLnJlY3VycmVuY2VQcmljZSAqIChjb3Vwb24uZGlzY291bnQuc3Vic2NyaXB0aW9uLnZhbHVlIC8gMTAwKVxyXG5cclxuICAgIHJldHVybiBvZihkaXNjb3VudClcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjYWxjRGlzY291bnRTaG9wcGluZyhjb3Vwb246IENvdXBvbiwgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+KTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCBkaXNjb3VudCA9IDBcclxuXHJcbiAgICBpZiAoY2hlY2tvdXQudXNlci5pc1N1YnNjcmliZXIgJiYgY291cG9uLmRpc2NvdW50LnN1YnNjcmliZXIudmFsdWUpIHtcclxuICAgICAgZGlzY291bnQgPSBhd2FpdCB0aGlzLmNhbGNEaXNjb3VudEJ5VHlwZShcclxuICAgICAgICBjb3Vwb24uZGlzY291bnQuc3Vic2NyaWJlci50eXBlLFxyXG4gICAgICAgIGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpYmVyLnZhbHVlLFxyXG4gICAgICAgIGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMsXHJcbiAgICAgICAgY2hlY2tvdXQsXHJcbiAgICAgIClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRpc2NvdW50ID0gYXdhaXQgdGhpcy5jYWxjRGlzY291bnRCeVR5cGUoXHJcbiAgICAgICAgY291cG9uLmRpc2NvdW50Lm5vbl9zdWJzY3JpYmVyLnR5cGUsXHJcbiAgICAgICAgY291cG9uLmRpc2NvdW50Lm5vbl9zdWJzY3JpYmVyLnZhbHVlLFxyXG4gICAgICAgIGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMsXHJcbiAgICAgICAgY2hlY2tvdXQsXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGlzY291bnRcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY2FsY0Rpc2NvdW50QnlUeXBlKFxyXG4gICAgdHlwZTogQ291cG9uVHlwZXMsXHJcbiAgICB2YWx1ZTogbnVtYmVyLFxyXG4gICAgY2F0ZWdvcmllczogc3RyaW5nW10sXHJcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXHJcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCBkaXNjb3VudCA9IDBcclxuXHJcbiAgICBsZXQgbGluZUl0ZW5zRGlzY291bnQgPSBhd2FpdCB0aGlzLmdldExpbmVJdGVuc0VsaWdlYmxlRm9yRGlzY291bnQoY2F0ZWdvcmllcywgY2hlY2tvdXQpXHJcblxyXG4gICAgY29uc3Qgc3ViVG90YWwgPSB0aGlzLmNhbGNDaGVja291dFN1YnRvdGFsKGxpbmVJdGVuc0Rpc2NvdW50LCBjaGVja291dC51c2VyLCBjaGVja291dC5zaG9wKVxyXG5cclxuICAgIGlmICh0eXBlID09IENvdXBvblR5cGVzLkFCU09MVVRFKSB7XHJcbiAgICAgIGRpc2NvdW50ID0gdmFsdWUgPiBzdWJUb3RhbCA/IHN1YlRvdGFsIDogdmFsdWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRpc2NvdW50ID0gc3ViVG90YWwgKiAodmFsdWUgLyAxMDApXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRpc2NvdW50XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhc01pblN1YlRvdGFsKGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghY291cG9uLm1pblN1YlRvdGFsVmFsdWUpIHJldHVybiB0cnVlXHJcblxyXG4gICAgbGV0IGxpbmVJdGVuc0Rpc2NvdW50ID0gYXdhaXQgdGhpcy5nZXRMaW5lSXRlbnNFbGlnZWJsZUZvckRpc2NvdW50KGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMsIGNoZWNrb3V0KVxyXG5cclxuICAgIGNvbnN0IHN1YlRvdGFsID0gdGhpcy5jYWxjQ2hlY2tvdXRTdWJ0b3RhbChsaW5lSXRlbnNEaXNjb3VudCwgY2hlY2tvdXQudXNlciwgY2hlY2tvdXQuc2hvcClcclxuXHJcbiAgICBpZiAoY291cG9uLm1pblN1YlRvdGFsVmFsdWUgPD0gc3ViVG90YWwpIHJldHVybiB0cnVlXHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhc1Byb2R1Y3RDYXRlZ29yaWVzKGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcyB8fCAhY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb3Vwb25DYXRlZ29yaWVzID0gYXdhaXQgdGhpcy5nZXRDb3Vwb25DYXRlZ29yaWVzSWQoY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcylcclxuXHJcbiAgICBjb25zdCBoYXNDYXRlZ29yaWVzID0gY2hlY2tvdXQubGluZUl0ZW1zPy5maWx0ZXIoKGkpID0+IHtcclxuICAgICAgaWYgKCFpLmNhdGVnb3JpZXMgfHwgIWkuY2F0ZWdvcmllcz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZVxyXG4gICAgICByZXR1cm4gaS5jYXRlZ29yaWVzLnNvbWUoKGMpID0+IGNvdXBvbkNhdGVnb3JpZXMuc29tZSgoY2F0KSA9PiBjYXQgPT0gYykpXHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBoYXNDYXRlZ29yaWVzLmxlbmd0aCA/IHRydWUgOiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb3Vwb21Vc2VyVmFsaWRhdGlvbihjb3Vwb246IENvdXBvbiwgdXNlcjogVXNlcikge1xyXG4gICAgaWYgKCF1c2VyIHx8IGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5BTExfVVNFUlMpKSByZXR1cm4gdHJ1ZVxyXG5cclxuICAgIGxldCB1c2VyVHlwZXM6IEV4Y2x1c2l2aXRpZXNbXSA9IFtdXHJcblxyXG4gICAgaWYgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5DT0xMQUJPUkFUT1JTKSAmJiB0aGlzLmVtYWlsSXNGcm9tQ29sbGFib3JhdG9yKHVzZXIuZW1haWwpKVxyXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpXHJcblxyXG4gICAgaWYgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5TUEVDSUZJQ19VU0VSKSAmJiBjb3Vwb24udXNlckV4Y2x1c2l2ZUVtYWlsLmluY2x1ZGVzKHVzZXIuZW1haWwpKVxyXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLlNQRUNJRklDX1VTRVIpXHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuQUNUSVZFX1NVQlNDUklCRVIpICYmXHJcbiAgICAgIHVzZXIuaXNTdWJzY3JpYmVyICYmXHJcbiAgICAgIHVzZXIuc3Vic2NyaXB0aW9uUGxhbiAhPSAnJ1xyXG4gICAgKVxyXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLkFDVElWRV9TVUJTQ1JJQkVSKVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdXNlci5pc1N1YnNjcmliZXIgJiZcclxuICAgICAgdXNlci5zdWJzY3JpcHRpb25QbGFuID09ICcnICYmXHJcbiAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5JTkFDVElWRV9TVUJTQ1JJQkVSKVxyXG4gICAgKVxyXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLklOQUNUSVZFX1NVQlNDUklCRVIpXHJcblxyXG4gICAgaWYgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5OT05fU1VCU0NSSUJFUikgJiYgIXVzZXIuaXNTdWJzY3JpYmVyKVxyXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLk5PTl9TVUJTQ1JJQkVSKVxyXG5cclxuICAgIHJldHVybiBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLnNvbWUoKHIpID0+IHVzZXJUeXBlcy5pbmNsdWRlcyhyKSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKHByb2R1Y3RzQ2F0ZWdvcmllczogc3RyaW5nW10pOiBQcm9taXNlPEFycmF5PFN0cmluZz4+IHtcclxuICAgIGNvbnN0IGNvdXBvbkNhdGVnb3JpZXM6IEFycmF5PFN0cmluZz4gPSBbXVxyXG5cclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwcm9kdWN0c0NhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5OiBDYXRlZ29yeSAmIHsgZmlyZXN0b3JlSWQ/OiBzdHJpbmcgfSA9IGF3YWl0IHRoaXMuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldCh7XHJcbiAgICAgICAgaWQ6IHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0sXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBpZiAoY2F0ZWdvcnkpIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHRoaXMuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldENoaWxkcmVuKHBhcnNlSW50KHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0pKVxyXG5cclxuICAgICAgICBjb3Vwb25DYXRlZ29yaWVzLnB1c2goY2F0ZWdvcnkuaWQsIC4uLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZC50b1N0cmluZygpKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbLi4ubmV3IFNldChjb3Vwb25DYXRlZ29yaWVzKV1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1haWxJc0Zyb21Db2xsYWJvcmF0b3IgPSAodXNlckVtYWlsOiBzdHJpbmcpOiBib29sZWFuID0+ICEhdXNlckVtYWlsPy5tYXRjaCgvQGI0YS5jb20uYnIvZylcclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRMaW5lSXRlbnNFbGlnZWJsZUZvckRpc2NvdW50KFxyXG4gICAgcHJvZHVjdHNDYXRlZ29yaWVzOiBzdHJpbmdbXSxcclxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcclxuICApOiBQcm9taXNlPExpbmVJdGVtW10+IHtcclxuICAgIGxldCBsaW5lSXRlbnNEaXNjb3VudCA9IFtdXHJcbiAgICBjb25zdCBjb3Vwb25DYXRlZ29yaWVzID0gYXdhaXQgdGhpcy5nZXRDb3Vwb25DYXRlZ29yaWVzSWQocHJvZHVjdHNDYXRlZ29yaWVzKVxyXG5cclxuICAgIGlmIChwcm9kdWN0c0NhdGVnb3JpZXMgJiYgcHJvZHVjdHNDYXRlZ29yaWVzLmxlbmd0aCkge1xyXG4gICAgICBsaW5lSXRlbnNEaXNjb3VudCA9IGNoZWNrb3V0LmxpbmVJdGVtcz8uZmlsdGVyKChpKSA9PiB7XHJcbiAgICAgICAgaWYgKGkuY2F0ZWdvcmllcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXR1cm4gaS5jYXRlZ29yaWVzLnNvbWUoKGMpID0+IGNvdXBvbkNhdGVnb3JpZXMuc29tZSgoY2F0KSA9PiBjYXQgPT0gYykpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsaW5lSXRlbnNEaXNjb3VudCA9IGNoZWNrb3V0LmxpbmVJdGVtc1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lSXRlbnNEaXNjb3VudFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjQ2hlY2tvdXRTdWJ0b3RhbChsaW5lSXRlbnM6IExpbmVJdGVtW10sIHVzZXI6IFVzZXIsIHNob3A6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBsaW5lSXRlbnM/LnJlZHVjZShcclxuICAgICAgICAoYWNjLCBjdXJyKSA9PlxyXG4gICAgICAgICAgdXNlcj8uaXNTdWJzY3JpYmVyICYmIGN1cnIucHJpY2Uuc3Vic2NyaWJlclByaWNlXHJcbiAgICAgICAgICAgID8gYWNjICsgY3Vyci5wcmljZT8uc3Vic2NyaWJlclByaWNlICogY3Vyci5xdWFudGl0eVxyXG4gICAgICAgICAgICA6IGFjYyArIGN1cnIucHJpY2VQYWlkICogY3Vyci5xdWFudGl0eSxcclxuICAgICAgICAwLFxyXG4gICAgICApIHx8IDBcclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3JkZXJzV2l0aENvdXBvbihjb3Vwb246IENvdXBvbik6IFByb21pc2U8T3JkZXJbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMub3JkZXJSZXBvc2l0b3J5XHJcbiAgICAgIC5maW5kKHtcclxuICAgICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgICBjb3Vwb246IHsgaWQ6IGNvdXBvbi5pZCB9LFxyXG4gICAgICAgICAgcGF5bWVudDogeyBzdGF0dXM6ICdwYWlkJyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb3VudE9yZGVyc1dpdGhVc2VyKG9yZGVyczogT3JkZXJbXSwgZW1haWw6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gb3JkZXJzLmZpbHRlcigobykgPT4gby51c2VyLmVtYWlsID09IGVtYWlsKS5sZW5ndGhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q291cG9uVXNlTGltaXRzKGNvdXBvbjogQ291cG9uLCBjaGVja291dFR5cGU6IENoZWNrb3V0VHlwZXMsIHVzZXI6IFVzZXIpIHtcclxuICAgIGxldCBjb3Vwb25Vc2VMaW1pdHM6IHsgdW5saW1pdGVkPzogYm9vbGVhbjsgdG90YWw/OiBudW1iZXI7IGxpbWl0ZWRQZXJVc2VyPzogYm9vbGVhbiB9XHJcbiAgICBpZiAoY2hlY2tvdXRUeXBlID09IENoZWNrb3V0VHlwZXMuRUNPTU1FUkNFIHx8IGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLkFMTCkge1xyXG4gICAgICBjb3Vwb25Vc2VMaW1pdHMgPSB1c2VyICYmIHVzZXIuaXNTdWJzY3JpYmVyID8gY291cG9uLnVzZUxpbWl0cy5zdWJzY3JpYmVyIDogY291cG9uLnVzZUxpbWl0cy5ub25fc3Vic2NyaWJlclxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY291cG9uVXNlTGltaXRzID0gY291cG9uLnVzZUxpbWl0cy5zdWJzY3JpcHRpb25cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY291cG9uVXNlTGltaXRzXHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { CheckoutTypes, CouponTypes, Exclusivities, Shops, Where, } from '@infrab4a/connect';
3
+ import { from, of } from 'rxjs';
4
+ import { concatMap, map } from 'rxjs/operators';
5
+ import { DEFAULT_SHOP } from '../consts';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@infrab4a/connect";
8
+ export class CouponService {
9
+ constructor(couponRepository, defaultShop, orderRepository, categoryRepository) {
10
+ this.couponRepository = couponRepository;
11
+ this.defaultShop = defaultShop;
12
+ this.orderRepository = orderRepository;
13
+ this.categoryRepository = categoryRepository;
14
+ this.emailIsFromCollaborator = (userEmail) => !!userEmail?.match(/@b4a.com.br/g);
15
+ }
16
+ checkCoupon(nickname, checkoutType, checkout, plan) {
17
+ return from(this.couponRepository
18
+ .find({
19
+ filters: {
20
+ nickname: { operator: Where.EQUALS, value: nickname },
21
+ active: { operator: Where.EQUALS, value: true },
22
+ },
23
+ })
24
+ .then((result) => result.data[0])).pipe(concatMap((coupon) => this.couponValidation(coupon, checkoutType)), concatMap((couponValid) => this.couponRulesValidation(couponValid, checkoutType, checkout, plan)), map((couponValidated) => couponValidated));
25
+ }
26
+ async couponValidation(coupon, checkoutType) {
27
+ if (!coupon)
28
+ throw 'Cupom inválido.';
29
+ if (coupon?.beginAt && coupon?.beginAt.getTime() > new Date().getTime())
30
+ throw 'Cupom inválido.';
31
+ if (coupon?.expiresIn && coupon?.expiresIn.getTime() < new Date().getTime())
32
+ throw 'Cupom expirado.';
33
+ const isInShop = coupon.shopAvailability === Shops.ALL || coupon.shopAvailability === this.defaultShop;
34
+ if (!isInShop)
35
+ throw 'Cupom inválido para loja.';
36
+ const isCheckoutType = coupon.checkoutType === CheckoutTypes.ALL || coupon.checkoutType === checkoutType;
37
+ if (!isCheckoutType)
38
+ throw 'Cupom inválido. Erro de checkout.';
39
+ return coupon;
40
+ }
41
+ async couponRulesValidation(coupon, checkoutType, checkout, plan) {
42
+ if (checkoutType == CheckoutTypes.SUBSCRIPTION) {
43
+ if (coupon.plan && coupon.plan.toUpperCase() !== plan.toUpperCase())
44
+ throw 'Cupom inválido para sua assinatura.';
45
+ return coupon;
46
+ }
47
+ const validUser = this.coupomUserValidation(coupon, checkout?.user);
48
+ if (!validUser)
49
+ throw 'Usuário não elegível.';
50
+ const couponUseLimits = this.getCouponUseLimits(coupon, checkoutType, checkout.user);
51
+ if (!couponUseLimits.unlimited || couponUseLimits.limitedPerUser) {
52
+ const orders = await this.getOrdersWithCoupon(coupon);
53
+ if (!couponUseLimits.unlimited && couponUseLimits.total && orders.length >= couponUseLimits.total)
54
+ throw 'Limite de uso atingido.';
55
+ if (couponUseLimits.limitedPerUser) {
56
+ const ordersWithUser = this.countOrdersWithUser(orders, checkout.user.email);
57
+ if (ordersWithUser > 0)
58
+ throw 'Limite de uso por usuário atingido.';
59
+ }
60
+ }
61
+ const hasProductCategories = await this.hasProductCategories(coupon, checkout);
62
+ if (!hasProductCategories)
63
+ throw 'Seu carrinho não possui produtos elegíveis para desconto.';
64
+ const hasMinSubTotal = await this.hasMinSubTotal(coupon, checkout);
65
+ if (!hasMinSubTotal)
66
+ throw `Valor mínimo de ${Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(coupon.minSubTotalValue)} não atingido`;
67
+ return coupon;
68
+ }
69
+ calcDiscountSubscription(coupon, checkout) {
70
+ let discount = 0;
71
+ if (coupon.discount.subscription.type == CouponTypes.ABSOLUTE)
72
+ discount = coupon.discount.subscription.value;
73
+ else
74
+ discount = checkout.subscriptionPlan.recurrencePrice * (coupon.discount.subscription.value / 100);
75
+ return of(discount);
76
+ }
77
+ async calcDiscountShopping(coupon, checkout) {
78
+ let discount = 0;
79
+ if (checkout.user.isSubscriber && coupon.discount.subscriber.value) {
80
+ discount = await this.calcDiscountByType(coupon.discount.subscriber.type, coupon.discount.subscriber.value, coupon.productsCategories, checkout);
81
+ }
82
+ else {
83
+ discount = await this.calcDiscountByType(coupon.discount.non_subscriber.type, coupon.discount.non_subscriber.value, coupon.productsCategories, checkout);
84
+ }
85
+ return discount;
86
+ }
87
+ async calcDiscountByType(type, value, categories, checkout) {
88
+ let discount = 0;
89
+ let lineItensDiscount = await this.getLineItensEligebleForDiscount(categories, checkout);
90
+ const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user, checkout.shop);
91
+ if (type == CouponTypes.ABSOLUTE) {
92
+ discount = value > subTotal ? subTotal : value;
93
+ }
94
+ else {
95
+ discount = subTotal * (value / 100);
96
+ }
97
+ return discount;
98
+ }
99
+ async hasMinSubTotal(coupon, checkout) {
100
+ if (!coupon.minSubTotalValue)
101
+ return true;
102
+ let lineItensDiscount = await this.getLineItensEligebleForDiscount(coupon.productsCategories, checkout);
103
+ const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user, checkout.shop);
104
+ if (coupon.minSubTotalValue <= subTotal)
105
+ return true;
106
+ return false;
107
+ }
108
+ async hasProductCategories(coupon, checkout) {
109
+ if (!coupon.productsCategories || !coupon.productsCategories.length) {
110
+ return true;
111
+ }
112
+ const couponCategories = await this.getCouponCategoriesId(coupon.productsCategories);
113
+ const hasCategories = checkout.lineItems?.filter((i) => {
114
+ if (!i.categories || !i.categories?.length)
115
+ return true;
116
+ return i.categories.some((c) => couponCategories.some((cat) => cat == c));
117
+ });
118
+ return hasCategories.length ? true : false;
119
+ }
120
+ coupomUserValidation(coupon, user) {
121
+ if (!user || coupon.exclusivityType.includes(Exclusivities.ALL_USERS))
122
+ return true;
123
+ let userTypes = [];
124
+ if (coupon.exclusivityType.includes(Exclusivities.COLLABORATORS) && this.emailIsFromCollaborator(user.email))
125
+ userTypes.push(Exclusivities.COLLABORATORS);
126
+ if (coupon.exclusivityType.includes(Exclusivities.SPECIFIC_USER) && coupon.userExclusiveEmail.includes(user.email))
127
+ userTypes.push(Exclusivities.SPECIFIC_USER);
128
+ if (coupon.exclusivityType.includes(Exclusivities.ACTIVE_SUBSCRIBER) &&
129
+ user.isSubscriber &&
130
+ user.subscriptionPlan != '')
131
+ userTypes.push(Exclusivities.ACTIVE_SUBSCRIBER);
132
+ if (user.isSubscriber &&
133
+ user.subscriptionPlan == '' &&
134
+ coupon.exclusivityType.includes(Exclusivities.INACTIVE_SUBSCRIBER))
135
+ userTypes.push(Exclusivities.INACTIVE_SUBSCRIBER);
136
+ if (coupon.exclusivityType.includes(Exclusivities.NON_SUBSCRIBER) && !user.isSubscriber)
137
+ userTypes.push(Exclusivities.NON_SUBSCRIBER);
138
+ return coupon.exclusivityType.some((r) => userTypes.includes(r));
139
+ }
140
+ async getCouponCategoriesId(productsCategories) {
141
+ const couponCategories = [];
142
+ for (let index = 0; index < productsCategories.length; index++) {
143
+ const category = await this.categoryRepository.get({
144
+ id: productsCategories[index],
145
+ });
146
+ if (category) {
147
+ const children = await this.categoryRepository.getChildren(parseInt(productsCategories[index]));
148
+ couponCategories.push(category.id, ...children.map((c) => c.id.toString()));
149
+ }
150
+ }
151
+ return [...new Set(couponCategories)];
152
+ }
153
+ async getLineItensEligebleForDiscount(productsCategories, checkout) {
154
+ let lineItensDiscount = [];
155
+ const couponCategories = await this.getCouponCategoriesId(productsCategories);
156
+ if (productsCategories && productsCategories.length) {
157
+ lineItensDiscount = checkout.lineItems?.filter((i) => {
158
+ if (i.categories?.length) {
159
+ return i.categories.some((c) => couponCategories.some((cat) => cat == c));
160
+ }
161
+ return true;
162
+ });
163
+ }
164
+ else {
165
+ lineItensDiscount = checkout.lineItems;
166
+ }
167
+ return lineItensDiscount;
168
+ }
169
+ calcCheckoutSubtotal(lineItens, user, shop) {
170
+ return (lineItens?.reduce((acc, curr) => user?.isSubscriber && curr.price.subscriberPrice
171
+ ? acc + curr.price?.subscriberPrice * curr.quantity
172
+ : acc + curr.pricePaid * curr.quantity, 0) || 0);
173
+ }
174
+ async getOrdersWithCoupon(coupon) {
175
+ return await this.orderRepository
176
+ .find({
177
+ filters: {
178
+ coupon: { id: coupon.id },
179
+ payment: { status: 'paid' },
180
+ },
181
+ })
182
+ .then((result) => result.data);
183
+ }
184
+ countOrdersWithUser(orders, email) {
185
+ return orders.filter((o) => o.user.email == email).length;
186
+ }
187
+ getCouponUseLimits(coupon, checkoutType, user) {
188
+ let couponUseLimits;
189
+ if (checkoutType == CheckoutTypes.ECOMMERCE || checkoutType == CheckoutTypes.ALL) {
190
+ couponUseLimits = user && user.isSubscriber ? coupon.useLimits.subscriber : coupon.useLimits.non_subscriber;
191
+ }
192
+ else {
193
+ couponUseLimits = coupon.useLimits.subscription;
194
+ }
195
+ return couponUseLimits;
196
+ }
197
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: CouponService, deps: [{ token: 'CouponRepository' }, { token: DEFAULT_SHOP }, { token: 'OrderRepository' }, { token: 'CategoryRepository' }], target: i0.ɵɵFactoryTarget.Injectable }); }
198
+ static { thisprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: CouponService, providedIn: 'root' }); }
199
+ }
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: CouponService, decorators: [{
201
+ type: Injectable,
202
+ args: [{
203
+ providedIn: 'root',
204
+ }]
205
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
206
+ type: Inject,
207
+ args: ['CouponRepository']
208
+ }] }, { type: i1.Shops, decorators: [{
209
+ type: Inject,
210
+ args: [DEFAULT_SHOP]
211
+ }] }, { type: undefined, decorators: [{
212
+ type: Inject,
213
+ args: ['OrderRepository']
214
+ }] }, { type: undefined, decorators: [{
215
+ type: Inject,
216
+ args: ['CategoryRepository']
217
+ }] }]; } });
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFLTCxhQUFhLEVBR2IsV0FBVyxFQUNYLGFBQWEsRUFJYixLQUFLLEVBRUwsS0FBSyxHQUNOLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBOzs7QUFLeEMsTUFBTSxPQUFPLGFBQWE7SUFDeEIsWUFDK0MsZ0JBQWtDLEVBQ3hDLFdBQWtCLEVBQ2IsZUFBZ0MsRUFDN0Isa0JBQXNDO1FBSHhDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDeEMsZ0JBQVcsR0FBWCxXQUFXLENBQU87UUFDYixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDN0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQXdOL0UsNEJBQXVCLEdBQUcsQ0FBQyxTQUFpQixFQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQXZOakcsQ0FBQztJQUVKLFdBQVcsQ0FDVCxRQUFnQixFQUNoQixZQUEyQixFQUMzQixRQUEyQixFQUMzQixJQUFZO1FBRVosT0FBTyxJQUFJLENBQ1QsSUFBSSxDQUFDLGdCQUFnQjthQUNsQixJQUFJLENBQUM7WUFDSixPQUFPLEVBQUU7Z0JBQ1AsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FB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T0FBTyxlQUFlLENBQUE7SUFDeEIsQ0FBQzs4R0F4UlUsYUFBYSxrQkFFZCxrQkFBa0IsYUFDbEIsWUFBWSxhQUNaLGlCQUFpQixhQUNqQixvQkFBb0I7a0hBTG5CLGFBQWEsY0FGWixNQUFNOzsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBR0ksTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixNQUFNOzJCQUFDLFlBQVk7OzBCQUNuQixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIENhdGVnb3J5LFxuICBDYXRlZ29yeVJlcG9zaXRvcnksXG4gIENoZWNrb3V0LFxuICBDaGVja291dFN1YnNjcmlwdGlvbixcbiAgQ2hlY2tvdXRUeXBlcyxcbiAgQ291cG9uLFxuICBDb3Vwb25SZXBvc2l0b3J5LFxuICBDb3Vwb25UeXBlcyxcbiAgRXhjbHVzaXZpdGllcyxcbiAgTGluZUl0ZW0sXG4gIE9yZGVyLFxuICBPcmRlclJlcG9zaXRvcnksXG4gIFNob3BzLFxuICBVc2VyLFxuICBXaGVyZSxcbn0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBjb25jYXRNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgREVGQVVMVF9TSE9QIH0gZnJvbSAnLi4vY29uc3RzJ1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ291cG9uU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ0NvdXBvblJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IGNvdXBvblJlcG9zaXRvcnk6IENvdXBvblJlcG9zaXRvcnksXG4gICAgQEluamVjdChERUZBVUxUX1NIT1ApIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNob3A6IFNob3BzLFxuICAgIEBJbmplY3QoJ09yZGVyUmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgb3JkZXJSZXBvc2l0b3J5OiBPcmRlclJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBjYXRlZ29yeVJlcG9zaXRvcnk6IENhdGVnb3J5UmVwb3NpdG9yeSxcbiAgKSB7fVxuXG4gIGNoZWNrQ291cG9uKFxuICAgIG5pY2tuYW1lOiBzdHJpbmcsXG4gICAgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLFxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcbiAgICBwbGFuOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8Q291cG9uPiB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLmNvdXBvblJlcG9zaXRvcnlcbiAgICAgICAgLmZpbmQoe1xuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIG5pY2tuYW1lOiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiBuaWNrbmFtZSB9LFxuICAgICAgICAgICAgYWN0aXZlOiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiB0cnVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGFbMF0pLFxuICAgICkucGlwZShcbiAgICAgIGNvbmNhdE1hcCgoY291cG9uKSA9PiB0aGlzLmNvdXBvblZhbGlkYXRpb24oY291cG9uLCBjaGVja291dFR5cGUpKSxcbiAgICAgIGNvbmNhdE1hcCgoY291cG9uVmFsaWQ6IENvdXBvbikgPT4gdGhpcy5jb3Vwb25SdWxlc1ZhbGlkYXRpb24oY291cG9uVmFsaWQsIGNoZWNrb3V0VHlwZSwgY2hlY2tvdXQsIHBsYW4pKSxcbiAgICAgIG1hcCgoY291cG9uVmFsaWRhdGVkOiBDb3Vwb24pID0+IGNvdXBvblZhbGlkYXRlZCBhcyBDb3Vwb24pLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY291cG9uVmFsaWRhdGlvbihjb3Vwb246IENvdXBvbiwgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzKSB7XG4gICAgaWYgKCFjb3Vwb24pIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uJ1xuXG4gICAgaWYgKGNvdXBvbj8uYmVnaW5BdCAmJiBjb3Vwb24/LmJlZ2luQXQuZ2V0VGltZSgpID4gbmV3IERhdGUoKS5nZXRUaW1lKCkpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uJ1xuXG4gICAgaWYgKGNvdXBvbj8uZXhwaXJlc0luICYmIGNvdXBvbj8uZXhwaXJlc0luLmdldFRpbWUoKSA8IG5ldyBEYXRlKCkuZ2V0VGltZSgpKSB0aHJvdyAnQ3Vwb20gZXhwaXJhZG8uJ1xuXG4gICAgY29uc3QgaXNJblNob3AgPSBjb3Vwb24uc2hvcEF2YWlsYWJpbGl0eSA9PT0gU2hvcHMuQUxMIHx8IGNvdXBvbi5zaG9wQXZhaWxhYmlsaXR5ID09PSB0aGlzLmRlZmF1bHRTaG9wXG5cbiAgICBpZiAoIWlzSW5TaG9wKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvIHBhcmEgbG9qYS4nXG5cbiAgICBjb25zdCBpc0NoZWNrb3V0VHlwZSA9IGNvdXBvbi5jaGVja291dFR5cGUgPT09IENoZWNrb3V0VHlwZXMuQUxMIHx8IGNvdXBvbi5jaGVja291dFR5cGUgPT09IGNoZWNrb3V0VHlwZVxuXG4gICAgaWYgKCFpc0NoZWNrb3V0VHlwZSkgdGhyb3cgJ0N1cG9tIGludsOhbGlkby4gRXJybyBkZSBjaGVja291dC4nXG5cbiAgICByZXR1cm4gY291cG9uXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvdXBvblJ1bGVzVmFsaWRhdGlvbihcbiAgICBjb3Vwb246IENvdXBvbixcbiAgICBjaGVja291dFR5cGU6IENoZWNrb3V0VHlwZXMsXG4gICAgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+LFxuICAgIHBsYW46IHN0cmluZyxcbiAgKSB7XG4gICAgaWYgKGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLlNVQlNDUklQVElPTikge1xuICAgICAgaWYgKGNvdXBvbi5wbGFuICYmIGNvdXBvbi5wbGFuLnRvVXBwZXJDYXNlKCkgIT09IHBsYW4udG9VcHBlckNhc2UoKSkgdGhyb3cgJ0N1cG9tIGludsOhbGlkbyBwYXJhIHN1YSBhc3NpbmF0dXJhLidcblxuICAgICAgcmV0dXJuIGNvdXBvblxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkVXNlciA9IHRoaXMuY291cG9tVXNlclZhbGlkYXRpb24oY291cG9uLCBjaGVja291dD8udXNlcilcblxuICAgIGlmICghdmFsaWRVc2VyKSB0aHJvdyAnVXN1w6FyaW8gbsOjbyBlbGVnw612ZWwuJ1xuXG4gICAgY29uc3QgY291cG9uVXNlTGltaXRzID0gdGhpcy5nZXRDb3Vwb25Vc2VMaW1pdHMoY291cG9uLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LnVzZXIpXG5cbiAgICBpZiAoIWNvdXBvblVzZUxpbWl0cy51bmxpbWl0ZWQgfHwgY291cG9uVXNlTGltaXRzLmxpbWl0ZWRQZXJVc2VyKSB7XG4gICAgICBjb25zdCBvcmRlcnMgPSBhd2FpdCB0aGlzLmdldE9yZGVyc1dpdGhDb3Vwb24oY291cG9uKVxuXG4gICAgICBpZiAoIWNvdXBvblVzZUxpbWl0cy51bmxpbWl0ZWQgJiYgY291cG9uVXNlTGltaXRzLnRvdGFsICYmIG9yZGVycy5sZW5ndGggPj0gY291cG9uVXNlTGltaXRzLnRvdGFsKVxuICAgICAgICB0aHJvdyAnTGltaXRlIGRlIHVzbyBhdGluZ2lkby4nXG5cbiAgICAgIGlmIChjb3Vwb25Vc2VMaW1pdHMubGltaXRlZFBlclVzZXIpIHtcbiAgICAgICAgY29uc3Qgb3JkZXJzV2l0aFVzZXIgPSB0aGlzLmNvdW50T3JkZXJzV2l0aFVzZXIob3JkZXJzLCBjaGVja291dC51c2VyLmVtYWlsKVxuXG4gICAgICAgIGlmIChvcmRlcnNXaXRoVXNlciA+IDApIHRocm93ICdMaW1pdGUgZGUgdXNvIHBvciB1c3XDoXJpbyBhdGluZ2lkby4nXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzUHJvZHVjdENhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLmhhc1Byb2R1Y3RDYXRlZ29yaWVzKGNvdXBvbiwgY2hlY2tvdXQpXG5cbiAgICBpZiAoIWhhc1Byb2R1Y3RDYXRlZ29yaWVzKSB0aHJvdyAnU2V1IGNhcnJpbmhvIG7Do28gcG9zc3VpIHByb2R1dG9zIGVsZWfDrXZlaXMgcGFyYSBkZXNjb250by4nXG5cbiAgICBjb25zdCBoYXNNaW5TdWJUb3RhbCA9IGF3YWl0IHRoaXMuaGFzTWluU3ViVG90YWwoY291cG9uLCBjaGVja291dClcblxuICAgIGlmICghaGFzTWluU3ViVG90YWwpXG4gICAgICB0aHJvdyBgVmFsb3IgbcOtbmltbyBkZSAke0ludGwuTnVtYmVyRm9ybWF0KCdwdC1CUicsIHsgc3R5bGU6ICdjdXJyZW5jeScsIGN1cnJlbmN5OiAnQlJMJyB9KS5mb3JtYXQoXG4gICAgICAgIGNvdXBvbi5taW5TdWJUb3RhbFZhbHVlLFxuICAgICAgKX0gbsOjbyBhdGluZ2lkb2BcblxuICAgIHJldHVybiBjb3Vwb25cbiAgfVxuXG4gIHB1YmxpYyBjYWxjRGlzY291bnRTdWJzY3JpcHRpb24oY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0U3Vic2NyaXB0aW9uPik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgbGV0IGRpc2NvdW50ID0gMFxuXG4gICAgaWYgKGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpcHRpb24udHlwZSA9PSBDb3Vwb25UeXBlcy5BQlNPTFVURSkgZGlzY291bnQgPSBjb3Vwb24uZGlzY291bnQuc3Vic2NyaXB0aW9uLnZhbHVlXG4gICAgZWxzZSBkaXNjb3VudCA9IGNoZWNrb3V0LnN1YnNjcmlwdGlvblBsYW4ucmVjdXJyZW5jZVByaWNlICogKGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpcHRpb24udmFsdWUgLyAxMDApXG5cbiAgICByZXR1cm4gb2YoZGlzY291bnQpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2FsY0Rpc2NvdW50U2hvcHBpbmcoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IGRpc2NvdW50ID0gMFxuXG4gICAgaWYgKGNoZWNrb3V0LnVzZXIuaXNTdWJzY3JpYmVyICYmIGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpYmVyLnZhbHVlKSB7XG4gICAgICBkaXNjb3VudCA9IGF3YWl0IHRoaXMuY2FsY0Rpc2NvdW50QnlUeXBlKFxuICAgICAgICBjb3Vwb24uZGlzY291bnQuc3Vic2NyaWJlci50eXBlLFxuICAgICAgICBjb3Vwb24uZGlzY291bnQuc3Vic2NyaWJlci52YWx1ZSxcbiAgICAgICAgY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcyxcbiAgICAgICAgY2hlY2tvdXQsXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc2NvdW50ID0gYXdhaXQgdGhpcy5jYWxjRGlzY291bnRCeVR5cGUoXG4gICAgICAgIGNvdXBvbi5kaXNjb3VudC5ub25fc3Vic2NyaWJlci50eXBlLFxuICAgICAgICBjb3Vwb24uZGlzY291bnQubm9uX3N1YnNjcmliZXIudmFsdWUsXG4gICAgICAgIGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMsXG4gICAgICAgIGNoZWNrb3V0LFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBkaXNjb3VudFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxjRGlzY291bnRCeVR5cGUoXG4gICAgdHlwZTogQ291cG9uVHlwZXMsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBjYXRlZ29yaWVzOiBzdHJpbmdbXSxcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IGRpc2NvdW50ID0gMFxuXG4gICAgbGV0IGxpbmVJdGVuc0Rpc2NvdW50ID0gYXdhaXQgdGhpcy5nZXRMaW5lSXRlbnNFbGlnZWJsZUZvckRpc2NvdW50KGNhdGVnb3JpZXMsIGNoZWNrb3V0KVxuXG4gICAgY29uc3Qgc3ViVG90YWwgPSB0aGlzLmNhbGNDaGVja291dFN1YnRvdGFsKGxpbmVJdGVuc0Rpc2NvdW50LCBjaGVja291dC51c2VyLCBjaGVja291dC5zaG9wKVxuXG4gICAgaWYgKHR5cGUgPT0gQ291cG9uVHlwZXMuQUJTT0xVVEUpIHtcbiAgICAgIGRpc2NvdW50ID0gdmFsdWUgPiBzdWJUb3RhbCA/IHN1YlRvdGFsIDogdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzY291bnQgPSBzdWJUb3RhbCAqICh2YWx1ZSAvIDEwMClcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzY291bnRcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFzTWluU3ViVG90YWwoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghY291cG9uLm1pblN1YlRvdGFsVmFsdWUpIHJldHVybiB0cnVlXG5cbiAgICBsZXQgbGluZUl0ZW5zRGlzY291bnQgPSBhd2FpdCB0aGlzLmdldExpbmVJdGVuc0VsaWdlYmxlRm9yRGlzY291bnQoY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcywgY2hlY2tvdXQpXG5cbiAgICBjb25zdCBzdWJUb3RhbCA9IHRoaXMuY2FsY0NoZWNrb3V0U3VidG90YWwobGluZUl0ZW5zRGlzY291bnQsIGNoZWNrb3V0LnVzZXIsIGNoZWNrb3V0LnNob3ApXG5cbiAgICBpZiAoY291cG9uLm1pblN1YlRvdGFsVmFsdWUgPD0gc3ViVG90YWwpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFzUHJvZHVjdENhdGVnb3JpZXMoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcyB8fCAhY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllcyA9IGF3YWl0IHRoaXMuZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMpXG5cbiAgICBjb25zdCBoYXNDYXRlZ29yaWVzID0gY2hlY2tvdXQubGluZUl0ZW1zPy5maWx0ZXIoKGkpID0+IHtcbiAgICAgIGlmICghaS5jYXRlZ29yaWVzIHx8ICFpLmNhdGVnb3JpZXM/Lmxlbmd0aCkgcmV0dXJuIHRydWVcbiAgICAgIHJldHVybiBpLmNhdGVnb3JpZXMuc29tZSgoYykgPT4gY291cG9uQ2F0ZWdvcmllcy5zb21lKChjYXQpID0+IGNhdCA9PSBjKSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIGhhc0NhdGVnb3JpZXMubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGNvdXBvbVVzZXJWYWxpZGF0aW9uKGNvdXBvbjogQ291cG9uLCB1c2VyOiBVc2VyKSB7XG4gICAgaWYgKCF1c2VyIHx8IGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5BTExfVVNFUlMpKSByZXR1cm4gdHJ1ZVxuXG4gICAgbGV0IHVzZXJUeXBlczogRXhjbHVzaXZpdGllc1tdID0gW11cblxuICAgIGlmIChjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuQ09MTEFCT1JBVE9SUykgJiYgdGhpcy5lbWFpbElzRnJvbUNvbGxhYm9yYXRvcih1c2VyLmVtYWlsKSlcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuQ09MTEFCT1JBVE9SUylcblxuICAgIGlmIChjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUikgJiYgY291cG9uLnVzZXJFeGNsdXNpdmVFbWFpbC5pbmNsdWRlcyh1c2VyLmVtYWlsKSlcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUilcblxuICAgIGlmIChcbiAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5BQ1RJVkVfU1VCU0NSSUJFUikgJiZcbiAgICAgIHVzZXIuaXNTdWJzY3JpYmVyICYmXG4gICAgICB1c2VyLnN1YnNjcmlwdGlvblBsYW4gIT0gJydcbiAgICApXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLkFDVElWRV9TVUJTQ1JJQkVSKVxuXG4gICAgaWYgKFxuICAgICAgdXNlci5pc1N1YnNjcmliZXIgJiZcbiAgICAgIHVzZXIuc3Vic2NyaXB0aW9uUGxhbiA9PSAnJyAmJlxuICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLklOQUNUSVZFX1NVQlNDUklCRVIpXG4gICAgKVxuICAgICAgdXNlclR5cGVzLnB1c2goRXhjbHVzaXZpdGllcy5JTkFDVElWRV9TVUJTQ1JJQkVSKVxuXG4gICAgaWYgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5OT05fU1VCU0NSSUJFUikgJiYgIXVzZXIuaXNTdWJzY3JpYmVyKVxuICAgICAgdXNlclR5cGVzLnB1c2goRXhjbHVzaXZpdGllcy5OT05fU1VCU0NSSUJFUilcblxuICAgIHJldHVybiBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLnNvbWUoKHIpID0+IHVzZXJUeXBlcy5pbmNsdWRlcyhyKSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKHByb2R1Y3RzQ2F0ZWdvcmllczogc3RyaW5nW10pOiBQcm9taXNlPEFycmF5PFN0cmluZz4+IHtcbiAgICBjb25zdCBjb3Vwb25DYXRlZ29yaWVzOiBBcnJheTxTdHJpbmc+ID0gW11cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwcm9kdWN0c0NhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBjYXRlZ29yeTogQ2F0ZWdvcnkgJiB7IGZpcmVzdG9yZUlkPzogc3RyaW5nIH0gPSBhd2FpdCB0aGlzLmNhdGVnb3J5UmVwb3NpdG9yeS5nZXQoe1xuICAgICAgICBpZDogcHJvZHVjdHNDYXRlZ29yaWVzW2luZGV4XSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChjYXRlZ29yeSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHRoaXMuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldENoaWxkcmVuKHBhcnNlSW50KHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0pKVxuXG4gICAgICAgIGNvdXBvbkNhdGVnb3JpZXMucHVzaChjYXRlZ29yeS5pZCwgLi4uY2hpbGRyZW4ubWFwKChjKSA9PiBjLmlkLnRvU3RyaW5nKCkpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbLi4ubmV3IFNldChjb3Vwb25DYXRlZ29yaWVzKV1cbiAgfVxuXG4gIHByaXZhdGUgZW1haWxJc0Zyb21Db2xsYWJvcmF0b3IgPSAodXNlckVtYWlsOiBzdHJpbmcpOiBib29sZWFuID0+ICEhdXNlckVtYWlsPy5tYXRjaCgvQGI0YS5jb20uYnIvZylcblxuICBwcml2YXRlIGFzeW5jIGdldExpbmVJdGVuc0VsaWdlYmxlRm9yRGlzY291bnQoXG4gICAgcHJvZHVjdHNDYXRlZ29yaWVzOiBzdHJpbmdbXSxcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXG4gICk6IFByb21pc2U8TGluZUl0ZW1bXT4ge1xuICAgIGxldCBsaW5lSXRlbnNEaXNjb3VudCA9IFtdXG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllcyA9IGF3YWl0IHRoaXMuZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKHByb2R1Y3RzQ2F0ZWdvcmllcylcblxuICAgIGlmIChwcm9kdWN0c0NhdGVnb3JpZXMgJiYgcHJvZHVjdHNDYXRlZ29yaWVzLmxlbmd0aCkge1xuICAgICAgbGluZUl0ZW5zRGlzY291bnQgPSBjaGVja291dC5saW5lSXRlbXM/LmZpbHRlcigoaSkgPT4ge1xuICAgICAgICBpZiAoaS5jYXRlZ29yaWVzPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gaS5jYXRlZ29yaWVzLnNvbWUoKGMpID0+IGNvdXBvbkNhdGVnb3JpZXMuc29tZSgoY2F0KSA9PiBjYXQgPT0gYykpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVJdGVuc0Rpc2NvdW50ID0gY2hlY2tvdXQubGluZUl0ZW1zXG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVJdGVuc0Rpc2NvdW50XG4gIH1cblxuICBwcml2YXRlIGNhbGNDaGVja291dFN1YnRvdGFsKGxpbmVJdGVuczogTGluZUl0ZW1bXSwgdXNlcjogVXNlciwgc2hvcDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKFxuICAgICAgbGluZUl0ZW5zPy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGN1cnIpID0+XG4gICAgICAgICAgdXNlcj8uaXNTdWJzY3JpYmVyICYmIGN1cnIucHJpY2Uuc3Vic2NyaWJlclByaWNlXG4gICAgICAgICAgICA/IGFjYyArIGN1cnIucHJpY2U/LnN1YnNjcmliZXJQcmljZSAqIGN1cnIucXVhbnRpdHlcbiAgICAgICAgICAgIDogYWNjICsgY3Vyci5wcmljZVBhaWQgKiBjdXJyLnF1YW50aXR5LFxuICAgICAgICAwLFxuICAgICAgKSB8fCAwXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPcmRlcnNXaXRoQ291cG9uKGNvdXBvbjogQ291cG9uKTogUHJvbWlzZTxPcmRlcltdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMub3JkZXJSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICBjb3Vwb246IHsgaWQ6IGNvdXBvbi5pZCB9LFxuICAgICAgICAgIHBheW1lbnQ6IHsgc3RhdHVzOiAncGFpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzdWx0KSA9PiByZXN1bHQuZGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgY291bnRPcmRlcnNXaXRoVXNlcihvcmRlcnM6IE9yZGVyW10sIGVtYWlsOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBvcmRlcnMuZmlsdGVyKChvKSA9PiBvLnVzZXIuZW1haWwgPT0gZW1haWwpLmxlbmd0aFxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3Vwb25Vc2VMaW1pdHMoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcywgdXNlcjogVXNlcikge1xuICAgIGxldCBjb3Vwb25Vc2VMaW1pdHM6IHsgdW5saW1pdGVkPzogYm9vbGVhbjsgdG90YWw/OiBudW1iZXI7IGxpbWl0ZWRQZXJVc2VyPzogYm9vbGVhbiB9XG4gICAgaWYgKGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLkVDT01NRVJDRSB8fCBjaGVja291dFR5cGUgPT0gQ2hlY2tvdXRUeXBlcy5BTEwpIHtcbiAgICAgIGNvdXBvblVzZUxpbWl0cyA9IHVzZXIgJiYgdXNlci5pc1N1YnNjcmliZXIgPyBjb3Vwb24udXNlTGltaXRzLnN1YnNjcmliZXIgOiBjb3Vwb24udXNlTGltaXRzLm5vbl9zdWJzY3JpYmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdXBvblVzZUxpbWl0cyA9IGNvdXBvbi51c2VMaW1pdHMuc3Vic2NyaXB0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdXBvblVzZUxpbWl0c1xuICB9XG59XG4iXX0=
@@ -1,2 +1,2 @@
1
- export * from './util.helper';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hlbHBlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3V0aWwuaGVscGVyJ1xyXG4iXX0=
1
+ export * from './util.helper';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hlbHBlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3V0aWwuaGVscGVyJ1xuIl19
@@ -1,18 +1,18 @@
1
- export class UtilHelper {
2
- static createSlug(name) {
3
- return name
4
- .toLowerCase()
5
- .replace(/\s+/g, '-') // Replace spaces with -
6
- .replace(/[ãàáäâ]/g, 'a') // Replace spaces with -
7
- .replace(/[ẽèéëê]/g, 'e') // Replace spaces with -
8
- .replace(/[ìíïî]/g, 'i') // Replace spaces with -
9
- .replace(/[õòóöô]/g, 'o') // Replace spaces with -
10
- .replace(/[ùúüû]/g, 'u') // Replace spaces with -
11
- .replace(/[ñ]/g, 'n') // Replace spaces with -
12
- .replace(/[ç]/g, 'c') // Replace spaces with -
13
- .replace(/[&]/g, 'and') // Replace spaces with -
14
- .replace(/[^\w\-]+/g, '') // Remove all non-word chars
15
- .replace(/\-\-+/g, '-'); // Replace multiple - with single -
16
- }
17
- }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hlbHBlcnMvdXRpbC5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFVBQVU7SUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFZO1FBQzVCLE9BQU8sSUFBSTthQUNSLFdBQVcsRUFBRTthQUNiLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQzdDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2pELE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2pELE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2hELE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2pELE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2hELE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQzdDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQzdDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsd0JBQXdCO2FBQy9DLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsNEJBQTRCO2FBQ3JELE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUEsQ0FBQyxtQ0FBbUM7SUFDL0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFV0aWxIZWxwZXIge1xyXG4gIHN0YXRpYyBjcmVhdGVTbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmFtZVxyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggLVxyXG4gICAgICAucmVwbGFjZSgvW8Ojw6DDocOkw6JdL2csICdhJykgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXHJcbiAgICAgIC5yZXBsYWNlKC9b4bq9w6jDqcOrw6pdL2csICdlJykgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXHJcbiAgICAgIC5yZXBsYWNlKC9bw6zDrcOvw65dL2csICdpJykgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXHJcbiAgICAgIC5yZXBsYWNlKC9bw7XDssOzw7bDtF0vZywgJ28nKSAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIC1cclxuICAgICAgLnJlcGxhY2UoL1vDucO6w7zDu10vZywgJ3UnKSAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIC1cclxuICAgICAgLnJlcGxhY2UoL1vDsV0vZywgJ24nKSAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIC1cclxuICAgICAgLnJlcGxhY2UoL1vDp10vZywgJ2MnKSAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIC1cclxuICAgICAgLnJlcGxhY2UoL1smXS9nLCAnYW5kJykgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXHJcbiAgICAgIC5yZXBsYWNlKC9bXlxcd1xcLV0rL2csICcnKSAvLyBSZW1vdmUgYWxsIG5vbi13b3JkIGNoYXJzXHJcbiAgICAgIC5yZXBsYWNlKC9cXC1cXC0rL2csICctJykgLy8gUmVwbGFjZSBtdWx0aXBsZSAtIHdpdGggc2luZ2xlIC1cclxuICB9XHJcbn1cclxuIl19
1
+ export class UtilHelper {
2
+ static createSlug(name) {
3
+ return name
4
+ .toLowerCase()
5
+ .replace(/\s+/g, '-') // Replace spaces with -
6
+ .replace(/[ãàáäâ]/g, 'a') // Replace spaces with -
7
+ .replace(/[ẽèéëê]/g, 'e') // Replace spaces with -
8
+ .replace(/[ìíïî]/g, 'i') // Replace spaces with -
9
+ .replace(/[õòóöô]/g, 'o') // Replace spaces with -
10
+ .replace(/[ùúüû]/g, 'u') // Replace spaces with -
11
+ .replace(/[ñ]/g, 'n') // Replace spaces with -
12
+ .replace(/[ç]/g, 'c') // Replace spaces with -
13
+ .replace(/[&]/g, 'and') // Replace spaces with -
14
+ .replace(/[^\w\-]+/g, '') // Remove all non-word chars
15
+ .replace(/\-\-+/g, '-'); // Replace multiple - with single -
16
+ }
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hlbHBlcnMvdXRpbC5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFVBQVU7SUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFZO1FBQzVCLE9BQU8sSUFBSTthQUNSLFdBQVcsRUFBRTthQUNiLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQzdDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2pELE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2pELE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2hELE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2pELE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQ2hELE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQzdDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsd0JBQXdCO2FBQzdDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsd0JBQXdCO2FBQy9DLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsNEJBQTRCO2FBQ3JELE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUEsQ0FBQyxtQ0FBbUM7SUFDL0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFV0aWxIZWxwZXIge1xuICBzdGF0aWMgY3JlYXRlU2x1ZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1xccysvZywgJy0nKSAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIC1cbiAgICAgIC5yZXBsYWNlKC9bw6PDoMOhw6TDol0vZywgJ2EnKSAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIC1cbiAgICAgIC5yZXBsYWNlKC9b4bq9w6jDqcOrw6pdL2csICdlJykgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXG4gICAgICAucmVwbGFjZSgvW8Osw63Dr8OuXS9nLCAnaScpIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggLVxuICAgICAgLnJlcGxhY2UoL1vDtcOyw7PDtsO0XS9nLCAnbycpIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggLVxuICAgICAgLnJlcGxhY2UoL1vDucO6w7zDu10vZywgJ3UnKSAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIC1cbiAgICAgIC5yZXBsYWNlKC9bw7FdL2csICduJykgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXG4gICAgICAucmVwbGFjZSgvW8OnXS9nLCAnYycpIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggLVxuICAgICAgLnJlcGxhY2UoL1smXS9nLCAnYW5kJykgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXG4gICAgICAucmVwbGFjZSgvW15cXHdcXC1dKy9nLCAnJykgLy8gUmVtb3ZlIGFsbCBub24td29yZCBjaGFyc1xuICAgICAgLnJlcGxhY2UoL1xcLVxcLSsvZywgJy0nKSAvLyBSZXBsYWNlIG11bHRpcGxlIC0gd2l0aCBzaW5nbGUgLVxuICB9XG59XG4iXX0=