ng-miam 3.2.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/bundles/ng-miam.umd.js +7452 -5975
  2. package/bundles/ng-miam.umd.js.map +1 -1
  3. package/bundles/ng-miam.umd.min.js +2 -2
  4. package/bundles/ng-miam.umd.min.js.map +1 -1
  5. package/esm2015/lib/_components/abstracts/abstract-recipe-card.component.js +1 -1
  6. package/esm2015/lib/_components/icon/icon.component.js +65 -6
  7. package/esm2015/lib/_components/recipe-filters/recipe-filters.component.js +94 -40
  8. package/esm2015/lib/_components/recipe-type-chooser/recipe-type-chooser.component.js +23 -30
  9. package/esm2015/lib/_components/text-input/text-input.component.js +6 -4
  10. package/esm2015/lib/_models/article.js +43 -0
  11. package/esm2015/lib/_models/basket.js +2 -2
  12. package/esm2015/lib/_models/groceries-entry.js +23 -2
  13. package/esm2015/lib/_models/groceries-list.js +5 -2
  14. package/esm2015/lib/_models/index.js +4 -1
  15. package/esm2015/lib/_models/package.js +14 -3
  16. package/esm2015/lib/_models/recipe.js +4 -1
  17. package/esm2015/lib/_models/user.js +10 -1
  18. package/esm2015/lib/_services/analytics.service.js +7 -1
  19. package/esm2015/lib/_services/articles.service.js +21 -0
  20. package/esm2015/lib/_services/baskets.service.js +7 -3
  21. package/esm2015/lib/_services/context.service.js +15 -1
  22. package/esm2015/lib/_services/groceries-lists.service.js +23 -6
  23. package/esm2015/lib/_services/index.js +3 -1
  24. package/esm2015/lib/_services/ingredients.service.js +2 -2
  25. package/esm2015/lib/_services/interceptor.service.js +2 -3
  26. package/esm2015/lib/_services/package.service.js +32 -9
  27. package/esm2015/lib/_services/recipe-events.service.js +2 -2
  28. package/esm2015/lib/_services/recipe-likes.service.js +6 -2
  29. package/esm2015/lib/_services/recipe-share.service.js +2 -2
  30. package/esm2015/lib/_services/recipes.service.js +2 -2
  31. package/esm2015/lib/_services/suppliers.service.js +2 -2
  32. package/esm2015/lib/_services/toastr.service.js +52 -0
  33. package/esm2015/lib/_services/user.service.js +64 -21
  34. package/esm2015/lib/_types/icon.enum.js +22 -18
  35. package/esm2015/lib/_web-components/{basket-preview-block → basket-preview/basket-preview-block}/basket-preview-block.component.js +15 -15
  36. package/esm2015/lib/_web-components/{basket-preview-disabled → basket-preview/basket-preview-disabled}/basket-preview-disabled.component.js +3 -3
  37. package/esm2015/lib/_web-components/{basket-preview-line → basket-preview/basket-preview-line}/basket-preview-line.component.js +22 -19
  38. package/esm2015/lib/_web-components/basket-preview/basket-preview.module.js +78 -0
  39. package/esm2015/lib/_web-components/basket-preview/index.js +7 -0
  40. package/esm2015/lib/_web-components/{replace-item → basket-preview/replace-item}/replace-item.component.js +8 -8
  41. package/esm2015/lib/_web-components/catalog-article-card/catalog-article-card.component.js +71 -0
  42. package/esm2015/lib/_web-components/catalog-category/catalog-category.component.js +134 -92
  43. package/esm2015/lib/_web-components/catalog-header/catalog-header.component.js +51 -34
  44. package/esm2015/lib/_web-components/catalog-list/catalog-list.component.js +106 -61
  45. package/esm2015/lib/_web-components/catalog-recipe-card/catalog-recipe-card.component.js +65 -52
  46. package/esm2015/lib/_web-components/drawer/drawer.component.js +1 -1
  47. package/esm2015/lib/_web-components/favorite-page/favorite-page.component.js +8 -6
  48. package/esm2015/lib/_web-components/index.js +5 -6
  49. package/esm2015/lib/_web-components/list-scan/basket-preview/basket-preview.component.js +145 -0
  50. package/esm2015/lib/_web-components/list-scan/index.js +3 -0
  51. package/esm2015/lib/_web-components/list-scan/ingredients-list/ingredients-list.component.js +150 -0
  52. package/esm2015/lib/_web-components/list-scan/list-scan.component.js +87 -0
  53. package/esm2015/lib/_web-components/list-scan/list-scan.module.js +60 -0
  54. package/esm2015/lib/_web-components/list-scan/overlay-button/overlay-button.component.js +104 -0
  55. package/esm2015/lib/_web-components/loader/index.js +3 -0
  56. package/esm2015/lib/_web-components/loader/loader.module.js +39 -0
  57. package/esm2015/lib/_web-components/personal-recipes/personal-recipes.component.js +7 -5
  58. package/esm2015/lib/_web-components/recipe-card/recipe-card.component.js +73 -58
  59. package/esm2015/lib/_web-components/recipe-catalog/recipe-catalog.component.js +152 -92
  60. package/esm2015/lib/_web-components/recipe-details/recipe-details.component.js +307 -270
  61. package/esm2015/lib/_web-components/recipe-modal/recipe-modal.component.js +1 -1
  62. package/esm2015/lib/_web-components/recipe-stepper/recipe-stepper.component.js +1 -1
  63. package/esm2015/lib/_web-components/recipes-history/recipes-history.component.js +1 -1
  64. package/esm2015/lib/_web-components/suggestion-card/suggestion-card.component.js +3 -6
  65. package/esm2015/lib/_web-components/web-components.module.js +35 -65
  66. package/esm2015/lib/environments/environment.js +6 -0
  67. package/esm2015/lib/ng-miam.module.js +4 -4
  68. package/fesm2015/ng-miam.js +6540 -5287
  69. package/fesm2015/ng-miam.js.map +1 -1
  70. package/lib/_components/abstracts/abstract-recipe-card.component.d.ts +1 -1
  71. package/lib/_components/recipe-filters/recipe-filters.component.d.ts +14 -4
  72. package/lib/_components/recipe-type-chooser/recipe-type-chooser.component.d.ts +2 -2
  73. package/lib/_components/text-input/text-input.component.d.ts +2 -1
  74. package/lib/_models/article.d.ts +23 -0
  75. package/lib/_models/basket.d.ts +1 -2
  76. package/lib/_models/groceries-entry.d.ts +8 -1
  77. package/lib/_models/groceries-list.d.ts +4 -3
  78. package/lib/_models/index.d.ts +3 -0
  79. package/lib/_models/package.d.ts +10 -3
  80. package/lib/_models/recipe.d.ts +1 -0
  81. package/lib/_models/user.d.ts +16 -1
  82. package/lib/_services/articles.service.d.ts +10 -0
  83. package/lib/_services/context.service.d.ts +12 -6
  84. package/lib/_services/groceries-lists.service.d.ts +4 -1
  85. package/lib/_services/index.d.ts +2 -0
  86. package/lib/_services/package.service.d.ts +6 -1
  87. package/lib/_services/toastr.service.d.ts +10 -0
  88. package/lib/_services/user.service.d.ts +12 -6
  89. package/lib/_types/icon.enum.d.ts +21 -17
  90. package/lib/_web-components/{basket-preview-block → basket-preview/basket-preview-block}/basket-preview-block.component.d.ts +6 -6
  91. package/lib/_web-components/{basket-preview-disabled → basket-preview/basket-preview-disabled}/basket-preview-disabled.component.d.ts +2 -2
  92. package/lib/_web-components/{basket-preview-line → basket-preview/basket-preview-line}/basket-preview-line.component.d.ts +7 -7
  93. package/lib/_web-components/basket-preview/basket-preview.module.d.ts +16 -0
  94. package/lib/_web-components/basket-preview/index.d.ts +5 -0
  95. package/lib/_web-components/{replace-item → basket-preview/replace-item}/replace-item.component.d.ts +5 -5
  96. package/lib/_web-components/catalog-article-card/catalog-article-card.component.d.ts +8 -0
  97. package/lib/_web-components/catalog-category/catalog-category.component.d.ts +12 -7
  98. package/lib/_web-components/catalog-header/catalog-header.component.d.ts +5 -2
  99. package/lib/_web-components/catalog-list/catalog-list.component.d.ts +13 -6
  100. package/lib/_web-components/catalog-recipe-card/catalog-recipe-card.component.d.ts +1 -0
  101. package/lib/_web-components/favorite-page/favorite-page.component.d.ts +0 -1
  102. package/lib/_web-components/index.d.ts +4 -5
  103. package/lib/_web-components/list-scan/basket-preview/basket-preview.component.d.ts +25 -0
  104. package/lib/_web-components/list-scan/index.d.ts +2 -0
  105. package/lib/_web-components/list-scan/ingredients-list/ingredients-list.component.d.ts +22 -0
  106. package/lib/_web-components/list-scan/list-scan.component.d.ts +17 -0
  107. package/lib/_web-components/list-scan/list-scan.module.d.ts +16 -0
  108. package/lib/_web-components/list-scan/overlay-button/overlay-button.component.d.ts +19 -0
  109. package/lib/_web-components/loader/index.d.ts +2 -0
  110. package/lib/_web-components/loader/loader.module.d.ts +10 -0
  111. package/lib/_web-components/personal-recipes/personal-recipes.component.d.ts +0 -1
  112. package/lib/_web-components/recipe-card/recipe-card.component.d.ts +1 -0
  113. package/lib/_web-components/recipe-catalog/recipe-catalog.component.d.ts +13 -4
  114. package/lib/_web-components/recipe-details/recipe-details.component.d.ts +8 -3
  115. package/lib/_web-components/suggestion-card/suggestion-card.component.d.ts +0 -1
  116. package/lib/_web-components/web-components.module.d.ts +38 -65
  117. package/lib/{environment.d.ts → environments/environment.d.ts} +1 -1
  118. package/miam-style.css +1 -1
  119. package/package.json +1 -1
  120. package/esm2015/lib/environment.js +0 -8
@@ -1,31 +1,34 @@
1
1
  import { Component, ViewEncapsulation, ChangeDetectionStrategy, ChangeDetectorRef, Output, EventEmitter, Input } from '@angular/core';
2
- import { skipWhile } from 'rxjs/operators';
3
- import { RecipeLikesService, RecipesService } from '../../_services';
2
+ import { forkJoin, of } from 'rxjs';
3
+ import { map, skipWhile, switchMap } from 'rxjs/operators';
4
+ import { ArticlesService, ContextService, RecipeLikesService, RecipesService } from '../../_services';
4
5
  import { Icon } from '../../_types/icon.enum';
6
+ import pick from 'lodash-es/pick';
5
7
  import * as i0 from "@angular/core";
6
8
  import * as i1 from "../../_services";
7
9
  import * as i2 from "@angular/common";
8
10
  import * as i3 from "../../_components/icon/icon.component";
9
11
  import * as i4 from "../../_components/card-create-recipe/card-create-recipe.component";
10
12
  import * as i5 from "../catalog-recipe-card/catalog-recipe-card.component";
11
- import * as i6 from "../loader/loader.component";
13
+ import * as i6 from "../catalog-article-card/catalog-article-card.component";
14
+ import * as i7 from "../loader/loader.component";
12
15
  function CatalogListComponent_div_1_div_3_Template(rf, ctx) { if (rf & 1) {
13
- const _r8 = i0.ɵɵgetCurrentView();
16
+ const _r9 = i0.ɵɵgetCurrentView();
14
17
  i0.ɵɵelementStart(0, "div", 10);
15
18
  i0.ɵɵelementStart(1, "span");
16
19
  i0.ɵɵtext(2);
17
20
  i0.ɵɵelementEnd();
18
21
  i0.ɵɵelementStart(3, "ng-miam-icon", 11);
19
- i0.ɵɵlistener("click", function CatalogListComponent_div_1_div_3_Template_ng_miam_icon_click_3_listener() { i0.ɵɵrestoreView(_r8); const filter_r6 = ctx.$implicit; const ctx_r7 = i0.ɵɵnextContext(2); return ctx_r7.removeFilter(filter_r6); });
22
+ i0.ɵɵlistener("click", function CatalogListComponent_div_1_div_3_Template_ng_miam_icon_click_3_listener() { i0.ɵɵrestoreView(_r9); const filter_r7 = ctx.$implicit; const ctx_r8 = i0.ɵɵnextContext(2); return ctx_r8.removeFilter(filter_r7); });
20
23
  i0.ɵɵelementEnd();
21
24
  i0.ɵɵelementEnd();
22
25
  } if (rf & 2) {
23
- const filter_r6 = ctx.$implicit;
24
- const ctx_r5 = i0.ɵɵnextContext(2);
26
+ const filter_r7 = ctx.$implicit;
27
+ const ctx_r6 = i0.ɵɵnextContext(2);
25
28
  i0.ɵɵadvance(2);
26
- i0.ɵɵtextInterpolate(filter_r6);
29
+ i0.ɵɵtextInterpolate(filter_r7);
27
30
  i0.ɵɵadvance(1);
28
- i0.ɵɵproperty("iconName", ctx_r5.icon.Clear);
31
+ i0.ɵɵproperty("iconName", ctx_r6.icon.Clear);
29
32
  } }
30
33
  function CatalogListComponent_div_1_Template(rf, ctx) { if (rf & 1) {
31
34
  i0.ɵɵelementStart(0, "div", 7);
@@ -44,18 +47,18 @@ function CatalogListComponent_div_2_span_3_Template(rf, ctx) { if (rf & 1) {
44
47
  i0.ɵɵtext(1);
45
48
  i0.ɵɵelementEnd();
46
49
  } if (rf & 2) {
47
- const ctx_r9 = i0.ɵɵnextContext(2);
50
+ const ctx_r10 = i0.ɵɵnextContext(2);
48
51
  i0.ɵɵadvance(1);
49
- i0.ɵɵtextInterpolate1(" ", ctx_r9.noRecipeTextFirstLine, " ");
52
+ i0.ɵɵtextInterpolate1(" ", ctx_r10.noRecipeTextFirstLine, " ");
50
53
  } }
51
54
  function CatalogListComponent_div_2_ng_template_4_span_2_Template(rf, ctx) { if (rf & 1) {
52
55
  i0.ɵɵelementStart(0, "span");
53
56
  i0.ɵɵtext(1);
54
57
  i0.ɵɵelementEnd();
55
58
  } if (rf & 2) {
56
- const ctx_r15 = i0.ɵɵnextContext(3);
59
+ const ctx_r16 = i0.ɵɵnextContext(3);
57
60
  i0.ɵɵadvance(1);
58
- i0.ɵɵtextInterpolate1("pour \"", ctx_r15.filters.search, "\"");
61
+ i0.ɵɵtextInterpolate1("pour \"", ctx_r16.filters.search, "\"");
59
62
  } }
60
63
  function CatalogListComponent_div_2_ng_template_4_Template(rf, ctx) { if (rf & 1) {
61
64
  i0.ɵɵelementStart(0, "span");
@@ -63,18 +66,18 @@ function CatalogListComponent_div_2_ng_template_4_Template(rf, ctx) { if (rf & 1
63
66
  i0.ɵɵelementEnd();
64
67
  i0.ɵɵtemplate(2, CatalogListComponent_div_2_ng_template_4_span_2_Template, 2, 1, "span", 19);
65
68
  } if (rf & 2) {
66
- const ctx_r11 = i0.ɵɵnextContext(2);
69
+ const ctx_r12 = i0.ɵɵnextContext(2);
67
70
  i0.ɵɵadvance(2);
68
- i0.ɵɵproperty("ngIf", ctx_r11.filters.search);
71
+ i0.ɵɵproperty("ngIf", ctx_r12.filters.search);
69
72
  } }
70
73
  function CatalogListComponent_div_2_span_7_Template(rf, ctx) { if (rf & 1) {
71
74
  i0.ɵɵelementStart(0, "span");
72
75
  i0.ɵɵtext(1);
73
76
  i0.ɵɵelementEnd();
74
77
  } if (rf & 2) {
75
- const ctx_r12 = i0.ɵɵnextContext(2);
78
+ const ctx_r13 = i0.ɵɵnextContext(2);
76
79
  i0.ɵɵadvance(1);
77
- i0.ɵɵtextInterpolate1(" ", ctx_r12.noRecipeTextSecondLine, " ");
80
+ i0.ɵɵtextInterpolate1(" ", ctx_r13.noRecipeTextSecondLine, " ");
78
81
  } }
79
82
  function CatalogListComponent_div_2_ng_template_8_Template(rf, ctx) { if (rf & 1) {
80
83
  i0.ɵɵtext(0, " Veuillez modifier les termes de votre recherche ou r\u00E9gler les filtres ");
@@ -92,58 +95,72 @@ function CatalogListComponent_div_2_Template(rf, ctx) { if (rf & 1) {
92
95
  i0.ɵɵelementEnd();
93
96
  i0.ɵɵelementEnd();
94
97
  } if (rf & 2) {
95
- const _r10 = i0.ɵɵreference(5);
96
- const _r13 = i0.ɵɵreference(9);
98
+ const _r11 = i0.ɵɵreference(5);
99
+ const _r14 = i0.ɵɵreference(9);
97
100
  const ctx_r1 = i0.ɵɵnextContext();
98
101
  i0.ɵɵadvance(1);
99
102
  i0.ɵɵproperty("width", 279)("height", 243)("iconName", ctx_r1.icon.NoRecipeFound);
100
103
  i0.ɵɵadvance(2);
101
- i0.ɵɵproperty("ngIf", ctx_r1.noRecipeTextFirstLine && ctx_r1.filtersAreEmpty)("ngIfElse", _r10);
104
+ i0.ɵɵproperty("ngIf", ctx_r1.noRecipeTextFirstLine && ctx_r1.filtersAreEmpty)("ngIfElse", _r11);
102
105
  i0.ɵɵadvance(4);
103
- i0.ɵɵproperty("ngIf", ctx_r1.noRecipeTextSecondLine && ctx_r1.filtersAreEmpty)("ngIfElse", _r13);
106
+ i0.ɵɵproperty("ngIf", ctx_r1.noRecipeTextSecondLine && ctx_r1.filtersAreEmpty)("ngIfElse", _r14);
104
107
  } }
105
108
  function CatalogListComponent_ng_miam_card_create_recipe_3_Template(rf, ctx) { if (rf & 1) {
106
- const _r17 = i0.ɵɵgetCurrentView();
109
+ const _r18 = i0.ɵɵgetCurrentView();
107
110
  i0.ɵɵelementStart(0, "ng-miam-card-create-recipe", 20);
108
- i0.ɵɵlistener("clicked", function CatalogListComponent_ng_miam_card_create_recipe_3_Template_ng_miam_card_create_recipe_clicked_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r16 = i0.ɵɵnextContext(); return ctx_r16.recipeActionTriggered.emit({ action: "CREATE", recipe: null }); });
111
+ i0.ɵɵlistener("clicked", function CatalogListComponent_ng_miam_card_create_recipe_3_Template_ng_miam_card_create_recipe_clicked_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r17 = i0.ɵɵnextContext(); return ctx_r17.recipeActionTriggered.emit({ action: "CREATE", recipe: null }); });
109
112
  i0.ɵɵelementEnd();
110
113
  } }
111
114
  function CatalogListComponent_div_4_Template(rf, ctx) { if (rf & 1) {
112
- const _r20 = i0.ɵɵgetCurrentView();
115
+ const _r21 = i0.ɵɵgetCurrentView();
113
116
  i0.ɵɵelementStart(0, "div", 21);
114
117
  i0.ɵɵelementStart(1, "ng-miam-catalog-recipe-card", 22);
115
- i0.ɵɵlistener("actionTriggered", function CatalogListComponent_div_4_Template_ng_miam_catalog_recipe_card_actionTriggered_1_listener($event) { i0.ɵɵrestoreView(_r20); const recipe_r18 = ctx.$implicit; const ctx_r19 = i0.ɵɵnextContext(); return ctx_r19.recipeActionTriggered.emit({ action: $event, recipe: recipe_r18 }); });
118
+ i0.ɵɵlistener("actionTriggered", function CatalogListComponent_div_4_Template_ng_miam_catalog_recipe_card_actionTriggered_1_listener($event) { i0.ɵɵrestoreView(_r21); const recipe_r19 = ctx.$implicit; const ctx_r20 = i0.ɵɵnextContext(); return ctx_r20.recipeActionTriggered.emit({ action: $event, recipe: recipe_r19 }); });
116
119
  i0.ɵɵelementEnd();
117
120
  i0.ɵɵelementEnd();
118
121
  } if (rf & 2) {
119
- const recipe_r18 = ctx.$implicit;
122
+ const recipe_r19 = ctx.$implicit;
120
123
  i0.ɵɵadvance(1);
121
- i0.ɵɵproperty("recipe", recipe_r18);
124
+ i0.ɵɵproperty("recipe", recipe_r19);
122
125
  } }
123
126
  function CatalogListComponent_div_5_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelementStart(0, "div", 23);
127
+ i0.ɵɵelementStart(0, "div", 21);
128
+ i0.ɵɵelement(1, "ng-miam-catalog-article-card", 23);
129
+ i0.ɵɵelementEnd();
130
+ } if (rf & 2) {
131
+ const article_r22 = ctx.$implicit;
132
+ i0.ɵɵadvance(1);
133
+ i0.ɵɵproperty("article", article_r22);
134
+ } }
135
+ function CatalogListComponent_div_6_Template(rf, ctx) { if (rf & 1) {
136
+ i0.ɵɵelementStart(0, "div", 24);
125
137
  i0.ɵɵelement(1, "ng-miam-loader");
126
138
  i0.ɵɵelementStart(2, "div");
127
- i0.ɵɵtext(3, " Chargement des recettes... ");
139
+ i0.ɵɵtext(3, " Chargement des r\u00E9sultats... ");
128
140
  i0.ɵɵelementEnd();
129
141
  i0.ɵɵelementEnd();
130
142
  } }
131
143
  export class CatalogListComponent {
132
- constructor(recipesService, recipeLikesService, cdr) {
144
+ constructor(recipesService, recipeLikesService, articlesService, context, cdr) {
133
145
  this.recipesService = recipesService;
134
146
  this.recipeLikesService = recipeLikesService;
147
+ this.articlesService = articlesService;
148
+ this.context = context;
135
149
  this.cdr = cdr;
136
150
  this.insertCreateCard = false;
137
151
  this.randomMode = false;
138
152
  this.retrievedRecipes = new EventEmitter();
139
153
  this.filterRemoved = new EventEmitter();
140
154
  this.recipeActionTriggered = new EventEmitter();
155
+ this.currentRecipes = [];
141
156
  this.lastPage = 0;
142
157
  this.loading = true;
143
158
  this.icon = Icon;
144
159
  this.noMoreRecipes = false;
160
+ this.noMoreArticles = false;
145
161
  this.filtersAreEmpty = true;
146
162
  this.filtersToDisplay = [];
163
+ this.articles = [];
147
164
  this.remoteFilters = {};
148
165
  this.subscriptions = [];
149
166
  this.currentRecipes = [];
@@ -160,10 +177,10 @@ export class CatalogListComponent {
160
177
  }
161
178
  initLoadOnScroll() {
162
179
  // Receive an event each time the anchor enters/leaves the viewport
163
- this.intersectionObserver = new IntersectionObserver(([entry]) => { this.autoloadRecipeIfNecessary(); }, {});
180
+ this.intersectionObserver = new IntersectionObserver(([entry]) => { this.autoloadContentIfNecessary(); }, {});
164
181
  // Receive an event each time an attribute/child is added/deleted/updated in the parent div of the recipes
165
182
  // i.e. will be triggered each time new recipes are displayed
166
- this.mutationObserver = new MutationObserver(() => { this.autoloadRecipeIfNecessary(); });
183
+ this.mutationObserver = new MutationObserver(() => { this.autoloadContentIfNecessary(); });
167
184
  this.intersectionObserver.observe(this.bottomAnchor);
168
185
  this.mutationObserver.observe(document.getElementsByClassName('miam-catalog-list__cards')[0], { attributes: true, childList: true, subtree: false } // subtree false => changes on children won't trigger the callback
169
186
  );
@@ -173,53 +190,51 @@ export class CatalogListComponent {
173
190
  const rect = this.bottomAnchor.getBoundingClientRect();
174
191
  return (rect.top <= viewportHeight && rect.bottom >= 0);
175
192
  }
176
- autoloadRecipeIfNecessary() {
177
- if (this.anchorIsOnScreen() && !this.loading && this.currentRecipes.length > 0 && !this.noMoreRecipes) {
193
+ autoloadContentIfNecessary() {
194
+ if (this.anchorIsOnScreen() && !this.loading &&
195
+ ((this.currentRecipes.length > 0 && !this.noMoreRecipes) || (this.articles.length > 0 && !this.noMoreArticles))) {
178
196
  this.loadMore();
179
197
  }
180
198
  }
181
199
  loadMore() {
182
200
  this.loading = true;
183
201
  this.lastPage++;
184
- this.loadRecipesPage(this.lastPage);
202
+ this.loadContent();
185
203
  }
186
204
  loadRecipesPage(page) {
205
+ if (this.noMoreRecipes) {
206
+ return of([]);
207
+ }
187
208
  // keep a copy of the filters when request is sent, so we can check they are still the same when it is received
188
209
  // Because if it's not the case we have to ingore the result
189
210
  const requestFilters = Object.assign({}, this.remoteFilters);
190
211
  if (this.randomMode) {
191
- this.subscriptions.push(this.recipesService.getRandom({ size: 20, number: page }, requestFilters)
192
- .subscribe((result) => {
193
- this.processResults(result, requestFilters, page);
194
- }));
212
+ return this.recipesService.getRandom({ size: 20, number: page }, requestFilters).pipe(switchMap((result) => this.processResults(result, requestFilters, page)));
195
213
  }
196
214
  else {
197
- this.subscriptions.push(this.recipesService.all({
215
+ return this.recipesService.all({
198
216
  remotefilter: requestFilters,
199
217
  page: { size: 20, number: page },
200
218
  include: ['ingredients', 'recipe-steps', 'recipe-type', 'recipe-status', 'sponsors', 'recipe-provider']
201
- }).pipe(skipWhile(resp => resp.is_loading))
202
- .subscribe((result) => {
203
- this.processResults(result.data, requestFilters, page);
204
- }));
219
+ }).pipe(skipWhile(resp => resp.is_loading), switchMap((result) => this.processResults(result.data, requestFilters, page)));
205
220
  }
206
221
  }
207
222
  processResults(results, requestFilters, page) {
208
223
  // Because Filter is a type, attributes are always in the same order, so stringify won't be false for objects with same attributes
209
224
  if (JSON.stringify(requestFilters) === JSON.stringify(this.remoteFilters)) {
225
+ // if you spam click on filters, multiple requests with page == 1 could be sent for the same filters -> only keep the last result
226
+ this.currentRecipes = page === 1 ? results : [...this.currentRecipes, ...results];
227
+ this.noMoreRecipes = results.length === 0;
210
228
  // Get all recipe-likes before displaying
211
- this.recipeLikesService.addLikesToRecipes(results).subscribe(() => {
212
- // if you spam click on filters, multiple requests with page == 1 could be sent for the same filters -> only keep the last result
213
- this.currentRecipes = page === 1 ? results : [...this.currentRecipes, ...results];
214
- this.loading = false;
215
- this.noMoreRecipes = results.length === 0;
229
+ return this.recipeLikesService.addLikesToRecipes(results).pipe(map(() => {
216
230
  this.retrievedRecipes.emit(this.currentRecipes);
217
- this.cdr.detectChanges();
218
- });
231
+ return this.currentRecipes;
232
+ }));
219
233
  }
220
234
  else {
221
235
  // tslint:disable-next-line: no-console
222
236
  console.debug('Filtering aborted : ' + JSON.stringify(requestFilters) + 'and' + JSON.stringify(this.remoteFilters) + 'are different');
237
+ return of([]);
223
238
  }
224
239
  }
225
240
  removeFilter(filterName) {
@@ -266,40 +281,70 @@ export class CatalogListComponent {
266
281
  return filtersArray.filter(el => el.value).map(el => el.text);
267
282
  }
268
283
  reloadPage() {
269
- this.lastPage = 1;
270
284
  this.loading = true;
285
+ this.lastPage = 1;
286
+ this.noMoreRecipes = false;
287
+ this.noMoreArticles = false;
271
288
  this.currentRecipes = [];
289
+ this.articles = [];
272
290
  this.cdr.detectChanges();
273
- this.loadRecipesPage(this.lastPage);
291
+ this.loadContent();
274
292
  }
275
293
  ngOnDestroy() {
276
294
  this.subscriptions.forEach(sub => sub.unsubscribe());
277
295
  this.intersectionObserver.disconnect();
278
296
  this.mutationObserver.disconnect();
279
297
  }
298
+ // Articles will be loaded only if a filter is applied on packages
299
+ // This is to avoid articles being loaded in special pages where only filters on recipes are passed (favorites, suggested, etc.)
300
+ // => Packages mixing articles with recipes is not supported yet
301
+ loadArticles(page) {
302
+ if (!this.context.articlesInCatalogEnabled || this.noMoreArticles || !this.remoteFilters['packages']) {
303
+ return of([]);
304
+ }
305
+ const requestFilters = pick(this.remoteFilters, 'packages', 'search');
306
+ return this.articlesService.all({
307
+ remotefilter: requestFilters,
308
+ page: { size: 20, number: page },
309
+ sort: ['-date']
310
+ }).pipe(map((result) => {
311
+ this.articles = page === 1 ? result.data : [...this.articles, ...result.data];
312
+ this.noMoreArticles = result.data.length === 0;
313
+ return this.articles;
314
+ }));
315
+ }
316
+ loadContent() {
317
+ this.subscriptions.push(forkJoin([this.loadRecipesPage(this.lastPage), this.loadArticles(this.lastPage)]).subscribe(() => {
318
+ this.loading = false;
319
+ this.cdr.detectChanges();
320
+ }));
321
+ }
280
322
  }
281
- CatalogListComponent.ɵfac = function CatalogListComponent_Factory(t) { return new (t || CatalogListComponent)(i0.ɵɵdirectiveInject(i1.RecipesService), i0.ɵɵdirectiveInject(i1.RecipeLikesService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
282
- CatalogListComponent.ɵcmp = i0.ɵɵdefineComponent({ type: CatalogListComponent, selectors: [["ng-miam-catalog-list"]], inputs: { filters: "filters", noRecipeTextFirstLine: "noRecipeTextFirstLine", noRecipeTextSecondLine: "noRecipeTextSecondLine", insertCreateCard: "insertCreateCard", randomMode: "randomMode" }, outputs: { retrievedRecipes: "retrievedRecipes", filterRemoved: "filterRemoved", recipeActionTriggered: "recipeActionTriggered" }, features: [i0.ɵɵNgOnChangesFeature], decls: 7, vars: 5, consts: [[1, "miam-catalog-list__cards"], ["class", "miam-catalog-list__filters", 4, "ngIf"], ["class", "miam-catalog-list__notFound", 4, "ngIf"], ["class", "miam-catalog-list__card", 3, "clicked", 4, "ngIf"], ["class", "miam-catalog-list__card", 4, "ngFor", "ngForOf"], ["class", "miam-catalog-list__loader", 4, "ngIf"], ["id", "miam-catalog-list__anchor"], [1, "miam-catalog-list__filters"], [1, "miam-catalog-list__filter__title"], ["class", "miam-catalog-list__filter", 4, "ngFor", "ngForOf"], [1, "miam-catalog-list__filter"], ["primaryColor", "var(--m-color-primary)", 1, "miam-catalog-list__filter__icon", 3, "iconName", "click"], [1, "miam-catalog-list__notFound"], [1, "miam-catalog-list__notFound__icon", 3, "width", "height", "iconName"], [1, "miam-catalog-list__notFound__title1"], [4, "ngIf", "ngIfElse"], ["defaultFirstLine", ""], [1, "miam-catalog-list__notFound__title2"], ["defaultSecondLine", ""], [4, "ngIf"], [1, "miam-catalog-list__card", 3, "clicked"], [1, "miam-catalog-list__card"], [3, "recipe", "actionTriggered"], [1, "miam-catalog-list__loader"]], template: function CatalogListComponent_Template(rf, ctx) { if (rf & 1) {
323
+ CatalogListComponent.ɵfac = function CatalogListComponent_Factory(t) { return new (t || CatalogListComponent)(i0.ɵɵdirectiveInject(i1.RecipesService), i0.ɵɵdirectiveInject(i1.RecipeLikesService), i0.ɵɵdirectiveInject(i1.ArticlesService), i0.ɵɵdirectiveInject(i1.ContextService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
324
+ CatalogListComponent.ɵcmp = i0.ɵɵdefineComponent({ type: CatalogListComponent, selectors: [["ng-miam-catalog-list"]], inputs: { filters: "filters", noRecipeTextFirstLine: "noRecipeTextFirstLine", noRecipeTextSecondLine: "noRecipeTextSecondLine", insertCreateCard: "insertCreateCard", randomMode: "randomMode" }, outputs: { retrievedRecipes: "retrievedRecipes", filterRemoved: "filterRemoved", recipeActionTriggered: "recipeActionTriggered" }, features: [i0.ɵɵNgOnChangesFeature], decls: 8, vars: 6, consts: [[1, "miam-catalog-list__cards"], ["class", "miam-catalog-list__filters", 4, "ngIf"], ["class", "miam-catalog-list__notFound", 4, "ngIf"], ["class", "miam-catalog-list__card", 3, "clicked", 4, "ngIf"], ["class", "miam-catalog-list__card", 4, "ngFor", "ngForOf"], ["class", "miam-catalog-list__loader", 4, "ngIf"], ["id", "miam-catalog-list__anchor"], [1, "miam-catalog-list__filters"], [1, "miam-catalog-list__filter__title"], ["class", "miam-catalog-list__filter", 4, "ngFor", "ngForOf"], [1, "miam-catalog-list__filter"], ["primaryColor", "var(--m-color-primary)", 1, "miam-catalog-list__filter__icon", 3, "iconName", "click"], [1, "miam-catalog-list__notFound"], [1, "miam-catalog-list__notFound__icon", 3, "width", "height", "iconName"], [1, "miam-catalog-list__notFound__title1"], [4, "ngIf", "ngIfElse"], ["defaultFirstLine", ""], [1, "miam-catalog-list__notFound__title2"], ["defaultSecondLine", ""], [4, "ngIf"], [1, "miam-catalog-list__card", 3, "clicked"], [1, "miam-catalog-list__card"], [3, "recipe", "actionTriggered"], [3, "article"], [1, "miam-catalog-list__loader"]], template: function CatalogListComponent_Template(rf, ctx) { if (rf & 1) {
283
325
  i0.ɵɵelementStart(0, "div", 0);
284
326
  i0.ɵɵtemplate(1, CatalogListComponent_div_1_Template, 4, 1, "div", 1);
285
327
  i0.ɵɵtemplate(2, CatalogListComponent_div_2_Template, 10, 7, "div", 2);
286
328
  i0.ɵɵtemplate(3, CatalogListComponent_ng_miam_card_create_recipe_3_Template, 1, 0, "ng-miam-card-create-recipe", 3);
287
329
  i0.ɵɵtemplate(4, CatalogListComponent_div_4_Template, 2, 1, "div", 4);
288
- i0.ɵɵtemplate(5, CatalogListComponent_div_5_Template, 4, 0, "div", 5);
289
- i0.ɵɵelement(6, "div", 6);
330
+ i0.ɵɵtemplate(5, CatalogListComponent_div_5_Template, 2, 1, "div", 4);
331
+ i0.ɵɵtemplate(6, CatalogListComponent_div_6_Template, 4, 0, "div", 5);
332
+ i0.ɵɵelement(7, "div", 6);
290
333
  i0.ɵɵelementEnd();
291
334
  } if (rf & 2) {
292
335
  i0.ɵɵadvance(1);
293
336
  i0.ɵɵproperty("ngIf", ctx.filtersToDisplay.length > 0);
294
337
  i0.ɵɵadvance(1);
295
- i0.ɵɵproperty("ngIf", !ctx.loading && ctx.currentRecipes.length === 0);
338
+ i0.ɵɵproperty("ngIf", !ctx.loading && ctx.currentRecipes.length === 0 && ctx.articles.length === 0);
296
339
  i0.ɵɵadvance(1);
297
340
  i0.ɵɵproperty("ngIf", ctx.insertCreateCard && ctx.currentRecipes.length !== 0);
298
341
  i0.ɵɵadvance(1);
299
342
  i0.ɵɵproperty("ngForOf", ctx.currentRecipes);
300
343
  i0.ɵɵadvance(1);
344
+ i0.ɵɵproperty("ngForOf", ctx.articles);
345
+ i0.ɵɵadvance(1);
301
346
  i0.ɵɵproperty("ngIf", ctx.loading);
302
- } }, directives: [i2.NgIf, i2.NgForOf, i3.IconComponent, i4.CardCreateRecipeComponent, i5.CatalogRecipeCardComponent, i6.LoaderComponent], styles: [".miam-catalog-list__cards{display:flex;flex-flow:row wrap;position:relative;right:0;top:0;width:100%}.miam-catalog-list__cards .miam-catalog-list__filters{align-items:center;display:flex;flex-flow:row wrap;margin:0 8px;width:100%}.miam-catalog-list__cards .miam-catalog-list__filters .miam-catalog-list__filter__title{margin-top:-16px;padding:0 24px}.miam-catalog-list__cards .miam-catalog-list__filters .miam-catalog-list__filter{align-items:center;border:1px solid var(--m-color-primary);border-radius:4px;display:flex;margin:0 0 16px 8px;padding:8px 16px}.miam-catalog-list__cards .miam-catalog-list__filters .miam-catalog-list__filter .miam-catalog-list__filter__icon .icon-container{-webkit-tap-highlight-color:transparent;cursor:pointer;margin:0 0 0 16px}.miam-catalog-list__cards .miam-catalog-list__notFound{display:flex;flex-direction:column;justify-content:center;padding:36px 0 0;text-align:center;width:100%}.miam-catalog-list__cards .miam-catalog-list__notFound .miam-catalog-list__notFound__title1{color:var(--m-color-primary);font-size:24px;font-weight:700;margin-top:36px}.miam-catalog-list__cards .miam-catalog-list__notFound .miam-catalog-list__notFound__title2{color:var(--m-color-grey-text);font-size:22px}.miam-catalog-list__cards .miam-catalog-list__card{margin:8px}.miam-catalog-list__cards .miam-catalog-list__loader{color:var(--m-color-grey-text);font-size:20px;font-weight:700;text-align:center;width:100%}.miam-catalog-list__cards .miam-catalog-list__loader .loader{height:80px;margin-bottom:16px;margin-left:calc(50% - 40px);margin-top:80px;width:80px}.miam-catalog-list__cards #miam-catalog-list__anchor{bottom:0;height:600px;margin-top:-600px;position:relative}@media (max-width:1022px){.miam-catalog-list__cards{justify-content:center}.miam-catalog-list__cards .miam-catalog-list__filters{display:none}.miam-catalog-list__cards .miam-catalog-list__notFound{margin:0 16px 36px;padding:0}.miam-catalog-list__cards .miam-catalog-list__notFound ng-miam-icon .icon-container{height:126px!important;width:145px!important}.miam-catalog-list__cards .miam-catalog-list__notFound .miam-catalog-list__notFound__title1{font-size:21px}.miam-catalog-list__cards .miam-catalog-list__notFound .miam-catalog-list__notFound__title2{font-size:16px}.miam-catalog-list__cards .miam-catalog-list__card{max-width:344px;width:100%}.miam-catalog-list__cards .miam-catalog-list__card .miam-catalog-recipe-card{margin:auto;width:95%}}"], encapsulation: 2, changeDetection: 0 });
347
+ } }, directives: [i2.NgIf, i2.NgForOf, i3.IconComponent, i4.CardCreateRecipeComponent, i5.CatalogRecipeCardComponent, i6.CatalogArticleCardComponent, i7.LoaderComponent], styles: [".miam-catalog-list__cards{display:flex;flex-flow:row wrap;position:relative;right:0;top:0;width:100%}.miam-catalog-list__cards .miam-catalog-list__filters{align-items:center;display:flex;flex-flow:row wrap;margin:0 8px;width:100%}.miam-catalog-list__cards .miam-catalog-list__filters .miam-catalog-list__filter__title{margin-top:-16px;padding:0 24px}.miam-catalog-list__cards .miam-catalog-list__filters .miam-catalog-list__filter{align-items:center;border:1px solid var(--m-color-primary);border-radius:4px;display:flex;margin:0 0 16px 8px;padding:8px 16px}.miam-catalog-list__cards .miam-catalog-list__filters .miam-catalog-list__filter .miam-catalog-list__filter__icon .icon-container{-webkit-tap-highlight-color:transparent;cursor:pointer;margin:0 0 0 16px}.miam-catalog-list__cards .miam-catalog-list__notFound{display:flex;flex-direction:column;justify-content:center;padding:36px 0 0;text-align:center;width:100%}.miam-catalog-list__cards .miam-catalog-list__notFound .miam-catalog-list__notFound__title1{color:var(--m-color-primary);font-size:24px;font-weight:700;margin-top:36px}.miam-catalog-list__cards .miam-catalog-list__notFound .miam-catalog-list__notFound__title2{color:var(--m-color-grey-text);font-size:22px}.miam-catalog-list__cards .miam-catalog-list__card{margin:8px}.miam-catalog-list__cards .miam-catalog-list__loader{color:var(--m-color-grey-text);font-size:20px;font-weight:700;text-align:center;width:100%}.miam-catalog-list__cards .miam-catalog-list__loader .loader{height:80px;margin-bottom:16px;margin-left:calc(50% - 40px);margin-top:80px;width:80px}.miam-catalog-list__cards #miam-catalog-list__anchor{bottom:0;height:600px;margin-top:-600px;position:relative}@media (max-width:1022px){.miam-catalog-list__cards{justify-content:center}.miam-catalog-list__cards .miam-catalog-list__filters{display:none}.miam-catalog-list__cards .miam-catalog-list__notFound{margin:0 16px 36px;padding:0}.miam-catalog-list__cards .miam-catalog-list__notFound ng-miam-icon .icon-container{height:126px!important;width:145px!important}.miam-catalog-list__cards .miam-catalog-list__notFound .miam-catalog-list__notFound__title1{font-size:21px}.miam-catalog-list__cards .miam-catalog-list__notFound .miam-catalog-list__notFound__title2{font-size:16px}.miam-catalog-list__cards .miam-catalog-list__card{max-width:344px;width:100%}.miam-catalog-list__cards .miam-catalog-list__card .miam-catalog-recipe-card{margin:auto;width:95%}}"], encapsulation: 2, changeDetection: 0 });
303
348
  /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(CatalogListComponent, [{
304
349
  type: Component,
305
350
  args: [{
@@ -309,7 +354,7 @@ CatalogListComponent.ɵcmp = i0.ɵɵdefineComponent({ type: CatalogListComponent
309
354
  encapsulation: ViewEncapsulation.None,
310
355
  changeDetection: ChangeDetectionStrategy.OnPush
311
356
  }]
312
- }], function () { return [{ type: i1.RecipesService }, { type: i1.RecipeLikesService }, { type: i0.ChangeDetectorRef }]; }, { filters: [{
357
+ }], function () { return [{ type: i1.RecipesService }, { type: i1.RecipeLikesService }, { type: i1.ArticlesService }, { type: i1.ContextService }, { type: i0.ChangeDetectorRef }]; }, { filters: [{
313
358
  type: Input
314
359
  }], noRecipeTextFirstLine: [{
315
360
  type: Input
@@ -326,4 +371,4 @@ CatalogListComponent.ɵcmp = i0.ɵɵdefineComponent({ type: CatalogListComponent
326
371
  }], recipeActionTriggered: [{
327
372
  type: Output
328
373
  }] }); })();
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIvYnVpbGRzL21pYW0vbmctbWlhbS1zZGsvcHJvamVjdHMvbmctbWlhbS9zcmMvIiwic291cmNlcyI6WyJsaWIvX3dlYi1jb21wb25lbnRzL2NhdGFsb2ctbGlzdC9jYXRhbG9nLWxpc3QuY29tcG9uZW50LnRzIiwibGliL193ZWItY29tcG9uZW50cy9jYXRhbG9nLWxpc3QvY2F0YWxvZy1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQXFCLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUNwSCxNQUFNLGVBQWUsQ0FBQztBQUduQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7OztJQ0gxQywrQkFDRTtJQUFBLDRCQUFNO0lBQUEsWUFBVTtJQUFBLGlCQUFPO0lBQ3ZCLHdDQUtlO0lBSGIsaVBBQThCO0lBR2hDLGlCQUFlO0lBQ2pCLGlCQUFNOzs7O0lBUEUsZUFBVTtJQUFWLCtCQUFVO0lBSWQsZUFBdUI7SUFBdkIsNENBQXVCOzs7SUFQN0IsOEJBQ0U7SUFBQSw4QkFBOEM7SUFBQSwyQkFBVztJQUFBLGlCQUFNO0lBQy9ELDJFQUNFO0lBUUosaUJBQU07OztJQVRDLGVBQXVDO0lBQXZDLGlEQUF1Qzs7O0lBYzFDLDRCQUNFO0lBQUEsWUFDRjtJQUFBLGlCQUFPOzs7SUFETCxlQUNGO0lBREUsNkRBQ0Y7OztJQUdFLDRCQUE2QjtJQUFBLFlBQXlCO0lBQUEsaUJBQU87OztJQUFoQyxlQUF5QjtJQUF6Qiw4REFBeUI7OztJQUR0RCw0QkFBTTtJ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QXNCO2dCQUNoQyxXQUFXLEVBQUUsK0JBQStCO2dCQUM1QyxTQUFTLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztnQkFDNUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEO2tJQUVVLE9BQU87a0JBQWYsS0FBSztZQUNHLHFCQUFxQjtrQkFBN0IsS0FBSztZQUNHLHNCQUFzQjtrQkFBOUIsS0FBSztZQUNHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUNHLFVBQVU7a0JBQWxCLEtBQUs7WUFDSSxnQkFBZ0I7a0JBQXpCLE1BQU07WUFDRyxhQUFhO2tCQUF0QixNQUFNO1lBQ0cscUJBQXFCO2tCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0LFxuICBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvY3VtZW50Q29sbGVjdGlvbiB9IGZyb20gJ25neC1qc29uYXBpJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2tpcFdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVjaXBlIH0gZnJvbSAnLi4vLi4vX21vZGVscy9yZWNpcGUnO1xuaW1wb3J0IHsgUmVjaXBlTGlrZXNTZXJ2aWNlLCBSZWNpcGVzU2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcyc7XG5pbXBvcnQgeyBJY29uIH0gZnJvbSAnLi4vLi4vX3R5cGVzL2ljb24uZW51bSc7XG5pbXBvcnQgeyBSZWNpcGVGaWx0ZXIsIFJlY2lwZUZpbHRlcnMgfSBmcm9tICcuLi8uLi9fdHlwZXMvcmVjaXBlLWZpbHRlcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZy1taWFtLWNhdGFsb2ctbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXRhbG9nLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYXRhbG9nLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ2F0YWxvZ0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZmlsdGVyczogUmVjaXBlRmlsdGVycztcbiAgQElucHV0KCkgbm9SZWNpcGVUZXh0Rmlyc3RMaW5lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5vUmVjaXBlVGV4dFNlY29uZExpbmU6IHN0cmluZztcbiAgQElucHV0KCkgaW5zZXJ0Q3JlYXRlQ2FyZCA9IGZhbHNlO1xuICBASW5wdXQoKSByYW5kb21Nb2RlID0gZmFsc2U7XG4gIEBPdXRwdXQoKSByZXRyaWV2ZWRSZWNpcGVzID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNpcGVbXT4oKTtcbiAgQE91dHB1dCgpIGZpbHRlclJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlY2lwZUFjdGlvblRyaWdnZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2FjdGlvbjogc3RyaW5nLCByZWNpcGU6IFJlY2lwZX0+KCk7XG5cbiAgY3VycmVudFJlY2lwZXM6IFJlY2lwZVtdO1xuICBsYXN0UGFnZSA9IDA7XG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xuICBsb2FkaW5nID0gdHJ1ZTtcbiAgaWNvbiA9IEljb247XG4gIG5vTW9yZVJlY2lwZXMgPSBmYWxzZTtcbiAgYm90dG9tQW5jaG9yOiBIVE1MRWxlbWVudDtcbiAgZmlsdGVyc0FyZUVtcHR5ID0gdHJ1ZTtcbiAgZmlsdGVyc1RvRGlzcGxheSA9IFtdO1xuXG4gIHByaXZhdGUgcmVtb3RlRmlsdGVycyA9IHt9O1xuXG4gIHByaXZhdGUgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIG11dGF0aW9uT2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWNpcGVzU2VydmljZTogUmVjaXBlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWNpcGVMaWtlc1NlcnZpY2U6IFJlY2lwZUxpa2VzU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgdGhpcy5jdXJyZW50UmVjaXBlcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVycyA9IHsgc2VhcmNoOiAnJyB9O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5ib3R0b21BbmNob3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWlhbS1jYXRhbG9nLWxpc3RfX2FuY2hvcicpO1xuICAgIHRoaXMuaW5pdExvYWRPblNjcm9sbCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5yZW1vdGVGaWx0ZXJzID0gdGhpcy5idWlsZFJlbW90ZUZpbHRlcnMoKTtcbiAgICB0aGlzLmZpbHRlcnNUb0Rpc3BsYXkgPSB0aGlzLmJ1aWxkRmlsdGVyc0FycmF5KCk7XG4gICAgdGhpcy5yZWxvYWRQYWdlKCk7XG4gIH1cblxuICBpbml0TG9hZE9uU2Nyb2xsKCkge1xuICAgIC8vIFJlY2VpdmUgYW4gZXZlbnQgZWFjaCB0aW1lIHRoZSBhbmNob3IgZW50ZXJzL2xlYXZlcyB0aGUgdmlld3BvcnRcbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChbZW50cnldKSA9PiB7IHRoaXMuYXV0b2xvYWRSZWNpcGVJZk5lY2Vzc2FyeSgpOyB9LCB7fSk7XG4gICAgLy8gUmVjZWl2ZSBhbiBldmVudCBlYWNoIHRpbWUgYW4gYXR0cmlidXRlL2NoaWxkIGlzIGFkZGVkL2RlbGV0ZWQvdXBkYXRlZCBpbiB0aGUgcGFyZW50IGRpdiBvZiB0aGUgcmVjaXBlc1xuICAgIC8vIGkuZS4gd2lsbCBiZSB0cmlnZ2VyZWQgZWFjaCB0aW1lIG5ldyByZWNpcGVzIGFyZSBkaXNwbGF5ZWRcbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7IHRoaXMuYXV0b2xvYWRSZWNpcGVJZk5lY2Vzc2FyeSgpOyB9KTtcblxuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmJvdHRvbUFuY2hvcik7XG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtaWFtLWNhdGFsb2ctbGlzdF9fY2FyZHMnKVswXSxcbiAgICAgIHsgYXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiBmYWxzZSB9IC8vIHN1YnRyZWUgZmFsc2UgPT4gY2hhbmdlcyBvbiBjaGlsZHJlbiB3b24ndCB0cmlnZ2VyIHRoZSBjYWxsYmFja1xuICAgICk7XG4gIH1cblxuICBhbmNob3JJc09uU2NyZWVuKCkge1xuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuYm90dG9tQW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiAocmVjdC50b3AgPD0gdmlld3BvcnRIZWlnaHQgJiYgcmVjdC5ib3R0b20gPj0gMCk7XG4gIH1cblxuICBhdXRvbG9hZFJlY2lwZUlmTmVjZXNzYXJ5KCkge1xuICAgIGlmICh0aGlzLmFuY2hvcklzT25TY3JlZW4oKSAmJiAhdGhpcy5sb2FkaW5nICYmIHRoaXMuY3VycmVudFJlY2lwZXMubGVuZ3RoID4gMCAmJiAhdGhpcy5ub01vcmVSZWNpcGVzKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlKCk7XG4gICAgfVxuICB9XG5cbiAgbG9hZE1vcmUoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmxhc3RQYWdlKys7XG4gICAgdGhpcy5sb2FkUmVjaXBlc1BhZ2UodGhpcy5sYXN0UGFnZSk7XG4gIH1cblxuICBsb2FkUmVjaXBlc1BhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgLy8ga2VlcCBhIGNvcHkgb2YgdGhlIGZpbHRlcnMgd2hlbiByZXF1ZXN0IGlzIHNlbnQsIHNvIHdlIGNhbiBjaGVjayB0aGV5IGFyZSBzdGlsbCB0aGUgc2FtZSB3aGVuIGl0IGlzIHJlY2VpdmVkXG4gICAgLy8gQmVjYXVzZSBpZiBpdCdzIG5vdCB0aGUgY2FzZSB3ZSBoYXZlIHRvIGluZ29yZSB0aGUgcmVzdWx0XG4gICAgY29uc3QgcmVxdWVzdEZpbHRlcnMgPSB7IC4uLnRoaXMucmVtb3RlRmlsdGVycyB9O1xuICAgIGlmICh0aGlzLnJhbmRvbU1vZGUpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMucmVjaXBlc1NlcnZpY2UuZ2V0UmFuZG9tKHsgc2l6ZTogMjAsIG51bWJlcjogcGFnZSB9LCByZXF1ZXN0RmlsdGVycylcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogUmVjaXBlW10pID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVzdWx0cyhyZXN1bHQsIHJlcXVlc3RGaWx0ZXJzLCBwYWdlKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLnJlY2lwZXNTZXJ2aWNlLmFsbCh7XG4gICAgICAgIHJlbW90ZWZpbHRlcjogcmVxdWVzdEZpbHRlcnMsXG4gICAgICAgIHBhZ2U6IHsgc2l6ZTogMjAsIG51bWJlcjogcGFnZSB9LFxuICAgICAgICBpbmNsdWRlOiBbJ2luZ3JlZGllbnRzJywgJ3JlY2lwZS1zdGVwcycsICdyZWNpcGUtdHlwZScsICdyZWNpcGUtc3RhdHVzJywgJ3Nwb25zb3JzJywgJ3JlY2lwZS1wcm92aWRlciddXG4gICAgICB9KS5waXBlKFxuICAgICAgICBza2lwV2hpbGUocmVzcCA9PiByZXNwLmlzX2xvYWRpbmcpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IERvY3VtZW50Q29sbGVjdGlvbjxSZWNpcGU+KSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1Jlc3VsdHMocmVzdWx0LmRhdGEsIHJlcXVlc3RGaWx0ZXJzLCBwYWdlKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzUmVzdWx0cyhyZXN1bHRzOiBSZWNpcGVbXSwgcmVxdWVzdEZpbHRlcnMsIHBhZ2UpIHtcbiAgICAvLyBCZWNhdXNlIEZpbHRlciBpcyBhIHR5cGUsIGF0dHJpYnV0ZXMgYXJlIGFsd2F5cyBpbiB0aGUgc2FtZSBvcmRlciwgc28gc3RyaW5naWZ5IHdvbid0IGJlIGZhbHNlIGZvciBvYmplY3RzIHdpdGggc2FtZSBhdHRyaWJ1dGVzXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHJlcXVlc3RGaWx0ZXJzKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5yZW1vdGVGaWx0ZXJzKSkge1xuICAgICAgLy8gR2V0IGFsbCByZWNpcGUtbGlrZXMgYmVmb3JlIGRpc3BsYXlpbmdcbiAgICAgIHRoaXMucmVjaXBlTGlrZXNTZXJ2aWNlLmFkZExpa2VzVG9SZWNpcGVzKHJlc3VsdHMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAvLyBpZiB5b3Ugc3BhbSBjbGljayBvbiBmaWx0ZXJzLCBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIHBhZ2UgPT0gMSBjb3VsZCBiZSBzZW50IGZvciB0aGUgc2FtZSBmaWx0ZXJzIC0+IG9ubHkga2VlcCB0aGUgbGFzdCByZXN1bHRcbiAgICAgICAgdGhpcy5jdXJyZW50UmVjaXBlcyA9IHBhZ2UgPT09IDEgPyByZXN1bHRzIDogWy4uLnRoaXMuY3VycmVudFJlY2lwZXMsIC4uLnJlc3VsdHNdO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub01vcmVSZWNpcGVzID0gcmVzdWx0cy5sZW5ndGggPT09IDA7XG4gICAgICAgIHRoaXMucmV0cmlldmVkUmVjaXBlcy5lbWl0KHRoaXMuY3VycmVudFJlY2lwZXMpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZGVidWcoJ0ZpbHRlcmluZyBhYm9ydGVkIDogJyArIEpTT04uc3RyaW5naWZ5KHJlcXVlc3RGaWx0ZXJzKSArICdhbmQnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5yZW1vdGVGaWx0ZXJzKSArICdhcmUgZGlmZmVyZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmlsdGVyKGZpbHRlck5hbWUpIHtcbiAgICB0aGlzLmZpbHRlclJlbW92ZWQuZW1pdChmaWx0ZXJOYW1lKTtcbiAgfVxuXG4gIGJ1aWxkUmVtb3RlRmlsdGVycygpIHtcbiAgICB0aGlzLmZpbHRlcnNBcmVFbXB0eSA9ICEodGhpcy5maWx0ZXJzLnNlYXJjaCAmJiB0aGlzLmZpbHRlcnMuc2VhcmNoICE9PSAnJyk7XG4gICAgY29uc3QgZGlmZmljdWx0eSA9IHRoaXMuYnVpbGRSZW1vdGVGaWx0ZXIodGhpcy5maWx0ZXJzLmRpZmZpY3VsdHksICctJyk7XG4gICAgY29uc3QgY29zdCA9IHRoaXMuYnVpbGRSZW1vdGVGaWx0ZXIodGhpcy5maWx0ZXJzLmNvc3QsICctJykuc3BsaXQoJy0nKTtcbiAgICBjb25zdCB0b3RhbFRpbWUgPSB0aGlzLmJ1aWxkUmVtb3RlRmlsdGVyKHRoaXMuZmlsdGVycy50aW1lLCAnLCcpO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIC4uLihkaWZmaWN1bHR5Lmxlbmd0aCA+IDApID8geyBkaWZmaWN1bHR5OiBkaWZmaWN1bHR5ICsgJyxlcScgfSA6IHt9LCAvLyBleDogZmlsdGVyW2RpZmZpY3VsdHldPTEtMi0zLGVxID0+IGFsbCBjaGVja2VkXG4gICAgICAuLi4oY29zdC5sZW5ndGggPT09IDIpID8geyBjb21wdXRlZF9jb3N0OiBjb3N0WzBdICsgJyxndCwnICsgY29zdFsxXSArICcsbHQnIH0gOiB7fSwgLy8gZXg6IGZpbHRlcltjb3N0XT01LGd0LDEwLGx0ID0+IDUgPCBjb3N0IDwgMTBcbiAgICAgIC4uLih0b3RhbFRpbWUubGVuZ3RoID4gMCkgPyB7ICd0b3RhbC10aW1lJzogdG90YWxUaW1lIH0gOiB7fSxcbiAgICAgIC4uLih0aGlzLmZpbHRlcnMuYWRkaXRpb25hbEZpbHRlcnM/LmZpbHRlcnMpID8gdGhpcy5maWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzLmZpbHRlcnMgOiB7fSxcbiAgICAgIC4uLih0aGlzLmZpbHRlcnMuc2VhcmNoKSA/IHtzZWFyY2g6IHRoaXMuZmlsdGVycy5zZWFyY2ggfSA6IHt9XG4gICAgfTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIC8vIFJlYWRzIHRoZSB2YWx1ZXMgb2YgYSBmaWVsZCBhbmQgY29udmVydHMgaXQgdG8gdGhlIHN0cmluZyB0byBwYXNzIGluIHRoZSByZW1vdGVGaWx0ZXJzXG4gIC8vIGV4OiBidWlsZFJlbW90ZUZpbHRlcih7XG4gIC8vICAge25hbWU6ICcxJywgdmFsdWU6IHRydWUsIHRleHQ6ICdGYWNpbGUnfSxcbiAgLy8gICB7bmFtZTogJzInLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICdNb3llbid9LFxuICAvLyAgIHtuYW1lOiAnMycsIHZhbHVlOiB0cnVlLCB0ZXh0OiAnRGlmZmljaWxlJ31cbiAgLy8gfSwgJy0nKSAgPT0+ICcxLTMnXG4gIGJ1aWxkUmVtb3RlRmlsdGVyKGZpbHRlcjogUmVjaXBlRmlsdGVyW10sIHNlcGFyYXRvcjogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIpIHtcbiAgICAgIGlmIChmLnZhbHVlKSB7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgeyByZXN1bHQgKz0gc2VwYXJhdG9yOyB9XG4gICAgICAgIHJlc3VsdCArPSBmLm5hbWU7XG4gICAgICAgIHRoaXMuZmlsdGVyc0FyZUVtcHR5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBidWlsZEZpbHRlcnNBcnJheSgpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGZpbHRlck5hbWVzID0gW107XG4gICAgZmlsdGVyTmFtZXMgPSBbLi4uZmlsdGVyTmFtZXMsIC4uLnRoaXMuZ2V0U2VsZWN0ZWRGaWx0ZXJzKHRoaXMuZmlsdGVycy5jb3N0KSwgLi4udGhpcy5nZXRTZWxlY3RlZEZpbHRlcnModGhpcy5maWx0ZXJzLmRpZmZpY3VsdHkpLFxuICAgICAgLi4udGhpcy5nZXRTZWxlY3RlZEZpbHRlcnModGhpcy5maWx0ZXJzLnRpbWUpXTtcbiAgICBpZiAodGhpcy5maWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzICYmIHRoaXMuZmlsdGVycy5hZGRpdGlvbmFsRmlsdGVycy50aXRsZSAhPT0gJycpIHtcbiAgICAgIGZpbHRlck5hbWVzID0gW3RoaXMuZmlsdGVycy5hZGRpdGlvbmFsRmlsdGVycy50aXRsZV0uY29uY2F0KGZpbHRlck5hbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlck5hbWVzO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRGaWx0ZXJzKGZpbHRlcnNBcnJheSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZmlsdGVyc0FycmF5LmZpbHRlcihlbCA9PiBlbC52YWx1ZSkubWFwKGVsID0+IGVsLnRleHQpO1xuICB9XG5cbiAgcmVsb2FkUGFnZSgpIHtcbiAgICB0aGlzLmxhc3RQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY3VycmVudFJlY2lwZXMgPSBbXTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkUmVjaXBlc1BhZ2UodGhpcy5sYXN0UGFnZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtaWFtLWNhdGFsb2ctbGlzdF9fY2FyZHNcIj5cblxuICA8ZGl2ICpuZ0lmPVwiZmlsdGVyc1RvRGlzcGxheS5sZW5ndGggPiAwXCIgY2xhc3M9XCJtaWFtLWNhdGFsb2ctbGlzdF9fZmlsdGVyc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJtaWFtLWNhdGFsb2ctbGlzdF9fZmlsdGVyX190aXRsZVwiPlZvcyBmaWx0cmVzPC9kaXY+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGZpbHRlcnNUb0Rpc3BsYXlcIiBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19maWx0ZXJcIj5cbiAgICAgIDxzcGFuPnt7ZmlsdGVyfX08L3NwYW4+XG4gICAgICA8bmctbWlhbS1pY29uIFxuICAgICAgICBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19maWx0ZXJfX2ljb25cIiBcbiAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihmaWx0ZXIpXCIgXG4gICAgICAgIFtpY29uTmFtZV09XCJpY29uLkNsZWFyXCJcbiAgICAgICAgcHJpbWFyeUNvbG9yPVwidmFyKC0tbS1jb2xvci1wcmltYXJ5KVwiPlxuICAgICAgPC9uZy1taWFtLWljb24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiBjdXJyZW50UmVjaXBlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19ub3RGb3VuZFwiPlxuICAgIDxuZy1taWFtLWljb24gY2xhc3M9XCJtaWFtLWNhdGFsb2ctbGlzdF9fbm90Rm91bmRfX2ljb25cIiBbd2lkdGhdPVwiMjc5XCIgW2hlaWdodF09XCIyNDNcIiBbaWNvbk5hbWVdPVwiaWNvbi5Ob1JlY2lwZUZvdW5kXCI+PC9uZy1taWFtLWljb24+XG4gICAgPGRpdiBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19ub3RGb3VuZF9fdGl0bGUxXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIm5vUmVjaXBlVGV4dEZpcnN0TGluZSAmJiBmaWx0ZXJzQXJlRW1wdHkgZWxzZSBkZWZhdWx0Rmlyc3RMaW5lXCI+XG4gICAgICAgIHt7bm9SZWNpcGVUZXh0Rmlyc3RMaW5lfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEZpcnN0TGluZT5cbiAgICAgICAgPHNwYW4+RMOpc29sw6ksIGF1Y3VuZSBwcm9wb3NpdGlvbiB0cm91dsOpZSA8L3NwYW4+IFxuICAgICAgICA8c3BhbiAqbmdJZj1cImZpbHRlcnMuc2VhcmNoXCI+cG91ciBcInt7ZmlsdGVycy5zZWFyY2h9fVwiPC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWlhbS1jYXRhbG9nLWxpc3RfX25vdEZvdW5kX190aXRsZTJcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwibm9SZWNpcGVUZXh0U2Vjb25kTGluZSAmJiBmaWx0ZXJzQXJlRW1wdHkgZWxzZSBkZWZhdWx0U2Vjb25kTGluZVwiPlxuICAgICAgICB7e25vUmVjaXBlVGV4dFNlY29uZExpbmV9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U2Vjb25kTGluZT5cbiAgICAgICAgVmV1aWxsZXogbW9kaWZpZXIgbGVzIHRlcm1lcyBkZSB2b3RyZSByZWNoZXJjaGUgb3UgcsOpZ2xlciBsZXMgZmlsdHJlc1xuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy1taWFtLWNhcmQtY3JlYXRlLXJlY2lwZSAqbmdJZj1cImluc2VydENyZWF0ZUNhcmQgJiYgY3VycmVudFJlY2lwZXMubGVuZ3RoICE9PSAwXCIgKGNsaWNrZWQpPVwicmVjaXBlQWN0aW9uVHJpZ2dlcmVkLmVtaXQoe2FjdGlvbjogJ0NSRUFURScsIHJlY2lwZTogbnVsbH0pXCIgY2xhc3M9XCJtaWFtLWNhdGFsb2ctbGlzdF9fY2FyZFwiPjwvbmctbWlhbS1jYXJkLWNyZWF0ZS1yZWNpcGU+XG4gIDxkaXYgKm5nRm9yPVwibGV0IHJlY2lwZSBvZiBjdXJyZW50UmVjaXBlc1wiIGNsYXNzPVwibWlhbS1jYXRhbG9nLWxpc3RfX2NhcmRcIj5cbiAgICA8bmctbWlhbS1jYXRhbG9nLXJlY2lwZS1jYXJkIFtyZWNpcGVdPSdyZWNpcGUnIChhY3Rpb25UcmlnZ2VyZWQpPVwicmVjaXBlQWN0aW9uVHJpZ2dlcmVkLmVtaXQoe2FjdGlvbjogJGV2ZW50LCByZWNpcGU6IHJlY2lwZX0pXCI+PC9uZy1taWFtLWNhdGFsb2ctcmVjaXBlLWNhcmQ+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwibWlhbS1jYXRhbG9nLWxpc3RfX2xvYWRlclwiPlxuICAgIDxuZy1taWFtLWxvYWRlcj48L25nLW1pYW0tbG9hZGVyPlxuICAgIDxkaXY+XG4gICAgICBDaGFyZ2VtZW50IGRlcyByZWNldHRlcy4uLlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBpZD1cIm1pYW0tY2F0YWxvZy1saXN0X19hbmNob3JcIj48L2Rpdj5cbjwvZGl2PiJdfQ==
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIvYnVpbGRzL21pYW0vbmctbWlhbS1zZGsvcHJvamVjdHMvbmctbWlhbS9zcmMvIiwic291cmNlcyI6WyJsaWIvX3dlYi1jb21wb25lbnRzL2NhdGFsb2ctbGlzdC9jYXRhbG9nLWxpc3QuY29tcG9uZW50LnRzIiwibGliL193ZWItY29tcG9uZW50cy9jYXRhbG9nLWxpc3QvY2F0YWxvZy1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFHakIsTUFBTSxFQUNOLFlBQVksRUFDWixLQUFLLEVBRU4sTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5QyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7SUNoQjlCLCtCQUNFO0lBQUEsNEJBQU07SUFBQSxZQUFVO0lBQUEsaUJBQU87SUFDdkIsd0NBS2U7SUFIYixpUEFBOEI7SUFHaEMsaUJBQWU7SUFDakIsaUJBQU07Ozs7SUFQRSxlQUFVO0lBQVYsK0JBQVU7SUFJZCxlQUF1QjtJQUF2Qiw0Q0FBdUI7OztJQVA3Qiw4QkFDRTtJQUFBLDhCQUE4QztJQUFBLDJCQUFXO0lBQUEsaUJBQU07SUFDL0QsMkVBQ0U7SUFRSixpQkFBTTs7O0lBVEMsZUFBdUM7SUFBdkMsaURBQXVDOzs7SUFjMUMsNEJBQ0U7SUFBQSxZQUNGO0lBQUEsaUJBQU87OztJQURMLGVBQ0Y7SUFERSw4REFDRjs7O0lBR0UsNEJBQTZCO0lBQUEsWUFBeUI7SUFBQSxpQkFBTzs7O0lBQWhDLGVBQXlCO0lBQXpCLDhEQUF5Qjs7O0lBRHRELDRCQUFNO0lBQUEsa0VBQW1DO0lBQUEsaUJBQU87SUFDaEQsNEZBQTZCOzs7SUFBdkIsZUFBc0I7SUFBdEIsNkNBQXNCOzs7SUFJOUIsNEJBQ0U7SUFBQSxZQUNGO0lBQUEsaUJBQU87OztJQURMLGVBQ0Y7SUFERSwrREFDRjs7O0lBRUUsNEZBQ0Y7OztJQWpCSiwrQkFDRTtJQUFBLG1DQUFvSTtJQUNwSSwrQkFDRTtJQUFBLDhFQUNFO0lBRUYsNkhBQ0U7SUFHSixpQkFBTTtJQUNOLCtCQUNFO0lBQUEsOEVBQ0U7SUFFRiw2SEFDRTtJQUVKLGlCQUFNO0lBQ1IsaUJBQU07Ozs7O0lBbEJvRCxlQUFhO0lBQWIsMkJBQWEsZUFBQSx1Q0FBQTtJQUU3RCxlQUFzRTtJQUF0RSw2RUFBc0Usa0JBQUE7SUFTdEUsZUFBd0U7SUFBeEUsOEVBQXdFLGtCQUFBOzs7O0lBUWxGLHNEQUEwTjtJQUF0SSxrTkFBVyw2Q0FBb0MsUUFBUSxVQUFVLElBQUksR0FBRSxJQUFDO0lBQWlDLGlCQUE2Qjs7OztJQUMxTiwrQkFDRTtJQUFBLHVEQUE4SjtJQUEvRyxvUEFBbUIsMEVBQTRELElBQUM7SUFBQyxpQkFBOEI7SUFDaEssaUJBQU07OztJQUR5QixlQUFpQjtJQUFqQixtQ0FBaUI7OztJQUVoRCwrQkFDRTtJQUFBLG1EQUFpRjtJQUNuRixpQkFBTTs7O0lBRDBCLGVBQW1CO0lBQW5CLHFDQUFtQjs7O0lBRW5ELCtCQUNFO0lBQUEsaUNBQWlDO0lBQ2pDLDJCQUNFO0lBQUEsa0RBQ0Y7SUFBQSxpQkFBTTtJQUNSLGlCQUFNOztBRGxCUixNQUFNLE9BQU8sb0JBQW9CO0lBMEIvQixZQUNVLGNBQThCLEVBQzlCLGtCQUFzQyxFQUN0QyxlQUFnQyxFQUNoQyxPQUF1QixFQUN2QixHQUFzQjtRQUp0QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEzQnZCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFDaEQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzNDLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFvQyxDQUFDO1FBRXZGLG1CQUFjLEdBQWEsRUFBRSxDQUFDO1FBQzlCLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFFYixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRXZCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUN0QixhQUFRLEdBQWMsRUFBRSxDQUFDO1FBRWpCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBV3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsbUVBQW1FO1FBQ25FLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUcsMEdBQTBHO1FBQzFHLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQzNCLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUM5RCxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsa0VBQWtFO1NBQ3pILENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztRQUNuRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkQsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELDBCQUEwQjtRQUN4QixJQUNFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUMvRztZQUNBLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsZUFBZSxDQUFDLElBQVk7UUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2Y7UUFFRCwrR0FBK0c7UUFDL0csNERBQTREO1FBQzVELE1BQU0sY0FBYyxxQkFBUSxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUM7UUFDakQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQ25GLFNBQVMsQ0FBQyxDQUFDLE1BQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUNuRixDQUFDO1NBQ0g7YUFDSTtZQUNILE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7Z0JBQzdCLFlBQVksRUFBRSxjQUFjO2dCQUM1QixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2hDLE9BQU8sRUFBRSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUM7YUFDeEcsQ0FBQyxDQUFDLElBQUksQ0FDTCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQ2xDLFNBQVMsQ0FBQyxDQUFDLE1BQWtDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDMUcsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFpQixFQUFFLGNBQWMsRUFBRSxJQUFJO1FBQ3BELGtJQUFrSTtRQUNsSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDekUsaUlBQWlJO1lBQ2pJLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFFMUMseUNBQXlDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDNUQsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDUCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDaEQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUNILENBQUM7U0FDSDthQUNJO1lBQ0gsdUNBQXVDO1lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7WUFDdEksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDZjtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsVUFBVTtRQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsa0JBQWtCOztRQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFakUsTUFBTSxPQUFPLDZFQUNSLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQ2pFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FDaEYsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUN6RCxPQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLDBDQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUN2RixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDL0QsQ0FBQztRQUNGLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx5RkFBeUY7SUFDekYsMEJBQTBCO0lBQzFCLDhDQUE4QztJQUM5Qyw4Q0FBOEM7SUFDOUMsZ0RBQWdEO0lBQ2hELHFCQUFxQjtJQUNyQixpQkFBaUIsQ0FBQyxNQUFzQixFQUFFLFNBQWlCO1FBQ3pELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1gsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFBRSxNQUFNLElBQUksU0FBUyxDQUFDO2lCQUFFO2dCQUMvQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDakIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7YUFDOUI7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsV0FBVyxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUMvSCxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUNqRixXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUMxRTtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxZQUFZO1FBQzdCLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLGdJQUFnSTtJQUNoSSxnRUFBZ0U7SUFDeEQsWUFBWSxDQUFDLElBQVk7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDZjtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0RSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO1lBQzlCLFlBQVksRUFBRSxjQUFjO1lBQzVCLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUNoQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7U0FBRSxDQUFDLENBQUMsSUFBSSxDQUN2QixHQUFHLENBQUMsQ0FBQyxNQUFtQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMvRixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOzt3RkFwT1Usb0JBQW9CO3lEQUFwQixvQkFBb0I7UUM3QmpDLDhCQUVFO1FBQUEscUVBQ0U7UUFZRixzRUFDRTtRQW1CRixtSEFBNkw7UUFDN0wscUVBQ0U7UUFFRixxRUFDRTtRQUVGLHFFQUNFO1FBS0YseUJBQTBDO1FBQzVDLGlCQUFNOztRQS9DQyxlQUFtQztRQUFuQyxzREFBbUM7UUFhbkMsZUFBd0U7UUFBeEUsbUdBQXdFO1FBb0JqRCxlQUF1RDtRQUF2RCw4RUFBdUQ7UUFDOUUsZUFBcUM7UUFBckMsNENBQXFDO1FBR3JDLGVBQWdDO1FBQWhDLHNDQUFnQztRQUdoQyxlQUFlO1FBQWYsa0NBQWU7O2tERGJULG9CQUFvQjtjQVBoQyxTQUFTO2VBQUM7Z0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtnQkFDaEMsV0FBVyxFQUFFLCtCQUErQjtnQkFDNUMsU0FBUyxFQUFFLENBQUMsK0JBQStCLENBQUM7Z0JBQzVDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2dCQUNyQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNoRDs2TEFFVSxPQUFPO2tCQUFmLEtBQUs7WUFDRyxxQkFBcUI7a0JBQTdCLEtBQUs7WUFDRyxzQkFBc0I7a0JBQTlCLEtBQUs7WUFDRyxnQkFBZ0I7a0JBQXhCLEtBQUs7WUFDRyxVQUFVO2tCQUFsQixLQUFLO1lBQ0ksZ0JBQWdCO2tCQUF6QixNQUFNO1lBQ0csYUFBYTtrQkFBdEIsTUFBTTtZQUNHLHFCQUFxQjtrQkFBOUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9jdW1lbnRDb2xsZWN0aW9uIH0gZnJvbSAnbmd4LWpzb25hcGknO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2tpcFdoaWxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBcnRpY2xlIH0gZnJvbSAnLi4vLi4vX21vZGVscyc7XG5pbXBvcnQgeyBSZWNpcGUgfSBmcm9tICcuLi8uLi9fbW9kZWxzL3JlY2lwZSc7XG5pbXBvcnQgeyBBcnRpY2xlc1NlcnZpY2UsIENvbnRleHRTZXJ2aWNlLCBSZWNpcGVMaWtlc1NlcnZpY2UsIFJlY2lwZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzJztcbmltcG9ydCB7IEljb24gfSBmcm9tICcuLi8uLi9fdHlwZXMvaWNvbi5lbnVtJztcbmltcG9ydCB7IFJlY2lwZUZpbHRlciwgUmVjaXBlRmlsdGVycyB9IGZyb20gJy4uLy4uL190eXBlcy9yZWNpcGUtZmlsdGVycyc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gtZXMvcGljayc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLW1pYW0tY2F0YWxvZy1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhdGFsb2ctbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhdGFsb2ctbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDYXRhbG9nTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBmaWx0ZXJzOiBSZWNpcGVGaWx0ZXJzO1xuICBASW5wdXQoKSBub1JlY2lwZVRleHRGaXJzdExpbmU6IHN0cmluZztcbiAgQElucHV0KCkgbm9SZWNpcGVUZXh0U2Vjb25kTGluZTogc3RyaW5nO1xuICBASW5wdXQoKSBpbnNlcnRDcmVhdGVDYXJkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJhbmRvbU1vZGUgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHJldHJpZXZlZFJlY2lwZXMgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY2lwZVtdPigpO1xuICBAT3V0cHV0KCkgZmlsdGVyUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcmVjaXBlQWN0aW9uVHJpZ2dlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx7YWN0aW9uOiBzdHJpbmcsIHJlY2lwZTogUmVjaXBlfT4oKTtcblxuICBjdXJyZW50UmVjaXBlczogUmVjaXBlW10gPSBbXTtcbiAgbGFzdFBhZ2UgPSAwO1xuICBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXTtcbiAgbG9hZGluZyA9IHRydWU7XG4gIGljb24gPSBJY29uO1xuICBub01vcmVSZWNpcGVzID0gZmFsc2U7XG4gIG5vTW9yZUFydGljbGVzID0gZmFsc2U7XG4gIGJvdHRvbUFuY2hvcjogSFRNTEVsZW1lbnQ7XG4gIGZpbHRlcnNBcmVFbXB0eSA9IHRydWU7XG4gIGZpbHRlcnNUb0Rpc3BsYXkgPSBbXTtcbiAgYXJ0aWNsZXM6IEFydGljbGVbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVtb3RlRmlsdGVycyA9IHt9O1xuICBwcml2YXRlIGludGVyc2VjdGlvbk9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlcjtcbiAgcHJpdmF0ZSBtdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVjaXBlc1NlcnZpY2U6IFJlY2lwZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVjaXBlTGlrZXNTZXJ2aWNlOiBSZWNpcGVMaWtlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcnRpY2xlc1NlcnZpY2U6IEFydGljbGVzU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRleHQ6IENvbnRleHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRSZWNpcGVzID0gW107XG4gICAgdGhpcy5maWx0ZXJzID0geyBzZWFyY2g6ICcnIH07XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmJvdHRvbUFuY2hvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtaWFtLWNhdGFsb2ctbGlzdF9fYW5jaG9yJyk7XG4gICAgdGhpcy5pbml0TG9hZE9uU2Nyb2xsKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLnJlbW90ZUZpbHRlcnMgPSB0aGlzLmJ1aWxkUmVtb3RlRmlsdGVycygpO1xuICAgIHRoaXMuZmlsdGVyc1RvRGlzcGxheSA9IHRoaXMuYnVpbGRGaWx0ZXJzQXJyYXkoKTtcbiAgICB0aGlzLnJlbG9hZFBhZ2UoKTtcbiAgfVxuXG4gIGluaXRMb2FkT25TY3JvbGwoKSB7XG4gICAgLy8gUmVjZWl2ZSBhbiBldmVudCBlYWNoIHRpbWUgdGhlIGFuY2hvciBlbnRlcnMvbGVhdmVzIHRoZSB2aWV3cG9ydFxuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKFtlbnRyeV0pID0+IHsgdGhpcy5hdXRvbG9hZENvbnRlbnRJZk5lY2Vzc2FyeSgpOyB9LCB7fSk7XG4gICAgLy8gUmVjZWl2ZSBhbiBldmVudCBlYWNoIHRpbWUgYW4gYXR0cmlidXRlL2NoaWxkIGlzIGFkZGVkL2RlbGV0ZWQvdXBkYXRlZCBpbiB0aGUgcGFyZW50IGRpdiBvZiB0aGUgcmVjaXBlc1xuICAgIC8vIGkuZS4gd2lsbCBiZSB0cmlnZ2VyZWQgZWFjaCB0aW1lIG5ldyByZWNpcGVzIGFyZSBkaXNwbGF5ZWRcbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7IHRoaXMuYXV0b2xvYWRDb250ZW50SWZOZWNlc3NhcnkoKTsgfSk7XG5cbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5ib3R0b21BbmNob3IpO1xuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbWlhbS1jYXRhbG9nLWxpc3RfX2NhcmRzJylbMF0sXG4gICAgICB7IGF0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogZmFsc2UgfSAvLyBzdWJ0cmVlIGZhbHNlID0+IGNoYW5nZXMgb24gY2hpbGRyZW4gd29uJ3QgdHJpZ2dlciB0aGUgY2FsbGJhY2tcbiAgICApO1xuICB9XG5cbiAgYW5jaG9ySXNPblNjcmVlbigpIHtcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmJvdHRvbUFuY2hvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gKHJlY3QudG9wIDw9IHZpZXdwb3J0SGVpZ2h0ICYmIHJlY3QuYm90dG9tID49IDApO1xuICB9XG5cbiAgYXV0b2xvYWRDb250ZW50SWZOZWNlc3NhcnkoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5hbmNob3JJc09uU2NyZWVuKCkgJiYgIXRoaXMubG9hZGluZyAmJlxuICAgICAgKCh0aGlzLmN1cnJlbnRSZWNpcGVzLmxlbmd0aCA+IDAgJiYgIXRoaXMubm9Nb3JlUmVjaXBlcykgfHwgKHRoaXMuYXJ0aWNsZXMubGVuZ3RoID4gMCAmJiAhdGhpcy5ub01vcmVBcnRpY2xlcykpXG4gICAgKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlKCk7XG4gICAgfVxuICB9XG5cbiAgbG9hZE1vcmUoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmxhc3RQYWdlKys7XG4gICAgdGhpcy5sb2FkQ29udGVudCgpO1xuICB9XG5cbiAgbG9hZFJlY2lwZXNQYWdlKHBhZ2U6IG51bWJlcik6IE9ic2VydmFibGU8UmVjaXBlW10+IHtcbiAgICBpZiAodGhpcy5ub01vcmVSZWNpcGVzKSB7XG4gICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cblxuICAgIC8vIGtlZXAgYSBjb3B5IG9mIHRoZSBmaWx0ZXJzIHdoZW4gcmVxdWVzdCBpcyBzZW50LCBzbyB3ZSBjYW4gY2hlY2sgdGhleSBhcmUgc3RpbGwgdGhlIHNhbWUgd2hlbiBpdCBpcyByZWNlaXZlZFxuICAgIC8vIEJlY2F1c2UgaWYgaXQncyBub3QgdGhlIGNhc2Ugd2UgaGF2ZSB0byBpbmdvcmUgdGhlIHJlc3VsdFxuICAgIGNvbnN0IHJlcXVlc3RGaWx0ZXJzID0geyAuLi50aGlzLnJlbW90ZUZpbHRlcnMgfTtcbiAgICBpZiAodGhpcy5yYW5kb21Nb2RlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWNpcGVzU2VydmljZS5nZXRSYW5kb20oeyBzaXplOiAyMCwgbnVtYmVyOiBwYWdlIH0sIHJlcXVlc3RGaWx0ZXJzKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdDogUmVjaXBlW10pID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHMocmVzdWx0LCByZXF1ZXN0RmlsdGVycywgcGFnZSkpXG4gICAgICApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlY2lwZXNTZXJ2aWNlLmFsbCh7XG4gICAgICAgIHJlbW90ZWZpbHRlcjogcmVxdWVzdEZpbHRlcnMsXG4gICAgICAgIHBhZ2U6IHsgc2l6ZTogMjAsIG51bWJlcjogcGFnZSB9LFxuICAgICAgICBpbmNsdWRlOiBbJ2luZ3JlZGllbnRzJywgJ3JlY2lwZS1zdGVwcycsICdyZWNpcGUtdHlwZScsICdyZWNpcGUtc3RhdHVzJywgJ3Nwb25zb3JzJywgJ3JlY2lwZS1wcm92aWRlciddXG4gICAgICB9KS5waXBlKFxuICAgICAgICBza2lwV2hpbGUocmVzcCA9PiByZXNwLmlzX2xvYWRpbmcpLFxuICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdDogRG9jdW1lbnRDb2xsZWN0aW9uPFJlY2lwZT4pID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHMocmVzdWx0LmRhdGEsIHJlcXVlc3RGaWx0ZXJzLCBwYWdlKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc1Jlc3VsdHMocmVzdWx0czogUmVjaXBlW10sIHJlcXVlc3RGaWx0ZXJzLCBwYWdlKTogT2JzZXJ2YWJsZTxSZWNpcGVbXT4ge1xuICAgIC8vIEJlY2F1c2UgRmlsdGVyIGlzIGEgdHlwZSwgYXR0cmlidXRlcyBhcmUgYWx3YXlzIGluIHRoZSBzYW1lIG9yZGVyLCBzbyBzdHJpbmdpZnkgd29uJ3QgYmUgZmFsc2UgZm9yIG9iamVjdHMgd2l0aCBzYW1lIGF0dHJpYnV0ZXNcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkocmVxdWVzdEZpbHRlcnMpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLnJlbW90ZUZpbHRlcnMpKSB7XG4gICAgICAvLyBpZiB5b3Ugc3BhbSBjbGljayBvbiBmaWx0ZXJzLCBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIHBhZ2UgPT0gMSBjb3VsZCBiZSBzZW50IGZvciB0aGUgc2FtZSBmaWx0ZXJzIC0+IG9ubHkga2VlcCB0aGUgbGFzdCByZXN1bHRcbiAgICAgIHRoaXMuY3VycmVudFJlY2lwZXMgPSBwYWdlID09PSAxID8gcmVzdWx0cyA6IFsuLi50aGlzLmN1cnJlbnRSZWNpcGVzLCAuLi5yZXN1bHRzXTtcbiAgICAgIHRoaXMubm9Nb3JlUmVjaXBlcyA9IHJlc3VsdHMubGVuZ3RoID09PSAwO1xuXG4gICAgICAvLyBHZXQgYWxsIHJlY2lwZS1saWtlcyBiZWZvcmUgZGlzcGxheWluZ1xuICAgICAgcmV0dXJuIHRoaXMucmVjaXBlTGlrZXNTZXJ2aWNlLmFkZExpa2VzVG9SZWNpcGVzKHJlc3VsdHMpLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXRyaWV2ZWRSZWNpcGVzLmVtaXQodGhpcy5jdXJyZW50UmVjaXBlcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFJlY2lwZXM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgY29uc29sZS5kZWJ1ZygnRmlsdGVyaW5nIGFib3J0ZWQgOiAnICsgSlNPTi5zdHJpbmdpZnkocmVxdWVzdEZpbHRlcnMpICsgJ2FuZCcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnJlbW90ZUZpbHRlcnMpICsgJ2FyZSBkaWZmZXJlbnQnKTtcbiAgICAgIHJldHVybiBvZihbXSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmlsdGVyKGZpbHRlck5hbWUpIHtcbiAgICB0aGlzLmZpbHRlclJlbW92ZWQuZW1pdChmaWx0ZXJOYW1lKTtcbiAgfVxuXG4gIGJ1aWxkUmVtb3RlRmlsdGVycygpIHtcbiAgICB0aGlzLmZpbHRlcnNBcmVFbXB0eSA9ICEodGhpcy5maWx0ZXJzLnNlYXJjaCAmJiB0aGlzLmZpbHRlcnMuc2VhcmNoICE9PSAnJyk7XG4gICAgY29uc3QgZGlmZmljdWx0eSA9IHRoaXMuYnVpbGRSZW1vdGVGaWx0ZXIodGhpcy5maWx0ZXJzLmRpZmZpY3VsdHksICctJyk7XG4gICAgY29uc3QgY29zdCA9IHRoaXMuYnVpbGRSZW1vdGVGaWx0ZXIodGhpcy5maWx0ZXJzLmNvc3QsICctJykuc3BsaXQoJy0nKTtcbiAgICBjb25zdCB0b3RhbFRpbWUgPSB0aGlzLmJ1aWxkUmVtb3RlRmlsdGVyKHRoaXMuZmlsdGVycy50aW1lLCAnLCcpO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIC4uLihkaWZmaWN1bHR5Lmxlbmd0aCA+IDApID8geyBkaWZmaWN1bHR5OiBkaWZmaWN1bHR5ICsgJyxlcScgfSA6IHt9LCAvLyBleDogZmlsdGVyW2RpZmZpY3VsdHldPTEtMi0zLGVxID0+IGFsbCBjaGVja2VkXG4gICAgICAuLi4oY29zdC5sZW5ndGggPT09IDIpID8geyBjb21wdXRlZF9jb3N0OiBjb3N0WzBdICsgJyxndCwnICsgY29zdFsxXSArICcsbHQnIH0gOiB7fSwgLy8gZXg6IGZpbHRlcltjb3N0XT01LGd0LDEwLGx0ID0+IDUgPCBjb3N0IDwgMTBcbiAgICAgIC4uLih0b3RhbFRpbWUubGVuZ3RoID4gMCkgPyB7ICd0b3RhbC10aW1lJzogdG90YWxUaW1lIH0gOiB7fSxcbiAgICAgIC4uLih0aGlzLmZpbHRlcnMuYWRkaXRpb25hbEZpbHRlcnM/LmZpbHRlcnMpID8gdGhpcy5maWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzLmZpbHRlcnMgOiB7fSxcbiAgICAgIC4uLih0aGlzLmZpbHRlcnMuc2VhcmNoKSA/IHtzZWFyY2g6IHRoaXMuZmlsdGVycy5zZWFyY2ggfSA6IHt9XG4gICAgfTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIC8vIFJlYWRzIHRoZSB2YWx1ZXMgb2YgYSBmaWVsZCBhbmQgY29udmVydHMgaXQgdG8gdGhlIHN0cmluZyB0byBwYXNzIGluIHRoZSByZW1vdGVGaWx0ZXJzXG4gIC8vIGV4OiBidWlsZFJlbW90ZUZpbHRlcih7XG4gIC8vICAge25hbWU6ICcxJywgdmFsdWU6IHRydWUsIHRleHQ6ICdGYWNpbGUnfSxcbiAgLy8gICB7bmFtZTogJzInLCB2YWx1ZTogZmFsc2UsIHRleHQ6ICdNb3llbid9LFxuICAvLyAgIHtuYW1lOiAnMycsIHZhbHVlOiB0cnVlLCB0ZXh0OiAnRGlmZmljaWxlJ31cbiAgLy8gfSwgJy0nKSAgPT0+ICcxLTMnXG4gIGJ1aWxkUmVtb3RlRmlsdGVyKGZpbHRlcjogUmVjaXBlRmlsdGVyW10sIHNlcGFyYXRvcjogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIpIHtcbiAgICAgIGlmIChmLnZhbHVlKSB7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgeyByZXN1bHQgKz0gc2VwYXJhdG9yOyB9XG4gICAgICAgIHJlc3VsdCArPSBmLm5hbWU7XG4gICAgICAgIHRoaXMuZmlsdGVyc0FyZUVtcHR5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBidWlsZEZpbHRlcnNBcnJheSgpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGZpbHRlck5hbWVzID0gW107XG4gICAgZmlsdGVyTmFtZXMgPSBbLi4uZmlsdGVyTmFtZXMsIC4uLnRoaXMuZ2V0U2VsZWN0ZWRGaWx0ZXJzKHRoaXMuZmlsdGVycy5jb3N0KSwgLi4udGhpcy5nZXRTZWxlY3RlZEZpbHRlcnModGhpcy5maWx0ZXJzLmRpZmZpY3VsdHkpLFxuICAgICAgLi4udGhpcy5nZXRTZWxlY3RlZEZpbHRlcnModGhpcy5maWx0ZXJzLnRpbWUpXTtcbiAgICBpZiAodGhpcy5maWx0ZXJzLmFkZGl0aW9uYWxGaWx0ZXJzICYmIHRoaXMuZmlsdGVycy5hZGRpdGlvbmFsRmlsdGVycy50aXRsZSAhPT0gJycpIHtcbiAgICAgIGZpbHRlck5hbWVzID0gW3RoaXMuZmlsdGVycy5hZGRpdGlvbmFsRmlsdGVycy50aXRsZV0uY29uY2F0KGZpbHRlck5hbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlck5hbWVzO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRGaWx0ZXJzKGZpbHRlcnNBcnJheSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZmlsdGVyc0FycmF5LmZpbHRlcihlbCA9PiBlbC52YWx1ZSkubWFwKGVsID0+IGVsLnRleHQpO1xuICB9XG5cbiAgcmVsb2FkUGFnZSgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMubGFzdFBhZ2UgPSAxO1xuICAgIHRoaXMubm9Nb3JlUmVjaXBlcyA9IGZhbHNlO1xuICAgIHRoaXMubm9Nb3JlQXJ0aWNsZXMgPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnRSZWNpcGVzID0gW107XG4gICAgdGhpcy5hcnRpY2xlcyA9IFtdO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmxvYWRDb250ZW50KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cblxuICAvLyBBcnRpY2xlcyB3aWxsIGJlIGxvYWRlZCBvbmx5IGlmIGEgZmlsdGVyIGlzIGFwcGxpZWQgb24gcGFja2FnZXNcbiAgLy8gVGhpcyBpcyB0byBhdm9pZCBhcnRpY2xlcyBiZWluZyBsb2FkZWQgaW4gc3BlY2lhbCBwYWdlcyB3aGVyZSBvbmx5IGZpbHRlcnMgb24gcmVjaXBlcyBhcmUgcGFzc2VkIChmYXZvcml0ZXMsIHN1Z2dlc3RlZCwgZXRjLilcbiAgLy8gPT4gUGFja2FnZXMgbWl4aW5nIGFydGljbGVzIHdpdGggcmVjaXBlcyBpcyBub3Qgc3VwcG9ydGVkIHlldFxuICBwcml2YXRlIGxvYWRBcnRpY2xlcyhwYWdlOiBudW1iZXIpOiBPYnNlcnZhYmxlPEFydGljbGVbXT4ge1xuICAgIGlmICghdGhpcy5jb250ZXh0LmFydGljbGVzSW5DYXRhbG9nRW5hYmxlZCB8fCB0aGlzLm5vTW9yZUFydGljbGVzIHx8ICF0aGlzLnJlbW90ZUZpbHRlcnNbJ3BhY2thZ2VzJ10pIHtcbiAgICAgIHJldHVybiBvZihbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdEZpbHRlcnMgPSBwaWNrKHRoaXMucmVtb3RlRmlsdGVycywgJ3BhY2thZ2VzJywgJ3NlYXJjaCcpO1xuICAgIHJldHVybiB0aGlzLmFydGljbGVzU2VydmljZS5hbGwoe1xuICAgICAgcmVtb3RlZmlsdGVyOiByZXF1ZXN0RmlsdGVycyxcbiAgICAgIHBhZ2U6IHsgc2l6ZTogMjAsIG51bWJlcjogcGFnZSB9LFxuICAgICAgc29ydDogWyctZGF0ZSddIH0pLnBpcGUoXG4gICAgICBtYXAoKHJlc3VsdDogRG9jdW1lbnRDb2xsZWN0aW9uPEFydGljbGU+KSA9PiB7XG4gICAgICAgIHRoaXMuYXJ0aWNsZXMgPSBwYWdlID09PSAxID8gcmVzdWx0LmRhdGEgOiBbLi4udGhpcy5hcnRpY2xlcywgLi4ucmVzdWx0LmRhdGFdO1xuICAgICAgICB0aGlzLm5vTW9yZUFydGljbGVzID0gcmVzdWx0LmRhdGEubGVuZ3RoID09PSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5hcnRpY2xlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZENvbnRlbnQoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBmb3JrSm9pbihbdGhpcy5sb2FkUmVjaXBlc1BhZ2UodGhpcy5sYXN0UGFnZSksIHRoaXMubG9hZEFydGljbGVzKHRoaXMubGFzdFBhZ2UpXSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19jYXJkc1wiPlxuXG4gIDxkaXYgKm5nSWY9XCJmaWx0ZXJzVG9EaXNwbGF5Lmxlbmd0aCA+IDBcIiBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19maWx0ZXJzXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19maWx0ZXJfX3RpdGxlXCI+Vm9zIGZpbHRyZXM8L2Rpdj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyc1RvRGlzcGxheVwiIGNsYXNzPVwibWlhbS1jYXRhbG9nLWxpc3RfX2ZpbHRlclwiPlxuICAgICAgPHNwYW4+e3tmaWx0ZXJ9fTwvc3Bhbj5cbiAgICAgIDxuZy1taWFtLWljb24gXG4gICAgICAgIGNsYXNzPVwibWlhbS1jYXRhbG9nLWxpc3RfX2ZpbHRlcl9faWNvblwiIFxuICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGZpbHRlcilcIiBcbiAgICAgICAgW2ljb25OYW1lXT1cImljb24uQ2xlYXJcIlxuICAgICAgICBwcmltYXJ5Q29sb3I9XCJ2YXIoLS1tLWNvbG9yLXByaW1hcnkpXCI+XG4gICAgICA8L25nLW1pYW0taWNvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmIGN1cnJlbnRSZWNpcGVzLmxlbmd0aCA9PT0gMCAmJiBhcnRpY2xlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19ub3RGb3VuZFwiPlxuICAgIDxuZy1taWFtLWljb24gY2xhc3M9XCJtaWFtLWNhdGFsb2ctbGlzdF9fbm90Rm91bmRfX2ljb25cIiBbd2lkdGhdPVwiMjc5XCIgW2hlaWdodF09XCIyNDNcIiBbaWNvbk5hbWVdPVwiaWNvbi5Ob1JlY2lwZUZvdW5kXCI+PC9uZy1taWFtLWljb24+XG4gICAgPGRpdiBjbGFzcz1cIm1pYW0tY2F0YWxvZy1saXN0X19ub3RGb3VuZF9fdGl0bGUxXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIm5vUmVjaXBlVGV4dEZpcnN0TGluZSAmJiBmaWx0ZXJzQXJlRW1wdHkgZWxzZSBkZWZhdWx0Rmlyc3RMaW5lXCI+XG4gICAgICAgIHt7bm9SZWNpcGVUZXh0Rmlyc3RMaW5lfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEZpcnN0TGluZT5cbiAgICAgICAgPHNwYW4+RMOpc29sw6ksIGF1Y3VuZSBwcm9wb3NpdGlvbiB0cm91dsOpZSA8L3NwYW4+IFxuICAgICAgICA8c3BhbiAqbmdJZj1cImZpbHRlcnMuc2VhcmNoXCI+cG91ciBcInt7ZmlsdGVycy5zZWFyY2h9fVwiPC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWlhbS1jYXRhbG9nLWxpc3RfX25vdEZvdW5kX190aXRsZTJcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwibm9SZWNpcGVUZXh0U2Vjb25kTGluZSAmJiBmaWx0ZXJzQXJlRW1wdHkgZWxzZSBkZWZhdWx0U2Vjb25kTGluZVwiPlxuICAgICAgICB7e25vUmVjaXBlVGV4dFNlY29uZExpbmV9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U2Vjb25kTGluZT5cbiAgICAgICAgVmV1aWxsZXogbW9kaWZpZXIgbGVzIHRlcm1lcyBkZSB2b3RyZSByZWNoZXJjaGUgb3UgcsOpZ2xlciBsZXMgZmlsdHJlc1xuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy1taWFtLWNhcmQtY3JlYXRlLXJlY2lwZSAqbmdJZj1cImluc2VydENyZWF0ZUNhcmQgJiYgY3VycmVudFJlY2lwZXMubGVuZ3RoICE9PSAwXCIgKGNsaWNrZWQpPVwicmVjaXBlQWN0aW9uVHJpZ2dlcmVkLmVtaXQoe2FjdGlvbjogJ0NSRUFURScsIHJlY2lwZTogbnVsbH0pXCIgY2xhc3M9XCJtaWFtLWNhdGFsb2ctbGlzdF9fY2FyZFwiPjwvbmctbWlhbS1jYXJkLWNyZWF0ZS1yZWNpcGU+XG4gIDxkaXYgKm5nRm9yPVwibGV0IHJlY2lwZSBvZiBjdXJyZW50UmVjaXBlc1wiIGNsYXNzPVwibWlhbS1jYXRhbG9nLWxpc3RfX2NhcmRcIj5cbiAgICA8bmctbWlhbS1jYXRhbG9nLXJlY2lwZS1jYXJkIFtyZWNpcGVdPSdyZWNpcGUnIChhY3Rpb25UcmlnZ2VyZWQpPVwicmVjaXBlQWN0aW9uVHJpZ2dlcmVkLmVtaXQoe2FjdGlvbjogJGV2ZW50LCByZWNpcGU6IHJlY2lwZX0pXCI+PC9uZy1taWFtLWNhdGFsb2ctcmVjaXBlLWNhcmQ+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBhcnRpY2xlIG9mIGFydGljbGVzXCIgY2xhc3M9XCJtaWFtLWNhdGFsb2ctbGlzdF9fY2FyZFwiPlxuICAgIDxuZy1taWFtLWNhdGFsb2ctYXJ0aWNsZS1jYXJkIFthcnRpY2xlXT1cImFydGljbGVcIj48L25nLW1pYW0tY2F0YWxvZy1hcnRpY2xlLWNhcmQ+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwibWlhbS1jYXRhbG9nLWxpc3RfX2xvYWRlclwiPlxuICAgIDxuZy1taWFtLWxvYWRlcj48L25nLW1pYW0tbG9hZGVyPlxuICAgIDxkaXY+XG4gICAgICBDaGFyZ2VtZW50IGRlcyByw6lzdWx0YXRzLi4uXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGlkPVwibWlhbS1jYXRhbG9nLWxpc3RfX2FuY2hvclwiPjwvZGl2PlxuPC9kaXY+Il19