mmhglobal-dynamicform 2.40.0 → 3.0.0-beta

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 (234) hide show
  1. package/README.md +0 -11
  2. package/fesm2022/mmhglobal-dynamicform.mjs +15336 -0
  3. package/fesm2022/mmhglobal-dynamicform.mjs.map +1 -0
  4. package/{mmhglobal-dynamicform.d.ts → index.d.ts} +5 -5
  5. package/lib/animations/component-animations.d.ts +3 -3
  6. package/lib/components/{buttonfieldbase.component.d.ts → base/buttonfieldbase.component.d.ts} +18 -26
  7. package/lib/components/{containerfieldbase.component.d.ts → base/containerfieldbase.component.d.ts} +20 -25
  8. package/lib/components/{datalistingfieldbase.component.d.ts → base/datalistingfieldbase.component.d.ts} +45 -51
  9. package/lib/components/{fieldbase.component.d.ts → base/fieldbase.component.d.ts} +49 -49
  10. package/lib/components/{inputfieldbase.component.d.ts → base/inputfieldbase.component.d.ts} +23 -27
  11. package/lib/{dropdown_buttons → components/button/dropdown_buttons}/dropdown_buttons.component.d.ts +15 -21
  12. package/lib/components/button/zbuttons/zbuttons.component.d.ts +19 -0
  13. package/lib/{zchip → components/button/zchip}/zchip.component.d.ts +22 -26
  14. package/lib/{zmfb → components/button/zmfb}/zmfb.component.d.ts +38 -43
  15. package/lib/components/button/zworkflowbuttons/zworkflowbuttons.component.d.ts +29 -0
  16. package/lib/{zchart → components/chart/zchart}/zchart.component.d.ts +73 -71
  17. package/lib/{zganttchart → components/chart/zganttchart}/zganttchart.component.d.ts +40 -40
  18. package/lib/{zgauge → components/chart/zgauge}/zgauge.component.d.ts +67 -63
  19. package/lib/{zprogressbar → components/chart/zprogressbar}/zprogressbar.component.d.ts +29 -30
  20. package/lib/{zreport → components/chart/zreport}/zreport.component.d.ts +47 -53
  21. package/lib/{zscheduler → components/chart/zscheduler}/zscheduler.component.d.ts +53 -52
  22. package/lib/{zscheduler → components/chart/zscheduler}/zscheduler.toolbar.component.d.ts +20 -20
  23. package/lib/{ztrendcard → components/chart/ztrendcard}/ztrendcard.component.d.ts +40 -36
  24. package/lib/components/container/kcard/kcard.component.d.ts +21 -0
  25. package/lib/{kscrollview → components/container/kscrollview}/kscrollview.component.d.ts +19 -20
  26. package/lib/{ksplitter → components/container/ksplitter}/ksplitter.component.d.ts +18 -19
  27. package/lib/{zcard → components/container/zcard}/zcard.component.d.ts +12 -17
  28. package/lib/components/container/zdiv/zdiv.component.d.ts +12 -0
  29. package/lib/{zdiv → components/container/zdiv}/zdiv.pipe.d.ts +7 -7
  30. package/lib/{zloop → components/container/zloop}/zloop.component.d.ts +21 -24
  31. package/lib/{ztab → components/container/ztab}/ztab.component.d.ts +34 -38
  32. package/lib/{ztab → components/container/ztab}/ztab.pipe.d.ts +7 -7
  33. package/lib/{zudf → components/container/zudf}/zudf.component.d.ts +208 -212
  34. package/lib/{virtual-scroll → components/data-listing/virtual-scroll}/virtual-scroll.component.d.ts +40 -45
  35. package/lib/{zgrid → components/data-listing/zgrid}/container/zgrid-container.component.d.ts +27 -31
  36. package/lib/{zgrid → components/data-listing/zgrid}/date-range-cell-filter.component.d.ts +20 -19
  37. package/lib/{zgrid → components/data-listing/zgrid}/zgrid.binding.directive.d.ts +174 -168
  38. package/lib/{zgrid → components/data-listing/zgrid}/zgrid.component.d.ts +187 -186
  39. package/lib/{zgrid → components/data-listing/zgrid}/zgrid.popup.anchor-target.directive.d.ts +8 -8
  40. package/lib/{zgrid → components/data-listing/zgrid}/zgrid.service.d.ts +27 -27
  41. package/lib/{ztree → components/data-listing/ztree}/ztree.component.d.ts +77 -78
  42. package/lib/{ztreelist → components/data-listing/ztreelist}/ztreelist.component.d.ts +100 -107
  43. package/lib/{sfdatetimepicker → components/input/sfdatetimepicker}/sfdatetimepicker.component.d.ts +26 -31
  44. package/lib/{sfquerybuilder → components/input/sfquerybuilder}/sfquerybuilder.component.d.ts +71 -73
  45. package/lib/{zcheckbox → components/input/zcheckbox}/zcheckbox.component.d.ts +18 -20
  46. package/lib/components/input/zcodeeditor/zcodeeditor.component.d.ts +43 -0
  47. package/lib/components/input/zcodeeditor/zcodeeditor.service.d.ts +32 -0
  48. package/lib/{zcolorpicker → components/input/zcolorpicker}/zcolorpicker.component.d.ts +19 -25
  49. package/lib/{zdatetime → components/input/zdatetime}/dateIonicFormatParser.pipe.d.ts +10 -10
  50. package/lib/{zdatetime → components/input/zdatetime}/dateIonicMinMaxDate.pipe.d.ts +7 -7
  51. package/lib/{zdatetime → components/input/zdatetime}/dateKendoFormatParser.pipe.d.ts +10 -10
  52. package/lib/{zdatetime → components/input/zdatetime}/dateParser.pipe.d.ts +11 -11
  53. package/lib/{zdatetime → components/input/zdatetime}/zdatetime.component.d.ts +32 -32
  54. package/lib/{zimg → components/input/zimg}/zimg.component.d.ts +16 -20
  55. package/lib/{zinput-container → components/input/zinput-container}/zinput-container.component.d.ts +31 -38
  56. package/lib/{zinput-container → components/input/zinput-container}/zinput-container.pipe.d.ts +25 -25
  57. package/lib/{zlabel → components/input/zlabel}/zlabel.component.d.ts +20 -26
  58. package/lib/{znumeric → components/input/znumeric}/znumeric.component.d.ts +29 -31
  59. package/lib/{znumeric → components/input/znumeric}/znumeric.component.pipe.d.ts +10 -10
  60. package/lib/{zpostselectinput → components/input/zpostselectinput}/zpostselectinput.component.d.ts +48 -65
  61. package/lib/{zselectmultiple → components/input/zselectmultiple}/zselectmultiple.component.d.ts +105 -123
  62. package/lib/{zselectmultiple → components/input/zselectmultiple}/zselectmultiple.directive.d.ts +12 -12
  63. package/lib/{zselectmultiple → components/input/zselectmultiple}/zselectmultiple.pipe.d.ts +11 -11
  64. package/lib/{ztext → components/input/ztext}/ztext.component.d.ts +33 -33
  65. package/lib/{ztextarea → components/input/ztextarea}/ztextarea.component.d.ts +21 -25
  66. package/lib/{ztexteditor → components/input/ztexteditor}/ztexteditor.component.d.ts +44 -42
  67. package/lib/{zupload → components/input/zupload}/zupload.component.d.ts +45 -50
  68. package/lib/{embed-components → components/menu}/context-menu/context-menu.component.d.ts +24 -28
  69. package/lib/{kmenu → components/menu/kmenu}/kmenu.component.d.ts +13 -14
  70. package/lib/components/others/zform/zform.component.d.ts +30 -0
  71. package/lib/components/others/zformcontrol/zformcontrol.component.d.ts +21 -0
  72. package/lib/components/others/zformcontrol/zformcontrol.service.d.ts +12 -0
  73. package/lib/components/others/zmodal/zmodal-component-helper.service.d.ts +15 -0
  74. package/lib/components/others/zmodal/zmodal.component.d.ts +24 -0
  75. package/lib/components/others/zmodal/zmodal.service.d.ts +25 -0
  76. package/lib/components/others/zunknown/zunknown.component.d.ts +10 -0
  77. package/lib/components/utility/e1-root/e1-root.component.d.ts +20 -0
  78. package/lib/components/utility/input-error-message/input-error-message.component.d.ts +14 -0
  79. package/lib/{embed-components → components/utility}/input-field-addons/input-field-addons.component.d.ts +18 -23
  80. package/lib/{embed-components → components/utility}/page-loader/page-loader.component.d.ts +8 -8
  81. package/lib/{embed-components → components/utility}/processing-record-loader/processing-record-loader.component.d.ts +8 -8
  82. package/lib/{embed-components → components/utility}/spinner/spinner.component.d.ts +12 -14
  83. package/lib/components/utility/uiappmenucontent/uiappmenucontent.component.d.ts +17 -0
  84. package/lib/{uibulletin → components/utility/uibulletin}/uibulletin.component.d.ts +31 -36
  85. package/lib/{uicontainer → components/utility/uicontainer}/uicontainer.component.d.ts +16 -19
  86. package/lib/components/utility/uicontent/uicontent.component.d.ts +21 -0
  87. package/lib/components/utility/uiheader/uiheader.component.d.ts +40 -0
  88. package/lib/{uipage → components/utility/uipage}/uipage.component.d.ts +18 -23
  89. package/lib/constants/constant.d.ts +3 -3
  90. package/lib/directives/elementcontainer.directive.d.ts +8 -8
  91. package/lib/interfaces/modal.interface.d.ts +4 -0
  92. package/lib/pipe/htmlSanitize.pipe.d.ts +10 -10
  93. package/lib/pipe/panel-area.pipe.d.ts +7 -7
  94. package/lib/services/main.service.d.ts +136 -142
  95. package/lib/services/zcomponent.debug.service.d.ts +289 -68
  96. package/lib/services/zcomponent.service.d.ts +31 -44
  97. package/package.json +6 -13
  98. package/public-api.d.ts +93 -100
  99. package/styles/all.scss +643 -0
  100. package/styles/component.scss +0 -0
  101. package/styles/notificationkit.scss +53 -0
  102. package/esm2020/lib/animations/component-animations.mjs +0 -39
  103. package/esm2020/lib/components/buttonfieldbase.component.mjs +0 -80
  104. package/esm2020/lib/components/containerfieldbase.component.mjs +0 -50
  105. package/esm2020/lib/components/datalistingfieldbase.component.mjs +0 -277
  106. package/esm2020/lib/components/fieldbase.component.mjs +0 -178
  107. package/esm2020/lib/components/inputfieldbase.component.mjs +0 -202
  108. package/esm2020/lib/constants/constant.mjs +0 -4
  109. package/esm2020/lib/directives/elementcontainer.directive.mjs +0 -16
  110. package/esm2020/lib/directives/fieldelement.directive.mjs +0 -16
  111. package/esm2020/lib/directives/scrollbar.theme.directive.mjs +0 -45
  112. package/esm2020/lib/dropdown_buttons/dropdown_buttons.component.mjs +0 -109
  113. package/esm2020/lib/embed-components/context-menu/context-menu.component.mjs +0 -113
  114. package/esm2020/lib/embed-components/input-field-addons/input-field-addons.component.mjs +0 -93
  115. package/esm2020/lib/embed-components/page-loader/page-loader.component.mjs +0 -14
  116. package/esm2020/lib/embed-components/processing-record-loader/processing-record-loader.component.mjs +0 -14
  117. package/esm2020/lib/embed-components/spinner/spinner.component.mjs +0 -27
  118. package/esm2020/lib/ficon/ficon.component.mjs +0 -53
  119. package/esm2020/lib/input-error-message/input-error-message.component.mjs +0 -53
  120. package/esm2020/lib/kcard/kcard.component.mjs +0 -90
  121. package/esm2020/lib/kmenu/kmenu.component.mjs +0 -46
  122. package/esm2020/lib/kscrollview/kscrollview.component.mjs +0 -77
  123. package/esm2020/lib/ksplitter/ksplitter.component.mjs +0 -67
  124. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +0 -657
  125. package/esm2020/lib/pipe/htmlSanitize.pipe.mjs +0 -18
  126. package/esm2020/lib/pipe/panel-area.pipe.mjs +0 -28
  127. package/esm2020/lib/services/main.service.mjs +0 -1307
  128. package/esm2020/lib/services/zcomponent.debug.service.mjs +0 -742
  129. package/esm2020/lib/services/zcomponent.service.mjs +0 -300
  130. package/esm2020/lib/sfdatetimepicker/sfdatetimepicker.component.mjs +0 -108
  131. package/esm2020/lib/sfquerybuilder/sfquerybuilder.component.mjs +0 -501
  132. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +0 -229
  133. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +0 -55
  134. package/esm2020/lib/uibulletin/uibulletin.component.mjs +0 -96
  135. package/esm2020/lib/uicontainer/uicontainer.component.mjs +0 -41
  136. package/esm2020/lib/uicontent/uicontent.component.mjs +0 -63
  137. package/esm2020/lib/uiheader/uiheader.component.mjs +0 -116
  138. package/esm2020/lib/uiheader/uiheader.service.mjs +0 -27
  139. package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +0 -36
  140. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +0 -38
  141. package/esm2020/lib/uipage/uipage.component.mjs +0 -160
  142. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +0 -40
  143. package/esm2020/lib/virtual-scroll/virtual-scroll.component.mjs +0 -249
  144. package/esm2020/lib/zbullet/zbullet.component.mjs +0 -77
  145. package/esm2020/lib/zbuttons/zbuttons.component.mjs +0 -151
  146. package/esm2020/lib/zcard/zcard.component.mjs +0 -36
  147. package/esm2020/lib/zchart/zchart.component.mjs +0 -222
  148. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +0 -42
  149. package/esm2020/lib/zchip/zchip.component.mjs +0 -119
  150. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +0 -169
  151. package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +0 -60
  152. package/esm2020/lib/zcolorpicker/zcolorpicker.component.mjs +0 -47
  153. package/esm2020/lib/zdaterange/zdaterange.component.mjs +0 -72
  154. package/esm2020/lib/zdatetime/dateIonicFormatParser.pipe.mjs +0 -40
  155. package/esm2020/lib/zdatetime/dateIonicMinMaxDate.pipe.mjs +0 -22
  156. package/esm2020/lib/zdatetime/dateKendoFormatParser.pipe.mjs +0 -41
  157. package/esm2020/lib/zdatetime/dateParser.pipe.mjs +0 -36
  158. package/esm2020/lib/zdatetime/zdatetime.component.mjs +0 -134
  159. package/esm2020/lib/zdiv/zdiv.component.mjs +0 -79
  160. package/esm2020/lib/zdiv/zdiv.pipe.mjs +0 -31
  161. package/esm2020/lib/zform/zform.component.mjs +0 -188
  162. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +0 -51
  163. package/esm2020/lib/zganttchart/zganttchart.component.mjs +0 -160
  164. package/esm2020/lib/zgauge/zgauge.component.mjs +0 -122
  165. package/esm2020/lib/zgrid/container/zgrid-container.component.mjs +0 -107
  166. package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +0 -146
  167. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +0 -881
  168. package/esm2020/lib/zgrid/zgrid.component.mjs +0 -1131
  169. package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +0 -17
  170. package/esm2020/lib/zgrid/zgrid.service.mjs +0 -113
  171. package/esm2020/lib/zimg/zimg.component.mjs +0 -61
  172. package/esm2020/lib/zinput-container/zinput-container.component.mjs +0 -91
  173. package/esm2020/lib/zinput-container/zinput-container.pipe.mjs +0 -132
  174. package/esm2020/lib/zlabel/zlabel.component.mjs +0 -52
  175. package/esm2020/lib/zloop/zloop.component.mjs +0 -123
  176. package/esm2020/lib/zmfb/zmfb.component.mjs +0 -217
  177. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +0 -124
  178. package/esm2020/lib/zmodal/zmodal.component.mjs +0 -129
  179. package/esm2020/lib/znumeric/znumeric.component.mjs +0 -110
  180. package/esm2020/lib/znumeric/znumeric.component.pipe.mjs +0 -19
  181. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +0 -315
  182. package/esm2020/lib/zprogressbar/zprogressbar.component.mjs +0 -61
  183. package/esm2020/lib/zradiobutton/zradiobutton.component.mjs +0 -106
  184. package/esm2020/lib/zreport/zreport.component.mjs +0 -184
  185. package/esm2020/lib/zscheduler/zscheduler.component.mjs +0 -271
  186. package/esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs +0 -150
  187. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +0 -689
  188. package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +0 -35
  189. package/esm2020/lib/zselectmultiple/zselectmultiple.pipe.mjs +0 -29
  190. package/esm2020/lib/ztab/ztab.component.mjs +0 -211
  191. package/esm2020/lib/ztab/ztab.pipe.mjs +0 -28
  192. package/esm2020/lib/ztext/ztext.component.mjs +0 -167
  193. package/esm2020/lib/ztextarea/ztextarea.component.mjs +0 -66
  194. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +0 -135
  195. package/esm2020/lib/ztree/ztree.component.mjs +0 -539
  196. package/esm2020/lib/ztreelist/ztreelist.component.mjs +0 -546
  197. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +0 -106
  198. package/esm2020/lib/zudf/zudf.component.mjs +0 -1016
  199. package/esm2020/lib/zunknown/zunknown.component.mjs +0 -20
  200. package/esm2020/lib/zupload/zupload.component.mjs +0 -403
  201. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +0 -244
  202. package/esm2020/mmhglobal-dynamicform.mjs +0 -5
  203. package/esm2020/public-api.mjs +0 -107
  204. package/fesm2015/mmhglobal-dynamicform.mjs +0 -16119
  205. package/fesm2015/mmhglobal-dynamicform.mjs.map +0 -1
  206. package/fesm2020/mmhglobal-dynamicform.mjs +0 -16079
  207. package/fesm2020/mmhglobal-dynamicform.mjs.map +0 -1
  208. package/lib/directives/fieldelement.directive.d.ts +0 -8
  209. package/lib/directives/scrollbar.theme.directive.d.ts +0 -10
  210. package/lib/ficon/ficon.component.d.ts +0 -34
  211. package/lib/input-error-message/input-error-message.component.d.ts +0 -19
  212. package/lib/kcard/kcard.component.d.ts +0 -25
  213. package/lib/mmhglobal-dynamicform.module.d.ts +0 -133
  214. package/lib/uiactionbutton/uiactionbutton.component.d.ts +0 -39
  215. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +0 -27
  216. package/lib/uicontent/uicontent.component.d.ts +0 -29
  217. package/lib/uiheader/uiheader.component.d.ts +0 -39
  218. package/lib/uiheader/uiheader.service.d.ts +0 -11
  219. package/lib/uimenubutton/uimenubutton.component.d.ts +0 -20
  220. package/lib/uimenucontent/uimenucontent.component.d.ts +0 -24
  221. package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +0 -21
  222. package/lib/zbullet/zbullet.component.d.ts +0 -27
  223. package/lib/zbuttons/zbuttons.component.d.ts +0 -25
  224. package/lib/zcodeeditor/zcodeeditor.component.d.ts +0 -43
  225. package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +0 -12
  226. package/lib/zdaterange/zdaterange.component.d.ts +0 -29
  227. package/lib/zdiv/zdiv.component.d.ts +0 -22
  228. package/lib/zform/zform.component.d.ts +0 -38
  229. package/lib/zformcontrol/zformcontrol.component.d.ts +0 -25
  230. package/lib/zmodal/zmodal-mobile.component.d.ts +0 -38
  231. package/lib/zmodal/zmodal.component.d.ts +0 -44
  232. package/lib/zradiobutton/zradiobutton.component.d.ts +0 -34
  233. package/lib/zunknown/zunknown.component.d.ts +0 -17
  234. package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +0 -32
@@ -1,689 +0,0 @@
1
- /********** Angular **********/
2
- import { Component, ViewChild } from "@angular/core";
3
- /********** Plugin **********/
4
- import { of, BehaviorSubject, from } from "rxjs";
5
- import { tap, map, switchMap, mergeMap, catchError } from "rxjs/operators";
6
- import { event } from "jquery";
7
- /********** Component & Service **********/
8
- import { InputFieldBase } from "../components/inputfieldbase.component";
9
- import { ZComponentHelper, ZSelectPostApiParams, InternalComponentType_DropDown, SignalType, DropdownSearchOperator } from "mmhglobal-zcore";
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../services/zcomponent.service";
12
- import * as i2 from "mmhglobal-zcore";
13
- import * as i3 from "ionic-selectable";
14
- import * as i4 from "@fortawesome/angular-fontawesome";
15
- import * as i5 from "@ionic/angular";
16
- import * as i6 from "@progress/kendo-angular-dropdowns";
17
- import * as i7 from "@angular/forms";
18
- import * as i8 from "@angular/common";
19
- import * as i9 from "./zselectmultiple.directive";
20
- import * as i10 from "@angular/flex-layout/extended";
21
- import * as i11 from "./zselectmultiple.pipe";
22
- export class ZselectmultipleComponent extends InputFieldBase {
23
- constructor(componentService, resourceApiService, cdr, webApiService, cacheService, fieldService) {
24
- super(componentService);
25
- this.componentService = componentService;
26
- this.resourceApiService = resourceApiService;
27
- this.cdr = cdr;
28
- this.webApiService = webApiService;
29
- this.cacheService = cacheService;
30
- this.fieldService = fieldService;
31
- this.allDataItems = [];
32
- this.isFirstOpened = false;
33
- this.items = [];
34
- this.infinitezData = [];
35
- this.hasSearched = false;
36
- this.toggleSelectable = true;
37
- this.itemValueField = null;
38
- this.itemTextField = null;
39
- this.itemDataField = null;
40
- this.itemTemplate = "{{item[itemTextField]}}";
41
- this.infiniteScrollPageNo = 0;
42
- this.isLoading = true;
43
- this.allowCustomValue = false;
44
- this.autoClose = true;
45
- this.dataInfo = {
46
- "itemsResourceURL": "",
47
- "optionFilters": "",
48
- "totalCount": 0
49
- };
50
- this.eventSubscriptions = new Array();
51
- this.componentSettings = {
52
- kendoMultiSelectTreeSummaryTag: 999999,
53
- popupSettings: null,
54
- expandOnFilter: {
55
- expandMatches: true,
56
- expandedOnClear: "initial",
57
- }
58
- };
59
- // private loadInfiniteDataSub: Subject<boolean> = new Subject<boolean>();
60
- this.filterSettings = {
61
- caseSensitive: false,
62
- operator: "contains",
63
- };
64
- // For lazyloading
65
- this.defaultTake = 50;
66
- this.itemHeight = 28;
67
- this.virtual = {
68
- itemHeight: this.itemHeight,
69
- pageSize: this.defaultTake,
70
- };
71
- this.state = {
72
- skip: 0,
73
- take: this.defaultTake,
74
- };
75
- this.stateChange = new BehaviorSubject({ state: this.state, eventType: null, searchTerm: '' });
76
- // Multi Selection Tree
77
- this.hasChildren = (dataitem) => !!dataitem['items'];
78
- }
79
- ngOnInit() {
80
- this.isLoading = true;
81
- this.setComponentToUse();
82
- this.subscribeUISignal();
83
- super.setupInnerField();
84
- super.setupComponentSettings(this.componentSettings);
85
- ZComponentHelper.setSelectMultipleTextValue(this.data.SelectOptions, this);
86
- // [Dropdownlist Multiple] - auto close menu when lose focus.
87
- if (this.data.AutoClose === false)
88
- this.autoClose = this.data.AutoClose;
89
- // Handle Clickable Icons
90
- this.iconList = this.data.ClickableIcons;
91
- if (this.iconList) {
92
- if (this.iconList.length > 0) {
93
- this.iconList.forEach((i) => {
94
- if (i.Tooltip === undefined) {
95
- i.Tooltip = "";
96
- }
97
- else {
98
- i.Tooltip = ZComponentHelper.getGroupEvalValue.call(this, i.Tooltip);
99
- }
100
- // Default position top. right | bottom | top | left
101
- if (i.Position === undefined) {
102
- i.Position = "top";
103
- }
104
- });
105
- }
106
- }
107
- this.allowCustomValue = this.data.AllowCustomValue || false; // Allow enter text in dropdownbox
108
- const fieldValue = this.data.Value;
109
- const data = this.data;
110
- const zModel = this.group.zModel;
111
- /*
112
- * 4 Styles of declare the component s option list data source.
113
- * Style #1 - Field.SelectOptions defined as an array of object that contain text and value.
114
- * Style #2 - Field.SelectOptions defined as a phase like item.Id as item.Name for item in group.zData.ProjectOptions .
115
- * Style #3 - Field.OptionResourceURL defined the name of resource server api.
116
- * Style #4 - Field.InfiniteScroll$ defined the method name as group.getMoreDataAsScroll .
117
- */
118
- if (data.HasInfiniteScroll && data.InfiniteScroll$) {
119
- if (!this.isMobileScreen()) {
120
- this.handleFilter(null);
121
- }
122
- }
123
- else {
124
- // Style #1, #2, #3
125
- const isRequired = ZComponentHelper.getGroupEvalValue.call(this, data.IsRequired);
126
- if (this.data.OptionResourceURL) {
127
- this.lazyLoadDataOptions().subscribe(res => {
128
- const optionData = res.dataSet ? res.dataSet : res;
129
- if (optionData && optionData.length === 1 && !this.data.DisableAutoFirstSelection) {
130
- this.autoSelectFirstOption(isRequired, optionData[0], fieldValue, zModel.Id);
131
- }
132
- if (this.group) {
133
- this.afterLoadzDataOptions();
134
- }
135
- this.isLoading = false;
136
- });
137
- }
138
- else {
139
- if (Array.isArray(this.data.SelectOptions) && this.data.SelectOptions) {
140
- //skip eval if selectoptions is exist
141
- }
142
- else {
143
- const optionData = ZComponentHelper.getGroupEvalValue.call(this, this.itemDataField);
144
- // append data via timeout after data is loaded.
145
- if (optionData && optionData.length === 1 && !this.data.DisableAutoFirstSelection) {
146
- const thisComponent = this;
147
- setTimeout(function () {
148
- thisComponent.autoSelectFirstOption(isRequired, optionData[0], fieldValue, thisComponent.group.zModel.Id);
149
- if (this.group) {
150
- this.afterLoadzDataOptions();
151
- }
152
- }, 100);
153
- }
154
- }
155
- this.isLoading = false;
156
- }
157
- }
158
- if (this.data.SearchOperator === DropdownSearchOperator.StartsWith) {
159
- this.filterSettings.operator = 'startsWith';
160
- }
161
- super.focusOnDefault(this.focus.bind(this));
162
- }
163
- ngAfterViewInit() {
164
- // Subscribe to stateChange and trigger data fetching here because
165
- // ngAfterViewInit ensures that all view components (e.g., dropdownlist, multiselect)
166
- // are fully initialized. This avoids issues where view elements might not be ready
167
- // during the constructor phase. The initial state emission and fetch are done here
168
- // to guarantee that the view is prepared before interacting with it.
169
- this.loadInfiniteData();
170
- this.componentService.decrementComponentCounterForField(this.data);
171
- }
172
- ngOnDestroy() {
173
- if (this.stateSubscription) {
174
- this.stateSubscription.unsubscribe();
175
- }
176
- for (const e of this.eventSubscriptions) {
177
- if (e && !e.closed) {
178
- e.unsubscribe();
179
- }
180
- }
181
- }
182
- reloadInfiniteData() {
183
- this.infinitezData = [];
184
- this.state = { skip: 0, take: this.defaultTake };
185
- this.stateChange.next(this.state);
186
- }
187
- loadInfiniteData() {
188
- const { Value: fieldValue } = this.data;
189
- const { zModel } = this.group;
190
- const recordValue = zModel?.[fieldValue]?.toString() ?? null;
191
- const recordValueList = recordValue ? recordValue.split(',').filter(Boolean) : [];
192
- const newItems$ = ZComponentHelper.getGroupEvalValue.call(this, this.data.InfiniteScroll$);
193
- if (!newItems$) {
194
- return;
195
- }
196
- this.stateSubscription = this.stateChange.pipe(switchMap(({ state, eventType, searchTerm }) => {
197
- // Update hasSearched based on searchTerm
198
- this.hasSearched = !ZComponentHelper.isNullUndefinedEmpty(searchTerm);
199
- if (!this.infinitezData || this.hasSearched || eventType === 'Closed') {
200
- this.infinitezData = [];
201
- }
202
- this.state = state ?? this.state;
203
- const pageNo = this.getPageNo(this.state.skip, this.state.take);
204
- if (pageNo < 1) {
205
- this.isLoading = true;
206
- }
207
- return newItems$(null, searchTerm, pageNo, this.group.ctrlScope, this.data).pipe(map(response => ({ response, eventType, searchTerm })));
208
- }), tap(({ response, eventType }) => {
209
- const dataSet = response.dataSet;
210
- const totalCount = response.totalCount ?? dataSet?.length;
211
- if (dataSet) {
212
- if (this.infinitezData.length === 0) {
213
- if (totalCount === 0) {
214
- this.infinitezData = [];
215
- }
216
- else if (totalCount <= this.state.take) {
217
- this.infinitezData = dataSet;
218
- }
219
- else {
220
- this.infinitezData = dataSet.concat(new Array(totalCount - this.state.take));
221
- }
222
- }
223
- else {
224
- this.infinitezData.splice(this.state.skip, this.state.take, ...dataSet);
225
- }
226
- }
227
- }), switchMap(({ eventType, searchTerm }) => {
228
- if (eventType !== null || !ZComponentHelper.isNullUndefinedEmpty(searchTerm) || recordValueList.length === 0) {
229
- return of(null);
230
- }
231
- return from(recordValueList).pipe(mergeMap(value => {
232
- const existingIndex = this.infinitezData.findIndex(item => item && item[this.itemValueField].toString() === value.toString());
233
- if (existingIndex !== -1) {
234
- return of(null);
235
- }
236
- return newItems$(null, '', 0, this.group.ctrlScope, this.data, value).pipe(tap(resp => {
237
- if (resp['dataSet']) {
238
- this.infinitezData = [...resp['dataSet'], ...this.infinitezData];
239
- }
240
- }));
241
- }));
242
- }), tap(() => {
243
- if (this.group) {
244
- this.afterLoadzDataOptions();
245
- }
246
- this.isLoading = false;
247
- this.cdr.detectChanges();
248
- }), catchError((error) => {
249
- console.warn('Error in loadInfiniteData:', error);
250
- this.isLoading = false;
251
- return of(null);
252
- })).subscribe();
253
- }
254
- getPageNo(stateSkip, stateTake) {
255
- return Math.round(stateSkip / stateTake);
256
- }
257
- // Auto select first option (if required & only 1 option)
258
- autoSelectFirstOption(required, data, zModelPropertyName, id) {
259
- if (ZComponentHelper.isNullUndefinedEmpty(id) && required) {
260
- var optionId = data.Id;
261
- if (this.data.Multiple) {
262
- optionId = [optionId];
263
- }
264
- ZComponentHelper.setModelValue(zModelPropertyName, optionId, this.group);
265
- this.group.subject.next({
266
- type: "onChange",
267
- target: this.data.OnChange,
268
- event,
269
- data: { ['value']: optionId, field: this.data }
270
- });
271
- this.form.markAsPristine();
272
- }
273
- }
274
- // Style #3
275
- lazyLoadDataOptions() {
276
- const resourceUrl = this.resourceApiService.getURL(this.data.OptionResourceURL);
277
- const filterParam = new ZSelectPostApiParams();
278
- filterParam.sorts = this.data.OptionSort;
279
- filterParam.columns = this.data.OptionColumns;
280
- filterParam.filters = this.data.OptionFilter;
281
- return ZComponentHelper.getDataOptions(this.data.OptionName, filterParam, this.group, resourceUrl, this.cacheService, this.webApiService, this.data['DisableCache']);
282
- }
283
- // Style #4, used in ionic-selectable
284
- getInfiniteData(event) {
285
- const searchTerm = event.text ?? '';
286
- ZComponentHelper.getInfiniteData(event.component, searchTerm, this).subscribe();
287
- }
288
- getItemsData() {
289
- // Local helper function for slicing option name based on start index
290
- const getOptionNameSuffix = (optionName, startIndex) => {
291
- return optionName.slice(startIndex);
292
- };
293
- if (this.data.HasInfiniteScroll) {
294
- return this.infinitezData;
295
- }
296
- const optionName = this.data.OptionName || this.itemDataField || 'group.zData.' + this.data.Name;
297
- if (Array.isArray(this.data.SelectOptions) && !this.group.zData[getOptionNameSuffix(optionName, 12)]) {
298
- this.group.zData[getOptionNameSuffix(optionName, 12)] = this.data.SelectOptions;
299
- this.itemDataField = optionName;
300
- }
301
- if (optionName.startsWith('zData.')) {
302
- return this.group.zData[getOptionNameSuffix(optionName, 6)] || [];
303
- }
304
- if (optionName.startsWith('group.zData.')) {
305
- return this.group.zData[getOptionNameSuffix(optionName, 12)] || [];
306
- }
307
- if (optionName.startsWith('group.')) {
308
- return this.group[getOptionNameSuffix(optionName, 6)] || [];
309
- }
310
- if (optionName) {
311
- return this.group[optionName] || [];
312
- }
313
- console.warn(this.data.Name, ' - Invalid setting for OptionName: ', optionName);
314
- this.cdr.detectChanges();
315
- }
316
- onSearch(event) {
317
- // console.log("At zselectmultiple.component (onSearch): ", event);
318
- // event.component is for mobile only
319
- const searchTerm = event.text;
320
- const component = event.component;
321
- // Start search and enable infinite scrolling on the component if available
322
- component?.startSearch(); //mobile
323
- component?.enableInfiniteScroll(); //mobile
324
- // // Reset paging and clear data if new search text is detected or infinite scrolling is enabled
325
- // // Reset scroll page, empty items
326
- // this.infiniteScrollPageNo = 0;
327
- // if (component) {
328
- // component.items = [];
329
- // }
330
- // // Prepare default parameters for item filtering
331
- // const params: zSelectMultipleParams = {
332
- // referId: null,
333
- // pageNo: 0,
334
- // pageSize: 20,
335
- // sortColumnName: "",
336
- // sortOrder: "",
337
- // sortColumnNames: [],
338
- // sortOrders: [],
339
- // filterParams: [],
340
- // parameters: ""
341
- // };
342
- // const searchBy = this.data.SearchFields ?? this.itemTextField;
343
- // const itemsData = this.getItemsData();
344
- // const filteredItems = ZComponentHelper.filterSearchItems(
345
- // itemsData,
346
- // searchTerm,
347
- // searchBy,
348
- // params.pageNo,
349
- // params.pageSize,
350
- // this.data.SearchOperator
351
- // );
352
- // this.checkAllowCustomValue(searchBy, searchTerm, filteredItems, itemsData);
353
- // // Update component items and handle search completion
354
- // if (component) {
355
- // component.items = [...component.items, ...filteredItems];
356
- // component.endInfiniteScroll();
357
- // component.endSearch();
358
- // this.isLoading = false;
359
- // }
360
- }
361
- checkAllowCustomValue(searchBy, searchTerm, filteredItems, itemsData) {
362
- // Allow custom value unless a direct match is found
363
- this.allowCustomValue = this.data.AllowCustomValue;
364
- let searchFields;
365
- if (searchBy) {
366
- searchFields = searchBy.replace(/\s/g, "").split(",");
367
- }
368
- else {
369
- searchFields = Object.keys(itemsData[0]);
370
- }
371
- // Iterate through filteritems to check if any item matches searchText in any of the searchFields
372
- for (const item of filteredItems) {
373
- // Check each searchField for searchText
374
- for (const field of searchFields) {
375
- if (item[field] && item[field] === searchTerm) {
376
- this.allowCustomValue = false;
377
- break; // Break the inner loop since we've found a match
378
- }
379
- }
380
- }
381
- }
382
- handleFilter(searchTerm) {
383
- if (this.multiselect && this.data.SearchLength) {
384
- const meetsLengthCondition = this.data.SearchLength && this.data.SearchLength <= searchTerm.length;
385
- this.multiselect.toggle(meetsLengthCondition);
386
- }
387
- const searchBy = this.data.SearchFields ?? this.itemTextField;
388
- const itemsData = this.getItemsData();
389
- if (this.data.AllowCustomValue) {
390
- this.checkAllowCustomValue(searchBy, searchTerm, itemsData);
391
- }
392
- if (this.data.HasInfiniteScroll && this.data.InfiniteScroll$ && searchTerm) {
393
- this.stateChange.next({ state: this.state, eventType: 'Filter', searchTerm: searchTerm });
394
- }
395
- }
396
- onMultiSelectOpen(event) {
397
- // Ensure multiselect value meets the search length requirement
398
- if (this.data.SearchLength && this.multiselect.value.length < this.data.SearchLength) {
399
- event.preventDefault();
400
- return; // Early return to avoid unnecessary checks
401
- }
402
- }
403
- onComboOpened() {
404
- this.handleOpened(this.comboboxComponent, 'Opened');
405
- }
406
- onMultiSelectOpened() {
407
- this.handleOpened(this.multiselect, 'Opened');
408
- }
409
- onDropDownListOpened() {
410
- this.handleOpened(this.dropdownlistComponent, 'Opened');
411
- }
412
- handleOpened(component, eventType) {
413
- if (this.data.HasInfiniteScroll && this.data.InfiniteScroll$ && component) {
414
- this.isFirstOpened = true;
415
- component.optionsList.pageChange.subscribe((state) => {
416
- this.stateChange.next({ state: state, eventType: eventType, searchTerm: '' });
417
- this.scrollToTop(component);
418
- });
419
- }
420
- }
421
- scrollToTop(component) {
422
- // optionsList is a reference to the internal kendo-list component used in the DropDownList popup
423
- // pass the current state to the stateChange BehaviorSubject on each pageChange event
424
- if (component.optionsList?.pageChange && this.isFirstOpened) {
425
- component.optionsList.scrollToIndex(0);
426
- this.isFirstOpened = false;
427
- }
428
- }
429
- handleClose(event) {
430
- if (this.data.HasInfiniteScroll && this.data.InfiniteScroll$ && this.hasSearched) {
431
- this.isFirstOpened = false;
432
- this.stateChange.next({ state: this.state, eventType: 'Closed', searchTerm: '' });
433
- }
434
- }
435
- getItemTemplate(item, data, group, itemValueField, itemTextField) {
436
- // ToDO: itemValueField and itemTextField
437
- if (this.data.ItemTemplate) {
438
- const getTemplateFunc = ZComponentHelper.getGroupEvalValue.call(this, this.data.ItemTemplate);
439
- return getTemplateFunc({
440
- item,
441
- data,
442
- group,
443
- itemValueField,
444
- itemTextField
445
- });
446
- }
447
- else if (itemTextField) {
448
- if (!item) {
449
- return null;
450
- }
451
- return item[itemTextField];
452
- }
453
- else {
454
- // return item[itemTextField];
455
- return Object.values(item).join(", ");
456
- }
457
- }
458
- resetInfiniteData() {
459
- this.infinitezData = [];
460
- this.state = { skip: 0, take: this.defaultTake };
461
- this.infiniteScrollPageNo = 0;
462
- }
463
- onAddItem(event) {
464
- const f = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnAddItem);
465
- if (typeof f === 'function') {
466
- const callFunc = f.bind(this.group.ctrlScope);
467
- return callFunc();
468
- }
469
- console.warn('Invalid declaration of OnAddItem: ', f);
470
- return;
471
- }
472
- // Component basic function
473
- clearData() {
474
- ZComponentHelper.setModelValue(this.data.Value, "", this.group);
475
- }
476
- clearItems() {
477
- if (this.selectComponent) {
478
- this.selectComponent.clear();
479
- this.selectComponent.close();
480
- }
481
- }
482
- confirmItems() {
483
- if (this.selectComponent) {
484
- this.selectComponent.confirm();
485
- this.selectComponent.close();
486
- }
487
- }
488
- toggleItems() {
489
- this.selectComponent.toggleItems(this.toggleSelectable);
490
- this.toggleSelectable = !this.toggleSelectable;
491
- // Confirm items and close Select page
492
- // without having the user to click Confirm button.
493
- // this.confirm();
494
- }
495
- // Disable Open On Focus
496
- disableOpenOnFocus(comboboxComponent) {
497
- if (this.data.DisableOpenOnFocus) {
498
- return null;
499
- }
500
- else {
501
- return comboboxComponent;
502
- }
503
- }
504
- // OnChange
505
- onChange_desktop(event) {
506
- super.onChange(null, event);
507
- this.handleInfiniteScrollOnChange(event);
508
- }
509
- onChange_mobile(event) {
510
- super.onChange(event);
511
- const fc = this.form.controls[this.data.Value];
512
- this.handleClose(null);
513
- if (super.getIsRequiredValue() && (event.value === null || event.value.length === 0)) {
514
- fc.setErrors({ required: true });
515
- }
516
- else {
517
- fc.setErrors(null);
518
- }
519
- this.handleInfiniteScrollOnChange(event.value);
520
- }
521
- handleInfiniteScrollOnChange(value) {
522
- if (this.data.HasInfiniteScroll && !!this.data.InfiniteScroll$) {
523
- const textField = this.itemTextField.toString();
524
- const valueField = this.itemValueField.toString();
525
- let zdataModel = [];
526
- if (value) {
527
- zdataModel = this.infinitezData.filter(x => x[valueField] === value);
528
- this.modelzData = zdataModel.slice();
529
- }
530
- else {
531
- this.reloadInfiniteData();
532
- }
533
- if (this.itemDataField.startsWith('group.zData.')) {
534
- this.group.zData[this.itemDataField.slice(12)] = zdataModel;
535
- }
536
- else if (this.itemDataField.startsWith('group.')) {
537
- this.group[this.itemDataField.slice(6)] = zdataModel;
538
- }
539
- }
540
- }
541
- handleMultiSelectTreeFilter(value) {
542
- this.parsedItemsData = this.onMultiSelectTreeSearch(this.getItemsData(), value);
543
- }
544
- onMultiSelectTreeSearch(items, searchedText) {
545
- return items.reduce((acc, item) => {
546
- if (this.contains(item[this.itemTextField], searchedText)) {
547
- acc.push(item);
548
- }
549
- else if (item['items'] && item['items'].length > 0) {
550
- const newItems = this.onMultiSelectTreeSearch(item['items'], searchedText);
551
- if (newItems.length > 0) {
552
- const _item = Object.assign({}, item);
553
- _item['items'] = newItems;
554
- acc.push(_item);
555
- }
556
- }
557
- return acc;
558
- }, []);
559
- }
560
- contains(text, searchedText) {
561
- return text.toLowerCase().includes((searchedText || "").toLowerCase());
562
- }
563
- setSelectOption(value) {
564
- const optionName = this.data.OptionName || this.itemDataField;
565
- this.data.SelectOptions = Object.assign([], value);
566
- this.group.zData[optionName.slice(12)] = this.data.SelectOptions;
567
- }
568
- focus() {
569
- if (this.comboboxComponent) {
570
- this.comboboxComponent.focus();
571
- return true;
572
- }
573
- if (this.multiselect) {
574
- this.multiselect.focus();
575
- return true;
576
- }
577
- if (this.multiselecttree) {
578
- this.multiselecttree.focus();
579
- return true;
580
- }
581
- if (this.dropdownlistComponent) {
582
- this.dropdownlistComponent.focus();
583
- return true;
584
- }
585
- return false;
586
- }
587
- setComponentToUse() {
588
- if (this.data.InternalComponentType && Object.values(InternalComponentType_DropDown).includes(this.data.InternalComponentType)) {
589
- this.componentType = this.data.InternalComponentType;
590
- }
591
- else if (!this.data.Multiple) {
592
- this.componentType = InternalComponentType_DropDown.combobox;
593
- }
594
- else if (this.data.Multiple && !this.data.EnableCheckbox) {
595
- this.componentType = InternalComponentType_DropDown.multiselect;
596
- }
597
- else if (this.data.Multiple && this.data.EnableCheckbox) {
598
- this.componentType = InternalComponentType_DropDown.multiselecttree;
599
- this.setupDataItems();
600
- this.setDefaultExpandable();
601
- }
602
- }
603
- getDataItems() {
604
- const modelValue = this.group.zModel[this.data.Value];
605
- return this.allDataItems.filter(x => modelValue.includes(x[this.itemValueField || 'Id']));
606
- }
607
- setupDataItems() {
608
- const modelValue = this.group.zModel[this.data.Value];
609
- if (modelValue && modelValue.length > 0) {
610
- this.populateDataWithoutHierarchy(this.getItemsData());
611
- }
612
- }
613
- populateDataWithoutHierarchy(dataItems) {
614
- for (const dataItem of dataItems) {
615
- this.allDataItems.push(dataItem);
616
- if (Array.isArray(dataItem.Value)) {
617
- this.populateDataWithoutHierarchy(dataItem.Value);
618
- }
619
- }
620
- }
621
- setDefaultExpandable() {
622
- if (this.data.TreeListInitiallyExpandedDataIds) {
623
- const idList = typeof this.data.TreeListInitiallyExpandedDataIds == 'string' ? ZComponentHelper.getGroupValue(this.data.TreeListInitiallyExpandedDataIds, this.group) : this.data.TreeListInitiallyExpandedDataIds;
624
- if (idList && Array.isArray(idList)) {
625
- this.expandedKeys = idList;
626
- }
627
- }
628
- }
629
- afterLoadzDataOptions() {
630
- if (this.group.afterLoadzDataOptions) {
631
- console.log("group.afterLoadzDataOptions triggered." + this.data);
632
- this.group.afterLoadzDataOptions(this.group, this.data);
633
- }
634
- }
635
- //#region Close drop-down selection upon page scroll
636
- subscribeUISignal() {
637
- this.eventSubscriptions.push(this.componentService.uiSignalService.subscribeToEvent(SignalType.PageScrollStart).subscribe({
638
- next: () => {
639
- this.closeDownDrop();
640
- }
641
- }));
642
- }
643
- closeDownDrop() {
644
- const comp = this.getComponentInUseByType();
645
- if (comp && comp.isOpen) {
646
- comp.toggle(false);
647
- comp.blur();
648
- }
649
- }
650
- getComponentInUseByType() {
651
- switch (this.componentType) {
652
- case InternalComponentType_DropDown.combobox:
653
- return this.comboboxComponent;
654
- case InternalComponentType_DropDown.multiselect:
655
- return this.multiselect;
656
- case InternalComponentType_DropDown.multiselecttree:
657
- return this.multiselecttree;
658
- case InternalComponentType_DropDown.dropdownlist:
659
- return this.dropdownlistComponent;
660
- default:
661
- return null;
662
- }
663
- }
664
- }
665
- ZselectmultipleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZselectmultipleComponent, deps: [{ token: i1.ZComponentService }, { token: i2.ResourceApiService }, { token: i0.ChangeDetectorRef }, { token: i2.WebApiService }, { token: i2.CacheService }, { token: i2.FieldService }], target: i0.ɵɵFactoryTarget.Component });
666
- ZselectmultipleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZselectmultipleComponent, selector: "app-zselectmultiple", viewQueries: [{ propertyName: "comboboxComponent", first: true, predicate: ["comboboxComponent"], descendants: true }, { propertyName: "dropdownlistComponent", first: true, predicate: ["dropdownlistComponent"], descendants: true }, { propertyName: "multiselect", first: true, predicate: ["multiselect"], descendants: true }, { propertyName: "multiselecttree", first: true, predicate: ["multiselecttree"], descendants: true }, { propertyName: "selectComponent", first: true, predicate: ["selectComponent"], descendants: true }, { propertyName: "itemElement", first: true, predicate: ["itemElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"form\" class=\"zselectmultiple-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <ionic-selectable *ngIf=\"isMobileScreen()\" #selectComponent item-content searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\" clearButtonText=\"Clear\" [(ngModel)]=\"group.zModel[data.Value]\" [id]=\"data.Value\"\r\n [items]=\"getItemsData()\" [itemValueField]=\"itemValueField\" [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\" [canClear]=\"true\" [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\" [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\" [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\" (onSearch)=\"onSearch($event)\"\r\n (onAddItem)=\"onAddItem($event)\" (onChange)=\"onChange_mobile($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate let-item=\"item\" let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\" class=\"isItemSelected e1tag-style2\" size=\"sm\" [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\" [style]=\"componentProperties.style.style2\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\" [style]=\"componentProperties.style.style3\" class=\"e1tag-style3\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n <span class=e1tag-style4 [style]=\"componentProperties.style.style4\">{{data.Label}}</span>\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </ionic-selectable>\r\n <kendo-combobox *ngIf=\"!isMobileScreen() && componentType == 'combobox'\"\r\n class=\"input-field e1tag-style1\"\r\n #comboboxComponent\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [suggest]=\"true\"\r\n [filterable]=\"data.Filterable == false ? false : true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (close)=\"handleClose($event)\"\r\n (opened)=\"onComboOpened()\"\r\n [style]=\"componentProperties.style.style1\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n <span #itemElement class=\"e1tag-style5\" [class.zselect-virtualization]=\"data.IsEnableVirtualization\" [style]=\"componentProperties.style.style5\">\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n </span>\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"!isMobileScreen() && componentType == 'multiselect'\"\r\n class=\"input-field e1tag-style1\"\r\n #multiselect\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"data.Filterable == false ? false : true\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"onMultiSelectOpen($event)\"\r\n (close)=\"handleClose($event)\"\r\n (opened)=\"onMultiSelectOpened()\"\r\n [style]=\"componentProperties.style.style1\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n <span #itemElement class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n </span>\r\n </ng-template>\r\n </kendo-multiselect>\r\n <kendo-multiselecttree *ngIf=\"!isMobileScreen() && componentType == 'multiselecttree'\"\r\n class=\"input-field e1tag-style1\"\r\n #multiselecttree\r\n kendoMultiSelectTreeExpandable\r\n [placeholder]=\"data.PlaceHolder\"\r\n [kendoMultiSelectTreeHierarchyBinding]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [kendoMultiSelectTreeSummaryTag]=\"componentSettings.kendoMultiSelectTreeSummaryTag\"\r\n childrenField=\"Value\"\r\n [hasChildren]=\"hasChildren\"\r\n [textField]=\"itemTextField\"\r\n [valueField]=\"itemValueField\"\r\n [valuePrimitive]=\"true\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n [dataItems]=\"getDataItems()\"\r\n [formControlName]=\"data.Value\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [expandOnFilter]=\"componentSettings.expandOnFilter\"\r\n [filterable]=\"data.Filterable == false ? false : true\"\r\n (filterChange)=\"handleMultiSelectTreeFilter($event)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n (close)=\"handleClose($event)\"\r\n [style]=\"componentProperties.style.style1\"\r\n [(expandedKeys)]=\"expandedKeys\"\r\n [popupSettings]=\"componentSettings.popupSettings\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoMultiSelectTreeNoDataTemplate>\r\n <h4>\r\n <span class=\"k-icon k-i-warning\"></span><br /><br />\r\n No record found.\r\n </h4>\r\n </ng-template>\r\n </kendo-multiselecttree>\r\n <kendo-dropdownlist *ngIf=\"!isMobileScreen() && componentType == 'dropdownlist'\"\r\n class=\"input-field e1tag-style1\"\r\n #dropdownlistComponent\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [suggest]=\"true\"\r\n [filterable]=\"data.Filterable == false ? false : true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (close)=\"handleClose($event)\"\r\n (opened)=\"onDropDownListOpened()\"\r\n [style]=\"componentProperties.style.style1\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoDropDownListItemTemplate let-dataItem>\r\n <span #itemElement class=\"e1tag-style5\" [class.zselect-virtualization]=\"data.IsEnableVirtualization\" [style]=\"componentProperties.style.style5\">\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n </span>\r\n </ng-template>\r\n </kendo-dropdownlist>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-combobox.k-multiselect,:host ::ng-deep kendo-dropdownlist.k-multiselect,:host ::ng-deep kendo-multiselect.k-multiselect{height:auto}:host ::ng-deep kendo-combobox kendo-taglist.k-chip-list .k-chip-label,:host ::ng-deep kendo-dropdownlist kendo-taglist.k-chip-list .k-chip-label,:host ::ng-deep kendo-multiselect kendo-taglist.k-chip-list .k-chip-label{white-space:normal;word-break:break-word}:host ::ng-deep kendo-combobox .k-searchbar,:host ::ng-deep kendo-dropdownlist .k-searchbar,:host ::ng-deep kendo-multiselect .k-searchbar{margin:auto}:host ::ng-deep kendo-combobox .k-searchbar+.k-icon,:host ::ng-deep kendo-dropdownlist .k-searchbar+.k-icon,:host ::ng-deep kendo-multiselect .k-searchbar+.k-icon{margin:auto}:host ::ng-deep kendo-combobox .kendo-combobox-item-template,:host ::ng-deep kendo-dropdownlist .kendo-combobox-item-template,:host ::ng-deep kendo-multiselect .kendo-combobox-item-template{height:var(--input-field-height)!important}:host ::ng-deep kendo-combobox.disabled>.k-dropdown-wrap,:host ::ng-deep kendo-dropdownlist.disabled>.k-dropdown-wrap,:host ::ng-deep kendo-multiselect.disabled>.k-dropdown-wrap{background:transparent}:host ::ng-deep kendo-combobox:focus-within,:host ::ng-deep kendo-dropdownlist:focus-within,:host ::ng-deep kendo-multiselect:focus-within{box-shadow:0 0 3px 1px var(--ion-color-primary)}:host ::ng-deep kendo-combobox.no-border,:host ::ng-deep kendo-dropdownlist.no-border,:host ::ng-deep kendo-multiselect.no-border{box-shadow:none!important;border:none!important}:host ::ng-deep kendo-combobox.no-border>.k-input-button,:host ::ng-deep kendo-dropdownlist.no-border>.k-input-button,:host ::ng-deep kendo-multiselect.no-border>.k-input-button{background:none;border:none}:host ::ng-deep kendo-combobox.no-background,:host ::ng-deep kendo-dropdownlist.no-background,:host ::ng-deep kendo-multiselect.no-background{background:none}:host ::ng-deep kendo-combobox.right-align>kendo-searchbar>input,:host ::ng-deep kendo-dropdownlist.right-align>kendo-searchbar>input,:host ::ng-deep kendo-multiselect.right-align>kendo-searchbar>input{text-align:right}:host ::ng-deep kendo-combobox.right-align>.k-input-inner,:host ::ng-deep kendo-dropdownlist.right-align>.k-input-inner,:host ::ng-deep kendo-multiselect.right-align>.k-input-inner{text-align:right}:host ::ng-deep kendo-dropdownlist{background:white}:host ::ng-deep kendo-dropdownlist>span.k-input-inner>.k-input-value-text{width:0px}fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.divselectmultiple{justify-content:space-between;width:99%;color:#000}.zselect-virtualization{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"], components: [{ type: i3.IonicSelectableComponent, selector: "ionic-selectable", inputs: ["items", "modalCssClass", "modalEnterAnimation", "modalLeaveAnimation", "isConfirmButtonEnabled", "itemValueField", "itemTextField", "groupValueField", "groupTextField", "canSearch", "hasInfiniteScroll", "hasVirtualScroll", "virtualScrollApproxItemHeight", "searchPlaceholder", "placeholder", "searchFailText", "clearButtonText", "addButtonText", "confirmButtonText", "closeButtonText", "shouldFocusSearchbar", "headerColor", "groupColor", "closeButtonSlot", "itemIconSlot", "searchDebounce", "disabledItems", "shouldStoreItemValue", "canSaveItem", "canDeleteItem", "virtualScrollHeaderFn", "isEnabled", "shouldBackdropClose", "hasConfirmButton", "isOnSearchEnabled", "canClear", "isMultiple", "canAddItem"], outputs: ["itemsChange", "onChange", "onSearch", "onSearchFail", "onSearchSuccess", "onInfiniteScroll", "onOpen", "onClose", "onSelect", "onClear", "onSaveItem", "onDeleteItem", "onAddItem"] }, { type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i6.ComboBoxComponent, selector: "kendo-combobox", inputs: ["focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "popupSettings", "listHeight", "iconClass", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoComboBox"] }, { type: i6.MultiSelectComponent, selector: "kendo-multiselect", inputs: ["focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "removeTag"], exportAs: ["kendoMultiSelect"] }, { type: i6.MultiSelectTreeComponent, selector: "kendo-multiselecttree", inputs: ["tabindex", "size", "rounded", "fillMode", "popupSettings", "checkableSettings", "data", "value", "dataItems", "textField", "valueField", "valueDepth", "loading", "placeholder", "listHeight", "disabled", "readonly", "valuePrimitive", "loadOnDemand", "focusableId", "clearButton", "filterable", "checkAll", "hasChildren", "fetchChildren", "isNodeExpanded", "isNodeVisible", "itemDisabled", "tagMapper"], outputs: ["focus", "blur", "open", "opened", "close", "closed", "nodeExpand", "nodeCollapse", "valueChange", "removeTag", "filterChange"], exportAs: ["kendoMultiSelectTree"] }, { type: i6.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.IonicSelectableItemIconTemplateDirective, selector: "[ionicSelectableItemIconTemplate]" }, { type: i3.IonicSelectableCloseButtonTemplateDirective, selector: "[ionicSelectableCloseButtonTemplate]" }, { type: i3.IonicSelectableTitleTemplateDirective, selector: "[ionicSelectableTitleTemplate]" }, { type: i3.IonicSelectableItemTemplateDirective, selector: "[ionicSelectableItemTemplate]" }, { type: i9.OpenOnFocusDirective, selector: "kendo-combobox[openOnFocus]", inputs: ["openOnFocus"] }, { type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.FilterDirective, selector: "[kendoDropDownFilter]", inputs: ["data", "kendoDropDownFilter", "filterable"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i6.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { type: i6.DropDownTreesExpandDirective, selector: "[kendoDropDownTreeExpandable], [kendoMultiSelectTreeExpandable]", inputs: ["isNodeExpanded"] }, { type: i6.MultiSelectTreeHierarchyBindingDirective, selector: "[kendoMultiSelectTreeHierarchyBinding]", inputs: ["kendoMultiSelectTreeHierarchyBinding"] }, { type: i6.MultiSelectTreeSummaryTagDirective, selector: "[kendoMultiSelectTreeSummaryTag]", inputs: ["kendoMultiSelectTreeSummaryTag"] }, { type: i6.NoDataTemplateDirective, selector: "[kendoDropDownListNoDataTemplate],[kendoDropDownTreeNoDataTemplate],[kendoComboBoxNoDataTemplate],[kendoMultiColumnComboBoxNoDataTemplate],[kendoAutoCompleteNoDataTemplate],[kendoMultiSelectNoDataTemplate],[kendoMultiSelectTreeNoDataTemplate]" }], pipes: { "async": i8.AsyncPipe, "zselectTranslationParser": i11.ZSelectTranslationParser } });
667
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZselectmultipleComponent, decorators: [{
668
- type: Component,
669
- args: [{ selector: "app-zselectmultiple", template: "<div [formGroup]=\"form\" class=\"zselectmultiple-container e1tag-style\" [style]=\"componentProperties.style.style\">\r\n <ionic-selectable *ngIf=\"isMobileScreen()\" #selectComponent item-content searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\" clearButtonText=\"Clear\" [(ngModel)]=\"group.zModel[data.Value]\" [id]=\"data.Value\"\r\n [items]=\"getItemsData()\" [itemValueField]=\"itemValueField\" [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\" [canClear]=\"true\" [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\" [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\" [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\" (onSearch)=\"onSearch($event)\"\r\n (onAddItem)=\"onAddItem($event)\" (onChange)=\"onChange_mobile($event)\" [style]=\"componentProperties.style.style1\" class=\"e1tag-style1\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate let-item=\"item\" let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\" class=\"isItemSelected e1tag-style2\" size=\"sm\" [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\" [style]=\"componentProperties.style.style2\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\" [style]=\"componentProperties.style.style3\" class=\"e1tag-style3\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n <span class=e1tag-style4 [style]=\"componentProperties.style.style4\">{{data.Label}}</span>\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n <span class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">{{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}</span>\r\n </ng-template>\r\n </ionic-selectable>\r\n <kendo-combobox *ngIf=\"!isMobileScreen() && componentType == 'combobox'\"\r\n class=\"input-field e1tag-style1\"\r\n #comboboxComponent\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [suggest]=\"true\"\r\n [filterable]=\"data.Filterable == false ? false : true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (close)=\"handleClose($event)\"\r\n (opened)=\"onComboOpened()\"\r\n [style]=\"componentProperties.style.style1\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n <span #itemElement class=\"e1tag-style5\" [class.zselect-virtualization]=\"data.IsEnableVirtualization\" [style]=\"componentProperties.style.style5\">\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n </span>\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"!isMobileScreen() && componentType == 'multiselect'\"\r\n class=\"input-field e1tag-style1\"\r\n #multiselect\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"data.Filterable == false ? false : true\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"onMultiSelectOpen($event)\"\r\n (close)=\"handleClose($event)\"\r\n (opened)=\"onMultiSelectOpened()\"\r\n [style]=\"componentProperties.style.style1\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n <span #itemElement class=\"e1tag-style5\" [style]=\"componentProperties.style.style5\">\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n </span>\r\n </ng-template>\r\n </kendo-multiselect>\r\n <kendo-multiselecttree *ngIf=\"!isMobileScreen() && componentType == 'multiselecttree'\"\r\n class=\"input-field e1tag-style1\"\r\n #multiselecttree\r\n kendoMultiSelectTreeExpandable\r\n [placeholder]=\"data.PlaceHolder\"\r\n [kendoMultiSelectTreeHierarchyBinding]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [kendoMultiSelectTreeSummaryTag]=\"componentSettings.kendoMultiSelectTreeSummaryTag\"\r\n childrenField=\"Value\"\r\n [hasChildren]=\"hasChildren\"\r\n [textField]=\"itemTextField\"\r\n [valueField]=\"itemValueField\"\r\n [valuePrimitive]=\"true\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n [dataItems]=\"getDataItems()\"\r\n [formControlName]=\"data.Value\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [expandOnFilter]=\"componentSettings.expandOnFilter\"\r\n [filterable]=\"data.Filterable == false ? false : true\"\r\n (filterChange)=\"handleMultiSelectTreeFilter($event)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n (close)=\"handleClose($event)\"\r\n [style]=\"componentProperties.style.style1\"\r\n [(expandedKeys)]=\"expandedKeys\"\r\n [popupSettings]=\"componentSettings.popupSettings\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoMultiSelectTreeNoDataTemplate>\r\n <h4>\r\n <span class=\"k-icon k-i-warning\"></span><br /><br />\r\n No record found.\r\n </h4>\r\n </ng-template>\r\n </kendo-multiselecttree>\r\n <kendo-dropdownlist *ngIf=\"!isMobileScreen() && componentType == 'dropdownlist'\"\r\n class=\"input-field e1tag-style1\"\r\n #dropdownlistComponent\r\n [data]=\"getItemsData() | zselectTranslationParser : itemTextField : data : group | async\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [kendoDropDownFilter]=\"filterSettings\"\r\n [suggest]=\"true\"\r\n [filterable]=\"data.Filterable == false ? false : true\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"data.Class\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onChange_desktop($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"data.IsEnableVirtualization == true ? virtual : null\"\r\n (close)=\"handleClose($event)\"\r\n (opened)=\"onDropDownListOpened()\"\r\n [style]=\"componentProperties.style.style1\"\r\n [clearButton]=\"data.ClearButton == false ? false : true\">\r\n <ng-template kendoDropDownListItemTemplate let-dataItem>\r\n <span #itemElement class=\"e1tag-style5\" [class.zselect-virtualization]=\"data.IsEnableVirtualization\" [style]=\"componentProperties.style.style5\">\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n </span>\r\n </ng-template>\r\n </kendo-dropdownlist>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-combobox.k-multiselect,:host ::ng-deep kendo-dropdownlist.k-multiselect,:host ::ng-deep kendo-multiselect.k-multiselect{height:auto}:host ::ng-deep kendo-combobox kendo-taglist.k-chip-list .k-chip-label,:host ::ng-deep kendo-dropdownlist kendo-taglist.k-chip-list .k-chip-label,:host ::ng-deep kendo-multiselect kendo-taglist.k-chip-list .k-chip-label{white-space:normal;word-break:break-word}:host ::ng-deep kendo-combobox .k-searchbar,:host ::ng-deep kendo-dropdownlist .k-searchbar,:host ::ng-deep kendo-multiselect .k-searchbar{margin:auto}:host ::ng-deep kendo-combobox .k-searchbar+.k-icon,:host ::ng-deep kendo-dropdownlist .k-searchbar+.k-icon,:host ::ng-deep kendo-multiselect .k-searchbar+.k-icon{margin:auto}:host ::ng-deep kendo-combobox .kendo-combobox-item-template,:host ::ng-deep kendo-dropdownlist .kendo-combobox-item-template,:host ::ng-deep kendo-multiselect .kendo-combobox-item-template{height:var(--input-field-height)!important}:host ::ng-deep kendo-combobox.disabled>.k-dropdown-wrap,:host ::ng-deep kendo-dropdownlist.disabled>.k-dropdown-wrap,:host ::ng-deep kendo-multiselect.disabled>.k-dropdown-wrap{background:transparent}:host ::ng-deep kendo-combobox:focus-within,:host ::ng-deep kendo-dropdownlist:focus-within,:host ::ng-deep kendo-multiselect:focus-within{box-shadow:0 0 3px 1px var(--ion-color-primary)}:host ::ng-deep kendo-combobox.no-border,:host ::ng-deep kendo-dropdownlist.no-border,:host ::ng-deep kendo-multiselect.no-border{box-shadow:none!important;border:none!important}:host ::ng-deep kendo-combobox.no-border>.k-input-button,:host ::ng-deep kendo-dropdownlist.no-border>.k-input-button,:host ::ng-deep kendo-multiselect.no-border>.k-input-button{background:none;border:none}:host ::ng-deep kendo-combobox.no-background,:host ::ng-deep kendo-dropdownlist.no-background,:host ::ng-deep kendo-multiselect.no-background{background:none}:host ::ng-deep kendo-combobox.right-align>kendo-searchbar>input,:host ::ng-deep kendo-dropdownlist.right-align>kendo-searchbar>input,:host ::ng-deep kendo-multiselect.right-align>kendo-searchbar>input{text-align:right}:host ::ng-deep kendo-combobox.right-align>.k-input-inner,:host ::ng-deep kendo-dropdownlist.right-align>.k-input-inner,:host ::ng-deep kendo-multiselect.right-align>.k-input-inner{text-align:right}:host ::ng-deep kendo-dropdownlist{background:white}:host ::ng-deep kendo-dropdownlist>span.k-input-inner>.k-input-value-text{width:0px}fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.divselectmultiple{justify-content:space-between;width:99%;color:#000}.zselect-virtualization{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"] }]
670
- }], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.ResourceApiService }, { type: i0.ChangeDetectorRef }, { type: i2.WebApiService }, { type: i2.CacheService }, { type: i2.FieldService }]; }, propDecorators: { comboboxComponent: [{
671
- type: ViewChild,
672
- args: ["comboboxComponent"]
673
- }], dropdownlistComponent: [{
674
- type: ViewChild,
675
- args: ["dropdownlistComponent"]
676
- }], multiselect: [{
677
- type: ViewChild,
678
- args: ["multiselect"]
679
- }], multiselecttree: [{
680
- type: ViewChild,
681
- args: ["multiselecttree"]
682
- }], selectComponent: [{
683
- type: ViewChild,
684
- args: ["selectComponent"]
685
- }], itemElement: [{
686
- type: ViewChild,
687
- args: ['itemElement', { static: false }]
688
- }] } });
689
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pzZWxlY3RtdWx0aXBsZS96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenNlbGVjdG11bHRpcGxlL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQTRDLE1BQU0sZUFBZSxDQUFDO0FBS3ZHLDhCQUE4QjtBQUM5QixPQUFPLEVBQTRCLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUUvQiwyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXhFLE9BQU8sRUFFTyxnQkFBZ0IsRUFDRyxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxVQUFVLEVBQUUsc0JBQXNCLEVBQ3hILE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFTekIsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGNBQWM7SUFrRTFELFlBQ1MsZ0JBQW1DLEVBQ2xDLGtCQUFzQyxFQUN0QyxHQUFzQixFQUN0QixhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQjtRQUVsQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQVBoQixxQkFBZ0IsR0FBaEIsZ0JBQWdC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O3VCQUFDLHVCQUF1QjtnQkFDUixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ00sZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ0UsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ2lCLFdBQVc7c0JBQXZELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJb25pY1NlbGVjdGFibGVDb21wb25lbnQgfSBmcm9tIFwiaW9uaWMtc2VsZWN0YWJsZVwiO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgb2YsIEJlaGF2aW9yU3ViamVjdCwgZnJvbSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHRhcCwgbWFwLCBzd2l0Y2hNYXAsIG1lcmdlTWFwLCBjYXRjaEVycm9yIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IENvbWJvQm94Q29tcG9uZW50LCBEcm9wRG93bkZpbHRlclNldHRpbmdzLCBEcm9wRG93bkxpc3RDb21wb25lbnQsIE11bHRpU2VsZWN0Q29tcG9uZW50LCBNdWx0aVNlbGVjdFRyZWVDb21wb25lbnQsIFZpcnR1YWxpemF0aW9uU2V0dGluZ3MgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZHJvcGRvd25zXCI7XHJcbmltcG9ydCB7IGV2ZW50IH0gZnJvbSBcImpxdWVyeVwiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJbnB1dEZpZWxkQmFzZSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2lucHV0ZmllbGRiYXNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy96Y29tcG9uZW50LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBSZXNvdXJjZUFwaVNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIENhY2hlU2VydmljZSwgRmllbGRTZXJ2aWNlLFxyXG4gIFpDb21wb25lbnQsIFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCwgQ2xpY2thYmxlSWNvbnMsXHJcbiAgWlNlbGVjdE11bHRpcGxlVGVtcGxhdGVQYXJhbXMsIFpTZWxlY3RQb3N0QXBpUGFyYW1zLCBJbnRlcm5hbENvbXBvbmVudFR5cGVfRHJvcERvd24sIFNpZ25hbFR5cGUsIERyb3Bkb3duU2VhcmNoT3BlcmF0b3JcclxufSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXpzZWxlY3RtdWx0aXBsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4venNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuc2Nzc1wiXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFpzZWxlY3RtdWx0aXBsZUNvbXBvbmVudCBleHRlbmRzIElucHV0RmllbGRCYXNlIGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoXCJjb21ib2JveENvbXBvbmVudFwiKSBjb21ib2JveENvbXBvbmVudDogQ29tYm9Cb3hDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImRyb3Bkb3dubGlzdENvbXBvbmVudFwiKSBkcm9wZG93bmxpc3RDb21wb25lbnQ6IERyb3BEb3duTGlzdENvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKFwibXVsdGlzZWxlY3RcIikgbXVsdGlzZWxlY3Q6IE11bHRpU2VsZWN0Q29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoXCJtdWx0aXNlbGVjdHRyZWVcIikgbXVsdGlzZWxlY3R0cmVlOiBNdWx0aVNlbGVjdFRyZWVDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcInNlbGVjdENvbXBvbmVudFwiKSBzZWxlY3RDb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCdpdGVtRWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBpdGVtRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgcHVibGljIGNvbXBvbmVudFR5cGU6IEludGVybmFsQ29tcG9uZW50VHlwZV9Ecm9wRG93bjtcclxuICBwcml2YXRlIGFsbERhdGFJdGVtcyA9IFtdO1xyXG4gIHByaXZhdGUgaXNGaXJzdE9wZW5lZCA9IGZhbHNlO1xyXG4gIGljb25MaXN0OiBDbGlja2FibGVJY29uc1tdO1xyXG4gIGl0ZW1zOiBBcnJheTxhbnk+ID0gW107XHJcbiAgbW9kZWx6RGF0YTogQXJyYXk8YW55PjtcclxuICBpbmZpbml0ZXpEYXRhOiBBcnJheTxhbnk+ID0gW107XHJcbiAgaGFzU2VhcmNoZWQgPSBmYWxzZTtcclxuICB0b2dnbGVTZWxlY3RhYmxlID0gdHJ1ZTtcclxuICBpdGVtVmFsdWVGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBpdGVtVGV4dEZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW1EYXRhRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbVRlbXBsYXRlID0gXCJ7e2l0ZW1baXRlbVRleHRGaWVsZF19fVwiO1xyXG4gIGluZmluaXRlU2Nyb2xsUGFnZU5vID0gMDtcclxuICBpc0xvYWRpbmcgPSB0cnVlO1xyXG4gIGFsbG93Q3VzdG9tVmFsdWUgPSBmYWxzZTtcclxuICBhdXRvQ2xvc2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBwYXJzZWRJdGVtc0RhdGE6IGFueVtdO1xyXG4gIGRhdGFJbmZvOiB7fSA9IHtcclxuICAgIFwiaXRlbXNSZXNvdXJjZVVSTFwiOiBcIlwiLFxyXG4gICAgXCJvcHRpb25GaWx0ZXJzXCI6IFwiXCIsXHJcbiAgICBcInRvdGFsQ291bnRcIjogMFxyXG4gIH07XHJcbiAgcHJpdmF0ZSBldmVudFN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXk8U3Vic2NyaXB0aW9uPigpO1xyXG4gIHB1YmxpYyBleHBhbmRlZEtleXM7XHJcbiAgcHVibGljIGNvbXBvbmVudFNldHRpbmdzID0ge1xyXG4gICAga2VuZG9NdWx0aVNlbGVjdFRyZWVTdW1tYXJ5VGFnOiA5OTk5OTksXHJcbiAgICBwb3B1cFNldHRpbmdzOiBudWxsLFxyXG4gICAgZXhwYW5kT25GaWx0ZXI6IHtcclxuICAgICAgZXhwYW5kTWF0Y2hlczogdHJ1ZSxcclxuICAgICAgZXhwYW5kZWRPbkNsZWFyOiBcImluaXRpYWxcIixcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyBwcml2YXRlIGxvYWRJbmZpbml0ZURhdGFTdWI6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHB1YmxpYyBmaWx0ZXJTZXR0aW5nczogRHJvcERvd25GaWx0ZXJTZXR0aW5ncyA9IHtcclxuICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxyXG4gICAgb3BlcmF0b3I6IFwiY29udGFpbnNcIixcclxuICB9O1xyXG5cclxuXHJcbiAgLy8gRm9yIGxhenlsb2FkaW5nXHJcbiAgcHJpdmF0ZSBkZWZhdWx0VGFrZTogbnVtYmVyID0gNTA7XHJcbiAgcHJpdmF0ZSBpdGVtSGVpZ2h0OiBudW1iZXIgPSAyODtcclxuXHJcbiAgcHVibGljIHZpcnR1YWw6IFZpcnR1YWxpemF0aW9uU2V0dGluZ3MgPSB7XHJcbiAgICBpdGVtSGVpZ2h0OiB0aGlzLml0ZW1IZWlnaHQsXHJcbiAgICBwYWdlU2l6ZTogdGhpcy5kZWZhdWx0VGFrZSxcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc3RhdGU6IHsgc2tpcDogbnVtYmVyOyB0YWtlOiBudW1iZXIgfSA9IHtcclxuICAgIHNraXA6IDAsXHJcbiAgICB0YWtlOiB0aGlzLmRlZmF1bHRUYWtlLFxyXG4gIH07XHJcbiAgcHJpdmF0ZSBzdGF0ZUNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7IHN0YXRlOiB0aGlzLnN0YXRlLCBldmVudFR5cGU6IG51bGwsIHNlYXJjaFRlcm06ICcnIH0pO1xyXG4gIHByaXZhdGUgc3RhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNldENvbXBvbmVudFRvVXNlKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZVVJU2lnbmFsKCk7XHJcbiAgICBzdXBlci5zZXR1cElubmVyRmllbGQoKTtcclxuICAgIHN1cGVyLnNldHVwQ29tcG9uZW50U2V0dGluZ3ModGhpcy5jb21wb25lbnRTZXR0aW5ncyk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldFNlbGVjdE11bHRpcGxlVGV4dFZhbHVlKHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zLCB0aGlzKTtcclxuXHJcbiAgICAvLyBbRHJvcGRvd25saXN0IE11bHRpcGxlXSAtIGF1dG8gY2xvc2UgbWVudSB3aGVuIGxvc2UgZm9jdXMuXHJcbiAgICBpZiAodGhpcy5kYXRhLkF1dG9DbG9zZSA9PT0gZmFsc2UpIHRoaXMuYXV0b0Nsb3NlID0gdGhpcy5kYXRhLkF1dG9DbG9zZTtcclxuXHJcbiAgICAvLyBIYW5kbGUgQ2xpY2thYmxlIEljb25zXHJcbiAgICB0aGlzLmljb25MaXN0ID0gdGhpcy5kYXRhLkNsaWNrYWJsZUljb25zO1xyXG4gICAgaWYgKHRoaXMuaWNvbkxpc3QpIHtcclxuICAgICAgaWYgKHRoaXMuaWNvbkxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuaWNvbkxpc3QuZm9yRWFjaCgoaTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaS5Ub29sdGlwID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaS5Ub29sdGlwID0gXCJcIjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGkuVG9vbHRpcCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBpLlRvb2x0aXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRGVmYXVsdCBwb3NpdGlvbiB0b3AuIHJpZ2h0IHwgYm90dG9tIHwgdG9wIHwgbGVmdFxyXG4gICAgICAgICAgaWYgKGkuUG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpLlBvc2l0aW9uID0gXCJ0b3BcIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5hbGxvd0N1c3RvbVZhbHVlID0gdGhpcy5kYXRhLkFsbG93Q3VzdG9tVmFsdWUgfHwgZmFsc2U7IC8vIEFsbG93IGVudGVyIHRleHQgaW4gZHJvcGRvd25ib3hcclxuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLmRhdGEuVmFsdWU7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xyXG4gICAgY29uc3Qgek1vZGVsID0gdGhpcy5ncm91cC56TW9kZWw7XHJcblxyXG4gICAgLypcclxuICAgICAqIDQgU3R5bGVzIG9mIGRlY2xhcmUgdGhlIGNvbXBvbmVudCBzIG9wdGlvbiBsaXN0IGRhdGEgc291cmNlLlxyXG4gICAgICogU3R5bGUgIzEgLSBGaWVsZC5TZWxlY3RPcHRpb25zIGRlZmluZWQgYXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHRoYXQgY29udGFpbiB0ZXh0IGFuZCB2YWx1ZS5cclxuICAgICAqIFN0eWxlICMyIC0gRmllbGQuU2VsZWN0T3B0aW9ucyBkZWZpbmVkIGFzIGEgcGhhc2UgbGlrZSAgaXRlbS5JZCBhcyBpdGVtLk5hbWUgZm9yIGl0ZW0gaW4gZ3JvdXAuekRhdGEuUHJvamVjdE9wdGlvbnMgLlxyXG4gICAgICogU3R5bGUgIzMgLSBGaWVsZC5PcHRpb25SZXNvdXJjZVVSTCBkZWZpbmVkIHRoZSBuYW1lIG9mIHJlc291cmNlIHNlcnZlciBhcGkuXHJcbiAgICAgKiBTdHlsZSAjNCAtIEZpZWxkLkluZmluaXRlU2Nyb2xsJCBkZWZpbmVkIHRoZSBtZXRob2QgbmFtZSBhcyAgZ3JvdXAuZ2V0TW9yZURhdGFBc1Njcm9sbCAuXHJcbiAgICAgKi9cclxuXHJcbiAgICBpZiAoZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCAmJiBkYXRhLkluZmluaXRlU2Nyb2xsJCkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNNb2JpbGVTY3JlZW4oKSkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gU3R5bGUgIzEsICMyLCAjM1xyXG4gICAgICBjb25zdCBpc1JlcXVpcmVkID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGRhdGEuSXNSZXF1aXJlZCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kYXRhLk9wdGlvblJlc291cmNlVVJMKSB7XHJcbiAgICAgICAgdGhpcy5sYXp5TG9hZERhdGFPcHRpb25zKCkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25EYXRhID0gcmVzLmRhdGFTZXQgPyByZXMuZGF0YVNldCA6IHJlcztcclxuXHJcbiAgICAgICAgICBpZiAob3B0aW9uRGF0YSAmJiBvcHRpb25EYXRhLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5kYXRhLkRpc2FibGVBdXRvRmlyc3RTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RPcHRpb24oaXNSZXF1aXJlZCwgb3B0aW9uRGF0YVswXSwgZmllbGRWYWx1ZSwgek1vZGVsLklkKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyTG9hZHpEYXRhT3B0aW9ucygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpICYmIHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSB7XHJcbiAgICAgICAgICAvL3NraXAgZXZhbCBpZiBzZWxlY3RvcHRpb25zIGlzIGV4aXN0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGF0YSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLml0ZW1EYXRhRmllbGQpO1xyXG4gICAgICAgICAgLy8gYXBwZW5kIGRhdGEgdmlhIHRpbWVvdXQgYWZ0ZXIgZGF0YSBpcyBsb2FkZWQuXHJcbiAgICAgICAgICBpZiAob3B0aW9uRGF0YSAmJiBvcHRpb25EYXRhLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5kYXRhLkRpc2FibGVBdXRvRmlyc3RTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgY29uc3QgdGhpc0NvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHRoaXNDb21wb25lbnQuYXV0b1NlbGVjdEZpcnN0T3B0aW9uKGlzUmVxdWlyZWQsIG9wdGlvbkRhdGFbMF0sIGZpZWxkVmFsdWUsIHRoaXNDb21wb25lbnQuZ3JvdXAuek1vZGVsLklkKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5TZWFyY2hPcGVyYXRvciA9PT0gRHJvcGRvd25TZWFyY2hPcGVyYXRvci5TdGFydHNXaXRoKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2V0dGluZ3Mub3BlcmF0b3IgPSAnc3RhcnRzV2l0aCc7XHJcbiAgICB9XHJcblxyXG4gICAgc3VwZXIuZm9jdXNPbkRlZmF1bHQodGhpcy5mb2N1cy5iaW5kKHRoaXMpKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIFN1YnNjcmliZSB0byBzdGF0ZUNoYW5nZSBhbmQgdHJpZ2dlciBkYXRhIGZldGNoaW5nIGhlcmUgYmVjYXVzZVxyXG4gICAgLy8gbmdBZnRlclZpZXdJbml0IGVuc3VyZXMgdGhhdCBhbGwgdmlldyBjb21wb25lbnRzIChlLmcuLCBkcm9wZG93bmxpc3QsIG11bHRpc2VsZWN0KVxyXG4gICAgLy8gYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBUaGlzIGF2b2lkcyBpc3N1ZXMgd2hlcmUgdmlldyBlbGVtZW50cyBtaWdodCBub3QgYmUgcmVhZHlcclxuICAgIC8vIGR1cmluZyB0aGUgY29uc3RydWN0b3IgcGhhc2UuIFRoZSBpbml0aWFsIHN0YXRlIGVtaXNzaW9uIGFuZCBmZXRjaCBhcmUgZG9uZSBoZXJlXHJcbiAgICAvLyB0byBndWFyYW50ZWUgdGhhdCB0aGUgdmlldyBpcyBwcmVwYXJlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdC5cclxuICAgIHRoaXMubG9hZEluZmluaXRlRGF0YSgpO1xyXG5cclxuICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWNyZW1lbnRDb21wb25lbnRDb3VudGVyRm9yRmllbGQodGhpcy5kYXRhKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdGVTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmV2ZW50U3Vic2NyaXB0aW9ucykge1xyXG4gICAgICBpZiAoZSAmJiAhZS5jbG9zZWQpIHtcclxuICAgICAgICBlLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWRJbmZpbml0ZURhdGEoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluZmluaXRlekRhdGEgPSBbXTtcclxuICAgIHRoaXMuc3RhdGUgPSB7IHNraXA6IDAsIHRha2U6IHRoaXMuZGVmYXVsdFRha2UgfTtcclxuXHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlLm5leHQodGhpcy5zdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRJbmZpbml0ZURhdGEoKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IFZhbHVlOiBmaWVsZFZhbHVlIH0gPSB0aGlzLmRhdGE7XHJcbiAgICBjb25zdCB7IHpNb2RlbCB9ID0gdGhpcy5ncm91cDtcclxuICAgIGNvbnN0IHJlY29yZFZhbHVlID0gek1vZGVsPy5bZmllbGRWYWx1ZV0/LnRvU3RyaW5nKCkgPz8gbnVsbDtcclxuICAgIGNvbnN0IHJlY29yZFZhbHVlTGlzdCA9IHJlY29yZFZhbHVlID8gcmVjb3JkVmFsdWUuc3BsaXQoJywnKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcclxuICAgIGNvbnN0IG5ld0l0ZW1zJCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuSW5maW5pdGVTY3JvbGwkKTtcclxuXHJcbiAgICBpZiAoIW5ld0l0ZW1zJCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGVDaGFuZ2UucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCh7IHN0YXRlLCBldmVudFR5cGUsIHNlYXJjaFRlcm0gfSkgPT4ge1xyXG4gICAgICAgIC8vIFVwZGF0ZSBoYXNTZWFyY2hlZCBiYXNlZCBvbiBzZWFyY2hUZXJtXHJcbiAgICAgICAgdGhpcy5oYXNTZWFyY2hlZCA9ICFaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KHNlYXJjaFRlcm0pO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaW5maW5pdGV6RGF0YSB8fCB0aGlzLmhhc1NlYXJjaGVkIHx8IGV2ZW50VHlwZSA9PT0gJ0Nsb3NlZCcpIHtcclxuICAgICAgICAgIHRoaXMuaW5maW5pdGV6RGF0YSA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlID8/IHRoaXMuc3RhdGU7XHJcbiAgICAgICAgY29uc3QgcGFnZU5vID0gdGhpcy5nZXRQYWdlTm8odGhpcy5zdGF0ZS5za2lwLCB0aGlzLnN0YXRlLnRha2UpO1xyXG4gICAgICAgIGlmKHBhZ2VObyA8IDEpIHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdJdGVtcyQobnVsbCwgc2VhcmNoVGVybSwgcGFnZU5vLCB0aGlzLmdyb3VwLmN0cmxTY29wZSwgdGhpcy5kYXRhKS5waXBlKFxyXG4gICAgICAgICAgbWFwKHJlc3BvbnNlID0+ICh7IHJlc3BvbnNlLCBldmVudFR5cGUsIHNlYXJjaFRlcm0gfSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoeyByZXNwb25zZSwgZXZlbnRUeXBlIH0pID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhU2V0ID0gKHJlc3BvbnNlIGFzIGFueSkuZGF0YVNldDtcclxuICAgICAgICBjb25zdCB0b3RhbENvdW50ID0gKHJlc3BvbnNlIGFzIGFueSkudG90YWxDb3VudCA/PyBkYXRhU2V0Py5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmIChkYXRhU2V0KSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pbmZpbml0ZXpEYXRhLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAodG90YWxDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5maW5pdGV6RGF0YSA9IFtdO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRvdGFsQ291bnQgPD0gdGhpcy5zdGF0ZS50YWtlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pbmZpbml0ZXpEYXRhID0gZGF0YVNldDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmluZmluaXRlekRhdGEgPSBkYXRhU2V0LmNvbmNhdChuZXcgQXJyYXkodG90YWxDb3VudCAtIHRoaXMuc3RhdGUudGFrZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmluZmluaXRlekRhdGEuc3BsaWNlKHRoaXMuc3RhdGUuc2tpcCwgdGhpcy5zdGF0ZS50YWtlLCAuLi5kYXRhU2V0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKHsgZXZlbnRUeXBlLCBzZWFyY2hUZXJtIH0pID0+IHtcclxuICAgICAgICBpZiAoZXZlbnRUeXBlICE9PSBudWxsIHx8ICFaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KHNlYXJjaFRlcm0pIHx8IHJlY29yZFZhbHVlTGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmcm9tKHJlY29yZFZhbHVlTGlzdCkucGlwZShcclxuICAgICAgICAgIG1lcmdlTWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IHRoaXMuaW5maW5pdGV6RGF0YS5maW5kSW5kZXgoaXRlbSA9PlxyXG4gICAgICAgICAgICAgIGl0ZW0gJiYgaXRlbVt0aGlzLml0ZW1WYWx1ZUZpZWxkXS50b1N0cmluZygpID09PSB2YWx1ZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXdJdGVtcyQobnVsbCwgJycsIDAsIHRoaXMuZ3JvdXAuY3RybFNjb3BlLCB0aGlzLmRhdGEsIHZhbHVlKS5waXBlKFxyXG4gICAgICAgICAgICAgIHRhcChyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwWydkYXRhU2V0J10pIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5pbmZpbml0ZXpEYXRhID0gWy4uLnJlc3BbJ2RhdGFTZXQnXSwgLi4udGhpcy5pbmZpbml0ZXpEYXRhXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgdGhpcy5hZnRlckxvYWR6RGF0YU9wdGlvbnMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGluIGxvYWRJbmZpbml0ZURhdGE6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFnZU5vKHN0YXRlU2tpcDogbnVtYmVyLCBzdGF0ZVRha2U6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChzdGF0ZVNraXAgLyBzdGF0ZVRha2UpO1xyXG4gIH1cclxuXHJcbiAgLy8gQXV0byBzZWxlY3QgZmlyc3Qgb3B0aW9uIChpZiByZXF1aXJlZCAmIG9ubHkgMSBvcHRpb24pXHJcbiAgcHJpdmF0ZSBhdXRvU2VsZWN0Rmlyc3RPcHRpb24ocmVxdWlyZWQ6IGJvb2xlYW4sIGRhdGE6IGFueSwgek1vZGVsUHJvcGVydHlOYW1lOiBzdHJpbmcsIGlkOiBhbnkpIHtcclxuICAgIGlmIChaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KGlkKSAmJiByZXF1aXJlZCkge1xyXG4gICAgICB2YXIgb3B0aW9uSWQgPSBkYXRhLklkO1xyXG4gICAgICBpZiAodGhpcy5kYXRhLk11bHRpcGxlKSB7XHJcbiAgICAgICAgb3B0aW9uSWQgPSBbb3B0aW9uSWRdO1xyXG4gICAgICB9XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh6TW9kZWxQcm9wZXJ0eU5hbWUsIG9wdGlvbklkLCB0aGlzLmdyb3VwKTtcclxuXHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcIm9uQ2hhbmdlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuT25DaGFuZ2UsXHJcbiAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgZGF0YTogeyBbJ3ZhbHVlJ106IG9wdGlvbklkLCBmaWVsZDogdGhpcy5kYXRhIH1cclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTdHlsZSAjM1xyXG4gIGxhenlMb2FkRGF0YU9wdGlvbnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlc291cmNlVXJsID0gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKFxyXG4gICAgICB0aGlzLmRhdGEuT3B0aW9uUmVzb3VyY2VVUkxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyUGFyYW0gPSBuZXcgWlNlbGVjdFBvc3RBcGlQYXJhbXMoKTtcclxuICAgIGZpbHRlclBhcmFtLnNvcnRzID0gdGhpcy5kYXRhLk9wdGlvblNvcnQ7XHJcbiAgICBmaWx0ZXJQYXJhbS5jb2x1bW5zID0gdGhpcy5kYXRhLk9wdGlvbkNvbHVtbnM7XHJcbiAgICBmaWx0ZXJQYXJhbS5maWx0ZXJzID0gdGhpcy5kYXRhLk9wdGlvbkZpbHRlcjtcclxuXHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXREYXRhT3B0aW9ucyhcclxuICAgICAgdGhpcy5kYXRhLk9wdGlvbk5hbWUsXHJcbiAgICAgIGZpbHRlclBhcmFtLFxyXG4gICAgICB0aGlzLmdyb3VwLFxyXG4gICAgICByZXNvdXJjZVVybCxcclxuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UsXHJcbiAgICAgIHRoaXMud2ViQXBpU2VydmljZSxcclxuICAgICAgdGhpcy5kYXRhWydEaXNhYmxlQ2FjaGUnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIFN0eWxlICM0LCB1c2VkIGluIGlvbmljLXNlbGVjdGFibGVcclxuICAgZ2V0SW5maW5pdGVEYXRhKGV2ZW50OiB7XHJcbiAgICAgY29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQ7XHJcbiAgICAgdGV4dDogc3RyaW5nO1xyXG4gICB9KSB7XHJcbiAgICAgY29uc3Qgc2VhcmNoVGVybSA9IGV2ZW50LnRleHQgPz8gJyc7XHJcbiAgICAgWkNvbXBvbmVudEhlbHBlci5nZXRJbmZpbml0ZURhdGEoZXZlbnQuY29tcG9uZW50LCBzZWFyY2hUZXJtLCB0aGlzKS5zdWJzY3JpYmUoKTtcclxuICAgfVxyXG5cclxuICBnZXRJdGVtc0RhdGEoKSB7XHJcbiAgICAvLyBMb2NhbCBoZWxwZXIgZnVuY3Rpb24gZm9yIHNsaWNpbmcgb3B0aW9uIG5hbWUgYmFzZWQgb24gc3RhcnQgaW5kZXhcclxuICAgIGNvbnN0IGdldE9wdGlvbk5hbWVTdWZmaXggPSAob3B0aW9uTmFtZTogc3RyaW5nLCBzdGFydEluZGV4OiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICByZXR1cm4gb3B0aW9uTmFtZS5zbGljZShzdGFydEluZGV4KTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbmZpbml0ZXpEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wdGlvbk5hbWUgPSB0aGlzLmRhdGEuT3B0aW9uTmFtZSB8fCB0aGlzLml0ZW1EYXRhRmllbGQgfHwgJ2dyb3VwLnpEYXRhLicgKyB0aGlzLmRhdGEuTmFtZTtcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykgJiYgIXRoaXMuZ3JvdXAuekRhdGFbZ2V0T3B0aW9uTmFtZVN1ZmZpeChvcHRpb25OYW1lLCAxMildKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuekRhdGFbZ2V0T3B0aW9uTmFtZVN1ZmZpeChvcHRpb25OYW1lLCAxMildID0gdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnM7XHJcbiAgICAgIHRoaXMuaXRlbURhdGFGaWVsZCA9IG9wdGlvbk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbk5hbWUuc3RhcnRzV2l0aCgnekRhdGEuJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAuekRhdGFbZ2V0T3B0aW9uTmFtZVN1ZmZpeChvcHRpb25OYW1lLCA2KV0gfHwgW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbk5hbWUuc3RhcnRzV2l0aCgnZ3JvdXAuekRhdGEuJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAuekRhdGFbZ2V0T3B0aW9uTmFtZVN1ZmZpeChvcHRpb25OYW1lLCAxMildIHx8IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwW2dldE9wdGlvbk5hbWVTdWZmaXgob3B0aW9uTmFtZSwgNildIHx8IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25OYW1lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwW29wdGlvbk5hbWVdIHx8IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2Fybih0aGlzLmRhdGEuTmFtZSwgJyAtIEludmFsaWQgc2V0dGluZyBmb3IgT3B0aW9uTmFtZTogJywgb3B0aW9uTmFtZSk7XHJcblxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goZXZlbnQ6IHsgY29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQ7IHRleHQ6IHN0cmluZyB9KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIkF0IHpzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQgKG9uU2VhcmNoKTogXCIsIGV2ZW50KTtcclxuICAgIC8vIGV2ZW50LmNvbXBvbmVudCBpcyBmb3IgbW9iaWxlIG9ubHlcclxuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBldmVudC50ZXh0O1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gZXZlbnQuY29tcG9uZW50O1xyXG5cclxuICAgIC8vIFN0YXJ0IHNlYXJjaCBhbmQgZW5hYmxlIGluZmluaXRlIHNjcm9sbGluZyBvbiB0aGUgY29tcG9uZW50IGlmIGF2YWlsYWJsZVxyXG4gICAgY29tcG9uZW50Py5zdGFydFNlYXJjaCgpOyAvL21vYmlsZVxyXG4gICAgY29tcG9uZW50Py5lbmFibGVJbmZpbml0ZVNjcm9sbCgpOyAvL21vYmlsZVxyXG5cclxuICAgIC8vIC8vIFJlc2V0IHBhZ2luZyBhbmQgY2xlYXIgZGF0YSBpZiBuZXcgc2VhcmNoIHRleHQgaXMgZGV0ZWN0ZWQgb3IgaW5maW5pdGUgc2Nyb2xsaW5nIGlzIGVuYWJsZWRcclxuICAgIC8vIC8vIFJlc2V0IHNjcm9sbCBwYWdlLCBlbXB0eSBpdGVtc1xyXG4gICAgLy8gdGhpcy5pbmZpbml0ZVNjcm9sbFBhZ2VObyA9IDA7XHJcbiAgICAvLyBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAvLyAgIGNvbXBvbmVudC5pdGVtcyA9IFtdO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIC8vIFByZXBhcmUgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciBpdGVtIGZpbHRlcmluZ1xyXG4gICAgLy8gY29uc3QgcGFyYW1zOiB6U2VsZWN0TXVsdGlwbGVQYXJhbXMgPSB7XHJcbiAgICAvLyAgIHJlZmVySWQ6IG51bGwsXHJcbiAgICAvLyAgIHBhZ2VObzogMCxcclxuICAgIC8vICAgcGFnZVNpemU6IDIwLFxyXG4gICAgLy8gICBzb3J0Q29sdW1uTmFtZTogXCJcIixcclxuICAgIC8vICAgc29ydE9yZGVyOiBcIlwiLFxyXG4gICAgLy8gICBzb3J0Q29sdW1uTmFtZXM6IFtdLFxyXG4gICAgLy8gICBzb3J0T3JkZXJzOiBbXSxcclxuICAgIC8vICAgZmlsdGVyUGFyYW1zOiBbXSxcclxuICAgIC8vICAgcGFyYW1ldGVyczogXCJcIlxyXG4gICAgLy8gfTtcclxuXHJcbiAgICAvLyBjb25zdCBzZWFyY2hCeSA9IHRoaXMuZGF0YS5TZWFyY2hGaWVsZHMgPz8gdGhpcy5pdGVtVGV4dEZpZWxkO1xyXG4gICAgLy8gY29uc3QgaXRlbXNEYXRhID0gdGhpcy5nZXRJdGVtc0RhdGEoKTtcclxuICAgIC8vIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBaQ29tcG9uZW50SGVscGVyLmZpbHRlclNlYXJjaEl0ZW1zKFxyXG4gICAgLy8gICBpdGVtc0RhdGEsXHJcbiAgICAvLyAgIHNlYXJjaFRlcm0sXHJcbiAgICAvLyAgIHNlYXJjaEJ5LFxyXG4gICAgLy8gICBwYXJhbXMucGFnZU5vLFxyXG4gICAgLy8gICBwYXJhbXMucGFnZVNpemUsXHJcbiAgICAvLyAgIHRoaXMuZGF0YS5TZWFyY2hPcGVyYXRvclxyXG4gICAgLy8gKTtcclxuXHJcbiAgICAvLyB0aGlzLmNoZWNrQWxsb3dDdXN0b21WYWx1ZShzZWFyY2hCeSwgc2VhcmNoVGVybSwgZmlsdGVyZWRJdGVtcywgaXRlbXNEYXRhKTtcclxuXHJcbiAgICAvLyAvLyBVcGRhdGUgY29tcG9uZW50IGl0ZW1zIGFuZCBoYW5kbGUgc2VhcmNoIGNvbXBsZXRpb25cclxuICAgIC8vIGlmIChjb21wb25lbnQpIHtcclxuICAgIC8vICAgY29tcG9uZW50Lml0ZW1zID0gWy4uLmNvbXBvbmVudC5pdGVtcywgLi4uZmlsdGVyZWRJdGVtc107XHJcbiAgICAvLyAgIGNvbXBvbmVudC5lbmRJbmZpbml0ZVNjcm9sbCgpO1xyXG4gICAgLy8gICBjb21wb25lbnQuZW5kU2VhcmNoKCk7XHJcbiAgICAvLyAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrQWxsb3dDdXN0b21WYWx1ZShzZWFyY2hCeTogc3RyaW5nLCBzZWFyY2hUZXJtOiBzdHJpbmcsIGZpbHRlcmVkSXRlbXM6IGFueVtdLCBpdGVtc0RhdGE/OiBhbnkpIHtcclxuICAgIC8vIEFsbG93IGN1c3RvbSB2YWx1ZSB1bmxlc3MgYSBkaXJlY3QgbWF0Y2ggaXMgZm91bmRcclxuICAgIHRoaXMuYWxsb3dDdXN0b21WYWx1ZSA9IHRoaXMuZGF0YS5BbGxvd0N1c3RvbVZhbHVlO1xyXG4gICAgbGV0IHNlYXJjaEZpZWxkczogc3RyaW5nW107XHJcbiAgICBpZiAoc2VhcmNoQnkpIHtcclxuICAgICAgc2VhcmNoRmllbGRzID0gc2VhcmNoQnkucmVwbGFjZSgvXFxzL2csIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlYXJjaEZpZWxkcyA9IE9iamVjdC5rZXlzKGl0ZW1zRGF0YVswXSk7XHJcbiAgICB9XHJcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZmlsdGVyaXRlbXMgdG8gY2hlY2sgaWYgYW55IGl0ZW0gbWF0Y2hlcyBzZWFyY2hUZXh0IGluIGFueSBvZiB0aGUgc2VhcmNoRmllbGRzIFxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgLy8gQ2hlY2sgZWFjaCBzZWFyY2hGaWVsZCBmb3Igc2VhcmNoVGV4dFxyXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlYXJjaEZpZWxkcykge1xyXG4gICAgICAgIGlmIChpdGVtW2ZpZWxkXSAmJiBpdGVtW2ZpZWxkXSA9PT0gc2VhcmNoVGVybSkge1xyXG4gICAgICAgICAgdGhpcy5hbGxvd0N1c3RvbVZhbHVlID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhazsgLy8gQnJlYWsgdGhlIGlubmVyIGxvb3Agc2luY2Ugd2UndmUgZm91bmQgYSBtYXRjaFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmlsdGVyKHNlYXJjaFRlcm06IGFueSkge1xyXG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3QgJiYgdGhpcy5kYXRhLlNlYXJjaExlbmd0aCkge1xyXG4gICAgICBjb25zdCBtZWV0c0xlbmd0aENvbmRpdGlvbiA9IHRoaXMuZGF0YS5TZWFyY2hMZW5ndGggJiYgdGhpcy5kYXRhLlNlYXJjaExlbmd0aCA8PSBzZWFyY2hUZXJtLmxlbmd0aDtcclxuICAgICAgdGhpcy5tdWx0aXNlbGVjdC50b2dnbGUobWVldHNMZW5ndGhDb25kaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlYXJjaEJ5ID0gdGhpcy5kYXRhLlNlYXJjaEZpZWxkcyA/PyB0aGlzLml0ZW1UZXh0RmllbGQ7XHJcbiAgICBjb25zdCBpdGVtc0RhdGEgPSB0aGlzLmdldEl0ZW1zRGF0YSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuQWxsb3dDdXN0b21WYWx1ZSkge1xyXG4gICAgICB0aGlzLmNoZWNrQWxsb3dDdXN0b21WYWx1ZShzZWFyY2hCeSwgc2VhcmNoVGVybSwgaXRlbXNEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsICYmIHRoaXMuZGF0YS5JbmZpbml0ZVNjcm9sbCQgJiYgc2VhcmNoVGVybSkge1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlLm5leHQoeyBzdGF0ZTogdGhpcy5zdGF0ZSwgZXZlbnRUeXBlOiAnRmlsdGVyJywgc2VhcmNoVGVybTogc2VhcmNoVGVybSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk11bHRpU2VsZWN0T3BlbihldmVudDogYW55KSB7XHJcbiAgICAvLyBFbnN1cmUgbXVsdGlzZWxlY3QgdmFsdWUgbWVldHMgdGhlIHNlYXJjaCBsZW5ndGggcmVxdWlyZW1lbnRcclxuICAgIGlmICh0aGlzLmRhdGEuU2VhcmNoTGVuZ3RoICYmIHRoaXMubXVsdGlzZWxlY3QudmFsdWUubGVuZ3RoIDwgdGhpcy5kYXRhLlNlYXJjaExlbmd0aCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47IC8vIEVhcmx5IHJldHVybiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjaGVja3NcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNvbWJvT3BlbmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVPcGVuZWQodGhpcy5jb21ib2JveENvbXBvbmVudCwgJ09wZW5lZCcpO1xyXG4gIH1cclxuICBcclxuICBwdWJsaWMgb25NdWx0aVNlbGVjdE9wZW5lZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlT3BlbmVkKHRoaXMubXVsdGlzZWxlY3QsICdPcGVuZWQnKTtcclxuICB9XHJcbiAgXHJcbiAgcHVibGljIG9uRHJvcERvd25MaXN0T3BlbmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVPcGVuZWQodGhpcy5kcm9wZG93bmxpc3RDb21wb25lbnQsICdPcGVuZWQnKTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBoYW5kbGVPcGVuZWQoY29tcG9uZW50OiBhbnksIGV2ZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsICYmIHRoaXMuZGF0YS5JbmZpbml0ZVNjcm9sbCQgJiYgY29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuaXNGaXJzdE9wZW5lZCA9IHRydWU7XHJcbiAgICAgIGNvbXBvbmVudC5vcHRpb25zTGlzdC5wYWdlQ2hhbmdlLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlLm5leHQoeyBzdGF0ZTogc3RhdGUsIGV2ZW50VHlwZTogZXZlbnRUeXBlLCBzZWFyY2hUZXJtOiAnJyB9KTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKGNvbXBvbmVudCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBwcml2YXRlIHNjcm9sbFRvVG9wKGNvbXBvbmVudDogYW55KTogdm9pZCB7XHJcbiAgICAvLyBvcHRpb25zTGlzdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwga2VuZG8tbGlzdCBjb21wb25lbnQgdXNlZCBpbiB0aGUgRHJvcERvd25MaXN0IHBvcHVwXHJcbiAgICAvLyBwYXNzIHRoZSBjdXJyZW50IHN0YXRlIHRvIHRoZSBzdGF0ZUNoYW5nZSBCZWhhdmlvclN1YmplY3Qgb24gZWFjaCBwYWdlQ2hhbmdlIGV2ZW50XHJcbiAgICBpZiAoY29tcG9uZW50Lm9wdGlvbnNMaXN0Py5wYWdlQ2hhbmdlICYmIHRoaXMuaXNGaXJzdE9wZW5lZCkge1xyXG4gICAgICBjb21wb25lbnQub3B0aW9uc0xpc3Quc2Nyb2xsVG9JbmRleCgwKTtcclxuICAgICAgdGhpcy5pc0ZpcnN0T3BlbmVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGhhbmRsZUNsb3NlKGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwgJiYgdGhpcy5kYXRhLkluZmluaXRlU2Nyb2xsJCAmJiB0aGlzLmhhc1NlYXJjaGVkKSB7XHJcbiAgICAgIHRoaXMuaXNGaXJzdE9wZW5lZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlLm5leHQoeyBzdGF0ZTogdGhpcy5zdGF0ZSwgZXZlbnRUeXBlOiAnQ2xvc2VkJywgc2VhcmNoVGVybTogJycgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SXRlbVRlbXBsYXRlKFxyXG4gICAgaXRlbTogYW55LFxyXG4gICAgZGF0YTogYW55LFxyXG4gICAgZ3JvdXA6IGFueSxcclxuICAgIGl0ZW1WYWx1ZUZpZWxkOiBzdHJpbmcsXHJcbiAgICBpdGVtVGV4dEZpZWxkOiBzdHJpbmdcclxuICApIHtcclxuICAgIC8vIFRvRE86IGl0ZW1WYWx1ZUZpZWxkIGFuZCBpdGVtVGV4dEZpZWxkXHJcbiAgICBpZiAodGhpcy5kYXRhLkl0ZW1UZW1wbGF0ZSkge1xyXG4gICAgICBjb25zdCBnZXRUZW1wbGF0ZUZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLkl0ZW1UZW1wbGF0ZSk7XHJcblxyXG4gICAgICByZXR1cm4gZ2V0VGVtcGxhdGVGdW5jKHtcclxuICAgICAgICBpdGVtLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgaXRlbVZhbHVlRmllbGQsXHJcbiAgICAgICAgaXRlbVRleHRGaWVsZFxyXG4gICAgICB9IGFzIFpTZWxlY3RNdWx0aXBsZVRlbXBsYXRlUGFyYW1zKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGl0ZW1UZXh0RmllbGQpIHtcclxuICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBpdGVtW2l0ZW1UZXh0RmllbGRdO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIHJldHVybiBpdGVtW2l0ZW1UZXh0RmllbGRdO1xyXG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhpdGVtKS5qb2luKFwiLCBcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldEluZmluaXRlRGF0YSgpIHtcclxuICAgIHRoaXMuaW5maW5pdGV6RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5zdGF0ZSA9IHsgc2tpcDogMCwgdGFrZTogdGhpcy5kZWZhdWx0VGFrZSB9O1xyXG4gICAgdGhpcy5pbmZpbml0ZVNjcm9sbFBhZ2VObyA9IDA7XHJcbiAgfVxyXG5cclxuICBvbkFkZEl0ZW0oZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuT25BZGRJdGVtKTtcclxuICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCBjYWxsRnVuYyA9IGYuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgIHJldHVybiBjYWxsRnVuYygpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGRlY2xhcmF0aW9uIG9mIE9uQWRkSXRlbTogJywgZik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLyBDb21wb25lbnQgYmFzaWMgZnVuY3Rpb25cclxuICBjbGVhckRhdGEoKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUodGhpcy5kYXRhLlZhbHVlLCBcIlwiLCB0aGlzLmdyb3VwKTtcclxuICB9XHJcblxyXG4gIGNsZWFySXRlbXMoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RDb21wb25lbnQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2xlYXIoKTtcclxuICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbmZpcm1JdGVtcygpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdENvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jb25maXJtKCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVJdGVtcygpIHtcclxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LnRvZ2dsZUl0ZW1zKHRoaXMudG9nZ2xlU2VsZWN0YWJsZSk7XHJcbiAgICB0aGlzLnRvZ2dsZVNlbGVjdGFibGUgPSAhdGhpcy50b2dnbGVTZWxlY3RhYmxlO1xyXG5cclxuICAgIC8vIENvbmZpcm0gaXRlbXMgYW5kIGNsb3NlIFNlbGVjdCBwYWdlXHJcbiAgICAvLyB3aXRob3V0IGhhdmluZyB0aGUgdXNlciB0byBjbGljayBDb25maXJtIGJ1dHRvbi5cclxuICAgIC8vIHRoaXMuY29uZmlybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gRGlzYWJsZSBPcGVuIE9uIEZvY3VzXHJcbiAgZGlzYWJsZU9wZW5PbkZvY3VzKGNvbWJvYm94Q29tcG9uZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuRGlzYWJsZU9wZW5PbkZvY3VzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBjb21ib2JveENvbXBvbmVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIE9uQ2hhbmdlXHJcbiAgcHVibGljIG9uQ2hhbmdlX2Rlc2t0b3AoZXZlbnQ6IGFueSkge1xyXG4gICAgc3VwZXIub25DaGFuZ2UobnVsbCwgZXZlbnQpXHJcbiAgICB0aGlzLmhhbmRsZUluZmluaXRlU2Nyb2xsT25DaGFuZ2UoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlX21vYmlsZShldmVudDogeyBjb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDsgdmFsdWU6IGFueSB9KSB7XHJcbiAgICBzdXBlci5vbkNoYW5nZShldmVudClcclxuICAgIGNvbnN0IGZjID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICB0aGlzLmhhbmRsZUNsb3NlKG51bGwpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgc3VwZXIuZ2V0SXNSZXF1aXJlZFZhbHVlKCkgJiYgKGV2ZW50LnZhbHVlID09PSBudWxsIHx8IGV2ZW50LnZhbHVlLmxlbmd0aCA9PT0gMClcclxuICAgICkge1xyXG4gICAgICBmYy5zZXRFcnJvcnMoeyByZXF1aXJlZDogdHJ1ZSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZjLnNldEVycm9ycyhudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhhbmRsZUluZmluaXRlU2Nyb2xsT25DaGFuZ2UoZXZlbnQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVJbmZpbml0ZVNjcm9sbE9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwgJiYgISF0aGlzLmRhdGEuSW5maW5pdGVTY3JvbGwkKSB7XHJcbiAgICAgIGNvbnN0IHRleHRGaWVsZCA9IHRoaXMuaXRlbVRleHRGaWVsZC50b1N0cmluZygpO1xyXG4gICAgICBjb25zdCB2YWx1ZUZpZWxkID0gdGhpcy5pdGVtVmFsdWVGaWVsZC50b1N0cmluZygpO1xyXG4gICAgICBsZXQgemRhdGFNb2RlbCA9IFtdO1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICB6ZGF0YU1vZGVsID0gdGhpcy5pbmZpbml0ZXpEYXRhLmZpbHRlcih4ID0+IHhbdmFsdWVGaWVsZF0gPT09IHZhbHVlKTtcclxuICAgICAgICB0aGlzLm1vZGVsekRhdGEgPSB6ZGF0YU1vZGVsLnNsaWNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuICAgICAgICB0aGlzLnJlbG9hZEluZmluaXRlRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5pdGVtRGF0YUZpZWxkLnN0YXJ0c1dpdGgoJ2dyb3VwLnpEYXRhLicpKSB7XHJcbiAgICAgICAgdGhpcy5ncm91cC56RGF0YVt0aGlzLml0ZW1EYXRhRmllbGQuc2xpY2UoMTIpXSA9IHpkYXRhTW9kZWw7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pdGVtRGF0YUZpZWxkLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgICAgdGhpcy5ncm91cFt0aGlzLml0ZW1EYXRhRmllbGQuc2xpY2UoNildID0gemRhdGFNb2RlbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gTXVsdGkgU2VsZWN0aW9uIFRyZWVcclxuICBwdWJsaWMgaGFzQ2hpbGRyZW4gPSAoZGF0YWl0ZW06IGFueSk6IGJvb2xlYW4gPT4gISFkYXRhaXRlbVsnaXRlbXMnXTtcclxuXHJcbiAgcHVibGljIGhhbmRsZU11bHRpU2VsZWN0VHJlZUZpbHRlcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcnNlZEl0ZW1zRGF0YSA9IHRoaXMub25NdWx0aVNlbGVjdFRyZWVTZWFyY2godGhpcy5nZXRJdGVtc0RhdGEoKSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTXVsdGlTZWxlY3RUcmVlU2VhcmNoKGl0ZW1zOiBhbnlbXSwgc2VhcmNoZWRUZXh0OiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gaXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcclxuICAgICAgaWYgKHRoaXMuY29udGFpbnMoaXRlbVt0aGlzLml0ZW1UZXh0RmllbGRdLCBzZWFyY2hlZFRleHQpKSB7XHJcbiAgICAgICAgYWNjLnB1c2goaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoaXRlbVsnaXRlbXMnXSAmJiBpdGVtWydpdGVtcyddLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IHRoaXMub25NdWx0aVNlbGVjdFRyZWVTZWFyY2goaXRlbVsnaXRlbXMnXSwgc2VhcmNoZWRUZXh0KTtcclxuXHJcbiAgICAgICAgaWYgKG5ld0l0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IF9pdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XHJcbiAgICAgICAgICBfaXRlbVsnaXRlbXMnXSA9IG5ld0l0ZW1zO1xyXG5cclxuICAgICAgICAgIGFjYy5wdXNoKF9pdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIFtdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb250YWlucyh0ZXh0OiBzdHJpbmcsIHNlYXJjaGVkVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKChzZWFyY2hlZFRleHQgfHwgXCJcIikudG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2VsZWN0T3B0aW9uKHZhbHVlOiBhbnkpIHtcclxuICAgIGNvbnN0IG9wdGlvbk5hbWUgPSB0aGlzLmRhdGEuT3B0aW9uTmFtZSB8fCB0aGlzLml0ZW1EYXRhRmllbGQ7XHJcbiAgICB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oW10sIHZhbHVlKTtcclxuICAgIHRoaXMuZ3JvdXAuekRhdGFbb3B0aW9uTmFtZS5zbGljZSgxMildID0gdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXMoKSB7XHJcbiAgICBpZiAodGhpcy5jb21ib2JveENvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLmNvbWJvYm94Q29tcG9uZW50LmZvY3VzKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcclxuICAgICAgdGhpcy5tdWx0aXNlbGVjdC5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm11bHRpc2VsZWN0dHJlZSkge1xyXG4gICAgICB0aGlzLm11bHRpc2VsZWN0dHJlZS5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRyb3Bkb3dubGlzdENvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLmRyb3Bkb3dubGlzdENvbXBvbmVudC5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q29tcG9uZW50VG9Vc2UoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkludGVybmFsQ29tcG9uZW50VHlwZSAmJiBPYmplY3QudmFsdWVzKEludGVybmFsQ29tcG9uZW50VHlwZV9Ecm9wRG93bikuaW5jbHVkZXModGhpcy5kYXRhLkludGVybmFsQ29tcG9uZW50VHlwZSBhcyBhbnkpKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IHRoaXMuZGF0YS5JbnRlcm5hbENvbXBvbmVudFR5cGUgYXMgYW55O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXRoaXMuZGF0YS5NdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBJbnRlcm5hbENvbXBvbmVudFR5cGVfRHJvcERvd24uY29tYm9ib3g7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmRhdGEuTXVsdGlwbGUgJiYgIXRoaXMuZGF0YS5FbmFibGVDaGVja2JveCkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBJbnRlcm5hbENvbXBvbmVudFR5cGVfRHJvcERvd24ubXVsdGlzZWxlY3Q7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmRhdGEuTXVsdGlwbGUgJiYgdGhpcy5kYXRhLkVuYWJsZUNoZWNrYm94KSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IEludGVybmFsQ29tcG9uZW50VHlwZV9Ecm9wRG93bi5tdWx0aXNlbGVjdHRyZWU7XHJcbiAgICAgIHRoaXMuc2V0dXBEYXRhSXRlbXMoKTtcclxuICAgICAgdGhpcy5zZXREZWZhdWx0RXhwYW5kYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGFJdGVtcygpOiBBcnJheTxhbnk+IHtcclxuICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLmdyb3VwLnpNb2RlbFt0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsRGF0YUl0ZW1zLmZpbHRlcih4ID0+IG1vZGVsVmFsdWUuaW5jbHVkZXMoeFt0aGlzLml0ZW1WYWx1ZUZpZWxkIHx8ICdJZCddKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRGF0YUl0ZW1zKCkge1xyXG4gICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMuZ3JvdXAuek1vZGVsW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICBpZiAobW9kZWxWYWx1ZSAmJiBtb2RlbFZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5wb3B1bGF0ZURhdGFXaXRob3V0SGllcmFyY2h5KHRoaXMuZ2V0SXRlbXNEYXRhKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwb3B1bGF0ZURhdGFXaXRob3V0SGllcmFyY2h5KGRhdGFJdGVtcykge1xyXG4gICAgZm9yIChjb25zdCBkYXRhSXRlbSBvZiBkYXRhSXRlbXMpIHtcclxuICAgICAgdGhpcy5hbGxEYXRhSXRlbXMucHVzaChkYXRhSXRlbSk7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFJdGVtLlZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVEYXRhV2l0aG91dEhpZXJhcmNoeShkYXRhSXRlbS5WYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREZWZhdWx0RXhwYW5kYWJsZSgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuVHJlZUxpc3RJbml0aWFsbHlFeHBhbmRlZERhdGFJZHMpIHtcclxuICAgICAgY29uc3QgaWRMaXN0ID0gdHlwZW9mIHRoaXMuZGF0YS5UcmVlTGlzdEluaXRpYWxseUV4cGFuZGVkRGF0YUlkcyA9PSAnc3RyaW5nJyA/IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuVHJlZUxpc3RJbml0aWFsbHlFeHBhbmRlZERhdGFJZHMgYXMgc3RyaW5nLCB0aGlzLmdyb3VwKSA6IHRoaXMuZGF0YS5UcmVlTGlzdEluaXRpYWxseUV4cGFuZGVkRGF0YUlkcztcclxuICAgICAgaWYgKGlkTGlzdCAmJiBBcnJheS5pc0FycmF5KGlkTGlzdCkpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZGVkS2V5cyA9IGlkTGlzdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckxvYWR6RGF0YU9wdGlvbnMoKSB7XHJcbiAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICBjb25zb2xlLmxvZyhcImdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyB0cmlnZ2VyZWQuXCIgKyB0aGlzLmRhdGEpO1xyXG4gICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCwgdGhpcy5kYXRhKTtcclxuICAgICB9XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gQ2xvc2UgZHJvcC1kb3duIHNlbGVjdGlvbiB1cG9uIHBhZ2Ugc2Nyb2xsXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVVSVNpZ25hbCgpIHtcclxuICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS51aVNpZ25hbFNlcnZpY2Uuc3Vic2NyaWJlVG9FdmVudChTaWduYWxUeXBlLlBhZ2VTY3JvbGxTdGFydCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlRG93bkRyb3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZURvd25Ecm9wKCkge1xyXG4gICAgY29uc3QgY29tcCA9IHRoaXMuZ2V0Q29tcG9uZW50SW5Vc2VCeVR5cGUoKTtcclxuICAgIGlmIChjb21wICYmIGNvbXAuaXNPcGVuKSB7XHJcbiAgICAgIGNvbXAudG9nZ2xlKGZhbHNlKTtcclxuICAgICAgY29tcC5ibHVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbXBvbmVudEluVXNlQnlUeXBlKCk6IENvbWJvQm94Q29tcG9uZW50IHwgRHJvcERvd25MaXN0Q29tcG9uZW50IHwgTXVsdGlTZWxlY3RDb21wb25lbnQgfCBNdWx0aVNlbGVjdFRyZWVDb21wb25lbnQge1xyXG4gICAgc3dpdGNoICh0aGlzLmNvbXBvbmVudFR5cGUpIHtcclxuICAgICAgY2FzZSBJbnRlcm5hbENvbXBvbmVudFR5cGVfRHJvcERvd24uY29tYm9ib3g6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tYm9ib3hDb21wb25lbnQ7XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxDb21wb25lbnRUeXBlX0Ryb3BEb3duLm11bHRpc2VsZWN0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpc2VsZWN0O1xyXG4gICAgICBjYXNlIEludGVybmFsQ29tcG9uZW50VHlwZV9Ecm9wRG93bi5tdWx0aXNlbGVjdHRyZWU6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlzZWxlY3R0cmVlO1xyXG4gICAgICBjYXNlIEludGVybmFsQ29tcG9uZW50VHlwZV9Ecm9wRG93bi5kcm9wZG93bmxpc3Q6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcGRvd25saXN0Q29tcG9uZW50O1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwienNlbGVjdG11bHRpcGxlLWNvbnRhaW5lciBlMXRhZy1zdHlsZVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlXCI+XHJcbiAgPGlvbmljLXNlbGVjdGFibGUgKm5nSWY9XCJpc01vYmlsZVNjcmVlbigpXCIgI3NlbGVjdENvbXBvbmVudCBpdGVtLWNvbnRlbnQgc2VhcmNoRmFpbFRleHQ9XCJOb3RoaW5nIGZvdW5kIDooXCJcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJDb2xvcj1cInByaW1hcnlcIiBjbGVhckJ1dHRvblRleHQ9XCJDbGVhclwiIFsobmdNb2RlbCldPVwiZ3JvdXAuek1vZGVsW2RhdGEuVmFsdWVdXCIgW2lkXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJnZXRJdGVtc0RhdGEoKVwiIFtpdGVtVmFsdWVGaWVsZF09XCJpdGVtVmFsdWVGaWVsZFwiIFtpdGVtVGV4dEZpZWxkXT1cIml0ZW1UZXh0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjYW5BZGRJdGVtXT1cIiEhZGF0YS5PbkFkZEl0ZW1cIiBbY2FuQ2xlYXJdPVwidHJ1ZVwiIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2FuU2VhcmNoXT1cIiFkYXRhWydkaXNhYmxlLXNlYXJjaCddXCIgW3Nob3VsZEZvY3VzU2VhcmNoYmFyXT1cIiFkYXRhWydkaXNhYmxlLXNlYXJjaCddXCJcclxuICAgICAgICAgICAgICAgICAgICBbaGFzSW5maW5pdGVTY3JvbGxdPVwiISFkYXRhLkhhc0luZmluaXRlU2Nyb2xsXCIgW2lzTXVsdGlwbGVdPVwiZGF0YS5NdWx0aXBsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzRW5hYmxlZF09XCIhKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvdWxkU3RvcmVJdGVtVmFsdWVdPVwidHJ1ZVwiIChvblNlYXJjaCk9XCJvblNlYXJjaCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25BZGRJdGVtKT1cIm9uQWRkSXRlbSgkZXZlbnQpXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlX21vYmlsZSgkZXZlbnQpXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTFcIj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgaW9uaWNTZWxlY3RhYmxlSXRlbUljb25UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaXNJdGVtU2VsZWN0ZWQ9XCJpc0l0ZW1TZWxlY3RlZFwiPlxyXG4gICAgICA8ZmEtaWNvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImlzSXRlbVNlbGVjdGVkIGUxdGFnLXN0eWxlMlwiIHNpemU9XCJzbVwiIFtpY29uXT1cIlsnZmFyJywgaXNJdGVtU2VsZWN0ZWQgPyAnY2hlY2stY2lyY2xlJzogJ2NpcmNsZSddXCJcclxuICAgICAgICAgICAgICAgW3N0eWxlc109XCJ7J2NvbG9yJzogaXNJdGVtU2VsZWN0ZWQgPyAnZG9kZ2VyQmx1ZScgOiAnbGlnaHRHcmF5J31cIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTJcIj48L2ZhLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVDbG9zZUJ1dHRvblRlbXBsYXRlPlxyXG4gICAgICA8IS0tIDxpb24taWNvbiBuYW1lPVwiY2xvc2UtY2lyY2xlXCI+PC9pb24taWNvbj4gLS0+XHJcbiAgICAgIDxmYS1pY29uIFtpY29uXT1cIid0aW1lcy1jaXJjbGUnXCIgc2l6ZT1cIm1kXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUzXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTNcIj48L2ZhLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVUaXRsZVRlbXBsYXRlPlxyXG4gICAgICA8c3BhbiBjbGFzcz1lMXRhZy1zdHlsZTQgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCI+e3tkYXRhLkxhYmVsfX08L3NwYW4+XHJcbiAgICAgIDxpb24tdGV4dCAqbmdJZj1cImdldElzUmVxdWlyZWRWYWx1ZSgpXCIgY29sb3I9XCJkYW5nZXJcIj4qPC9pb24tdGV4dD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZUl0ZW1UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJlMXRhZy1zdHlsZTVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTVcIj57eyBnZXRJdGVtVGVtcGxhdGUoaXRlbSwgZGF0YSwgZ3JvdXAsIGl0ZW1WYWx1ZUZpZWxkLCBpdGVtVGV4dEZpZWxkKSB9fTwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9pb25pYy1zZWxlY3RhYmxlPlxyXG4gIDxrZW5kby1jb21ib2JveCAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICYmIGNvbXBvbmVudFR5cGUgPT0gJ2NvbWJvYm94J1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWZpZWxkIGUxdGFnLXN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICAjY29tYm9ib3hDb21wb25lbnRcclxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgIFt0ZXh0RmllbGRdPVwiaXRlbVRleHRGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlUHJpbWl0aXZlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRhdGEuUGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tXT1cImFsbG93Q3VzdG9tVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2tlbmRvRHJvcERvd25GaWx0ZXJdPVwiZmlsdGVyU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgW3N1Z2dlc3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLkZpbHRlcmFibGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgW29wZW5PbkZvY3VzXT1cImRpc2FibGVPcGVuT25Gb2N1cyhjb21ib2JveENvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbdmlydHVhbF09XCJkYXRhLklzRW5hYmxlVmlydHVhbGl6YXRpb24gPT0gdHJ1ZSA/IHZpcnR1YWwgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgIChjbG9zZSk9XCJoYW5kbGVDbG9zZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChvcGVuZWQpPVwib25Db21ib09wZW5lZCgpXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbY2xlYXJCdXR0b25dPVwiZGF0YS5DbGVhckJ1dHRvbiA9PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIGtlbmRvQ29tYm9Cb3hJdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxyXG4gICAgICA8c3BhbiAjaXRlbUVsZW1lbnQgY2xhc3M9XCJlMXRhZy1zdHlsZTVcIiBbY2xhc3MuenNlbGVjdC12aXJ0dWFsaXphdGlvbl09XCJkYXRhLklzRW5hYmxlVmlydHVhbGl6YXRpb25cIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTVcIj5cclxuICAgICAgICB7eyBnZXRJdGVtVGVtcGxhdGUoZGF0YUl0ZW0sIGRhdGEsIGdyb3VwLCBpdGVtVmFsdWVGaWVsZCwgaXRlbVRleHRGaWVsZCkgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2tlbmRvLWNvbWJvYm94PlxyXG4gIDxrZW5kby1tdWx0aXNlbGVjdCAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICYmIGNvbXBvbmVudFR5cGUgPT0gJ211bHRpc2VsZWN0J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGQgZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgICAgI211bHRpc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdPVwiaXRlbVZhbHVlRmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdGV4dEZpZWxkXT1cIml0ZW1UZXh0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tXT1cImFsbG93Q3VzdG9tVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLkZpbHRlcmFibGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hlc109XCJkYXRhLkVuYWJsZUNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCJhdXRvQ2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICBba2VuZG9Ecm9wRG93bkZpbHRlcl09XCJmaWx0ZXJTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsXT1cImRhdGEuSXNFbmFibGVWaXJ0dWFsaXphdGlvbiA9PSB0cnVlID8gdmlydHVhbCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VfZGVza3RvcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChvcGVuKT1cIm9uTXVsdGlTZWxlY3RPcGVuKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiaGFuZGxlQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwib25NdWx0aVNlbGVjdE9wZW5lZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NsZWFyQnV0dG9uXT1cImRhdGEuQ2xlYXJCdXR0b24gPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBrZW5kb011bHRpU2VsZWN0SXRlbVRlbXBsYXRlIGxldC1kYXRhSXRlbT5cclxuICAgICAgPHNwYW4gI2l0ZW1FbGVtZW50IGNsYXNzPVwiZTF0YWctc3R5bGU1XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1XCI+XHJcbiAgICAgICAge3sgZ2V0SXRlbVRlbXBsYXRlKGRhdGFJdGVtLCBkYXRhLCBncm91cCwgaXRlbVZhbHVlRmllbGQsIGl0ZW1UZXh0RmllbGQpIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby1tdWx0aXNlbGVjdD5cclxuICA8a2VuZG8tbXVsdGlzZWxlY3R0cmVlICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgICYmIGNvbXBvbmVudFR5cGUgPT0gJ211bHRpc2VsZWN0dHJlZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZCBlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgI211bHRpc2VsZWN0dHJlZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAga2VuZG9NdWx0aVNlbGVjdFRyZWVFeHBhbmRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBba2VuZG9NdWx0aVNlbGVjdFRyZWVIaWVyYXJjaHlCaW5kaW5nXT1cImdldEl0ZW1zRGF0YSgpIHwgenNlbGVjdFRyYW5zbGF0aW9uUGFyc2VyIDogaXRlbVRleHRGaWVsZCA6IGRhdGEgOiBncm91cCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtrZW5kb011bHRpU2VsZWN0VHJlZVN1bW1hcnlUYWddPVwiY29tcG9uZW50U2V0dGluZ3Mua2VuZG9NdWx0aVNlbGVjdFRyZWVTdW1tYXJ5VGFnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuRmllbGQ9XCJWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzQ2hpbGRyZW5dPVwiaGFzQ2hpbGRyZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZV9kZXNrdG9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtc109XCJnZXREYXRhSXRlbXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiYXV0b0Nsb3NlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtleHBhbmRPbkZpbHRlcl09XCJjb21wb25lbnRTZXR0aW5ncy5leHBhbmRPbkZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLkZpbHRlcmFibGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVNdWx0aVNlbGVjdFRyZWVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiaGFuZGxlQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgWyhleHBhbmRlZEtleXMpXT1cImV4cGFuZGVkS2V5c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wdXBTZXR0aW5nc109XCJjb21wb25lbnRTZXR0aW5ncy5wb3B1cFNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGVhckJ1dHRvbl09XCJkYXRhLkNsZWFyQnV0dG9uID09IGZhbHNlID8gZmFsc2UgOiB0cnVlXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdFRyZWVOb0RhdGFUZW1wbGF0ZT5cclxuICAgICAgPGg0PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPjxiciAvPjxiciAvPlxyXG4gICAgICAgIE5vIHJlY29yZCBmb3VuZC5cclxuICAgICAgPC9oND5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby1tdWx0aXNlbGVjdHRyZWU+XHJcbiAgPGtlbmRvLWRyb3Bkb3dubGlzdCAgKm5nSWY9XCIhaXNNb2JpbGVTY3JlZW4oKSAgJiYgY29tcG9uZW50VHlwZSA9PSAnZHJvcGRvd25saXN0J1wiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGQgZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgI2Ryb3Bkb3dubGlzdENvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJnZXRJdGVtc0RhdGEoKSB8IHpzZWxlY3RUcmFuc2xhdGlvblBhcnNlciA6IGl0ZW1UZXh0RmllbGQgOiBkYXRhIDogZ3JvdXAgfCBhc3luY1wiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgW3RleHRGaWVsZF09XCJpdGVtVGV4dEZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlUHJpbWl0aXZlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgIFthbGxvd0N1c3RvbV09XCJhbGxvd0N1c3RvbVZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgW2tlbmRvRHJvcERvd25GaWx0ZXJdPVwiZmlsdGVyU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICBbc3VnZ2VzdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiZGF0YS5GaWx0ZXJhYmxlID09IGZhbHNlID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW29wZW5PbkZvY3VzXT1cImRpc2FibGVPcGVuT25Gb2N1cyhjb21ib2JveENvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VfZGVza3RvcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsXT1cImRhdGEuSXNFbmFibGVWaXJ0dWFsaXphdGlvbiA9PSB0cnVlID8gdmlydHVhbCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiaGFuZGxlQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwib25Ecm9wRG93bkxpc3RPcGVuZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjbGVhckJ1dHRvbl09XCJkYXRhLkNsZWFyQnV0dG9uID09IGZhbHNlID8gZmFsc2UgOiB0cnVlXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9Ecm9wRG93bkxpc3RJdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxyXG4gICAgICA8c3BhbiAjaXRlbUVsZW1lbnQgY2xhc3M9XCJlMXRhZy1zdHlsZTVcIiBbY2xhc3MuenNlbGVjdC12aXJ0dWFsaXphdGlvbl09XCJkYXRhLklzRW5hYmxlVmlydHVhbGl6YXRpb25cIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTVcIj5cclxuICAgICAgICB7eyBnZXRJdGVtVGVtcGxhdGUoZGF0YUl0ZW0sIGRhdGEsIGdyb3VwLCBpdGVtVmFsdWVGaWVsZCwgaXRlbVRleHRGaWVsZCkgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2tlbmRvLWRyb3Bkb3dubGlzdD5cclxuPC9kaXY+XHJcbiJdfQ==