@snabcentr/client-core 3.9.1 → 3.10.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.
- package/esm2022/seo/classes/schema-org-factory.mjs +181 -61
- package/esm2022/seo/services/sc-seo.service.mjs +9 -4
- package/fesm2022/snabcentr-client-core.mjs +187 -63
- package/fesm2022/snabcentr-client-core.mjs.map +1 -1
- package/package.json +1 -1
- package/release_notes.tmp +4 -2
- package/seo/classes/schema-org-factory.d.ts +34 -4
- package/seo/services/sc-seo.service.d.ts +4 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { inject, Injectable } from '@angular/core';
|
|
2
|
-
import { isArray } from 'lodash-es';
|
|
2
|
+
import { isArray, omit } from 'lodash-es';
|
|
3
3
|
import { ScIdOrSlugPipe } from '../../pipes/sc-id-or-slug.pipe';
|
|
4
4
|
import { ScMediaImageTransformerPipe } from '../../pipes/sc-media-image-transformer.pipe';
|
|
5
5
|
import { SC_COMPANY_INFO } from '../../tokens/sc-company-info';
|
|
@@ -32,36 +32,36 @@ export class SchemaOrgFactory {
|
|
|
32
32
|
*
|
|
33
33
|
* @param product Данные о продукте.
|
|
34
34
|
* @param productPath Url путь к товару. В пути должен присутствовать шаблон ':id', обозначающий идентификатор товара для подстановки.
|
|
35
|
+
* @param id Необязательный идентификатор сущности для поля `@id` в JSON-LD.
|
|
35
36
|
*/
|
|
36
|
-
generateForProductItem(product, productPath) {
|
|
37
|
+
generateForProductItem(product, productPath, id) {
|
|
37
38
|
const productUrl = `${this.urls.siteUrl}${productPath.replace(':id', this.idOrSlugPipe.transform(product).toString())}`;
|
|
38
39
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
39
|
-
const image = this.mediaImageTransformerPipe.transform(product?.getImagePreview() ?? product.image, true);
|
|
40
|
+
const image = this.mediaImageTransformerPipe.transform(product?.getImagePreview?.() ?? product.image, true);
|
|
40
41
|
const description = product.properties?.description;
|
|
41
42
|
const priceValidUntil = this.normalizePriceValidUntil(product.discount?.expiredAt);
|
|
42
43
|
return {
|
|
43
44
|
'@context': 'https://schema.org',
|
|
44
45
|
'@type': 'Product',
|
|
46
|
+
...(id && { '@id': id }),
|
|
45
47
|
name: product.name,
|
|
46
48
|
...(image && { image }),
|
|
47
49
|
...(description && { description }),
|
|
48
50
|
mpn: product.code,
|
|
49
51
|
url: productUrl,
|
|
50
|
-
offers:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
name: this.companyInfo.name,
|
|
61
|
-
},
|
|
62
|
-
url: productUrl,
|
|
52
|
+
offers: {
|
|
53
|
+
'@type': 'Offer',
|
|
54
|
+
priceCurrency: 'RUB',
|
|
55
|
+
...(priceValidUntil && { priceValidUntil }),
|
|
56
|
+
price: product.costRub,
|
|
57
|
+
availability: this.getAvailability(product),
|
|
58
|
+
itemCondition: 'https://schema.org/NewCondition',
|
|
59
|
+
seller: {
|
|
60
|
+
'@type': 'Organization',
|
|
61
|
+
name: this.companyInfo.name,
|
|
63
62
|
},
|
|
64
|
-
|
|
63
|
+
url: productUrl,
|
|
64
|
+
},
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
@@ -72,13 +72,15 @@ export class SchemaOrgFactory {
|
|
|
72
72
|
* @param categoryPath Url путь к категориям товаров. В пути должен присутствовать шаблон ':id', обозначающий идентификатор категории для подстановки.
|
|
73
73
|
* @param productPath Url путь к товару. В пути должен присутствовать шаблон ':id', обозначающий идентификатор товара для подстановки.
|
|
74
74
|
* @param breadcrumbs Данные о хлебных крошках для категории.
|
|
75
|
+
* @param id Необязательный идентификатор сущности для поля `@id` в JSON-LD.
|
|
75
76
|
*/
|
|
76
|
-
generateForCategoryItem(category, products, categoryPath, productPath, breadcrumbs) {
|
|
77
|
+
generateForCategoryItem(category, products, categoryPath, productPath, breadcrumbs, id) {
|
|
77
78
|
const description = category.seo?.description ?? category.properties?.description;
|
|
78
79
|
const image = this.mediaImageTransformerPipe.transform(category.image, true);
|
|
79
80
|
return {
|
|
80
81
|
'@context': 'https://schema.org',
|
|
81
82
|
'@type': 'CollectionPage',
|
|
83
|
+
...(id && { '@id': id }),
|
|
82
84
|
name: category.seo?.title ?? category.name,
|
|
83
85
|
...(description && { description }),
|
|
84
86
|
url: this.getCategoryCanonicalUrl(category, categoryPath),
|
|
@@ -142,6 +144,110 @@ export class SchemaOrgFactory {
|
|
|
142
144
|
],
|
|
143
145
|
};
|
|
144
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Генерирует и возвращает схему данных OnlineStore на основе данных компании из окружения.
|
|
149
|
+
*/
|
|
150
|
+
// eslint-disable-next-line sonarjs/function-return-type
|
|
151
|
+
generateForOrganization() {
|
|
152
|
+
const postalAddress = this.createPostalAddress(this.companyInfo.address);
|
|
153
|
+
return {
|
|
154
|
+
'@context': 'https://schema.org',
|
|
155
|
+
'@type': 'OnlineStore',
|
|
156
|
+
'@id': `${this.urls.siteUrl}#organization`,
|
|
157
|
+
name: this.companyInfo.name,
|
|
158
|
+
legalName: this.companyInfo.name,
|
|
159
|
+
url: this.urls.siteUrl,
|
|
160
|
+
logo: this.urls.logoUrl,
|
|
161
|
+
image: this.urls.logoUrl,
|
|
162
|
+
email: this.companyInfo.mail,
|
|
163
|
+
telephone: this.companyInfo.phone,
|
|
164
|
+
...(postalAddress && { address: postalAddress }),
|
|
165
|
+
legalAddress: this.createPostalAddress({ streetAddress: this.companyInfo.legalAddress }),
|
|
166
|
+
// TODO: Перечислить все розничные магазины.
|
|
167
|
+
// hasPOS: [],
|
|
168
|
+
taxID: this.companyInfo.inn,
|
|
169
|
+
identifier: {
|
|
170
|
+
'@type': 'PropertyValue',
|
|
171
|
+
propertyID: 'OGRN',
|
|
172
|
+
value: this.companyInfo.ogrn,
|
|
173
|
+
},
|
|
174
|
+
contactPoint: this.createOrganizationContactPoints(),
|
|
175
|
+
...(this.companyInfo.warehouseAddress.length > 0 && {
|
|
176
|
+
location: this.companyInfo.warehouseAddress.map((warehouseAddress) => ({
|
|
177
|
+
'@type': 'Place',
|
|
178
|
+
name: `${this.companyInfo.name} — склад самовывоза`,
|
|
179
|
+
address: warehouseAddress,
|
|
180
|
+
})),
|
|
181
|
+
}),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Объединяет несколько JSON-LD сущностей в один документ с `@graph`.
|
|
186
|
+
*
|
|
187
|
+
* @param data Массив JSON-LD сущностей для объединения.
|
|
188
|
+
*/
|
|
189
|
+
// eslint-disable-next-line class-methods-use-this,sonarjs/function-return-type
|
|
190
|
+
merge(data) {
|
|
191
|
+
return {
|
|
192
|
+
'@context': 'https://schema.org',
|
|
193
|
+
'@graph': data.map((item) => omit(item, '@context')),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Формирует PostalAddress из структурированного адреса компании.
|
|
198
|
+
*
|
|
199
|
+
* @param address Структурированный адрес компании.
|
|
200
|
+
*/
|
|
201
|
+
// eslint-disable-next-line class-methods-use-this
|
|
202
|
+
createPostalAddress(address) {
|
|
203
|
+
const streetAddress = [address.streetAddress, address.extendedAddress].filter(Boolean).join(', ');
|
|
204
|
+
if (!streetAddress && !address.locality && !address.region && !address.postalCode && !address.country) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
'@type': 'PostalAddress',
|
|
209
|
+
...(streetAddress && { streetAddress }),
|
|
210
|
+
...(address.locality && { addressLocality: address.locality }),
|
|
211
|
+
...(address.region && { addressRegion: address.region }),
|
|
212
|
+
...(address.postalCode && { postalCode: address.postalCode }),
|
|
213
|
+
...(address.country && { addressCountry: address.country }),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Формирует список ContactPoint для Organization.
|
|
218
|
+
*/
|
|
219
|
+
createOrganizationContactPoints() {
|
|
220
|
+
const contactPoints = [
|
|
221
|
+
{
|
|
222
|
+
'@type': 'ContactPoint',
|
|
223
|
+
contactType: 'customer service',
|
|
224
|
+
telephone: this.companyInfo.phone,
|
|
225
|
+
email: this.companyInfo.mail,
|
|
226
|
+
areaServed: 'RU',
|
|
227
|
+
availableLanguage: 'Russian',
|
|
228
|
+
},
|
|
229
|
+
];
|
|
230
|
+
if (this.companyInfo.secondaryPhone) {
|
|
231
|
+
contactPoints.push({
|
|
232
|
+
'@type': 'ContactPoint',
|
|
233
|
+
contactType: 'customer service',
|
|
234
|
+
telephone: this.companyInfo.secondaryPhone,
|
|
235
|
+
areaServed: 'RU',
|
|
236
|
+
availableLanguage: 'Russian',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
if (this.companyInfo.hr) {
|
|
240
|
+
contactPoints.push({
|
|
241
|
+
'@type': 'ContactPoint',
|
|
242
|
+
contactType: 'HR',
|
|
243
|
+
telephone: this.companyInfo.hr.phone,
|
|
244
|
+
email: this.companyInfo.hr.mail,
|
|
245
|
+
areaServed: 'RU',
|
|
246
|
+
availableLanguage: 'Russian',
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
return contactPoints;
|
|
250
|
+
}
|
|
145
251
|
/**
|
|
146
252
|
* Нормализует дату окончания цены в формат Schema.org (YYYY-MM-DD).
|
|
147
253
|
*
|
|
@@ -163,9 +269,9 @@ export class SchemaOrgFactory {
|
|
|
163
269
|
// eslint-disable-next-line class-methods-use-this
|
|
164
270
|
getAvailability(product) {
|
|
165
271
|
if (product.onOrder) {
|
|
166
|
-
return 'PreOrder';
|
|
272
|
+
return 'https://schema.org/PreOrder';
|
|
167
273
|
}
|
|
168
|
-
return product.stockCount?.length ? 'InStock' : 'OutOfStock';
|
|
274
|
+
return product.stockCount?.length ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock';
|
|
169
275
|
}
|
|
170
276
|
/**
|
|
171
277
|
* Проверяет, является ли категория виртуальной.
|
|
@@ -209,21 +315,19 @@ export class SchemaOrgFactory {
|
|
|
209
315
|
url: productUrl,
|
|
210
316
|
...(image && { image }),
|
|
211
317
|
...(description && { description }),
|
|
212
|
-
offers:
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
name: this.companyInfo.name,
|
|
223
|
-
},
|
|
224
|
-
url: productUrl,
|
|
318
|
+
offers: {
|
|
319
|
+
'@type': 'Offer',
|
|
320
|
+
priceCurrency: 'RUB',
|
|
321
|
+
...(priceValidUntil && { priceValidUntil }),
|
|
322
|
+
price: product.costRub,
|
|
323
|
+
availability: this.getAvailability(product),
|
|
324
|
+
itemCondition: 'https://schema.org/NewCondition',
|
|
325
|
+
seller: {
|
|
326
|
+
'@type': 'Organization',
|
|
327
|
+
name: this.companyInfo.name,
|
|
225
328
|
},
|
|
226
|
-
|
|
329
|
+
url: productUrl,
|
|
330
|
+
},
|
|
227
331
|
},
|
|
228
332
|
};
|
|
229
333
|
}
|
|
@@ -245,14 +349,21 @@ export class SchemaOrgFactory {
|
|
|
245
349
|
itemListOrder: 'https://schema.org/ItemListUnordered',
|
|
246
350
|
itemListElement: [
|
|
247
351
|
// Добавляем подкатегории в начало списка.
|
|
248
|
-
...childCategories.slice(0, 5).map((subCategory, index) =>
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
352
|
+
...childCategories.slice(0, 5).map((subCategory, index) => {
|
|
353
|
+
const image = this.mediaImageTransformerPipe.transform(subCategory.image, true);
|
|
354
|
+
const description = subCategory.seo?.description ?? subCategory.properties?.description;
|
|
355
|
+
return {
|
|
356
|
+
'@type': 'ListItem',
|
|
357
|
+
position: index + 1,
|
|
358
|
+
item: {
|
|
359
|
+
'@type': 'CollectionPage',
|
|
360
|
+
name: subCategory.name,
|
|
361
|
+
url: this.getCategoryCanonicalUrl(subCategory, categoryPath),
|
|
362
|
+
...(image && { image }),
|
|
363
|
+
...(description && { description }),
|
|
364
|
+
},
|
|
365
|
+
};
|
|
366
|
+
}),
|
|
256
367
|
// Добавляем товары после подкатегорий.
|
|
257
368
|
...products.slice(0, 10).map((product, index) => this.createProductsListItem(product, childCategories.length + index + 1, productPath)),
|
|
258
369
|
],
|
|
@@ -265,37 +376,46 @@ export class SchemaOrgFactory {
|
|
|
265
376
|
* @param categoryPath Url путь к категориям товаров. В пути должен присутствовать шаблон ':id', обозначающий идентификатор категории для подстановки.
|
|
266
377
|
*/
|
|
267
378
|
createCatalogBreadcrumbsList(breadcrumbs, categoryPath) {
|
|
379
|
+
const catalogUrl = `${this.urls.siteUrl}${categoryPath.replace(':id', '')}`;
|
|
268
380
|
const breadcrumbItems = [
|
|
269
381
|
// Всегда добавляем главную страницу.
|
|
270
|
-
|
|
271
|
-
'@type': 'ListItem',
|
|
272
|
-
position: 1,
|
|
273
|
-
name: 'Главная',
|
|
274
|
-
item: this.urls.siteUrl,
|
|
275
|
-
},
|
|
382
|
+
this.createBreadcrumbListItem(1, 'Главная', this.urls.siteUrl),
|
|
276
383
|
// Добавляем каталог.
|
|
277
|
-
|
|
278
|
-
'@type': 'ListItem',
|
|
279
|
-
position: 2,
|
|
280
|
-
name: 'Каталог',
|
|
281
|
-
item: `${this.urls.siteUrl}/${categoryPath}`,
|
|
282
|
-
},
|
|
384
|
+
this.createBreadcrumbListItem(2, 'Каталог', catalogUrl),
|
|
283
385
|
];
|
|
284
386
|
// Добавляем существующие breadcrumbs с корректировкой позиций.
|
|
285
387
|
breadcrumbs.forEach((item, index) => {
|
|
286
388
|
const link = isArray(item.routerLink) ? item.routerLink.join('/') : item.routerLink;
|
|
287
|
-
breadcrumbItems.push({
|
|
288
|
-
'@type': 'ListItem',
|
|
289
|
-
position: index + 3, // Начинаем с позиции 3 (после Главная и Каталог).
|
|
290
|
-
name: item.label,
|
|
291
|
-
item: link ? `${this.urls.siteUrl}/${link}` : undefined,
|
|
292
|
-
});
|
|
389
|
+
breadcrumbItems.push(this.createBreadcrumbListItem(index + 3, item.label, link ? `${this.urls.siteUrl}/${link}` : undefined));
|
|
293
390
|
});
|
|
294
391
|
return {
|
|
295
392
|
'@type': 'BreadcrumbList',
|
|
393
|
+
itemListOrder: 'https://schema.org/ItemListOrderAscending',
|
|
296
394
|
itemListElement: breadcrumbItems,
|
|
297
395
|
};
|
|
298
396
|
}
|
|
397
|
+
/**
|
|
398
|
+
* Создаёт элемент BreadcrumbList в формате, рекомендованном Schema.org.
|
|
399
|
+
*
|
|
400
|
+
* @param position Позиция элемента в цепочке.
|
|
401
|
+
* @param name Название элемента.
|
|
402
|
+
* @param url URL элемента.
|
|
403
|
+
*/
|
|
404
|
+
// eslint-disable-next-line class-methods-use-this
|
|
405
|
+
createBreadcrumbListItem(position, name, url) {
|
|
406
|
+
return {
|
|
407
|
+
'@type': 'ListItem',
|
|
408
|
+
position,
|
|
409
|
+
...(url
|
|
410
|
+
? {
|
|
411
|
+
item: {
|
|
412
|
+
'@id': url,
|
|
413
|
+
name,
|
|
414
|
+
},
|
|
415
|
+
}
|
|
416
|
+
: { name }),
|
|
417
|
+
};
|
|
418
|
+
}
|
|
299
419
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SchemaOrgFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
300
420
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SchemaOrgFactory, providedIn: 'root' }); }
|
|
301
421
|
}
|
|
@@ -305,4 +425,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
305
425
|
providedIn: 'root',
|
|
306
426
|
}]
|
|
307
427
|
}] });
|
|
308
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLW9yZy1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zZW8vY2xhc3Nlcy9zY2hlbWEtb3JnLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHL0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSDdCO1FBSUk7O1dBRUc7UUFDYyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV2RDs7V0FFRztRQUNjLFNBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEM7O1dBRUc7UUFDSyxpQkFBWSxHQUFtQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFOUQ7O1dBRUc7UUFDYyw4QkFBeUIsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztLQXdTcEY7SUF0U0c7Ozs7O09BS0c7SUFDSSxzQkFBc0IsQ0FBQyxPQUFtQixFQUFFLFdBQW1CO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hILHVF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QkFDZixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxZQUFZLEVBQUU7YUFDL0M7U0FDSixDQUFDO1FBRUYsK0RBQStEO1FBQy9ELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFFcEYsZUFBZSxDQUFDLElBQUksQ0FBQztnQkFDakIsT0FBTyxFQUFFLFVBQVU7Z0JBQ25CLFFBQVEsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLGtEQUFrRDtnQkFDdkUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzFELENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNILE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsZUFBZSxFQUFFLGVBQWU7U0FDakIsQ0FBQztJQUN4QixDQUFDOytHQTFUUSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQUZiLE1BQU07OzRGQUVULGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYkxpc3QsIENvbGxlY3Rpb25QYWdlLCBMaXN0SXRlbSwgUHJvZHVjdCwgV2l0aENvbnRleHQgfSBmcm9tICdzY2hlbWEtZHRzJztcblxuaW1wb3J0IHsgU2NDYXRlZ29yeSB9IGZyb20gJy4uLy4uL2NhdGFsb2cvZHRvL3NjLWNhdGVnb3J5JztcbmltcG9ydCB7IFNjUHJvZHVjdCB9IGZyb20gJy4uLy4uL2NhdGFsb2cvZHRvL3NjLXByb2R1Y3QnO1xuaW1wb3J0IHsgU2NWaXJ0dWFsQ2F0ZWdvcnkgfSBmcm9tICcuLi8uLi9jYXRhbG9nL2R0by9zYy12aXJ0dWFsLWNhdGVnb3J5JztcbmltcG9ydCB7IFNjSUNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vY2F0YWxvZy9pbnRlcmZhY2VzL3NjLWktY2F0ZWdvcnknO1xuaW1wb3J0IHsgU2NJUHJvZHVjdCB9IGZyb20gJy4uLy4uL2NhdGFsb2cvaW50ZXJmYWNlcy9zYy1pLXByb2R1Y3QnO1xuaW1wb3J0IHsgU2NJVmlydHVhbENhdGVnb3J5IH0gZnJvbSAnLi4vLi4vY2F0YWxvZy9pbnRlcmZhY2VzL3NjLWktdmlydHVhbC1jYXRlZ29yeSc7XG5pbXBvcnQgeyBTY0lkT3JTbHVnUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3NjLWlkLW9yLXNsdWcucGlwZSc7XG5pbXBvcnQgeyBTY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9zYy1tZWRpYS1pbWFnZS10cmFuc2Zvcm1lci5waXBlJztcbmltcG9ydCB7IFNDX0NPTVBBTllfSU5GTyB9IGZyb20gJy4uLy4uL3Rva2Vucy9zYy1jb21wYW55LWluZm8nO1xuaW1wb3J0IHsgU0NfVVJMUyB9IGZyb20gJy4uLy4uL3Rva2Vucy9zYy11cmxzJztcbmltcG9ydCB7IFNjSUJyZWFkY3J1bWJJdGVtIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICog0JzQtdGF0LDQvdC40LfQvNGLINCz0LXQvdC10YDQsNGG0LjQuCDRgdGF0LXQvCDQtNCw0L3QvdGL0YUgU2NoZW1hLm9yZy5cbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NoZW1hT3JnRmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICog0JTQsNC90L3Ri9C1INC+INC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21wYW55SW5mbyA9IGluamVjdChTQ19DT01QQU5ZX0lORk8pO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INGB0YHRi9C70L7QuiDQv9GA0LjQu9C+0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybHMgPSBpbmplY3QoU0NfVVJMUyk7XG5cbiAgICAvKipcbiAgICAgKiDQn9Cw0LnQvywg0LLQvtC30LLRgNCw0YnQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCDRgdC40LzQstC+0LvRjNC90L7QtSDQvtCx0L7Qt9C90LDRh9C10L3QuNC1IChzbHVnKSDQuNGB0YXQvtC00Y8g0LjQtyDQvdCw0YHRgtGA0L7QtdC6INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlkT3JTbHVnUGlwZTogU2NJZE9yU2x1Z1BpcGUgPSBpbmplY3QoU2NJZE9yU2x1Z1BpcGUpO1xuXG4gICAgLyoqXG4gICAgICog0J/QsNC50L8g0LTQu9GPINGE0L7RgNC80LjRgNC+0LLQsNC90LjRjyDQv9C+0LvQvdC+0LPQviBVUkkg0LjQt9C+0LHRgNCw0LbQtdC90LjRjyDQvdCwIG1lZGlhINGB0LXRgNCy0LXRgNC1LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZSA9IGluamVjdChTY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUpO1xuXG4gICAgLyoqXG4gICAgICog0JPQtdC90LXRgNC40YDRg9C10YIg0Lgg0LLQvtC30LLRgNCw0YnQsNC10YIg0YHRhdC10LzRgyDQtNCw0L3QvdGL0YUg0LTQu9GPINGD0LrQsNC30LDQvdC90L7Qs9C+INC/0YDQvtC00YPQutGC0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQtS5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFBhdGggVXJsINC/0YPRgtGMINC6INGC0L7QstCw0YDRgy4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YLQvtCy0LDRgNCwINC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZUZvclByb2R1Y3RJdGVtKHByb2R1Y3Q6IFNjSVByb2R1Y3QsIHByb2R1Y3RQYXRoOiBzdHJpbmcpOiBXaXRoQ29udGV4dDxQcm9kdWN0PiB7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RVcmwgPSBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke3Byb2R1Y3RQYXRoLnJlcGxhY2UoJzppZCcsIHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShwcm9kdWN0KS50b1N0cmluZygpKX1gO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMubWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZS50cmFuc2Zvcm0oKHByb2R1Y3QgYXMgU2NQcm9kdWN0KT8uZ2V0SW1hZ2VQcmV2aWV3KCkgPz8gcHJvZHVjdC5pbWFnZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcHJvZHVjdC5wcm9wZXJ0aWVzPy5kZXNjcmlwdGlvbjtcbiAgICAgICAgY29uc3QgcHJpY2VWYWxpZFVudGlsID0gdGhpcy5ub3JtYWxpemVQcmljZVZhbGlkVW50aWwocHJvZHVjdC5kaXNjb3VudD8uZXhwaXJlZEF0KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0Bjb250ZXh0JzogJ2h0dHBzOi8vc2NoZW1hLm9yZycsXG4gICAgICAgICAgICAnQHR5cGUnOiAnUHJvZHVjdCcsXG4gICAgICAgICAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgICAgICAgICAuLi4oaW1hZ2UgJiYgeyBpbWFnZSB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgbXBuOiBwcm9kdWN0LmNvZGUsXG4gICAgICAgICAgICB1cmw6IHByb2R1Y3RVcmwsXG4gICAgICAgICAgICBvZmZlcnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICdAdHlwZSc6ICdPZmZlcicsXG4gICAgICAgICAgICAgICAgICAgIHByaWNlQ3VycmVuY3k6ICdSVUInLFxuICAgICAgICAgICAgICAgICAgICAuLi4ocHJpY2VWYWxpZFVudGlsICYmIHsgcHJpY2VWYWxpZFVudGlsIH0pLFxuICAgICAgICAgICAgICAgICAgICBwcmljZTogcHJvZHVjdC5jb3N0UnViLFxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHk6IHRoaXMuZ2V0QXZhaWxhYmlsaXR5KHByb2R1Y3QpLFxuICAgICAgICAgICAgICAgICAgICBpdGVtQ29uZGl0aW9uOiAnaHR0cHM6Ly9zY2hlbWEub3JnL05ld0NvbmRpdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHNlbGxlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ09yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmNvbXBhbnlJbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHVybDogcHJvZHVjdFVybCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSBhcyBXaXRoQ29udGV4dDxQcm9kdWN0PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQk9C10L3QtdGA0LjRgNGD0LXRgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDRgdGF0LXQvNGDINC00LDQvdC90YvRhSDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtCz0L4g0L/RgNC+0LTRg9C60YLQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSDQlNCw0L3QvdGL0LUg0L4g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0cyDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQsNGFINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlQYXRoIFVybCDQv9GD0YLRjCDQuiDQutCw0YLQtdCz0L7RgNC40Y/QvCDRgtC+0LLQsNGA0L7Qsi4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4INC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0YLQvtCy0LDRgNGDLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRgtC+0LLQsNGA0LAg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICogQHBhcmFtIGJyZWFkY3J1bWJzINCU0LDQvdC90YvQtSDQviDRhdC70LXQsdC90YvRhSDQutGA0L7RiNC60LDRhSDQtNC70Y8g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZUZvckNhdGVnb3J5SXRlbShcbiAgICAgICAgY2F0ZWdvcnk6IFNjSUNhdGVnb3J5IHwgU2NJVmlydHVhbENhdGVnb3J5LFxuICAgICAgICBwcm9kdWN0czogU2NJUHJvZHVjdFtdLFxuICAgICAgICBjYXRlZ29yeVBhdGg6IHN0cmluZyxcbiAgICAgICAgcHJvZHVjdFBhdGg6IHN0cmluZyxcbiAgICAgICAgYnJlYWRjcnVtYnM6IFNjSUJyZWFkY3J1bWJJdGVtW11cbiAgICApOiBXaXRoQ29udGV4dDxDb2xsZWN0aW9uUGFnZT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGNhdGVnb3J5LnNlbz8uZGVzY3JpcHRpb24gPz8gY2F0ZWdvcnkucHJvcGVydGllcz8uZGVzY3JpcHRpb247XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5tZWRpYUltYWdlVHJhbnNmb3JtZXJQaXBlLnRyYW5zZm9ybShjYXRlZ29yeS5pbWFnZSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdAY29udGV4dCc6ICdodHRwczovL3NjaGVtYS5vcmcnLFxuICAgICAgICAgICAgJ0B0eXBlJzogJ0NvbGxlY3Rpb25QYWdlJyxcbiAgICAgICAgICAgIG5hbWU6IGNhdGVnb3J5LnNlbz8udGl0bGUgPz8gY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5LCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgLi4uKGltYWdlICYmIHsgaW1hZ2UgfSksXG4gICAgICAgICAgICAvLyBTRU8g0LTQsNC90L3Ri9C1LlxuICAgICAgICAgICAgLi4uKGNhdGVnb3J5LnNlbz8ua2V5d29yZHMgJiYgeyBrZXl3b3JkczogY2F0ZWdvcnkuc2VvLmtleXdvcmRzIH0pLFxuICAgICAgICAgICAgLy8g0J7RgdC90L7QstC90L7QuSDQutC+0L3RgtC10L3RgiDRgdGC0YDQsNC90LjRhtGLIC0g0YHQv9C40YHQvtC6INGC0L7QstCw0YDQvtCyINC4INC/0L7QtNC60LDRgtC10LPQvtGA0LjQuS5cbiAgICAgICAgICAgIG1haW5FbnRpdHk6IHRoaXMuY3JlYXRlQ2F0ZWdvcnlNYWluRW50aXR5KGNhdGVnb3J5LCBwcm9kdWN0cywgY2F0ZWdvcnlQYXRoLCBwcm9kdWN0UGF0aCksXG4gICAgICAgICAgICAvLyDQndCw0LLQuNCz0LDRhtC40L7QvdC90YvQtSDRhdC70LXQsdC90YvQtSDQutGA0L7RiNC60LggKFNjaGVtYS5vcmc6IGJyZWFkY3J1bWIpLlxuICAgICAgICAgICAgYnJlYWRjcnVtYjogdGhpcy5jcmVhdGVDYXRhbG9nQnJlYWRjcnVtYnNMaXN0KGJyZWFkY3J1bWJzLCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDQvNC10YLQsNC00LDQvdC90YvQtSDQtNC70Y8gU0VPLlxuICAgICAgICAgICAgYWJvdXQ6IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnQ2F0ZWdvcnlDb2RlJyxcbiAgICAgICAgICAgICAgICBjb2RlVmFsdWU6IGNhdGVnb3J5LnNsdWcsXG4gICAgICAgICAgICAgICAgbmFtZTogY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDRgdCw0LnRgtC1LlxuICAgICAgICAgICAgaXNQYXJ0T2Y6IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnV2ViU2l0ZScsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogdGhpcy51cmxzLnNpdGVVcmwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g0KHQstGP0LfQsNC90L3Ri9C1INGB0YLRgNCw0L3QuNGG0YsuXG4gICAgICAgICAgICByZWxhdGVkTGluazogW1xuICAgICAgICAgICAgICAgIGAke3RoaXMudXJscy5zaXRlVXJsfSR7Y2F0ZWdvcnlQYXRoLnJlcGxhY2UoJzppZCcsICcnKX1gLFxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5KSB8fCAhY2F0ZWdvcnkucGFyZW50Q2F0ZWdvcnkgPyBbXSA6IFt0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5LnBhcmVudENhdGVnb3J5LCBjYXRlZ29yeVBhdGgpXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDRgdCy0L7QudGB0YLQstCwINC60LDRgtC10LPQvtGA0LjQuCAo0L3QtSDQuNC30L7QsdGA0LDQttC10L3QuNGPKS5cbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAn0JrQvtC70LjRh9C10YHRgtCy0L4g0YLQvtCy0LDRgNC+0LInLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKHByb2R1Y3RzPy5sZW5ndGggPz8gMCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU2x1ZyDQutCw0YLQtdCz0L7RgNC40LgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuc2x1ZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCBTRU8g0LTQsNC90L3Ri9C1INC10YHQu9C4INC10YHRgtGMLlxuICAgICAgICAgICAgICAgIC4uLihjYXRlZ29yeS5zZW8/LmtleXdvcmRzXG4gICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnUHJvcGVydHlWYWx1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0VPIEtleXdvcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYXRlZ29yeS5zZW8ua2V5d29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICAuLi4oY2F0ZWdvcnkuc2VvPy50aXRsZVxuICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NFTyBUaXRsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuc2VvLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9IGFzIFdpdGhDb250ZXh0PENvbGxlY3Rpb25QYWdlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQndC+0YDQvNCw0LvQuNC30YPQtdGCINC00LDRgtGDINC+0LrQvtC90YfQsNC90LjRjyDRhtC10L3RiyDQsiDRhNC+0YDQvNCw0YIgU2NoZW1hLm9yZyAoWVlZWS1NTS1ERCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwaXJlZEF0INCU0LDRgtCwINC00LvRjyDQvdC+0YDQvNCw0LvQuNC30LDRhtC40LhcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHByaXZhdGUgbm9ybWFsaXplUHJpY2VWYWxpZFVudGlsKGV4cGlyZWRBdD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghZXhwaXJlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IGV4cGlyZWRBdC5zbGljZSgwLCAxMCk7XG5cbiAgICAgICAgcmV0dXJuIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KGRhdGUpID8gZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntC/0YDQtdC00LXQu9GP0LXRgiDQtNC+0YHRgtGD0L/QvdC+0YHRgtGMINGC0L7QstCw0YDQsCDQv9C+INC00LDQvdC90YvQvCDQv9GA0L7QtNGD0LrRgtCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3Qg0JTQsNC90L3Ri9C1INC+INC/0YDQvtC00YPQutGC0LUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIGdldEF2YWlsYWJpbGl0eShwcm9kdWN0OiBTY0lQcm9kdWN0KTogJ0luU3RvY2snIHwgJ091dE9mU3RvY2snIHwgJ1ByZU9yZGVyJyB7XG4gICAgICAgIGlmIChwcm9kdWN0Lm9uT3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAnUHJlT3JkZXInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2R1Y3Quc3RvY2tDb3VudD8ubGVuZ3RoID8gJ0luU3RvY2snIDogJ091dE9mU3RvY2snO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQvtCy0LXRgNGP0LXRgiwg0Y/QstC70Y/QtdGC0YHRjyDQu9C4INC60LDRgtC10LPQvtGA0LjRjyDQstC40YDRgtGD0LDQu9GM0L3QvtC5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhdGVnb3J5INCU0LDQvdC90YvQtSDQviDQutCw0YLQtdCz0L7RgNC40Lgg0LTQu9GPINC/0YDQvtCy0LXRgNC60LguXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIGlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5OiBTY0lDYXRlZ29yeSB8IFNjSVZpcnR1YWxDYXRlZ29yeSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gJ2NoaWxkQ2F0ZWdvcmllcycgaW4gY2F0ZWdvcnkgJiYgJ3Byb2R1Y3RDYXRlZ29yaWVzJyBpbiBjYXRlZ29yeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiBVUkwg0LTQu9GPINGD0LrQsNC30LDQvdC90L7QuSDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnkg0JTQsNC90L3Ri9C1INC+INC60LDRgtC10LPQvtGA0LjQuFxuICAgICAqIEBwYXJhbSBjYXRlZ29yeVBhdGggVXJsINC/0YPRgtGMINC6INC60LDRgtC10LPQvtGA0LjRj9C8INGC0L7QstCw0YDQvtCyLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQutCw0YLQtdCz0L7RgNC40Lgg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDYXRlZ29yeUNhbm9uaWNhbFVybChjYXRlZ29yeTogU2NJQ2F0ZWdvcnkgfCBTY0lWaXJ0dWFsQ2F0ZWdvcnksIGNhdGVnb3J5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5KSA/IGNhdGVnb3J5LnNsdWcgOiB0aGlzLmlkT3JTbHVnUGlwZS50cmFuc2Zvcm0oY2F0ZWdvcnkpLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBjYXRlZ29yeVBhdGgucmVwbGFjZSgnOmlkJywgaWQpO1xuXG4gICAgICAgIHJldHVybiBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke3BhdGh9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0ZHRgiDRjdC70LXQvNC10L3RgiDRgdC/0LjRgdC60LAgSXRlbUxpc3Qg0YEg0LrRgNCw0YLQutC40LwgUHJvZHVjdCDQtNC70Y8g0YHRgtGA0LDQvdC40YbRiyDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQtS5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24g0J/QvtC30LjRhtC40Y8g0LIg0YHQv9C40YHQutC1LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0YLQvtCy0LDRgNGDLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRgtC+0LLQsNGA0LAg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVQcm9kdWN0c0xpc3RJdGVtKHByb2R1Y3Q6IFNjSVByb2R1Y3QsIHBvc2l0aW9uOiBudW1iZXIsIHByb2R1Y3RQYXRoOiBzdHJpbmcpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCBwcm9kdWN0VXJsID0gYCR7dGhpcy51cmxzLnNpdGVVcmx9JHtwcm9kdWN0UGF0aC5yZXBsYWNlKCc6aWQnLCB0aGlzLmlkT3JTbHVnUGlwZS50cmFuc2Zvcm0ocHJvZHVjdCkudG9TdHJpbmcoKSl9YDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLm1lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUudHJhbnNmb3JtKChwcm9kdWN0IGFzIFNjUHJvZHVjdCk/LmdldEltYWdlUHJldmlldz8uKCkgPz8gcHJvZHVjdC5pbWFnZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcHJvZHVjdC5zZW8/LmRlc2NyaXB0aW9uID8/IHByb2R1Y3QucHJvcGVydGllcz8uZGVzY3JpcHRpb247XG4gICAgICAgIGNvbnN0IHByaWNlVmFsaWRVbnRpbCA9IHRoaXMubm9ybWFsaXplUHJpY2VWYWxpZFVudGlsKHByb2R1Y3QuZGlzY291bnQ/LmV4cGlyZWRBdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdAdHlwZSc6ICdMaXN0SXRlbScsXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnUHJvZHVjdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogcHJvZHVjdFVybCxcbiAgICAgICAgICAgICAgICAuLi4oaW1hZ2UgJiYgeyBpbWFnZSB9KSxcbiAgICAgICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgICAgICBvZmZlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ09mZmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlQ3VycmVuY3k6ICdSVUInLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHByaWNlVmFsaWRVbnRpbCAmJiB7IHByaWNlVmFsaWRVbnRpbCB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBwcm9kdWN0LmNvc3RSdWIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHk6IHRoaXMuZ2V0QXZhaWxhYmlsaXR5KHByb2R1Y3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbjogJ2h0dHBzOi8vc2NoZW1hLm9yZy9OZXdDb25kaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsbGVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ09yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogcHJvZHVjdFVybCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiBtYWluRW50aXR5INC00LvRjyDRg9C60LDQt9Cw0L3QvdC+0Lkg0LrQsNGC0LXQs9C+0YDQuNC4INGC0L7QstCw0YDQvtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhdGVnb3J5INCU0LDQvdC90YvQtSDQviDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICogQHBhcmFtIHByb2R1Y3RzINCU0LDQvdC90YvQtSDQviDRgtC+0LLQsNGA0LDRhSDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICogQHBhcmFtIGNhdGVnb3J5UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0LrQsNGC0LXQs9C+0YDQuNGP0Lwg0YLQvtCy0LDRgNC+0LIuINCSINC/0YPRgtC4INC00L7Qu9C20LXQvSDQv9GA0LjRgdGD0YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvSAnOmlkJywg0L7QsdC+0LfQvdCw0YfQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC60LDRgtC10LPQvtGA0LjQuCDQtNC70Y8g0L/QvtC00YHRgtCw0L3QvtCy0LrQuC5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFBhdGggVXJsINC/0YPRgtGMINC6INGC0L7QstCw0YDRgy4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YLQvtCy0LDRgNCwINC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2F0ZWdvcnlNYWluRW50aXR5KGNhdGVnb3J5OiBTY0lDYXRlZ29yeSB8IFNjSVZpcnR1YWxDYXRlZ29yeSwgcHJvZHVjdHM6IFNjSVByb2R1Y3RbXSwgY2F0ZWdvcnlQYXRoOiBzdHJpbmcsIHByb2R1Y3RQYXRoOiBzdHJpbmcpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCBjaGlsZENhdGVnb3JpZXMgPSB0aGlzLmlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5KVxuICAgICAgICAgICAgPyBbLi4uKChjYXRlZ29yeSBhcyBTY1ZpcnR1YWxDYXRlZ29yeSkuY2hpbGRDYXRlZ29yaWVzID8/IFtdKSwgLi4uKChjYXRlZ29yeSBhcyBTY1ZpcnR1YWxDYXRlZ29yeSkucHJvZHVjdENhdGVnb3JpZXMgPz8gW10pXVxuICAgICAgICAgICAgOiAoKGNhdGVnb3J5IGFzIFNjQ2F0ZWdvcnkpLmNhdGVnb3JpZXMgPz8gW10pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQHR5cGUnOiAnSXRlbUxpc3QnLFxuICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogcHJvZHVjdHMubGVuZ3RoICsgY2hpbGRDYXRlZ29yaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIGl0ZW1MaXN0T3JkZXI6ICdodHRwczovL3NjaGVtYS5vcmcvSXRlbUxpc3RVbm9yZGVyZWQnLFxuICAgICAgICAgICAgaXRlbUxpc3RFbGVtZW50OiBbXG4gICAgICAgICAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INC/0L7QtNC60LDRgtC10LPQvtGA0LjQuCDQsiDQvdCw0YfQsNC70L4g0YHQv9C40YHQutCwLlxuICAgICAgICAgICAgICAgIC4uLmNoaWxkQ2F0ZWdvcmllcy5zbGljZSgwLCA1KS5tYXAoKHN1YkNhdGVnb3J5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ0xpc3RJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc3ViQ2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKHN1YkNhdGVnb3J5LCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogdGhpcy5tZWRpYUltYWdlVHJhbnNmb3JtZXJQaXBlLnRyYW5zZm9ybShzdWJDYXRlZ29yeS5pbWFnZSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzdWJDYXRlZ29yeS5zZW8/LmRlc2NyaXB0aW9uID8/IHN1YkNhdGVnb3J5LnByb3BlcnRpZXM/LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAvLyDQlNC+0LHQsNCy0LvRj9C10Lwg0YLQvtCy0LDRgNGLINC/0L7RgdC70LUg0L/QvtC00LrQsNGC0LXQs9C+0YDQuNC5LlxuICAgICAgICAgICAgICAgIC4uLnByb2R1Y3RzLnNsaWNlKDAsIDEwKS5tYXAoKHByb2R1Y3QsIGluZGV4KSA9PiB0aGlzLmNyZWF0ZVByb2R1Y3RzTGlzdEl0ZW0ocHJvZHVjdCwgY2hpbGRDYXRlZ29yaWVzLmxlbmd0aCArIGluZGV4ICsgMSwgcHJvZHVjdFBhdGgpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQvNCw0YHRgdC40LIgTGlua0RhdGEg0LIgQnJlYWRjcnVtYkxpc3Qg0LTQu9GPINC60LDRgtCw0LvQvtCz0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMg0JzQsNGB0YHQuNCyINGF0LvQtdCx0L3Ri9GFINC60YDQvtGI0LXQui5cbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlQYXRoIFVybCDQv9GD0YLRjCDQuiDQutCw0YLQtdCz0L7RgNC40Y/QvCDRgtC+0LLQsNGA0L7Qsi4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4INC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2F0YWxvZ0JyZWFkY3J1bWJzTGlzdChicmVhZGNydW1iczogU2NJQnJlYWRjcnVtYkl0ZW1bXSwgY2F0ZWdvcnlQYXRoOiBzdHJpbmcpOiBCcmVhZGNydW1iTGlzdCB7XG4gICAgICAgIGNvbnN0IGJyZWFkY3J1bWJJdGVtczogTGlzdEl0ZW1bXSA9IFtcbiAgICAgICAgICAgIC8vINCS0YHQtdCz0LTQsCDQtNC+0LHQsNCy0LvRj9C10Lwg0LPQu9Cw0LLQvdGD0Y4g0YHRgtGA0LDQvdC40YbRgy5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnTGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfQk9C70LDQstC90LDRjycsXG4gICAgICAgICAgICAgICAgaXRlbTogdGhpcy51cmxzLnNpdGVVcmwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INC60LDRgtCw0LvQvtCzLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdMaXN0SXRlbScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IDIsXG4gICAgICAgICAgICAgICAgbmFtZTogJ9Ca0LDRgtCw0LvQvtCzJyxcbiAgICAgICAgICAgICAgICBpdGVtOiBgJHt0aGlzLnVybHMuc2l0ZVVybH0vJHtjYXRlZ29yeVBhdGh9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INGB0YPRidC10YHRgtCy0YPRjtGJ0LjQtSBicmVhZGNydW1icyDRgSDQutC+0YDRgNC10LrRgtC40YDQvtCy0LrQvtC5INC/0L7Qt9C40YbQuNC5LlxuICAgICAgICBicmVhZGNydW1icy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGlzQXJyYXkoaXRlbS5yb3V0ZXJMaW5rKSA/IGl0ZW0ucm91dGVyTGluay5qb2luKCcvJykgOiBpdGVtLnJvdXRlckxpbms7XG5cbiAgICAgICAgICAgIGJyZWFkY3J1bWJJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnTGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBpbmRleCArIDMsIC8vINCd0LDRh9C40L3QsNC10Lwg0YEg0L/QvtC30LjRhtC40LggMyAo0L/QvtGB0LvQtSDQk9C70LDQstC90LDRjyDQuCDQmtCw0YLQsNC70L7QsykuXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgICBpdGVtOiBsaW5rID8gYCR7dGhpcy51cmxzLnNpdGVVcmx9LyR7bGlua31gIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQHR5cGUnOiAnQnJlYWRjcnVtYkxpc3QnLFxuICAgICAgICAgICAgaXRlbUxpc3RFbGVtZW50OiBicmVhZGNydW1iSXRlbXMsXG4gICAgICAgIH0gYXMgQnJlYWRjcnVtYkxpc3Q7XG4gICAgfVxufVxuIl19
|
|
428
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLW9yZy1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zZW8vY2xhc3Nlcy9zY2hlbWEtb3JnLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFVMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBRy9DOztHQUVHO0FBSUgsTUFBTSxPQUFPLGdCQUFnQjtJQUg3QjtRQUlJOztXQUVHO1FBQ2MsZ0JBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFdkQ7O1dBRUc7UUFDYyxTQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhDOztXQUVHO1FBQ0ssaUJBQVksR0FBbUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTlEOztXQUVHO1FBQ2MsOEJBQXlCLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7S0E2YXBGO0lBM2FHOzs7Ozs7T0FNRztJQUNJLHNCQUFzQixDQUFDLE9BQW1CLEVBQUUsV0FBbUIsRUFBRSxFQUFXO1FBQy9FLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENB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QUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2xJLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNILE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsYUFBYSxFQUFFLDJDQUEyQztZQUMxRCxlQUFlLEVBQUUsZUFBZTtTQUNqQixDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxrREFBa0Q7SUFDMUMsd0JBQXdCLENBQUMsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsR0FBWTtRQUN6RSxPQUFPO1lBQ0gsT0FBTyxFQUFFLFVBQVU7WUFDbkIsUUFBUTtZQUNSLEdBQUcsQ0FBQyxHQUFHO2dCQUNILENBQUMsQ0FBQztvQkFDSSxJQUFJLEVBQUU7d0JBQ0YsS0FBSyxFQUFFLEdBQUc7d0JBQ1YsSUFBSTtxQkFDUDtpQkFDSjtnQkFDSCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUNOLENBQUM7SUFDbEIsQ0FBQzsrR0EvYlEsZ0JBQWdCO21IQUFoQixnQkFBZ0IsY0FGYixNQUFNOzs0RkFFVCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0FycmF5LCBvbWl0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJyZWFkY3J1bWJMaXN0LCBDb2xsZWN0aW9uUGFnZSwgQ29udGFjdFBvaW50LCBMaXN0SXRlbSwgT3JnYW5pemF0aW9uLCBQb3N0YWxBZGRyZXNzLCBQcm9kdWN0LCBUaGluZywgV2l0aENvbnRleHQgfSBmcm9tICdzY2hlbWEtZHRzJztcblxuaW1wb3J0IHsgU2NDYXRlZ29yeSB9IGZyb20gJy4uLy4uL2NhdGFsb2cvZHRvL3NjLWNhdGVnb3J5JztcbmltcG9ydCB7IFNjUHJvZHVjdCB9IGZyb20gJy4uLy4uL2NhdGFsb2cvZHRvL3NjLXByb2R1Y3QnO1xuaW1wb3J0IHsgU2NWaXJ0dWFsQ2F0ZWdvcnkgfSBmcm9tICcuLi8uLi9jYXRhbG9nL2R0by9zYy12aXJ0dWFsLWNhdGVnb3J5JztcbmltcG9ydCB7IFNjSUNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vY2F0YWxvZy9pbnRlcmZhY2VzL3NjLWktY2F0ZWdvcnknO1xuaW1wb3J0IHsgU2NJUHJvZHVjdCB9IGZyb20gJy4uLy4uL2NhdGFsb2cvaW50ZXJmYWNlcy9zYy1pLXByb2R1Y3QnO1xuaW1wb3J0IHsgU2NJVmlydHVhbENhdGVnb3J5IH0gZnJvbSAnLi4vLi4vY2F0YWxvZy9pbnRlcmZhY2VzL3NjLWktdmlydHVhbC1jYXRlZ29yeSc7XG5pbXBvcnQgeyBTY0lDb21wYW55QmFzZUluZm8gfSBmcm9tICcuLi8uLi9jb25maWcvc2MtaS1jb21wYW55LWJhc2UtaW5mbyc7XG5pbXBvcnQgeyBTY0lkT3JTbHVnUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3NjLWlkLW9yLXNsdWcucGlwZSc7XG5pbXBvcnQgeyBTY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9zYy1tZWRpYS1pbWFnZS10cmFuc2Zvcm1lci5waXBlJztcbmltcG9ydCB7IFNDX0NPTVBBTllfSU5GTyB9IGZyb20gJy4uLy4uL3Rva2Vucy9zYy1jb21wYW55LWluZm8nO1xuaW1wb3J0IHsgU0NfVVJMUyB9IGZyb20gJy4uLy4uL3Rva2Vucy9zYy11cmxzJztcbmltcG9ydCB7IFNjSUJyZWFkY3J1bWJJdGVtIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zYy1pLWJyZWFkY3J1bWItaXRlbSc7XG5cbi8qKlxuICog0JzQtdGF0LDQvdC40LfQvNGLINCz0LXQvdC10YDQsNGG0LjQuCDRgdGF0LXQvCDQtNCw0L3QvdGL0YUgU2NoZW1hLm9yZy5cbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NoZW1hT3JnRmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICog0JTQsNC90L3Ri9C1INC+INC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21wYW55SW5mbyA9IGluamVjdChTQ19DT01QQU5ZX0lORk8pO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INGB0YHRi9C70L7QuiDQv9GA0LjQu9C+0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybHMgPSBpbmplY3QoU0NfVVJMUyk7XG5cbiAgICAvKipcbiAgICAgKiDQn9Cw0LnQvywg0LLQvtC30LLRgNCw0YnQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCDRgdC40LzQstC+0LvRjNC90L7QtSDQvtCx0L7Qt9C90LDRh9C10L3QuNC1IChzbHVnKSDQuNGB0YXQvtC00Y8g0LjQtyDQvdCw0YHRgtGA0L7QtdC6INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlkT3JTbHVnUGlwZTogU2NJZE9yU2x1Z1BpcGUgPSBpbmplY3QoU2NJZE9yU2x1Z1BpcGUpO1xuXG4gICAgLyoqXG4gICAgICog0J/QsNC50L8g0LTQu9GPINGE0L7RgNC80LjRgNC+0LLQsNC90LjRjyDQv9C+0LvQvdC+0LPQviBVUkkg0LjQt9C+0LHRgNCw0LbQtdC90LjRjyDQvdCwIG1lZGlhINGB0LXRgNCy0LXRgNC1LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZSA9IGluamVjdChTY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUpO1xuXG4gICAgLyoqXG4gICAgICog0JPQtdC90LXRgNC40YDRg9C10YIg0Lgg0LLQvtC30LLRgNCw0YnQsNC10YIg0YHRhdC10LzRgyDQtNCw0L3QvdGL0YUg0LTQu9GPINGD0LrQsNC30LDQvdC90L7Qs9C+INC/0YDQvtC00YPQutGC0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQtS5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFBhdGggVXJsINC/0YPRgtGMINC6INGC0L7QstCw0YDRgy4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YLQvtCy0LDRgNCwINC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqIEBwYXJhbSBpZCDQndC10L7QsdGP0LfQsNGC0LXQu9GM0L3Ri9C5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGB0YPRidC90L7RgdGC0Lgg0LTQu9GPINC/0L7Qu9GPIGBAaWRgINCyIEpTT04tTEQuXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlRm9yUHJvZHVjdEl0ZW0ocHJvZHVjdDogU2NJUHJvZHVjdCwgcHJvZHVjdFBhdGg6IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBXaXRoQ29udGV4dDxQcm9kdWN0PiB7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RVcmwgPSBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke3Byb2R1Y3RQYXRoLnJlcGxhY2UoJzppZCcsIHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShwcm9kdWN0KS50b1N0cmluZygpKX1gO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMubWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZS50cmFuc2Zvcm0oKHByb2R1Y3QgYXMgU2NQcm9kdWN0KT8uZ2V0SW1hZ2VQcmV2aWV3Py4oKSA/PyBwcm9kdWN0LmltYWdlLCB0cnVlKTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBwcm9kdWN0LnByb3BlcnRpZXM/LmRlc2NyaXB0aW9uO1xuICAgICAgICBjb25zdCBwcmljZVZhbGlkVW50aWwgPSB0aGlzLm5vcm1hbGl6ZVByaWNlVmFsaWRVbnRpbChwcm9kdWN0LmRpc2NvdW50Py5leHBpcmVkQXQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQGNvbnRleHQnOiAnaHR0cHM6Ly9zY2hlbWEub3JnJyxcbiAgICAgICAgICAgICdAdHlwZSc6ICdQcm9kdWN0JyxcbiAgICAgICAgICAgIC4uLihpZCAmJiB7ICdAaWQnOiBpZCB9KSxcbiAgICAgICAgICAgIG5hbWU6IHByb2R1Y3QubmFtZSxcbiAgICAgICAgICAgIC4uLihpbWFnZSAmJiB7IGltYWdlIH0pLFxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgICBtcG46IHByb2R1Y3QuY29kZSxcbiAgICAgICAgICAgIHVybDogcHJvZHVjdFVybCxcbiAgICAgICAgICAgIG9mZmVyczoge1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdPZmZlcicsXG4gICAgICAgICAgICAgICAgcHJpY2VDdXJyZW5jeTogJ1JVQicsXG4gICAgICAgICAgICAgICAgLi4uKHByaWNlVmFsaWRVbnRpbCAmJiB7IHByaWNlVmFsaWRVbnRpbCB9KSxcbiAgICAgICAgICAgICAgICBwcmljZTogcHJvZHVjdC5jb3N0UnViLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eTogdGhpcy5nZXRBdmFpbGFiaWxpdHkocHJvZHVjdCksXG4gICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbjogJ2h0dHBzOi8vc2NoZW1hLm9yZy9OZXdDb25kaXRpb24nLFxuICAgICAgICAgICAgICAgIHNlbGxlcjoge1xuICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnT3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXJsOiBwcm9kdWN0VXJsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBXaXRoQ29udGV4dDxQcm9kdWN0PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQk9C10L3QtdGA0LjRgNGD0LXRgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDRgdGF0LXQvNGDINC00LDQvdC90YvRhSDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtCz0L4g0L/RgNC+0LTRg9C60YLQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSDQlNCw0L3QvdGL0LUg0L4g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0cyDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQsNGFINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlQYXRoIFVybCDQv9GD0YLRjCDQuiDQutCw0YLQtdCz0L7RgNC40Y/QvCDRgtC+0LLQsNGA0L7Qsi4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4INC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0YLQvtCy0LDRgNGDLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRgtC+0LLQsNGA0LAg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICogQHBhcmFtIGJyZWFkY3J1bWJzINCU0LDQvdC90YvQtSDQviDRhdC70LXQsdC90YvRhSDQutGA0L7RiNC60LDRhSDQtNC70Y8g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBpZCDQndC10L7QsdGP0LfQsNGC0LXQu9GM0L3Ri9C5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGB0YPRidC90L7RgdGC0Lgg0LTQu9GPINC/0L7Qu9GPIGBAaWRgINCyIEpTT04tTEQuXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlRm9yQ2F0ZWdvcnlJdGVtKFxuICAgICAgICBjYXRlZ29yeTogU2NJQ2F0ZWdvcnkgfCBTY0lWaXJ0dWFsQ2F0ZWdvcnksXG4gICAgICAgIHByb2R1Y3RzOiBTY0lQcm9kdWN0W10sXG4gICAgICAgIGNhdGVnb3J5UGF0aDogc3RyaW5nLFxuICAgICAgICBwcm9kdWN0UGF0aDogc3RyaW5nLFxuICAgICAgICBicmVhZGNydW1iczogU2NJQnJlYWRjcnVtYkl0ZW1bXSxcbiAgICAgICAgaWQ/OiBzdHJpbmdcbiAgICApOiBXaXRoQ29udGV4dDxDb2xsZWN0aW9uUGFnZT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGNhdGVnb3J5LnNlbz8uZGVzY3JpcHRpb24gPz8gY2F0ZWdvcnkucHJvcGVydGllcz8uZGVzY3JpcHRpb247XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5tZWRpYUltYWdlVHJhbnNmb3JtZXJQaXBlLnRyYW5zZm9ybShjYXRlZ29yeS5pbWFnZSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdAY29udGV4dCc6ICdodHRwczovL3NjaGVtYS5vcmcnLFxuICAgICAgICAgICAgJ0B0eXBlJzogJ0NvbGxlY3Rpb25QYWdlJyxcbiAgICAgICAgICAgIC4uLihpZCAmJiB7ICdAaWQnOiBpZCB9KSxcbiAgICAgICAgICAgIG5hbWU6IGNhdGVnb3J5LnNlbz8udGl0bGUgPz8gY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5LCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgLi4uKGltYWdlICYmIHsgaW1hZ2UgfSksXG4gICAgICAgICAgICAvLyBTRU8g0LTQsNC90L3Ri9C1LlxuICAgICAgICAgICAgLi4uKGNhdGVnb3J5LnNlbz8ua2V5d29yZHMgJiYgeyBrZXl3b3JkczogY2F0ZWdvcnkuc2VvLmtleXdvcmRzIH0pLFxuICAgICAgICAgICAgLy8g0J7RgdC90L7QstC90L7QuSDQutC+0L3RgtC10L3RgiDRgdGC0YDQsNC90LjRhtGLIC0g0YHQv9C40YHQvtC6INGC0L7QstCw0YDQvtCyINC4INC/0L7QtNC60LDRgtC10LPQvtGA0LjQuS5cbiAgICAgICAgICAgIG1haW5FbnRpdHk6IHRoaXMuY3JlYXRlQ2F0ZWdvcnlNYWluRW50aXR5KGNhdGVnb3J5LCBwcm9kdWN0cywgY2F0ZWdvcnlQYXRoLCBwcm9kdWN0UGF0aCksXG4gICAgICAgICAgICAvLyDQndCw0LLQuNCz0LDRhtC40L7QvdC90YvQtSDRhdC70LXQsdC90YvQtSDQutGA0L7RiNC60LggKFNjaGVtYS5vcmc6IGJyZWFkY3J1bWIpLlxuICAgICAgICAgICAgYnJlYWRjcnVtYjogdGhpcy5jcmVhdGVDYXRhbG9nQnJlYWRjcnVtYnNMaXN0KGJyZWFkY3J1bWJzLCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDQvNC10YLQsNC00LDQvdC90YvQtSDQtNC70Y8gU0VPLlxuICAgICAgICAgICAgYWJvdXQ6IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnQ2F0ZWdvcnlDb2RlJyxcbiAgICAgICAgICAgICAgICBjb2RlVmFsdWU6IGNhdGVnb3J5LnNsdWcsXG4gICAgICAgICAgICAgICAgbmFtZTogY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDRgdCw0LnRgtC1LlxuICAgICAgICAgICAgaXNQYXJ0T2Y6IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnV2ViU2l0ZScsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogdGhpcy51cmxzLnNpdGVVcmwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g0KHQstGP0LfQsNC90L3Ri9C1INGB0YLRgNCw0L3QuNGG0YsuXG4gICAgICAgICAgICByZWxhdGVkTGluazogW1xuICAgICAgICAgICAgICAgIGAke3RoaXMudXJscy5zaXRlVXJsfSR7Y2F0ZWdvcnlQYXRoLnJlcGxhY2UoJzppZCcsICcnKX1gLFxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5KSB8fCAhY2F0ZWdvcnkucGFyZW50Q2F0ZWdvcnkgPyBbXSA6IFt0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5LnBhcmVudENhdGVnb3J5LCBjYXRlZ29yeVBhdGgpXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDRgdCy0L7QudGB0YLQstCwINC60LDRgtC10LPQvtGA0LjQuCAo0L3QtSDQuNC30L7QsdGA0LDQttC10L3QuNGPKS5cbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAn0JrQvtC70LjRh9C10YHRgtCy0L4g0YLQvtCy0LDRgNC+0LInLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKHByb2R1Y3RzPy5sZW5ndGggPz8gMCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU2x1ZyDQutCw0YLQtdCz0L7RgNC40LgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuc2x1ZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCBTRU8g0LTQsNC90L3Ri9C1INC10YHQu9C4INC10YHRgtGMLlxuICAgICAgICAgICAgICAgIC4uLihjYXRlZ29yeS5zZW8/LmtleXdvcmRzXG4gICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnUHJvcGVydHlWYWx1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0VPIEtleXdvcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYXRlZ29yeS5zZW8ua2V5d29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICAuLi4oY2F0ZWdvcnkuc2VvPy50aXRsZVxuICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NFTyBUaXRsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuc2VvLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9IGFzIFdpdGhDb250ZXh0PENvbGxlY3Rpb25QYWdlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQk9C10L3QtdGA0LjRgNGD0LXRgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDRgdGF0LXQvNGDINC00LDQvdC90YvRhSBPbmxpbmVTdG9yZSDQvdCwINC+0YHQvdC+0LLQtSDQtNCw0L3QvdGL0YUg0LrQvtC80L/QsNC90LjQuCDQuNC3INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9mdW5jdGlvbi1yZXR1cm4tdHlwZVxuICAgIHB1YmxpYyBnZW5lcmF0ZUZvck9yZ2FuaXphdGlvbigpOiBXaXRoQ29udGV4dDxPcmdhbml6YXRpb24+IHtcbiAgICAgICAgY29uc3QgcG9zdGFsQWRkcmVzcyA9IHRoaXMuY3JlYXRlUG9zdGFsQWRkcmVzcyh0aGlzLmNvbXBhbnlJbmZvLmFkZHJlc3MpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQGNvbnRleHQnOiAnaHR0cHM6Ly9zY2hlbWEub3JnJyxcbiAgICAgICAgICAgICdAdHlwZSc6ICdPbmxpbmVTdG9yZScsXG4gICAgICAgICAgICAnQGlkJzogYCR7dGhpcy51cmxzLnNpdGVVcmx9I29yZ2FuaXphdGlvbmAsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLmNvbXBhbnlJbmZvLm5hbWUsXG4gICAgICAgICAgICBsZWdhbE5hbWU6IHRoaXMuY29tcGFueUluZm8ubmFtZSxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmxzLnNpdGVVcmwsXG4gICAgICAgICAgICBsb2dvOiB0aGlzLnVybHMubG9nb1VybCxcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLnVybHMubG9nb1VybCxcbiAgICAgICAgICAgIGVtYWlsOiB0aGlzLmNvbXBhbnlJbmZvLm1haWwsXG4gICAgICAgICAgICB0ZWxlcGhvbmU6IHRoaXMuY29tcGFueUluZm8ucGhvbmUsXG4gICAgICAgICAgICAuLi4ocG9zdGFsQWRkcmVzcyAmJiB7IGFkZHJlc3M6IHBvc3RhbEFkZHJlc3MgfSksXG4gICAgICAgICAgICBsZWdhbEFkZHJlc3M6IHRoaXMuY3JlYXRlUG9zdGFsQWRkcmVzcyh7IHN0cmVldEFkZHJlc3M6IHRoaXMuY29tcGFueUluZm8ubGVnYWxBZGRyZXNzIH0gYXMgU2NJQ29tcGFueUJhc2VJbmZvWydhZGRyZXNzJ10pLFxuICAgICAgICAgICAgLy8gVE9ETzog0J/QtdGA0LXRh9C40YHQu9C40YLRjCDQstGB0LUg0YDQvtC30L3QuNGH0L3Ri9C1INC80LDQs9Cw0LfQuNC90YsuXG4gICAgICAgICAgICAvLyBoYXNQT1M6IFtdLFxuICAgICAgICAgICAgdGF4SUQ6IHRoaXMuY29tcGFueUluZm8uaW5uLFxuICAgICAgICAgICAgaWRlbnRpZmllcjoge1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdQcm9wZXJ0eVZhbHVlJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUlEOiAnT0dSTicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY29tcGFueUluZm8ub2dybixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWN0UG9pbnQ6IHRoaXMuY3JlYXRlT3JnYW5pemF0aW9uQ29udGFjdFBvaW50cygpLFxuICAgICAgICAgICAgLi4uKHRoaXMuY29tcGFueUluZm8ud2FyZWhvdXNlQWRkcmVzcy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogdGhpcy5jb21wYW55SW5mby53YXJlaG91c2VBZGRyZXNzLm1hcCgod2FyZWhvdXNlQWRkcmVzcykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1BsYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYCR7dGhpcy5jb21wYW55SW5mby5uYW1lfSDigJQg0YHQutC70LDQtCDRgdCw0LzQvtCy0YvQstC+0LfQsGAsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHdhcmVob3VzZUFkZHJlc3MsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0gYXMgV2l0aENvbnRleHQ8T3JnYW5pemF0aW9uPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YrQtdC00LjQvdGP0LXRgiDQvdC10YHQutC+0LvRjNC60L4gSlNPTi1MRCDRgdGD0YnQvdC+0YHRgtC10Lkg0LIg0L7QtNC40L0g0LTQvtC60YPQvNC10L3RgiDRgSBgQGdyYXBoYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhINCc0LDRgdGB0LjQsiBKU09OLUxEINGB0YPRidC90L7RgdGC0LXQuSDQtNC70Y8g0L7QsdGK0LXQtNC40L3QtdC90LjRjy5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyxzb25hcmpzL2Z1bmN0aW9uLXJldHVybi10eXBlXG4gICAgcHVibGljIG1lcmdlKGRhdGE6IEFycmF5PFdpdGhDb250ZXh0PFRoaW5nPj4pOiBXaXRoQ29udGV4dDxUaGluZz4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0Bjb250ZXh0JzogJ2h0dHBzOi8vc2NoZW1hLm9yZycsXG4gICAgICAgICAgICAnQGdyYXBoJzogZGF0YS5tYXAoKGl0ZW0pID0+IG9taXQoaXRlbSwgJ0Bjb250ZXh0JykpLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgV2l0aENvbnRleHQ8VGhpbmc+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCk0L7RgNC80LjRgNGD0LXRgiBQb3N0YWxBZGRyZXNzINC40Lcg0YHRgtGA0YPQutGC0YPRgNC40YDQvtCy0LDQvdC90L7Qs9C+INCw0LTRgNC10YHQsCDQutC+0LzQv9Cw0L3QuNC4LlxuICAgICAqXG4gICAgICogQHBhcmFtIGFkZHJlc3Mg0KHRgtGA0YPQutGC0YPRgNC40YDQvtCy0LDQvdC90YvQuSDQsNC00YDQtdGBINC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIGNyZWF0ZVBvc3RhbEFkZHJlc3MoYWRkcmVzczogU2NJQ29tcGFueUJhc2VJbmZvWydhZGRyZXNzJ10pOiBQb3N0YWxBZGRyZXNzIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgc3RyZWV0QWRkcmVzcyA9IFthZGRyZXNzLnN0cmVldEFkZHJlc3MsIGFkZHJlc3MuZXh0ZW5kZWRBZGRyZXNzXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcblxuICAgICAgICBpZiAoIXN0cmVldEFkZHJlc3MgJiYgIWFkZHJlc3MubG9jYWxpdHkgJiYgIWFkZHJlc3MucmVnaW9uICYmICFhZGRyZXNzLnBvc3RhbENvZGUgJiYgIWFkZHJlc3MuY291bnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQHR5cGUnOiAnUG9zdGFsQWRkcmVzcycsXG4gICAgICAgICAgICAuLi4oc3RyZWV0QWRkcmVzcyAmJiB7IHN0cmVldEFkZHJlc3MgfSksXG4gICAgICAgICAgICAuLi4oYWRkcmVzcy5sb2NhbGl0eSAmJiB7IGFkZHJlc3NMb2NhbGl0eTogYWRkcmVzcy5sb2NhbGl0eSB9KSxcbiAgICAgICAgICAgIC4uLihhZGRyZXNzLnJlZ2lvbiAmJiB7IGFkZHJlc3NSZWdpb246IGFkZHJlc3MucmVnaW9uIH0pLFxuICAgICAgICAgICAgLi4uKGFkZHJlc3MucG9zdGFsQ29kZSAmJiB7IHBvc3RhbENvZGU6IGFkZHJlc3MucG9zdGFsQ29kZSB9KSxcbiAgICAgICAgICAgIC4uLihhZGRyZXNzLmNvdW50cnkgJiYgeyBhZGRyZXNzQ291bnRyeTogYWRkcmVzcy5jb3VudHJ5IH0pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCk0L7RgNC80LjRgNGD0LXRgiDRgdC/0LjRgdC+0LogQ29udGFjdFBvaW50INC00LvRjyBPcmdhbml6YXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVPcmdhbml6YXRpb25Db250YWN0UG9pbnRzKCk6IENvbnRhY3RQb2ludFtdIHtcbiAgICAgICAgY29uc3QgY29udGFjdFBvaW50czogQ29udGFjdFBvaW50W10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgJ0B0eXBlJzogJ0NvbnRhY3RQb2ludCcsXG4gICAgICAgICAgICAgICAgY29udGFjdFR5cGU6ICdjdXN0b21lciBzZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICB0ZWxlcGhvbmU6IHRoaXMuY29tcGFueUluZm8ucGhvbmUsXG4gICAgICAgICAgICAgICAgZW1haWw6IHRoaXMuY29tcGFueUluZm8ubWFpbCxcbiAgICAgICAgICAgICAgICBhcmVhU2VydmVkOiAnUlUnLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlOiAnUnVzc2lhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXBhbnlJbmZvLnNlY29uZGFyeVBob25lKSB7XG4gICAgICAgICAgICBjb250YWN0UG9pbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdDb250YWN0UG9pbnQnLFxuICAgICAgICAgICAgICAgIGNvbnRhY3RUeXBlOiAnY3VzdG9tZXIgc2VydmljZScsXG4gICAgICAgICAgICAgICAgdGVsZXBob25lOiB0aGlzLmNvbXBhbnlJbmZvLnNlY29uZGFyeVBob25lLFxuICAgICAgICAgICAgICAgIGFyZWFTZXJ2ZWQ6ICdSVScsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlTGFuZ3VhZ2U6ICdSdXNzaWFuJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGFueUluZm8uaHIpIHtcbiAgICAgICAgICAgIGNvbnRhY3RQb2ludHMucHVzaCh7XG4gICAgICAgICAgICAgICAgJ0B0eXBlJzogJ0NvbnRhY3RQb2ludCcsXG4gICAgICAgICAgICAgICAgY29udGFjdFR5cGU6ICdIUicsXG4gICAgICAgICAgICAgICAgdGVsZXBob25lOiB0aGlzLmNvbXBhbnlJbmZvLmhyLnBob25lLFxuICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLmNvbXBhbnlJbmZvLmhyLm1haWwsXG4gICAgICAgICAgICAgICAgYXJlYVNlcnZlZDogJ1JVJyxcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVMYW5ndWFnZTogJ1J1c3NpYW4nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFjdFBvaW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQndC+0YDQvNCw0LvQuNC30YPQtdGCINC00LDRgtGDINC+0LrQvtC90YfQsNC90LjRjyDRhtC10L3RiyDQsiDRhNC+0YDQvNCw0YIgU2NoZW1hLm9yZyAoWVlZWS1NTS1ERCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwaXJlZEF0INCU0LDRgtCwINC00LvRjyDQvdC+0YDQvNCw0LvQuNC30LDRhtC40LhcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHByaXZhdGUgbm9ybWFsaXplUHJpY2VWYWxpZFVudGlsKGV4cGlyZWRBdD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghZXhwaXJlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IGV4cGlyZWRBdC5zbGljZSgwLCAxMCk7XG5cbiAgICAgICAgcmV0dXJuIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KGRhdGUpID8gZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntC/0YDQtdC00LXQu9GP0LXRgiDQtNC+0YHRgtGD0L/QvdC+0YHRgtGMINGC0L7QstCw0YDQsCDQv9C+INC00LDQvdC90YvQvCDQv9GA0L7QtNGD0LrRgtCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3Qg0JTQsNC90L3Ri9C1INC+INC/0YDQvtC00YPQutGC0LUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIGdldEF2YWlsYWJpbGl0eShwcm9kdWN0OiBTY0lQcm9kdWN0KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHByb2R1Y3Qub25PcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuICdodHRwczovL3NjaGVtYS5vcmcvUHJlT3JkZXInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2R1Y3Quc3RvY2tDb3VudD8ubGVuZ3RoID8gJ2h0dHBzOi8vc2NoZW1hLm9yZy9JblN0b2NrJyA6ICdodHRwczovL3NjaGVtYS5vcmcvT3V0T2ZTdG9jayc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCLCDRj9Cy0LvRj9C10YLRgdGPINC70Lgg0LrQsNGC0LXQs9C+0YDQuNGPINCy0LjRgNGC0YPQsNC70YzQvdC+0LkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnkg0JTQsNC90L3Ri9C1INC+INC60LDRgtC10LPQvtGA0LjQuCDQtNC70Y8g0L/RgNC+0LLQtdGA0LrQuC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHByaXZhdGUgaXNWaXJ0dWFsQ2F0ZWdvcnkoY2F0ZWdvcnk6IFNjSUNhdGVnb3J5IHwgU2NJVmlydHVhbENhdGVnb3J5KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAnY2hpbGRDYXRlZ29yaWVzJyBpbiBjYXRlZ29yeSAmJiAncHJvZHVjdENhdGVnb3JpZXMnIGluIGNhdGVnb3J5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIFVSTCDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtC5INC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSDQlNCw0L3QvdGL0LUg0L4g0LrQsNGC0LXQs9C+0YDQuNC4XG4gICAgICogQHBhcmFtIGNhdGVnb3J5UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0LrQsNGC0LXQs9C+0YDQuNGP0Lwg0YLQvtCy0LDRgNC+0LIuINCSINC/0YPRgtC4INC00L7Qu9C20LXQvSDQv9GA0LjRgdGD0YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvSAnOmlkJywg0L7QsdC+0LfQvdCw0YfQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC60LDRgtC10LPQvtGA0LjQuCDQtNC70Y8g0L/QvtC00YHRgtCw0L3QvtCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5OiBTY0lDYXRlZ29yeSB8IFNjSVZpcnR1YWxDYXRlZ29yeSwgY2F0ZWdvcnlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuaXNWaXJ0dWFsQ2F0ZWdvcnkoY2F0ZWdvcnkpID8gY2F0ZWdvcnkuc2x1ZyA6IHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShjYXRlZ29yeSkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IGNhdGVnb3J5UGF0aC5yZXBsYWNlKCc6aWQnLCBpZCk7XG5cbiAgICAgICAgcmV0dXJuIGAke3RoaXMudXJscy5zaXRlVXJsfSR7cGF0aH1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDRkdGCINGN0LvQtdC80LXQvdGCINGB0L/QuNGB0LrQsCBJdGVtTGlzdCDRgSDQutGA0LDRgtC60LjQvCBQcm9kdWN0INC00LvRjyDRgdGC0YDQsNC90LjRhtGLINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9kdWN0INCU0LDQvdC90YvQtSDQviDQv9GA0L7QtNGD0LrRgtC1LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiDQn9C+0LfQuNGG0LjRjyDQsiDRgdC/0LjRgdC60LUuXG4gICAgICogQHBhcmFtIHByb2R1Y3RQYXRoIFVybCDQv9GD0YLRjCDQuiDRgtC+0LLQsNGA0YMuINCSINC/0YPRgtC4INC00L7Qu9C20LXQvSDQv9GA0LjRgdGD0YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvSAnOmlkJywg0L7QsdC+0LfQvdCw0YfQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGC0L7QstCw0YDQsCDQtNC70Y8g0L/QvtC00YHRgtCw0L3QvtCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVByb2R1Y3RzTGlzdEl0ZW0ocHJvZHVjdDogU2NJUHJvZHVjdCwgcG9zaXRpb246IG51bWJlciwgcHJvZHVjdFBhdGg6IHN0cmluZyk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RVcmwgPSBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke3Byb2R1Y3RQYXRoLnJlcGxhY2UoJzppZCcsIHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShwcm9kdWN0KS50b1N0cmluZygpKX1gO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMubWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZS50cmFuc2Zvcm0oKHByb2R1Y3QgYXMgU2NQcm9kdWN0KT8uZ2V0SW1hZ2VQcmV2aWV3Py4oKSA/PyBwcm9kdWN0LmltYWdlLCB0cnVlKTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBwcm9kdWN0LnNlbz8uZGVzY3JpcHRpb24gPz8gcHJvZHVjdC5wcm9wZXJ0aWVzPy5kZXNjcmlwdGlvbjtcbiAgICAgICAgY29uc3QgcHJpY2VWYWxpZFVudGlsID0gdGhpcy5ub3JtYWxpemVQcmljZVZhbGlkVW50aWwocHJvZHVjdC5kaXNjb3VudD8uZXhwaXJlZEF0KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0B0eXBlJzogJ0xpc3RJdGVtJyxcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdQcm9kdWN0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgICAgICAgICAgICAgdXJsOiBwcm9kdWN0VXJsLFxuICAgICAgICAgICAgICAgIC4uLihpbWFnZSAmJiB7IGltYWdlIH0pLFxuICAgICAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgICAgIG9mZmVyczoge1xuICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnT2ZmZXInLFxuICAgICAgICAgICAgICAgICAgICBwcmljZUN1cnJlbmN5OiAnUlVCJyxcbiAgICAgICAgICAgICAgICAgICAgLi4uKHByaWNlVmFsaWRVbnRpbCAmJiB7IHByaWNlVmFsaWRVbnRpbCB9KSxcbiAgICAgICAgICAgICAgICAgICAgcHJpY2U6IHByb2R1Y3QuY29zdFJ1YixcbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5OiB0aGlzLmdldEF2YWlsYWJpbGl0eShwcm9kdWN0KSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbjogJ2h0dHBzOi8vc2NoZW1hLm9yZy9OZXdDb25kaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBzZWxsZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdAdHlwZSc6ICdPcmdhbml6YXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHByb2R1Y3RVcmwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIgbWFpbkVudGl0eSDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtC5INC60LDRgtC10LPQvtGA0LjQuCDRgtC+0LLQsNGA0L7Qsi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSDQlNCw0L3QvdGL0LUg0L4g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0cyDQlNCw0L3QvdGL0LUg0L4g0YLQvtCy0LDRgNCw0YUg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeVBhdGggVXJsINC/0YPRgtGMINC6INC60LDRgtC10LPQvtGA0LjRj9C8INGC0L7QstCw0YDQvtCyLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQutCw0YLQtdCz0L7RgNC40Lgg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICogQHBhcmFtIHByb2R1Y3RQYXRoIFVybCDQv9GD0YLRjCDQuiDRgtC+0LLQsNGA0YMuINCSINC/0YPRgtC4INC00L7Qu9C20LXQvSDQv9GA0LjRgdGD0YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvSAnOmlkJywg0L7QsdC+0LfQvdCw0YfQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGC0L7QstCw0YDQsCDQtNC70Y8g0L/QvtC00YHRgtCw0L3QvtCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNhdGVnb3J5TWFpbkVudGl0eShjYXRlZ29yeTogU2NJQ2F0ZWdvcnkgfCBTY0lWaXJ0dWFsQ2F0ZWdvcnksIHByb2R1Y3RzOiBTY0lQcm9kdWN0W10sIGNhdGVnb3J5UGF0aDogc3RyaW5nLCBwcm9kdWN0UGF0aDogc3RyaW5nKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgY2hpbGRDYXRlZ29yaWVzID0gdGhpcy5pc1ZpcnR1YWxDYXRlZ29yeShjYXRlZ29yeSlcbiAgICAgICAgICAgID8gWy4uLigoY2F0ZWdvcnkgYXMgU2NWaXJ0dWFsQ2F0ZWdvcnkpLmNoaWxkQ2F0ZWdvcmllcyA/PyBbXSksIC4uLigoY2F0ZWdvcnkgYXMgU2NWaXJ0dWFsQ2F0ZWdvcnkpLnByb2R1Y3RDYXRlZ29yaWVzID8/IFtdKV1cbiAgICAgICAgICAgIDogKChjYXRlZ29yeSBhcyBTY0NhdGVnb3J5KS5jYXRlZ29yaWVzID8/IFtdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0B0eXBlJzogJ0l0ZW1MaXN0JyxcbiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IHByb2R1Y3RzLmxlbmd0aCArIGNoaWxkQ2F0ZWdvcmllcy5sZW5ndGgsXG4gICAgICAgICAgICBpdGVtTGlzdE9yZGVyOiAnaHR0cHM6Ly9zY2hlbWEub3JnL0l0ZW1MaXN0VW5vcmRlcmVkJyxcbiAgICAgICAgICAgIGl0ZW1MaXN0RWxlbWVudDogW1xuICAgICAgICAgICAgICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCDQv9C+0LTQutCw0YLQtdCz0L7RgNC40Lgg0LIg0L3QsNGH0LDQu9C+INGB0L/QuNGB0LrQsC5cbiAgICAgICAgICAgICAgICAuLi5jaGlsZENhdGVnb3JpZXMuc2xpY2UoMCwgNSkubWFwKChzdWJDYXRlZ29yeSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLm1lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUudHJhbnNmb3JtKHN1YkNhdGVnb3J5LmltYWdlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBzdWJDYXRlZ29yeS5zZW8/LmRlc2NyaXB0aW9uID8/IHN1YkNhdGVnb3J5LnByb3BlcnRpZXM/LmRlc2NyaXB0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnTGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnQ29sbGVjdGlvblBhZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN1YkNhdGVnb3J5Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKHN1YkNhdGVnb3J5LCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihpbWFnZSAmJiB7IGltYWdlIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyDQlNC+0LHQsNCy0LvRj9C10Lwg0YLQvtCy0LDRgNGLINC/0L7RgdC70LUg0L/QvtC00LrQsNGC0LXQs9C+0YDQuNC5LlxuICAgICAgICAgICAgICAgIC4uLnByb2R1Y3RzLnNsaWNlKDAsIDEwKS5tYXAoKHByb2R1Y3QsIGluZGV4KSA9PiB0aGlzLmNyZWF0ZVByb2R1Y3RzTGlzdEl0ZW0ocHJvZHVjdCwgY2hpbGRDYXRlZ29yaWVzLmxlbmd0aCArIGluZGV4ICsgMSwgcHJvZHVjdFBhdGgpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQvNCw0YHRgdC40LIgTGlua0RhdGEg0LIgQnJlYWRjcnVtYkxpc3Qg0LTQu9GPINC60LDRgtCw0LvQvtCz0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMg0JzQsNGB0YHQuNCyINGF0LvQtdCx0L3Ri9GFINC60YDQvtGI0LXQui5cbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlQYXRoIFVybCDQv9GD0YLRjCDQuiDQutCw0YLQtdCz0L7RgNC40Y/QvCDRgtC+0LLQsNGA0L7Qsi4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4INC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2F0YWxvZ0JyZWFkY3J1bWJzTGlzdChicmVhZGNydW1iczogU2NJQnJlYWRjcnVtYkl0ZW1bXSwgY2F0ZWdvcnlQYXRoOiBzdHJpbmcpOiBCcmVhZGNydW1iTGlzdCB7XG4gICAgICAgIGNvbnN0IGNhdGFsb2dVcmwgPSBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke2NhdGVnb3J5UGF0aC5yZXBsYWNlKCc6aWQnLCAnJyl9YDtcbiAgICAgICAgY29uc3QgYnJlYWRjcnVtYkl0ZW1zOiBMaXN0SXRlbVtdID0gW1xuICAgICAgICAgICAgLy8g0JLRgdC10LPQtNCwINC00L7QsdCw0LLQu9GP0LXQvCDQs9C70LDQstC90YPRjiDRgdGC0YDQsNC90LjRhtGDLlxuICAgICAgICAgICAgdGhpcy5jcmVhdGVCcmVhZGNydW1iTGlzdEl0ZW0oMSwgJ9CT0LvQsNCy0L3QsNGPJywgdGhpcy51cmxzLnNpdGVVcmwpLFxuICAgICAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INC60LDRgtCw0LvQvtCzLlxuICAgICAgICAgICAgdGhpcy5jcmVhdGVCcmVhZGNydW1iTGlzdEl0ZW0oMiwgJ9Ca0LDRgtCw0LvQvtCzJywgY2F0YWxvZ1VybCksXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INGB0YPRidC10YHRgtCy0YPRjtGJ0LjQtSBicmVhZGNydW1icyDRgSDQutC+0YDRgNC10LrRgtC40YDQvtCy0LrQvtC5INC/0L7Qt9C40YbQuNC5LlxuICAgICAgICBicmVhZGNydW1icy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGlzQXJyYXkoaXRlbS5yb3V0ZXJMaW5rKSA/IGl0ZW0ucm91dGVyTGluay5qb2luKCcvJykgOiBpdGVtLnJvdXRlckxpbms7XG5cbiAgICAgICAgICAgIGJyZWFkY3J1bWJJdGVtcy5wdXNoKHRoaXMuY3JlYXRlQnJlYWRjcnVtYkxpc3RJdGVtKGluZGV4ICsgMywgaXRlbS5sYWJlbCwgbGluayA/IGAke3RoaXMudXJscy5zaXRlVXJsfS8ke2xpbmt9YCA6IHVuZGVmaW5lZCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0B0eXBlJzogJ0JyZWFkY3J1bWJMaXN0JyxcbiAgICAgICAgICAgIGl0ZW1MaXN0T3JkZXI6ICdodHRwczovL3NjaGVtYS5vcmcvSXRlbUxpc3RPcmRlckFzY2VuZGluZycsXG4gICAgICAgICAgICBpdGVtTGlzdEVsZW1lbnQ6IGJyZWFkY3J1bWJJdGVtcyxcbiAgICAgICAgfSBhcyBCcmVhZGNydW1iTGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0ZHRgiDRjdC70LXQvNC10L3RgiBCcmVhZGNydW1iTGlzdCDQsiDRhNC+0YDQvNCw0YLQtSwg0YDQtdC60L7QvNC10L3QtNC+0LLQsNC90L3QvtC8IFNjaGVtYS5vcmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24g0J/QvtC30LjRhtC40Y8g0Y3Qu9C10LzQtdC90YLQsCDQsiDRhtC10L/QvtGH0LrQtS5cbiAgICAgKiBAcGFyYW0gbmFtZSDQndCw0LfQstCw0L3QuNC1INGN0LvQtdC80LXQvdGC0LAuXG4gICAgICogQHBhcmFtIHVybCBVUkwg0Y3Qu9C10LzQtdC90YLQsC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHByaXZhdGUgY3JlYXRlQnJlYWRjcnVtYkxpc3RJdGVtKHBvc2l0aW9uOiBudW1iZXIsIG5hbWU6IHN0cmluZywgdXJsPzogc3RyaW5nKTogTGlzdEl0ZW0ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0B0eXBlJzogJ0xpc3RJdGVtJyxcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgLi4uKHVybFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0BpZCc6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogeyBuYW1lIH0pLFxuICAgICAgICB9IGFzIExpc3RJdGVtO1xuICAgIH1cbn1cbiJdfQ==
|