@infrab4a/connect 1.0.0-beta.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/bundles/infrab4a-connect.umd.js +1260 -320
  2. package/bundles/infrab4a-connect.umd.js.map +1 -1
  3. package/domain/catalog/models/category.d.ts +2 -2
  4. package/domain/catalog/models/index.d.ts +3 -2
  5. package/domain/catalog/models/kit-product.d.ts +12 -0
  6. package/domain/catalog/models/product.d.ts +6 -2
  7. package/domain/catalog/models/types/product-review.type.d.ts +10 -8
  8. package/domain/catalog/models/variant.d.ts +3 -1
  9. package/domain/catalog/repositories/product.repository.d.ts +9 -2
  10. package/domain/generic/model/base.model.d.ts +1 -1
  11. package/domain/generic/model/types/base-model-builder.type.d.ts +1 -1
  12. package/domain/generic/model/types/non-function-property-name.type.d.ts +1 -1
  13. package/domain/generic/repository/create.repository.d.ts +2 -2
  14. package/domain/generic/repository/delete.repository.d.ts +3 -1
  15. package/domain/generic/repository/find.repository.d.ts +2 -1
  16. package/domain/generic/repository/types/repository-find-filters.type.d.ts +4 -4
  17. package/domain/generic/repository/types/repository-update-params.type.d.ts +4 -4
  18. package/domain/users/errors/unauthorized.error.d.ts +2 -1
  19. package/domain/users/errors/user-already-registered.error.d.ts +2 -1
  20. package/domain/users/errors/weak-password.error.d.ts +2 -1
  21. package/domain/users/models/user.d.ts +2 -0
  22. package/errors/duplicated-results.error.d.ts +2 -1
  23. package/errors/invalid-argument.error.d.ts +2 -1
  24. package/errors/not-found.error.d.ts +2 -1
  25. package/errors/required-argument.error.d.ts +2 -1
  26. package/esm2015/domain/catalog/models/category.js +1 -1
  27. package/esm2015/domain/catalog/models/index.js +4 -3
  28. package/esm2015/domain/catalog/models/kit-product.js +18 -0
  29. package/esm2015/domain/catalog/models/product.js +8 -1
  30. package/esm2015/domain/catalog/models/types/product-review.type.js +1 -1
  31. package/esm2015/domain/catalog/models/variant.js +1 -1
  32. package/esm2015/domain/catalog/repositories/product.repository.js +1 -1
  33. package/esm2015/domain/generic/model/base.model.js +4 -4
  34. package/esm2015/domain/generic/model/types/base-model-builder.type.js +1 -1
  35. package/esm2015/domain/generic/model/types/non-function-property-name.type.js +1 -1
  36. package/esm2015/domain/generic/repository/create.repository.js +1 -1
  37. package/esm2015/domain/generic/repository/delete.repository.js +1 -1
  38. package/esm2015/domain/generic/repository/find.repository.js +1 -1
  39. package/esm2015/domain/generic/repository/types/repository-find-filters.type.js +1 -1
  40. package/esm2015/domain/generic/repository/types/repository-update-params.type.js +1 -1
  41. package/esm2015/domain/users/errors/unauthorized.error.js +3 -2
  42. package/esm2015/domain/users/errors/user-already-registered.error.js +3 -2
  43. package/esm2015/domain/users/errors/weak-password.error.js +3 -2
  44. package/esm2015/domain/users/models/user.js +1 -1
  45. package/esm2015/errors/duplicated-results.error.js +3 -2
  46. package/esm2015/errors/invalid-argument.error.js +3 -2
  47. package/esm2015/errors/not-found.error.js +3 -2
  48. package/esm2015/errors/required-argument.error.js +3 -2
  49. package/esm2015/infra/elasticsearch/adapters/axios.adapter.js +36 -1
  50. package/esm2015/infra/elasticsearch/adapters/elastic-search.adapter.js +1 -1
  51. package/esm2015/infra/elasticsearch/indexes/products-index.js +35 -1
  52. package/esm2015/infra/firebase/auth/authentication-firebase-auth.service.js +2 -2
  53. package/esm2015/infra/firebase/auth/register-firebase-auth.service.js +1 -1
  54. package/esm2015/infra/firebase/firestore/mixins/with-find-firestore.mixin.js +5 -5
  55. package/esm2015/infra/firebase/firestore/mixins/with-firestore.mixin.js +2 -3
  56. package/esm2015/infra/firebase/firestore/mixins/with-helpers.mixin.js +1 -1
  57. package/esm2015/infra/firebase/firestore/repositories/catalog/category-firestore.repository.js +4 -2
  58. package/esm2015/infra/firebase/firestore/repositories/catalog/product-firestore.repository.js +32 -5
  59. package/esm2015/infra/hasura-graphql/index.js +3 -2
  60. package/esm2015/infra/hasura-graphql/mixins/helpers/attribute-option.helper.js +18 -2
  61. package/esm2015/infra/hasura-graphql/mixins/helpers/filter-option.helper.js +18 -0
  62. package/esm2015/infra/hasura-graphql/mixins/helpers/graphql-field.helper.js +72 -0
  63. package/esm2015/infra/hasura-graphql/mixins/helpers/index.js +3 -1
  64. package/esm2015/infra/hasura-graphql/mixins/with-create-hasura-graphql.mixin.js +21 -2
  65. package/esm2015/infra/hasura-graphql/mixins/with-delete-hasura-graphql.mixin.js +14 -6
  66. package/esm2015/infra/hasura-graphql/mixins/with-find-hasura-graphql.mixin.js +24 -26
  67. package/esm2015/infra/hasura-graphql/mixins/with-get-hasura-graphql.mixin.js +14 -10
  68. package/esm2015/infra/hasura-graphql/mixins/with-hasura-graphql.mixin.js +10 -84
  69. package/esm2015/infra/hasura-graphql/mixins/with-update-hasura-graphql.mixin.js +18 -7
  70. package/esm2015/infra/hasura-graphql/models/category-hasura-graphql.js +1 -1
  71. package/esm2015/infra/hasura-graphql/models/index.js +4 -1
  72. package/esm2015/infra/hasura-graphql/models/kit-product-hasura-graphql.js +15 -0
  73. package/esm2015/infra/hasura-graphql/models/product-hasura-graphql.js +11 -0
  74. package/esm2015/infra/hasura-graphql/models/variant-hasura-graphql.js +9 -0
  75. package/esm2015/infra/hasura-graphql/repositories/catalog/category-hasura-graphql.repository.js +47 -15
  76. package/esm2015/infra/hasura-graphql/repositories/catalog/index.js +2 -1
  77. package/esm2015/infra/hasura-graphql/repositories/catalog/product-hasura-graphql.repository.js +352 -63
  78. package/esm2015/infra/hasura-graphql/repositories/catalog/variant-hasura-graphql.repository.js +107 -0
  79. package/esm2015/infra/hasura-graphql/types/graphql.repository.type.js +1 -1
  80. package/esm2015/infra/hasura-graphql/types/hasura-graphql-fields.type.js +1 -1
  81. package/esm2015/infra/hasura-graphql/types/hasura-graphql-headers.type.js +2 -0
  82. package/esm2015/infra/hasura-graphql/types/index.js +2 -1
  83. package/fesm2015/infrab4a-connect.js +843 -219
  84. package/fesm2015/infrab4a-connect.js.map +1 -1
  85. package/infra/elasticsearch/adapters/axios.adapter.d.ts +3 -0
  86. package/infra/elasticsearch/adapters/elastic-search.adapter.d.ts +3 -0
  87. package/infra/elasticsearch/indexes/products-index.d.ts +5 -1
  88. package/infra/firebase/auth/authentication-firebase-auth.service.d.ts +1 -1
  89. package/infra/firebase/auth/register-firebase-auth.service.d.ts +1 -1
  90. package/infra/firebase/firestore/mixins/with-find-firestore.mixin.d.ts +1 -1
  91. package/infra/firebase/firestore/mixins/with-firestore.mixin.d.ts +1 -1
  92. package/infra/firebase/firestore/repositories/catalog/product-firestore.repository.d.ts +4 -2
  93. package/infra/hasura-graphql/index.d.ts +2 -1
  94. package/infra/hasura-graphql/mixins/helpers/attribute-option.helper.d.ts +9 -6
  95. package/infra/hasura-graphql/mixins/helpers/filter-option.helper.d.ts +6 -0
  96. package/infra/hasura-graphql/mixins/helpers/graphql-field.helper.d.ts +8 -0
  97. package/infra/hasura-graphql/mixins/helpers/index.d.ts +2 -0
  98. package/infra/hasura-graphql/mixins/with-create-hasura-graphql.mixin.d.ts +1 -1
  99. package/infra/hasura-graphql/mixins/with-find-hasura-graphql.mixin.d.ts +8 -7
  100. package/infra/hasura-graphql/mixins/with-get-hasura-graphql.mixin.d.ts +5 -5
  101. package/infra/hasura-graphql/mixins/with-hasura-graphql.mixin.d.ts +3 -3
  102. package/infra/hasura-graphql/mixins/with-update-hasura-graphql.mixin.d.ts +1 -1
  103. package/infra/hasura-graphql/models/category-hasura-graphql.d.ts +3 -1
  104. package/infra/hasura-graphql/models/index.d.ts +3 -0
  105. package/infra/hasura-graphql/models/kit-product-hasura-graphql.d.ts +6 -0
  106. package/infra/hasura-graphql/models/product-hasura-graphql.d.ts +9 -0
  107. package/infra/hasura-graphql/models/variant-hasura-graphql.d.ts +9 -0
  108. package/infra/hasura-graphql/repositories/catalog/index.d.ts +1 -0
  109. package/infra/hasura-graphql/repositories/catalog/product-hasura-graphql.repository.d.ts +21 -5
  110. package/infra/hasura-graphql/repositories/catalog/variant-hasura-graphql.repository.d.ts +13 -0
  111. package/infra/hasura-graphql/types/graphql.repository.type.d.ts +5 -5
  112. package/infra/hasura-graphql/types/hasura-graphql-fields.type.d.ts +15 -19
  113. package/infra/hasura-graphql/types/hasura-graphql-headers.type.d.ts +7 -0
  114. package/infra/hasura-graphql/types/index.d.ts +1 -0
  115. package/package.json +4 -3
@@ -1,86 +1,375 @@
1
- import { __awaiter } from "tslib";
2
- import { Base } from '../../../../utils';
3
- import { HasuraGraphQLColumnType } from '../../enums';
4
- import { Product, Shops, Where } from '../../../../domain';
1
+ import { __awaiter, __rest } from "tslib";
2
+ import { Shops, } from '../../../../domain';
3
+ import { NotFoundError } from '../../../../errors';
4
+ import { Base, isNil, omit } from '../../../../utils';
5
+ import { HasuraGraphQLColumnType, HasuraGraphQLWhere } from '../../enums';
5
6
  import { withCrudHasuraGraphQL, withHasuraGraphQL } from '../../mixins';
7
+ import { ProductHasuraGraphQL } from '../../models';
6
8
  export class ProductHasuraGraphQLRepository extends withCrudHasuraGraphQL(withHasuraGraphQL(Base)) {
7
9
  constructor(endpoint, authOptions) {
8
10
  super({
9
11
  tableName: 'product',
10
- model: Product,
12
+ model: ProductHasuraGraphQL,
11
13
  endpoint,
12
14
  authOptions,
13
- fields: [
14
- { id: { columnName: 'id', to: (value) => +value, from: (value) => value.toString() } },
15
- { CEST: { columnName: 'cest' } },
16
- { EAN: { columnName: 'ean' } },
17
- { NCM: { columnName: 'ncm' } },
18
- 'brand',
19
- { costPrice: { columnName: 'cost_price' } },
20
- 'description',
21
- { hasVariants: { columnName: 'has_variants' } },
22
- 'images',
23
- 'miniatures',
24
- 'name',
25
- { price: { columnName: 'full_price' } },
26
- { price: { columnName: 'subscriber_discount_percentage' } },
27
- { price: { columnName: 'subscriber_price' } },
28
- {
29
- price: {
30
- columnName: 'price',
31
- from: (price, data) => Object.values(Shops).reduce((prices, shop) => (Object.assign(Object.assign({}, prices), { [shop]: {
32
- price,
33
- fullPrice: data.full_price,
34
- subscriberDiscountPercentage: data.subscriber_discount_percentage,
35
- subscriberPrice: data.subscriber_price,
36
- } })), {}),
37
- },
15
+ fields: [],
16
+ });
17
+ this.bindReviewToModel = (plain) => (Object.assign(Object.assign({}, omit(plain, ['product_id', 'created_at', 'updated_at', 'person_id', 'order_id'])), { createdAt: typeof plain.created_at === 'string' ? new Date(plain.created_at) : plain.created_at, updatedAt: typeof plain.updated_at === 'string' ? new Date(plain.updated_at) : plain.updated_at, personId: plain.person_id, orderId: plain.order_id }));
18
+ this.bindReviewToHasura = (review) => (Object.assign(Object.assign({}, omit(review, ['productId', 'createdAt', 'updatedAt', 'personId', 'orderId'])), { person_id: review.personId, order_id: review.orderId }));
19
+ const commonFields = [
20
+ { id: { columnName: 'id', to: (value) => +value, from: (value) => value.toString() } },
21
+ { firestoreId: { columnName: 'firestore_id' } },
22
+ { CEST: { columnName: 'cest' } },
23
+ { EAN: { columnName: 'ean' } },
24
+ { NCM: { columnName: 'ncm' } },
25
+ 'brand',
26
+ { costPrice: { columnName: 'cost_price' } },
27
+ {
28
+ description: {
29
+ columnName: 'description',
30
+ from: (description) => Object.values(Shops).reduce((shops, shop) => (Object.assign(Object.assign({}, shops), { [shop]: { description } })), {}),
31
+ to: (value) => Object.values(value).shift().description,
38
32
  },
39
- 'published',
40
- { publishedGlam: { columnName: 'published_glam' } },
41
- 'sku',
42
- {
43
- stock: {
44
- columnName: 'stock',
45
- from: (quantity) => ({ quantity }),
46
- to: (value) => (value === null || value === void 0 ? void 0 : value.quantity) || value,
33
+ },
34
+ { hasVariants: { columnName: 'has_variants' } },
35
+ { images: { columnName: 'images', to: (value) => { var _a; return `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}`; } } },
36
+ { miniatures: { columnName: 'miniatures', to: (value) => { var _a; return `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}`; } } },
37
+ 'name',
38
+ {
39
+ price: {
40
+ columnName: 'price',
41
+ from: (price, data) => Object.values(Shops).reduce((prices, shop) => (Object.assign(Object.assign({}, prices), { [shop]: {
42
+ price,
43
+ fullPrice: data.full_price,
44
+ subscriberDiscountPercentage: data.subscriber_discount_percentage,
45
+ subscriberPrice: data.subscriber_price,
46
+ } })), {}),
47
+ bindFindFilter: (sentence) => {
48
+ const filters = Object.values(sentence).shift();
49
+ return Object.assign(Object.assign(Object.assign(Object.assign({}, (((filters === null || filters === void 0 ? void 0 : filters.price) || (filters === null || filters === void 0 ? void 0 : filters.price) === 0) && { price: filters.price })), ((filters.fullPrice || filters.fullPrice === 0) && { full_price: filters.fullPrice })), ((filters.subscriberDiscountPercentage || filters.subscriberDiscountPercentage === 0) && {
50
+ subscriber_discount_percentage: filters.subscriberDiscountPercentage,
51
+ })), ((filters.subscriberPrice || filters.subscriberPrice === 0) && {
52
+ subscriber_price: filters.subscriberPrice,
53
+ }));
47
54
  },
48
- },
49
- 'type',
50
- 'video',
51
- 'weight',
52
- {
53
- categories: {
54
- columnName: 'categories',
55
- fields: ['category_id'],
56
- to: (category_id) => +category_id,
57
- from: (categories) => (categories === null || categories === void 0 ? void 0 : categories.map((category) => { var _a; return (_a = category === null || category === void 0 ? void 0 : category.category_id) === null || _a === void 0 ? void 0 : _a.toString(); })) || [],
55
+ bindPersistData: (value) => {
56
+ const priceData = Object.values(value).shift();
57
+ return Object.assign(Object.assign(Object.assign(Object.assign({}, ((priceData === null || priceData === void 0 ? void 0 : priceData.price) >= 0 && { price: priceData.price })), (priceData.fullPrice >= 0 && { full_price: priceData.fullPrice })), (priceData.subscriberDiscountPercentage >= 0 && {
58
+ subscriber_discount_percentage: priceData.subscriberDiscountPercentage,
59
+ })), (priceData.subscriberPrice >= 0 && { subscriber_price: priceData.subscriberPrice }));
58
60
  },
59
61
  },
60
- {
61
- shopAvailability: {
62
- columnName: 'shop_availabilities',
63
- fields: ['shop'],
64
- from: (shop) => (Array.isArray(shop) ? shop.map((row) => row.shop) : []),
65
- },
62
+ },
63
+ { fullPrice: { columnName: 'full_price' } },
64
+ { subscriberDiscountPercentage: { columnName: 'subscriber_discount_percentage' } },
65
+ { subscriberPrice: { columnName: 'subscriber_price' } },
66
+ 'published',
67
+ { publishedGlam: { columnName: 'published_glam' } },
68
+ 'sku',
69
+ {
70
+ stock: {
71
+ columnName: 'stock',
72
+ from: (quantity) => ({ quantity }),
73
+ to: (value) => (isNil(value === null || value === void 0 ? void 0 : value.quantity) ? value : value === null || value === void 0 ? void 0 : value.quantity),
74
+ },
75
+ },
76
+ 'slug',
77
+ 'type',
78
+ 'video',
79
+ 'weight',
80
+ {
81
+ shopAvailability: {
82
+ columnName: 'shop_availabilities',
83
+ fields: ['shop'],
84
+ from: (shop) => (Array.isArray(shop) ? shop.map((row) => row.shop) : []),
85
+ bindPersistData: (shops) => ({ shop_availabilities: { data: shops.map((shop) => ({ shop })) } }),
66
86
  },
67
- { tags: { columnName: 'tags', type: HasuraGraphQLColumnType.Jsonb } },
68
- { createdAt: { columnName: 'created_at' } },
69
- { updatedAt: { columnName: 'updated_at' } },
70
- ],
87
+ },
88
+ { tags: { columnName: 'tags', type: HasuraGraphQLColumnType.Jsonb } },
89
+ { isKit: { columnName: 'is_kit' } },
90
+ { createdAt: { columnName: 'created_at' } },
91
+ { updatedAt: { columnName: 'updated_at' } },
92
+ {
93
+ rate: {
94
+ columnName: 'reviews_aggregate',
95
+ fields: [{ aggregate: [{ avg: ['rate'] }] }],
96
+ from: (value) => value.aggregate.avg.rate,
97
+ },
98
+ },
99
+ ];
100
+ this.fields = [
101
+ ...commonFields,
102
+ {
103
+ categories: {
104
+ columnName: 'categories',
105
+ fields: ['category_id'],
106
+ bindPersistData: (value) => ({
107
+ categories: { data: value.map((category) => ({ category_id: +category })) },
108
+ }),
109
+ to: (categories) => categories.map((categoryId) => +categoryId),
110
+ from: (categories) => (categories === null || categories === void 0 ? void 0 : categories.map((category) => { var _a; return (_a = category === null || category === void 0 ? void 0 : category.category_id) === null || _a === void 0 ? void 0 : _a.toString(); })) || [],
111
+ },
112
+ },
113
+ {
114
+ kitProducts: {
115
+ columnName: 'kit_products',
116
+ foreignKeyColumn: { productId: 'id' },
117
+ fields: [
118
+ { productId: { columnName: 'product_id' } },
119
+ { kitProductId: { columnName: 'kit_product_id' } },
120
+ 'quantity',
121
+ { product: { columnName: 'product', foreignKeyColumn: { id: 'product_id' }, fields: commonFields } },
122
+ ],
123
+ },
124
+ },
125
+ ];
126
+ }
127
+ get reviewsFields() {
128
+ return [
129
+ 'id',
130
+ 'shop',
131
+ 'rate',
132
+ 'author',
133
+ 'email',
134
+ 'location',
135
+ 'review',
136
+ 'status',
137
+ 'title',
138
+ 'person_id',
139
+ 'points',
140
+ 'order_id',
141
+ 'created_at',
142
+ 'updated_at',
143
+ ];
144
+ }
145
+ create(data) {
146
+ const _super = Object.create(null, {
147
+ create: { get: () => super.create }
148
+ });
149
+ return __awaiter(this, void 0, void 0, function* () {
150
+ const product = yield _super.create.call(this, omit(data, ['reviews']));
151
+ try {
152
+ product.reviews = yield this.updateReviews(+product.id, data);
153
+ }
154
+ catch (error) {
155
+ yield this.delete({ id: product.id });
156
+ throw error;
157
+ }
158
+ return product;
159
+ });
160
+ }
161
+ get(identifiers) {
162
+ const _super = Object.create(null, {
163
+ get: { get: () => super.get }
164
+ });
165
+ var _a;
166
+ return __awaiter(this, void 0, void 0, function* () {
167
+ const product = Number.isNaN(+identifiers.id)
168
+ ? (_a = (yield this.find({ filters: { firestoreId: identifiers.id } })).data) === null || _a === void 0 ? void 0 : _a[0]
169
+ : yield _super.get.call(this, identifiers);
170
+ product.reviews = yield this.findReviewsByProduct(+product.id);
171
+ return product;
71
172
  });
72
173
  }
73
- getBySlug(slug, shop) {
174
+ getBySlug(slug) {
74
175
  var _a;
75
176
  return __awaiter(this, void 0, void 0, function* () {
76
177
  const result = yield this.find({
77
178
  filters: {
78
- slug: { operator: Where.EQUALS, value: slug },
79
- shopAvailability: { operator: Where.IN, value: [shop] },
179
+ slug,
180
+ },
181
+ });
182
+ const product = (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.shift();
183
+ product.reviews = yield this.findReviewsByProduct(+product.id);
184
+ return product;
185
+ });
186
+ }
187
+ update(params) {
188
+ const _super = Object.create(null, {
189
+ update: { get: () => super.update }
190
+ });
191
+ return __awaiter(this, void 0, void 0, function* () {
192
+ const { categories, kitProducts, reviews, id: checkId, shopAvailability, rate } = params, data = __rest(params, ["categories", "kitProducts", "reviews", "id", "shopAvailability", "rate"]);
193
+ const plainData = this.paramsToPlain({ id: checkId });
194
+ const id = yield this.getId(plainData.id);
195
+ const product = yield _super.update.call(this, Object.assign({ id }, data));
196
+ product.categories = categories && (yield this.updateCategories(+id, { categories }));
197
+ product.kitProducts = kitProducts && (yield this.updateKitProducts(+id, { kitProducts }));
198
+ product.reviews = reviews && (yield this.updateReviews(+id, { reviews }));
199
+ return product;
200
+ });
201
+ }
202
+ fetchReviews(status) {
203
+ return __awaiter(this, void 0, void 0, function* () {
204
+ const reviews = {
205
+ status: status === 'pending'
206
+ ? { [HasuraGraphQLWhere.ISNULL]: true }
207
+ : { [HasuraGraphQLWhere.EQUALS]: status === 'approved' },
208
+ };
209
+ const { product: data } = yield this.query('product', ['id', 'name', 'sku', { reviews: { columnName: 'reviews', fields: this.reviewsFields } }], {
210
+ where: { value: { reviews }, type: 'product_bool_exp', required: true },
211
+ });
212
+ return data.reduce((reviews, product) => [
213
+ ...reviews,
214
+ ...product.reviews
215
+ .filter((review) => (status === 'pending' && [undefined, null].includes(review.status)) ||
216
+ (status === 'approved' && review.status === true) ||
217
+ (status === 'rejected' && review.status === false))
218
+ .map((review) => (Object.assign(Object.assign({}, this.bindReviewToModel(review)), { productId: product.id, productName: product.name, productSku: product.sku }))),
219
+ ], []);
220
+ });
221
+ }
222
+ updateCategories(productId, { categories }) {
223
+ return __awaiter(this, void 0, void 0, function* () {
224
+ const plainData = this.paramsToPlain({ categories });
225
+ yield this.mutation('delete_category_product', ['affected_rows'], {
226
+ where: {
227
+ type: 'category_product_bool_exp',
228
+ required: true,
229
+ value: { product_id: { _eq: productId } },
230
+ },
231
+ });
232
+ yield this.mutation('insert_category_product', ['affected_rows'], {
233
+ objects: {
234
+ type: '[category_product_insert_input!]',
235
+ required: true,
236
+ value: plainData.categories.map((categoryId) => ({ category_id: categoryId, product_id: productId })),
237
+ },
238
+ });
239
+ return plainData.categories;
240
+ });
241
+ }
242
+ updateKitProducts(productId, { kitProducts }) {
243
+ return __awaiter(this, void 0, void 0, function* () {
244
+ const plainData = this.paramsToPlain({ kitProducts });
245
+ yield this.mutation('delete_product_kit', ['affected_rows'], {
246
+ where: {
247
+ type: 'product_kit_bool_exp',
248
+ required: true,
249
+ value: { product_id: { _eq: productId } },
250
+ },
251
+ });
252
+ yield this.mutation('insert_product_kit', ['affected_rows'], {
253
+ objects: {
254
+ type: '[product_kit_insert_input!]',
255
+ required: true,
256
+ value: plainData.kitProducts.map((kitProduct) => ({
257
+ kit_product_id: kitProduct.productId || kitProduct.product.id,
258
+ product_id: productId,
259
+ quantity: kitProduct.quantity,
260
+ })),
261
+ },
262
+ });
263
+ return plainData.kitProducts;
264
+ });
265
+ }
266
+ updateReviews(productId, { reviews }) {
267
+ return __awaiter(this, void 0, void 0, function* () {
268
+ if (!reviews)
269
+ return [];
270
+ if ('action' in reviews && reviews.action === 'remove') {
271
+ const reviewIds = yield Promise.all(reviews.value.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
272
+ const review = yield this.findReview(reviewData, productId);
273
+ return review === null || review === void 0 ? void 0 : review.id;
274
+ })));
275
+ yield this.mutation('delete_product_review', ['affected_rows'], {
276
+ where: { value: { id: { _in: reviewIds.filter(Boolean) } }, type: 'product_review_bool_exp', required: true },
277
+ });
278
+ return reviews.value.map((review, index) => !reviewIds[index] && review).filter(Boolean);
279
+ }
280
+ const plainData = this.paramsToPlain({ reviews });
281
+ return Promise.all(plainData.reviews.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
282
+ const review = yield this.findReview(reviewData, productId);
283
+ if (review.id)
284
+ return this.bindReviewToModel((yield this.mutation('update_product_review_by_pk', this.reviewsFields, {
285
+ pk_columns: {
286
+ value: { id: review.id },
287
+ type: 'product_review_pk_columns_input',
288
+ required: true,
289
+ },
290
+ _set: {
291
+ value: omit(this.bindReviewToHasura(reviewData), ['id', 'product_id']),
292
+ type: 'product_review_set_input',
293
+ required: true,
294
+ },
295
+ })).update_product_review_by_pk);
296
+ return this.bindReviewToModel((yield this.mutation('insert_product_review_one', this.reviewsFields, {
297
+ object: {
298
+ value: omit(Object.assign(Object.assign({}, this.bindReviewToHasura(reviewData)), { product_id: productId }), ['id']),
299
+ type: 'product_review_insert_input',
300
+ required: true,
301
+ },
302
+ })).insert_product_review_one);
303
+ })));
304
+ });
305
+ }
306
+ getId(id) {
307
+ var _a, _b;
308
+ return __awaiter(this, void 0, void 0, function* () {
309
+ if (!Number.isNaN(+id))
310
+ return id;
311
+ const { data } = yield this.find({ filters: { firestoreId: id } });
312
+ if ((_a = data === null || data === void 0 ? void 0 : data[0]) === null || _a === void 0 ? void 0 : _a.id)
313
+ return (_b = data === null || data === void 0 ? void 0 : data[0]) === null || _b === void 0 ? void 0 : _b.id;
314
+ throw new NotFoundError(`Product with id ${id} not found`);
315
+ });
316
+ }
317
+ findReviewsByProduct(productId) {
318
+ return __awaiter(this, void 0, void 0, function* () {
319
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
320
+ where: {
321
+ value: {
322
+ product_id: { _eq: productId },
323
+ },
324
+ type: 'product_review_bool_exp',
325
+ required: true,
326
+ },
327
+ });
328
+ return data && data.map((review) => this.bindReviewToModel(review));
329
+ });
330
+ }
331
+ findReview(review, productId) {
332
+ return __awaiter(this, void 0, void 0, function* () {
333
+ if (review.id)
334
+ return review;
335
+ let loadedReview;
336
+ if (review.personId)
337
+ loadedReview = yield this.getReviewByPersonId(review.personId, productId);
338
+ if (!loadedReview && review.author && review.email)
339
+ loadedReview = yield this.getReviewByAuthorAndEmail(review.author, review.email, productId);
340
+ return loadedReview || review;
341
+ });
342
+ }
343
+ getReviewByPersonId(personId, productId) {
344
+ return __awaiter(this, void 0, void 0, function* () {
345
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
346
+ where: {
347
+ value: {
348
+ product_id: { _eq: productId },
349
+ person_id: { _eq: personId },
350
+ },
351
+ type: `product_review_bool_exp`,
352
+ required: true,
353
+ },
354
+ });
355
+ return data && data[0] && this.bindReviewToModel(data[0]);
356
+ });
357
+ }
358
+ getReviewByAuthorAndEmail(author, email, productId) {
359
+ return __awaiter(this, void 0, void 0, function* () {
360
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
361
+ where: {
362
+ value: {
363
+ product_id: { _eq: productId },
364
+ author: { _eq: author },
365
+ email: { _eq: email },
366
+ },
367
+ type: `product_review_bool_exp`,
368
+ required: true,
80
369
  },
81
370
  });
82
- return (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.shift();
371
+ return data && data[0] && this.bindReviewToModel(data[0]);
83
372
  });
84
373
  }
85
374
  }
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC9zcmMvaW5mcmEvaGFzdXJhLWdyYXBocWwvcmVwb3NpdG9yaWVzL2NhdGFsb2cvcHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFeEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQXFCLEtBQUssRUFBYyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUN6RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFdkUsTUFBTSxPQUFPLDhCQUNYLFNBQVEscUJBQXFCLENBQUMsaUJBQWlCLENBQVUsSUFBSSxDQUFDLENBQUM7SUFHL0QsWUFBWSxRQUFnQixFQUFFLFdBQXFDO1FBQ2pFLEtBQUssQ0FBQztZQUNKLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLEtBQUssRUFBRSxPQUFPO1lBQ2QsUUFBUTtZQUNSLFdBQVc7WUFDWCxNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRTtnQkFDdEYsRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ2hDLEVBQUUsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM5QixFQUFF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LEVBQUU7Z0JBQzNDLEVBQUUsU0FBUyxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxFQUFFO2FBQzVDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVLLFNBQVMsQ0FBQyxJQUFZLEVBQUUsSUFBVzs7O1lBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDN0IsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7b0JBQzdDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7aUJBQ3hEO2FBQ0YsQ0FBQyxDQUFBO1lBRUYsT0FBTyxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLDBDQUFFLEtBQUssRUFBRSxDQUFBOztLQUM3QjtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgSGFzdXJhR3JhcGhRTEF1dGhPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgeyBIYXN1cmFHcmFwaFFMQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zJ1xuaW1wb3J0IHsgUHJvZHVjdCwgUHJvZHVjdFJlcG9zaXRvcnksIFNob3BzLCBTaG9wc1ByaWNlLCBXaGVyZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RvbWFpbidcbmltcG9ydCB7IHdpdGhDcnVkSGFzdXJhR3JhcGhRTCwgd2l0aEhhc3VyYUdyYXBoUUwgfSBmcm9tICcuLi8uLi9taXhpbnMnXG5cbmV4cG9ydCBjbGFzcyBQcm9kdWN0SGFzdXJhR3JhcGhRTFJlcG9zaXRvcnlcbiAgZXh0ZW5kcyB3aXRoQ3J1ZEhhc3VyYUdyYXBoUUwod2l0aEhhc3VyYUdyYXBoUUw8UHJvZHVjdD4oQmFzZSkpXG4gIGltcGxlbWVudHMgUHJvZHVjdFJlcG9zaXRvcnlcbntcbiAgY29uc3RydWN0b3IoZW5kcG9pbnQ6IHN0cmluZywgYXV0aE9wdGlvbnM6IEhhc3VyYUdyYXBoUUxBdXRoT3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIHRhYmxlTmFtZTogJ3Byb2R1Y3QnLFxuICAgICAgbW9kZWw6IFByb2R1Y3QsXG4gICAgICBlbmRwb2ludCxcbiAgICAgIGF1dGhPcHRpb25zLFxuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgaWQ6IHsgY29sdW1uTmFtZTogJ2lkJywgdG86ICh2YWx1ZSkgPT4gK3ZhbHVlLCBmcm9tOiAodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKCkgfSB9LFxuICAgICAgICB7IENFU1Q6IHsgY29sdW1uTmFtZTogJ2Nlc3QnIH0gfSxcbiAgICAgICAgeyBFQU46IHsgY29sdW1uTmFtZTogJ2VhbicgfSB9LFxuICAgICAgICB7IE5DTTogeyBjb2x1bW5OYW1lOiAnbmNtJyB9IH0sXG4gICAgICAgICdicmFuZCcsXG4gICAgICAgIHsgY29zdFByaWNlOiB7IGNvbHVtbk5hbWU6ICdjb3N0X3ByaWNlJyB9IH0sXG4gICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgIHsgaGFzVmFyaWFudHM6IHsgY29sdW1uTmFtZTogJ2hhc192YXJpYW50cycgfSB9LFxuICAgICAgICAnaW1hZ2VzJyxcbiAgICAgICAgJ21pbmlhdHVyZXMnLFxuICAgICAgICAnbmFtZScsXG4gICAgICAgIHsgcHJpY2U6IHsgY29sdW1uTmFtZTogJ2Z1bGxfcHJpY2UnIH0gfSxcbiAgICAgICAgeyBwcmljZTogeyBjb2x1bW5OYW1lOiAnc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlJyB9IH0sXG4gICAgICAgIHsgcHJpY2U6IHsgY29sdW1uTmFtZTogJ3N1YnNjcmliZXJfcHJpY2UnIH0gfSxcbiAgICAgICAge1xuICAgICAgICAgIHByaWNlOiB7XG4gICAgICAgICAgICBjb2x1bW5OYW1lOiAncHJpY2UnLFxuICAgICAgICAgICAgZnJvbTogKHByaWNlLCBkYXRhKTogU2hvcHNQcmljZSA9PlxuICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKFNob3BzKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKHByaWNlczogU2hvcHNQcmljZSwgc2hvcCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLnByaWNlcyxcbiAgICAgICAgICAgICAgICAgIFtzaG9wXToge1xuICAgICAgICAgICAgICAgICAgICBwcmljZSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbFByaWNlOiBkYXRhLmZ1bGxfcHJpY2UsXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2U6IGRhdGEuc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlLFxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyUHJpY2U6IGRhdGEuc3Vic2NyaWJlcl9wcmljZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ3B1Ymxpc2hlZCcsXG4gICAgICAgIHsgcHVibGlzaGVkR2xhbTogeyBjb2x1bW5OYW1lOiAncHVibGlzaGVkX2dsYW0nIH0gfSxcbiAgICAgICAgJ3NrdScsXG4gICAgICAgIHtcbiAgICAgICAgICBzdG9jazoge1xuICAgICAgICAgICAgY29sdW1uTmFtZTogJ3N0b2NrJyxcbiAgICAgICAgICAgIGZyb206IChxdWFudGl0eTogbnVtYmVyKSA9PiAoeyBxdWFudGl0eSB9KSxcbiAgICAgICAgICAgIHRvOiAodmFsdWUpID0+IHZhbHVlPy5xdWFudGl0eSB8fCB2YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd2aWRlbycsXG4gICAgICAgICd3ZWlnaHQnLFxuICAgICAgICB7XG4gICAgICAgICAgY2F0ZWdvcmllczoge1xuICAgICAgICAgICAgY29sdW1uTmFtZTogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgZmllbGRzOiBbJ2NhdGVnb3J5X2lkJ10sXG4gICAgICAgICAgICB0bzogKGNhdGVnb3J5X2lkKSA9PiArY2F0ZWdvcnlfaWQsXG4gICAgICAgICAgICBmcm9tOiAoY2F0ZWdvcmllczogeyBjYXRlZ29yeV9pZDogbnVtYmVyIH1bXSkgPT5cbiAgICAgICAgICAgICAgY2F0ZWdvcmllcz8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnk/LmNhdGVnb3J5X2lkPy50b1N0cmluZygpKSB8fCBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2hvcEF2YWlsYWJpbGl0eToge1xuICAgICAgICAgICAgY29sdW1uTmFtZTogJ3Nob3BfYXZhaWxhYmlsaXRpZXMnLFxuICAgICAgICAgICAgZmllbGRzOiBbJ3Nob3AnXSxcbiAgICAgICAgICAgIGZyb206IChzaG9wKSA9PiAoQXJyYXkuaXNBcnJheShzaG9wKSA/IHNob3AubWFwKChyb3c6IHsgc2hvcDogU2hvcHMgfSkgPT4gcm93LnNob3ApIDogW10pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgdGFnczogeyBjb2x1bW5OYW1lOiAndGFncycsIHR5cGU6IEhhc3VyYUdyYXBoUUxDb2x1bW5UeXBlLkpzb25iIH0gfSxcbiAgICAgICAgeyBjcmVhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ2NyZWF0ZWRfYXQnIH0gfSxcbiAgICAgICAgeyB1cGRhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ3VwZGF0ZWRfYXQnIH0gfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGdldEJ5U2x1ZyhzbHVnOiBzdHJpbmcsIHNob3A6IFNob3BzKTogUHJvbWlzZTxQcm9kdWN0PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5maW5kKHtcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgc2x1ZzogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogc2x1ZyB9LFxuICAgICAgICBzaG9wQXZhaWxhYmlsaXR5OiB7IG9wZXJhdG9yOiBXaGVyZS5JTiwgdmFsdWU6IFtzaG9wXSB9LFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdD8uZGF0YT8uc2hpZnQoKVxuICB9XG59XG4iXX0=
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC9zcmMvaW5mcmEvaGFzdXJhLWdyYXBocWwvcmVwb3NpdG9yaWVzL2NhdGFsb2cvcHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBT0wsS0FBSyxHQUdOLE1BQU0sb0JBQW9CLENBQUE7QUFDM0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBb0JuRCxNQUFNLE9BQU8sOEJBQ1gsU0FBUSxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFzQjVFLFlBQVksUUFBZ0IsRUFBRSxXQUFxQztRQUNqRSxLQUFLLENBQUM7WUFDSixTQUFTLEVBQUUsU0FBUztZQUNwQixLQUFLLEVBQUUsb0JBQW9CO1lBQzNCLFFBQVE7WUFDUixXQUFXO1lBQ1gsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDLENBQUE7UUFpWkksc0JBQWlCLEdBQUcsQ0FBQyxLQUEwQixFQUFpQixFQUFFLENBQUMsaUNBQ3RFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsS0FDbkYsU0FBUyxFQUFFLE9BQU8s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RTtxQkFDN0I7b0JBQ0QsSUFBSSxFQUFFLHlCQUF5QjtvQkFDL0IsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7YUFDRixDQUFDLENBQUE7WUFFRixPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNELENBQUM7S0FBQTtJQUVhLHlCQUF5QixDQUFDLE1BQWMsRUFBRSxLQUFhLEVBQUUsU0FBaUI7O1lBQ3RGLE1BQU0sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RGLEtBQUssRUFBRTtvQkFDTCxLQUFLLEVBQUU7d0JBQ0wsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTt3QkFDOUIsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRTt3QkFDdkIsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtxQkFDdEI7b0JBQ0QsSUFBSSxFQUFFLHlCQUF5QjtvQkFDL0IsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7YUFDRixDQUFDLENBQUE7WUFFRixPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNELENBQUM7S0FBQTtDQWVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ3JlYXRlUmVwb3NpdG9yeVBhcmFtcyxcbiAgR2V0UmVwb3NpdG9yeVBhcmFtcyxcbiAgUHJvZHVjdFJlcG9zaXRvcnksXG4gIFByb2R1Y3RSZXZpZXcsXG4gIFJldmlld1N0YXR1c1BhcmFtcyxcbiAgUmV2aWV3V2l0aFByb2R1Y3REYXRhLFxuICBTaG9wcyxcbiAgU2hvcHNQcmljZSxcbiAgVXBkYXRlUmVwb3NpdG9yeVBhcmFtcyxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vZG9tYWluJ1xuaW1wb3J0IHsgTm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uLy4uLy4uL2Vycm9ycydcbmltcG9ydCB7IEJhc2UsIGlzTmlsLCBvbWl0IH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBIYXN1cmFHcmFwaFFMQ29sdW1uVHlwZSwgSGFzdXJhR3JhcGhRTFdoZXJlIH0gZnJvbSAnLi4vLi4vZW51bXMnXG5pbXBvcnQgeyB3aXRoQ3J1ZEhhc3VyYUdyYXBoUUwsIHdpdGhIYXN1cmFHcmFwaFFMIH0gZnJvbSAnLi4vLi4vbWl4aW5zJ1xuaW1wb3J0IHsgUHJvZHVjdEhhc3VyYUdyYXBoUUwgfSBmcm9tICcuLi8uLi9tb2RlbHMnXG5pbXBvcnQgeyBIYXN1cmFHcmFwaFFMQXV0aE9wdGlvbnMsIEhhc3VyYUdyYXBoUUxGaWVsZHMgfSBmcm9tICcuLi8uLi90eXBlcydcblxudHlwZSBQcm9kdWN0UmV2aWV3RmllbGRzID0ge1xuICBpZD86IHN0cmluZ1xuICBzaG9wOiBTaG9wc1xuICByYXRlOiBudW1iZXJcbiAgYXV0aG9yPzogc3RyaW5nXG4gIGVtYWlsPzogc3RyaW5nXG4gIGxvY2F0aW9uPzogc3RyaW5nXG4gIHJldmlldz86IHN0cmluZ1xuICBzdGF0dXM/OiBib29sZWFuXG4gIHRpdGxlPzogc3RyaW5nXG4gIHBlcnNvbl9pZD86IG51bWJlclxuICBwb2ludHM/OiBudW1iZXJcbiAgb3JkZXJfaWQ/OiBzdHJpbmdcbiAgY3JlYXRlZF9hdD86IERhdGVcbiAgdXBkYXRlZF9hdD86IERhdGVcbn1cblxuZXhwb3J0IGNsYXNzIFByb2R1Y3RIYXN1cmFHcmFwaFFMUmVwb3NpdG9yeVxuICBleHRlbmRzIHdpdGhDcnVkSGFzdXJhR3JhcGhRTCh3aXRoSGFzdXJhR3JhcGhRTDxQcm9kdWN0SGFzdXJhR3JhcGhRTD4oQmFzZSkpXG4gIGltcGxlbWVudHMgUHJvZHVjdFJlcG9zaXRvcnlcbntcbiAgcHJpdmF0ZSBnZXQgcmV2aWV3c0ZpZWxkcygpOiBBcnJheTxrZXlvZiBQcm9kdWN0UmV2aWV3RmllbGRzPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdpZCcsXG4gICAgICAnc2hvcCcsXG4gICAgICAncmF0ZScsXG4gICAgICAnYXV0aG9yJyxcbiAgICAgICdlbWFpbCcsXG4gICAgICAnbG9jYXRpb24nLFxuICAgICAgJ3JldmlldycsXG4gICAgICAnc3RhdHVzJyxcbiAgICAgICd0aXRsZScsXG4gICAgICAncGVyc29uX2lkJyxcbiAgICAgICdwb2ludHMnLFxuICAgICAgJ29yZGVyX2lkJyxcbiAgICAgICdjcmVhdGVkX2F0JyxcbiAgICAgICd1cGRhdGVkX2F0JyxcbiAgICBdXG4gIH1cblxuICBjb25zdHJ1Y3RvcihlbmRwb2ludDogc3RyaW5nLCBhdXRoT3B0aW9uczogSGFzdXJhR3JhcGhRTEF1dGhPcHRpb25zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdGFibGVOYW1lOiAncHJvZHVjdCcsXG4gICAgICBtb2RlbDogUHJvZHVjdEhhc3VyYUdyYXBoUUwsXG4gICAgICBlbmRwb2ludCxcbiAgICAgIGF1dGhPcHRpb25zLFxuICAgICAgZmllbGRzOiBbXSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29tbW9uRmllbGRzOiBIYXN1cmFHcmFwaFFMRmllbGRzPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiA9IFtcbiAgICAgIHsgaWQ6IHsgY29sdW1uTmFtZTogJ2lkJywgdG86ICh2YWx1ZSkgPT4gK3ZhbHVlLCBmcm9tOiAodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKCkgfSB9LFxuICAgICAgeyBmaXJlc3RvcmVJZDogeyBjb2x1bW5OYW1lOiAnZmlyZXN0b3JlX2lkJyB9IH0sXG4gICAgICB7IENFU1Q6IHsgY29sdW1uTmFtZTogJ2Nlc3QnIH0gfSxcbiAgICAgIHsgRUFOOiB7IGNvbHVtbk5hbWU6ICdlYW4nIH0gfSxcbiAgICAgIHsgTkNNOiB7IGNvbHVtbk5hbWU6ICduY20nIH0gfSxcbiAgICAgICdicmFuZCcsXG4gICAgICB7IGNvc3RQcmljZTogeyBjb2x1bW5OYW1lOiAnY29zdF9wcmljZScgfSB9LFxuICAgICAge1xuICAgICAgICBkZXNjcmlwdGlvbjoge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgZnJvbTogKGRlc2NyaXB0aW9uKSA9PlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhTaG9wcykucmVkdWNlKChzaG9wcywgc2hvcCkgPT4gKHsgLi4uc2hvcHMsIFtzaG9wXTogeyBkZXNjcmlwdGlvbiB9IH0pLCB7fSksXG4gICAgICAgICAgdG86ICh2YWx1ZSkgPT4gT2JqZWN0LnZhbHVlcyh2YWx1ZSkuc2hpZnQoKS5kZXNjcmlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IGhhc1ZhcmlhbnRzOiB7IGNvbHVtbk5hbWU6ICdoYXNfdmFyaWFudHMnIH0gfSxcbiAgICAgIHsgaW1hZ2VzOiB7IGNvbHVtbk5hbWU6ICdpbWFnZXMnLCB0bzogKHZhbHVlKSA9PiBge1wiJHt2YWx1ZT8uam9pbj8uKGBcIixcImApIHx8ICcnfVwifWAgfSB9LFxuICAgICAgeyBtaW5pYXR1cmVzOiB7IGNvbHVtbk5hbWU6ICdtaW5pYXR1cmVzJywgdG86ICh2YWx1ZSkgPT4gYHtcIiR7dmFsdWU/LmpvaW4/LihgXCIsXCJgKSB8fCAnJ31cIn1gIH0gfSxcbiAgICAgICduYW1lJyxcbiAgICAgIHtcbiAgICAgICAgcHJpY2U6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAncHJpY2UnLFxuICAgICAgICAgIGZyb206IChwcmljZSwgZGF0YSk6IFNob3BzUHJpY2UgPT5cbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoU2hvcHMpLnJlZHVjZShcbiAgICAgICAgICAgICAgKHByaWNlczogU2hvcHNQcmljZSwgc2hvcCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5wcmljZXMsXG4gICAgICAgICAgICAgICAgW3Nob3BdOiB7XG4gICAgICAgICAgICAgICAgICBwcmljZSxcbiAgICAgICAgICAgICAgICAgIGZ1bGxQcmljZTogZGF0YS5mdWxsX3ByaWNlLFxuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZTogZGF0YS5zdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2UsXG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyUHJpY2U6IGRhdGEuc3Vic2NyaWJlcl9wcmljZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICApLFxuICAgICAgICAgIGJpbmRGaW5kRmlsdGVyOiAoc2VudGVuY2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBPYmplY3QudmFsdWVzKHNlbnRlbmNlKS5zaGlmdCgpXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLigoZmlsdGVycz8ucHJpY2UgfHwgZmlsdGVycz8ucHJpY2UgPT09IDApICYmIHsgcHJpY2U6IGZpbHRlcnMucHJpY2UgfSksXG4gICAgICAgICAgICAgIC4uLigoZmlsdGVycy5mdWxsUHJpY2UgfHwgZmlsdGVycy5mdWxsUHJpY2UgPT09IDApICYmIHsgZnVsbF9wcmljZTogZmlsdGVycy5mdWxsUHJpY2UgfSksXG4gICAgICAgICAgICAgIC4uLigoZmlsdGVycy5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlIHx8IGZpbHRlcnMuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSA9PT0gMCkgJiYge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZTogZmlsdGVycy5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzLnN1YnNjcmliZXJQcmljZSB8fCBmaWx0ZXJzLnN1YnNjcmliZXJQcmljZSA9PT0gMCkgJiYge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfcHJpY2U6IGZpbHRlcnMuc3Vic2NyaWJlclByaWNlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGJpbmRQZXJzaXN0RGF0YTogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmljZURhdGEgPSBPYmplY3QudmFsdWVzKHZhbHVlKS5zaGlmdCgpXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLihwcmljZURhdGE/LnByaWNlID49IDAgJiYgeyBwcmljZTogcHJpY2VEYXRhLnByaWNlIH0pLFxuICAgICAgICAgICAgICAuLi4ocHJpY2VEYXRhLmZ1bGxQcmljZSA+PSAwICYmIHsgZnVsbF9wcmljZTogcHJpY2VEYXRhLmZ1bGxQcmljZSB9KSxcbiAgICAgICAgICAgICAgLi4uKHByaWNlRGF0YS5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlID49IDAgJiYge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZTogcHJpY2VEYXRhLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAuLi4ocHJpY2VEYXRhLnN1YnNjcmliZXJQcmljZSA+PSAwICYmIHsgc3Vic2NyaWJlcl9wcmljZTogcHJpY2VEYXRhLnN1YnNjcmliZXJQcmljZSB9KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgZnVsbFByaWNlOiB7IGNvbHVtbk5hbWU6ICdmdWxsX3ByaWNlJyB9IH0sXG4gICAgICB7IHN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2U6IHsgY29sdW1uTmFtZTogJ3N1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZScgfSB9LFxuICAgICAgeyBzdWJzY3JpYmVyUHJpY2U6IHsgY29sdW1uTmFtZTogJ3N1YnNjcmliZXJfcHJpY2UnIH0gfSxcbiAgICAgICdwdWJsaXNoZWQnLFxuICAgICAgeyBwdWJsaXNoZWRHbGFtOiB7IGNvbHVtbk5hbWU6ICdwdWJsaXNoZWRfZ2xhbScgfSB9LFxuICAgICAgJ3NrdScsXG4gICAgICB7XG4gICAgICAgIHN0b2NrOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ3N0b2NrJyxcbiAgICAgICAgICBmcm9tOiAocXVhbnRpdHk6IG51bWJlcikgPT4gKHsgcXVhbnRpdHkgfSksXG4gICAgICAgICAgdG86ICh2YWx1ZSkgPT4gKGlzTmlsKHZhbHVlPy5xdWFudGl0eSkgPyB2YWx1ZSA6IHZhbHVlPy5xdWFudGl0eSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgJ3NsdWcnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3ZpZGVvJyxcbiAgICAgICd3ZWlnaHQnLFxuICAgICAge1xuICAgICAgICBzaG9wQXZhaWxhYmlsaXR5OiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ3Nob3BfYXZhaWxhYmlsaXRpZXMnLFxuICAgICAgICAgIGZpZWxkczogWydzaG9wJ10sXG4gICAgICAgICAgZnJvbTogKHNob3ApID0+IChBcnJheS5pc0FycmF5KHNob3ApID8gc2hvcC5tYXAoKHJvdzogeyBzaG9wOiBTaG9wcyB9KSA9PiByb3cuc2hvcCkgOiBbXSksXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAoc2hvcHMpID0+ICh7IHNob3BfYXZhaWxhYmlsaXRpZXM6IHsgZGF0YTogc2hvcHMubWFwKChzaG9wOiBTaG9wcykgPT4gKHsgc2hvcCB9KSkgfSB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHRhZ3M6IHsgY29sdW1uTmFtZTogJ3RhZ3MnLCB0eXBlOiBIYXN1cmFHcmFwaFFMQ29sdW1uVHlwZS5Kc29uYiB9IH0sXG4gICAgICB7IGlzS2l0OiB7IGNvbHVtbk5hbWU6ICdpc19raXQnIH0gfSxcbiAgICAgIHsgY3JlYXRlZEF0OiB7IGNvbHVtbk5hbWU6ICdjcmVhdGVkX2F0JyB9IH0sXG4gICAgICB7IHVwZGF0ZWRBdDogeyBjb2x1bW5OYW1lOiAndXBkYXRlZF9hdCcgfSB9LFxuICAgICAge1xuICAgICAgICByYXRlOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ3Jldmlld3NfYWdncmVnYXRlJyxcbiAgICAgICAgICBmaWVsZHM6IFt7IGFnZ3JlZ2F0ZTogW3sgYXZnOiBbJ3JhdGUnXSB9XSB9XSxcbiAgICAgICAgICBmcm9tOiAodmFsdWUpID0+IHZhbHVlLmFnZ3JlZ2F0ZS5hdmcucmF0ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgdGhpcy5maWVsZHMgPSBbXG4gICAgICAuLi5jb21tb25GaWVsZHMsXG4gICAgICB7XG4gICAgICAgIGNhdGVnb3JpZXM6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgZmllbGRzOiBbJ2NhdGVnb3J5X2lkJ10sXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAodmFsdWUpID0+ICh7XG4gICAgICAgICAgICBjYXRlZ29yaWVzOiB7IGRhdGE6IHZhbHVlLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGNhdGVnb3J5X2lkOiArY2F0ZWdvcnkgfSkpIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdG86IChjYXRlZ29yaWVzKSA9PiBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnlJZCkgPT4gK2NhdGVnb3J5SWQpLFxuICAgICAgICAgIGZyb206IChjYXRlZ29yaWVzOiB7IGNhdGVnb3J5X2lkOiBudW1iZXIgfVtdKSA9PlxuICAgICAgICAgICAgY2F0ZWdvcmllcz8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnk/LmNhdGVnb3J5X2lkPy50b1N0cmluZygpKSB8fCBbXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtpdFByb2R1Y3RzOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ2tpdF9wcm9kdWN0cycsXG4gICAgICAgICAgZm9yZWlnbktleUNvbHVtbjogeyBwcm9kdWN0SWQ6ICdpZCcgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHsgcHJvZHVjdElkOiB7IGNvbHVtbk5hbWU6ICdwcm9kdWN0X2lkJyB9IH0sXG4gICAgICAgICAgICB7IGtpdFByb2R1Y3RJZDogeyBjb2x1bW5OYW1lOiAna2l0X3Byb2R1Y3RfaWQnIH0gfSxcbiAgICAgICAgICAgICdxdWFudGl0eScsXG4gICAgICAgICAgICB7IHByb2R1Y3Q6IHsgY29sdW1uTmFtZTogJ3Byb2R1Y3QnLCBmb3JlaWduS2V5Q29sdW1uOiB7IGlkOiAncHJvZHVjdF9pZCcgfSwgZmllbGRzOiBjb21tb25GaWVsZHMgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShkYXRhOiBDcmVhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgc3VwZXIuY3JlYXRlKG9taXQoZGF0YSwgWydyZXZpZXdzJ10pKVxuXG4gICAgdHJ5IHtcbiAgICAgIHByb2R1Y3QucmV2aWV3cyA9IGF3YWl0IHRoaXMudXBkYXRlUmV2aWV3cygrcHJvZHVjdC5pZCwgZGF0YSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGUoeyBpZDogcHJvZHVjdC5pZCB9KVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBwcm9kdWN0XG4gIH1cblxuICBhc3luYyBnZXQoaWRlbnRpZmllcnM6IEdldFJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+KTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTD4ge1xuICAgIGNvbnN0IHByb2R1Y3QgPSBOdW1iZXIuaXNOYU4oK2lkZW50aWZpZXJzLmlkKVxuICAgICAgPyAoYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWRlbnRpZmllcnMuaWQgfSB9KSkuZGF0YT8uWzBdXG4gICAgICA6IGF3YWl0IHN1cGVyLmdldChpZGVudGlmaWVycylcblxuICAgIHByb2R1Y3QucmV2aWV3cyA9IGF3YWl0IHRoaXMuZmluZFJldmlld3NCeVByb2R1Y3QoK3Byb2R1Y3QuaWQpXG5cbiAgICByZXR1cm4gcHJvZHVjdFxuICB9XG5cbiAgYXN5bmMgZ2V0QnlTbHVnKHNsdWc6IHN0cmluZyk6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbmQoe1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICBzbHVnLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcHJvZHVjdCA9IHJlc3VsdD8uZGF0YT8uc2hpZnQoKVxuXG4gICAgcHJvZHVjdC5yZXZpZXdzID0gYXdhaXQgdGhpcy5maW5kUmV2aWV3c0J5UHJvZHVjdCgrcHJvZHVjdC5pZClcblxuICAgIHJldHVybiBwcm9kdWN0XG4gIH1cblxuICBhc3luYyB1cGRhdGUocGFyYW1zOiBVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCB7IGNhdGVnb3JpZXMsIGtpdFByb2R1Y3RzLCByZXZpZXdzLCBpZDogY2hlY2tJZCwgc2hvcEF2YWlsYWJpbGl0eSwgcmF0ZSwgLi4uZGF0YSB9ID0gcGFyYW1zXG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsgaWQ6IGNoZWNrSWQgfSlcbiAgICBjb25zdCBpZCA9IGF3YWl0IHRoaXMuZ2V0SWQocGxhaW5EYXRhLmlkKVxuICAgIGNvbnN0IHByb2R1Y3QgPSBhd2FpdCBzdXBlci51cGRhdGUoeyBpZCwgLi4uZGF0YSB9KVxuXG4gICAgcHJvZHVjdC5jYXRlZ29yaWVzID0gY2F0ZWdvcmllcyAmJiAoYXdhaXQgdGhpcy51cGRhdGVDYXRlZ29yaWVzKCtpZCwgeyBjYXRlZ29yaWVzIH0pKVxuICAgIHByb2R1Y3Qua2l0UHJvZHVjdHMgPSBraXRQcm9kdWN0cyAmJiAoYXdhaXQgdGhpcy51cGRhdGVLaXRQcm9kdWN0cygraWQsIHsga2l0UHJvZHVjdHMgfSkpXG4gICAgcHJvZHVjdC5yZXZpZXdzID0gcmV2aWV3cyAmJiAoYXdhaXQgdGhpcy51cGRhdGVSZXZpZXdzKCtpZCwgeyByZXZpZXdzIH0pKVxuXG4gICAgcmV0dXJuIHByb2R1Y3RcbiAgfVxuXG4gIGFzeW5jIGZldGNoUmV2aWV3cyhzdGF0dXM6IFJldmlld1N0YXR1c1BhcmFtcyk6IFByb21pc2U8UmV2aWV3V2l0aFByb2R1Y3REYXRhW10+IHtcbiAgICBjb25zdCByZXZpZXdzID0ge1xuICAgICAgc3RhdHVzOlxuICAgICAgICBzdGF0dXMgPT09ICdwZW5kaW5nJ1xuICAgICAgICAgID8geyBbSGFzdXJhR3JhcGhRTFdoZXJlLklTTlVMTF06IHRydWUgfVxuICAgICAgICAgIDogeyBbSGFzdXJhR3JhcGhRTFdoZXJlLkVRVUFMU106IHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyB9LFxuICAgIH1cbiAgICBjb25zdCB7IHByb2R1Y3Q6IGRhdGEgfSA9IGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICAncHJvZHVjdCcsXG4gICAgICBbJ2lkJywgJ25hbWUnLCAnc2t1JywgeyByZXZpZXdzOiB7IGNvbHVtbk5hbWU6ICdyZXZpZXdzJywgZmllbGRzOiB0aGlzLnJldmlld3NGaWVsZHMgfSB9XSxcbiAgICAgIHtcbiAgICAgICAgd2hlcmU6IHsgdmFsdWU6IHsgcmV2aWV3cyB9LCB0eXBlOiAncHJvZHVjdF9ib29sX2V4cCcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICB9LFxuICAgIClcblxuICAgIHJldHVybiBkYXRhLnJlZHVjZShcbiAgICAgIChyZXZpZXdzLCBwcm9kdWN0KSA9PiBbXG4gICAgICAgIC4uLnJldmlld3MsXG4gICAgICAgIC4uLnByb2R1Y3QucmV2aWV3c1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAocmV2aWV3KSA9PlxuICAgICAgICAgICAgICAoc3RhdHVzID09PSAncGVuZGluZycgJiYgW3VuZGVmaW5lZCwgbnVsbF0uaW5jbHVkZXMocmV2aWV3LnN0YXR1cykpIHx8XG4gICAgICAgICAgICAgIChzdGF0dXMgPT09ICdhcHByb3ZlZCcgJiYgcmV2aWV3LnN0YXR1cyA9PT0gdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgKHN0YXR1cyA9PT0gJ3JlamVjdGVkJyAmJiByZXZpZXcuc3RhdHVzID09PSBmYWxzZSksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKHJldmlldykgPT4gKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYmluZFJldmlld1RvTW9kZWwocmV2aWV3KSxcbiAgICAgICAgICAgIHByb2R1Y3RJZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICAgIHByb2R1Y3ROYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgICAgICAgICBwcm9kdWN0U2t1OiBwcm9kdWN0LnNrdSxcbiAgICAgICAgICB9KSksXG4gICAgICBdLFxuICAgICAgW10gYXMgUmV2aWV3V2l0aFByb2R1Y3REYXRhW10sXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDYXRlZ29yaWVzKFxuICAgIHByb2R1Y3RJZDogbnVtYmVyLFxuICAgIHsgY2F0ZWdvcmllcyB9OiBQaWNrPFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+LCAnY2F0ZWdvcmllcyc+LFxuICApOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMWydjYXRlZ29yaWVzJ10+IHtcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyBjYXRlZ29yaWVzIH0pXG5cbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICB3aGVyZToge1xuICAgICAgICB0eXBlOiAnY2F0ZWdvcnlfcHJvZHVjdF9ib29sX2V4cCcsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogeyBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0gfSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2luc2VydF9jYXRlZ29yeV9wcm9kdWN0JywgWydhZmZlY3RlZF9yb3dzJ10sIHtcbiAgICAgIG9iamVjdHM6IHtcbiAgICAgICAgdHlwZTogJ1tjYXRlZ29yeV9wcm9kdWN0X2luc2VydF9pbnB1dCFdJyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHZhbHVlOiBwbGFpbkRhdGEuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5SWQpID0+ICh7IGNhdGVnb3J5X2lkOiBjYXRlZ29yeUlkLCBwcm9kdWN0X2lkOiBwcm9kdWN0SWQgfSkpLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHBsYWluRGF0YS5jYXRlZ29yaWVzXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUtpdFByb2R1Y3RzKFxuICAgIHByb2R1Y3RJZDogbnVtYmVyLFxuICAgIHsga2l0UHJvZHVjdHMgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ2tpdFByb2R1Y3RzJz4sXG4gICk6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUxbJ2tpdFByb2R1Y3RzJ10+IHtcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyBraXRQcm9kdWN0cyB9KVxuXG4gICAgYXdhaXQgdGhpcy5tdXRhdGlvbignZGVsZXRlX3Byb2R1Y3Rfa2l0JywgWydhZmZlY3RlZF9yb3dzJ10sIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X2tpdF9ib29sX2V4cCcsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogeyBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0gfSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2luc2VydF9wcm9kdWN0X2tpdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICBvYmplY3RzOiB7XG4gICAgICAgIHR5cGU6ICdbcHJvZHVjdF9raXRfaW5zZXJ0X2lucHV0IV0nLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHBsYWluRGF0YS5raXRQcm9kdWN0cy5tYXAoKGtpdFByb2R1Y3QpID0+ICh7XG4gICAgICAgICAga2l0X3Byb2R1Y3RfaWQ6IGtpdFByb2R1Y3QucHJvZHVjdElkIHx8IGtpdFByb2R1Y3QucHJvZHVjdC5pZCxcbiAgICAgICAgICBwcm9kdWN0X2lkOiBwcm9kdWN0SWQsXG4gICAgICAgICAgcXVhbnRpdHk6IGtpdFByb2R1Y3QucXVhbnRpdHksXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBwbGFpbkRhdGEua2l0UHJvZHVjdHNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlUmV2aWV3cyhcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcbiAgICB7IHJldmlld3MgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ3Jldmlld3MnPixcbiAgKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3W10+IHtcbiAgICBpZiAoIXJldmlld3MpIHJldHVybiBbXVxuICAgIGlmICgnYWN0aW9uJyBpbiByZXZpZXdzICYmIHJldmlld3MuYWN0aW9uID09PSAncmVtb3ZlJykge1xuICAgICAgY29uc3QgcmV2aWV3SWRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJldmlld3MudmFsdWUubWFwKGFzeW5jIChyZXZpZXdEYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmV2aWV3ID0gYXdhaXQgdGhpcy5maW5kUmV2aWV3KHJldmlld0RhdGEsIHByb2R1Y3RJZClcblxuICAgICAgICAgIHJldHVybiByZXZpZXc/LmlkXG4gICAgICAgIH0pLFxuICAgICAgKVxuXG4gICAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfcHJvZHVjdF9yZXZpZXcnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xuICAgICAgICB3aGVyZTogeyB2YWx1ZTogeyBpZDogeyBfaW46IHJldmlld0lkcy5maWx0ZXIoQm9vbGVhbikgfSB9LCB0eXBlOiAncHJvZHVjdF9yZXZpZXdfYm9vbF9leHAnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHJldmlld3MudmFsdWUubWFwKChyZXZpZXcsIGluZGV4KSA9PiAhcmV2aWV3SWRzW2luZGV4XSAmJiByZXZpZXcpLmZpbHRlcihCb29sZWFuKVxuICAgIH1cblxuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IHJldmlld3MgfSlcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIHBsYWluRGF0YS5yZXZpZXdzLm1hcChhc3luYyAocmV2aWV3RGF0YSkgPT4ge1xuICAgICAgICBjb25zdCByZXZpZXcgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXcocmV2aWV3RGF0YSwgcHJvZHVjdElkKVxuXG4gICAgICAgIGlmIChyZXZpZXcuaWQpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmluZFJldmlld1RvTW9kZWwoXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ3VwZGF0ZV9wcm9kdWN0X3Jldmlld19ieV9waycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xuICAgICAgICAgICAgICAgIHBrX2NvbHVtbnM6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IGlkOiByZXZpZXcuaWQgfSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9kdWN0X3Jldmlld19wa19jb2x1bW5zX2lucHV0JyxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgX3NldDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IG9taXQodGhpcy5iaW5kUmV2aWV3VG9IYXN1cmEocmV2aWV3RGF0YSksIFsnaWQnLCAncHJvZHVjdF9pZCddKSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9kdWN0X3Jldmlld19zZXRfaW5wdXQnLFxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkudXBkYXRlX3Byb2R1Y3RfcmV2aWV3X2J5X3BrLFxuICAgICAgICAgIClcblxuICAgICAgICByZXR1cm4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChcbiAgICAgICAgICAoXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdpbnNlcnRfcHJvZHVjdF9yZXZpZXdfb25lJywgdGhpcy5yZXZpZXdzRmllbGRzLCB7XG4gICAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBvbWl0KHsgLi4udGhpcy5iaW5kUmV2aWV3VG9IYXN1cmEocmV2aWV3RGF0YSksIHByb2R1Y3RfaWQ6IHByb2R1Y3RJZCB9LCBbJ2lkJ10pLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9kdWN0X3Jldmlld19pbnNlcnRfaW5wdXQnLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApLmluc2VydF9wcm9kdWN0X3Jldmlld19vbmUsXG4gICAgICAgIClcbiAgICAgIH0pLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0SWQoaWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oK2lkKSkgcmV0dXJuIGlkXG5cbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZmluZCh7IGZpbHRlcnM6IHsgZmlyZXN0b3JlSWQ6IGlkIH0gfSlcblxuICAgIGlmIChkYXRhPy5bMF0/LmlkKSByZXR1cm4gZGF0YT8uWzBdPy5pZFxuXG4gICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFByb2R1Y3Qgd2l0aCBpZCAke2lkfSBub3QgZm91bmRgKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUmV2aWV3c0J5UHJvZHVjdChwcm9kdWN0SWQ6IG51bWJlcik6IFByb21pc2U8UHJvZHVjdFJldmlld1tdPiB7XG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfYm9vbF9leHAnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBkYXRhICYmIGRhdGEubWFwKChyZXZpZXcpID0+IHRoaXMuYmluZFJldmlld1RvTW9kZWwocmV2aWV3KSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZFJldmlldyhyZXZpZXc6IFByb2R1Y3RSZXZpZXcsIHByb2R1Y3RJZDogbnVtYmVyKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XG4gICAgaWYgKHJldmlldy5pZCkgcmV0dXJuIHJldmlld1xuXG4gICAgbGV0IGxvYWRlZFJldmlldzogUHJvZHVjdFJldmlld1xuXG4gICAgaWYgKHJldmlldy5wZXJzb25JZCkgbG9hZGVkUmV2aWV3ID0gYXdhaXQgdGhpcy5nZXRSZXZpZXdCeVBlcnNvbklkKHJldmlldy5wZXJzb25JZCwgcHJvZHVjdElkKVxuICAgIGlmICghbG9hZGVkUmV2aWV3ICYmIHJldmlldy5hdXRob3IgJiYgcmV2aWV3LmVtYWlsKVxuICAgICAgbG9hZGVkUmV2aWV3ID0gYXdhaXQgdGhpcy5nZXRSZXZpZXdCeUF1dGhvckFuZEVtYWlsKHJldmlldy5hdXRob3IsIHJldmlldy5lbWFpbCwgcHJvZHVjdElkKVxuXG4gICAgcmV0dXJuIGxvYWRlZFJldmlldyB8fCByZXZpZXdcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmV2aWV3QnlQZXJzb25JZChwZXJzb25JZDogbnVtYmVyLCBwcm9kdWN0SWQ6IG51bWJlcik6IFByb21pc2U8UHJvZHVjdFJldmlldz4ge1xuICAgIGNvbnN0IHsgcHJvZHVjdF9yZXZpZXc6IGRhdGEgfSA9IGF3YWl0IHRoaXMucXVlcnkoJ3Byb2R1Y3RfcmV2aWV3JywgdGhpcy5yZXZpZXdzRmllbGRzLCB7XG4gICAgICB3aGVyZToge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSxcbiAgICAgICAgICBwZXJzb25faWQ6IHsgX2VxOiBwZXJzb25JZCB9LFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBgcHJvZHVjdF9yZXZpZXdfYm9vbF9leHBgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBkYXRhICYmIGRhdGFbMF0gJiYgdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChkYXRhWzBdKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZXZpZXdCeUF1dGhvckFuZEVtYWlsKGF1dGhvcjogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBwcm9kdWN0SWQ6IG51bWJlcik6IFByb21pc2U8UHJvZHVjdFJldmlldz4ge1xuICAgIGNvbnN0IHsgcHJvZHVjdF9yZXZpZXc6IGRhdGEgfSA9IGF3YWl0IHRoaXMucXVlcnkoJ3Byb2R1Y3RfcmV2aWV3JywgdGhpcy5yZXZpZXdzRmllbGRzLCB7XG4gICAgICB3aGVyZToge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSxcbiAgICAgICAgICBhdXRob3I6IHsgX2VxOiBhdXRob3IgfSxcbiAgICAgICAgICBlbWFpbDogeyBfZXE6IGVtYWlsIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IGBwcm9kdWN0X3Jldmlld19ib29sX2V4cGAsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YVswXSAmJiB0aGlzLmJpbmRSZXZpZXdUb01vZGVsKGRhdGFbMF0pXG4gIH1cblxuICBwcml2YXRlIGJpbmRSZXZpZXdUb01vZGVsID0gKHBsYWluOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvZHVjdFJldmlldyA9PiAoe1xuICAgIC4uLm9taXQocGxhaW4sIFsncHJvZHVjdF9pZCcsICdjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnLCAncGVyc29uX2lkJywgJ29yZGVyX2lkJ10pLFxuICAgIGNyZWF0ZWRBdDogdHlwZW9mIHBsYWluLmNyZWF0ZWRfYXQgPT09ICdzdHJpbmcnID8gbmV3IERhdGUocGxhaW4uY3JlYXRlZF9hdCkgOiBwbGFpbi5jcmVhdGVkX2F0LFxuICAgIHVwZGF0ZWRBdDogdHlwZW9mIHBsYWluLnVwZGF0ZWRfYXQgPT09ICdzdHJpbmcnID8gbmV3IERhdGUocGxhaW4udXBkYXRlZF9hdCkgOiBwbGFpbi51cGRhdGVkX2F0LFxuICAgIHBlcnNvbklkOiBwbGFpbi5wZXJzb25faWQsXG4gICAgb3JkZXJJZDogcGxhaW4ub3JkZXJfaWQsXG4gIH0pXG5cbiAgcHJpdmF0ZSBiaW5kUmV2aWV3VG9IYXN1cmEgPSAocmV2aWV3OiBQcm9kdWN0UmV2aWV3KTogUHJvZHVjdFJldmlld0ZpZWxkcyA9PiAoe1xuICAgIC4uLm9taXQocmV2aWV3LCBbJ3Byb2R1Y3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0JywgJ3BlcnNvbklkJywgJ29yZGVySWQnXSksXG4gICAgcGVyc29uX2lkOiByZXZpZXcucGVyc29uSWQsXG4gICAgb3JkZXJfaWQ6IHJldmlldy5vcmRlcklkLFxuICB9KVxufVxuIl19