ng-easycommerce 0.0.660-beta.1 → 0.0.661

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +22 -58
  2. package/assets/ec-i18n/en.json +3 -1
  3. package/assets/ec-i18n/es.json +3 -1
  4. package/bundles/ng-easycommerce.umd.js +179 -512
  5. package/bundles/ng-easycommerce.umd.js.map +1 -1
  6. package/bundles/ng-easycommerce.umd.min.js +1 -1
  7. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  8. package/esm2015/lib/core.consts.js +6 -1
  9. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +5 -3
  10. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +8 -5
  11. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +11 -5
  12. package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +14 -450
  13. package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +30 -3
  14. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +1 -2
  15. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +8 -5
  16. package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +1 -3
  17. package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
  18. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +2 -1
  19. package/esm2015/lib/services/cart.service.js +27 -12
  20. package/esm2015/lib/services/currency.service.js +43 -7
  21. package/esm5/lib/core.consts.js +6 -1
  22. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +5 -3
  23. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +8 -5
  24. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +11 -5
  25. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +13 -458
  26. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +48 -3
  27. package/esm5/lib/ec-component/product-ec/product-ec.component.js +1 -2
  28. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +8 -5
  29. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +1 -3
  30. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
  31. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +2 -1
  32. package/esm5/lib/services/cart.service.js +27 -12
  33. package/esm5/lib/services/currency.service.js +43 -7
  34. package/fesm2015/ng-easycommerce.js +157 -499
  35. package/fesm2015/ng-easycommerce.js.map +1 -1
  36. package/fesm5/ng-easycommerce.js +180 -513
  37. package/fesm5/ng-easycommerce.js.map +1 -1
  38. package/lib/core.consts.d.ts +5 -0
  39. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +1 -0
  40. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +1 -0
  41. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +4 -34
  42. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +3 -0
  43. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +1 -0
  44. package/lib/services/cart.service.d.ts +2 -2
  45. package/lib/services/currency.service.d.ts +14 -2
  46. package/ng-easycommerce.metadata.json +1 -1
  47. package/package.json +1 -1
@@ -17,9 +17,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
17
17
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
18
  return c > 3 && r && Object.defineProperty(target, key, r), r;
19
19
  };
20
- var __param = (this && this.__param) || function (paramIndex, decorator) {
21
- return function (target, key) { decorator(target, key, paramIndex); }
22
- };
23
20
  var __read = (this && this.__read) || function (o, n) {
24
21
  var m = typeof Symbol === "function" && o[Symbol.iterator];
25
22
  if (!m) return o;
@@ -40,9 +37,8 @@ var __spread = (this && this.__spread) || function () {
40
37
  for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
41
38
  return ar;
42
39
  };
43
- import { Component, Input, Inject, PLATFORM_ID } from '@angular/core';
44
- import { ActivatedRoute, Router } from '@angular/router';
45
- import { isPlatformBrowser } from '@angular/common';
40
+ import { Component, Input } from '@angular/core';
41
+ import { ActivatedRoute } from '@angular/router';
46
42
  // import { Constants, Filter, OptionsService, Product, ProductsService } from 'ng-easycommerce';
47
43
  import { combineLatest } from 'rxjs';
48
44
  import { ComponentHelper } from '../../classes/component-helper';
@@ -56,7 +52,7 @@ import { ParametersService } from '../../services/parameters.service';
56
52
  import { ProductsService } from '../../services/products/products.service';
57
53
  var CollectionEcComponent = /** @class */ (function (_super) {
58
54
  __extends(CollectionEcComponent, _super);
59
- function CollectionEcComponent(productsService, paramsSrv, activeRoute, optionsService, authService, analyticsService, cartService, consts, filtersService, router, platformId) {
55
+ function CollectionEcComponent(productsService, paramsSrv, activeRoute, optionsService, authService, analyticsService, cartService, consts, filtersService) {
60
56
  var _this = _super.call(this) || this;
61
57
  _this.productsService = productsService;
62
58
  _this.paramsSrv = paramsSrv;
@@ -67,21 +63,12 @@ var CollectionEcComponent = /** @class */ (function (_super) {
67
63
  _this.cartService = cartService;
68
64
  _this.consts = consts;
69
65
  _this.filtersService = filtersService;
70
- _this.router = router;
71
66
  _this.filters = [];
72
67
  _this.filtersConfig = { filters: [] };
73
68
  _this.finished = false;
74
69
  _this.loading = true;
75
70
  _this.breadcrumb = [];
76
71
  _this.isCollection = true;
77
- _this.usingCachedProducts = false;
78
- _this.allCachedProducts = [];
79
- _this.subscriptionsConfigured = false;
80
- _this.isScrolling = false;
81
- _this.pendingScrollPosition = null;
82
- _this.expectedProductCount = 0;
83
- _this.filtersFromCache = false; // Flag para indicar si los filtros vienen del cache
84
- _this.isCategoryChange = false; // Flag para indicar si es un cambio de categoría
85
72
  _this.productsWithUniqueVariant = false;
86
73
  _this.optionsFilters = ['all'];
87
74
  /**
@@ -152,117 +139,26 @@ var CollectionEcComponent = /** @class */ (function (_super) {
152
139
  _this.getObjectWithVariant = function () {
153
140
  return _this.consts.getParamsProductsWithUniqueVariant();
154
141
  };
155
- // Método personalizado para manejar selección de filtros que invalidará cache
156
- _this.customSetFilterSelected = function (filter, filterElement) {
157
- // Invalidar cache completamente cuando se selecciona un filtro
158
- _this.usingCachedProducts = false;
159
- _this.allCachedProducts = [];
160
- _this.filtersFromCache = false; // Ya no usamos filtros del cache
161
- _this.isCategoryChange = true; // Marcar como cambio para reemplazar productos
162
- CollectionEcComponent_1.stateCache.delete(_this.stateKey);
163
- console.log('🔄 Filtro seleccionado, invalidando cache y recargando desde endpoint para:', _this.stateKey);
164
- // Solo limpiar productos, NO limpiar filtros para que no desaparezcan
165
- _this.products = [];
166
- _this.loading = true;
167
- // Llamar al método original del ProductsService que iniciará una carga completa
168
- var result = _this.productsService.setFilterSelected(filter, filterElement);
169
- // La suscripción principal automáticamente actualizará los filtros
170
- // porque filtersFromCache = false y usingCachedProducts = false
171
- return result;
172
- };
173
142
  _this.paramsSrv.parameters.subscribe(function (param) { return _this.params = param; });
174
143
  _this.defaultFilters = _this.consts.getDefaultFilters();
175
144
  _this.filtersConfig.filters = _this.consts.getFilterConfig();
176
145
  _this.productsService.filtersInView$.subscribe(function (res) { return _this.filterInView = res; });
177
- // Inicializar propiedades de scroll y cache
178
- _this.platformId = platformId;
179
- _this.isRestoringState = false;
180
- _this.usingCachedProducts = false;
181
- _this.allCachedProducts = [];
182
- _this.subscriptionsConfigured = false;
183
- _this.isScrolling = false;
184
- _this.pendingScrollPosition = null;
185
- _this.expectedProductCount = 0;
186
- _this.filtersFromCache = false;
187
146
  _this.ecOnConstruct();
188
147
  return _this;
189
148
  }
190
- CollectionEcComponent_1 = CollectionEcComponent;
191
149
  CollectionEcComponent.prototype.ngOnInit = function () {
192
- this.stateKey = this.router.url.split('?')[0];
193
- // Verificar si hay estado guardado ANTES de scroll(0,0)
194
- var savedState = CollectionEcComponent_1.stateCache.get(this.stateKey);
195
- if (savedState && savedState.products.length > 0) {
196
- // NO llamar window.scroll(0, 0) para preservar posición
197
- this.products = [];
198
- this.ecOnInit();
199
- this.getProductsAndSubscribe(); // Llamar directamente
200
- }
201
- else {
202
- // Comportamiento normal con scroll al inicio
203
- window.scroll(0, 0);
204
- this.products = [];
205
- this.ecOnInit();
206
- this.getProductsAndSubscribe();
207
- }
208
- // Configurar manejo de estado
209
- this.setupBeforeUnloadHandler();
150
+ window.scroll(0, 0);
151
+ this.products = [];
152
+ this.ecOnInit();
153
+ this.getProductsAndSubscribe();
210
154
  };
211
155
  CollectionEcComponent.prototype.getProductsAndSubscribe = function () {
212
- // Verificar PRIMERO si hay estado guardado
213
- var savedState = CollectionEcComponent_1.stateCache.get(this.stateKey);
214
- if (savedState && savedState.products.length > 0) {
215
- console.log('📦 Restaurando desde cache:', savedState.products.length, 'productos');
216
- // Configurar modo cache ANTES de restaurar
217
- this.usingCachedProducts = true;
218
- this.allCachedProducts = __spread(savedState.products);
219
- this.isRestoringState = true;
220
- // Restaurar productos inmediatamente
221
- this.products = __spread(savedState.products);
222
- this.finished = savedState.finished;
223
- this.loading = false;
224
- // Restaurar filtros si están disponibles
225
- if (savedState.filters) {
226
- this.filters = __spread(savedState.filters);
227
- this.filtersFromCache = true; // Marcar que estos filtros vienen del cache
228
- console.log('📦 Filtros restaurados desde cache:', this.filters.length);
229
- }
230
- if (savedState.filters_top) {
231
- this.filters_top = __spread(savedState.filters_top);
232
- console.log('📦 Filtros top restaurados desde cache:', this.filters_top.length);
233
- }
234
- if (savedState.breadcrumb) {
235
- this.breadcrumb = __spread(savedState.breadcrumb);
236
- console.log('📦 Breadcrumb restaurado desde cache:', this.breadcrumb);
237
- }
238
- // IMPORTANTE: Configurar TODAS las suscripciones del padre (filtros, breadcrumb, etc.)
239
- // pero SIN resetear productos ni hacer petición inicial
240
- this.setupParentSubscriptionsOnly();
241
- // Configurar suscripción personalizada para detectar cambios de categoría
242
- this.setupCustomSubscription();
243
- this.subscriptionsConfigured = true;
244
- // Restaurar scroll después de que los productos se rendericen
245
- this.waitForProductRendering(savedState.scrollPosition);
246
- return;
247
- }
248
- console.log('🔄 No hay cache, carga normal');
249
- // Si no hay estado guardado, comportamiento normal
250
- this.usingCachedProducts = false;
251
- this.allCachedProducts = [];
252
- this.filtersFromCache = false; // No hay filtros del cache
253
- // Llamar al comportamiento original
254
- this.originalGetProductsAndSubscribe();
255
- this.subscriptionsConfigured = true;
256
- };
257
- CollectionEcComponent.prototype.originalGetProductsAndSubscribe = function () {
258
156
  var _this = this;
259
157
  combineLatest([this.activeRoute.params, this.optionsService.ready, this.activeRoute.queryParams]).subscribe(function (_a) {
260
158
  var _b = __read(_a, 3), params = _b[0], ready = _b[1], queryParams = _b[2];
261
159
  if (ready.readyAll) {
262
160
  var cambio_1 = false;
263
161
  _this.products = [];
264
- // Marcar como cambio de categoría para la carga inicial
265
- _this.isCategoryChange = true;
266
162
  if (!params['type'] || !params['value']) {
267
163
  _this.productsService.getProductsForFilter({ latest: true, limit: 10 }, _this.optionsFilters, queryParams.search, _this.defaultFilters);
268
164
  }
@@ -293,16 +189,7 @@ var CollectionEcComponent = /** @class */ (function (_super) {
293
189
  }
294
190
  else {
295
191
  res = _this.productsService.getProductsWithUniqueVariant(res, _this.getObjectWithVariant());
296
- // Filtrar productos duplicados antes de agregar
297
- var existingIds_1 = new Set(_this.products.map(function (p) { return p.id; }));
298
- var uniqueProducts = res.filter(function (p) { return !existingIds_1.has(p.id); });
299
- if (uniqueProducts.length > 0) {
300
- console.log('➕ CollectionEC (variants): Agregando', uniqueProducts.length, 'de', res.length, 'productos únicos');
301
- (_a = _this.products).push.apply(_a, __spread(uniqueProducts));
302
- }
303
- else {
304
- console.log('⚠️ CollectionEC (variants): Todos los productos ya existen - ignorando', res.length, 'productos');
305
- }
192
+ (_a = _this.products).push.apply(_a, __spread(res));
306
193
  _this.applyFiltersInView();
307
194
  }
308
195
  ;
@@ -314,16 +201,7 @@ var CollectionEcComponent = /** @class */ (function (_super) {
314
201
  cambio_1 = false;
315
202
  }
316
203
  else {
317
- // Filtrar productos duplicados antes de agregar
318
- var existingIds_2 = new Set(_this.products.map(function (p) { return p.id; }));
319
- var uniqueProducts = res.filter(function (p) { return !existingIds_2.has(p.id); });
320
- if (uniqueProducts.length > 0) {
321
- console.log('➕ CollectionEC: Agregando', uniqueProducts.length, 'de', res.length, 'productos únicos');
322
- (_b = _this.products).push.apply(_b, __spread(uniqueProducts));
323
- }
324
- else {
325
- console.log('⚠️ CollectionEC: Todos los productos ya existen - ignorando', res.length, 'productos');
326
- }
204
+ (_b = _this.products).push.apply(_b, __spread(res));
327
205
  _this.applyFiltersInView();
328
206
  }
329
207
  }
@@ -340,145 +218,6 @@ var CollectionEcComponent = /** @class */ (function (_super) {
340
218
  }
341
219
  });
342
220
  };
343
- CollectionEcComponent.prototype.setupParentSubscriptionsOnly = function () {
344
- var _this = this;
345
- var _a;
346
- // Desuscribir cualquier suscripción anterior
347
- try {
348
- (_a = this.suscripcion) === null || _a === void 0 ? void 0 : _a.unsubscribe();
349
- }
350
- catch (e) { }
351
- // IMPORTANTE: Configurar suscripción a productos para navegación posterior
352
- this.suscripcion = this.productsService.products$.subscribe(function (res) {
353
- var _a, _b;
354
- var _c;
355
- console.log('📦 Suscripción products$ (desde cache):', (_c = res) === null || _c === void 0 ? void 0 : _c.length, 'productos');
356
- _this.loading = false;
357
- if (res && res.length > 0) {
358
- // Si estamos usando cache, agregar solo productos nuevos únicos
359
- if (_this.usingCachedProducts) {
360
- var existingIds_3 = new Set(_this.products.map(function (p) { return p.id; }));
361
- var uniqueProducts = res.filter(function (p) { return !existingIds_3.has(p.id); });
362
- if (uniqueProducts.length > 0) {
363
- console.log('➕ Cache: Agregando', uniqueProducts.length, 'productos adicionales');
364
- (_a = _this.products).push.apply(_a, __spread(uniqueProducts));
365
- _this.usingCachedProducts = false; // Ya no solo cache
366
- }
367
- }
368
- else {
369
- // Determinar si es cambio de categoría o scroll infinito
370
- if (_this.isCategoryChange) {
371
- // Cambio de categoría: reemplazar completamente
372
- console.log('🔄 Cambio de categoría: Reemplazando productos completamente');
373
- if (_this.productsWithUniqueVariant) {
374
- _this.products = _this.productsService.getProductsWithUniqueVariant(res, _this.getObjectWithVariant());
375
- }
376
- else {
377
- _this.products = res;
378
- }
379
- _this.applyFiltersInView();
380
- _this.isCategoryChange = false; // Resetear bandera
381
- }
382
- else {
383
- // Scroll infinito: agregar productos únicos
384
- console.log('📜 Scroll infinito: Agregando productos únicos');
385
- var existingIds_4 = new Set(_this.products.map(function (p) { return p.id; }));
386
- var newProducts = res;
387
- if (_this.productsWithUniqueVariant) {
388
- newProducts = _this.productsService.getProductsWithUniqueVariant(res, _this.getObjectWithVariant());
389
- }
390
- var uniqueProducts = newProducts.filter(function (p) { return !existingIds_4.has(p.id); });
391
- if (uniqueProducts.length > 0) {
392
- console.log('➕ Agregando', uniqueProducts.length, 'productos únicos por scroll');
393
- (_b = _this.products).push.apply(_b, __spread(uniqueProducts));
394
- }
395
- else {
396
- console.log('⚠️ Todos los productos del scroll ya existen');
397
- }
398
- _this.applyFiltersInView();
399
- }
400
- }
401
- }
402
- else if (res && res.length === 0) {
403
- // Si recibimos array vacío y no estamos usando cache, limpiar productos
404
- if (!_this.usingCachedProducts) {
405
- _this.products = [];
406
- }
407
- }
408
- _this.finished = _this.productsService.isFinished();
409
- _this.analyticsService.callEvent('view_item_list', { products: _this.products, item_list_name: 'Collection', item_list_id: 0 });
410
- });
411
- // Configurar suscripciones de filtros
412
- this.productsService.filters$.subscribe(function (res) {
413
- // IMPORTANTE: Solo actualizar filtros si NO vienen del cache
414
- if (!_this.filtersFromCache) {
415
- console.log('🔄 Actualizando filtros desde server');
416
- _this.breadcrumb = _this.optionsService.getBreadcrumbByFilters(res);
417
- _this.filters = _this.getSpecificFilters(res, _this.filtersConfig.filters);
418
- _this.filters_top = _this.getSpecificFilters(res, ['sort']);
419
- }
420
- else {
421
- console.log('🚫 Saltando actualización de filtros (usando cache)');
422
- // Una vez que han sido utilizados, resetear el flag
423
- _this.filtersFromCache = false;
424
- }
425
- });
426
- this.productsService.finished().subscribe(function (res) { return _this.finished = res; });
427
- };
428
- CollectionEcComponent.prototype.setupCustomSubscription = function () {
429
- var _this = this;
430
- // Suscripción personalizada para detectar cambios de categoría/búsqueda
431
- combineLatest([this.activeRoute.params, this.optionsService.ready, this.activeRoute.queryParams]).subscribe(function (_a) {
432
- var _b = __read(_a, 3), params = _b[0], ready = _b[1], queryParams = _b[2];
433
- if (ready.readyAll && _this.subscriptionsConfigured) {
434
- var currentKey = _this.generateStateKey();
435
- // Si la clave cambió, significa que navegamos a una categoría diferente
436
- if (currentKey !== _this.stateKey) {
437
- console.log('🔄 Cambio de categoría detectado, invalidando cache y recargando');
438
- _this.stateKey = currentKey;
439
- // Limpiar cache y recargar normalmente
440
- _this.invalidateCache();
441
- _this.usingCachedProducts = false;
442
- _this.allCachedProducts = [];
443
- _this.filtersFromCache = false;
444
- // IMPORTANTE: Marcar que es cambio de categoría y resetear estado
445
- _this.isCategoryChange = true;
446
- _this.loading = true;
447
- _this.products = [];
448
- // Recargar normalmente - pero solo la petición, no reconfigurar suscripciones
449
- _this.loadNewCategory(params, queryParams);
450
- }
451
- }
452
- });
453
- };
454
- CollectionEcComponent.prototype.loadNewCategory = function (params, queryParams) {
455
- // Hacer solo la petición de productos sin reconfigurar todas las suscripciones
456
- var cambio = false;
457
- if (!params['type'] || !params['value']) {
458
- this.productsService.getProductsForFilter({ latest: true, limit: 10 }, this.optionsFilters, queryParams.search, this.defaultFilters);
459
- }
460
- else {
461
- this.productsService.getProductsForFilter({ type: params.type, value: params.value }, this.optionsFilters, queryParams.search, this.defaultFilters);
462
- cambio = true;
463
- this.type = params['type'];
464
- this.value = params['value'];
465
- }
466
- console.log('🔄 Nueva petición enviada para categoría:', params.type, params.value);
467
- };
468
- CollectionEcComponent.prototype.generateStateKey = function () {
469
- // Incluir ruta y parámetros para generar clave única
470
- var route = this.router.url.split('?')[0]; // Sin query params
471
- var params = this.activeRoute.snapshot.params;
472
- return route + "_" + JSON.stringify(params);
473
- };
474
- CollectionEcComponent.prototype.invalidateCache = function () {
475
- // Limpiar cache específico y sessionStorage
476
- console.log('🗑️ Invalidando cache para:', this.stateKey);
477
- CollectionEcComponent_1.stateCache.delete(this.stateKey);
478
- if (isPlatformBrowser(this.platformId)) {
479
- sessionStorage.removeItem("collection_scroll_" + this.stateKey);
480
- }
481
- };
482
221
  CollectionEcComponent.prototype.onScroll = function () {
483
222
  this.loading = true;
484
223
  if (!this.productsService.isWaiting() && !this.productsService.getNext()) {
@@ -486,187 +225,6 @@ var CollectionEcComponent = /** @class */ (function (_super) {
486
225
  this.loading = false;
487
226
  }
488
227
  };
489
- // Métodos de ciclo de vida requeridos
490
- CollectionEcComponent.prototype.ngAfterViewChecked = function () {
491
- var _this = this;
492
- // Solo verificar si hay un scroll pendiente
493
- if (this.pendingScrollPosition !== null && isPlatformBrowser(this.platformId)) {
494
- var productElements = document.querySelectorAll('.col-lg-3, .col-md-4, .col-6, [class*="product"], .product-item, .card');
495
- var currentProductCount = productElements.length;
496
- // Verificar si se han renderizado suficientes productos
497
- if (currentProductCount >= Math.min(this.expectedProductCount, 10)) {
498
- var targetPosition_1 = this.pendingScrollPosition;
499
- this.pendingScrollPosition = null; // Limpiar para evitar loops
500
- // Usar requestAnimationFrame para asegurar que el rendering esté completo
501
- requestAnimationFrame(function () {
502
- requestAnimationFrame(function () {
503
- _this.restoreScrollWithRetries(targetPosition_1);
504
- _this.isRestoringState = false;
505
- });
506
- });
507
- }
508
- }
509
- };
510
- CollectionEcComponent.prototype.ngOnDestroy = function () {
511
- var _a;
512
- (_a = this.routerSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
513
- this.saveCurrentState();
514
- // Limpiar scroll pendiente
515
- this.pendingScrollPosition = null;
516
- // Limpiar event listeners
517
- if (this.clickHandler) {
518
- document.removeEventListener('click', this.clickHandler);
519
- }
520
- };
521
- // Métodos de manejo de scroll y cache
522
- CollectionEcComponent.prototype.setupBeforeUnloadHandler = function () {
523
- var _this = this;
524
- if (isPlatformBrowser(this.platformId)) {
525
- // Interceptar clics en productos para guardar estado
526
- this.clickHandler = function (event) {
527
- var target = event.target;
528
- // Buscar si el clic es en un enlace a producto
529
- var link = target.closest('a[href*="/product/"]');
530
- if (link && _this.router.url.includes('/collection/')) {
531
- console.log('🎯 Clic en producto detectado, guardando estado');
532
- _this.saveCurrentState();
533
- }
534
- };
535
- document.addEventListener('click', this.clickHandler);
536
- // Guardar durante scroll en la página de colección
537
- var scrollTimer_1;
538
- window.addEventListener('scroll', function () {
539
- // Solo guardar si estamos en una página de colección
540
- if (_this.router.url.includes('/collection/')) {
541
- clearTimeout(scrollTimer_1);
542
- scrollTimer_1 = setTimeout(function () { return _this.saveCurrentState(); }, 300);
543
- }
544
- });
545
- // Guardar antes de que el usuario salga de la página
546
- window.addEventListener('beforeunload', function () {
547
- if (_this.router.url.includes('/collection/')) {
548
- _this.saveCurrentState();
549
- }
550
- });
551
- }
552
- };
553
- CollectionEcComponent.prototype.saveCurrentState = function () {
554
- if (isPlatformBrowser(this.platformId) && this.products && this.products.length > 0) {
555
- // Obtener posición de scroll de múltiples fuentes
556
- var scrollPos = Math.max(window.pageYOffset || 0, document.documentElement.scrollTop || 0, document.body.scrollTop || 0);
557
- // Solo guardar si tenemos una posición significativa o productos suficientes
558
- if (scrollPos > 10 || this.products.length > 10) {
559
- var state = {
560
- products: __spread(this.products),
561
- scrollPosition: scrollPos,
562
- finished: this.finished,
563
- loading: this.loading,
564
- page: Math.ceil(this.products.length / 10),
565
- allCachedProducts: this.usingCachedProducts ? __spread(this.allCachedProducts) : __spread(this.products),
566
- filters: this.filters ? __spread(this.filters) : undefined,
567
- filters_top: this.filters_top ? __spread(this.filters_top) : undefined,
568
- breadcrumb: this.breadcrumb ? __spread(this.breadcrumb) : undefined
569
- };
570
- CollectionEcComponent_1.stateCache.set(this.stateKey, state);
571
- // También guardar en sessionStorage como backup
572
- try {
573
- sessionStorage.setItem("collection_scroll_" + this.stateKey, scrollPos.toString());
574
- sessionStorage.setItem("collection_products_" + this.stateKey, this.products.length.toString());
575
- }
576
- catch (e) { }
577
- }
578
- }
579
- };
580
- CollectionEcComponent.prototype.restoreScrollWithRetries = function (targetPosition) {
581
- var _this = this;
582
- if (this.isScrolling) {
583
- return;
584
- }
585
- // Verificar si el target es mayor que la altura del documento
586
- var documentHeight = document.documentElement.scrollHeight;
587
- if (targetPosition > documentHeight) {
588
- targetPosition = Math.max(0, documentHeight - window.innerHeight);
589
- }
590
- // Solo verificar si el usuario ha hecho scroll muy lejos
591
- var currentPos = window.pageYOffset || document.documentElement.scrollTop;
592
- if (currentPos > 500 && Math.abs(currentPos - targetPosition) > 1000) {
593
- return;
594
- }
595
- this.isScrolling = true;
596
- // Intentar encontrar una posición más precisa basada en elementos del DOM
597
- var improvedPosition = this.tryScrollToProductByIndex(targetPosition);
598
- if (improvedPosition !== targetPosition) {
599
- targetPosition = improvedPosition;
600
- }
601
- var attempts = 0;
602
- var maxAttempts = 15;
603
- var tryScroll = function () {
604
- attempts++;
605
- // Usar scroll más agresivo si es necesario
606
- if (attempts < 3) {
607
- // Primeros intentos con smooth
608
- window.scrollTo({
609
- top: targetPosition,
610
- behavior: 'smooth'
611
- });
612
- }
613
- else {
614
- // Intentos posteriores más directos
615
- window.scrollTo(0, targetPosition);
616
- document.documentElement.scrollTop = targetPosition;
617
- document.body.scrollTop = targetPosition;
618
- }
619
- // Verificar después de un momento
620
- setTimeout(function () {
621
- var currentPos = window.pageYOffset || document.documentElement.scrollTop;
622
- var difference = Math.abs(currentPos - targetPosition);
623
- if (difference > 50 && attempts < maxAttempts) {
624
- var delay = attempts < 5 ? 100 : attempts < 10 ? 200 : 300;
625
- setTimeout(tryScroll, delay);
626
- }
627
- else {
628
- _this.isScrolling = false; // Liberar flag cuando termine
629
- }
630
- }, 100);
631
- };
632
- // Intentar solo una vez inicialmente
633
- tryScroll();
634
- };
635
- CollectionEcComponent.prototype.tryScrollToProductByIndex = function (targetPosition) {
636
- // Intentar calcular a qué producto corresponde la posición
637
- var approximateIndex = Math.floor(targetPosition / 400); // Asumiendo ~400px por producto
638
- // Buscar elementos de producto
639
- var productElements = document.querySelectorAll('.col-lg-3, .col-md-4, .col-6, [class*="product"], .product-item, .card');
640
- if (productElements.length > approximateIndex && approximateIndex >= 0) {
641
- var targetElement = productElements[approximateIndex];
642
- var elementPosition = targetElement.offsetTop;
643
- // Usar la posición del elemento si es razonable
644
- if (Math.abs(elementPosition - targetPosition) < 800) {
645
- return elementPosition;
646
- }
647
- }
648
- return targetPosition; // Usar posición original si no encuentra elemento adecuado
649
- };
650
- CollectionEcComponent.prototype.waitForProductRendering = function (targetPosition) {
651
- var _this = this;
652
- var _a;
653
- // Configurar el scroll pendiente para que ngAfterViewChecked lo maneje
654
- this.pendingScrollPosition = targetPosition;
655
- this.expectedProductCount = ((_a = this.products) === null || _a === void 0 ? void 0 : _a.length) || 0;
656
- // Timeout de seguridad en caso de que ngAfterViewChecked no se ejecute
657
- setTimeout(function () {
658
- if (_this.pendingScrollPosition !== null) {
659
- var targetPos = _this.pendingScrollPosition;
660
- _this.pendingScrollPosition = null;
661
- _this.restoreScrollWithRetries(targetPos);
662
- _this.isRestoringState = false;
663
- }
664
- }, 2000);
665
- };
666
- var CollectionEcComponent_1;
667
- // Propiedades para scroll y cache
668
- CollectionEcComponent.stateCache = new Map();
669
- CollectionEcComponent.maxCacheSize = 10;
670
228
  CollectionEcComponent.ctorParameters = function () { return [
671
229
  { type: ProductsService },
672
230
  { type: ParametersService },
@@ -676,9 +234,7 @@ var CollectionEcComponent = /** @class */ (function (_super) {
676
234
  { type: AnalyticsService },
677
235
  { type: CartService },
678
236
  { type: Constants },
679
- { type: FiltersService },
680
- { type: Router },
681
- { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
237
+ { type: FiltersService }
682
238
  ]; };
683
239
  __decorate([
684
240
  Input()
@@ -692,15 +248,14 @@ var CollectionEcComponent = /** @class */ (function (_super) {
692
248
  __decorate([
693
249
  Input()
694
250
  ], CollectionEcComponent.prototype, "optionsFilters", void 0);
695
- CollectionEcComponent = CollectionEcComponent_1 = __decorate([
251
+ CollectionEcComponent = __decorate([
696
252
  Component({
697
253
  selector: 'app-collection-ec',
698
254
  template: "\r\n<div>\r\n <div class=\"collection\">\r\n <ng-content select=\"[collection]\"> </ng-content>\r\n </div>\r\n\r\n <div class=\"all\">\r\n <ng-content select=\"[all]\"> </ng-content>\r\n </div>\r\n</div>\r\n\r\n<app-blocks-ec [section]=\"'collection'\"></app-blocks-ec>",
699
255
  styles: [".h1-custom{color:#00f}"]
700
- }),
701
- __param(10, Inject(PLATFORM_ID))
256
+ })
702
257
  ], CollectionEcComponent);
703
258
  return CollectionEcComponent;
704
259
  }(ComponentHelper));
705
260
  export { CollectionEcComponent };
706
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NvbGxlY3Rpb24tZWMvY29sbGVjdGlvbi1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxXQUFXLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsaUdBQWlHO0FBQ2pHLE9BQU8sRUFBRSxhQUFhLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQW9CM0U7SUFBMkMseUNBQWU7SUF5Q3RELCtCQUFtQixlQUFnQyxFQUNyQyxTQUE0QixFQUM1QixXQUEy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IE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIEluamVjdCwgUExBVEZPUk1fSUQsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRmlsdGVyRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyJztcclxuLy8gaW1wb3J0IHsgQ29uc3RhbnRzLCBGaWx0ZXIsIE9wdGlvbnNTZXJ2aWNlLCBQcm9kdWN0LCBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICduZy1lYXN5Y29tbWVyY2UnO1xyXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyJztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9maWx0ZXJzL0ZpbHRlcic7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvcmUuY29uc3RzJztcclxuaW1wb3J0IHsgRGVmYXVsdEZpbHRlciwgRmlsdGVyQ29uZmlnLCBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maWx0ZXInO1xyXG5pbXBvcnQgeyBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wYXJhbXNJbnRlcmZhY2VzL3BhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQnO1xyXG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcclxuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbHRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmlsdGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vcHRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhcmFtZXRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFByb2R1Y3RzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2R1Y3RzL3Byb2R1Y3RzLnNlcnZpY2UnO1xyXG5cclxuLy8gSW50ZXJmYWNlIHBhcmEgZWwgZXN0YWRvIGRlbCBjYWNoZVxyXG5pbnRlcmZhY2UgQ29sbGVjdGlvblN0YXRlIHtcclxuICBwcm9kdWN0czogYW55W107XHJcbiAgc2Nyb2xsUG9zaXRpb246IG51bWJlcjtcclxuICBmaW5pc2hlZDogYm9vbGVhbjtcclxuICBsb2FkaW5nOiBib29sZWFuO1xyXG4gIHBhZ2U6IG51bWJlcjtcclxuICBhbGxDYWNoZWRQcm9kdWN0cz86IGFueVtdO1xyXG4gIGZpbHRlcnM/OiBhbnlbXTsgLy8gTG9zIGZpbHRyb3MgZGlzcG9uaWJsZXMgKGNhdGVnb3LDrWFzLCBwcmVjaW8sIGF0cmlidXRvcylcclxuICBmaWx0ZXJzX3RvcD86IGFueVtdOyAvLyBMb3MgZmlsdHJvcyBzdXBlcmlvcmVzIChvcmRlbmFtaWVudG8pXHJcbiAgYnJlYWRjcnVtYj86IHN0cmluZ1tdOyAvLyBFbCBicmVhZGNydW1iXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhcHAtY29sbGVjdGlvbi1lYycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29sbGVjdGlvbi1lYy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jb2xsZWN0aW9uLWVjLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkIHtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBmaWx0ZXJzX3RvcDogRmlsdGVyW107XHJcbiAgICBwcml2YXRlIGRlZmF1bHRGaWx0ZXJzOiBEZWZhdWx0RmlsdGVyW107XHJcbiAgICBwcml2YXRlIGZpbHRlcnNDb25maWc6IEZpbHRlckNvbmZpZyA9IHtmaWx0ZXJzOltdfTtcclxuICAgIC8vIHB1YmxpYyBvcHRpb25zRmlsdGVyczogWydhbGwnXTtcclxuICAgIHB1YmxpYyBwcm9kdWN0czogUHJvZHVjdFtdO1xyXG4gICAgcHVibGljIGZpbmlzaGVkID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgc3VzY3JpcGNpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBicmVhZGNydW1iOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBwdWJsaWMgaXNDb2xsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwYXJhbXM6IGFueTtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVySW5WaWV3OkZpbHRlckVsZW1lbnQ7XHJcblxyXG4gICAgLy8gUHJvcGllZGFkZXMgcGFyYSBzY3JvbGwgeSBjYWNoZVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDb2xsZWN0aW9uU3RhdGU+KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBtYXhDYWNoZVNpemUgPSAxMDtcclxuICAgIHByaXZhdGUgcm91dGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgICBwcml2YXRlIHN0YXRlS2V5OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGlzUmVzdG9yaW5nU3RhdGU6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGNsaWNrSGFuZGxlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgdXNpbmdDYWNoZWRQcm9kdWN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBhbGxDYWNoZWRQcm9kdWN0czogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uc0NvbmZpZ3VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaXNTY3JvbGxpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcGVuZGluZ1Njcm9sbFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgZXhwZWN0ZWRQcm9kdWN0Q291bnQ6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGZpbHRlcnNGcm9tQ2FjaGU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRmxhZyBwYXJhIGluZGljYXIgc2kgbG9zIGZpbHRyb3MgdmllbmVuIGRlbCBjYWNoZVxyXG4gICAgcHJpdmF0ZSBpc0NhdGVnb3J5Q2hhbmdlOiBib29sZWFuID0gZmFsc2U7IC8vIEZsYWcgcGFyYSBpbmRpY2FyIHNpIGVzIHVuIGNhbWJpbyBkZSBjYXRlZ29yw61hXHJcbiAgICBcclxuICAgIC8vIFNlcnZpY2lvcyBhZGljaW9uYWxlcyBwYXJhIHNjcm9sbFxyXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3Q7XHJcblxyXG4gICAgQElucHV0KCkgdHlwZTtcclxuICAgIEBJbnB1dCgpIHZhbHVlO1xyXG4gICAgQElucHV0KCkgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgb3B0aW9uc0ZpbHRlcnM6IEZpbHRlclR5cGVbXSA9IFsnYWxsJ107XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBwYXJhbXNTcnY6IFBhcmFtZXRlcnNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJvdGVjdGVkIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvbnN0YW50cyxcclxuICAgICAgICBwdWJsaWMgZmlsdGVyc1NlcnZpY2U6IEZpbHRlcnNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBPYmplY3QpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFyYW1zU3J2LnBhcmFtZXRlcnMuc3Vic2NyaWJlKHBhcmFtID0+IHRoaXMucGFyYW1zID0gcGFyYW0pXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RmlsdGVycyA9IHRoaXMuY29uc3RzLmdldERlZmF1bHRGaWx0ZXJzKClcclxuICAgICAgICB0aGlzLmZpbHRlcnNDb25maWcuZmlsdGVycyA9IHRoaXMuY29uc3RzLmdldEZpbHRlckNvbmZpZygpXHJcbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmlsdGVyc0luVmlldyQuc3Vic2NyaWJlKCByZXMgPT4gdGhpcy5maWx0ZXJJblZpZXcgPSByZXMpXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gSW5pY2lhbGl6YXIgcHJvcGllZGFkZXMgZGUgc2Nyb2xsIHkgY2FjaGVcclxuICAgICAgICB0aGlzLnBsYXRmb3JtSWQgPSBwbGF0Zm9ybUlkO1xyXG4gICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWxsQ2FjaGVkUHJvZHVjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNDb25maWd1cmVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV4cGVjdGVkUHJvZHVjdENvdW50ID0gMDtcclxuICAgICAgICB0aGlzLmZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3RhdGVLZXkgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBWZXJpZmljYXIgc2kgaGF5IGVzdGFkbyBndWFyZGFkbyBBTlRFUyBkZSBzY3JvbGwoMCwwKVxyXG4gICAgICAgIGNvbnN0IHNhdmVkU3RhdGUgPSBDb2xsZWN0aW9uRWNDb21wb25lbnQuc3RhdGVDYWNoZS5nZXQodGhpcy5zdGF0ZUtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHNhdmVkU3RhdGUgJiYgc2F2ZWRTdGF0ZS5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIE5PIGxsYW1hciB3aW5kb3cuc2Nyb2xsKDAsIDApIHBhcmEgcHJlc2VydmFyIHBvc2ljacOzblxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZWNPbkluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpOyAvLyBMbGFtYXIgZGlyZWN0YW1lbnRlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ29tcG9ydGFtaWVudG8gbm9ybWFsIGNvbiBzY3JvbGwgYWwgaW5pY2lvXHJcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGwoMCwgMCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5lY09uSW5pdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvbmZpZ3VyYXIgbWFuZWpvIGRlIGVzdGFkb1xyXG4gICAgICAgIHRoaXMuc2V0dXBCZWZvcmVVbmxvYWRIYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgICBnZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBWZXJpZmljYXIgUFJJTUVSTyBzaSBoYXkgZXN0YWRvIGd1YXJkYWRvXHJcbiAgICAgICAgY29uc3Qgc2F2ZWRTdGF0ZSA9IENvbGxlY3Rpb25FY0NvbXBvbmVudC5zdGF0ZUNhY2hlLmdldCh0aGlzLnN0YXRlS2V5KTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoc2F2ZWRTdGF0ZSAmJiBzYXZlZFN0YXRlLnByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk6YgUmVzdGF1cmFuZG8gZGVzZGUgY2FjaGU6Jywgc2F2ZWRTdGF0ZS5wcm9kdWN0cy5sZW5ndGgsICdwcm9kdWN0b3MnKTtcclxuICAgICAgICAgICAgLy8gQ29uZmlndXJhciBtb2RvIGNhY2hlIEFOVEVTIGRlIHJlc3RhdXJhclxyXG4gICAgICAgICAgICB0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmFsbENhY2hlZFByb2R1Y3RzID0gWy4uLnNhdmVkU3RhdGUucHJvZHVjdHNdO1xyXG4gICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nU3RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUmVzdGF1cmFyIHByb2R1Y3RvcyBpbm1lZGlhdGFtZW50ZVxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gWy4uLnNhdmVkU3RhdGUucHJvZHVjdHNdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHNhdmVkU3RhdGUuZmluaXNoZWQ7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUmVzdGF1cmFyIGZpbHRyb3Mgc2kgZXN0w6FuIGRpc3BvbmlibGVzXHJcbiAgICAgICAgICAgIGlmIChzYXZlZFN0YXRlLmZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IFsuLi5zYXZlZFN0YXRlLmZpbHRlcnNdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gdHJ1ZTsgLy8gTWFyY2FyIHF1ZSBlc3RvcyBmaWx0cm9zIHZpZW5lbiBkZWwgY2FjaGVcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5OmIEZpbHRyb3MgcmVzdGF1cmFkb3MgZGVzZGUgY2FjaGU6JywgdGhpcy5maWx0ZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNhdmVkU3RhdGUuZmlsdGVyc190b3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc190b3AgPSBbLi4uc2F2ZWRTdGF0ZS5maWx0ZXJzX3RvcF07XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TpiBGaWx0cm9zIHRvcCByZXN0YXVyYWRvcyBkZXNkZSBjYWNoZTonLCB0aGlzLmZpbHRlcnNfdG9wLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNhdmVkU3RhdGUuYnJlYWRjcnVtYikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icmVhZGNydW1iID0gWy4uLnNhdmVkU3RhdGUuYnJlYWRjcnVtYl07XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TpiBCcmVhZGNydW1iIHJlc3RhdXJhZG8gZGVzZGUgY2FjaGU6JywgdGhpcy5icmVhZGNydW1iKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gSU1QT1JUQU5URTogQ29uZmlndXJhciBUT0RBUyBsYXMgc3VzY3JpcGNpb25lcyBkZWwgcGFkcmUgKGZpbHRyb3MsIGJyZWFkY3J1bWIsIGV0Yy4pXHJcbiAgICAgICAgICAgIC8vIHBlcm8gU0lOIHJlc2V0ZWFyIHByb2R1Y3RvcyBuaSBoYWNlciBwZXRpY2nDs24gaW5pY2lhbFxyXG4gICAgICAgICAgICB0aGlzLnNldHVwUGFyZW50U3Vic2NyaXB0aW9uc09ubHkoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIENvbmZpZ3VyYXIgc3VzY3JpcGNpw7NuIHBlcnNvbmFsaXphZGEgcGFyYSBkZXRlY3RhciBjYW1iaW9zIGRlIGNhdGVnb3LDrWFcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEN1c3RvbVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNDb25maWd1cmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFJlc3RhdXJhciBzY3JvbGwgZGVzcHXDqXMgZGUgcXVlIGxvcyBwcm9kdWN0b3Mgc2UgcmVuZGVyaWNlblxyXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JQcm9kdWN0UmVuZGVyaW5nKHNhdmVkU3RhdGUuc2Nyb2xsUG9zaXRpb24pO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBObyBoYXkgY2FjaGUsIGNhcmdhIG5vcm1hbCcpO1xyXG4gICAgICAgIC8vIFNpIG5vIGhheSBlc3RhZG8gZ3VhcmRhZG8sIGNvbXBvcnRhbWllbnRvIG5vcm1hbFxyXG4gICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWxsQ2FjaGVkUHJvZHVjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZTsgLy8gTm8gaGF5IGZpbHRyb3MgZGVsIGNhY2hlXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTGxhbWFyIGFsIGNvbXBvcnRhbWllbnRvIG9yaWdpbmFsXHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zQ29uZmlndXJlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvcmlnaW5hbEdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuYWN0aXZlUm91dGUucGFyYW1zLCB0aGlzLm9wdGlvbnNTZXJ2aWNlLnJlYWR5LCB0aGlzLmFjdGl2ZVJvdXRlLnF1ZXJ5UGFyYW1zXSkuc3Vic2NyaWJlKChbcGFyYW1zLCByZWFkeSwgcXVlcnlQYXJhbXNdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZWFkeS5yZWFkeUFsbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNhbWJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgLy8gTWFyY2FyIGNvbW8gY2FtYmlvIGRlIGNhdGVnb3LDrWEgcGFyYSBsYSBjYXJnYSBpbmljaWFsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1sndHlwZSddIHx8ICFwYXJhbXNbJ3ZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IGxhdGVzdDogdHJ1ZSwgbGltaXQ6IDEwIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IHR5cGU6IHBhcmFtcy50eXBlLCB2YWx1ZTogcGFyYW1zLnZhbHVlIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgIHRoaXMuZGVmYXVsdEZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gcGFyYW1zWyd0eXBlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhcmFtc1sndmFsdWUnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRyeSB7IHRoaXMuc3VzY3JpcGNpb24udW5zdWJzY3JpYmUoKTsgfSBjYXRjaCAoZSkgeyB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdXNjcmlwY2lvbiA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLnByb2R1Y3RzJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5pc0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdHJhciBwcm9kdWN0b3MgZHVwbGljYWRvcyBhbnRlcyBkZSBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldCh0aGlzLnByb2R1Y3RzLm1hcChwID0+IHAuaWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDb2xsZWN0aW9uRUMgKHZhcmlhbnRzKTogQWdyZWdhbmRvJywgdW5pcXVlUHJvZHVjdHMubGVuZ3RoLCAnZGUnLCByZXMubGVuZ3RoLCAncHJvZHVjdG9zIMO6bmljb3MnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi51bmlxdWVQcm9kdWN0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn4pqg77iPIENvbGxlY3Rpb25FQyAodmFyaWFudHMpOiBUb2RvcyBsb3MgcHJvZHVjdG9zIHlhIGV4aXN0ZW4gLSBpZ25vcmFuZG8nLCByZXMubGVuZ3RoLCAncHJvZHVjdG9zJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNJblZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FtYmlvKSB7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gcmVzOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNJblZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtYmlvID0gZmFsc2U7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdHJhciBwcm9kdWN0b3MgZHVwbGljYWRvcyBhbnRlcyBkZSBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldCh0aGlzLnByb2R1Y3RzLm1hcChwID0+IHAuaWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDb2xsZWN0aW9uRUM6IEFncmVnYW5kbycsIHVuaXF1ZVByb2R1Y3RzLmxlbmd0aCwgJ2RlJywgcmVzLmxlbmd0aCwgJ3Byb2R1Y3RvcyDDum5pY29zJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4udW5pcXVlUHJvZHVjdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KaoO+4jyBDb2xsZWN0aW9uRUM6IFRvZG9zIGxvcyBwcm9kdWN0b3MgeWEgZXhpc3RlbiAtIGlnbm9yYW5kbycsIHJlcy5sZW5ndGgsICdwcm9kdWN0b3MnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3ZpZXdfaXRlbV9saXN0JywgeyBwcm9kdWN0czogdGhpcy5wcm9kdWN0cywgaXRlbV9saXN0X25hbWU6ICdDb2xsZWN0aW9uJywgaXRlbV9saXN0X2lkOiAwIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maWx0ZXJzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldEJyZWFkY3J1bWJCeUZpbHRlcnMocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmdldFNwZWNpZmljRmlsdGVycyhyZXMsIHRoaXMuZmlsdGVyc0NvbmZpZy5maWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNfdG9wID0gdGhpcy5nZXRTcGVjaWZpY0ZpbHRlcnMocmVzLCBbJ3NvcnQnXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmZpbmlzaGVkKCkuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmZpbmlzaGVkID0gcmVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwUGFyZW50U3Vic2NyaXB0aW9uc09ubHkoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gRGVzdXNjcmliaXIgY3VhbHF1aWVyIHN1c2NyaXBjacOzbiBhbnRlcmlvclxyXG4gICAgICAgIHRyeSB7IHRoaXMuc3VzY3JpcGNpb24/LnVuc3Vic2NyaWJlKCk7IH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIElNUE9SVEFOVEU6IENvbmZpZ3VyYXIgc3VzY3JpcGNpw7NuIGEgcHJvZHVjdG9zIHBhcmEgbmF2ZWdhY2nDs24gcG9zdGVyaW9yXHJcbiAgICAgICAgdGhpcy5zdXNjcmlwY2lvbiA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLnByb2R1Y3RzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk6YgU3VzY3JpcGNpw7NuIHByb2R1Y3RzJCAoZGVzZGUgY2FjaGUpOicsIHJlcz8ubGVuZ3RoLCAncHJvZHVjdG9zJyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gU2kgZXN0YW1vcyB1c2FuZG8gY2FjaGUsIGFncmVnYXIgc29sbyBwcm9kdWN0b3MgbnVldm9zIMO6bmljb3NcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQodGhpcy5wcm9kdWN0cy5tYXAocCA9PiBwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDYWNoZTogQWdyZWdhbmRvJywgdW5pcXVlUHJvZHVjdHMubGVuZ3RoLCAncHJvZHVjdG9zIGFkaWNpb25hbGVzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi51bmlxdWVQcm9kdWN0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlOyAvLyBZYSBubyBzb2xvIGNhY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmFyIHNpIGVzIGNhbWJpbyBkZSBjYXRlZ29yw61hIG8gc2Nyb2xsIGluZmluaXRvXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYXRlZ29yeUNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1iaW8gZGUgY2F0ZWdvcsOtYTogcmVlbXBsYXphciBjb21wbGV0YW1lbnRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5SEIENhbWJpbyBkZSBjYXRlZ29yw61hOiBSZWVtcGxhemFuZG8gcHJvZHVjdG9zIGNvbXBsZXRhbWVudGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQocmVzLCB0aGlzLmdldE9iamVjdFdpdGhWYXJpYW50KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHJlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSBmYWxzZTsgLy8gUmVzZXRlYXIgYmFuZGVyYVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjcm9sbCBpbmZpbml0bzogYWdyZWdhciBwcm9kdWN0b3Mgw7puaWNvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TnCBTY3JvbGwgaW5maW5pdG86IEFncmVnYW5kbyBwcm9kdWN0b3Mgw7puaWNvcycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQodGhpcy5wcm9kdWN0cy5tYXAocCA9PiBwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9kdWN0cyA9IHJlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb2R1Y3RzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVByb2R1Y3RzID0gbmV3UHJvZHVjdHMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBBZ3JlZ2FuZG8nLCB1bmlxdWVQcm9kdWN0cy5sZW5ndGgsICdwcm9kdWN0b3Mgw7puaWNvcyBwb3Igc2Nyb2xsJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4udW5pcXVlUHJvZHVjdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KaoO+4jyBUb2RvcyBsb3MgcHJvZHVjdG9zIGRlbCBzY3JvbGwgeWEgZXhpc3RlbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyAmJiByZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTaSByZWNpYmltb3MgYXJyYXkgdmFjw61vIHkgbm8gZXN0YW1vcyB1c2FuZG8gY2FjaGUsIGxpbXBpYXIgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtX2xpc3QnLCB7IHByb2R1Y3RzOiB0aGlzLnByb2R1Y3RzLCBpdGVtX2xpc3RfbmFtZTogJ0NvbGxlY3Rpb24nLCBpdGVtX2xpc3RfaWQ6IDAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ29uZmlndXJhciBzdXNjcmlwY2lvbmVzIGRlIGZpbHRyb3NcclxuICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maWx0ZXJzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgLy8gSU1QT1JUQU5URTogU29sbyBhY3R1YWxpemFyIGZpbHRyb3Mgc2kgTk8gdmllbmVuIGRlbCBjYWNoZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyc0Zyb21DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/CflIQgQWN0dWFsaXphbmRvIGZpbHRyb3MgZGVzZGUgc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldEJyZWFkY3J1bWJCeUZpbHRlcnMocmVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgdGhpcy5maWx0ZXJzQ29uZmlnLmZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzX3RvcCA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgWydzb3J0J10pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfmqsgU2FsdGFuZG8gYWN0dWFsaXphY2nDs24gZGUgZmlsdHJvcyAodXNhbmRvIGNhY2hlKScpO1xyXG4gICAgICAgICAgICAgICAgLy8gVW5hIHZleiBxdWUgaGFuIHNpZG8gdXRpbGl6YWRvcywgcmVzZXRlYXIgZWwgZmxhZ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maW5pc2hlZCgpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5maW5pc2hlZCA9IHJlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXR1cEN1c3RvbVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcclxuICAgICAgICAvLyBTdXNjcmlwY2nDs24gcGVyc29uYWxpemFkYSBwYXJhIGRldGVjdGFyIGNhbWJpb3MgZGUgY2F0ZWdvcsOtYS9iw7pzcXVlZGFcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmFjdGl2ZVJvdXRlLnBhcmFtcywgdGhpcy5vcHRpb25zU2VydmljZS5yZWFkeSwgdGhpcy5hY3RpdmVSb3V0ZS5xdWVyeVBhcmFtc10pLnN1YnNjcmliZSgoW3BhcmFtcywgcmVhZHksIHF1ZXJ5UGFyYW1zXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVhZHkucmVhZHlBbGwgJiYgdGhpcy5zdWJzY3JpcHRpb25zQ29uZmlndXJlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHRoaXMuZ2VuZXJhdGVTdGF0ZUtleSgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBTaSBsYSBjbGF2ZSBjYW1iacOzLCBzaWduaWZpY2EgcXVlIG5hdmVnYW1vcyBhIHVuYSBjYXRlZ29yw61hIGRpZmVyZW50ZVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRLZXkgIT09IHRoaXMuc3RhdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBDYW1iaW8gZGUgY2F0ZWdvcsOtYSBkZXRlY3RhZG8sIGludmFsaWRhbmRvIGNhY2hlIHkgcmVjYXJnYW5kbycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVLZXkgPSBjdXJyZW50S2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExpbXBpYXIgY2FjaGUgeSByZWNhcmdhciBub3JtYWxtZW50ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2luZ0NhY2hlZFByb2R1Y3RzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxDYWNoZWRQcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc0Zyb21DYWNoZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElNUE9SVEFOVEU6IE1hcmNhciBxdWUgZXMgY2FtYmlvIGRlIGNhdGVnb3LDrWEgeSByZXNldGVhciBlc3RhZG9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlY2FyZ2FyIG5vcm1hbG1lbnRlIC0gcGVybyBzb2xvIGxhIHBldGljacOzbiwgbm8gcmVjb25maWd1cmFyIHN1c2NyaXBjaW9uZXNcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWROZXdDYXRlZ29yeShwYXJhbXMsIHF1ZXJ5UGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZE5ld0NhdGVnb3J5KHBhcmFtczogYW55LCBxdWVyeVBhcmFtczogYW55KTogdm9pZCB7XHJcbiAgICAgICAgLy8gSGFjZXIgc29sbyBsYSBwZXRpY2nDs24gZGUgcHJvZHVjdG9zIHNpbiByZWNvbmZpZ3VyYXIgdG9kYXMgbGFzIHN1c2NyaXBjaW9uZXNcclxuICAgICAgICBsZXQgY2FtYmlvID0gZmFsc2U7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXJhbXNbJ3R5cGUnXSB8fCAhcGFyYW1zWyd2YWx1ZSddKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzRm9yRmlsdGVyKHsgbGF0ZXN0OiB0cnVlLCBsaW1pdDogMTAgfSwgdGhpcy5vcHRpb25zRmlsdGVycywgcXVlcnlQYXJhbXMuc2VhcmNoLCB0aGlzLmRlZmF1bHRGaWx0ZXJzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IHR5cGU6IHBhcmFtcy50eXBlLCB2YWx1ZTogcGFyYW1zLnZhbHVlIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgIGNhbWJpbyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHBhcmFtc1sndHlwZSddO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyYW1zWyd2YWx1ZSddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBOdWV2YSBwZXRpY2nDs24gZW52aWFkYSBwYXJhIGNhdGVnb3LDrWE6JywgcGFyYW1zLnR5cGUsIHBhcmFtcy52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVN0YXRlS2V5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy8gSW5jbHVpciBydXRhIHkgcGFyw6FtZXRyb3MgcGFyYSBnZW5lcmFyIGNsYXZlIMO6bmljYVxyXG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF07IC8vIFNpbiBxdWVyeSBwYXJhbXNcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmFjdGl2ZVJvdXRlLnNuYXBzaG90LnBhcmFtcztcclxuICAgICAgICByZXR1cm4gYCR7cm91dGV9XyR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW52YWxpZGF0ZUNhY2hlKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIExpbXBpYXIgY2FjaGUgZXNwZWPDrWZpY28geSBzZXNzaW9uU3RvcmFnZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5eR77iPIEludmFsaWRhbmRvIGNhY2hlIHBhcmE6JywgdGhpcy5zdGF0ZUtleSk7XHJcbiAgICAgICAgQ29sbGVjdGlvbkVjQ29tcG9uZW50LnN0YXRlQ2FjaGUuZGVsZXRlKHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oYGNvbGxlY3Rpb25fc2Nyb2xsXyR7dGhpcy5zdGF0ZUtleX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVhbGl6YSB1biBzb3J0IGRlIHByb2R1Y3RvcyBwb3IgZWwgY2FtcG8gZGF0ZUNyZWF0ZSBkZSBsYSB2YXJpYW50ZVxyXG4gICAgICogQHBhcmFtIGEgUHJvZHVjdG8gYVxyXG4gICAgICogQHBhcmFtIGIgUHJvZHVjdG8gYlxyXG4gICAgICogQHBhcmFtIHR5cGUgc2kgZXMgYGFzY2AgfCBgZGVzY2BcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9ICoqMSoqIHBhcmEgYHRydWVgIHwgKiowKiogcGFyYSBgZmFsc2VgXHJcbiAgICAgKi9cclxuICAgIHNvcnRQcm9kdWN0cyA9IChhOmFueSwgYjphbnksIHR5cGU6c3RyaW5nPSdhc2MnKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQSA9IGEudmFyaWFudHMgJiYgYS52YXJpYW50cy5sZW5ndGggPiAwID8gYS52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQiA9IGIudmFyaWFudHMgJiYgYi52YXJpYW50cy5sZW5ndGggPiAwID8gYi52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYodG9Db21wYXJlQSAmJiB0b0NvbXBhcmVCKSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRlQSA9IG5ldyBEYXRlKHRvQ29tcGFyZUEpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUIgPSBuZXcgRGF0ZSh0b0NvbXBhcmVCKTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCh0eXBlKXtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2MnOiByZXR1cm4gKGRhdGVBID49IGRhdGVCKSA/IDEgOiAwOyBicmVha1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnYXNjJzogcmV0dXJuIChkYXRlQSA8PSBkYXRlQikgPyAxIDogMDsgYnJlYWtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIDBcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gYXBsaWNhIGVsIGZpbHRybyBlbiBsYSB2aXN0YS4gXHJcbiAgICAgKi9cclxuICAgIGFwcGx5RmlsdGVyc0luVmlldyA9ICgpID0+IHtcclxuICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckluVmlldz8ubm9VcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHRoaXMucHJvZHVjdHMuc29ydCgoYSwgYikgPT4gdGhpcy5zb3J0UHJvZHVjdHMoYSxiLHRoaXMuZmlsdGVySW5WaWV3LnZhbHVlKSlcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID1mYWxzZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTcGVjaWZpY0ZpbHRlcnMgPSAoZmlsdGVyczogRmlsdGVyW10sIHR5cGVzOiBGaWx0ZXJUeXBlW10pOiBGaWx0ZXJbXSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIHR5cGVzLmZvckVhY2godHlwZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRfZmlsdGVyID0gZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIudHlwZSgpID09IHR5cGUpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0X2ZpbHRlcikgcmVzdWx0LnB1c2gocmVzdWx0X2ZpbHRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBvblNjcm9sbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCkgJiYgIXRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldE5leHQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFyZVByb2R1Y3RzID0gKCkgPT4gdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAwO1xyXG4gICAgaXNXYWl0aW5nID0gKCkgPT4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCk7XHJcbiAgICBzZXRGaW5pc2hlZCA9ICgpID0+IHRoaXMuZmluaXNoZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICBjaGFuZ2VGaWx0ZXIgPSAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbGxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRBbGxQcm9kdWN0b3NUb0NhcnQgPSAocHJvZHVjdHMgPSBudWxsKSA9PiB7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW107XHJcbiAgICAgICAgKHByb2R1Y3RzIHx8IHRoaXMucHJvZHVjdHMpLm1hcChwcm9kID0+IHByb2QucHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50Lm1hcChwID0+IGl0ZW1zLnB1c2gocCkpKVxyXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSkubWFwKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSApXHJcbiAgICAgICAgaXRlbXM/Lmxlbmd0aCAmJiB0aGlzLmNhcnRTZXJ2aWNlLmFkZEFsbFRvQ2FydChpdGVtcylcclxuICAgIH1cclxuXHJcbiAgICBnZXRPYmplY3RXaXRoVmFyaWFudCA9ICgpOiBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHMuZ2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCgpXHJcbiAgICB9IFxyXG5cclxuICAgIC8vIE3DqXRvZG9zIGRlIGNpY2xvIGRlIHZpZGEgcmVxdWVyaWRvc1xyXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgICAgIC8vIFNvbG8gdmVyaWZpY2FyIHNpIGhheSB1biBzY3JvbGwgcGVuZGllbnRlXHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvZHVjdEVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvbC1sZy0zLCAuY29sLW1kLTQsIC5jb2wtNiwgW2NsYXNzKj1cInByb2R1Y3RcIl0sIC5wcm9kdWN0LWl0ZW0sIC5jYXJkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9kdWN0Q291bnQgPSBwcm9kdWN0RWxlbWVudHMubGVuZ3RoO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVmVyaWZpY2FyIHNpIHNlIGhhbiByZW5kZXJpemFkbyBzdWZpY2llbnRlcyBwcm9kdWN0b3NcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcm9kdWN0Q291bnQgPj0gTWF0aC5taW4odGhpcy5leHBlY3RlZFByb2R1Y3RDb3VudCwgMTApKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRQb3NpdGlvbiA9IHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsOyAvLyBMaW1waWFyIHBhcmEgZXZpdGFyIGxvb3BzXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFVzYXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHBhcmEgYXNlZ3VyYXIgcXVlIGVsIHJlbmRlcmluZyBlc3TDqSBjb21wbGV0b1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVTY3JvbGxXaXRoUmV0cmllcyh0YXJnZXRQb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQ3VycmVudFN0YXRlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTGltcGlhciBzY3JvbGwgcGVuZGllbnRlXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIExpbXBpYXIgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgaWYgKHRoaXMuY2xpY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja0hhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBNw6l0b2RvcyBkZSBtYW5lam8gZGUgc2Nyb2xsIHkgY2FjaGVcclxuICAgIHByaXZhdGUgc2V0dXBCZWZvcmVVbmxvYWRIYW5kbGVyKCkge1xyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIC8vIEludGVyY2VwdGFyIGNsaWNzIGVuIHByb2R1Y3RvcyBwYXJhIGd1YXJkYXIgZXN0YWRvXHJcbiAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVyID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAvLyBCdXNjYXIgc2kgZWwgY2xpYyBlcyBlbiB1biBlbmxhY2UgYSBwcm9kdWN0b1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluayA9IHRhcmdldC5jbG9zZXN0KCdhW2hyZWYqPVwiL3Byb2R1Y3QvXCJdJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobGluayAmJiB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy9jb2xsZWN0aW9uLycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfjq8gQ2xpYyBlbiBwcm9kdWN0byBkZXRlY3RhZG8sIGd1YXJkYW5kbyBlc3RhZG8nKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVDdXJyZW50U3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICAvLyBHdWFyZGFyIGR1cmFudGUgc2Nyb2xsIGVuIGxhIHDDoWdpbmEgZGUgY29sZWNjacOzblxyXG4gICAgICAgICAgICBsZXQgc2Nyb2xsVGltZXI6IGFueTtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFNvbG8gZ3VhcmRhciBzaSBlc3RhbW9zIGVuIHVuYSBww6FnaW5hIGRlIGNvbGVjY2nDs25cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy9jb2xsZWN0aW9uLycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zYXZlQ3VycmVudFN0YXRlKCksIDMwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gR3VhcmRhciBhbnRlcyBkZSBxdWUgZWwgdXN1YXJpbyBzYWxnYSBkZSBsYSBww6FnaW5hXHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCcvY29sbGVjdGlvbi8nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUN1cnJlbnRTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlQ3VycmVudFN0YXRlKCkge1xyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmIHRoaXMucHJvZHVjdHMgJiYgdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIE9idGVuZXIgcG9zaWNpw7NuIGRlIHNjcm9sbCBkZSBtw7psdGlwbGVzIGZ1ZW50ZXNcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsUG9zID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgfHwgMCxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgMCxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IDBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFNvbG8gZ3VhcmRhciBzaSB0ZW5lbW9zIHVuYSBwb3NpY2nDs24gc2lnbmlmaWNhdGl2YSBvIHByb2R1Y3RvcyBzdWZpY2llbnRlc1xyXG4gICAgICAgICAgICBpZiAoc2Nyb2xsUG9zID4gMTAgfHwgdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAxMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGU6IENvbGxlY3Rpb25TdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0czogWy4uLnRoaXMucHJvZHVjdHNdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiBzY3JvbGxQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuZmluaXNoZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZzogdGhpcy5sb2FkaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IE1hdGguY2VpbCh0aGlzLnByb2R1Y3RzLmxlbmd0aCAvIDEwKSxcclxuICAgICAgICAgICAgICAgICAgICBhbGxDYWNoZWRQcm9kdWN0czogdGhpcy51c2luZ0NhY2hlZFByb2R1Y3RzID8gWy4uLnRoaXMuYWxsQ2FjaGVkUHJvZHVjdHNdIDogWy4uLnRoaXMucHJvZHVjdHNdLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyA/IFsuLi50aGlzLmZpbHRlcnNdIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnNfdG9wOiB0aGlzLmZpbHRlcnNfdG9wID8gWy4uLnRoaXMuZmlsdGVyc190b3BdIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFkY3J1bWI6IHRoaXMuYnJlYWRjcnVtYiA/IFsuLi50aGlzLmJyZWFkY3J1bWJdIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIENvbGxlY3Rpb25FY0NvbXBvbmVudC5zdGF0ZUNhY2hlLnNldCh0aGlzLnN0YXRlS2V5LCBzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFRhbWJpw6luIGd1YXJkYXIgZW4gc2Vzc2lvblN0b3JhZ2UgY29tbyBiYWNrdXBcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShgY29sbGVjdGlvbl9zY3JvbGxfJHt0aGlzLnN0YXRlS2V5fWAsIHNjcm9sbFBvcy50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGBjb2xsZWN0aW9uX3Byb2R1Y3RzXyR7dGhpcy5zdGF0ZUtleX1gLCB0aGlzLnByb2R1Y3RzLmxlbmd0aC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXN0b3JlU2Nyb2xsV2l0aFJldHJpZXModGFyZ2V0UG9zaXRpb246IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVmVyaWZpY2FyIHNpIGVsIHRhcmdldCBlcyBtYXlvciBxdWUgbGEgYWx0dXJhIGRlbCBkb2N1bWVudG9cclxuICAgICAgICBjb25zdCBkb2N1bWVudEhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgaWYgKHRhcmdldFBvc2l0aW9uID4gZG9jdW1lbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBNYXRoLm1heCgwLCBkb2N1bWVudEhlaWdodCAtIHdpbmRvdy5pbm5lckhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNvbG8gdmVyaWZpY2FyIHNpIGVsIHVzdWFyaW8gaGEgaGVjaG8gc2Nyb2xsIG11eSBsZWpvc1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICBpZiAoY3VycmVudFBvcyA+IDUwMCAmJiBNYXRoLmFicyhjdXJyZW50UG9zIC0gdGFyZ2V0UG9zaXRpb24pID4gMTAwMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEludGVudGFyIGVuY29udHJhciB1bmEgcG9zaWNpw7NuIG3DoXMgcHJlY2lzYSBiYXNhZGEgZW4gZWxlbWVudG9zIGRlbCBET01cclxuICAgICAgICBjb25zdCBpbXByb3ZlZFBvc2l0aW9uID0gdGhpcy50cnlTY3JvbGxUb1Byb2R1Y3RCeUluZGV4KHRhcmdldFBvc2l0aW9uKTtcclxuICAgICAgICBpZiAoaW1wcm92ZWRQb3NpdGlvbiAhPT0gdGFyZ2V0UG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBpbXByb3ZlZFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xyXG4gICAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgdHJ5U2Nyb2xsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBhdHRlbXB0cysrO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVXNhciBzY3JvbGwgbcOhcyBhZ3Jlc2l2byBzaSBlcyBuZWNlc2FyaW9cclxuICAgICAgICAgICAgaWYgKGF0dGVtcHRzIDwgMykge1xyXG4gICAgICAgICAgICAgICAgLy8gUHJpbWVyb3MgaW50ZW50b3MgY29uIHNtb290aFxyXG4gICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IHRhcmdldFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbnRlbnRvcyBwb3N0ZXJpb3JlcyBtw6FzIGRpcmVjdG9zXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgdGFyZ2V0UG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IHRhcmdldFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSB0YXJnZXRQb3NpdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVmVyaWZpY2FyIGRlc3B1w6lzIGRlIHVuIG1vbWVudG9cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UG9zID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoY3VycmVudFBvcyAtIHRhcmdldFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPiA1MCAmJiBhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBhdHRlbXB0cyA8IDUgPyAxMDAgOiBhdHRlbXB0cyA8IDEwID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodHJ5U2Nyb2xsLCBkZWxheSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsgLy8gTGliZXJhciBmbGFnIGN1YW5kbyB0ZXJtaW5lXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBJbnRlbnRhciBzb2xvIHVuYSB2ZXogaW5pY2lhbG1lbnRlXHJcbiAgICAgICAgdHJ5U2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cnlTY3JvbGxUb1Byb2R1Y3RCeUluZGV4KHRhcmdldFBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgICAgICAvLyBJbnRlbnRhciBjYWxjdWxhciBhIHF1w6kgcHJvZHVjdG8gY29ycmVzcG9uZGUgbGEgcG9zaWNpw7NuXHJcbiAgICAgICAgY29uc3QgYXBwcm94aW1hdGVJbmRleCA9IE1hdGguZmxvb3IodGFyZ2V0UG9zaXRpb24gLyA0MDApOyAvLyBBc3VtaWVuZG8gfjQwMHB4IHBvciBwcm9kdWN0b1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEJ1c2NhciBlbGVtZW50b3MgZGUgcHJvZHVjdG9cclxuICAgICAgICBjb25zdCBwcm9kdWN0RWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29sLWxnLTMsIC5jb2wtbWQtNCwgLmNvbC02LCBbY2xhc3MqPVwicHJvZHVjdFwiXSwgLnByb2R1Y3QtaXRlbSwgLmNhcmQnKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAocHJvZHVjdEVsZW1lbnRzLmxlbmd0aCA+IGFwcHJveGltYXRlSW5kZXggJiYgYXBwcm94aW1hdGVJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBwcm9kdWN0RWxlbWVudHNbYXBwcm94aW1hdGVJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IHRhcmdldEVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVXNhciBsYSBwb3NpY2nDs24gZGVsIGVsZW1lbnRvIHNpIGVzIHJhem9uYWJsZVxyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZWxlbWVudFBvc2l0aW9uIC0gdGFyZ2V0UG9zaXRpb24pIDwgODAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFBvc2l0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0YXJnZXRQb3NpdGlvbjsgLy8gVXNhciBwb3NpY2nDs24gb3JpZ2luYWwgc2kgbm8gZW5jdWVudHJhIGVsZW1lbnRvIGFkZWN1YWRvXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3YWl0Rm9yUHJvZHVjdFJlbmRlcmluZyh0YXJnZXRQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gQ29uZmlndXJhciBlbCBzY3JvbGwgcGVuZGllbnRlIHBhcmEgcXVlIG5nQWZ0ZXJWaWV3Q2hlY2tlZCBsbyBtYW5lamVcclxuICAgICAgICB0aGlzLnBlbmRpbmdTY3JvbGxQb3NpdGlvbiA9IHRhcmdldFBvc2l0aW9uO1xyXG4gICAgICAgIHRoaXMuZXhwZWN0ZWRQcm9kdWN0Q291bnQgPSB0aGlzLnByb2R1Y3RzPy5sZW5ndGggfHwgMDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBUaW1lb3V0IGRlIHNlZ3VyaWRhZCBlbiBjYXNvIGRlIHF1ZSBuZ0FmdGVyVmlld0NoZWNrZWQgbm8gc2UgZWplY3V0ZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvcyA9IHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2Nyb2xsV2l0aFJldHJpZXModGFyZ2V0UG9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMjAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTcOpdG9kbyBwZXJzb25hbGl6YWRvIHBhcmEgbWFuZWphciBzZWxlY2Npw7NuIGRlIGZpbHRyb3MgcXVlIGludmFsaWRhcsOhIGNhY2hlXHJcbiAgICBjdXN0b21TZXRGaWx0ZXJTZWxlY3RlZCA9IChmaWx0ZXIsIGZpbHRlckVsZW1lbnQpID0+IHtcclxuICAgICAgICAvLyBJbnZhbGlkYXIgY2FjaGUgY29tcGxldGFtZW50ZSBjdWFuZG8gc2Ugc2VsZWNjaW9uYSB1biBmaWx0cm9cclxuICAgICAgICB0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFsbENhY2hlZFByb2R1Y3RzID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gZmFsc2U7IC8vIFlhIG5vIHVzYW1vcyBmaWx0cm9zIGRlbCBjYWNoZVxyXG4gICAgICAgIHRoaXMuaXNDYXRlZ29yeUNoYW5nZSA9IHRydWU7IC8vIE1hcmNhciBjb21vIGNhbWJpbyBwYXJhIHJlZW1wbGF6YXIgcHJvZHVjdG9zXHJcbiAgICAgICAgQ29sbGVjdGlvbkVjQ29tcG9uZW50LnN0YXRlQ2FjaGUuZGVsZXRlKHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SEIEZpbHRybyBzZWxlY2Npb25hZG8sIGludmFsaWRhbmRvIGNhY2hlIHkgcmVjYXJnYW5kbyBkZXNkZSBlbmRwb2ludCBwYXJhOicsIHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNvbG8gbGltcGlhciBwcm9kdWN0b3MsIE5PIGxpbXBpYXIgZmlsdHJvcyBwYXJhIHF1ZSBubyBkZXNhcGFyZXpjYW5cclxuICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBMbGFtYXIgYWwgbcOpdG9kbyBvcmlnaW5hbCBkZWwgUHJvZHVjdHNTZXJ2aWNlIHF1ZSBpbmljaWFyw6EgdW5hIGNhcmdhIGNvbXBsZXRhXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9kdWN0c1NlcnZpY2Uuc2V0RmlsdGVyU2VsZWN0ZWQoZmlsdGVyLCBmaWx0ZXJFbGVtZW50KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBMYSBzdXNjcmlwY2nDs24gcHJpbmNpcGFsIGF1dG9tw6F0aWNhbWVudGUgYWN0dWFsaXphcsOhIGxvcyBmaWx0cm9zXHJcbiAgICAgICAgLy8gcG9ycXVlIGZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZSB5IHVzaW5nQ2FjaGVkUHJvZHVjdHMgPSBmYWxzZVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NvbGxlY3Rpb24tZWMvY29sbGVjdGlvbi1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxpR0FBaUc7QUFDakcsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBUTNFO0lBQTJDLHlDQUFlO0lBc0J0RCwrQkFBbUIsZUFBZ0MsRUFDckMsU0FBNEIsRUFDNUIsV0FBMkIsRUFDM0IsY0FBOEIsRUFDakMsV0FBd0IsRUFDdkIsZ0JBQWtDLEVBQ25DLFdBQXdCLEVBQ3hCLE1BQWlCLEVBQ2pCLGNBQThCO1FBUnpDLFlBU0ksaUJBQU8sU0FNVjtRQWZrQixxQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDckMsZUFBUyxHQUFULFNBQVMsQ0FBbUI7UUFDNUIsaUJBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzNCLG9CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNqQyxpQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN2QixzQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ25DLGlCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFlBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsb0JBQWMsR0FBZCxjQUFjLENBQWdCO1FBNUJsQyxhQUFPLEdBQWEsRUFBRSxDQUFDO1FBR3RCLG1CQUFhLEdBQWlCLEVBQUMsT0FBTyxFQUFDLEVBQUUsRUFBQyxDQUFDO1FBRzVDLGNBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsYUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGdCQUFVLEdBQWEsRUFBRSxDQUFBO1FBQ3pCLGtCQUFZLEdBQUcsSUFBSSxDQUFDO1FBT2xCLCtCQUF5QixHQUFZLEtBQUssQ0FBQztRQUMzQyxvQkFBYyxHQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBcUZoRDs7Ozs7O1dBTUc7UUFDSCxrQkFBWSxHQUFHLFVBQUMsQ0FBSyxFQUFFLENBQUssRUFBRSxJQUFpQjtZQUFqQixxQkFBQSxFQUFBLFlBQWlCO1lBQzNDLEtBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUUxRixJQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUU7Z0JBQ3pCLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFakMsUUFBTyxJQUFJLEVBQUM7b0JBQ1IsS0FBSyxNQUFNO3dCQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUFDLE1BQUs7b0JBQ25ELEtBQUssS0FBSzt3QkFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFBQyxNQUFLO29CQUNsRCxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtpQkFDcEI7YUFDSjtpQkFBSTtnQkFDRCxPQUFPLENBQUMsQ0FBQTthQUNYO1FBQ0wsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCx3QkFBa0IsR0FBRzs7WUFFakIsVUFBSSxLQUFJLENBQUMsWUFBWSwwQ0FBRSxLQUFLLEVBQUU7Z0JBQzFCLEtBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQTlDLENBQThDLENBQUMsQ0FBQTtnQkFDNUYsS0FBSSxDQUFDLE9BQU8sR0FBRSxLQUFLLENBQUE7YUFDdEI7UUFDTCxDQUFDLENBQUE7UUFFRCx3QkFBa0IsR0FBRyxVQUFDLE9BQWlCLEVBQUUsS0FBbUI7WUFDeEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO2dCQUNkLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFyQixDQUFxQixDQUFDLENBQUM7Z0JBQ2xFLElBQUksYUFBYTtvQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQTtRQVVELGlCQUFXLEdBQUcsY0FBTSxPQUFBLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBeEIsQ0FBd0IsQ0FBQztRQUM3QyxlQUFTLEdBQUcsY0FBTSxPQUFBLEtBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEVBQWhDLENBQWdDLENBQUM7UUFDbkQsaUJBQVcsR0FBRyxjQUFNLE9BQUEsS0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQXBCLENBQW9CLENBQUM7UUFHekMsa0JBQVksR0FBRyxVQUFDLENBQUM7WUFDYixJQUFJLENBQUMsS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDcEIsS0FBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDNUI7UUFDTCxDQUFDLENBQUE7UUFFRCwyQkFBcUIsR0FBRyxVQUFDLFFBQWU7WUFBZix5QkFBQSxFQUFBLGVBQWU7O1lBQ3BDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLENBQUMsUUFBUSxJQUFJLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBYixDQUFhLENBQUMsRUFBckQsQ0FBcUQsQ0FBQyxDQUFBO1lBQzlGLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLGlCQUFpQixFQUF0QixDQUFzQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLGlCQUFpQixFQUF0QixDQUFzQixDQUFFLENBQUE7WUFDekYsT0FBQSxLQUFLLDBDQUFFLE1BQU0sS0FBSSxLQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN6RCxDQUFDLENBQUE7UUFFRCwwQkFBb0IsR0FBRztZQUNuQixPQUFPLEtBQUksQ0FBQyxNQUFNLENBQUMsa0NBQWtDLEVBQUUsQ0FBQTtRQUMzRCxDQUFDLENBQUE7UUFwSkcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQW5CLENBQW1CLENBQUMsQ0FBQTtRQUNqRSxLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNyRCxLQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQzFELEtBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBRSxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxFQUF2QixDQUF1QixDQUFDLENBQUE7UUFDOUUsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFBOztJQUN4QixDQUFDO0lBRUQsd0NBQVEsR0FBUjtRQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUNmLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDRCx1REFBdUIsR0FBdkI7UUFBQSxpQkEwREM7UUF6REcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFDLEVBQTRCO2dCQUE1QixrQkFBNEIsRUFBM0IsY0FBTSxFQUFFLGFBQUssRUFBRSxtQkFBVztZQUNwSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hCLElBQUksUUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDbkIsS0FBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3JDLEtBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUN4STtxQkFDSTtvQkFDRCxLQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUNySixRQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNkLEtBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQixLQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDaEM7Z0JBQ0QsSUFBSTtvQkFBRSxLQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUFFO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUc7Z0JBQUEsQ0FBQztnQkFDdEQsS0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ3ZELFVBQUEsR0FBRzs7b0JBQ0MsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3JCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7d0JBQ2pCLEtBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO3dCQUNuQixLQUFJLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7cUJBQ3JEO3lCQUFNO3dCQUNILElBQUksS0FBSSxDQUFDLHlCQUF5QixFQUFFOzRCQUNoQyxJQUFJLFFBQU0sRUFBRTtnQ0FDUixLQUFJLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLEtBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFFLENBQUM7Z0NBQ3JHLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO2dDQUN6QixRQUFNLEdBQUcsS0FBSyxDQUFDOzZCQUNsQjtpQ0FDSTtnQ0FDRCxHQUFHLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsS0FBSSxDQUFDLG9CQUFvQixFQUFFLENBQUUsQ0FBQztnQ0FDM0YsQ0FBQSxLQUFBLEtBQUksQ0FBQyxRQUFRLENBQUEsQ0FBQyxJQUFJLG9CQUFJLEdBQUcsR0FBQztnQ0FDMUIsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7NkJBQzdCOzRCQUFBLENBQUM7eUJBQ0w7NkJBQU07NEJBQ0gsSUFBSSxRQUFNLEVBQUU7Z0NBQ1IsS0FBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7Z0NBQ3BCLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dDQUMxQixRQUFNLEdBQUcsS0FBSyxDQUFDOzZCQUNsQjtpQ0FDSTtnQ0FDRCxDQUFBLEtBQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQSxDQUFDLElBQUksb0JBQUksR0FBRyxHQUFFO2dDQUMzQixLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs2QkFFN0I7eUJBRUo7cUJBQ0o7b0JBQ0QsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ2pJLENBQUMsQ0FBQyxDQUFDO2dCQUNQLEtBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFBLEdBQUc7b0JBQ3ZDLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEUsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3hFLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzlELENBQUMsQ0FBQyxDQUFDO2dCQUNILEtBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEVBQW5CLENBQW1CLENBQUMsQ0FBQztnQkFDdEUsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFDeEI7UUFDTCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFpREQsd0NBQVEsR0FBUjtRQUNJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN4QjtJQUNMLENBQUM7O2dCQXhJbUMsZUFBZTtnQkFDMUIsaUJBQWlCO2dCQUNmLGNBQWM7Z0JBQ1gsY0FBYztnQkFDcEIsV0FBVztnQkFDTCxnQkFBZ0I7Z0JBQ3RCLFdBQVc7Z0JBQ2hCLFNBQVM7Z0JBQ0QsY0FBYzs7SUFiaEM7UUFBUixLQUFLLEVBQUU7dURBQU07SUFDTDtRQUFSLEtBQUssRUFBRTt3REFBTztJQUNOO1FBQVIsS0FBSyxFQUFFOzRFQUE0QztJQUMzQztRQUFSLEtBQUssRUFBRTtpRUFBd0M7SUFwQnZDLHFCQUFxQjtRQUxqQyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLG1UQUE2Qzs7U0FFaEQsQ0FBQztPQUNXLHFCQUFxQixDQXNMakM7SUFBRCw0QkFBQztDQUFBLEFBdExELENBQTJDLGVBQWUsR0FzTHpEO1NBdExZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGaWx0ZXJFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maWx0ZXInO1xyXG4vLyBpbXBvcnQgeyBDb25zdGFudHMsIEZpbHRlciwgT3B0aW9uc1NlcnZpY2UsIFByb2R1Y3QsIFByb2R1Y3RzU2VydmljZSB9IGZyb20gJ25nLWVhc3ljb21tZXJjZSc7XHJcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xyXG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2ZpbHRlcnMvRmlsdGVyJztcclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29yZS5jb25zdHMnO1xyXG5pbXBvcnQgeyBEZWZhdWx0RmlsdGVyLCBGaWx0ZXJDb25maWcsIEZpbHRlclR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ZpbHRlcic7XHJcbmltcG9ydCB7IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BhcmFtc0ludGVyZmFjZXMvcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCc7XHJcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Byb2R1Y3QnO1xyXG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsdGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWx0ZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPcHRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL29wdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFyYW1ldGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJvZHVjdHMvcHJvZHVjdHMuc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1jb2xsZWN0aW9uLWVjJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb2xsZWN0aW9uLWVjLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NvbGxlY3Rpb24tZWMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBmaWx0ZXJzX3RvcDogRmlsdGVyW107XHJcbiAgICBwcml2YXRlIGRlZmF1bHRGaWx0ZXJzOiBEZWZhdWx0RmlsdGVyW107XHJcbiAgICBwcml2YXRlIGZpbHRlcnNDb25maWc6IEZpbHRlckNvbmZpZyA9IHtmaWx0ZXJzOltdfTtcclxuICAgIC8vIHB1YmxpYyBvcHRpb25zRmlsdGVyczogWydhbGwnXTtcclxuICAgIHB1YmxpYyBwcm9kdWN0czogUHJvZHVjdFtdO1xyXG4gICAgcHVibGljIGZpbmlzaGVkID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgc3VzY3JpcGNpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBicmVhZGNydW1iOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBwdWJsaWMgaXNDb2xsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwYXJhbXM6IGFueTtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVySW5WaWV3OkZpbHRlckVsZW1lbnQ7XHJcblxyXG4gICAgQElucHV0KCkgdHlwZTtcclxuICAgIEBJbnB1dCgpIHZhbHVlO1xyXG4gICAgQElucHV0KCkgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgb3B0aW9uc0ZpbHRlcnM6IEZpbHRlclR5cGVbXSA9IFsnYWxsJ107XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBwYXJhbXNTcnY6IFBhcmFtZXRlcnNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJvdGVjdGVkIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvbnN0YW50cyxcclxuICAgICAgICBwdWJsaWMgZmlsdGVyc1NlcnZpY2U6IEZpbHRlcnNTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhcmFtc1Nydi5wYXJhbWV0ZXJzLnN1YnNjcmliZShwYXJhbSA9PiB0aGlzLnBhcmFtcyA9IHBhcmFtKVxyXG4gICAgICAgIHRoaXMuZGVmYXVsdEZpbHRlcnMgPSB0aGlzLmNvbnN0cy5nZXREZWZhdWx0RmlsdGVycygpXHJcbiAgICAgICAgdGhpcy5maWx0ZXJzQ29uZmlnLmZpbHRlcnMgPSB0aGlzLmNvbnN0cy5nZXRGaWx0ZXJDb25maWcoKVxyXG4gICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmZpbHRlcnNJblZpZXckLnN1YnNjcmliZSggcmVzID0+IHRoaXMuZmlsdGVySW5WaWV3ID0gcmVzKVxyXG4gICAgICAgIHRoaXMuZWNPbkNvbnN0cnVjdCgpXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKTtcclxuICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXHJcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0UHJvZHVjdHNBbmRTdWJzY3JpYmUoKTogdm9pZCB7XHJcbiAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5hY3RpdmVSb3V0ZS5wYXJhbXMsIHRoaXMub3B0aW9uc1NlcnZpY2UucmVhZHksIHRoaXMuYWN0aXZlUm91dGUucXVlcnlQYXJhbXNdKS5zdWJzY3JpYmUoKFtwYXJhbXMsIHJlYWR5LCBxdWVyeVBhcmFtc10pID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlYWR5LnJlYWR5QWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2FtYmlvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1sndHlwZSddIHx8ICFwYXJhbXNbJ3ZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IGxhdGVzdDogdHJ1ZSwgbGltaXQ6IDEwIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IHR5cGU6IHBhcmFtcy50eXBlLCB2YWx1ZTogcGFyYW1zLnZhbHVlIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgIHRoaXMuZGVmYXVsdEZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gcGFyYW1zWyd0eXBlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhcmFtc1sndmFsdWUnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRyeSB7IHRoaXMuc3VzY3JpcGNpb24udW5zdWJzY3JpYmUoKTsgfSBjYXRjaCAoZSkgeyB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdXNjcmlwY2lvbiA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLnByb2R1Y3RzJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5pc0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4ucmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW1iaW8pIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSByZXM7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1iaW8gPSBmYWxzZTsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4ucmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNJblZpZXcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtX2xpc3QnLCB7IHByb2R1Y3RzOiB0aGlzLnByb2R1Y3RzLCBpdGVtX2xpc3RfbmFtZTogJ0NvbGxlY3Rpb24nLCBpdGVtX2xpc3RfaWQ6IDAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmZpbHRlcnMkLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYiA9IHRoaXMub3B0aW9uc1NlcnZpY2UuZ2V0QnJlYWRjcnVtYkJ5RmlsdGVycyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgdGhpcy5maWx0ZXJzQ29uZmlnLmZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc190b3AgPSB0aGlzLmdldFNwZWNpZmljRmlsdGVycyhyZXMsIFsnc29ydCddKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmluaXNoZWQoKS5zdWJzY3JpYmUocmVzID0+IHRoaXMuZmluaXNoZWQgPSByZXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlYWxpemEgdW4gc29ydCBkZSBwcm9kdWN0b3MgcG9yIGVsIGNhbXBvIGRhdGVDcmVhdGUgZGUgbGEgdmFyaWFudGVcclxuICAgICAqIEBwYXJhbSBhIFByb2R1Y3RvIGFcclxuICAgICAqIEBwYXJhbSBiIFByb2R1Y3RvIGJcclxuICAgICAqIEBwYXJhbSB0eXBlIHNpIGVzIGBhc2NgIHwgYGRlc2NgXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAqKjEqKiBwYXJhIGB0cnVlYCB8ICoqMCoqIHBhcmEgYGZhbHNlYFxyXG4gICAgICovXHJcbiAgICBzb3J0UHJvZHVjdHMgPSAoYTphbnksIGI6YW55LCB0eXBlOnN0cmluZz0nYXNjJykgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgbGV0IHRvQ29tcGFyZUEgPSBhLnZhcmlhbnRzICYmIGEudmFyaWFudHMubGVuZ3RoID4gMCA/IGEudmFyaWFudHNbMF1bJ2RhdGVDcmVhdGUnXSA6IG51bGw7XHJcbiAgICAgICAgbGV0IHRvQ29tcGFyZUIgPSBiLnZhcmlhbnRzICYmIGIudmFyaWFudHMubGVuZ3RoID4gMCA/IGIudmFyaWFudHNbMF1bJ2RhdGVDcmVhdGUnXSA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmKHRvQ29tcGFyZUEgJiYgdG9Db21wYXJlQikge1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUEgPSBuZXcgRGF0ZSh0b0NvbXBhcmVBKTtcclxuICAgICAgICAgICAgbGV0IGRhdGVCID0gbmV3IERhdGUodG9Db21wYXJlQik7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2godHlwZSl7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkZXNjJzogcmV0dXJuIChkYXRlQSA+PSBkYXRlQikgPyAxIDogMDsgYnJlYWtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2FzYyc6IHJldHVybiAoZGF0ZUEgPD0gZGF0ZUIpID8gMSA6IDA7IGJyZWFrXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAwXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGFwbGljYSBlbCBmaWx0cm8gZW4gbGEgdmlzdGEuIFxyXG4gICAgICovXHJcbiAgICBhcHBseUZpbHRlcnNJblZpZXcgPSAoKSA9PiB7XHJcbiAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJJblZpZXc/Lm5vVXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSB0aGlzLnByb2R1Y3RzLnNvcnQoKGEsIGIpID0+IHRoaXMuc29ydFByb2R1Y3RzKGEsYix0aGlzLmZpbHRlckluVmlldy52YWx1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9ZmFsc2VcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3BlY2lmaWNGaWx0ZXJzID0gKGZpbHRlcnM6IEZpbHRlcltdLCB0eXBlczogRmlsdGVyVHlwZVtdKTogRmlsdGVyW10gPT4ge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcclxuICAgICAgICB0eXBlcy5mb3JFYWNoKHR5cGUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0X2ZpbHRlciA9IGZpbHRlcnMuZmluZChmaWx0ZXIgPT4gZmlsdGVyLnR5cGUoKSA9PSB0eXBlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdF9maWx0ZXIpIHJlc3VsdC5wdXNoKHJlc3VsdF9maWx0ZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgb25TY3JvbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBpZiAoIXRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzV2FpdGluZygpICYmICF0aGlzLnByb2R1Y3RzU2VydmljZS5nZXROZXh0KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcmVQcm9kdWN0cyA9ICgpID0+IHRoaXMucHJvZHVjdHMubGVuZ3RoID4gMDtcclxuICAgIGlzV2FpdGluZyA9ICgpID0+IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzV2FpdGluZygpO1xyXG4gICAgc2V0RmluaXNoZWQgPSAoKSA9PiB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgY2hhbmdlRmlsdGVyID0gKGUpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb2xsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQWxsUHJvZHVjdG9zVG9DYXJ0ID0gKHByb2R1Y3RzID0gbnVsbCkgPT4ge1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtdO1xyXG4gICAgICAgIChwcm9kdWN0cyB8fCB0aGlzLnByb2R1Y3RzKS5tYXAocHJvZCA9PiBwcm9kLnByb2R1Y3RXaXRoVW5pcXVlVmFyaWFudC5tYXAocCA9PiBpdGVtcy5wdXNoKHApKSlcclxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihwcm9kID0+IHByb2QucHJvZHVjdFRvQ2FydEl0ZW0pLm1hcChwcm9kID0+IHByb2QucHJvZHVjdFRvQ2FydEl0ZW0gKVxyXG4gICAgICAgIGl0ZW1zPy5sZW5ndGggJiYgdGhpcy5jYXJ0U2VydmljZS5hZGRBbGxUb0NhcnQoaXRlbXMpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T2JqZWN0V2l0aFZhcmlhbnQgPSAoKTogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RzLmdldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQoKVxyXG4gICAgfSBcclxuXHJcbn1cclxuIl19