@jeraldj/discussions-ui 8.0.3-v16

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 (174) hide show
  1. package/README.md +24 -0
  2. package/assets/images/Buffer-512.webp +0 -0
  3. package/assets/images/announcement.svg +25 -0
  4. package/assets/images/back-img.png +0 -0
  5. package/assets/images/bookmarks.png +0 -0
  6. package/assets/images/card-icon.png +0 -0
  7. package/assets/images/close.png +0 -0
  8. package/assets/images/delete.svg +13 -0
  9. package/assets/images/down-arrow.png +0 -0
  10. package/assets/images/down-chevron.png +0 -0
  11. package/assets/images/down.svg +12 -0
  12. package/assets/images/edit.svg +11 -0
  13. package/assets/images/empty.svg +37 -0
  14. package/assets/images/eye-icon.png +0 -0
  15. package/assets/images/general discussion.svg +15 -0
  16. package/assets/images/import-export-arrows.png +0 -0
  17. package/assets/images/loader-icon.svg +6 -0
  18. package/assets/images/profits.png +0 -0
  19. package/assets/images/search-icon.png +0 -0
  20. package/assets/images/select-bookmarks.png +0 -0
  21. package/assets/images/select-down-arrow.png +0 -0
  22. package/assets/images/select-profits.png +0 -0
  23. package/assets/images/select-up-arrow.png +0 -0
  24. package/assets/images/up-arrow.png +0 -0
  25. package/assets/images/up-chevron.png +0 -0
  26. package/assets/images/up.svg +12 -0
  27. package/assets/images/views.svg +9 -0
  28. package/assets/images/votes.svg +14 -0
  29. package/assets/styles/global.scss +283 -0
  30. package/esm2022/jeraldj-discussions-ui.mjs +5 -0
  31. package/esm2022/lib/common/constants.json +630 -0
  32. package/esm2022/lib/components/components.module.mjs +105 -0
  33. package/esm2022/lib/components/discuss-all/discuss-all.component.mjs +269 -0
  34. package/esm2022/lib/components/discuss-category/discuss-category.component.mjs +152 -0
  35. package/esm2022/lib/components/discuss-home/discuss-home.component.mjs +142 -0
  36. package/esm2022/lib/components/discuss-start/discuss-start.component.mjs +199 -0
  37. package/esm2022/lib/components/discuss-tags/discuss-tags.component.mjs +93 -0
  38. package/esm2022/lib/components/discussion-details/discussion-details.component.mjs +459 -0
  39. package/esm2022/lib/components/lib-entry/lib-entry.component.mjs +96 -0
  40. package/esm2022/lib/components/my-discussion/my-discussion.component.mjs +234 -0
  41. package/esm2022/lib/components/side-pannel/side-pannel.component.mjs +79 -0
  42. package/esm2022/lib/components/tag-all-discussion/tag-all-discussion.component.mjs +151 -0
  43. package/esm2022/lib/components/trending-tags/trending-tags.component.mjs +62 -0
  44. package/esm2022/lib/config/url.config.mjs +32 -0
  45. package/esm2022/lib/discussion-events.service.mjs +27 -0
  46. package/esm2022/lib/discussion-routing/discussion-routing.module.mjs +80 -0
  47. package/esm2022/lib/discussion-ui.module.mjs +41 -0
  48. package/esm2022/lib/elements/app-loader/app-loader.component.mjs +36 -0
  49. package/esm2022/lib/elements/avatar-photo/avatar-photo.component.mjs +81 -0
  50. package/esm2022/lib/elements/category-card/category-card.component.mjs +17 -0
  51. package/esm2022/lib/elements/discuss-card/discuss-card.component.mjs +45 -0
  52. package/esm2022/lib/elements/elements.module.mjs +69 -0
  53. package/esm2022/lib/elements/load-alert/load-alert.component.mjs +34 -0
  54. package/esm2022/lib/elements/post-reply/post-reply.component.mjs +69 -0
  55. package/esm2022/lib/elements/related-discussion/related-discussion.component.mjs +61 -0
  56. package/esm2022/lib/elements/sliders/sliders.component.mjs +76 -0
  57. package/esm2022/lib/events.service.mjs +31 -0
  58. package/esm2022/lib/models/discuss.model.mjs +16 -0
  59. package/esm2022/lib/models/discussion-config.model.mjs +2 -0
  60. package/esm2022/lib/navigation-service.service.mjs +39 -0
  61. package/esm2022/lib/pipes/pipe-filter/pipe-filter.pipe.mjs +20 -0
  62. package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.mjs +22 -0
  63. package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.mjs +41 -0
  64. package/esm2022/lib/pipes/pipes.module.mjs +24 -0
  65. package/esm2022/lib/pipes/sort-by/sort-by.pipe.mjs +34 -0
  66. package/esm2022/lib/pipes/split-initials/split-initials.pipe.mjs +23 -0
  67. package/esm2022/lib/router-service.service.mjs +21 -0
  68. package/esm2022/lib/services/abstract-config.service.mjs +3 -0
  69. package/esm2022/lib/services/config.service.mjs +76 -0
  70. package/esm2022/lib/services/discuss-utils.service.mjs +36 -0
  71. package/esm2022/lib/services/discussion.service.mjs +254 -0
  72. package/esm2022/lib/telemetry-utils.service.mjs +103 -0
  73. package/esm2022/lib/wrapper/base-wrapper/base-wrapper.component.mjs +41 -0
  74. package/esm2022/lib/wrapper/category-widget/category-widget.component.mjs +37 -0
  75. package/esm2022/lib/wrapper/tags-widget/tags-widget.component.mjs +33 -0
  76. package/esm2022/lib/wrapper-navigate.service.mjs +23 -0
  77. package/esm2022/public-api.mjs +29 -0
  78. package/fesm2022/jeraldj-discussions-ui.mjs +3929 -0
  79. package/fesm2022/jeraldj-discussions-ui.mjs.map +1 -0
  80. package/index.d.ts +6 -0
  81. package/jeraldj-discussions-ui.d.ts.map +1 -0
  82. package/lib/components/components.module.d.ts +24 -0
  83. package/lib/components/components.module.d.ts.map +1 -0
  84. package/lib/components/discuss-all/discuss-all.component.d.ts +61 -0
  85. package/lib/components/discuss-all/discuss-all.component.d.ts.map +1 -0
  86. package/lib/components/discuss-category/discuss-category.component.d.ts +45 -0
  87. package/lib/components/discuss-category/discuss-category.component.d.ts.map +1 -0
  88. package/lib/components/discuss-home/discuss-home.component.d.ts +59 -0
  89. package/lib/components/discuss-home/discuss-home.component.d.ts.map +1 -0
  90. package/lib/components/discuss-start/discuss-start.component.d.ts +50 -0
  91. package/lib/components/discuss-start/discuss-start.component.d.ts.map +1 -0
  92. package/lib/components/discuss-tags/discuss-tags.component.d.ts +41 -0
  93. package/lib/components/discuss-tags/discuss-tags.component.d.ts.map +1 -0
  94. package/lib/components/discussion-details/discussion-details.component.d.ts +112 -0
  95. package/lib/components/discussion-details/discussion-details.component.d.ts.map +1 -0
  96. package/lib/components/lib-entry/lib-entry.component.d.ts +42 -0
  97. package/lib/components/lib-entry/lib-entry.component.d.ts.map +1 -0
  98. package/lib/components/my-discussion/my-discussion.component.d.ts +54 -0
  99. package/lib/components/my-discussion/my-discussion.component.d.ts.map +1 -0
  100. package/lib/components/side-pannel/side-pannel.component.d.ts +34 -0
  101. package/lib/components/side-pannel/side-pannel.component.d.ts.map +1 -0
  102. package/lib/components/tag-all-discussion/tag-all-discussion.component.d.ts +53 -0
  103. package/lib/components/tag-all-discussion/tag-all-discussion.component.d.ts.map +1 -0
  104. package/lib/components/trending-tags/trending-tags.component.d.ts +26 -0
  105. package/lib/components/trending-tags/trending-tags.component.d.ts.map +1 -0
  106. package/lib/config/url.config.d.ts +29 -0
  107. package/lib/config/url.config.d.ts.map +1 -0
  108. package/lib/discussion-events.service.d.ts +12 -0
  109. package/lib/discussion-events.service.d.ts.map +1 -0
  110. package/lib/discussion-routing/discussion-routing.module.d.ts +9 -0
  111. package/lib/discussion-routing/discussion-routing.module.d.ts.map +1 -0
  112. package/lib/discussion-ui.module.d.ts +16 -0
  113. package/lib/discussion-ui.module.d.ts.map +1 -0
  114. package/lib/elements/app-loader/app-loader.component.d.ts +17 -0
  115. package/lib/elements/app-loader/app-loader.component.d.ts.map +1 -0
  116. package/lib/elements/avatar-photo/avatar-photo.component.d.ts +19 -0
  117. package/lib/elements/avatar-photo/avatar-photo.component.d.ts.map +1 -0
  118. package/lib/elements/category-card/category-card.component.d.ts +10 -0
  119. package/lib/elements/category-card/category-card.component.d.ts.map +1 -0
  120. package/lib/elements/discuss-card/discuss-card.component.d.ts +17 -0
  121. package/lib/elements/discuss-card/discuss-card.component.d.ts.map +1 -0
  122. package/lib/elements/elements.module.d.ts +18 -0
  123. package/lib/elements/elements.module.d.ts.map +1 -0
  124. package/lib/elements/load-alert/load-alert.component.d.ts +15 -0
  125. package/lib/elements/load-alert/load-alert.component.d.ts.map +1 -0
  126. package/lib/elements/post-reply/post-reply.component.d.ts +22 -0
  127. package/lib/elements/post-reply/post-reply.component.d.ts.map +1 -0
  128. package/lib/elements/related-discussion/related-discussion.component.d.ts +26 -0
  129. package/lib/elements/related-discussion/related-discussion.component.d.ts.map +1 -0
  130. package/lib/elements/sliders/sliders.component.d.ts +18 -0
  131. package/lib/elements/sliders/sliders.component.d.ts.map +1 -0
  132. package/lib/events.service.d.ts +18 -0
  133. package/lib/events.service.d.ts.map +1 -0
  134. package/lib/models/discuss.model.d.ts +298 -0
  135. package/lib/models/discuss.model.d.ts.map +1 -0
  136. package/lib/models/discussion-config.model.d.ts +42 -0
  137. package/lib/models/discussion-config.model.d.ts.map +1 -0
  138. package/lib/navigation-service.service.d.ts +22 -0
  139. package/lib/navigation-service.service.d.ts.map +1 -0
  140. package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts +8 -0
  141. package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts.map +1 -0
  142. package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts +8 -0
  143. package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts.map +1 -0
  144. package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts +8 -0
  145. package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts.map +1 -0
  146. package/lib/pipes/pipes.module.d.ts +13 -0
  147. package/lib/pipes/pipes.module.d.ts.map +1 -0
  148. package/lib/pipes/sort-by/sort-by.pipe.d.ts +8 -0
  149. package/lib/pipes/sort-by/sort-by.pipe.d.ts.map +1 -0
  150. package/lib/pipes/split-initials/split-initials.pipe.d.ts +8 -0
  151. package/lib/pipes/split-initials/split-initials.pipe.d.ts.map +1 -0
  152. package/lib/router-service.service.d.ts +10 -0
  153. package/lib/router-service.service.d.ts.map +1 -0
  154. package/lib/services/abstract-config.service.d.ts +4 -0
  155. package/lib/services/abstract-config.service.d.ts.map +1 -0
  156. package/lib/services/config.service.d.ts +36 -0
  157. package/lib/services/config.service.d.ts.map +1 -0
  158. package/lib/services/discuss-utils.service.d.ts +14 -0
  159. package/lib/services/discuss-utils.service.d.ts.map +1 -0
  160. package/lib/services/discussion.service.d.ts +76 -0
  161. package/lib/services/discussion.service.d.ts.map +1 -0
  162. package/lib/telemetry-utils.service.d.ts +20 -0
  163. package/lib/telemetry-utils.service.d.ts.map +1 -0
  164. package/lib/wrapper/base-wrapper/base-wrapper.component.d.ts +22 -0
  165. package/lib/wrapper/base-wrapper/base-wrapper.component.d.ts.map +1 -0
  166. package/lib/wrapper/category-widget/category-widget.component.d.ts +23 -0
  167. package/lib/wrapper/category-widget/category-widget.component.d.ts.map +1 -0
  168. package/lib/wrapper/tags-widget/tags-widget.component.d.ts +17 -0
  169. package/lib/wrapper/tags-widget/tags-widget.component.d.ts.map +1 -0
  170. package/lib/wrapper-navigate.service.d.ts +11 -0
  171. package/lib/wrapper-navigate.service.d.ts.map +1 -0
  172. package/package.json +44 -0
  173. package/public-api.d.ts +26 -0
  174. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,199 @@
1
+ import { Validators } from '@angular/forms';
2
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
3
+ import { NSDiscussData } from './../../models/discuss.model';
4
+ /* tslint:disable */
5
+ import * as _ from 'lodash';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "./../../services/discussion.service";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "./../../telemetry-utils.service";
10
+ import * as i4 from "../../services/config.service";
11
+ import * as i5 from "../../services/discuss-utils.service";
12
+ import * as i6 from "@angular/common";
13
+ import * as i7 from "ngx-chips";
14
+ /* tslint:enable */
15
+ export class DiscussStartComponent {
16
+ constructor(discussService, formBuilder, telemetryUtils, configService, discussUtils) {
17
+ this.discussService = discussService;
18
+ this.formBuilder = formBuilder;
19
+ this.telemetryUtils = telemetryUtils;
20
+ this.configService = configService;
21
+ this.discussUtils = discussUtils;
22
+ this.close = new EventEmitter();
23
+ this.editable = true;
24
+ this.postTagsArray = [];
25
+ this.uploadSaveData = false;
26
+ this.showErrorMsg = false;
27
+ this.showSelectCategory = false;
28
+ this.createErrorMsg = '';
29
+ this.defaultError = 'Something went wrong, Please try again after sometime!';
30
+ this.enableSubmitButton = false;
31
+ }
32
+ ngOnInit() {
33
+ document.querySelector('[tabindex="-1"]').focus();
34
+ // debugger
35
+ this.telemetryUtils.logImpression(NSDiscussData.IPageName.START);
36
+ this.cIds = this.configService.getCategories();
37
+ if (this.categoryId) {
38
+ this.showSelectCategory = false;
39
+ }
40
+ else {
41
+ this.showSelectCategory = true;
42
+ }
43
+ this.initializeData();
44
+ this.initializeFormFields(this.topicData);
45
+ }
46
+ initializeFormFields(topicData) {
47
+ this.startForm = this.formBuilder.group({
48
+ question: [null, [Validators.required, Validators.minLength(8)]],
49
+ description: [null, [Validators.required, Validators.minLength(8)]],
50
+ tags: [],
51
+ category: []
52
+ });
53
+ this.startForm.valueChanges.subscribe(val => {
54
+ this.validateForm();
55
+ });
56
+ /** If popup is in edit mode */
57
+ if (topicData) {
58
+ const tags = _.map(_.get(topicData, 'tags'), (element) => {
59
+ return _.get(element, 'value');
60
+ });
61
+ /** calling htmlDecode method to get the parsed string */
62
+ this.startForm.controls['question'].setValue(this.discussUtils.htmlDecode(_.get(topicData, 'title')));
63
+ this.startForm.controls['description'].setValue(_.get(topicData, 'posts[0].content').replace(/<[^>]+>/g, ''));
64
+ this.startForm.controls['tags'].setValue(tags);
65
+ this.validateForm();
66
+ }
67
+ }
68
+ isFieldValid(field) {
69
+ let valueNoWhiteSpace = this.startForm.get(field).value;
70
+ if (valueNoWhiteSpace) {
71
+ const index = valueNoWhiteSpace.length;
72
+ if (index >= 2 && valueNoWhiteSpace.charAt(index - 2) === " ") {
73
+ this.startForm.patchValue({ replyContent: this.startForm.get(field).value.trim() });
74
+ }
75
+ else {
76
+ this.startForm.patchValue({ replyContent: this.startForm.get(field).value.trimStart() });
77
+ }
78
+ }
79
+ return (!this.startForm.get(field).valid && this.startForm.get(field).dirty);
80
+ }
81
+ validateForm() {
82
+ if (this.startForm.status === 'VALID') {
83
+ this.enableSubmitButton = true;
84
+ }
85
+ else {
86
+ this.enableSubmitButton = false;
87
+ }
88
+ }
89
+ initializeData() {
90
+ // debugger
91
+ if (this.configService.hasContext() && !this.categoryId) {
92
+ const req = {
93
+ cids: this.cIds.result
94
+ };
95
+ this.discussService.getContextBasedDiscussion(req).subscribe((data) => {
96
+ this.allCategories = data.result;
97
+ if (this.startForm.get('category')) { }
98
+ this.startForm.controls['category'].setValue(this.allCategories[0].cid);
99
+ });
100
+ }
101
+ else if (this.categoryId) {
102
+ const req = {
103
+ cids: [this.categoryId]
104
+ };
105
+ this.showSelectCategory = false;
106
+ this.editable = false;
107
+ this.discussService.getContextBasedDiscussion(req).subscribe((data) => {
108
+ this.allCategories = data.result;
109
+ if (this.startForm.get('category')) { }
110
+ this.startForm.controls.category.setValue(this.allCategories[0].cid);
111
+ });
112
+ }
113
+ else {
114
+ this.discussService.fetchAllCategories().subscribe((data) => {
115
+ this.allCategories = data;
116
+ if (this.startForm.get('category')) { }
117
+ this.startForm.controls['category'].setValue(this.allCategories[1].cid);
118
+ });
119
+ }
120
+ this.discussService.fetchAllTag().subscribe(data => {
121
+ const tags = _.get(data, 'tags');
122
+ this.allTags = _.map(tags, (tag) => tag.value);
123
+ });
124
+ }
125
+ showError(meta) {
126
+ if (meta) {
127
+ return true;
128
+ }
129
+ return false;
130
+ }
131
+ submitPost(form) {
132
+ this.uploadSaveData = true;
133
+ this.showErrorMsg = false;
134
+ const postCreateReq = {
135
+ cid: this.categoryId ? this.categoryId : parseInt(form.value.category),
136
+ title: form.value.question,
137
+ content: form.value.description,
138
+ tags: form.value.tags,
139
+ };
140
+ this.discussService.createPost(postCreateReq).subscribe(() => {
141
+ this.closeModal('success');
142
+ form.reset();
143
+ this.uploadSaveData = false;
144
+ // success toast;
145
+ // this.openSnackbar(this.toastSuccess.nativeElement.value)
146
+ // close the modal
147
+ }, err => {
148
+ this.closeModal('discard');
149
+ // error toast
150
+ // .openSnackbar(this.toastError.nativeElement.value)
151
+ this.uploadSaveData = false;
152
+ if (err) {
153
+ if (err.error && err.error.message) {
154
+ this.showErrorMsg = true;
155
+ this.createErrorMsg = err.error.message.split('|')[1] || this.defaultError;
156
+ }
157
+ }
158
+ });
159
+ }
160
+ /**
161
+ * @param {any} form
162
+ * @description - It will emit an event when popup is opened in edit topic/thread mode
163
+ * Here, as 'tid', we are passing the main topic pid from the post array
164
+ */
165
+ updatePost(form) {
166
+ const updateTopicRequest = {
167
+ title: form.value.question,
168
+ content: form.value.description,
169
+ tags: form.value.tags,
170
+ uid: _.get(this.topicData, 'uid')
171
+ };
172
+ this.close.emit({
173
+ action: 'update',
174
+ tid: _.get(this.topicData, 'posts[0].pid'),
175
+ request: updateTopicRequest
176
+ });
177
+ }
178
+ closeModal(eventMessage) {
179
+ this.close.emit({ message: eventMessage });
180
+ }
181
+ logTelemetry(event) {
182
+ this.telemetryUtils.logInteract(event, NSDiscussData.IPageName.START);
183
+ }
184
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussStartComponent, deps: [{ token: i1.DiscussionService }, { token: i2.UntypedFormBuilder }, { token: i3.TelemetryUtilsService }, { token: i4.ConfigService }, { token: i5.DiscussUtilsService }], target: i0.ɵɵFactoryTarget.Component }); }
185
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DiscussStartComponent, selector: "lib-discuss-start", inputs: { categoryId: "categoryId", topicData: "topicData", mode: "mode" }, outputs: { close: "close" }, ngImport: i0, template: "<!--modals-->\n<div class=\"modal fade\" id=\"myModal\">\n <div class=\"discussion-start-modal\">\n <div class=\"discussion-start-modal-content\" id=\"topic-scroll\" tabindex=\"-1\" role=\"dialog\">\n <form [formGroup]=\"startForm\" class=\"discussion-start-form\">\n\n <div class=\"start-form-content\" *ngIf=\"showSelectCategory\" [ngClass]=\"{ 'is-invalid': showError('subTitle') }\">\n <label class=\"start-form-label\">Select category*</label>\n <div class=\"start-form-field\">\n <label class=\"start-form-label\" for=\"myList\">Select list </label>\n <select formControlName=\"category\" #category [required]=\"true\" id=\"myList\" class=\"select-category\">\n <option [value]=\"c.cid\" *ngFor=\"let c of allCategories\" [innerHTML]=\"c.name\"></option>\n </select>\n </div>\n <small class=\"mandatory-label\" *ngIf=\"!startForm.get('category').valid\" i18n=\"category Error|Explains category is required\">\n category is mandatory</small>\n </div>\n\n <div class=\"start-form-content\" [ngClass]=\"{ 'is-invalid': showError('subTitle') }\">\n <label class=\"start-form-label\">Discussion topic*</label>\n <div class=\"start-form-field\">\n <input [ngClass]=\"{'is-invalid' : isFieldValid('question')}\" class=\"start-form-field-control\" placeholder=\"Type here (minimum 8 characters)\"\n formControlName=\"question\" #question maxlength=\"1000\" />\n </div>\n <small class=\"mandatory-label\" *ngIf=\"!startForm.get('question').valid\" i18n=\"question Error|Explains question is required\">\n Question is mandatory. It should be minimum of\n 8 characters</small>\n </div>\n\n <div class=\"start-form-content\">\n <div class=\"start-form-field\">\n <label class=\"start-form-label\" for=\"description\">Please elaborate your question or idea here*</label>\n <textarea [ngClass]=\"{'is-invalid' : isFieldValid('description')}\" minlength=\"8\" class=\"start-form-field-control\" rows=\"8\" formControlName=\"description\"\n #description name=\"moretext\" placeholder=\"Type here (minimum 8 characters)\" id=\"description\"></textarea>\n </div>\n <small class=\"mandatory-label\" *ngIf=\"!startForm.get('description').valid\"\n i18n=\"description Error|Explains description is required\"> Description is mandatory. It should be minimum of\n 8 characters </small>\n </div>\n\n <div #postTags [ngClass]=\"{ 'is-invalid': showError('tags') }\" class=\"start-tags\">\n <label class=\"mb-0\">Tags</label>\n <div *ngFor=\"let tag of postTagsArray\">\n {{ tag }}\n </div>\n <!-- TODO: check the padding for placeholder -->\n <tag-input class=\"tag-input\" secondaryPlaceholder=\"Add a tag and press Enter\" formControlName=\"tags\"\n [modelAsStrings]=\"true\">\n </tag-input>\n </div>\n\n <div *ngIf=\"showErrorMsg\">\n <small class=\"mandatory-label\">\n {{createErrorMsg}}\n </small>\n </div>\n\n <div class=\"start-modal-buttons\">\n <button (click)=\"closeModal('discard');logTelemetry($event)\" mat-raised-button type=\"button\"\n class=\"df-btn df-btn-normal df-cancel-btn\" id=\"discard-discussion-start-form\">Cancel\n </button>\n <span *ngIf=\"uploadSaveData\">\n </span>\n <button *ngIf=\"mode !== 'edit'\" type=\"submit\" class=\"df-btn df-btn-normal df-btn-primary df-submit-btn\"\n [ngClass]=\"{'df-btn-disabled': !enableSubmitButton }\" [disabled]=\"!enableSubmitButton\"\n (click)=\"submitPost(startForm);logTelemetry($event)\" id=\"submit-discussion-start-form\">\n <span class=\"text-white\">Submit</span>\n </button>\n <button *ngIf=\"mode === 'edit'\" type=\"submit\" class=\"df-btn df-btn-normal df-btn-primary df-update-btn\"\n [ngClass]=\"{'df-btn-disabled': !enableSubmitButton }\" [disabled]=\"!enableSubmitButton\"\n (click)=\"updatePost(startForm);logTelemetry($event)\" id=\"update-topic-popup\">\n <span class=\"text-white\">Update</span>\n </button>\n </div>\n \u200B\n </form>\n \u200B\n <input type=\"hidden\" i18-value i18-aria-value aria-value=\"Post created successful\"\n value=\"Post created successfully!\" #toastSuccess />\n <input type=\"hidden\" i18-value i18-aria-value aria-value=\"unable to create post\"\n value=\"Error in creating new post!\" #toastError />\n </div>\n </div>\n</div>", styles: ["::ng-deep:root{--df-modal-content-bg: var(--df-common-bg);--df-modal-field-control-bg: var(--df-background);--df-tag-bg:var(--df-e9e8d9);--df-ng-tag-bg: var(--df-background)}.discussion-start-modal{position:fixed;inset:0;background:#000c;z-index:99999;opacity:1;transition:opacity .1s ease-in;pointer-events:auto}.discussion-start-modal .discussion-start-modal-content{max-width:50rem;width:90%;position:relative;margin:0 auto;padding:1rem;border-radius:.1875rem;background:var(--df-modal-content-bg);color:var(--df-text);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);overflow:auto;max-height:calc(100% - 156px)}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-content{margin-bottom:.5rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-label{display:inline-block;margin-bottom:.5rem;font-size:.8125rem;font-weight:700}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field{position:relative;margin-bottom:0}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field .select-category{border:.0625rem solid var(--gray-200);color:var(--df-text);margin:0 .5rem;padding:.5rem .25rem;background:var(--df-field-control-bg)}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field .start-form-field-control{background-color:var(--df-modal-field-control-bg);border:.0625rem solid var(--gray-200);border-radius:.1875rem;color:var(--df-text);display:block;font-size:.8125rem;font-family:sans-serif;position:relative;width:96%;cursor:pointer;outline:none;padding:.5rem .875rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field .start-form-field-control:focus,.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field .start-form-field-control .active{border-color:var(--primary-400)!important}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .mandatory-label{font-size:.75rem;color:var(--red-100)}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons{float:right}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons .df-submit-btn,.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons .df-update-btn{margin-left:.5rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons .df-cancel-btn{box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f;border:0;margin:0 .5rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons .df-btn-disabled{background-color:var(--gray-100)}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-tags{margin-bottom:1.5rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-tags label{display:inline-block;font-size:.8125rem;font-weight:700;margin-bottom:0}#myModal{display:block;opacity:2!important}::ng-deep .ng2-tag-input{border:.0625rem solid var(--gray-200)!important;color:var(--df-text)!important;display:block;font-size:.8125rem!important;max-width:100%;padding:.25rem .5rem;margin:.5rem 0;background:var(--df-field-control-bg);border-radius:.1875rem;border-bottom:.0625rem solid var(--gray-200)!important}::ng-deep .ng2-tag-input--focused{border-color:var(--primary-400)!important}::ng-deep .ng2-tag-input__text-input{height:2.25rem;margin:0 .5rem;color:var(--df-text);background:var(--df-ng-tag-bg)}::ng-deep .ng2-tag-input.active{border-color:var(--primary-400)!important}::ng-deep tag{background:var(--df-tag-bg)!important;color:var(--df-text)!important}::ng-deep tag:first-child{margin-left:.5rem!important}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.TagInputComponent, selector: "tag-input", inputs: ["separatorKeys", "separatorKeyCodes", "placeholder", "secondaryPlaceholder", "maxItems", "validators", "asyncValidators", "onlyFromAutocomplete", "errorMessages", "theme", "onTextChangeDebounce", "inputId", "inputClass", "clearOnBlur", "hideForm", "addOnBlur", "addOnPaste", "pasteSplitPattern", "blinkIfDupe", "removable", "editable", "allowDupes", "modelAsStrings", "trimTags", "inputText", "ripple", "tabindex", "disable", "dragZone", "onRemoving", "onAdding", "animationDuration"], outputs: ["onAdd", "onRemove", "onSelect", "onFocus", "onBlur", "onTextChange", "onPaste", "onValidationError", "onTagEdited", "inputTextChange"] }] }); }
186
+ }
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussStartComponent, decorators: [{
188
+ type: Component,
189
+ args: [{ selector: 'lib-discuss-start', template: "<!--modals-->\n<div class=\"modal fade\" id=\"myModal\">\n <div class=\"discussion-start-modal\">\n <div class=\"discussion-start-modal-content\" id=\"topic-scroll\" tabindex=\"-1\" role=\"dialog\">\n <form [formGroup]=\"startForm\" class=\"discussion-start-form\">\n\n <div class=\"start-form-content\" *ngIf=\"showSelectCategory\" [ngClass]=\"{ 'is-invalid': showError('subTitle') }\">\n <label class=\"start-form-label\">Select category*</label>\n <div class=\"start-form-field\">\n <label class=\"start-form-label\" for=\"myList\">Select list </label>\n <select formControlName=\"category\" #category [required]=\"true\" id=\"myList\" class=\"select-category\">\n <option [value]=\"c.cid\" *ngFor=\"let c of allCategories\" [innerHTML]=\"c.name\"></option>\n </select>\n </div>\n <small class=\"mandatory-label\" *ngIf=\"!startForm.get('category').valid\" i18n=\"category Error|Explains category is required\">\n category is mandatory</small>\n </div>\n\n <div class=\"start-form-content\" [ngClass]=\"{ 'is-invalid': showError('subTitle') }\">\n <label class=\"start-form-label\">Discussion topic*</label>\n <div class=\"start-form-field\">\n <input [ngClass]=\"{'is-invalid' : isFieldValid('question')}\" class=\"start-form-field-control\" placeholder=\"Type here (minimum 8 characters)\"\n formControlName=\"question\" #question maxlength=\"1000\" />\n </div>\n <small class=\"mandatory-label\" *ngIf=\"!startForm.get('question').valid\" i18n=\"question Error|Explains question is required\">\n Question is mandatory. It should be minimum of\n 8 characters</small>\n </div>\n\n <div class=\"start-form-content\">\n <div class=\"start-form-field\">\n <label class=\"start-form-label\" for=\"description\">Please elaborate your question or idea here*</label>\n <textarea [ngClass]=\"{'is-invalid' : isFieldValid('description')}\" minlength=\"8\" class=\"start-form-field-control\" rows=\"8\" formControlName=\"description\"\n #description name=\"moretext\" placeholder=\"Type here (minimum 8 characters)\" id=\"description\"></textarea>\n </div>\n <small class=\"mandatory-label\" *ngIf=\"!startForm.get('description').valid\"\n i18n=\"description Error|Explains description is required\"> Description is mandatory. It should be minimum of\n 8 characters </small>\n </div>\n\n <div #postTags [ngClass]=\"{ 'is-invalid': showError('tags') }\" class=\"start-tags\">\n <label class=\"mb-0\">Tags</label>\n <div *ngFor=\"let tag of postTagsArray\">\n {{ tag }}\n </div>\n <!-- TODO: check the padding for placeholder -->\n <tag-input class=\"tag-input\" secondaryPlaceholder=\"Add a tag and press Enter\" formControlName=\"tags\"\n [modelAsStrings]=\"true\">\n </tag-input>\n </div>\n\n <div *ngIf=\"showErrorMsg\">\n <small class=\"mandatory-label\">\n {{createErrorMsg}}\n </small>\n </div>\n\n <div class=\"start-modal-buttons\">\n <button (click)=\"closeModal('discard');logTelemetry($event)\" mat-raised-button type=\"button\"\n class=\"df-btn df-btn-normal df-cancel-btn\" id=\"discard-discussion-start-form\">Cancel\n </button>\n <span *ngIf=\"uploadSaveData\">\n </span>\n <button *ngIf=\"mode !== 'edit'\" type=\"submit\" class=\"df-btn df-btn-normal df-btn-primary df-submit-btn\"\n [ngClass]=\"{'df-btn-disabled': !enableSubmitButton }\" [disabled]=\"!enableSubmitButton\"\n (click)=\"submitPost(startForm);logTelemetry($event)\" id=\"submit-discussion-start-form\">\n <span class=\"text-white\">Submit</span>\n </button>\n <button *ngIf=\"mode === 'edit'\" type=\"submit\" class=\"df-btn df-btn-normal df-btn-primary df-update-btn\"\n [ngClass]=\"{'df-btn-disabled': !enableSubmitButton }\" [disabled]=\"!enableSubmitButton\"\n (click)=\"updatePost(startForm);logTelemetry($event)\" id=\"update-topic-popup\">\n <span class=\"text-white\">Update</span>\n </button>\n </div>\n \u200B\n </form>\n \u200B\n <input type=\"hidden\" i18-value i18-aria-value aria-value=\"Post created successful\"\n value=\"Post created successfully!\" #toastSuccess />\n <input type=\"hidden\" i18-value i18-aria-value aria-value=\"unable to create post\"\n value=\"Error in creating new post!\" #toastError />\n </div>\n </div>\n</div>", styles: ["::ng-deep:root{--df-modal-content-bg: var(--df-common-bg);--df-modal-field-control-bg: var(--df-background);--df-tag-bg:var(--df-e9e8d9);--df-ng-tag-bg: var(--df-background)}.discussion-start-modal{position:fixed;inset:0;background:#000c;z-index:99999;opacity:1;transition:opacity .1s ease-in;pointer-events:auto}.discussion-start-modal .discussion-start-modal-content{max-width:50rem;width:90%;position:relative;margin:0 auto;padding:1rem;border-radius:.1875rem;background:var(--df-modal-content-bg);color:var(--df-text);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);overflow:auto;max-height:calc(100% - 156px)}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-content{margin-bottom:.5rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-label{display:inline-block;margin-bottom:.5rem;font-size:.8125rem;font-weight:700}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field{position:relative;margin-bottom:0}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field .select-category{border:.0625rem solid var(--gray-200);color:var(--df-text);margin:0 .5rem;padding:.5rem .25rem;background:var(--df-field-control-bg)}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field .start-form-field-control{background-color:var(--df-modal-field-control-bg);border:.0625rem solid var(--gray-200);border-radius:.1875rem;color:var(--df-text);display:block;font-size:.8125rem;font-family:sans-serif;position:relative;width:96%;cursor:pointer;outline:none;padding:.5rem .875rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field .start-form-field-control:focus,.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-form-field .start-form-field-control .active{border-color:var(--primary-400)!important}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .mandatory-label{font-size:.75rem;color:var(--red-100)}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons{float:right}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons .df-submit-btn,.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons .df-update-btn{margin-left:.5rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons .df-cancel-btn{box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f;border:0;margin:0 .5rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-modal-buttons .df-btn-disabled{background-color:var(--gray-100)}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-tags{margin-bottom:1.5rem}.discussion-start-modal .discussion-start-modal-content .discussion-start-form .start-tags label{display:inline-block;font-size:.8125rem;font-weight:700;margin-bottom:0}#myModal{display:block;opacity:2!important}::ng-deep .ng2-tag-input{border:.0625rem solid var(--gray-200)!important;color:var(--df-text)!important;display:block;font-size:.8125rem!important;max-width:100%;padding:.25rem .5rem;margin:.5rem 0;background:var(--df-field-control-bg);border-radius:.1875rem;border-bottom:.0625rem solid var(--gray-200)!important}::ng-deep .ng2-tag-input--focused{border-color:var(--primary-400)!important}::ng-deep .ng2-tag-input__text-input{height:2.25rem;margin:0 .5rem;color:var(--df-text);background:var(--df-ng-tag-bg)}::ng-deep .ng2-tag-input.active{border-color:var(--primary-400)!important}::ng-deep tag{background:var(--df-tag-bg)!important;color:var(--df-text)!important}::ng-deep tag:first-child{margin-left:.5rem!important}\n"] }]
190
+ }], ctorParameters: function () { return [{ type: i1.DiscussionService }, { type: i2.UntypedFormBuilder }, { type: i3.TelemetryUtilsService }, { type: i4.ConfigService }, { type: i5.DiscussUtilsService }]; }, propDecorators: { categoryId: [{
191
+ type: Input
192
+ }], topicData: [{
193
+ type: Input
194
+ }], mode: [{
195
+ type: Input
196
+ }], close: [{
197
+ type: Output
198
+ }] } });
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY3Vzcy1zdGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaXNjdXNzaW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy9kaXNjdXNzLXN0YXJ0L2Rpc2N1c3Mtc3RhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlzY3Vzc2lvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvZGlzY3Vzcy1zdGFydC9kaXNjdXNzLXN0YXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBd0MsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEYsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHN0Qsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBOzs7Ozs7Ozs7QUFFM0IsbUJBQW1CO0FBT25CLE1BQU0sT0FBTyxxQkFBcUI7SUFvQmhDLFlBQ1UsY0FBaUMsRUFDakMsV0FBK0IsRUFDL0IsY0FBcUMsRUFDckMsYUFBNEIsRUFDNUIsWUFBaUM7UUFKakMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBckJqQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUdyQyxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBR2hCLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBQzdCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGlCQUFZLEdBQUcsS0FB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UUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNkLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDO1lBQzFDLE9BQU8sRUFBRSxrQkFBa0I7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxZQUFvQjtRQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RSxDQUFDOytHQTlMVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixrS0NoQmxDLDRxSkFtRk07OzRGRG5FTyxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1COzJPQUtwQixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNJLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAsIFVudHlwZWRGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERpc2N1c3Npb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9kaXNjdXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTlNEaXNjdXNzRGF0YSB9IGZyb20gJy4vLi4vLi4vbW9kZWxzL2Rpc2N1c3MubW9kZWwnO1xuaW1wb3J0IHsgVGVsZW1ldHJ5VXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi90ZWxlbWV0cnktdXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBEaXNjdXNzVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlzY3Vzcy11dGlscy5zZXJ2aWNlJztcbi8qIHRzbGludDpkaXNhYmxlICovXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG4vKiB0c2xpbnQ6ZW5hYmxlICovXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kaXNjdXNzLXN0YXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rpc2N1c3Mtc3RhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kaXNjdXNzLXN0YXJ0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGlzY3Vzc1N0YXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY2F0ZWdvcnlJZDogc3RyaW5nO1xuICBASW5wdXQoKSB0b3BpY0RhdGE6IGFueTtcbiAgQElucHV0KCkgbW9kZTogc3RyaW5nO1xuICBAT3V0cHV0KCkgY2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgc3RhcnRGb3JtITogVW50eXBlZEZvcm1Hcm91cDtcbiAgZWRpdGFibGUgPSB0cnVlO1xuICBhbGxDYXRlZ29yaWVzITogTlNEaXNjdXNzRGF0YS5JQ2F0ZWdvcmllW107XG4gIGFsbFRhZ3MhOiBOU0Rpc2N1c3NEYXRhLklUYWdbXTtcbiAgcG9zdFRhZ3NBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgdXBsb2FkU2F2ZURhdGEgPSBmYWxzZTtcbiAgc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gIHNob3dTZWxlY3RDYXRlZ29yeSA9IGZhbHNlO1xuICBjcmVhdGVFcnJvck1zZyA9ICcnO1xuICBkZWZhdWx0RXJyb3IgPSAnU29tZXRoaW5nIHdlbnQgd3JvbmcsIFBsZWFzZSB0cnkgYWdhaW4gYWZ0ZXIgc29tZXRpbWUhJztcblxuICBlbmFibGVTdWJtaXRCdXR0b24gPSBmYWxzZTtcbiAgY0lkczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGlzY3Vzc1NlcnZpY2U6IERpc2N1c3Npb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHRlbGVtZXRyeVV0aWxzOiBUZWxlbWV0cnlVdGlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlzY3Vzc1V0aWxzOiBEaXNjdXNzVXRpbHNTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1t0YWJpbmRleD1cIi0xXCJdJykgYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgLy8gZGVidWdnZXJcbiAgICB0aGlzLnRlbGVtZXRyeVV0aWxzLmxvZ0ltcHJlc3Npb24oTlNEaXNjdXNzRGF0YS5JUGFnZU5hbWUuU1RBUlQpO1xuICAgIHRoaXMuY0lkcyA9IHRoaXMuY29uZmlnU2VydmljZS5nZXRDYXRlZ29yaWVzKClcbiAgICBpZiAodGhpcy5jYXRlZ29yeUlkKSB7XG4gICAgICB0aGlzLnNob3dTZWxlY3RDYXRlZ29yeSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgdGhpcy5zaG93U2VsZWN0Q2F0ZWdvcnkgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbGl6ZURhdGEoKTtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtRmllbGRzKHRoaXMudG9waWNEYXRhKTtcbiAgfVxuXG4gIGluaXRpYWxpemVGb3JtRmllbGRzKHRvcGljRGF0YSkge1xuICAgIHRoaXMuc3RhcnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBxdWVzdGlvbjogW251bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg4KV1dLFxuICAgICAgZGVzY3JpcHRpb246IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoOCldXSxcbiAgICAgIHRhZ3M6IFtdLFxuICAgICAgY2F0ZWdvcnk6IFtdXG4gICAgfSk7XG4gICAgdGhpcy5zdGFydEZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWwgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0oKTtcbiAgICB9KTtcblxuICAgIC8qKiBJZiBwb3B1cCBpcyBpbiBlZGl0IG1vZGUgKi9cbiAgICBpZiAodG9waWNEYXRhKSB7XG4gICAgICBjb25zdCB0YWdzID0gXy5tYXAoXy5nZXQodG9waWNEYXRhLCAndGFncycpLCAoZWxlbWVudCkgPT4ge1xuICAgICAgICByZXR1cm4gXy5nZXQoZWxlbWVudCwgJ3ZhbHVlJyk7XG4gICAgICB9KTtcblxuICAgICAgLyoqIGNhbGxpbmcgaHRtbERlY29kZSBtZXRob2QgdG8gZ2V0IHRoZSBwYXJzZWQgc3RyaW5nICovXG4gICAgICB0aGlzLnN0YXJ0Rm9ybS5jb250cm9sc1sncXVlc3Rpb24nXS5zZXRWYWx1ZSh0aGlzLmRpc2N1c3NVdGlscy5odG1sRGVjb2RlKF8uZ2V0KHRvcGljRGF0YSwgJ3RpdGxlJykpKTtcbiAgICAgIHRoaXMuc3RhcnRGb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddLnNldFZhbHVlKF8uZ2V0KHRvcGljRGF0YSwgJ3Bvc3RzWzBdLmNvbnRlbnQnKS5yZXBsYWNlKC88W14+XSs+L2csICcnKSk7XG4gICAgICB0aGlzLnN0YXJ0Rm9ybS5jb250cm9sc1sndGFncyddLnNldFZhbHVlKHRhZ3MpO1xuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBpc0ZpZWxkVmFsaWQoZmllbGQpIHtcbiAgICBsZXQgdmFsdWVOb1doaXRlU3BhY2UgPSB0aGlzLnN0YXJ0Rm9ybS5nZXQoZmllbGQpLnZhbHVlO1xuICAgIGlmICh2YWx1ZU5vV2hpdGVTcGFjZSkge1xuICAgICAgY29uc3QgaW5kZXggPSB2YWx1ZU5vV2hpdGVTcGFjZS5sZW5ndGg7XG4gICAgICBpZiAoaW5kZXggPj0gMiAmJiB2YWx1ZU5vV2hpdGVTcGFjZS5jaGFyQXQoaW5kZXggLSAyKSA9PT0gXCIgXCIpIHtcbiAgICAgICAgdGhpcy5zdGFydEZvcm0ucGF0Y2hWYWx1ZSh7IHJlcGx5Q29udGVudDogdGhpcy5zdGFydEZvcm0uZ2V0KGZpZWxkKS52YWx1ZS50cmltKCkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXJ0Rm9ybS5wYXRjaFZhbHVlKHsgcmVwbHlDb250ZW50OiB0aGlzLnN0YXJ0Rm9ybS5nZXQoZmllbGQpLnZhbHVlLnRyaW1TdGFydCgpIH0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoIXRoaXMuc3RhcnRGb3JtLmdldChmaWVsZCkudmFsaWQgJiYgdGhpcy5zdGFydEZvcm0uZ2V0KGZpZWxkKS5kaXJ0eSk7XG4gIH1cblxuICB2YWxpZGF0ZUZvcm0oKSB7XG4gICAgaWYgKHRoaXMuc3RhcnRGb3JtLnN0YXR1cyA9PT0gJ1ZBTElEJykge1xuICAgICAgdGhpcy5lbmFibGVTdWJtaXRCdXR0b24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuYWJsZVN1Ym1pdEJ1dHRvbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemVEYXRhKCkge1xuICAgIC8vIGRlYnVnZ2VyXG4gICAgaWYgKHRoaXMuY29uZmlnU2VydmljZS5oYXNDb250ZXh0KCkgJiYgIXRoaXMuY2F0ZWdvcnlJZCkge1xuICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICBjaWRzOiB0aGlzLmNJZHMucmVzdWx0XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmRpc2N1c3NTZXJ2aWNlLmdldENvbnRleHRCYXNlZERpc2N1c3Npb24ocmVxKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFsbENhdGVnb3JpZXMgPSBkYXRhLnJlc3VsdDtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRGb3JtLmdldCgnY2F0ZWdvcnknKSkgeyB9XG4gICAgICAgIHRoaXMuc3RhcnRGb3JtLmNvbnRyb2xzWydjYXRlZ29yeSddLnNldFZhbHVlKHRoaXMuYWxsQ2F0ZWdvcmllc1swXS5jaWQpXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2F0ZWdvcnlJZCkge1xuICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICBjaWRzOiBbdGhpcy5jYXRlZ29yeUlkXVxuICAgICAgfTtcbiAgICAgIHRoaXMuc2hvd1NlbGVjdENhdGVnb3J5ID0gZmFsc2U7XG4gICAgICB0aGlzLmVkaXRhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmRpc2N1c3NTZXJ2aWNlLmdldENvbnRleHRCYXNlZERpc2N1c3Npb24ocmVxKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFsbENhdGVnb3JpZXMgPSBkYXRhLnJlc3VsdDtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRGb3JtLmdldCgnY2F0ZWdvcnknKSkgeyB9XG4gICAgICAgIHRoaXMuc3RhcnRGb3JtLmNvbnRyb2xzLmNhdGVnb3J5LnNldFZhbHVlKHRoaXMuYWxsQ2F0ZWdvcmllc1swXS5jaWQpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzY3Vzc1NlcnZpY2UuZmV0Y2hBbGxDYXRlZ29yaWVzKCkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5hbGxDYXRlZ29yaWVzID0gZGF0YVxuICAgICAgICBpZiAodGhpcy5zdGFydEZvcm0uZ2V0KCdjYXRlZ29yeScpKSB7IH1cbiAgICAgICAgdGhpcy5zdGFydEZvcm0uY29udHJvbHNbJ2NhdGVnb3J5J10uc2V0VmFsdWUodGhpcy5hbGxDYXRlZ29yaWVzWzFdLmNpZClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY3Vzc1NlcnZpY2UuZmV0Y2hBbGxUYWcoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBjb25zdCB0YWdzID0gXy5nZXQoZGF0YSwgJ3RhZ3MnKTtcbiAgICAgIHRoaXMuYWxsVGFncyA9IF8ubWFwKHRhZ3MsICh0YWcpID0+IHRhZy52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgc2hvd0Vycm9yKG1ldGE6IHN0cmluZykge1xuICAgIGlmIChtZXRhKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdFBvc3QoZm9ybTogYW55KSB7XG4gICAgdGhpcy51cGxvYWRTYXZlRGF0YSA9IHRydWU7XG4gICAgdGhpcy5zaG93RXJyb3JNc2cgPSBmYWxzZTtcbiAgICBjb25zdCBwb3N0Q3JlYXRlUmVxID0ge1xuICAgICAgY2lkOiB0aGlzLmNhdGVnb3J5SWQgPyB0aGlzLmNhdGVnb3J5SWQgOiBwYXJzZUludChmb3JtLnZhbHVlLmNhdGVnb3J5KSxcbiAgICAgIHRpdGxlOiBmb3JtLnZhbHVlLnF1ZXN0aW9uLFxuICAgICAgY29udGVudDogZm9ybS52YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgIHRhZ3M6IGZvcm0udmFsdWUudGFncyxcbiAgICB9O1xuICAgIHRoaXMuZGlzY3Vzc1NlcnZpY2UuY3JlYXRlUG9zdChwb3N0Q3JlYXRlUmVxKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbCgnc3VjY2VzcycpO1xuICAgICAgICBmb3JtLnJlc2V0KCk7XG4gICAgICAgIHRoaXMudXBsb2FkU2F2ZURhdGEgPSBmYWxzZTtcbiAgICAgICAgLy8gc3VjY2VzcyB0b2FzdDtcbiAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIodGhpcy50b2FzdFN1Y2Nlc3MubmF0aXZlRWxlbWVudC52YWx1ZSlcbiAgICAgICAgLy8gY2xvc2UgdGhlIG1vZGFsXG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsKCdkaXNjYXJkJyk7XG4gICAgICAgIC8vIGVycm9yIHRvYXN0XG4gICAgICAgIC8vIC5vcGVuU25hY2tiYXIodGhpcy50b2FzdEVycm9yLm5hdGl2ZUVsZW1lbnQudmFsdWUpXG4gICAgICAgIHRoaXMudXBsb2FkU2F2ZURhdGEgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGlmIChlcnIuZXJyb3IgJiYgZXJyLmVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRXJyb3JNc2cgPSBlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAcGFyYW0gIHthbnl9IGZvcm1cbiAgICogQGRlc2NyaXB0aW9uIC0gSXQgd2lsbCBlbWl0IGFuIGV2ZW50IHdoZW4gcG9wdXAgaXMgb3BlbmVkIGluIGVkaXQgdG9waWMvdGhyZWFkIG1vZGVcbiAgICogICAgICAgICAgICAgICAgSGVyZSwgYXMgJ3RpZCcsIHdlIGFyZSBwYXNzaW5nIHRoZSBtYWluIHRvcGljIHBpZCBmcm9tIHRoZSBwb3N0IGFycmF5XG4gICAqL1xuICB1cGRhdGVQb3N0KGZvcm06IGFueSkge1xuICAgIGNvbnN0IHVwZGF0ZVRvcGljUmVxdWVzdCA9IHtcbiAgICAgIHRpdGxlOiBmb3JtLnZhbHVlLnF1ZXN0aW9uLFxuICAgICAgY29udGVudDogZm9ybS52YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgIHRhZ3M6IGZvcm0udmFsdWUudGFncyxcbiAgICAgIHVpZDogXy5nZXQodGhpcy50b3BpY0RhdGEsICd1aWQnKVxuICAgIH07XG4gICAgdGhpcy5jbG9zZS5lbWl0KHtcbiAgICAgIGFjdGlvbjogJ3VwZGF0ZScsXG4gICAgICB0aWQ6IF8uZ2V0KHRoaXMudG9waWNEYXRhLCAncG9zdHNbMF0ucGlkJyksXG4gICAgICByZXF1ZXN0OiB1cGRhdGVUb3BpY1JlcXVlc3RcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlTW9kYWwoZXZlbnRNZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNsb3NlLmVtaXQoeyBtZXNzYWdlOiBldmVudE1lc3NhZ2UgfSk7XG4gIH1cblxuICBsb2dUZWxlbWV0cnkoZXZlbnQpIHtcbiAgICB0aGlzLnRlbGVtZXRyeVV0aWxzLmxvZ0ludGVyYWN0KGV2ZW50LCBOU0Rpc2N1c3NEYXRhLklQYWdlTmFtZS5TVEFSVCk7XG4gIH1cbn1cblxuIiwiPCEtLW1vZGFscy0tPlxuPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cIm15TW9kYWxcIj5cbiAgPGRpdiBjbGFzcz1cImRpc2N1c3Npb24tc3RhcnQtbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGlzY3Vzc2lvbi1zdGFydC1tb2RhbC1jb250ZW50XCIgaWQ9XCJ0b3BpYy1zY3JvbGxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiPlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJzdGFydEZvcm1cIiBjbGFzcz1cImRpc2N1c3Npb24tc3RhcnQtZm9ybVwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGFydC1mb3JtLWNvbnRlbnRcIiAqbmdJZj1cInNob3dTZWxlY3RDYXRlZ29yeVwiIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzaG93RXJyb3IoJ3N1YlRpdGxlJykgfVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN0YXJ0LWZvcm0tbGFiZWxcIj5TZWxlY3QgY2F0ZWdvcnkqPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhcnQtZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3RhcnQtZm9ybS1sYWJlbFwiIGZvcj1cIm15TGlzdFwiPlNlbGVjdCBsaXN0IDwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5XCIgI2NhdGVnb3J5IFtyZXF1aXJlZF09XCJ0cnVlXCIgaWQ9XCJteUxpc3RcIiBjbGFzcz1cInNlbGVjdC1jYXRlZ29yeVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJjLmNpZFwiICpuZ0Zvcj1cImxldCBjIG9mIGFsbENhdGVnb3JpZXNcIiBbaW5uZXJIVE1MXT1cImMubmFtZVwiPjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwibWFuZGF0b3J5LWxhYmVsXCIgKm5nSWY9XCIhc3RhcnRGb3JtLmdldCgnY2F0ZWdvcnknKS52YWxpZFwiIGkxOG49XCJjYXRlZ29yeSBFcnJvcnxFeHBsYWlucyBjYXRlZ29yeSBpcyByZXF1aXJlZFwiPlxuICAgICAgICAgICAgY2F0ZWdvcnkgaXMgbWFuZGF0b3J5PC9zbWFsbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0YXJ0LWZvcm0tY29udGVudFwiIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzaG93RXJyb3IoJ3N1YlRpdGxlJykgfVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN0YXJ0LWZvcm0tbGFiZWxcIj5EaXNjdXNzaW9uIHRvcGljKjwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXJ0LWZvcm0tZmllbGRcIj5cbiAgICAgICAgICAgIDxpbnB1dCBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogaXNGaWVsZFZhbGlkKCdxdWVzdGlvbicpfVwiIGNsYXNzPVwic3RhcnQtZm9ybS1maWVsZC1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJUeXBlIGhlcmUgKG1pbmltdW0gOCBjaGFyYWN0ZXJzKVwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInF1ZXN0aW9uXCIgI3F1ZXN0aW9uIG1heGxlbmd0aD1cIjEwMDBcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cIm1hbmRhdG9yeS1sYWJlbFwiICpuZ0lmPVwiIXN0YXJ0Rm9ybS5nZXQoJ3F1ZXN0aW9uJykudmFsaWRcIiBpMThuPVwicXVlc3Rpb24gRXJyb3J8RXhwbGFpbnMgcXVlc3Rpb24gaXMgcmVxdWlyZWRcIj5cbiAgICAgICAgICAgIFF1ZXN0aW9uIGlzIG1hbmRhdG9yeS4gSXQgc2hvdWxkIGJlIG1pbmltdW0gb2ZcbiAgICAgICAgICAgIDggY2hhcmFjdGVyczwvc21hbGw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGFydC1mb3JtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhcnQtZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3RhcnQtZm9ybS1sYWJlbFwiIGZvcj1cImRlc2NyaXB0aW9uXCI+UGxlYXNlIGVsYWJvcmF0ZSB5b3VyIHF1ZXN0aW9uIG9yIGlkZWEgaGVyZSo8L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiBpc0ZpZWxkVmFsaWQoJ2Rlc2NyaXB0aW9uJyl9XCIgbWlubGVuZ3RoPVwiOFwiIGNsYXNzPVwic3RhcnQtZm9ybS1maWVsZC1jb250cm9sXCIgcm93cz1cIjhcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICNkZXNjcmlwdGlvbiBuYW1lPVwibW9yZXRleHRcIiBwbGFjZWhvbGRlcj1cIlR5cGUgaGVyZSAobWluaW11bSA4IGNoYXJhY3RlcnMpXCIgaWQ9XCJkZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwibWFuZGF0b3J5LWxhYmVsXCIgKm5nSWY9XCIhc3RhcnRGb3JtLmdldCgnZGVzY3JpcHRpb24nKS52YWxpZFwiXG4gICAgICAgICAgICBpMThuPVwiZGVzY3JpcHRpb24gRXJyb3J8RXhwbGFpbnMgZGVzY3JpcHRpb24gaXMgcmVxdWlyZWRcIj4gRGVzY3JpcHRpb24gaXMgbWFuZGF0b3J5LiBJdCBzaG91bGQgYmUgbWluaW11bSBvZlxuICAgICAgICAgICAgOCBjaGFyYWN0ZXJzIDwvc21hbGw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgI3Bvc3RUYWdzIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzaG93RXJyb3IoJ3RhZ3MnKSB9XCIgY2xhc3M9XCJzdGFydC10YWdzXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMFwiPlRhZ3M8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhZyBvZiBwb3N0VGFnc0FycmF5XCI+XG4gICAgICAgICAgICB7eyB0YWcgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIFRPRE86IGNoZWNrIHRoZSBwYWRkaW5nIGZvciBwbGFjZWhvbGRlciAtLT5cbiAgICAgICAgICA8dGFnLWlucHV0IGNsYXNzPVwidGFnLWlucHV0XCIgc2Vjb25kYXJ5UGxhY2Vob2xkZXI9XCJBZGQgYSB0YWcgYW5kIHByZXNzIEVudGVyXCIgZm9ybUNvbnRyb2xOYW1lPVwidGFnc1wiXG4gICAgICAgICAgICBbbW9kZWxBc1N0cmluZ3NdPVwidHJ1ZVwiPlxuICAgICAgICAgIDwvdGFnLWlucHV0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0Vycm9yTXNnXCI+XG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwibWFuZGF0b3J5LWxhYmVsXCI+XG4gICAgICAgICAgICB7e2NyZWF0ZUVycm9yTXNnfX1cbiAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhcnQtbW9kYWwtYnV0dG9uc1wiPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlTW9kYWwoJ2Rpc2NhcmQnKTtsb2dUZWxlbWV0cnkoJGV2ZW50KVwiIG1hdC1yYWlzZWQtYnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJkZi1idG4gZGYtYnRuLW5vcm1hbCBkZi1jYW5jZWwtYnRuXCIgaWQ9XCJkaXNjYXJkLWRpc2N1c3Npb24tc3RhcnQtZm9ybVwiPkNhbmNlbFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXBsb2FkU2F2ZURhdGFcIj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIm1vZGUgIT09ICdlZGl0J1wiIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImRmLWJ0biBkZi1idG4tbm9ybWFsIGRmLWJ0bi1wcmltYXJ5IGRmLXN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkZi1idG4tZGlzYWJsZWQnOiAhZW5hYmxlU3VibWl0QnV0dG9uIH1cIiBbZGlzYWJsZWRdPVwiIWVuYWJsZVN1Ym1pdEJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3VibWl0UG9zdChzdGFydEZvcm0pO2xvZ1RlbGVtZXRyeSgkZXZlbnQpXCIgaWQ9XCJzdWJtaXQtZGlzY3Vzc2lvbi1zdGFydC1mb3JtXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtd2hpdGVcIj5TdWJtaXQ8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIm1vZGUgPT09ICdlZGl0J1wiIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImRmLWJ0biBkZi1idG4tbm9ybWFsIGRmLWJ0bi1wcmltYXJ5IGRmLXVwZGF0ZS1idG5cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkZi1idG4tZGlzYWJsZWQnOiAhZW5hYmxlU3VibWl0QnV0dG9uIH1cIiBbZGlzYWJsZWRdPVwiIWVuYWJsZVN1Ym1pdEJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlUG9zdChzdGFydEZvcm0pO2xvZ1RlbGVtZXRyeSgkZXZlbnQpXCIgaWQ9XCJ1cGRhdGUtdG9waWMtcG9wdXBcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC13aGl0ZVwiPlVwZGF0ZTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIOKAi1xuICAgICAgPC9mb3JtPlxuICAgICAg4oCLXG4gICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGkxOC12YWx1ZSBpMTgtYXJpYS12YWx1ZSBhcmlhLXZhbHVlPVwiUG9zdCBjcmVhdGVkIHN1Y2Nlc3NmdWxcIlxuICAgICAgICB2YWx1ZT1cIlBvc3QgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIgI3RvYXN0U3VjY2VzcyAvPlxuICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpMTgtdmFsdWUgaTE4LWFyaWEtdmFsdWUgYXJpYS12YWx1ZT1cInVuYWJsZSB0byBjcmVhdGUgcG9zdFwiXG4gICAgICAgIHZhbHVlPVwiRXJyb3IgaW4gY3JlYXRpbmcgbmV3IHBvc3QhXCIgI3RvYXN0RXJyb3IgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
@@ -0,0 +1,93 @@
1
+ import { Component, EventEmitter, Output } from '@angular/core';
2
+ /* tslint:disable */
3
+ import * as _ from 'lodash';
4
+ import { NSDiscussData } from '../../models/discuss.model';
5
+ import * as CONSTANTS from './../../common/constants.json';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../services/discussion.service";
8
+ import * as i2 from "./../../telemetry-utils.service";
9
+ import * as i3 from "@angular/router";
10
+ import * as i4 from "../../services/config.service";
11
+ import * as i5 from "../../services/discuss-utils.service";
12
+ import * as i6 from "../../navigation-service.service";
13
+ import * as i7 from "@angular/common";
14
+ import * as i8 from "../../elements/app-loader/app-loader.component";
15
+ /* tslint:enable */
16
+ export class DiscussTagsComponent {
17
+ constructor(discussionService, telemetryUtils, router, activatedRoute, configService, discussUtils, navigationService) {
18
+ this.discussionService = discussionService;
19
+ this.telemetryUtils = telemetryUtils;
20
+ this.router = router;
21
+ this.activatedRoute = activatedRoute;
22
+ this.configService = configService;
23
+ this.discussUtils = discussUtils;
24
+ this.navigationService = navigationService;
25
+ this.stateChange = new EventEmitter();
26
+ this.showLoader = false;
27
+ }
28
+ ngOnInit() {
29
+ this.telemetryUtils.setContext([]);
30
+ this.telemetryUtils.logImpression(NSDiscussData.IPageName.TAGS);
31
+ this.cIds = this.configService.getCategories();
32
+ if (this.configService.hasContext()) {
33
+ this.getContextBasedTags(this.cIds.result);
34
+ }
35
+ else {
36
+ this.fetchAllTags();
37
+ }
38
+ }
39
+ fetchAllTags() {
40
+ this.showLoader = true;
41
+ this.discussionService.fetchAllTag().subscribe(data => {
42
+ this.showLoader = false;
43
+ this.filteredTags = _.get(data, 'tags');
44
+ }, error => {
45
+ this.showLoader = false;
46
+ // TODO: toaster
47
+ console.log('error fetching tags');
48
+ });
49
+ }
50
+ getContextBasedTags(cid) {
51
+ const req = {
52
+ cids: cid
53
+ };
54
+ this.showLoader = true;
55
+ this.discussionService.contextBasedTags(req).subscribe(data => {
56
+ this.showLoader = false;
57
+ this.filteredTags = _.get(data, 'result');
58
+ }, error => {
59
+ this.showLoader = false;
60
+ // TODO: toaster
61
+ console.log('error fetching tags');
62
+ });
63
+ }
64
+ getBgColor(tagTitle) {
65
+ const bgColor = this.discussUtils.stringToColor(tagTitle.toLowerCase());
66
+ const color = this.discussUtils.getContrast();
67
+ return { color, 'background-color': bgColor };
68
+ }
69
+ getAllDiscussions(tag) {
70
+ this.queryParam = tag.value;
71
+ const tagdata = {
72
+ tagname: ''
73
+ };
74
+ tagdata.tagname = tag.value;
75
+ this.queryParam = tagdata;
76
+ const routerSlug = this.configService.getConfig().routerSlug ? this.configService.getConfig().routerSlug : '';
77
+ const input = { data: { url: `${routerSlug}${CONSTANTS.ROUTES.TAG}tag-discussions`,
78
+ queryParams: this.queryParam, tagName: this.queryParam.tagName }, action: 'tagsAll' };
79
+ this.navigationService.navigate(input);
80
+ this.stateChange.emit({ action: CONSTANTS.TAG_ALL_DISCUSS, title: tag.value, tid: 'sd' });
81
+ // tslint:disable-next-line: max-line-length
82
+ // this.router.navigate([`${this.configService.getRouterSlug()}${CONSTANTS.ROUTES.TAG}tag-discussions`], { queryParams: this.queryParam });
83
+ }
84
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussTagsComponent, deps: [{ token: i1.DiscussionService }, { token: i2.TelemetryUtilsService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.ConfigService }, { token: i5.DiscussUtilsService }, { token: i6.NavigationServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
85
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DiscussTagsComponent, selector: "lib-discuss-tags", outputs: { stateChange: "stateChange" }, ngImport: i0, template: "<lib-app-loader *ngIf=\"showLoader\"></lib-app-loader>\n<div class=\"flex flex-1 margin-top-m flex-column discussion-tag-content\">\n <ng-container *ngIf=\"filteredTags && filteredTags.length > 0\">\n <div class=\"tags\">\n <div *ngFor=\"let tag of filteredTags \" class=\"tag\" [ngStyle]=\"getBgColor(tag.value)\"\n (click)=\"getAllDiscussions(tag)\">\n <!-- Can enable random colors from below commented code -->\n <!-- <div *ngFor=\"let tag of filteredTags | pipeFilter:'score,value':query\"\n class=\"tag text-capitalize\" [ngStyle]=\"getBgColor(tag.value)\"> -->\n <span class=\"margin-left-m\">{{tag.value}}</span>\n <span class=\"ws-mat-default-text count\">{{tag.score}}</span>\n </div>\n </div>\n </ng-container>\n</div>\n\u200B\n\u200B\n<div class=\"tag-empty-container\" *ngIf=\"!showLoader && !filteredTags.length\">\n <div class=\"tag-empty-img\"><img src=\"./assets/discussion-ui/images/empty.svg\" alt=\"empty image\"></div>\n <label class=\"tag-empty-label\">No tags Available !</label>\n <p class=\"tag-empty-text\">Stay tuned ! we will be updating our tags library and add them here</p>\n</div>\n", styles: ["::ng-deep:root{--df-tag-empty-bg:var(--df-common-bg)}.sb-search-box{display:flex;align-items:center;border:0px}.sb-search-box .sb-search-input{width:100%;font-size:.875rem;min-height:2rem;outline:0;border-radius:0;line-height:normal;background:none;padding:1em;border-radius:.25rem;border:0px}.search-icon{width:1.125rem;height:1.125rem;margin:1rem 0rem 1rem 1rem}.sb-search-box .input-div{border-radius:1.5rem;background:var(--white);display:flex;align-items:center;border:.0625rem solid var(--gray-100);width:100%}.sb-search-box .input-div:hover{border-color:var(--primary)}.tag{cursor:pointer}@media (max-width: 768px){.discuss-tags{flex-direction:column}}.tag-empty-container{background:var(--white);background:var(--df-tag-empty-bg);color:var(--df-text);display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:1.5rem;height:100%;border-radius:.25rem;min-height:28.125rem}.tag-empty-container .tag-empty-img{width:100%;max-width:13.875rem}.tag-empty-container .tag-empty-label{font-size:.875rem;font-weight:700;margin:1.5rem 0 .75rem;color:var(--black)!important}.tag-empty-container .tag-empty-text{font-size:.875rem;font-weight:400;text-align:center;color:var(--black)!important}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.AppLoaderComponent, selector: "lib-app-loader", inputs: ["data"] }] }); }
86
+ }
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussTagsComponent, decorators: [{
88
+ type: Component,
89
+ args: [{ selector: 'lib-discuss-tags', template: "<lib-app-loader *ngIf=\"showLoader\"></lib-app-loader>\n<div class=\"flex flex-1 margin-top-m flex-column discussion-tag-content\">\n <ng-container *ngIf=\"filteredTags && filteredTags.length > 0\">\n <div class=\"tags\">\n <div *ngFor=\"let tag of filteredTags \" class=\"tag\" [ngStyle]=\"getBgColor(tag.value)\"\n (click)=\"getAllDiscussions(tag)\">\n <!-- Can enable random colors from below commented code -->\n <!-- <div *ngFor=\"let tag of filteredTags | pipeFilter:'score,value':query\"\n class=\"tag text-capitalize\" [ngStyle]=\"getBgColor(tag.value)\"> -->\n <span class=\"margin-left-m\">{{tag.value}}</span>\n <span class=\"ws-mat-default-text count\">{{tag.score}}</span>\n </div>\n </div>\n </ng-container>\n</div>\n\u200B\n\u200B\n<div class=\"tag-empty-container\" *ngIf=\"!showLoader && !filteredTags.length\">\n <div class=\"tag-empty-img\"><img src=\"./assets/discussion-ui/images/empty.svg\" alt=\"empty image\"></div>\n <label class=\"tag-empty-label\">No tags Available !</label>\n <p class=\"tag-empty-text\">Stay tuned ! we will be updating our tags library and add them here</p>\n</div>\n", styles: ["::ng-deep:root{--df-tag-empty-bg:var(--df-common-bg)}.sb-search-box{display:flex;align-items:center;border:0px}.sb-search-box .sb-search-input{width:100%;font-size:.875rem;min-height:2rem;outline:0;border-radius:0;line-height:normal;background:none;padding:1em;border-radius:.25rem;border:0px}.search-icon{width:1.125rem;height:1.125rem;margin:1rem 0rem 1rem 1rem}.sb-search-box .input-div{border-radius:1.5rem;background:var(--white);display:flex;align-items:center;border:.0625rem solid var(--gray-100);width:100%}.sb-search-box .input-div:hover{border-color:var(--primary)}.tag{cursor:pointer}@media (max-width: 768px){.discuss-tags{flex-direction:column}}.tag-empty-container{background:var(--white);background:var(--df-tag-empty-bg);color:var(--df-text);display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:1.5rem;height:100%;border-radius:.25rem;min-height:28.125rem}.tag-empty-container .tag-empty-img{width:100%;max-width:13.875rem}.tag-empty-container .tag-empty-label{font-size:.875rem;font-weight:700;margin:1.5rem 0 .75rem;color:var(--black)!important}.tag-empty-container .tag-empty-text{font-size:.875rem;font-weight:400;text-align:center;color:var(--black)!important}\n"] }]
90
+ }], ctorParameters: function () { return [{ type: i1.DiscussionService }, { type: i2.TelemetryUtilsService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.ConfigService }, { type: i5.DiscussUtilsService }, { type: i6.NavigationServiceService }]; }, propDecorators: { stateChange: [{
91
+ type: Output
92
+ }] } });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY3Vzcy10YWdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rpc2N1c3Npb24tdWkvc3JjL2xpYi9jb21wb25lbnRzL2Rpc2N1c3MtdGFncy9kaXNjdXNzLXRhZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlzY3Vzc2lvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvZGlzY3Vzcy10YWdzL2Rpc2N1c3MtdGFncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEUsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBRTNCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUszRCxPQUFPLEtBQUssU0FBUyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7O0FBRzNELG1CQUFtQjtBQU9uQixNQUFNLE9BQU8sb0JBQW9CO0lBVS9CLFlBQ1UsaUJBQW9DLEVBQ3BDLGNBQXFDLEVBQ3JDLE1BQWMsRUFDZixjQUE4QixFQUM3QixhQUE0QixFQUM1QixZQUFpQyxFQUNqQyxpQkFBMkM7UUFOM0Msc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNmLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM3QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUEwQjtRQWYzQyxnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRzlELGVBQVUsR0FBRyxLQUFLLENBQUM7SUFhZixDQUFD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QUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGlCQUFpQjtnQkFDbEYsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRiw0Q0FBNEM7UUFDNUMsMklBQTJJO0lBQzdJLENBQUM7K0dBakZVLG9CQUFvQjttR0FBcEIsb0JBQW9CLGlHQ3BCakMsMnBDQXNCQTs7NEZERmEsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGtCQUFrQjttU0FNbEIsV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBEaXNjdXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rpc2N1c3Npb24uc2VydmljZSc7XG5pbXBvcnQgeyBOU0Rpc2N1c3NEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Rpc2N1c3MubW9kZWwnO1xuaW1wb3J0IHsgVGVsZW1ldHJ5VXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi90ZWxlbWV0cnktdXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIENPTlNUQU5UUyBmcm9tICcuLy4uLy4uL2NvbW1vbi9jb25zdGFudHMuanNvbic7XG5pbXBvcnQgeyBEaXNjdXNzVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlzY3Vzcy11dGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL25hdmlnYXRpb24tc2VydmljZS5zZXJ2aWNlJztcbi8qIHRzbGludDplbmFibGUgKi9cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWRpc2N1c3MtdGFncycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaXNjdXNzLXRhZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kaXNjdXNzLXRhZ3MuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEaXNjdXNzVGFnc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQE91dHB1dCgpIHN0YXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcXVlcnk6IHN0cmluZztcbiAgZmlsdGVyZWRUYWdzOiBOU0Rpc2N1c3NEYXRhLklUYWdbXTtcbiAgc2hvd0xvYWRlciA9IGZhbHNlO1xuICBxdWVyeVBhcmFtOiBhbnk7XG4gIHBhcmFtc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBnZXRQYXJhbXM6IGFueTtcbiAgY0lkczogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRpc2N1c3Npb25TZXJ2aWNlOiBEaXNjdXNzaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHRlbGVtZXRyeVV0aWxzOiBUZWxlbWV0cnlVdGlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGRpc2N1c3NVdGlsczogRGlzY3Vzc1V0aWxzU2VydmljZSxcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBOYXZpZ2F0aW9uU2VydmljZVNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnRlbGVtZXRyeVV0aWxzLnNldENvbnRleHQoW10pO1xuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMubG9nSW1wcmVzc2lvbihOU0Rpc2N1c3NEYXRhLklQYWdlTmFtZS5UQUdTKTtcblxuICAgIHRoaXMuY0lkcyA9IHRoaXMuY29uZmlnU2VydmljZS5nZXRDYXRlZ29yaWVzKClcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmhhc0NvbnRleHQoKSkge1xuICAgICAgdGhpcy5nZXRDb250ZXh0QmFzZWRUYWdzKHRoaXMuY0lkcy5yZXN1bHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmV0Y2hBbGxUYWdzKCk7XG4gICAgfVxuXG4gIH1cblxuICBmZXRjaEFsbFRhZ3MoKSB7XG4gICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcbiAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLmZldGNoQWxsVGFnKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbHRlcmVkVGFncyA9IF8uZ2V0KGRhdGEsICd0YWdzJyk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICAvLyBUT0RPOiB0b2FzdGVyXG4gICAgICBjb25zb2xlLmxvZygnZXJyb3IgZmV0Y2hpbmcgdGFncycpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29udGV4dEJhc2VkVGFncyhjaWQ6IGFueSkge1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIGNpZHM6IGNpZFxuICAgIH1cbiAgICB0aGlzLnNob3dMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UuY29udGV4dEJhc2VkVGFncyhyZXEpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5maWx0ZXJlZFRhZ3MgPSBfLmdldChkYXRhLCAncmVzdWx0Jyk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICAvLyBUT0RPOiB0b2FzdGVyXG4gICAgICBjb25zb2xlLmxvZygnZXJyb3IgZmV0Y2hpbmcgdGFncycpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEJnQ29sb3IodGFnVGl0bGU6IGFueSkge1xuICAgIGNvbnN0IGJnQ29sb3IgPSB0aGlzLmRpc2N1c3NVdGlscy5zdHJpbmdUb0NvbG9yKHRhZ1RpdGxlLnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5kaXNjdXNzVXRpbHMuZ2V0Q29udHJhc3QoKTtcbiAgICByZXR1cm4geyBjb2xvciwgJ2JhY2tncm91bmQtY29sb3InOiBiZ0NvbG9yIH07XG4gIH1cblxuICBnZXRBbGxEaXNjdXNzaW9ucyh0YWc6IHsgdmFsdWU6IGFueSB9KSB7XG4gICAgdGhpcy5xdWVyeVBhcmFtID0gdGFnLnZhbHVlO1xuICAgIGNvbnN0IHRhZ2RhdGEgPSB7XG4gICAgICB0YWduYW1lOiAnJ1xuICAgIH07XG5cbiAgICB0YWdkYXRhLnRhZ25hbWUgPSB0YWcudmFsdWU7XG4gICAgdGhpcy5xdWVyeVBhcmFtID0gdGFnZGF0YTtcbiAgICBjb25zdCByb3V0ZXJTbHVnID0gdGhpcy5jb25maWdTZXJ2aWNlLmdldENvbmZpZygpLnJvdXRlclNsdWcgPyB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkucm91dGVyU2x1ZyA6ICcnO1xuICAgIGNvbnN0IGlucHV0ID0geyBkYXRhOiB7IHVybDogYCR7cm91dGVyU2x1Z30ke0NPTlNUQU5UUy5ST1VURVMuVEFHfXRhZy1kaXNjdXNzaW9uc2AsXG4gICAgcXVlcnlQYXJhbXM6IHRoaXMucXVlcnlQYXJhbSwgdGFnTmFtZTogdGhpcy5xdWVyeVBhcmFtLnRhZ05hbWUgfSwgYWN0aW9uOiAndGFnc0FsbCd9O1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UubmF2aWdhdGUoaW5wdXQpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh7IGFjdGlvbjogQ09OU1RBTlRTLlRBR19BTExfRElTQ1VTUywgdGl0bGU6IHRhZy52YWx1ZSwgdGlkOiAnc2QnIH0pO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3RoaXMuY29uZmlnU2VydmljZS5nZXRSb3V0ZXJTbHVnKCl9JHtDT05TVEFOVFMuUk9VVEVTLlRBR310YWctZGlzY3Vzc2lvbnNgXSwgeyBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtIH0pO1xuICB9XG5cbn1cbiIsIjxsaWItYXBwLWxvYWRlciAqbmdJZj1cInNob3dMb2FkZXJcIj48L2xpYi1hcHAtbG9hZGVyPlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIG1hcmdpbi10b3AtbSBmbGV4LWNvbHVtbiBkaXNjdXNzaW9uLXRhZy1jb250ZW50XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZFRhZ3MgJiYgZmlsdGVyZWRUYWdzLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFnc1wiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGFnIG9mIGZpbHRlcmVkVGFncyBcIiBjbGFzcz1cInRhZ1wiIFtuZ1N0eWxlXT1cImdldEJnQ29sb3IodGFnLnZhbHVlKVwiXG4gICAgICAgIChjbGljayk9XCJnZXRBbGxEaXNjdXNzaW9ucyh0YWcpXCI+XG4gICAgICAgIDwhLS0gQ2FuIGVuYWJsZSByYW5kb20gY29sb3JzIGZyb20gYmVsb3cgY29tbWVudGVkIGNvZGUgLS0+XG4gICAgICAgIDwhLS0gPGRpdiAqbmdGb3I9XCJsZXQgdGFnIG9mIGZpbHRlcmVkVGFncyB8IHBpcGVGaWx0ZXI6J3Njb3JlLHZhbHVlJzpxdWVyeVwiXG4gICAgICAgIGNsYXNzPVwidGFnIHRleHQtY2FwaXRhbGl6ZVwiIFtuZ1N0eWxlXT1cImdldEJnQ29sb3IodGFnLnZhbHVlKVwiPiAtLT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXJnaW4tbGVmdC1tXCI+e3t0YWcudmFsdWV9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGNvdW50XCI+e3t0YWcuc2NvcmV9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2Plxu4oCLXG7igItcbjxkaXYgY2xhc3M9XCJ0YWctZW1wdHktY29udGFpbmVyXCIgKm5nSWY9XCIhc2hvd0xvYWRlciAmJiAhZmlsdGVyZWRUYWdzLmxlbmd0aFwiPlxuICA8ZGl2IGNsYXNzPVwidGFnLWVtcHR5LWltZ1wiPjxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvZW1wdHkuc3ZnXCIgYWx0PVwiZW1wdHkgaW1hZ2VcIj48L2Rpdj5cbiAgPGxhYmVsIGNsYXNzPVwidGFnLWVtcHR5LWxhYmVsXCI+Tm8gdGFncyBBdmFpbGFibGUgITwvbGFiZWw+XG4gIDxwIGNsYXNzPVwidGFnLWVtcHR5LXRleHRcIj5TdGF5IHR1bmVkICEgd2Ugd2lsbCBiZSB1cGRhdGluZyBvdXIgdGFncyBsaWJyYXJ5IGFuZCBhZGQgdGhlbSBoZXJlPC9wPlxuPC9kaXY+XG4iXX0=