@snabcentr/client-core 3.5.6 → 3.8.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.
@@ -1,6 +1,7 @@
1
1
  export * from './sc-i-catalog-item';
2
2
  export * from './sc-i-product';
3
3
  export * from './sc-i-category';
4
+ export * from './sc-i-parent-category-redirect';
4
5
  export * from './sc-i-virtual-category';
5
6
  export * from './sc-i-category-product-params';
6
7
  export * from './sc-i-category-products-pagination-params';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Данные о родительской категории для редиректа при недоступности (HTTP 404) товара или категории.
3
+ */
4
+ export interface ScIParentCategoryRedirect {
5
+ /**
6
+ * Идентификатор родительской категории.
7
+ */
8
+ id?: number;
9
+ /**
10
+ * Артикул родительской категории.
11
+ */
12
+ code?: string;
13
+ /**
14
+ * Название родительской категории.
15
+ */
16
+ name?: string;
17
+ /**
18
+ * Символьное обозначение (slug) родительской категории.
19
+ */
20
+ slug?: string;
21
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './sc-catalog-filter.service';
2
+ export * from './sc-catalog-redirect.service';
2
3
  export * from './sc-catalog.service';
3
4
  export * from './sc-favorite.service';
4
5
  export * from './sc-recommendation.service';
@@ -21,6 +21,10 @@ export declare class ScCatalogFilterService {
21
21
  * Кэш фильтров по ключу `categoryIdOrSlug:recursively`.
22
22
  */
23
23
  private readonly filterMap;
24
+ /**
25
+ * Удаляет просроченные записи кэша, чтобы карта не удерживала фильтры неиспользуемых категорий.
26
+ */
27
+ private deleteExpiredCacheItems;
24
28
  /**
25
29
  * Возвращает список доступных фильтров продуктов в категории.
26
30
  *
@@ -0,0 +1,57 @@
1
+ import { Observable } from 'rxjs';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Сервис редиректа на родительскую категорию при недоступности (HTTP 404) товара или категории.
5
+ *
6
+ * Запрашивает у бэкенда родительскую категорию недоступной сущности и выполняет редирект:
7
+ * - на сервере (SSR) — выставляет HTTP-статус 302 и заголовок `Location` для корректного редиректа поисковых ботов;
8
+ * - в браузере — выполняет навигацию средствами {@link Router}.
9
+ *
10
+ * Если родительская категория не найдена, поток завершается ошибкой {@link HttpErrorResponse},
11
+ * чтобы вызывающий код отобразил страницу ошибки.
12
+ */
13
+ export declare class ScCatalogRedirectService {
14
+ /**
15
+ * Сервис для работы с каталогом.
16
+ */
17
+ private readonly catalogService;
18
+ /**
19
+ * Сервис маршрутизации.
20
+ */
21
+ private readonly router;
22
+ /**
23
+ * Признак использования идентификатора или slug в маршрутах товаров и категорий.
24
+ */
25
+ private readonly idOrSlug;
26
+ /**
27
+ * Признак, что текущий скрипт исполняется на сервере.
28
+ */
29
+ private readonly isServer;
30
+ /**
31
+ * Данные об ответе на запрос (доступны только на сервере при SSR).
32
+ */
33
+ private readonly response;
34
+ /**
35
+ * Выполняет редирект на родительскую категорию недоступной категории.
36
+ *
37
+ * @param categoryIdOrSlug Идентификатор или slug недоступной категории.
38
+ * @returns Поток, завершающийся после редиректа. Эмитит ошибку {@link HttpErrorResponse}, если родительская категория не найдена.
39
+ */
40
+ redirectToCategoryParent$(categoryIdOrSlug: number | string): Observable<never>;
41
+ /**
42
+ * Выполняет редирект на родительскую категорию недоступного товара.
43
+ *
44
+ * @param productIdOrSlug Идентификатор или slug недоступного товара.
45
+ * @returns Поток, завершающийся после редиректа. Эмитит ошибку {@link HttpErrorResponse}, если родительская категория не найдена.
46
+ */
47
+ redirectToProductParent$(productIdOrSlug: number | string): Observable<never>;
48
+ /**
49
+ * Выполняет редирект на полученную родительскую категорию.
50
+ *
51
+ * @param parentCategory$ Поток с данными родительской категории.
52
+ * @returns Поток, завершающийся после редиректа. Эмитит ошибку {@link HttpErrorResponse} с кодом 404, если родительская категория не найдена.
53
+ */
54
+ private redirectToParentCategory$;
55
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScCatalogRedirectService, never>;
56
+ static ɵprov: i0.ɵɵInjectableDeclaration<ScCatalogRedirectService>;
57
+ }
@@ -14,6 +14,7 @@ import { ScMimeTypes } from '../enums/sc-mime-types';
14
14
  import { ScICategory } from '../interfaces/sc-i-category';
15
15
  import { ScICategoryProductParams } from '../interfaces/sc-i-category-product-params';
16
16
  import { ScICategoryProductPaginationParams } from '../interfaces/sc-i-category-products-pagination-params';
17
+ import { ScIParentCategoryRedirect } from '../interfaces/sc-i-parent-category-redirect';
17
18
  import { ScPriceHistory } from '../types/sc-price-history';
18
19
  import * as i0 from "@angular/core";
19
20
  /**
@@ -72,6 +73,10 @@ export declare class ScCatalogService {
72
73
  * Сервис информации о пользователе.
73
74
  */
74
75
  private readonly userService;
76
+ /**
77
+ * Ссылка на жизненный цикл сервиса.
78
+ */
79
+ private readonly destroyRef;
75
80
  /**
76
81
  * {@link Observable} изменения списка товаров со скидкой.
77
82
  */
@@ -95,6 +100,10 @@ export declare class ScCatalogService {
95
100
  * @param userMetrikaService Сервис для сбора метрик о действиях пользователей.
96
101
  */
97
102
  constructor(http: HttpClient, urls: ScIUrls, uiService: ScUIService, convertersService: ScConvertersService, cacheLifeTime: ScICacheLifetime, userMetrikaService: ScUserMetrikaService);
103
+ /**
104
+ * Очищает данные каталога, привязанные к текущему пользователю.
105
+ */
106
+ private clearCache;
98
107
  /**
99
108
  * Возвращает категорию из коллекции каталога, если её срок жизни не истёк.
100
109
  *
@@ -171,6 +180,20 @@ export declare class ScCatalogService {
171
180
  * @param productIdOrSlug Идентификатор или slug товара/услуги.
172
181
  */
173
182
  getProductData$(productIdOrSlug: number | string): Observable<ScProduct>;
183
+ /**
184
+ * Возвращает данные о родительской категории для редиректа, когда категория недоступна (HTTP 404).
185
+ * Если у категории нет нескрытой родительской категории, возвращается пустой объект.
186
+ *
187
+ * @param categoryIdOrSlug Идентификатор или slug недоступной категории.
188
+ */
189
+ getCategoryParentCategory$(categoryIdOrSlug: number | string): Observable<ScIParentCategoryRedirect>;
190
+ /**
191
+ * Возвращает данные о родительской категории для редиректа, когда товар недоступен (HTTP 404).
192
+ * Если у товара нет нескрытой родительской категории, возвращается пустой объект.
193
+ *
194
+ * @param productIdOrSlug Идентификатор или slug недоступного товара.
195
+ */
196
+ getProductParentCategory$(productIdOrSlug: number | string): Observable<ScIParentCategoryRedirect>;
174
197
  getProductDataCached$(productIdOrSlug: number | string): Observable<ScProduct | null>;
175
198
  /**
176
199
  * Создаёт запрос на получение генерируемого файла прайс-листа в формате {@link Blob}, и выгружает пользователю в браузер.
@@ -29,10 +29,26 @@ export declare class ScRecommendationService {
29
29
  * Сервис для работы с корзиной.
30
30
  */
31
31
  private readonly cartService;
32
+ /**
33
+ * Ссылка на жизненный цикл сервиса.
34
+ */
35
+ private readonly destroyRef;
32
36
  /**
33
37
  * Инициализирует экземпляр класса {@link ScRecommendationService}.
34
38
  */
35
39
  constructor();
40
+ /**
41
+ * Очищает кэшированные рекомендации.
42
+ */
43
+ private clearCache;
44
+ /**
45
+ * Удаляет просроченные записи кэша, чтобы карты не росли бесконечно при смене ключей.
46
+ */
47
+ private deleteExpiredCategoryCacheItems;
48
+ /**
49
+ * Удаляет просроченные записи кэша товаров, чтобы карты не росли бесконечно при смене ключей.
50
+ */
51
+ private deleteExpiredProductCacheItems;
36
52
  /**
37
53
  * Создает запрос на получение списка рекомендованных товаров для категории.
38
54
  *
@@ -1,6 +1,7 @@
1
1
  export * from './sc-i-catalog-item';
2
2
  export * from './sc-i-product';
3
3
  export * from './sc-i-category';
4
+ export * from './sc-i-parent-category-redirect';
4
5
  export * from './sc-i-virtual-category';
5
6
  export * from './sc-i-category-product-params';
6
7
  export * from './sc-i-category-products-pagination-params';
@@ -11,4 +12,4 @@ export * from './sc-i-toggle-filter';
11
12
  export * from './sc-property-filters';
12
13
  export * from './sc-i-base-catalog-filter';
13
14
  export * from './sc-t-product-sort-field';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NhdGFsb2cvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zYy1pLWNhdGFsb2ctaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWktcHJvZHVjdCc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWktY2F0ZWdvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1pLXZpcnR1YWwtY2F0ZWdvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1pLWNhdGVnb3J5LXByb2R1Y3QtcGFyYW1zJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1jYXRlZ29yeS1wcm9kdWN0cy1wYWdpbmF0aW9uLXBhcmFtcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWNhdGFsb2ctZmlsdGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1jaGVja2JveC1maWx0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1pLXJhbmdlLWZpbHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3NjLWktdG9nZ2xlLWZpbHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3NjLXByb3BlcnR5LWZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1pLWJhc2UtY2F0YWxvZy1maWx0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zYy10LXByb2R1Y3Qtc29ydC1maWVsZCc7XG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NhdGFsb2cvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NjLWktY2F0YWxvZy1pdGVtJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1wcm9kdWN0JztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1jYXRlZ29yeSc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWktcGFyZW50LWNhdGVnb3J5LXJlZGlyZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS12aXJ0dWFsLWNhdGVnb3J5JztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1jYXRlZ29yeS1wcm9kdWN0LXBhcmFtcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWktY2F0ZWdvcnktcHJvZHVjdHMtcGFnaW5hdGlvbi1wYXJhbXMnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1jYXRhbG9nLWZpbHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3NjLWktY2hlY2tib3gtZmlsdGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1yYW5nZS1maWx0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1pLXRvZ2dsZS1maWx0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1wcm9wZXJ0eS1maWx0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtaS1iYXNlLWNhdGFsb2ctZmlsdGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtdC1wcm9kdWN0LXNvcnQtZmllbGQnO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtaS1wYXJlbnQtY2F0ZWdvcnktcmVkaXJlY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NhdGFsb2cvaW50ZXJmYWNlcy9zYy1pLXBhcmVudC1jYXRlZ29yeS1yZWRpcmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDQlNCw0L3QvdGL0LUg0L4g0YDQvtC00LjRgtC10LvRjNGB0LrQvtC5INC60LDRgtC10LPQvtGA0LjQuCDQtNC70Y8g0YDQtdC00LjRgNC10LrRgtCwINC/0YDQuCDQvdC10LTQvtGB0YLRg9C/0L3QvtGB0YLQuCAoSFRUUCA0MDQpINGC0L7QstCw0YDQsCDQuNC70Lgg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjSVBhcmVudENhdGVnb3J5UmVkaXJlY3Qge1xuICAgIC8qKlxuICAgICAqINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGA0L7QtNC40YLQtdC70YzRgdC60L7QuSDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICovXG4gICAgaWQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiDQkNGA0YLQuNC60YPQuyDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0Lkg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqL1xuICAgIGNvZGU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQndCw0LfQstCw0L3QuNC1INGA0L7QtNC40YLQtdC70YzRgdC60L7QuSDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCh0LjQvNCy0L7Qu9GM0L3QvtC1INC+0LHQvtC30L3QsNGH0LXQvdC40LUgKHNsdWcpINGA0L7QtNC40YLQtdC70YzRgdC60L7QuSDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICovXG4gICAgc2x1Zz86IHN0cmluZztcbn1cbiJdfQ==
@@ -1,5 +1,6 @@
1
1
  export * from './sc-catalog-filter.service';
2
+ export * from './sc-catalog-redirect.service';
2
3
  export * from './sc-catalog.service';
3
4
  export * from './sc-favorite.service';
4
5
  export * from './sc-recommendation.service';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NhdGFsb2cvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw2QkFBNkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc2MtY2F0YWxvZy1maWx0ZXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWNhdGFsb2cuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWZhdm9yaXRlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1yZWNvbW1lbmRhdGlvbi5zZXJ2aWNlJztcbiJdfQ==
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NhdGFsb2cvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zYy1jYXRhbG9nLWZpbHRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtY2F0YWxvZy1yZWRpcmVjdC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtY2F0YWxvZy5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtZmF2b3JpdGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NjLXJlY29tbWVuZGF0aW9uLnNlcnZpY2UnO1xuIl19
@@ -25,6 +25,16 @@ export class ScCatalogFilterService {
25
25
  */
26
26
  this.filterMap = new Map();
27
27
  }
28
+ /**
29
+ * Удаляет просроченные записи кэша, чтобы карта не удерживала фильтры неиспользуемых категорий.
30
+ */
31
+ deleteExpiredCacheItems() {
32
+ this.filterMap.forEach((cachedItem, key) => {
33
+ if (!cachedItem.cachedDataIsActual()) {
34
+ this.filterMap.delete(key);
35
+ }
36
+ });
37
+ }
28
38
  /**
29
39
  * Возвращает список доступных фильтров продуктов в категории.
30
40
  *
@@ -33,6 +43,7 @@ export class ScCatalogFilterService {
33
43
  */
34
44
  getFilters$(categoryIdOrSlug, recursively) {
35
45
  const key = `${categoryIdOrSlug}:${recursively ?? ''}`;
46
+ this.deleteExpiredCacheItems();
36
47
  let cachedItem = this.filterMap.get(key);
37
48
  if (!cachedItem) {
38
49
  let params = new HttpParams();
@@ -59,4 +70,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
59
70
  providedIn: 'root',
60
71
  }]
61
72
  }] });
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY2F0YWxvZy9zZXJ2aWNlcy9zYy1jYXRhbG9nLWZpbHRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFDQUFxQyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBR3pEOztHQUVHO0FBSUgsTUFBTSxPQUFPLHNCQUFzQjtJQUhuQztRQUlJOztXQUVHO1FBQ2MsU0FBSSxHQUFZLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqRDs7V0FFRztRQUNjLFNBQUksR0FBZSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdkQ7O1dBRUc7UUFDYyxrQkFBYSxHQUFxQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU3RTs7V0FFRztRQUNjLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBMkMsQ0FBQztLQW9DbkY7SUFsQ0c7Ozs7O09BS0c7SUFDSSxXQUFXLENBQUMsZ0JBQWlDLEVBQUUsV0FBcUI7UUFDdkUsTUFBTSxHQUFHLEdBQUcsR0FBRyxnQkFBZ0IsSUFBSSxXQUFXLElBQUksRUFBRSxFQUFFLENBQUM7UUFDdkQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2QsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUU5QixJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFFRCxVQUFVLEdBQUcsSUFBSSxZQUFZLENBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBb0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sdUJBQXVCLGdCQUFnQixVQUFVLEVBQUU7Z0JBQ25HLE1BQU07Z0JBQ04sT0FBTyxFQUFFLHFDQUFxQzthQUNqRCxDQUFDLENBQ0wsQ0FBQztZQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDbkMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDNUIsQ0FBQzsrR0F0RFEsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FGbkIsTUFBTTs7NEZBRVQsc0JBQXNCO2tCQUhsQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2NJQ2FjaGVMaWZldGltZSwgU2NJVXJscyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBTQ19DQUNIRV9MSUZFVElNRSwgU0NfSVNfSElEREVOX0VSUk9SX0FMRVJUX0hUVFBfQ09OVEVYVCwgU0NfVVJMUyB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XG5pbXBvcnQgeyBTY0NhY2hlZEl0ZW0gfSBmcm9tICcuLi9jbGFzc2VzL3NjLWNhY2hlZC1pdGVtJztcbmltcG9ydCB7IFNjQ2F0YWxvZ0ZpbHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2MtY2F0YWxvZy1maWx0ZXInO1xuXG4vKipcbiAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINGE0LjQu9GM0YLRgNCw0LzQuCDQutCw0YLQsNC70L7Qs9CwLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTY0NhdGFsb2dGaWx0ZXJTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBBUEkgVVJMINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LrQsNGC0LDQu9C+0LPQvtC8LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsczogU2NJVXJscyA9IGluamVjdChTQ19VUkxTKTtcblxuICAgIC8qKlxuICAgICAqIEhUVFAg0LrQu9C40LXQvdGCINC00LvRjyDQstGL0L/QvtC70L3QtdC90LjRjyDQt9Cw0L/RgNC+0YHQvtCyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCA9IGluamVjdChIdHRwQ2xpZW50KTtcblxuICAgIC8qKlxuICAgICAqINCS0YDQtdC80Y8g0LbQuNC30L3QuCDQutGN0YjQsCDRhNC40LvRjNGC0YDQvtCyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVMaWZlVGltZTogU2NJQ2FjaGVMaWZldGltZSA9IGluamVjdChTQ19DQUNIRV9MSUZFVElNRSk7XG5cbiAgICAvKipcbiAgICAgKiDQmtGN0Ygg0YTQuNC70YzRgtGA0L7QsiDQv9C+INC60LvRjtGH0YMgYGNhdGVnb3J5SWRPclNsdWc6cmVjdXJzaXZlbHlgLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyTWFwID0gbmV3IE1hcDxzdHJpbmcsIFNjQ2FjaGVkSXRlbTxTY0NhdGFsb2dGaWx0ZXJbXT4+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgdC/0LjRgdC+0Log0LTQvtGB0YLRg9C/0L3Ri9GFINGE0LjQu9GM0YLRgNC+0LIg0L/RgNC+0LTRg9C60YLQvtCyINCyINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeUlkT3JTbHVnINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCBzbHVnINC60LDRgtC10LPQvtGA0LjQuCDRgtC+0LLQsNGA0L7Qsi5cbiAgICAgKiBAcGFyYW0gcmVjdXJzaXZlbHkg0J/RgNC40LfQvdCw0Log0YLQvtCz0L4sINGH0YLQviDQvdC10L7QsdGF0L7QtNC40LzQviDQstC10YDQvdGD0YLRjCDRhNC40LvRjNGC0YDRiyDRgSDRg9GH0LXRgtC+0Lwg0LLQu9C+0LbQtdC90L3Ri9GFINC60LDRgtC10LPQvtGA0LjQuS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVycyQoY2F0ZWdvcnlJZE9yU2x1Zzogc3RyaW5nIHwgbnVtYmVyLCByZWN1cnNpdmVseT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFNjQ2F0YWxvZ0ZpbHRlcltdIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtjYXRlZ29yeUlkT3JTbHVnfToke3JlY3Vyc2l2ZWx5ID8/ICcnfWA7XG4gICAgICAgIGxldCBjYWNoZWRJdGVtID0gdGhpcy5maWx0ZXJNYXAuZ2V0KGtleSk7XG5cbiAgICAgICAgaWYgKCFjYWNoZWRJdGVtKSB7XG4gICAgICAgICAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcblxuICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdyZWN1cnNpdmVseScsIFN0cmluZyhyZWN1cnNpdmVseSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYWNoZWRJdGVtID0gbmV3IFNjQ2FjaGVkSXRlbTxTY0NhdGFsb2dGaWx0ZXJbXT4oXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZUxpZmVUaW1lLmNhdGVnb3J5RGF0YSxcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAuZ2V0PFNjQ2F0YWxvZ0ZpbHRlcltdPihgJHt0aGlzLnVybHMuYXBpVXJsfS9jYXRhbG9nL2NhdGVnb3JpZXMvJHtjYXRlZ29yeUlkT3JTbHVnfS9maWx0ZXJzYCwge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IFNDX0lTX0hJRERFTl9FUlJPUl9BTEVSVF9IVFRQX0NPTlRFWFQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyTWFwLnNldChrZXksIGNhY2hlZEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjYWNoZWRJdGVtLmNhY2hlZERhdGFJc0FjdHVhbCgpKSB7XG4gICAgICAgICAgICBjYWNoZWRJdGVtLnVwZGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlZEl0ZW0uaXRlbSQ7XG4gICAgfVxufVxuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY2F0YWxvZy9zZXJ2aWNlcy9zYy1jYXRhbG9nLWZpbHRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFDQUFxQyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBR3pEOztHQUVHO0FBSUgsTUFBTSxPQUFPLHNCQUFzQjtJQUhuQztRQUlJOztXQUVHO1FBQ2MsU0FBSSxHQUFZLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqRDs7V0FFRztRQUNjLFNBQUksR0FBZSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdkQ7O1dBRUc7UUFDYyxrQkFBYSxHQUFxQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU3RTs7V0FFRztRQUNjLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBMkMsQ0FBQztLQWtEbkY7SUFoREc7O09BRUc7SUFDSyx1QkFBdUI7UUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFdBQVcsQ0FBQyxnQkFBaUMsRUFBRSxXQUFxQjtRQUN2RSxNQUFNLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixJQUFJLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUV2RCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUUvQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDZCxJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBRTlCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUVELFVBQVUsR0FBRyxJQUFJLFlBQVksQ0FDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFvQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSx1QkFBdUIsZ0JBQWdCLFVBQVUsRUFBRTtnQkFDbkcsTUFBTTtnQkFDTixPQUFPLEVBQUUscUNBQXFDO2FBQ2pELENBQUMsQ0FDTCxDQUFDO1lBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztZQUNuQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztJQUM1QixDQUFDOytHQXBFUSxzQkFBc0I7bUhBQXRCLHNCQUFzQixjQUZuQixNQUFNOzs0RkFFVCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY0lDYWNoZUxpZmV0aW1lLCBTY0lVcmxzIH0gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7IFNDX0NBQ0hFX0xJRkVUSU1FLCBTQ19JU19ISURERU5fRVJST1JfQUxFUlRfSFRUUF9DT05URVhULCBTQ19VUkxTIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcbmltcG9ydCB7IFNjQ2FjaGVkSXRlbSB9IGZyb20gJy4uL2NsYXNzZXMvc2MtY2FjaGVkLWl0ZW0nO1xuaW1wb3J0IHsgU2NDYXRhbG9nRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zYy1jYXRhbG9nLWZpbHRlcic7XG5cbi8qKlxuICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0YTQuNC70YzRgtGA0LDQvNC4INC60LDRgtCw0LvQvtCz0LAuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNjQ2F0YWxvZ0ZpbHRlclNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIEFQSSBVUkwg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQutCw0YLQsNC70L7Qs9C+0LwuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB1cmxzOiBTY0lVcmxzID0gaW5qZWN0KFNDX1VSTFMpO1xuXG4gICAgLyoqXG4gICAgICogSFRUUCDQutC70LjQtdC90YIg0LTQu9GPINCy0YvQv9C+0LvQvdC10L3QuNGPINC30LDQv9GA0L7RgdC+0LIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50ID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuXG4gICAgLyoqXG4gICAgICog0JLRgNC10LzRjyDQttC40LfQvdC4INC60Y3RiNCwINGE0LjQu9GM0YLRgNC+0LIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWNoZUxpZmVUaW1lOiBTY0lDYWNoZUxpZmV0aW1lID0gaW5qZWN0KFNDX0NBQ0hFX0xJRkVUSU1FKTtcblxuICAgIC8qKlxuICAgICAqINCa0Y3RiCDRhNC40LvRjNGC0YDQvtCyINC/0L4g0LrQu9GO0YfRgyBgY2F0ZWdvcnlJZE9yU2x1ZzpyZWN1cnNpdmVseWAuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJNYXAgPSBuZXcgTWFwPHN0cmluZywgU2NDYWNoZWRJdGVtPFNjQ2F0YWxvZ0ZpbHRlcltdPj4oKTtcblxuICAgIC8qKlxuICAgICAqINCj0LTQsNC70Y/QtdGCINC/0YDQvtGB0YDQvtGH0LXQvdC90YvQtSDQt9Cw0L/QuNGB0Lgg0LrRjdGI0LAsINGH0YLQvtCx0Ysg0LrQsNGA0YLQsCDQvdC1INGD0LTQtdGA0LbQuNCy0LDQu9CwINGE0LjQu9GM0YLRgNGLINC90LXQuNGB0L/QvtC70YzQt9GD0LXQvNGL0YUg0LrQsNGC0LXQs9C+0YDQuNC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgZGVsZXRlRXhwaXJlZENhY2hlSXRlbXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyTWFwLmZvckVhY2goKGNhY2hlZEl0ZW0sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYWNoZWRJdGVtLmNhY2hlZERhdGFJc0FjdHVhbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJNYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0L/QuNGB0L7QuiDQtNC+0YHRgtGD0L/QvdGL0YUg0YTQuNC70YzRgtGA0L7QsiDQv9GA0L7QtNGD0LrRgtC+0LIg0LIg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhdGVnb3J5SWRPclNsdWcg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LjQu9C4IHNsdWcg0LrQsNGC0LXQs9C+0YDQuNC4INGC0L7QstCw0YDQvtCyLlxuICAgICAqIEBwYXJhbSByZWN1cnNpdmVseSDQn9GA0LjQt9C90LDQuiDRgtC+0LPQviwg0YfRgtC+INC90LXQvtCx0YXQvtC00LjQvNC+INCy0LXRgNC90YPRgtGMINGE0LjQu9GM0YLRgNGLINGBINGD0YfQtdGC0L7QvCDQstC70L7QttC10L3QvdGL0YUg0LrQsNGC0LXQs9C+0YDQuNC5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzJChjYXRlZ29yeUlkT3JTbHVnOiBzdHJpbmcgfCBudW1iZXIsIHJlY3Vyc2l2ZWx5PzogYm9vbGVhbik6IE9ic2VydmFibGU8U2NDYXRhbG9nRmlsdGVyW10gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGAke2NhdGVnb3J5SWRPclNsdWd9OiR7cmVjdXJzaXZlbHkgPz8gJyd9YDtcblxuICAgICAgICB0aGlzLmRlbGV0ZUV4cGlyZWRDYWNoZUl0ZW1zKCk7XG5cbiAgICAgICAgbGV0IGNhY2hlZEl0ZW0gPSB0aGlzLmZpbHRlck1hcC5nZXQoa2V5KTtcblxuICAgICAgICBpZiAoIWNhY2hlZEl0ZW0pIHtcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuXG4gICAgICAgICAgICBpZiAocmVjdXJzaXZlbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3JlY3Vyc2l2ZWx5JywgU3RyaW5nKHJlY3Vyc2l2ZWx5KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhY2hlZEl0ZW0gPSBuZXcgU2NDYWNoZWRJdGVtPFNjQ2F0YWxvZ0ZpbHRlcltdPihcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlTGlmZVRpbWUuY2F0ZWdvcnlEYXRhLFxuICAgICAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8U2NDYXRhbG9nRmlsdGVyW10+KGAke3RoaXMudXJscy5hcGlVcmx9L2NhdGFsb2cvY2F0ZWdvcmllcy8ke2NhdGVnb3J5SWRPclNsdWd9L2ZpbHRlcnNgLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogU0NfSVNfSElEREVOX0VSUk9SX0FMRVJUX0hUVFBfQ09OVEVYVCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5maWx0ZXJNYXAuc2V0KGtleSwgY2FjaGVkSXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNhY2hlZEl0ZW0uY2FjaGVkRGF0YUlzQWN0dWFsKCkpIHtcbiAgICAgICAgICAgIGNhY2hlZEl0ZW0udXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FjaGVkSXRlbS5pdGVtJDtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,94 @@
1
+ import { HttpErrorResponse } from '@angular/common/http';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { Router } from '@angular/router';
4
+ import { tuiIsPresent } from '@taiga-ui/cdk';
5
+ import { EMPTY, from, switchMap, throwError } from 'rxjs';
6
+ import { IS_SERVER, RESPONSE } from '../../providers/ssr.providers';
7
+ import { SC_ID_OR_SLUG_IN_ROUTE } from '../../tokens/sc-id-or-slug-in-route';
8
+ import { ScCatalogService } from './sc-catalog.service';
9
+ import * as i0 from "@angular/core";
10
+ /**
11
+ * Сервис редиректа на родительскую категорию при недоступности (HTTP 404) товара или категории.
12
+ *
13
+ * Запрашивает у бэкенда родительскую категорию недоступной сущности и выполняет редирект:
14
+ * - на сервере (SSR) — выставляет HTTP-статус 302 и заголовок `Location` для корректного редиректа поисковых ботов;
15
+ * - в браузере — выполняет навигацию средствами {@link Router}.
16
+ *
17
+ * Если родительская категория не найдена, поток завершается ошибкой {@link HttpErrorResponse},
18
+ * чтобы вызывающий код отобразил страницу ошибки.
19
+ */
20
+ export class ScCatalogRedirectService {
21
+ constructor() {
22
+ /**
23
+ * Сервис для работы с каталогом.
24
+ */
25
+ this.catalogService = inject(ScCatalogService);
26
+ /**
27
+ * Сервис маршрутизации.
28
+ */
29
+ this.router = inject(Router);
30
+ /**
31
+ * Признак использования идентификатора или slug в маршрутах товаров и категорий.
32
+ */
33
+ this.idOrSlug = inject(SC_ID_OR_SLUG_IN_ROUTE);
34
+ /**
35
+ * Признак, что текущий скрипт исполняется на сервере.
36
+ */
37
+ this.isServer = inject(IS_SERVER);
38
+ /**
39
+ * Данные об ответе на запрос (доступны только на сервере при SSR).
40
+ */
41
+ this.response = inject(RESPONSE, { optional: true });
42
+ }
43
+ /**
44
+ * Выполняет редирект на родительскую категорию недоступной категории.
45
+ *
46
+ * @param categoryIdOrSlug Идентификатор или slug недоступной категории.
47
+ * @returns Поток, завершающийся после редиректа. Эмитит ошибку {@link HttpErrorResponse}, если родительская категория не найдена.
48
+ */
49
+ redirectToCategoryParent$(categoryIdOrSlug) {
50
+ return this.redirectToParentCategory$(this.catalogService.getCategoryParentCategory$(categoryIdOrSlug));
51
+ }
52
+ /**
53
+ * Выполняет редирект на родительскую категорию недоступного товара.
54
+ *
55
+ * @param productIdOrSlug Идентификатор или slug недоступного товара.
56
+ * @returns Поток, завершающийся после редиректа. Эмитит ошибку {@link HttpErrorResponse}, если родительская категория не найдена.
57
+ */
58
+ redirectToProductParent$(productIdOrSlug) {
59
+ return this.redirectToParentCategory$(this.catalogService.getProductParentCategory$(productIdOrSlug));
60
+ }
61
+ /**
62
+ * Выполняет редирект на полученную родительскую категорию.
63
+ *
64
+ * @param parentCategory$ Поток с данными родительской категории.
65
+ * @returns Поток, завершающийся после редиректа. Эмитит ошибку {@link HttpErrorResponse} с кодом 404, если родительская категория не найдена.
66
+ */
67
+ redirectToParentCategory$(parentCategory$) {
68
+ return parentCategory$.pipe(switchMap((parentCategory) => {
69
+ // eslint-disable-next-line security/detect-object-injection
70
+ const target = parentCategory[this.idOrSlug];
71
+ // Родительская категория не найдена — отображаем страницу ошибки.
72
+ if (!tuiIsPresent(target)) {
73
+ return throwError(() => new HttpErrorResponse({ status: 404 }));
74
+ }
75
+ const urlTree = this.router.createUrlTree(['/catalog', target]);
76
+ if (this.isServer) {
77
+ // SSR: выставляем 302 и заголовок Location для корректного редиректа поисковых ботов.
78
+ this.response?.setHeader('Location', this.router.serializeUrl(urlTree));
79
+ this.response?.status(302);
80
+ return EMPTY;
81
+ }
82
+ return from(this.router.navigateByUrl(urlTree, { replaceUrl: true })).pipe(switchMap(() => EMPTY));
83
+ }));
84
+ }
85
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogRedirectService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
86
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogRedirectService, providedIn: 'root' }); }
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogRedirectService, decorators: [{
89
+ type: Injectable,
90
+ args: [{
91
+ providedIn: 'root',
92
+ }]
93
+ }] });
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1yZWRpcmVjdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9jYXRhbG9nL3NlcnZpY2VzL3NjLWNhdGFsb2ctcmVkaXJlY3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBYyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBRXhEOzs7Ozs7Ozs7R0FTRztBQUlILE1BQU0sT0FBTyx3QkFBd0I7SUFIckM7UUFJSTs7V0FFRztRQUNjLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFM0Q7O1dBRUc7UUFDYyxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpDOztXQUVHO1FBQ2MsYUFBUSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTNEOztXQUVHO1FBQ2MsYUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5Qzs7V0FFRztRQUNjLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7S0FxRHBFO0lBbkRHOzs7OztPQUtHO0lBQ0kseUJBQXlCLENBQUMsZ0JBQWlDO1FBQzlELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHdCQUF3QixDQUFDLGVBQWdDO1FBQzVELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUMxRyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx5QkFBeUIsQ0FBQyxlQUFzRDtRQUNwRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQ3ZCLFNBQVMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQ3pCLDREQUE0RDtZQUM1RCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTdDLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksaUJBQWlCLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBRWhFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQixzRkFBc0Y7Z0JBQ3RGLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFM0IsT0FBTyxLQUFLLENBQUM7WUFDakIsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDOytHQTVFUSx3QkFBd0I7bUhBQXhCLHdCQUF3QixjQUZyQixNQUFNOzs0RkFFVCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB0dWlJc1ByZXNlbnQgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IEVNUFRZLCBmcm9tLCBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSVNfU0VSVkVSLCBSRVNQT05TRSB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9zc3IucHJvdmlkZXJzJztcbmltcG9ydCB7IFNDX0lEX09SX1NMVUdfSU5fUk9VVEUgfSBmcm9tICcuLi8uLi90b2tlbnMvc2MtaWQtb3Itc2x1Zy1pbi1yb3V0ZSc7XG5pbXBvcnQgeyBTY0lQYXJlbnRDYXRlZ29yeVJlZGlyZWN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zYy1pLXBhcmVudC1jYXRlZ29yeS1yZWRpcmVjdCc7XG5pbXBvcnQgeyBTY0NhdGFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9zYy1jYXRhbG9nLnNlcnZpY2UnO1xuXG4vKipcbiAqINCh0LXRgNCy0LjRgSDRgNC10LTQuNGA0LXQutGC0LAg0L3QsCDRgNC+0LTQuNGC0LXQu9GM0YHQutGD0Y4g0LrQsNGC0LXQs9C+0YDQuNGOINC/0YDQuCDQvdC10LTQvtGB0YLRg9C/0L3QvtGB0YLQuCAoSFRUUCA0MDQpINGC0L7QstCw0YDQsCDQuNC70Lgg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICpcbiAqINCX0LDQv9GA0LDRiNC40LLQsNC10YIg0YMg0LHRjdC60LXQvdC00LAg0YDQvtC00LjRgtC10LvRjNGB0LrRg9GOINC60LDRgtC10LPQvtGA0LjRjiDQvdC10LTQvtGB0YLRg9C/0L3QvtC5INGB0YPRidC90L7RgdGC0Lgg0Lgg0LLRi9C/0L7Qu9C90Y/QtdGCINGA0LXQtNC40YDQtdC60YI6XG4gKiAtINC90LAg0YHQtdGA0LLQtdGA0LUgKFNTUikg4oCUINCy0YvRgdGC0LDQstC70Y/QtdGCIEhUVFAt0YHRgtCw0YLRg9GBIDMwMiDQuCDQt9Cw0LPQvtC70L7QstC+0LogYExvY2F0aW9uYCDQtNC70Y8g0LrQvtGA0YDQtdC60YLQvdC+0LPQviDRgNC10LTQuNGA0LXQutGC0LAg0L/QvtC40YHQutC+0LLRi9GFINCx0L7RgtC+0LI7XG4gKiAtINCyINCx0YDQsNGD0LfQtdGA0LUg4oCUINCy0YvQv9C+0LvQvdGP0LXRgiDQvdCw0LLQuNCz0LDRhtC40Y4g0YHRgNC10LTRgdGC0LLQsNC80Lgge0BsaW5rIFJvdXRlcn0uXG4gKlxuICog0JXRgdC70Lgg0YDQvtC00LjRgtC10LvRjNGB0LrQsNGPINC60LDRgtC10LPQvtGA0LjRjyDQvdC1INC90LDQudC00LXQvdCwLCDQv9C+0YLQvtC6INC30LDQstC10YDRiNCw0LXRgtGB0Y8g0L7RiNC40LHQutC+0Lkge0BsaW5rIEh0dHBFcnJvclJlc3BvbnNlfSxcbiAqINGH0YLQvtCx0Ysg0LLRi9C30YvQstCw0Y7RidC40Lkg0LrQvtC0INC+0YLQvtCx0YDQsNC30LjQuyDRgdGC0YDQsNC90LjRhtGDINC+0YjQuNCx0LrQuC5cbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NDYXRhbG9nUmVkaXJlY3RTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQutCw0YLQsNC70L7Qs9C+0LwuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nU2VydmljZSA9IGluamVjdChTY0NhdGFsb2dTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQvNCw0YDRiNGA0YPRgtC40LfQsNGG0LjQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0Log0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YDQsCDQuNC70Lggc2x1ZyDQsiDQvNCw0YDRiNGA0YPRgtCw0YUg0YLQvtCy0LDRgNC+0LIg0Lgg0LrQsNGC0LXQs9C+0YDQuNC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWRPclNsdWcgPSBpbmplY3QoU0NfSURfT1JfU0xVR19JTl9ST1VURSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YfRgtC+INGC0LXQutGD0YnQuNC5INGB0LrRgNC40L/RgiDQuNGB0L/QvtC70L3Rj9C10YLRgdGPINC90LAg0YHQtdGA0LLQtdGA0LUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBpc1NlcnZlciA9IGluamVjdChJU19TRVJWRVIpO1xuXG4gICAgLyoqXG4gICAgICog0JTQsNC90L3Ri9C1INC+0LEg0L7RgtCy0LXRgtC1INC90LAg0LfQsNC/0YDQvtGBICjQtNC+0YHRgtGD0L/QvdGLINGC0L7Qu9GM0LrQviDQvdCwINGB0LXRgNCy0LXRgNC1INC/0YDQuCBTU1IpLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzcG9uc2UgPSBpbmplY3QoUkVTUE9OU0UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgICAvKipcbiAgICAgKiDQktGL0L/QvtC70L3Rj9C10YIg0YDQtdC00LjRgNC10LrRgiDQvdCwINGA0L7QtNC40YLQtdC70YzRgdC60YPRjiDQutCw0YLQtdCz0L7RgNC40Y4g0L3QtdC00L7RgdGC0YPQv9C90L7QuSDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlJZE9yU2x1ZyDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQuNC70Lggc2x1ZyDQvdC10LTQvtGB0YLRg9C/0L3QvtC5INC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKiBAcmV0dXJucyDQn9C+0YLQvtC6LCDQt9Cw0LLQtdGA0YjQsNGO0YnQuNC50YHRjyDQv9C+0YHQu9C1INGA0LXQtNC40YDQtdC60YLQsC4g0K3QvNC40YLQuNGCINC+0YjQuNCx0LrRgyB7QGxpbmsgSHR0cEVycm9yUmVzcG9uc2V9LCDQtdGB0LvQuCDRgNC+0LTQuNGC0LXQu9GM0YHQutCw0Y8g0LrQsNGC0LXQs9C+0YDQuNGPINC90LUg0L3QsNC50LTQtdC90LAuXG4gICAgICovXG4gICAgcHVibGljIHJlZGlyZWN0VG9DYXRlZ29yeVBhcmVudCQoY2F0ZWdvcnlJZE9yU2x1ZzogbnVtYmVyIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWRpcmVjdFRvUGFyZW50Q2F0ZWdvcnkkKHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0Q2F0ZWdvcnlQYXJlbnRDYXRlZ29yeSQoY2F0ZWdvcnlJZE9yU2x1ZykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0YvQv9C+0LvQvdGP0LXRgiDRgNC10LTQuNGA0LXQutGCINC90LAg0YDQvtC00LjRgtC10LvRjNGB0LrRg9GOINC60LDRgtC10LPQvtGA0LjRjiDQvdC10LTQvtGB0YLRg9C/0L3QvtCz0L4g0YLQvtCy0LDRgNCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3RJZE9yU2x1ZyDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQuNC70Lggc2x1ZyDQvdC10LTQvtGB0YLRg9C/0L3QvtCz0L4g0YLQvtCy0LDRgNCwLlxuICAgICAqIEByZXR1cm5zINCf0L7RgtC+0LosINC30LDQstC10YDRiNCw0Y7RidC40LnRgdGPINC/0L7RgdC70LUg0YDQtdC00LjRgNC10LrRgtCwLiDQrdC80LjRgtC40YIg0L7RiNC40LHQutGDIHtAbGluayBIdHRwRXJyb3JSZXNwb25zZX0sINC10YHQu9C4INGA0L7QtNC40YLQtdC70YzRgdC60LDRjyDQutCw0YLQtdCz0L7RgNC40Y8g0L3QtSDQvdCw0LnQtNC10L3QsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVkaXJlY3RUb1Byb2R1Y3RQYXJlbnQkKHByb2R1Y3RJZE9yU2x1ZzogbnVtYmVyIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWRpcmVjdFRvUGFyZW50Q2F0ZWdvcnkkKHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0UHJvZHVjdFBhcmVudENhdGVnb3J5JChwcm9kdWN0SWRPclNsdWcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktGL0L/QvtC70L3Rj9C10YIg0YDQtdC00LjRgNC10LrRgiDQvdCwINC/0L7Qu9GD0YfQtdC90L3Rg9GOINGA0L7QtNC40YLQtdC70YzRgdC60YPRjiDQutCw0YLQtdCz0L7RgNC40Y4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyZW50Q2F0ZWdvcnkkINCf0L7RgtC+0Log0YEg0LTQsNC90L3Ri9C80Lgg0YDQvtC00LjRgtC10LvRjNGB0LrQvtC5INC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKiBAcmV0dXJucyDQn9C+0YLQvtC6LCDQt9Cw0LLQtdGA0YjQsNGO0YnQuNC50YHRjyDQv9C+0YHQu9C1INGA0LXQtNC40YDQtdC60YLQsC4g0K3QvNC40YLQuNGCINC+0YjQuNCx0LrRgyB7QGxpbmsgSHR0cEVycm9yUmVzcG9uc2V9INGBINC60L7QtNC+0LwgNDA0LCDQtdGB0LvQuCDRgNC+0LTQuNGC0LXQu9GM0YHQutCw0Y8g0LrQsNGC0LXQs9C+0YDQuNGPINC90LUg0L3QsNC50LTQtdC90LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWRpcmVjdFRvUGFyZW50Q2F0ZWdvcnkkKHBhcmVudENhdGVnb3J5JDogT2JzZXJ2YWJsZTxTY0lQYXJlbnRDYXRlZ29yeVJlZGlyZWN0Pik6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICAgICAgcmV0dXJuIHBhcmVudENhdGVnb3J5JC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChwYXJlbnRDYXRlZ29yeSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHBhcmVudENhdGVnb3J5W3RoaXMuaWRPclNsdWddO1xuXG4gICAgICAgICAgICAgICAgLy8g0KDQvtC00LjRgtC10LvRjNGB0LrQsNGPINC60LDRgtC10LPQvtGA0LjRjyDQvdC1INC90LDQudC00LXQvdCwIOKAlCDQvtGC0L7QsdGA0LDQttCw0LXQvCDRgdGC0YDQsNC90LjRhtGDINC+0YjQuNCx0LrQuC5cbiAgICAgICAgICAgICAgICBpZiAoIXR1aUlzUHJlc2VudCh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7IHN0YXR1czogNDA0IH0pKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbJy9jYXRhbG9nJywgdGFyZ2V0XSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTU1I6INCy0YvRgdGC0LDQstC70Y/QtdC8IDMwMiDQuCDQt9Cw0LPQvtC70L7QstC+0LogTG9jYXRpb24g0LTQu9GPINC60L7RgNGA0LXQutGC0L3QvtCz0L4g0YDQtdC00LjRgNC10LrRgtCwINC/0L7QuNGB0LrQvtCy0YvRhSDQsdC+0YLQvtCyLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlPy5zZXRIZWFkZXIoJ0xvY2F0aW9uJywgdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKHVybFRyZWUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZT8uc3RhdHVzKDMwMik7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodXJsVHJlZSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pKS5waXBlKHN3aXRjaE1hcCgoKSA9PiBFTVBUWSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=