@cometchat/chat-uikit-angular 4.0.1 → 4.1.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 (113) hide show
  1. package/AI/AIAssistBot/AIAssistBot.d.ts +7 -0
  2. package/AI/AIAssistBot/AIAssistBotDecorator.d.ts +11 -0
  3. package/AI/AIConversationStarter/AIConversationStarter.d.ts +2 -2
  4. package/AI/AIConversationStarter/AIConversationStarterDecorator.d.ts +3 -0
  5. package/AI/AIConversationSummary/AIConversationSummary.d.ts +7 -0
  6. package/AI/AIConversationSummary/AIConversationSummaryDecorator.d.ts +10 -0
  7. package/AI/AISmartReplies/AISmartReplies.d.ts +2 -2
  8. package/AI/AISmartReplies/AISmartRepliesDecorator.d.ts +3 -0
  9. package/Calls/CometChatCallLogDetails/cometchat-call-log-details/cometchat-call-log-details.component.d.ts +119 -0
  10. package/Calls/CometChatCallLogDetails/cometchat-call-log-details.module.d.ts +14 -0
  11. package/Calls/CometChatCallLogHistory/cometchat-call-log-history/cometchat-call-log-history.component.d.ts +111 -0
  12. package/Calls/CometChatCallLogHistory/cometchat-call-log-history.module.d.ts +10 -0
  13. package/Calls/CometChatCallLogParticipants/cometchat-call-log-participants/cometchat-call-log-participants.component.d.ts +76 -0
  14. package/Calls/CometChatCallLogParticipants/cometchat-call-log-participants.module.d.ts +10 -0
  15. package/Calls/CometChatCallLogRecordings/cometchat-call-log-recordings/cometchat-call-log-recordings.component.d.ts +90 -0
  16. package/Calls/CometChatCallLogRecordings/cometchat-call-log-recordings.module.d.ts +10 -0
  17. package/Calls/CometChatCallLogs/cometchat-call-logs/cometchat-call-logs.component.d.ts +133 -0
  18. package/Calls/CometChatCallLogs/cometchat-call-logs.module.d.ts +12 -0
  19. package/Calls/CometChatCallLogsWithDetails/cometchat-call-logs-with-details/cometchat-call-logs-with-details.component.d.ts +54 -0
  20. package/Calls/CometChatCallLogsWithDetails/cometchat-call-logs-with-details.module.d.ts +12 -0
  21. package/CometChatConversations/cometchat-conversations/cometchat-conversations.component.d.ts +18 -7
  22. package/CometChatList/cometchat-list.component.d.ts +12 -9
  23. package/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.d.ts +65 -29
  24. package/CometChatMessageComposer/cometchat-message-composer.module.d.ts +3 -3
  25. package/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.d.ts +7 -6
  26. package/CometChatMessageInformation/cometchat-message-information/cometchat-message-information.component.d.ts +6 -4
  27. package/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.d.ts +96 -55
  28. package/CometChatMessageList/cometchat-message-list.module.d.ts +1 -1
  29. package/CometChatMessages/cometchat-messages/cometchat-messages.component.d.ts +19 -16
  30. package/CometChatMessages/cometchat-messages.module.d.ts +3 -2
  31. package/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.d.ts +8 -5
  32. package/Shared/CometChatUIkit/CometChatUIKit.d.ts +13 -3
  33. package/Shared/Framework/AIExtensionDataSource.d.ts +5 -0
  34. package/Shared/Framework/DataSource.d.ts +3 -1
  35. package/Shared/Framework/DataSourceDecorator.d.ts +3 -1
  36. package/Shared/Utils/CallDetailUtils.d.ts +8 -0
  37. package/Shared/Utils/CallLogUtils.d.ts +8 -0
  38. package/Shared/Utils/MessageUtils.d.ts +2 -1
  39. package/Shared/Views/AIAssistBotMessageList/aiassist-bot-message-list/aiassist-bot-message-list.component.d.ts +71 -0
  40. package/Shared/Views/AIAssistBotMessageList/aiassist-bot-message-list.module.d.ts +11 -0
  41. package/assets/InfoIcon.svg +13 -0
  42. package/assets/greaterThanIcon.svg +3 -0
  43. package/assets/incomingAudioCallIconUrl.svg +5 -0
  44. package/assets/incomingVideoCallIconUrl.svg +6 -0
  45. package/assets/missedAudioCallIconUrl.svg +5 -0
  46. package/assets/missedVideoCallIconUrl.svg +6 -0
  47. package/assets/outgoingAudioCallIconUrl.svg +5 -0
  48. package/assets/outgoingVideoCallIconUrl.svg +6 -0
  49. package/esm2020/AI/AIAssistBot/AIAssistBot.mjs +21 -0
  50. package/esm2020/AI/AIAssistBot/AIAssistBotDecorator.mjs +68 -0
  51. package/esm2020/AI/AIConversationStarter/AIConversationStarter.mjs +7 -4
  52. package/esm2020/AI/AIConversationStarter/AIConversationStarterDecorator.mjs +22 -1
  53. package/esm2020/AI/AIConversationSummary/AIConversationSummary.mjs +21 -0
  54. package/esm2020/AI/AIConversationSummary/AIConversationSummaryDecorator.mjs +32 -0
  55. package/esm2020/AI/AISmartReplies/AISmartReplies.mjs +7 -4
  56. package/esm2020/AI/AISmartReplies/AISmartRepliesDecorator.mjs +22 -1
  57. package/esm2020/Calls/CometChatCallButtons/cometchat-call-buttons/cometchat-call-buttons.component.mjs +3 -3
  58. package/esm2020/Calls/CometChatCallLogDetails/cometchat-call-log-details/cometchat-call-log-details.component.mjs +351 -0
  59. package/esm2020/Calls/CometChatCallLogDetails/cometchat-call-log-details.module.mjs +47 -0
  60. package/esm2020/Calls/CometChatCallLogHistory/cometchat-call-log-history/cometchat-call-log-history.component.mjs +352 -0
  61. package/esm2020/Calls/CometChatCallLogHistory/cometchat-call-log-history.module.mjs +21 -0
  62. package/esm2020/Calls/CometChatCallLogParticipants/cometchat-call-log-participants/cometchat-call-log-participants.component.mjs +189 -0
  63. package/esm2020/Calls/CometChatCallLogParticipants/cometchat-call-log-participants.module.mjs +21 -0
  64. package/esm2020/Calls/CometChatCallLogRecordings/cometchat-call-log-recordings/cometchat-call-log-recordings.component.mjs +246 -0
  65. package/esm2020/Calls/CometChatCallLogRecordings/cometchat-call-log-recordings.module.mjs +21 -0
  66. package/esm2020/Calls/CometChatCallLogs/cometchat-call-logs/cometchat-call-logs.component.mjs +585 -0
  67. package/esm2020/Calls/CometChatCallLogs/cometchat-call-logs.module.mjs +36 -0
  68. package/esm2020/Calls/CometChatCallLogsWithDetails/cometchat-call-logs-with-details/cometchat-call-logs-with-details.component.mjs +193 -0
  69. package/esm2020/Calls/CometChatCallLogsWithDetails/cometchat-call-logs-with-details.module.mjs +39 -0
  70. package/esm2020/CometChatBannedMembers/cometchat-banned-members/cometchat-banned-members.component.mjs +1 -1
  71. package/esm2020/CometChatConversations/cometchat-conversations/cometchat-conversations.component.mjs +72 -46
  72. package/esm2020/CometChatConversationsWithMessages/cometchat-conversations-with-messages/cometchat-conversations-with-messages.component.mjs +3 -3
  73. package/esm2020/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.mjs +1 -1
  74. package/esm2020/CometChatGroups/cometchat-groups/cometchat-groups.component.mjs +1 -1
  75. package/esm2020/CometChatGroupsWithMessages/cometchat-groups-with-messages/cometchat-groups-with-messages.component.mjs +3 -3
  76. package/esm2020/CometChatList/cometchat-list.component.mjs +44 -28
  77. package/esm2020/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.mjs +312 -115
  78. package/esm2020/CometChatMessageComposer/cometchat-message-composer.module.mjs +7 -14
  79. package/esm2020/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.mjs +15 -17
  80. package/esm2020/CometChatMessageInformation/cometchat-message-information/cometchat-message-information.component.mjs +19 -21
  81. package/esm2020/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.mjs +888 -300
  82. package/esm2020/CometChatMessageList/cometchat-message-list.module.mjs +5 -5
  83. package/esm2020/CometChatMessages/cometchat-messages/cometchat-messages.component.mjs +72 -51
  84. package/esm2020/CometChatMessages/cometchat-messages.module.mjs +10 -6
  85. package/esm2020/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.mjs +23 -23
  86. package/esm2020/CometChatUsers/cometchat-users/cometchat-users.component.mjs +1 -1
  87. package/esm2020/CometChatUsersWithMessages/cometchat-users-with-messages/cometchat-users-with-messages.component.mjs +3 -3
  88. package/esm2020/Shared/CometChatUIkit/CometChatUIKit.mjs +173 -36
  89. package/esm2020/Shared/Framework/AIExtensionDataSource.mjs +3 -0
  90. package/esm2020/Shared/Framework/ChatConfigurator.mjs +2 -2
  91. package/esm2020/Shared/Framework/DataSource.mjs +1 -1
  92. package/esm2020/Shared/Framework/DataSourceDecorator.mjs +5 -2
  93. package/esm2020/Shared/Utils/CallDetailUtils.mjs +72 -0
  94. package/esm2020/Shared/Utils/CallLogUtils.mjs +122 -0
  95. package/esm2020/Shared/Utils/MessageUtils.mjs +31 -20
  96. package/esm2020/Shared/Views/AIAssistBotMessageList/aiassist-bot-message-list/aiassist-bot-message-list.component.mjs +289 -0
  97. package/esm2020/Shared/Views/AIAssistBotMessageList/aiassist-bot-message-list.module.mjs +22 -0
  98. package/esm2020/public-api.mjs +106 -91
  99. package/fesm2015/cometchat-chat-uikit-angular.mjs +4249 -817
  100. package/fesm2015/cometchat-chat-uikit-angular.mjs.map +1 -1
  101. package/fesm2020/cometchat-chat-uikit-angular.mjs +4271 -836
  102. package/fesm2020/cometchat-chat-uikit-angular.mjs.map +1 -1
  103. package/package.json +6 -6
  104. package/public-api.d.ts +105 -90
  105. package/AI/AIEnabler.d.ts +0 -8
  106. package/AI/AIEnablerDecorator.d.ts +0 -7
  107. package/LICENSE.md +0 -3
  108. package/Shared/Views/CometChatCardView/cometchat-card-view/cometchat-card-view.component.d.ts +0 -71
  109. package/Shared/Views/CometChatCardView/cometchat-card-view.module.d.ts +0 -8
  110. package/esm2020/AI/AIEnabler.mjs +0 -70
  111. package/esm2020/AI/AIEnablerDecorator.mjs +0 -10
  112. package/esm2020/Shared/Views/CometChatCardView/cometchat-card-view/cometchat-card-view.component.mjs +0 -117
  113. package/esm2020/Shared/Views/CometChatCardView/cometchat-card-view.module.mjs +0 -23
@@ -1,5 +1,5 @@
1
- import { Component, Input, ViewChild } from '@angular/core';
2
- import { localize, States, TitleAlignment, } from '@cometchat/uikit-resources';
1
+ import { Component, Input, ViewChild, } from "@angular/core";
2
+ import { DatePatterns, localize, States, TitleAlignment, } from "@cometchat/uikit-resources";
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/common";
5
5
  export class CometchatListComponent {
@@ -22,6 +22,11 @@ export class CometchatListComponent {
22
22
  this.loadingIconURL = "assets/Spinner.svg";
23
23
  this.showSectionHeader = false;
24
24
  this.sectionHeaderField = "name";
25
+ this.DateSeparatorPattern = DatePatterns.DayDate;
26
+ this.dateSeparatorStyle = {
27
+ height: "",
28
+ width: "",
29
+ };
25
30
  this.states = States;
26
31
  this.numberOfTopScroll = 0;
27
32
  this.searchStyle = {};
@@ -32,11 +37,13 @@ export class CometchatListComponent {
32
37
  this.ioBottom = () => {
33
38
  const options = {
34
39
  root: this.listScroll?.nativeElement,
35
- rootMargin: '-100% 0px 100px 0px',
36
- threshold: 0
40
+ rootMargin: "-100% 0px 100px 0px",
41
+ threshold: 0,
37
42
  };
38
43
  const callback = (entries) => {
39
- if (entries[0].isIntersecting && this.onScrolledToBottom && this.list?.length > 0) {
44
+ if (entries[0].isIntersecting &&
45
+ this.onScrolledToBottom &&
46
+ this.list?.length > 0) {
40
47
  this.onScrolledToBottom();
41
48
  }
42
49
  };
@@ -44,13 +51,13 @@ export class CometchatListComponent {
44
51
  observer.observe(this.bottom?.nativeElement);
45
52
  };
46
53
  /**
47
- * listening to top scroll using intersection observer
48
- */
54
+ * listening to top scroll using intersection observer
55
+ */
49
56
  this.ioTop = () => {
50
57
  const options = {
51
58
  root: this.listScroll?.nativeElement,
52
- rootMargin: '200px 0px 0px 0px',
53
- threshold: 1.0
59
+ rootMargin: "200px 0px 0px 0px",
60
+ threshold: 1.0,
54
61
  };
55
62
  const callback = (entries) => {
56
63
  if (entries[0].isIntersecting) {
@@ -70,8 +77,8 @@ export class CometchatListComponent {
70
77
  }
71
78
  };
72
79
  /**
73
- * styling part
74
- */
80
+ * styling part
81
+ */
75
82
  this.chatsListStyle = () => {
76
83
  return {
77
84
  height: this.listStyle.height,
@@ -101,15 +108,17 @@ export class CometchatListComponent {
101
108
  width: this.listStyle.width,
102
109
  background: this.listStyle.background,
103
110
  border: this.listStyle.border,
104
- borderRadius: this.listStyle.borderRadius
111
+ borderRadius: this.listStyle.borderRadius,
105
112
  };
106
113
  };
107
114
  this.headerTitle = () => {
108
- let postiton = this.titleAlignment == TitleAlignment.left ? { textAlign: "left" } : { textAlign: "center" };
115
+ let postiton = this.titleAlignment == TitleAlignment.left
116
+ ? { textAlign: "left" }
117
+ : { textAlign: "center" };
109
118
  return {
110
119
  font: this.listStyle.titleTextFont,
111
120
  color: this.listStyle.titleTextColor,
112
- ...postiton
121
+ ...postiton,
113
122
  };
114
123
  };
115
124
  this.sectionHeaderStyle = () => {
@@ -121,37 +130,38 @@ export class CometchatListComponent {
121
130
  this.headerStyle = () => {
122
131
  return {
123
132
  height: "fit-content",
124
- marginBottom: "12px"
133
+ marginBottom: "12px",
125
134
  };
126
135
  };
127
136
  this.listStyles = () => {
128
137
  return {
129
- height: "100%"
138
+ height: "100%",
130
139
  };
131
140
  };
132
141
  }
133
142
  ngOnInit() {
134
143
  this.iconStyle = this.listStyle.loadingIconTint;
135
- this.searchStyle.searchTextFont = this.listStyle?.searchTextFont,
136
- this.searchStyle.searchTextColor = this.listStyle?.searchTextColor,
137
- this.searchStyle.placeholderTextFont = this.listStyle?.searchPlaceholderTextFont,
138
- this.searchStyle.placeholderTextColor = this.listStyle?.searchPlaceholderTextColor,
139
- this.searchStyle.searchIconTint = this.listStyle?.searchIconTint;
140
- this.searchStyle.background = this.listStyle?.searchBackground,
141
- this.searchStyle.borderRadius = this.listStyle.searchBorderRadius;
144
+ (this.searchStyle.searchTextFont = this.listStyle?.searchTextFont),
145
+ (this.searchStyle.searchTextColor = this.listStyle?.searchTextColor),
146
+ (this.searchStyle.placeholderTextFont =
147
+ this.listStyle?.searchPlaceholderTextFont),
148
+ (this.searchStyle.placeholderTextColor =
149
+ this.listStyle?.searchPlaceholderTextColor),
150
+ (this.searchStyle.searchIconTint = this.listStyle?.searchIconTint);
151
+ (this.searchStyle.background = this.listStyle?.searchBackground),
152
+ (this.searchStyle.borderRadius = this.listStyle.searchBorderRadius);
142
153
  this.searchStyle.border = this.listStyle.searchBorder;
143
154
  }
144
155
  ngAfterViewInit() {
145
156
  this.ioBottom();
146
157
  }
147
- ngOnChanges(changes) {
148
- }
158
+ ngOnChanges(changes) { }
149
159
  }
150
160
  CometchatListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometchatListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
151
- CometchatListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometchatListComponent, selector: "cometchat-list", inputs: { listItemView: "listItemView", onScrolledToBottom: "onScrolledToBottom", onScrolledToTop: "onScrolledToTop", list: "list", onSearch: "onSearch", searchText: "searchText", searchIconURL: "searchIconURL", listStyle: "listStyle", searchPlaceholderText: "searchPlaceholderText", hideSearch: "hideSearch", hideError: "hideError", title: "title", titleAlignment: "titleAlignment", errorStateView: "errorStateView", loadingStateView: "loadingStateView", emptyStateView: "emptyStateView", state: "state", errorStateText: "errorStateText", emptyStateText: "emptyStateText", loadingIconURL: "loadingIconURL", showSectionHeader: "showSectionHeader", sectionHeaderField: "sectionHeaderField" }, viewQueries: [{ propertyName: "listScroll", first: true, predicate: ["listScroll"], descendants: true }, { propertyName: "bottom", first: true, predicate: ["bottom"], descendants: true }, { propertyName: "top", first: true, predicate: ["top"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-list__wrapper\">\n <div class=\"list__header\" [ngStyle]=\"headerStyle()\">\n <div *ngIf=\"title\" class=\"list__title\" [ngStyle]=\"headerTitle()\"> {{title}}</div>\n <div class=\"cc-list__search-input\">\n <cometchat-search-input [searchInputStyle]=\"searchStyle\" [placeholderText]=\"searchPlaceholderText\" *ngIf=\"!hideSearch\"\n [searchIconURL]=\"searchIconURL\" (cc-search-changed)=\"searchEvent($event)\"></cometchat-search-input>\n </div>\n </div>\n <div class=\"cc-list\" #listScroll [ngStyle]=\"listStyles()\">\n <div class=\"list__top\" #top>\n </div>\n <div class=\"decorator__message\" *ngIf=\"state == states.loading || state == states.error || state == states.empty \"\n [ngStyle]=\"messageContainerStyle()\">\n <div class=\"loading__view\" *ngIf=\"state == states.loading \">\n <cometchat-loader [iconURL]=\"loadingIconURL\" [loaderStyle]=\"iconStyle\">\n </cometchat-loader>\n <span class=\"custom__view--loading\" *ngIf=\"state == states.loading && loadingStateView\">\n <ng-container *ngTemplateOutlet=\"loadingStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"error__view\" *ngIf=\"state == states.error && !hideError \">\n <cometchat-label [labelStyle]=\"errorStyle()\" *ngIf=\"state == states.error && !hideError && !errorStateView\" [text]=\"errorStateText\"\n >\n </cometchat-label>\n <span class=\"custom__view--error\" *ngIf=\"state == states.error && !hideError && errorStateView\">\n <ng-container *ngTemplateOutlet=\"errorStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"empty__view\" *ngIf=\"state == states.empty\">\n <cometchat-label [labelStyle]=\"emptyStyle()\" *ngIf=\"state == states.empty && !emptyStateView\" [text]=\"emptyStateText\"\n >\n </cometchat-label>\n <span class=\"custom__view--empty\" *ngIf=\"state == states.empty && emptyStateView\">\n <ng-container *ngTemplateOutlet=\"emptyStateView\">\n </ng-container>\n </span>\n </div>\n </div>\n <div class=\"listitem__view\" *ngFor=\"let item of list; let i = index\">\n <div class=\"list__section\" *ngIf=\"showSectionHeader\">\n <div *ngIf=\"i > 0; else elseBlock\" class=\"section__separator\">\n <div *ngIf=\"\n list[i - 1][sectionHeaderField][0].toUpperCase() !==\n list[i][sectionHeaderField][0].toUpperCase()\n \" class=\"section__header\" [ngStyle]=\"sectionHeaderStyle()\">\n {{ list[i][sectionHeaderField][0].toUpperCase() }}\n </div>\n </div>\n <ng-template #elseBlock>\n <div class=\"section__header\" [ngStyle]=\"sectionHeaderStyle()\">\n {{\n list[i][sectionHeaderField][0].toUpperCase()\n }}\n </div>\n </ng-template>\n </div>\n <ng-container *ngTemplateOutlet=\"listItemView;context:{ $implicit: item }\">\n </ng-container>\n </div>\n <div class=\"list__bottom\" #bottom>\n </div>\n </div>\n</div>", styles: [".cc-list{display:flex;flex-direction:column;width:100%;overflow-y:auto;overflow-x:hidden}.cc-list__wrapper{height:100%;width:100%;display:flex;flex-direction:column}.listitem__view{display:flex;flex-direction:column}.section__header{padding:4px}.list__title{width:90%;margin:4px 0;padding-left:8px}.user__section{padding:8px}.cc-list__search-input{height:-moz-fit-content;height:fit-content;margin:0 8px}.list__header{width:100%}.list__section{margin-left:8px}.decorator__message--loading{display:block;height:24px;width:24px;margin-right:30px}.decorator__message{margin:0;line-height:30px;word-wrap:break-word;padding:0 8px;width:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;height:100%}.list__title{margin-bottom:8px}.cc-list::-webkit-scrollbar{background:transparent;width:8px}.cc-list::-webkit-scrollbar-thumb{background:#e8e5e5;border-radius:8px}.error__view,.empty__view{text-align:center;width:100%;text-overflow:ellipsis;text-wrap:balance}\n"], directives: [{ type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
161
+ CometchatListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometchatListComponent, selector: "cometchat-list", inputs: { listItemView: "listItemView", onScrolledToBottom: "onScrolledToBottom", onScrolledToTop: "onScrolledToTop", list: "list", onSearch: "onSearch", getSectionHeader: "getSectionHeader", searchText: "searchText", searchIconURL: "searchIconURL", listStyle: "listStyle", searchPlaceholderText: "searchPlaceholderText", hideSearch: "hideSearch", hideError: "hideError", title: "title", titleAlignment: "titleAlignment", errorStateView: "errorStateView", loadingStateView: "loadingStateView", emptyStateView: "emptyStateView", state: "state", errorStateText: "errorStateText", emptyStateText: "emptyStateText", loadingIconURL: "loadingIconURL", showSectionHeader: "showSectionHeader", sectionHeaderField: "sectionHeaderField", DateSeparatorPattern: "DateSeparatorPattern", dateSeparatorStyle: "dateSeparatorStyle" }, viewQueries: [{ propertyName: "listScroll", first: true, predicate: ["listScroll"], descendants: true }, { propertyName: "bottom", first: true, predicate: ["bottom"], descendants: true }, { propertyName: "top", first: true, predicate: ["top"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-list__wrapper\">\n <div class=\"list__header\" [ngStyle]=\"headerStyle()\">\n <div *ngIf=\"title\" class=\"list__title\" [ngStyle]=\"headerTitle()\"> {{title}}</div>\n <div class=\"cc-list__search-input\">\n <cometchat-search-input [searchInputStyle]=\"searchStyle\" [placeholderText]=\"searchPlaceholderText\"\n *ngIf=\"!hideSearch\" [searchIconURL]=\"searchIconURL\"\n (cc-search-changed)=\"searchEvent($event)\"></cometchat-search-input>\n </div>\n </div>\n <div class=\"cc-list\" #listScroll [ngStyle]=\"listStyles()\">\n <div class=\"list__top\" #top>\n </div>\n <div class=\"decorator__message\" *ngIf=\"state == states.loading || state == states.error || state == states.empty \"\n [ngStyle]=\"messageContainerStyle()\">\n <div class=\"loading__view\" *ngIf=\"state == states.loading \">\n <cometchat-loader [iconURL]=\"loadingIconURL\" [loaderStyle]=\"iconStyle\">\n </cometchat-loader>\n <span class=\"custom__view--loading\" *ngIf=\"state == states.loading && loadingStateView\">\n <ng-container *ngTemplateOutlet=\"loadingStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"error__view\" *ngIf=\"state == states.error && !hideError \">\n <cometchat-label [labelStyle]=\"errorStyle()\" *ngIf=\"state == states.error && !hideError && !errorStateView\"\n [text]=\"errorStateText\">\n </cometchat-label>\n <span class=\"custom__view--error\" *ngIf=\"state == states.error && !hideError && errorStateView\">\n <ng-container *ngTemplateOutlet=\"errorStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"empty__view\" *ngIf=\"state == states.empty\">\n <cometchat-label [labelStyle]=\"emptyStyle()\" *ngIf=\"state == states.empty && !emptyStateView\"\n [text]=\"emptyStateText\">\n </cometchat-label>\n <span class=\"custom__view--empty\" *ngIf=\"state == states.empty && emptyStateView\">\n <ng-container *ngTemplateOutlet=\"emptyStateView\">\n </ng-container>\n </span>\n </div>\n </div>\n <div class=\"listitem__view\" *ngFor=\"let item of list; let i = index\">\n <div class=\"list__section\" *ngIf=\"showSectionHeader\">\n <div *ngIf=\"!getSectionHeader\">\n <div *ngIf=\"i > 0; else elseBlock\" class=\"section__separator\">\n <div *ngIf=\"\n list[i - 1][sectionHeaderField][0].toUpperCase() !==\n list[i][sectionHeaderField][0].toUpperCase()\n \" class=\"section__header\" [ngStyle]=\"sectionHeaderStyle()\">\n {{ list[i][sectionHeaderField][0].toUpperCase() }}\n </div>\n </div>\n <ng-template #elseBlock>\n <div class=\"section__header\" [ngStyle]=\"sectionHeaderStyle()\">\n {{\n list[i][sectionHeaderField][0].toUpperCase()\n }}\n </div>\n </ng-template>\n </div>\n <div *ngIf=\"getSectionHeader\" [ngStyle]=\"sectionHeaderStyle()\">\n <cometchat-date [timestamp]=\"getSectionHeader(item,i)\" [pattern]=\"DateSeparatorPattern\"\n [dateStyle]=\"dateSeparatorStyle\">\n </cometchat-date>\n </div>\n\n </div>\n <ng-container *ngTemplateOutlet=\"listItemView;context:{ $implicit: item }\">\n </ng-container>\n </div>\n <div class=\"list__bottom\" #bottom>\n </div>\n </div>\n</div>", styles: [".cc-list{display:flex;flex-direction:column;width:100%;overflow-y:auto;overflow-x:hidden}.cc-list__wrapper{height:100%;width:100%;display:flex;flex-direction:column}.listitem__view{display:flex;flex-direction:column}.section__header{padding:4px}.list__title{width:90%;margin:4px 0;padding-left:8px}.user__section{padding:8px}.cc-list__search-input{height:-moz-fit-content;height:fit-content;margin:0 8px}.list__header{width:100%}.list__section{margin-left:8px}.decorator__message--loading{display:block;height:24px;width:24px;margin-right:30px}.decorator__message{margin:0;line-height:30px;word-wrap:break-word;padding:0 8px;width:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;height:100%}.list__title{margin-bottom:8px}.cc-list::-webkit-scrollbar{background:transparent;width:8px}.cc-list::-webkit-scrollbar-thumb{background:#e8e5e5;border-radius:8px}.error__view,.empty__view{text-align:center;width:100%;text-overflow:ellipsis;text-wrap:balance}\n"], directives: [{ type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
152
162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometchatListComponent, decorators: [{
153
163
  type: Component,
154
- args: [{ selector: 'cometchat-list', template: "<div class=\"cc-list__wrapper\">\n <div class=\"list__header\" [ngStyle]=\"headerStyle()\">\n <div *ngIf=\"title\" class=\"list__title\" [ngStyle]=\"headerTitle()\"> {{title}}</div>\n <div class=\"cc-list__search-input\">\n <cometchat-search-input [searchInputStyle]=\"searchStyle\" [placeholderText]=\"searchPlaceholderText\" *ngIf=\"!hideSearch\"\n [searchIconURL]=\"searchIconURL\" (cc-search-changed)=\"searchEvent($event)\"></cometchat-search-input>\n </div>\n </div>\n <div class=\"cc-list\" #listScroll [ngStyle]=\"listStyles()\">\n <div class=\"list__top\" #top>\n </div>\n <div class=\"decorator__message\" *ngIf=\"state == states.loading || state == states.error || state == states.empty \"\n [ngStyle]=\"messageContainerStyle()\">\n <div class=\"loading__view\" *ngIf=\"state == states.loading \">\n <cometchat-loader [iconURL]=\"loadingIconURL\" [loaderStyle]=\"iconStyle\">\n </cometchat-loader>\n <span class=\"custom__view--loading\" *ngIf=\"state == states.loading && loadingStateView\">\n <ng-container *ngTemplateOutlet=\"loadingStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"error__view\" *ngIf=\"state == states.error && !hideError \">\n <cometchat-label [labelStyle]=\"errorStyle()\" *ngIf=\"state == states.error && !hideError && !errorStateView\" [text]=\"errorStateText\"\n >\n </cometchat-label>\n <span class=\"custom__view--error\" *ngIf=\"state == states.error && !hideError && errorStateView\">\n <ng-container *ngTemplateOutlet=\"errorStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"empty__view\" *ngIf=\"state == states.empty\">\n <cometchat-label [labelStyle]=\"emptyStyle()\" *ngIf=\"state == states.empty && !emptyStateView\" [text]=\"emptyStateText\"\n >\n </cometchat-label>\n <span class=\"custom__view--empty\" *ngIf=\"state == states.empty && emptyStateView\">\n <ng-container *ngTemplateOutlet=\"emptyStateView\">\n </ng-container>\n </span>\n </div>\n </div>\n <div class=\"listitem__view\" *ngFor=\"let item of list; let i = index\">\n <div class=\"list__section\" *ngIf=\"showSectionHeader\">\n <div *ngIf=\"i > 0; else elseBlock\" class=\"section__separator\">\n <div *ngIf=\"\n list[i - 1][sectionHeaderField][0].toUpperCase() !==\n list[i][sectionHeaderField][0].toUpperCase()\n \" class=\"section__header\" [ngStyle]=\"sectionHeaderStyle()\">\n {{ list[i][sectionHeaderField][0].toUpperCase() }}\n </div>\n </div>\n <ng-template #elseBlock>\n <div class=\"section__header\" [ngStyle]=\"sectionHeaderStyle()\">\n {{\n list[i][sectionHeaderField][0].toUpperCase()\n }}\n </div>\n </ng-template>\n </div>\n <ng-container *ngTemplateOutlet=\"listItemView;context:{ $implicit: item }\">\n </ng-container>\n </div>\n <div class=\"list__bottom\" #bottom>\n </div>\n </div>\n</div>", styles: [".cc-list{display:flex;flex-direction:column;width:100%;overflow-y:auto;overflow-x:hidden}.cc-list__wrapper{height:100%;width:100%;display:flex;flex-direction:column}.listitem__view{display:flex;flex-direction:column}.section__header{padding:4px}.list__title{width:90%;margin:4px 0;padding-left:8px}.user__section{padding:8px}.cc-list__search-input{height:-moz-fit-content;height:fit-content;margin:0 8px}.list__header{width:100%}.list__section{margin-left:8px}.decorator__message--loading{display:block;height:24px;width:24px;margin-right:30px}.decorator__message{margin:0;line-height:30px;word-wrap:break-word;padding:0 8px;width:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;height:100%}.list__title{margin-bottom:8px}.cc-list::-webkit-scrollbar{background:transparent;width:8px}.cc-list::-webkit-scrollbar-thumb{background:#e8e5e5;border-radius:8px}.error__view,.empty__view{text-align:center;width:100%;text-overflow:ellipsis;text-wrap:balance}\n"] }]
164
+ args: [{ selector: "cometchat-list", template: "<div class=\"cc-list__wrapper\">\n <div class=\"list__header\" [ngStyle]=\"headerStyle()\">\n <div *ngIf=\"title\" class=\"list__title\" [ngStyle]=\"headerTitle()\"> {{title}}</div>\n <div class=\"cc-list__search-input\">\n <cometchat-search-input [searchInputStyle]=\"searchStyle\" [placeholderText]=\"searchPlaceholderText\"\n *ngIf=\"!hideSearch\" [searchIconURL]=\"searchIconURL\"\n (cc-search-changed)=\"searchEvent($event)\"></cometchat-search-input>\n </div>\n </div>\n <div class=\"cc-list\" #listScroll [ngStyle]=\"listStyles()\">\n <div class=\"list__top\" #top>\n </div>\n <div class=\"decorator__message\" *ngIf=\"state == states.loading || state == states.error || state == states.empty \"\n [ngStyle]=\"messageContainerStyle()\">\n <div class=\"loading__view\" *ngIf=\"state == states.loading \">\n <cometchat-loader [iconURL]=\"loadingIconURL\" [loaderStyle]=\"iconStyle\">\n </cometchat-loader>\n <span class=\"custom__view--loading\" *ngIf=\"state == states.loading && loadingStateView\">\n <ng-container *ngTemplateOutlet=\"loadingStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"error__view\" *ngIf=\"state == states.error && !hideError \">\n <cometchat-label [labelStyle]=\"errorStyle()\" *ngIf=\"state == states.error && !hideError && !errorStateView\"\n [text]=\"errorStateText\">\n </cometchat-label>\n <span class=\"custom__view--error\" *ngIf=\"state == states.error && !hideError && errorStateView\">\n <ng-container *ngTemplateOutlet=\"errorStateView\">\n </ng-container>\n </span>\n </div>\n <div class=\"empty__view\" *ngIf=\"state == states.empty\">\n <cometchat-label [labelStyle]=\"emptyStyle()\" *ngIf=\"state == states.empty && !emptyStateView\"\n [text]=\"emptyStateText\">\n </cometchat-label>\n <span class=\"custom__view--empty\" *ngIf=\"state == states.empty && emptyStateView\">\n <ng-container *ngTemplateOutlet=\"emptyStateView\">\n </ng-container>\n </span>\n </div>\n </div>\n <div class=\"listitem__view\" *ngFor=\"let item of list; let i = index\">\n <div class=\"list__section\" *ngIf=\"showSectionHeader\">\n <div *ngIf=\"!getSectionHeader\">\n <div *ngIf=\"i > 0; else elseBlock\" class=\"section__separator\">\n <div *ngIf=\"\n list[i - 1][sectionHeaderField][0].toUpperCase() !==\n list[i][sectionHeaderField][0].toUpperCase()\n \" class=\"section__header\" [ngStyle]=\"sectionHeaderStyle()\">\n {{ list[i][sectionHeaderField][0].toUpperCase() }}\n </div>\n </div>\n <ng-template #elseBlock>\n <div class=\"section__header\" [ngStyle]=\"sectionHeaderStyle()\">\n {{\n list[i][sectionHeaderField][0].toUpperCase()\n }}\n </div>\n </ng-template>\n </div>\n <div *ngIf=\"getSectionHeader\" [ngStyle]=\"sectionHeaderStyle()\">\n <cometchat-date [timestamp]=\"getSectionHeader(item,i)\" [pattern]=\"DateSeparatorPattern\"\n [dateStyle]=\"dateSeparatorStyle\">\n </cometchat-date>\n </div>\n\n </div>\n <ng-container *ngTemplateOutlet=\"listItemView;context:{ $implicit: item }\">\n </ng-container>\n </div>\n <div class=\"list__bottom\" #bottom>\n </div>\n </div>\n</div>", styles: [".cc-list{display:flex;flex-direction:column;width:100%;overflow-y:auto;overflow-x:hidden}.cc-list__wrapper{height:100%;width:100%;display:flex;flex-direction:column}.listitem__view{display:flex;flex-direction:column}.section__header{padding:4px}.list__title{width:90%;margin:4px 0;padding-left:8px}.user__section{padding:8px}.cc-list__search-input{height:-moz-fit-content;height:fit-content;margin:0 8px}.list__header{width:100%}.list__section{margin-left:8px}.decorator__message--loading{display:block;height:24px;width:24px;margin-right:30px}.decorator__message{margin:0;line-height:30px;word-wrap:break-word;padding:0 8px;width:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;height:100%}.list__title{margin-bottom:8px}.cc-list::-webkit-scrollbar{background:transparent;width:8px}.cc-list::-webkit-scrollbar-thumb{background:#e8e5e5;border-radius:8px}.error__view,.empty__view{text-align:center;width:100%;text-overflow:ellipsis;text-wrap:balance}\n"] }]
155
165
  }], ctorParameters: function () { return []; }, propDecorators: { listScroll: [{
156
166
  type: ViewChild,
157
167
  args: ["listScroll", { static: false }]
@@ -171,6 +181,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
171
181
  type: Input
172
182
  }], onSearch: [{
173
183
  type: Input
184
+ }], getSectionHeader: [{
185
+ type: Input
174
186
  }], searchText: [{
175
187
  type: Input
176
188
  }], searchIconURL: [{
@@ -205,5 +217,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
205
217
  type: Input
206
218
  }], sectionHeaderField: [{
207
219
  type: Input
220
+ }], DateSeparatorPattern: [{
221
+ type: Input
222
+ }], dateSeparatorStyle: [{
223
+ type: Input
208
224
  }] } });
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC11aWtpdC1hbmd1bGFyL3NyYy9Db21ldENoYXRMaXN0L2NvbWV0Y2hhdC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQtdWlraXQtYW5ndWxhci9zcmMvQ29tZXRDaGF0TGlzdC9jb21ldGNoYXQtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBc0MsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVHLE9BQU8sRUFBRSxRQUFRLEVBQUMsTUFBTSxFQUFFLGNBQWMsR0FBRyxNQUFNLDRCQUE0QixDQUFDOzs7QUFNOUUsTUFBTSxPQUFPLHNCQUFzQjtJQW1DakM7UUE1QlMsU0FBSSxHQUFRLEVBQUUsQ0FBQztRQUVmLGVBQVUsR0FBVyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsa0JBQWEsR0FBVyxtQkFBbUIsQ0FBQztRQUM1QyxjQUFTLEdBQWM7WUFDOUIsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsTUFBTTtTQUNmLENBQUE7UUFDUywwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFDbkMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsbUJBQWMsR0FBbUIsY0FBYyxDQUFDLElBQUksQ0FBQztRQUlyRCxVQUFLLEdBQVcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM5QixtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1QixtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1QixtQkFBYyxHQUFXLG9CQUFvQixDQUFDO1FBQzlDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyx1QkFBa0Is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TSxFQUFFLEtBQUssRUFBRTtnQkFDRixNQUFNO3NCQUE3QyxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0QsR0FBRztzQkFBdkMsU0FBUzt1QkFBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUMxQixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2VhcmNoSW5wdXRTdHlsZSB9IGZyb20gJ0Bjb21ldGNoYXQvdWlraXQtZWxlbWVudHMnO1xuaW1wb3J0IHsgTGlzdFN0eWxlLE1lc3NhZ2VMaXN0U3R5bGUsICBVc2Vyc1N0eWxlIH0gZnJvbSAnQGNvbWV0Y2hhdC91aWtpdC1zaGFyZWQnO1xuaW1wb3J0IHsgbG9jYWxpemUsU3RhdGVzLCBUaXRsZUFsaWdubWVudCwgfSBmcm9tICdAY29tZXRjaGF0L3Vpa2l0LXJlc291cmNlcyc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb21ldGNoYXQtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ldGNoYXQtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbWV0Y2hhdC1saXN0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29tZXRjaGF0TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoXCJsaXN0U2Nyb2xsXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBsaXN0U2Nyb2xsITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChcImJvdHRvbVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgYm90dG9tITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChcInRvcFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgdG9wITogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgbGlzdEl0ZW1WaWV3ITogVGVtcGxhdGVSZWY8YW55PjsgLy9jdXN0b20gdmlld1xuICBASW5wdXQoKSBvblNjcm9sbGVkVG9Cb3R0b20hOiAoKT0+dm9pZDtcbiAgQElucHV0KCkgb25TY3JvbGxlZFRvVG9wITogKCk9PnZvaWQ7XG4gIEBJbnB1dCgpIGxpc3Q6IGFueSA9IFtdO1xuICBASW5wdXQoKSBvblNlYXJjaCE6ICh0ZXh0OnN0cmluZyk9PnZvaWQ7XG4gIEBJbnB1dCgpIHNlYXJjaFRleHQ6IHN0cmluZyA9IGxvY2FsaXplKFwiU0VBUkNIXCIpO1xuICBASW5wdXQoKSBzZWFyY2hJY29uVVJMOiBTdHJpbmcgPSBcImFzc2V0cy9zZWFyY2guc3ZnXCI7XG4gIEBJbnB1dCgpIGxpc3RTdHlsZTogTGlzdFN0eWxlID0ge1xuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuIH1cbiAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXJUZXh0OiBTdHJpbmcgPSBcIlwiO1xuICBASW5wdXQoKSBoaWRlU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhpZGVFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgdGl0bGVBbGlnbm1lbnQ6IFRpdGxlQWxpZ25tZW50ID0gVGl0bGVBbGlnbm1lbnQubGVmdDtcbiAgQElucHV0KCkgZXJyb3JTdGF0ZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBsb2FkaW5nU3RhdGVWaWV3ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgZW1wdHlTdGF0ZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBzdGF0ZTogU3RhdGVzID0gU3RhdGVzLmxvYWRlZDtcbiAgQElucHV0KCkgZXJyb3JTdGF0ZVRleHQ6IHN0cmluZyA9IFwiXCI7XG4gIEBJbnB1dCgpIGVtcHR5U3RhdGVUZXh0OiBzdHJpbmcgPSBcIlwiO1xuICBASW5wdXQoKSBsb2FkaW5nSWNvblVSTDogc3RyaW5nID0gXCJhc3NldHMvU3Bpbm5lci5zdmdcIjtcbiAgQElucHV0KCkgc2hvd1NlY3Rpb25IZWFkZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2VjdGlvbkhlYWRlckZpZWxkOiBzdHJpbmcgPSBcIm5hbWVcIjtcbiAgcHVibGljIHN0YXRlczogdHlwZW9mIFN0YXRlcyA9IFN0YXRlc1xuICBwdWJsaWMgbnVtYmVyT2ZUb3BTY3JvbGw6IG51bWJlciA9IDA7XG4gIHNlYXJjaFN0eWxlOiBTZWFyY2hJbnB1dFN0eWxlID0ge1xuXG4gIH1cbiAgaWNvblN0eWxlOmFueSA9IHt9XG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gIH1cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pY29uU3R5bGUgPSAgdGhpcy5saXN0U3R5bGUubG9hZGluZ0ljb25UaW50XG4gICAgdGhpcy5zZWFyY2hTdHlsZS5zZWFyY2hUZXh0Rm9udCA9IHRoaXMubGlzdFN0eWxlPy5zZWFyY2hUZXh0Rm9udCxcbiAgICB0aGlzLnNlYXJjaFN0eWxlLnNlYXJjaFRleHRDb2xvciA9IHRoaXMubGlzdFN0eWxlPy5zZWFyY2hUZXh0Q29sb3IsXG4gICAgdGhpcy5zZWFyY2hTdHlsZS5wbGFjZWhvbGRlclRleHRGb250ID0gdGhpcy5saXN0U3R5bGU/LnNlYXJjaFBsYWNlaG9sZGVyVGV4dEZvbnQsXG4gICAgdGhpcy5zZWFyY2hTdHlsZS5wbGFjZWhvbGRlclRleHRDb2xvciA9IHRoaXMubGlzdFN0eWxlPy5zZWFyY2hQbGFjZWhvbGRlclRleHRDb2xvcixcbiAgICB0aGlzLnNlYXJjaFN0eWxlLnNlYXJjaEljb25UaW50ID0gdGhpcy5saXN0U3R5bGU/LnNlYXJjaEljb25UaW50XG4gICAgdGhpcy5zZWFyY2hTdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5saXN0U3R5bGU/LnNlYXJjaEJhY2tncm91bmQsXG4gICAgdGhpcy5zZWFyY2hTdHlsZS5ib3JkZXJSYWRpdXMgPSB0aGlzLmxpc3RTdHlsZS5zZWFyY2hCb3JkZXJSYWRpdXNcbiAgICB0aGlzLnNlYXJjaFN0eWxlLmJvcmRlciA9IHRoaXMubGlzdFN0eWxlLnNlYXJjaEJvcmRlclxuXG5cbiAgIH1cbiAgIG5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgIHRoaXMuaW9Cb3R0b20oKTtcbiAgIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICB9XG4gIC8qKlxuICAgKiBsaXN0ZW5pbmcgdG8gYm90dG9tIHNjcm9sbCB1c2luZyBpbnRlcnNlY3Rpb24gb2JzZXJ2ZXJcbiAgICovXG4gIGlvQm90dG9tID0gKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLmxpc3RTY3JvbGw/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICByb290TWFyZ2luOiAnLTEwMCUgMHB4IDEwMHB4IDBweCcsXG4gICAgICB0aHJlc2hvbGQ6IDBcbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZW50cmllczogYW55KSA9PiB7XG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZyAmJiB0aGlzLm9uU2Nyb2xsZWRUb0JvdHRvbSAmJiB0aGlzLmxpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5vblNjcm9sbGVkVG9Cb3R0b20oKVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgb2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMuYm90dG9tPy5uYXRpdmVFbGVtZW50KTtcbiAgfVxuICAvKipcbiAqIGxpc3RlbmluZyB0byB0b3Agc2Nyb2xsIHVzaW5nIGludGVyc2VjdGlvbiBvYnNlcnZlclxuICovXG4gIGlvVG9wID0gKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLmxpc3RTY3JvbGw/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICByb290TWFyZ2luOiAnMjAwcHggMHB4IDBweCAwcHgnLFxuICAgICAgdGhyZXNob2xkOiAxLjBcbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZW50cmllczogYW55KSA9PiB7XG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLm51bWJlck9mVG9wU2Nyb2xsKytcbiAgICAgICAgaWYgKHRoaXMub25TY3JvbGxlZFRvVG9wICYmIHRoaXMubnVtYmVyT2ZUb3BTY3JvbGwgPiAxKSB7XG4gICAgICAgICAgdGhpcy5vblNjcm9sbGVkVG9Ub3AoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvYnNlcnZlcjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgIC8vIG9ic2VydmVyLm9ic2VydmUodGhpcy50b3AubmF0aXZlRWxlbWVudCk7XG4gIH1cbiAgc2VhcmNoRXZlbnQgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IGV2ZW50Py5kZXRhaWw/LnNlYXJjaFRleHQ7XG4gICAgaWYgKHRoaXMub25TZWFyY2gpIHtcbiAgICAgIHRoaXMub25TZWFyY2godGhpcy5zZWFyY2hUZXh0KVxuICAgIH1cbiAgfVxuICAgLyoqXG4gKiBzdHlsaW5nIHBhcnRcbiAqL1xuICBjaGF0c0xpc3RTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiB0aGlzLmxpc3RTdHlsZS5oZWlnaHQsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLmxpc3RTdHlsZS5iYWNrZ3JvdW5kLFxuICAgIH07XG4gIH1cbiAgbWVzc2FnZUNvbnRhaW5lclN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogdGhpcy5saXN0U3R5bGUud2lkdGgsXG4gICAgfTtcbiAgfVxuICBlcnJvclN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0Rm9udDogdGhpcy5saXN0U3R5bGUuZXJyb3JTdGF0ZVRleHRGb250LFxuICAgICAgdGV4dENvbG9yOiB0aGlzLmxpc3RTdHlsZS5lcnJvclN0YXRlVGV4dENvbG9yLFxuICAgIH1cbiAgfVxuICBlbXB0eVN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0Rm9udDogdGhpcy5saXN0U3R5bGUuZW1wdHlTdGF0ZVRleHRGb250LFxuICAgICAgdGV4dENvbG9yOiB0aGlzLmxpc3RTdHlsZS5lbXB0eVN0YXRlVGV4dENvbG9yLFxuICAgIH1cbiAgfVxuICB3cmFwcGVyU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogdGhpcy5saXN0U3R5bGUuaGVpZ2h0LFxuICAgICAgd2lkdGg6IHRoaXMubGlzdFN0eWxlLndpZHRoLFxuICAgICAgYmFja2dyb3VuZDogdGhpcy5saXN0U3R5bGUuYmFja2dyb3VuZCxcbiAgICAgIGJvcmRlcjogdGhpcy5saXN0U3R5bGUuYm9yZGVyLFxuICAgICAgYm9yZGVyUmFkaXVzOiB0aGlzLmxpc3RTdHlsZS5ib3JkZXJSYWRpdXNcbiAgICB9XG4gIH1cbiAgaGVhZGVyVGl0bGUgPSAoKSA9PiB7XG4gICAgbGV0IHBvc3RpdG9uOiBhbnkgPSB0aGlzLnRpdGxlQWxpZ25tZW50ID09IFRpdGxlQWxpZ25tZW50LmxlZnQgPyB7IHRleHRBbGlnbjogXCJsZWZ0XCIgfSA6IHsgdGV4dEFsaWduOiBcImNlbnRlclwiIH1cbiAgICByZXR1cm4ge1xuICAgICAgZm9udDogdGhpcy5saXN0U3R5bGUudGl0bGVUZXh0Rm9udCxcbiAgICAgIGNvbG9yOiB0aGlzLmxpc3RTdHlsZS50aXRsZVRleHRDb2xvcixcbiAgICAgIC4uLnBvc3RpdG9uXG4gICAgfVxuICB9XG4gIHNlY3Rpb25IZWFkZXJTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9udDogdGhpcy5saXN0U3R5bGU/LnNlY3Rpb25IZWFkZXJUZXh0Rm9udCxcbiAgICAgIGNvbG9yOiB0aGlzLmxpc3RTdHlsZT8uc2VjdGlvbkhlYWRlclRleHRDb2xvcixcbiAgICB9XG4gIH1cbiAgaGVhZGVyU3R5bGUgPSAoKT0+e1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiZml0LWNvbnRlbnRcIixcbiAgICAgIG1hcmdpbkJvdHRvbTpcIjEycHhcIlxuICAgIH1cbiAgfVxuICBsaXN0U3R5bGVzID0gKCk9PntcbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiBcIjEwMCVcIlxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNjLWxpc3RfX3dyYXBwZXJcIj5cbiAgPGRpdiBjbGFzcz1cImxpc3RfX2hlYWRlclwiIFtuZ1N0eWxlXT1cImhlYWRlclN0eWxlKClcIj5cbiAgICA8ZGl2ICpuZ0lmPVwidGl0bGVcIiBjbGFzcz1cImxpc3RfX3RpdGxlXCIgW25nU3R5bGVdPVwiaGVhZGVyVGl0bGUoKVwiPiB7e3RpdGxlfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtbGlzdF9fc2VhcmNoLWlucHV0XCI+XG4gICAgICA8Y29tZXRjaGF0LXNlYXJjaC1pbnB1dCBbc2VhcmNoSW5wdXRTdHlsZV09XCJzZWFyY2hTdHlsZVwiIFtwbGFjZWhvbGRlclRleHRdPVwic2VhcmNoUGxhY2Vob2xkZXJUZXh0XCIgKm5nSWY9XCIhaGlkZVNlYXJjaFwiXG4gICAgICBbc2VhcmNoSWNvblVSTF09XCJzZWFyY2hJY29uVVJMXCIgKGNjLXNlYXJjaC1jaGFuZ2VkKT1cInNlYXJjaEV2ZW50KCRldmVudClcIj48L2NvbWV0Y2hhdC1zZWFyY2gtaW5wdXQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2MtbGlzdFwiICNsaXN0U2Nyb2xsIFtuZ1N0eWxlXT1cImxpc3RTdHlsZXMoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJsaXN0X190b3BcIiAjdG9wPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkZWNvcmF0b3JfX21lc3NhZ2VcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5sb2FkaW5nIHx8IHN0YXRlID09IHN0YXRlcy5lcnJvciAgfHwgc3RhdGUgPT0gc3RhdGVzLmVtcHR5IFwiXG4gICAgICBbbmdTdHlsZV09XCJtZXNzYWdlQ29udGFpbmVyU3R5bGUoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmdfX3ZpZXdcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5sb2FkaW5nIFwiPlxuICAgICAgICA8Y29tZXRjaGF0LWxvYWRlciBbaWNvblVSTF09XCJsb2FkaW5nSWNvblVSTFwiIFtsb2FkZXJTdHlsZV09XCJpY29uU3R5bGVcIj5cbiAgICAgICAgPC9jb21ldGNoYXQtbG9hZGVyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbV9fdmlldy0tbG9hZGluZ1wiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmxvYWRpbmcgICYmIGxvYWRpbmdTdGF0ZVZpZXdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1N0YXRlVmlld1wiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlcnJvcl9fdmlld1wiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVycm9yICAmJiAhaGlkZUVycm9yIFwiPlxuICAgICAgICA8Y29tZXRjaGF0LWxhYmVsIFtsYWJlbFN0eWxlXT1cImVycm9yU3R5bGUoKVwiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVycm9yICAmJiAhaGlkZUVycm9yICYmICFlcnJvclN0YXRlVmlld1wiIFt0ZXh0XT1cImVycm9yU3RhdGVUZXh0XCJcbiAgICAgICAgICA+XG4gICAgICAgIDwvY29tZXRjaGF0LWxhYmVsPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbV9fdmlldy0tZXJyb3JcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5lcnJvciAgJiYgIWhpZGVFcnJvciAmJiBlcnJvclN0YXRlVmlld1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlcnJvclN0YXRlVmlld1wiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eV9fdmlld1wiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVtcHR5XCI+XG4gICAgICAgIDxjb21ldGNoYXQtbGFiZWwgW2xhYmVsU3R5bGVdPVwiZW1wdHlTdHlsZSgpXCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMuZW1wdHkgJiYgIWVtcHR5U3RhdGVWaWV3XCIgW3RleHRdPVwiZW1wdHlTdGF0ZVRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgPC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3VzdG9tX192aWV3LS1lbXB0eVwiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVtcHR5ICYmIGVtcHR5U3RhdGVWaWV3XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVtcHR5U3RhdGVWaWV3XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsaXN0aXRlbV9fdmlld1wiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19zZWN0aW9uXCIgKm5nSWY9XCJzaG93U2VjdGlvbkhlYWRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA+IDA7IGVsc2UgZWxzZUJsb2NrXCIgY2xhc3M9XCJzZWN0aW9uX19zZXBhcmF0b3JcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGxpc3RbaSAtIDFdW3NlY3Rpb25IZWFkZXJGaWVsZF1bMF0udG9VcHBlckNhc2UoKSAhPT1cbiAgICAgICAgICAgICAgbGlzdFtpXVtzZWN0aW9uSGVhZGVyRmllbGRdWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgIFwiIGNsYXNzPVwic2VjdGlvbl9faGVhZGVyXCIgW25nU3R5bGVdPVwic2VjdGlvbkhlYWRlclN0eWxlKClcIj5cbiAgICAgICAgICAgIHt7IGxpc3RbaV1bc2VjdGlvbkhlYWRlckZpZWxkXVswXS50b1VwcGVyQ2FzZSgpIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbl9faGVhZGVyXCIgW25nU3R5bGVdPVwic2VjdGlvbkhlYWRlclN0eWxlKClcIj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICBsaXN0W2ldW3NlY3Rpb25IZWFkZXJGaWVsZF1bMF0udG9VcHBlckNhc2UoKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3RJdGVtVmlldztjb250ZXh0OnsgJGltcGxpY2l0OiBpdGVtIH1cIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsaXN0X19ib3R0b21cIiAjYm90dG9tPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC11aWtpdC1hbmd1bGFyL3NyYy9Db21ldENoYXRMaXN0L2NvbWV0Y2hhdC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQtdWlraXQtYW5ndWxhci9zcmMvQ29tZXRDaGF0TGlzdC9jb21ldGNoYXQtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFJTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUNMLFlBQVksRUFDWixRQUFRLEVBQ1IsTUFBTSxFQUNOLGNBQWMsR0FDZixNQUFNLDRCQUE0QixDQUFDOzs7QUFNcEMsTUFBTSxPQUFPLHNCQUFzQjtJQXVDakM7UUFoQ1MsU0FBSSxHQUFRLEVBQUUsQ0FBQztRQUdmLGVBQVUsR0FBVyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsa0JBQWEsR0FBVyxtQkFBbUIsQ0FBQztRQUM1QyxjQUFTLEdBQWM7WUFDOUIsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsTUFBTTtTQUNkLENBQUM7UUFDTywwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFDbkMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsbUJBQWMsR0FBbUIsY0FBYyxDQUFDLElBQUksQ0FBQztRQUlyRCxVQUFLLEdBQVcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM5QixtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1QixtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1QixtQkFBYyxHQUFXLG9CQUFvQixDQUFDO1FBQzlDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNu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QUE1QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERhdGVTdHlsZSwgU2VhcmNoSW5wdXRTdHlsZSB9IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LWVsZW1lbnRzXCI7XG5pbXBvcnQge1xuICBMaXN0U3R5bGUsXG4gIE1lc3NhZ2VMaXN0U3R5bGUsXG4gIFVzZXJzU3R5bGUsXG59IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXNoYXJlZFwiO1xuaW1wb3J0IHtcbiAgRGF0ZVBhdHRlcm5zLFxuICBsb2NhbGl6ZSxcbiAgU3RhdGVzLFxuICBUaXRsZUFsaWdubWVudCxcbn0gZnJvbSBcIkBjb21ldGNoYXQvdWlraXQtcmVzb3VyY2VzXCI7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiY29tZXRjaGF0LWxpc3RcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9jb21ldGNoYXQtbGlzdC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vY29tZXRjaGF0LWxpc3QuY29tcG9uZW50LnNjc3NcIl0sXG59KVxuZXhwb3J0IGNsYXNzIENvbWV0Y2hhdExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKFwibGlzdFNjcm9sbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgbGlzdFNjcm9sbCE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoXCJib3R0b21cIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGJvdHRvbSE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoXCJ0b3BcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHRvcCE6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIGxpc3RJdGVtVmlldyE6IFRlbXBsYXRlUmVmPGFueT47IC8vY3VzdG9tIHZpZXdcbiAgQElucHV0KCkgb25TY3JvbGxlZFRvQm90dG9tITogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TY3JvbGxlZFRvVG9wITogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgbGlzdDogYW55ID0gW107XG4gIEBJbnB1dCgpIG9uU2VhcmNoITogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZ2V0U2VjdGlvbkhlYWRlciE6IChjYWxsOiBhbnksIGluZGV4OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIHNlYXJjaFRleHQ6IHN0cmluZyA9IGxvY2FsaXplKFwiU0VBUkNIXCIpO1xuICBASW5wdXQoKSBzZWFyY2hJY29uVVJMOiBTdHJpbmcgPSBcImFzc2V0cy9zZWFyY2guc3ZnXCI7XG4gIEBJbnB1dCgpIGxpc3RTdHlsZTogTGlzdFN0eWxlID0ge1xuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICB9O1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlclRleHQ6IFN0cmluZyA9IFwiXCI7XG4gIEBJbnB1dCgpIGhpZGVTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaGlkZUVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSBcIlwiO1xuICBASW5wdXQoKSB0aXRsZUFsaWdubWVudDogVGl0bGVBbGlnbm1lbnQgPSBUaXRsZUFsaWdubWVudC5sZWZ0O1xuICBASW5wdXQoKSBlcnJvclN0YXRlVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGxvYWRpbmdTdGF0ZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBlbXB0eVN0YXRlVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIHN0YXRlOiBTdGF0ZXMgPSBTdGF0ZXMubG9hZGVkO1xuICBASW5wdXQoKSBlcnJvclN0YXRlVGV4dDogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgZW1wdHlTdGF0ZVRleHQ6IHN0cmluZyA9IFwiXCI7XG4gIEBJbnB1dCgpIGxvYWRpbmdJY29uVVJMOiBzdHJpbmcgPSBcImFzc2V0cy9TcGlubmVyLnN2Z1wiO1xuICBASW5wdXQoKSBzaG93U2VjdGlvbkhlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWN0aW9uSGVhZGVyRmllbGQ6IHN0cmluZyA9IFwibmFtZVwiO1xuICBASW5wdXQoKSBEYXRlU2VwYXJhdG9yUGF0dGVybjogRGF0ZVBhdHRlcm5zID0gRGF0ZVBhdHRlcm5zLkRheURhdGU7XG4gIEBJbnB1dCgpIGRhdGVTZXBhcmF0b3JTdHlsZTogRGF0ZVN0eWxlID0ge1xuICAgIGhlaWdodDogXCJcIixcbiAgICB3aWR0aDogXCJcIixcbiAgfTtcbiAgcHVibGljIHN0YXRlczogdHlwZW9mIFN0YXRlcyA9IFN0YXRlcztcbiAgcHVibGljIG51bWJlck9mVG9wU2Nyb2xsOiBudW1iZXIgPSAwO1xuICBzZWFyY2hTdHlsZTogU2VhcmNoSW5wdXRTdHlsZSA9IHt9O1xuICBpY29uU3R5bGU6IGFueSA9IHt9O1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaWNvblN0eWxlID0gdGhpcy5saXN0U3R5bGUubG9hZGluZ0ljb25UaW50O1xuICAgICh0aGlzLnNlYXJjaFN0eWxlLnNlYXJjaFRleHRGb250ID0gdGhpcy5saXN0U3R5bGU/LnNlYXJjaFRleHRGb250KSxcbiAgICAgICh0aGlzLnNlYXJjaFN0eWxlLnNlYXJjaFRleHRDb2xvciA9IHRoaXMubGlzdFN0eWxlPy5zZWFyY2hUZXh0Q29sb3IpLFxuICAgICAgKHRoaXMuc2VhcmNoU3R5bGUucGxhY2Vob2xkZXJUZXh0Rm9udCA9XG4gICAgICAgIHRoaXMubGlzdFN0eWxlPy5zZWFyY2hQbGFjZWhvbGRlclRleHRGb250KSxcbiAgICAgICh0aGlzLnNlYXJjaFN0eWxlLnBsYWNlaG9sZGVyVGV4dENvbG9yID1cbiAgICAgICAgdGhpcy5saXN0U3R5bGU/LnNlYXJjaFBsYWNlaG9sZGVyVGV4dENvbG9yKSxcbiAgICAgICh0aGlzLnNlYXJjaFN0eWxlLnNlYXJjaEljb25UaW50ID0gdGhpcy5saXN0U3R5bGU/LnNlYXJjaEljb25UaW50KTtcbiAgICAodGhpcy5zZWFyY2hTdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5saXN0U3R5bGU/LnNlYXJjaEJhY2tncm91bmQpLFxuICAgICAgKHRoaXMuc2VhcmNoU3R5bGUuYm9yZGVyUmFkaXVzID0gdGhpcy5saXN0U3R5bGUuc2VhcmNoQm9yZGVyUmFkaXVzKTtcbiAgICB0aGlzLnNlYXJjaFN0eWxlLmJvcmRlciA9IHRoaXMubGlzdFN0eWxlLnNlYXJjaEJvcmRlcjtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5pb0JvdHRvbSgpO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHt9XG4gIC8qKlxuICAgKiBsaXN0ZW5pbmcgdG8gYm90dG9tIHNjcm9sbCB1c2luZyBpbnRlcnNlY3Rpb24gb2JzZXJ2ZXJcbiAgICovXG4gIGlvQm90dG9tID0gKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLmxpc3RTY3JvbGw/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICByb290TWFyZ2luOiBcIi0xMDAlIDBweCAxMDBweCAwcHhcIixcbiAgICAgIHRocmVzaG9sZDogMCxcbiAgICB9O1xuICAgIGNvbnN0IGNhbGxiYWNrID0gKGVudHJpZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBlbnRyaWVzWzBdLmlzSW50ZXJzZWN0aW5nICYmXG4gICAgICAgIHRoaXMub25TY3JvbGxlZFRvQm90dG9tICYmXG4gICAgICAgIHRoaXMubGlzdD8ubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMub25TY3JvbGxlZFRvQm90dG9tKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgb2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMuYm90dG9tPy5uYXRpdmVFbGVtZW50KTtcbiAgfTtcbiAgLyoqXG4gICAqIGxpc3RlbmluZyB0byB0b3Agc2Nyb2xsIHVzaW5nIGludGVyc2VjdGlvbiBvYnNlcnZlclxuICAgKi9cbiAgaW9Ub3AgPSAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHRoaXMubGlzdFNjcm9sbD8ubmF0aXZlRWxlbWVudCxcbiAgICAgIHJvb3RNYXJnaW46IFwiMjAwcHggMHB4IDBweCAwcHhcIixcbiAgICAgIHRocmVzaG9sZDogMS4wLFxuICAgIH07XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZW50cmllczogYW55KSA9PiB7XG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLm51bWJlck9mVG9wU2Nyb2xsKys7XG4gICAgICAgIGlmICh0aGlzLm9uU2Nyb2xsZWRUb1RvcCAmJiB0aGlzLm51bWJlck9mVG9wU2Nyb2xsID4gMSkge1xuICAgICAgICAgIHRoaXMub25TY3JvbGxlZFRvVG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBvYnNlcnZlcjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXG4gICAgICBjYWxsYmFjayxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIC8vIG9ic2VydmVyLm9ic2VydmUodGhpcy50b3AubmF0aXZlRWxlbWVudCk7XG4gIH07XG4gIHNlYXJjaEV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBldmVudD8uZGV0YWlsPy5zZWFyY2hUZXh0O1xuICAgIGlmICh0aGlzLm9uU2VhcmNoKSB7XG4gICAgICB0aGlzLm9uU2VhcmNoKHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogc3R5bGluZyBwYXJ0XG4gICAqL1xuICBjaGF0c0xpc3RTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiB0aGlzLmxpc3RTdHlsZS5oZWlnaHQsXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLmxpc3RTdHlsZS5iYWNrZ3JvdW5kLFxuICAgIH07XG4gIH07XG4gIG1lc3NhZ2VDb250YWluZXJTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMubGlzdFN0eWxlLndpZHRoLFxuICAgIH07XG4gIH07XG4gIGVycm9yU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiB0aGlzLmxpc3RTdHlsZS5lcnJvclN0YXRlVGV4dEZvbnQsXG4gICAgICB0ZXh0Q29sb3I6IHRoaXMubGlzdFN0eWxlLmVycm9yU3RhdGVUZXh0Q29sb3IsXG4gICAgfTtcbiAgfTtcbiAgZW1wdHlTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEZvbnQ6IHRoaXMubGlzdFN0eWxlLmVtcHR5U3RhdGVUZXh0Rm9udCxcbiAgICAgIHRleHRDb2xvcjogdGhpcy5saXN0U3R5bGUuZW1wdHlTdGF0ZVRleHRDb2xvcixcbiAgICB9O1xuICB9O1xuICB3cmFwcGVyU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogdGhpcy5saXN0U3R5bGUuaGVpZ2h0LFxuICAgICAgd2lkdGg6IHRoaXMubGlzdFN0eWxlLndpZHRoLFxuICAgICAgYmFja2dyb3VuZDogdGhpcy5saXN0U3R5bGUuYmFja2dyb3VuZCxcbiAgICAgIGJvcmRlcjogdGhpcy5saXN0U3R5bGUuYm9yZGVyLFxuICAgICAgYm9yZGVyUmFkaXVzOiB0aGlzLmxpc3RTdHlsZS5ib3JkZXJSYWRpdXMsXG4gICAgfTtcbiAgfTtcbiAgaGVhZGVyVGl0bGUgPSAoKSA9PiB7XG4gICAgbGV0IHBvc3RpdG9uOiBhbnkgPVxuICAgICAgdGhpcy50aXRsZUFsaWdubWVudCA9PSBUaXRsZUFsaWdubWVudC5sZWZ0XG4gICAgICAgID8geyB0ZXh0QWxpZ246IFwibGVmdFwiIH1cbiAgICAgICAgOiB7IHRleHRBbGlnbjogXCJjZW50ZXJcIiB9O1xuICAgIHJldHVybiB7XG4gICAgICBmb250OiB0aGlzLmxpc3RTdHlsZS50aXRsZVRleHRGb250LFxuICAgICAgY29sb3I6IHRoaXMubGlzdFN0eWxlLnRpdGxlVGV4dENvbG9yLFxuICAgICAgLi4ucG9zdGl0b24sXG4gICAgfTtcbiAgfTtcbiAgc2VjdGlvbkhlYWRlclN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBmb250OiB0aGlzLmxpc3RTdHlsZT8uc2VjdGlvbkhlYWRlclRleHRGb250LFxuICAgICAgY29sb3I6IHRoaXMubGlzdFN0eWxlPy5zZWN0aW9uSGVhZGVyVGV4dENvbG9yLFxuICAgIH07XG4gIH07XG4gIGhlYWRlclN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiZml0LWNvbnRlbnRcIixcbiAgICAgIG1hcmdpbkJvdHRvbTogXCIxMnB4XCIsXG4gICAgfTtcbiAgfTtcbiAgbGlzdFN0eWxlcyA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICB9O1xuICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cImNjLWxpc3RfX3dyYXBwZXJcIj5cbiAgPGRpdiBjbGFzcz1cImxpc3RfX2hlYWRlclwiIFtuZ1N0eWxlXT1cImhlYWRlclN0eWxlKClcIj5cbiAgICA8ZGl2ICpuZ0lmPVwidGl0bGVcIiBjbGFzcz1cImxpc3RfX3RpdGxlXCIgW25nU3R5bGVdPVwiaGVhZGVyVGl0bGUoKVwiPiB7e3RpdGxlfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtbGlzdF9fc2VhcmNoLWlucHV0XCI+XG4gICAgICA8Y29tZXRjaGF0LXNlYXJjaC1pbnB1dCBbc2VhcmNoSW5wdXRTdHlsZV09XCJzZWFyY2hTdHlsZVwiIFtwbGFjZWhvbGRlclRleHRdPVwic2VhcmNoUGxhY2Vob2xkZXJUZXh0XCJcbiAgICAgICAgKm5nSWY9XCIhaGlkZVNlYXJjaFwiIFtzZWFyY2hJY29uVVJMXT1cInNlYXJjaEljb25VUkxcIlxuICAgICAgICAoY2Mtc2VhcmNoLWNoYW5nZWQpPVwic2VhcmNoRXZlbnQoJGV2ZW50KVwiPjwvY29tZXRjaGF0LXNlYXJjaC1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjYy1saXN0XCIgI2xpc3RTY3JvbGwgW25nU3R5bGVdPVwibGlzdFN0eWxlcygpXCI+XG4gICAgPGRpdiBjbGFzcz1cImxpc3RfX3RvcFwiICN0b3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRlY29yYXRvcl9fbWVzc2FnZVwiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmxvYWRpbmcgfHwgc3RhdGUgPT0gc3RhdGVzLmVycm9yICB8fCBzdGF0ZSA9PSBzdGF0ZXMuZW1wdHkgXCJcbiAgICAgIFtuZ1N0eWxlXT1cIm1lc3NhZ2VDb250YWluZXJTdHlsZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZ19fdmlld1wiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmxvYWRpbmcgXCI+XG4gICAgICAgIDxjb21ldGNoYXQtbG9hZGVyIFtpY29uVVJMXT1cImxvYWRpbmdJY29uVVJMXCIgW2xvYWRlclN0eWxlXT1cImljb25TdHlsZVwiPlxuICAgICAgICA8L2NvbWV0Y2hhdC1sb2FkZXI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3VzdG9tX192aWV3LS1sb2FkaW5nXCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMubG9hZGluZyAgJiYgbG9hZGluZ1N0YXRlVmlld1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nU3RhdGVWaWV3XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImVycm9yX192aWV3XCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMuZXJyb3IgICYmICFoaWRlRXJyb3IgXCI+XG4gICAgICAgIDxjb21ldGNoYXQtbGFiZWwgW2xhYmVsU3R5bGVdPVwiZXJyb3JTdHlsZSgpXCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMuZXJyb3IgICYmICFoaWRlRXJyb3IgJiYgIWVycm9yU3RhdGVWaWV3XCJcbiAgICAgICAgICBbdGV4dF09XCJlcnJvclN0YXRlVGV4dFwiPlxuICAgICAgICA8L2NvbWV0Y2hhdC1sYWJlbD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b21fX3ZpZXctLWVycm9yXCIgKm5nSWY9XCJzdGF0ZSA9PSBzdGF0ZXMuZXJyb3IgICYmICFoaWRlRXJyb3IgJiYgZXJyb3JTdGF0ZVZpZXdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXJyb3JTdGF0ZVZpZXdcIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZW1wdHlfX3ZpZXdcIiAqbmdJZj1cInN0YXRlID09IHN0YXRlcy5lbXB0eVwiPlxuICAgICAgICA8Y29tZXRjaGF0LWxhYmVsIFtsYWJlbFN0eWxlXT1cImVtcHR5U3R5bGUoKVwiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVtcHR5ICYmICFlbXB0eVN0YXRlVmlld1wiXG4gICAgICAgICAgW3RleHRdPVwiZW1wdHlTdGF0ZVRleHRcIj5cbiAgICAgICAgPC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3VzdG9tX192aWV3LS1lbXB0eVwiICpuZ0lmPVwic3RhdGUgPT0gc3RhdGVzLmVtcHR5ICYmIGVtcHR5U3RhdGVWaWV3XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVtcHR5U3RhdGVWaWV3XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsaXN0aXRlbV9fdmlld1wiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19zZWN0aW9uXCIgKm5nSWY9XCJzaG93U2VjdGlvbkhlYWRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWdldFNlY3Rpb25IZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA+IDA7IGVsc2UgZWxzZUJsb2NrXCIgY2xhc3M9XCJzZWN0aW9uX19zZXBhcmF0b3JcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBsaXN0W2kgLSAxXVtzZWN0aW9uSGVhZGVyRmllbGRdWzBdLnRvVXBwZXJDYXNlKCkgIT09XG4gICAgICAgICAgICAgICAgbGlzdFtpXVtzZWN0aW9uSGVhZGVyRmllbGRdWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzZWN0aW9uX19oZWFkZXJcIiBbbmdTdHlsZV09XCJzZWN0aW9uSGVhZGVyU3R5bGUoKVwiPlxuICAgICAgICAgICAgICB7eyBsaXN0W2ldW3NlY3Rpb25IZWFkZXJGaWVsZF1bMF0udG9VcHBlckNhc2UoKSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbl9faGVhZGVyXCIgW25nU3R5bGVdPVwic2VjdGlvbkhlYWRlclN0eWxlKClcIj5cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgbGlzdFtpXVtzZWN0aW9uSGVhZGVyRmllbGRdWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0U2VjdGlvbkhlYWRlclwiIFtuZ1N0eWxlXT1cInNlY3Rpb25IZWFkZXJTdHlsZSgpXCI+XG4gICAgICAgICAgPGNvbWV0Y2hhdC1kYXRlIFt0aW1lc3RhbXBdPVwiZ2V0U2VjdGlvbkhlYWRlcihpdGVtLGkpXCIgW3BhdHRlcm5dPVwiRGF0ZVNlcGFyYXRvclBhdHRlcm5cIlxuICAgICAgICAgICAgW2RhdGVTdHlsZV09XCJkYXRlU2VwYXJhdG9yU3R5bGVcIj5cbiAgICAgICAgICA8L2NvbWV0Y2hhdC1kYXRlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdEl0ZW1WaWV3O2NvbnRleHQ6eyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImxpc3RfX2JvdHRvbVwiICNib3R0b20+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19