@mediusinc/mng-commons 0.8.0-rc.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/assets/i18n/en.json +3 -1
  2. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  3. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  4. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  5. package/esm2020/lib/api/models/index.mjs +8 -8
  6. package/esm2020/lib/api/models/mappers.mjs +12 -12
  7. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  8. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  9. package/esm2020/lib/api/models/query-result.model.mjs +17 -17
  10. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  11. package/esm2020/lib/api/services/api.abstract.service.mjs +55 -55
  12. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +66 -66
  13. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +22 -22
  14. package/esm2020/lib/api/services/index.mjs +3 -3
  15. package/esm2020/lib/api/utils/index.mjs +2 -2
  16. package/esm2020/lib/api/utils/medius-rest.util.mjs +151 -151
  17. package/esm2020/lib/api/utils/object-serializer.util.mjs +243 -243
  18. package/esm2020/lib/components/action/action.component.mjs +176 -176
  19. package/esm2020/lib/components/action/editor/action-editor.component.mjs +247 -230
  20. package/esm2020/lib/components/action/index.mjs +3 -3
  21. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  22. package/esm2020/lib/components/action/models/action-execution.model.mjs +234 -234
  23. package/esm2020/lib/components/action/models/index.mjs +2 -2
  24. package/esm2020/lib/components/action/route/action-route.component.mjs +124 -124
  25. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +268 -268
  26. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +160 -160
  27. package/esm2020/lib/components/form/editor/form-editor.component.mjs +189 -189
  28. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +18 -18
  29. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +42 -42
  30. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +24 -24
  31. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +95 -95
  32. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +16 -16
  33. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +178 -178
  34. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +155 -155
  35. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +126 -126
  36. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  37. package/esm2020/lib/components/form/formly/fields/index.mjs +9 -9
  38. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +14 -14
  39. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +14 -14
  40. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  41. package/esm2020/lib/components/form/index.mjs +3 -3
  42. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  43. package/esm2020/lib/components/form/models/index.mjs +1 -1
  44. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  45. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  46. package/esm2020/lib/components/layout/index.mjs +6 -6
  47. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  48. package/esm2020/lib/components/layout/menu-item.component.mjs +216 -216
  49. package/esm2020/lib/components/layout/menu.component.mjs +19 -19
  50. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  51. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  52. package/esm2020/lib/components/layout/topbar.component.mjs +57 -57
  53. package/esm2020/lib/components/tableview/index.mjs +6 -6
  54. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  55. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  56. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +56 -56
  57. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +53 -53
  58. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +101 -101
  59. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +70 -70
  60. package/esm2020/lib/components/tableview/table/table.component.mjs +429 -429
  61. package/esm2020/lib/components/tableview/tableview.component.mjs +91 -91
  62. package/esm2020/lib/config/formly.config.mjs +180 -180
  63. package/esm2020/lib/config/index.mjs +1 -1
  64. package/esm2020/lib/config/models/index.mjs +1 -1
  65. package/esm2020/lib/config/models/mng-config.model.mjs +1 -1
  66. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  67. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  68. package/esm2020/lib/data-providers/index.mjs +5 -5
  69. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  70. package/esm2020/lib/data-providers/table.data-provider.mjs +16 -16
  71. package/esm2020/lib/data-providers/tableview.data-provider.mjs +16 -16
  72. package/esm2020/lib/descriptors/action.descriptor.mjs +622 -622
  73. package/esm2020/lib/descriptors/column.descriptor.mjs +271 -271
  74. package/esm2020/lib/descriptors/editor.descriptor.mjs +154 -154
  75. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  76. package/esm2020/lib/descriptors/field.descriptor.interface.mjs +1 -1
  77. package/esm2020/lib/descriptors/field.descriptor.mjs +863 -863
  78. package/esm2020/lib/descriptors/filter.descriptor.mjs +294 -294
  79. package/esm2020/lib/descriptors/index.mjs +11 -11
  80. package/esm2020/lib/descriptors/lookup.descriptor.mjs +1 -1
  81. package/esm2020/lib/descriptors/model.descriptor.mjs +33 -33
  82. package/esm2020/lib/descriptors/table.descriptor.mjs +213 -213
  83. package/esm2020/lib/descriptors/tableview.descriptor.mjs +134 -134
  84. package/esm2020/lib/directives/component.directive.mjs +43 -43
  85. package/esm2020/lib/directives/index.mjs +2 -2
  86. package/esm2020/lib/directives/template.directive.mjs +27 -27
  87. package/esm2020/lib/mng-commons.module.mjs +426 -426
  88. package/esm2020/lib/models/column-value.model.mjs +1 -1
  89. package/esm2020/lib/models/enum.model.mjs +1 -1
  90. package/esm2020/lib/models/error.model.mjs +1 -1
  91. package/esm2020/lib/models/index.mjs +6 -6
  92. package/esm2020/lib/models/menu.model.mjs +1 -1
  93. package/esm2020/lib/models/user.model.mjs +1 -1
  94. package/esm2020/lib/models/view-container.model.mjs +1 -1
  95. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  96. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  97. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  98. package/esm2020/lib/pipes/index.mjs +5 -5
  99. package/esm2020/lib/pipes/json-path.pipe.mjs +79 -79
  100. package/esm2020/lib/pipes/link-formatter.pipe.mjs +38 -38
  101. package/esm2020/lib/router/index.mjs +1 -1
  102. package/esm2020/lib/router/models/index.mjs +1 -1
  103. package/esm2020/lib/router/models/router.model.mjs +1 -1
  104. package/esm2020/lib/router/route-builder.mjs +431 -431
  105. package/esm2020/lib/services/action-executor.service.mjs +535 -535
  106. package/esm2020/lib/services/commons.service.mjs +343 -343
  107. package/esm2020/lib/services/configuration.service.mjs +110 -110
  108. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  109. package/esm2020/lib/services/index.mjs +6 -6
  110. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  111. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  112. package/esm2020/lib/services/internal/index.mjs +2 -2
  113. package/esm2020/lib/services/navigation.service.mjs +47 -47
  114. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  115. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  116. package/esm2020/lib/services/providers/index.mjs +2 -2
  117. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  118. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  119. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  120. package/esm2020/lib/services/tokens/index.mjs +4 -4
  121. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  122. package/esm2020/lib/services/view-container.component.service.mjs +34 -34
  123. package/esm2020/lib/types/index.mjs +2 -2
  124. package/esm2020/lib/types/type.decorator.mjs +12 -12
  125. package/esm2020/lib/types/type.model.mjs +1 -1
  126. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  127. package/esm2020/lib/utils/editor-formly.util.mjs +209 -209
  128. package/esm2020/lib/utils/enum.util.mjs +81 -81
  129. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  130. package/esm2020/lib/utils/index.mjs +7 -7
  131. package/esm2020/lib/utils/model.util.mjs +59 -59
  132. package/esm2020/lib/utils/notification.util.mjs +45 -45
  133. package/esm2020/lib/utils/route.util.mjs +23 -23
  134. package/esm2020/lib/utils/styles.util.mjs +40 -40
  135. package/esm2020/lib/utils/type.util.mjs +76 -76
  136. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  137. package/esm2020/public-api.mjs +39 -39
  138. package/fesm2015/mediusinc-mng-commons.mjs +9908 -9891
  139. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  140. package/fesm2020/mediusinc-mng-commons.mjs +9774 -9757
  141. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  142. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  143. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  144. package/lib/api/models/filter-param.model.d.ts +23 -23
  145. package/lib/api/models/index.d.ts +8 -8
  146. package/lib/api/models/mappers.d.ts +6 -6
  147. package/lib/api/models/query-mode.model.d.ts +16 -16
  148. package/lib/api/models/query-param.model.d.ts +31 -31
  149. package/lib/api/models/query-result.model.d.ts +23 -23
  150. package/lib/api/models/serialization.model.d.ts +8 -8
  151. package/lib/api/services/api.abstract.service.d.ts +24 -24
  152. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  153. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  154. package/lib/api/services/index.d.ts +3 -3
  155. package/lib/api/utils/index.d.ts +2 -2
  156. package/lib/api/utils/medius-rest.util.d.ts +14 -14
  157. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  158. package/lib/components/action/action.component.d.ts +68 -68
  159. package/lib/components/action/editor/action-editor.component.d.ts +64 -62
  160. package/lib/components/action/index.d.ts +3 -3
  161. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  162. package/lib/components/action/models/action-execution.model.d.ts +129 -129
  163. package/lib/components/action/models/index.d.ts +2 -2
  164. package/lib/components/action/route/action-route.component.d.ts +31 -31
  165. package/lib/components/form/autocomplete/autocomplete.component.d.ts +53 -53
  166. package/lib/components/form/dropdown/dropdown.component.d.ts +44 -44
  167. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  168. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +12 -12
  169. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +14 -14
  170. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +12 -12
  171. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +21 -21
  172. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +6 -6
  173. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +44 -44
  174. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +22 -22
  175. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  176. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  177. package/lib/components/form/formly/fields/index.d.ts +9 -9
  178. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  179. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +6 -6
  180. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  181. package/lib/components/form/index.d.ts +3 -3
  182. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  183. package/lib/components/form/models/index.d.ts +1 -1
  184. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  185. package/lib/components/layout/footer.component.d.ts +9 -9
  186. package/lib/components/layout/index.d.ts +6 -6
  187. package/lib/components/layout/main-layout.component.d.ts +20 -20
  188. package/lib/components/layout/menu-item.component.d.ts +37 -37
  189. package/lib/components/layout/menu.component.d.ts +10 -10
  190. package/lib/components/layout/services/index.d.ts +1 -1
  191. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  192. package/lib/components/layout/topbar.component.d.ts +24 -24
  193. package/lib/components/tableview/index.d.ts +6 -6
  194. package/lib/components/tableview/models/index.d.ts +1 -1
  195. package/lib/components/tableview/models/table.event.d.ts +17 -17
  196. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +20 -20
  197. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  198. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +31 -31
  199. package/lib/components/tableview/table/column-value/column-value.component.d.ts +28 -28
  200. package/lib/components/tableview/table/table.component.d.ts +104 -104
  201. package/lib/components/tableview/tableview.component.d.ts +41 -41
  202. package/lib/config/formly.config.d.ts +15 -15
  203. package/lib/config/index.d.ts +1 -1
  204. package/lib/config/models/index.d.ts +1 -1
  205. package/lib/config/models/mng-config.model.d.ts +34 -34
  206. package/lib/data-providers/base.data-provider.d.ts +14 -14
  207. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  208. package/lib/data-providers/index.d.ts +5 -5
  209. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  210. package/lib/data-providers/table.data-provider.d.ts +14 -14
  211. package/lib/data-providers/tableview.data-provider.d.ts +15 -15
  212. package/lib/descriptors/action.descriptor.d.ts +277 -277
  213. package/lib/descriptors/column.descriptor.d.ts +91 -91
  214. package/lib/descriptors/editor.descriptor.d.ts +44 -44
  215. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  216. package/lib/descriptors/field.descriptor.d.ts +342 -342
  217. package/lib/descriptors/field.descriptor.interface.d.ts +9 -9
  218. package/lib/descriptors/filter.descriptor.d.ts +127 -127
  219. package/lib/descriptors/index.d.ts +11 -11
  220. package/lib/descriptors/lookup.descriptor.d.ts +17 -17
  221. package/lib/descriptors/model.descriptor.d.ts +15 -15
  222. package/lib/descriptors/table.descriptor.d.ts +80 -80
  223. package/lib/descriptors/tableview.descriptor.d.ts +42 -42
  224. package/lib/directives/component.directive.d.ts +16 -16
  225. package/lib/directives/index.d.ts +2 -2
  226. package/lib/directives/template.directive.d.ts +13 -13
  227. package/lib/mng-commons.module.d.ts +86 -86
  228. package/lib/models/column-value.model.d.ts +4 -4
  229. package/lib/models/enum.model.d.ts +6 -6
  230. package/lib/models/error.model.d.ts +14 -14
  231. package/lib/models/index.d.ts +6 -6
  232. package/lib/models/menu.model.d.ts +25 -25
  233. package/lib/models/user.model.d.ts +8 -8
  234. package/lib/models/view-container.model.d.ts +6 -6
  235. package/lib/pipes/boolean.pipe.d.ts +7 -7
  236. package/lib/pipes/enum.pipe.d.ts +8 -8
  237. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  238. package/lib/pipes/index.d.ts +5 -5
  239. package/lib/pipes/json-path.pipe.d.ts +13 -13
  240. package/lib/pipes/link-formatter.pipe.d.ts +11 -11
  241. package/lib/router/index.d.ts +1 -1
  242. package/lib/router/models/index.d.ts +1 -1
  243. package/lib/router/models/router.model.d.ts +22 -22
  244. package/lib/router/route-builder.d.ts +86 -86
  245. package/lib/services/action-executor.service.d.ts +149 -149
  246. package/lib/services/commons.service.d.ts +72 -72
  247. package/lib/services/configuration.service.d.ts +36 -36
  248. package/lib/services/error-mapper.service.d.ts +7 -7
  249. package/lib/services/index.d.ts +6 -6
  250. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  251. package/lib/services/internal/commons-init.service.d.ts +16 -16
  252. package/lib/services/internal/index.d.ts +2 -2
  253. package/lib/services/navigation.service.d.ts +14 -14
  254. package/lib/services/providers/config-service.provider.d.ts +6 -6
  255. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  256. package/lib/services/providers/index.d.ts +2 -2
  257. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  258. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  259. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  260. package/lib/services/tokens/index.d.ts +4 -4
  261. package/lib/services/tokens/module-config.token.d.ts +3 -3
  262. package/lib/services/view-container.component.service.d.ts +22 -22
  263. package/lib/types/index.d.ts +2 -2
  264. package/lib/types/type.decorator.d.ts +4 -4
  265. package/lib/types/type.model.d.ts +20 -20
  266. package/lib/utils/action-data-provider.util.d.ts +20 -20
  267. package/lib/utils/editor-formly.util.d.ts +10 -10
  268. package/lib/utils/enum.util.d.ts +50 -50
  269. package/lib/utils/i18n.util.d.ts +56 -56
  270. package/lib/utils/index.d.ts +7 -7
  271. package/lib/utils/model.util.d.ts +8 -8
  272. package/lib/utils/notification.util.d.ts +11 -11
  273. package/lib/utils/route.util.d.ts +4 -4
  274. package/lib/utils/styles.util.d.ts +14 -14
  275. package/lib/utils/type.util.d.ts +36 -36
  276. package/mediusinc-mng-commons.d.ts +5 -5
  277. package/package.json +3 -3
  278. package/public-api.d.ts +28 -28
  279. package/mediusinc-mng-commons-0.8.0-rc.3.tgz +0 -0
@@ -1,623 +1,623 @@
1
- import { of } from 'rxjs';
2
- import { DataProvider, EditorDataProvider } from '../data-providers';
3
- import { ActionDataProviderUtil, TypeUtil } from '../utils';
4
- import { ModelDescriptor } from './';
5
- export class ActionDescriptor {
6
- constructor(model, actionName, parentType, parentProperty) {
7
- this._type = ActionTypeEnum.Direct;
8
- this._activationTrigger = ActionActivationTriggerEnum.OnClick;
9
- this._position = ActionPositionEnum.ToolbarRight;
10
- this._level = ActionLevelEnum.Default;
11
- this._routeUrl = null;
12
- this._className = '';
13
- this._size = ActionDescriptor.SizeEnum.Normal;
14
- this._isStyleText = false;
15
- this._isStyleOutlined = false;
16
- this._isStyleRaised = false;
17
- this._hasRunConfirmation = false;
18
- this._hasRunNotificationSuccess = true;
19
- this._hasRunNotificationError = true;
20
- this._model = model;
21
- this._actionName = actionName;
22
- if ((parentType && !parentProperty) || (!parentProperty && parentProperty)) {
23
- throw new Error(`Provide both the parent type and parent property or none: ${parentType}, ${parentProperty}.`);
24
- }
25
- this._parentType = parentType;
26
- this._parentTypeName = parentType ? TypeUtil.findTypeName(parentType) : undefined;
27
- this._parentProperty = parentProperty;
28
- if (this._parentTypeName || this._model) {
29
- this._i18nModelActionBaseKey = this._parentTypeName
30
- ? `${this._parentTypeName}.actions.${this._parentProperty}_${actionName}`
31
- : `${this._model.typeName}.actions.${actionName}`;
32
- }
33
- let displayName = actionName;
34
- if (this._model)
35
- displayName = `${this._model.typeName}.${displayName}`;
36
- if (this._parentTypeName) {
37
- displayName = `${this._parentTypeName}.${this._parentProperty}_${displayName}`;
38
- }
39
- this._actionNameLong = displayName;
40
- }
41
- get model() {
42
- return this._model;
43
- }
44
- get parentTypeName() {
45
- return this._parentTypeName;
46
- }
47
- get parentProperty() {
48
- return this._parentProperty;
49
- }
50
- get i18nModelActionBaseKey() {
51
- return this._i18nModelActionBaseKey;
52
- }
53
- get type() {
54
- return this._type;
55
- }
56
- get activationTrigger() {
57
- return this._activationTrigger;
58
- }
59
- get position() {
60
- return this._position;
61
- }
62
- get level() {
63
- return this._level;
64
- }
65
- get routeUrl() {
66
- return this._routeUrl;
67
- }
68
- get title() {
69
- return this._title;
70
- }
71
- get icon() {
72
- return this._icon;
73
- }
74
- get tooltip() {
75
- return this._tooltip;
76
- }
77
- get dataProvider() {
78
- return this._dataProvider;
79
- }
80
- get hasRunFunction() {
81
- return typeof this._runFunction === 'function';
82
- }
83
- get runFunction() {
84
- if (!this._runFunction) {
85
- throw new Error('Run function is not defined and cannot be invoked');
86
- }
87
- return this._runFunction;
88
- }
89
- get isVisibleFunction() {
90
- return this._isVisibleFunction;
91
- }
92
- get isEnabledFunction() {
93
- return this._isEnabledFunction;
94
- }
95
- get actionName() {
96
- return this._actionName;
97
- }
98
- get actionNameLong() {
99
- return this._actionNameLong;
100
- }
101
- get className() {
102
- return this._className;
103
- }
104
- get isStyleText() {
105
- return this._isStyleText;
106
- }
107
- get isStyleOutlined() {
108
- return this._isStyleOutlined;
109
- }
110
- get isStyleRaised() {
111
- return this._isStyleRaised;
112
- }
113
- get size() {
114
- return this._size;
115
- }
116
- get isSizeExtraSmall() {
117
- return this._size === ActionDescriptor.SizeEnum.ExtraSmall;
118
- }
119
- get isSizeSmall() {
120
- return this._size === ActionDescriptor.SizeEnum.Small;
121
- }
122
- get isSizeLarge() {
123
- return this._size === ActionDescriptor.SizeEnum.Large;
124
- }
125
- get isSizeExtraLarge() {
126
- return this._size === ActionDescriptor.SizeEnum.ExtraLarge;
127
- }
128
- get hasRunConfirmation() {
129
- return this._hasRunConfirmation;
130
- }
131
- get runConfirmationIcon() {
132
- return this._runConfirmationIcon;
133
- }
134
- get runConfirmationTitle() {
135
- return this._runConfirmationTitle;
136
- }
137
- get runConfirmationMessage() {
138
- return this._runConfirmationMessage;
139
- }
140
- get runConfirmationAcceptTitle() {
141
- return this._runConfirmationAcceptTitle;
142
- }
143
- get runConfirmationRejectTitle() {
144
- return this._runConfirmationRejectTitle;
145
- }
146
- get runConfirmationConfigMapFn() {
147
- return this._runConfirmationConfigMapFn;
148
- }
149
- get hasRunNotificationSuccess() {
150
- return this._hasRunNotificationSuccess;
151
- }
152
- get runNotificationSuccessTitle() {
153
- return this._runNotificationSuccessTitle;
154
- }
155
- get runNotificationSuccessMessage() {
156
- return this._runNotificationSuccessMessage;
157
- }
158
- get hasRunNotificationError() {
159
- return this._hasRunNotificationError;
160
- }
161
- get runNotificationErrorTitle() {
162
- return this._runNotificationErrorTitle;
163
- }
164
- get runNotificationErrorMessage() {
165
- return this._runNotificationErrorMessage;
166
- }
167
- get afterRunAction() {
168
- return this._afterRunAction;
169
- }
170
- get onRunErrorAction() {
171
- return this._onRunErrorAction;
172
- }
173
- withDataProvider(dataProvider) {
174
- this._dataProvider = dataProvider;
175
- return this;
176
- }
177
- withServiceType(serviceType) {
178
- if (!this._model) {
179
- throw new Error(`Cannot set data provider if no model type is provided for action ${this._actionName}`);
180
- }
181
- this._dataProvider = new DataProvider(this._model.type, serviceType);
182
- return this;
183
- }
184
- withRunFunction(fn) {
185
- this._runFunction = fn;
186
- return this;
187
- }
188
- withIsVisibleFunction(fn) {
189
- this._isVisibleFunction = fn;
190
- return this;
191
- }
192
- withIsEnabledFunction(fn) {
193
- this._isEnabledFunction = fn;
194
- return this;
195
- }
196
- withRouteTrigger(routeUrl) {
197
- this._activationTrigger = ActionActivationTriggerEnum.OnRoute;
198
- this._routeUrl = routeUrl;
199
- return this;
200
- }
201
- withLevel(level) {
202
- this._level = level;
203
- return this;
204
- }
205
- /**
206
- * Overrides default title key with model action key (${model.typeName}.actions.${actionName}). Not relevant if parentType name is provided.
207
- */
208
- withModelTitle() {
209
- this._title = `${this._i18nModelActionBaseKey}.title`;
210
- return this;
211
- }
212
- /**
213
- * Overrides default title key (${actionName}.title). If null, no title will be shown.
214
- * @param title Title i18n key or title.
215
- */
216
- withTitle(title) {
217
- this._title = title;
218
- return this;
219
- }
220
- withIcon(icon) {
221
- this._icon = icon;
222
- return this;
223
- }
224
- withTooltip(tooltip) {
225
- this._title = tooltip;
226
- return this;
227
- }
228
- withClassName(className) {
229
- this._className = className;
230
- return this;
231
- }
232
- withSize(size = ActionDescriptor.SizeEnum.Normal) {
233
- this._size = size;
234
- return this;
235
- }
236
- withStyle(styleText = false, styleOutlined = false, styleRaised = false) {
237
- this._isStyleText = styleText;
238
- this._isStyleOutlined = styleOutlined;
239
- this._isStyleRaised = styleRaised;
240
- return this;
241
- }
242
- withPosition(position) {
243
- this._position = position;
244
- return this;
245
- }
246
- /**
247
- * Add a confirmation dialogue to the action
248
- * @param icon the icon to display on the confirmation dialogue
249
- * @param title the title of the confirmation dialogue
250
- * @param message the message on the confirmation dialogue
251
- * @param acceptTitle the title of the accepting button
252
- * @param rejectTitle the title of the rejecting button
253
- * @param runConfirmationConfigMapFn function used to generate the confirmation dialogue. **WARNING** changing the *accept* and *reject* methods of the *confirmConfig* parameter
254
- * may lead to unexpected behaviour
255
- */
256
- withRunConfirmation(icon = 'pi pi-exclamation-triangle', title, message, acceptTitle, rejectTitle, runConfirmationConfigMapFn) {
257
- this._hasRunConfirmation = true;
258
- this._runConfirmationIcon = icon;
259
- this._runConfirmationTitle = title;
260
- this._runConfirmationMessage = message;
261
- this._runConfirmationAcceptTitle = acceptTitle;
262
- this._runConfirmationRejectTitle = rejectTitle;
263
- this._runConfirmationConfigMapFn = runConfirmationConfigMapFn;
264
- return this;
265
- }
266
- withRunNotificationSuccess(title, message, hasNotification = true) {
267
- this._hasRunNotificationSuccess = hasNotification;
268
- this._runNotificationSuccessTitle = title;
269
- this._runNotificationSuccessMessage = message;
270
- return this;
271
- }
272
- withRunNotificationError(title, message, hasNotification = true) {
273
- this._hasRunNotificationError = hasNotification;
274
- this._runNotificationErrorTitle = title;
275
- this._runNotificationErrorMessage = message;
276
- return this;
277
- }
278
- withAfterRunAction(action) {
279
- this._afterRunAction = action;
280
- return this;
281
- }
282
- withOnRunErrorAction(action) {
283
- this._onRunErrorAction = action;
284
- return this;
285
- }
286
- }
287
- (function (ActionDescriptor) {
288
- let SizeEnum;
289
- (function (SizeEnum) {
290
- SizeEnum[SizeEnum["ExtraSmall"] = 0] = "ExtraSmall";
291
- SizeEnum[SizeEnum["Small"] = 1] = "Small";
292
- SizeEnum[SizeEnum["Normal"] = 2] = "Normal";
293
- SizeEnum[SizeEnum["Large"] = 3] = "Large";
294
- SizeEnum[SizeEnum["ExtraLarge"] = 4] = "ExtraLarge";
295
- })(SizeEnum = ActionDescriptor.SizeEnum || (ActionDescriptor.SizeEnum = {}));
296
- })(ActionDescriptor || (ActionDescriptor = {}));
297
- export class ActionSimpleDescriptor extends ActionDescriptor {
298
- constructor(actionName, modelType, idProperty, titleProperty) {
299
- const model = modelType ? new ModelDescriptor(modelType, idProperty, titleProperty) : null;
300
- super(model, actionName);
301
- }
302
- }
303
- export class ActionEditorDescriptor extends ActionDescriptor {
304
- constructor(editorDescriptor, actionName, parentType, parentProperty) {
305
- super(editorDescriptor.model, actionName, parentType, parentProperty);
306
- this._editorActions = [];
307
- this._editorTitle = undefined;
308
- this._hasFetchNotificationSuccess = false;
309
- this._dialogSize = ActionEditorDescriptor.DialogSizeEnum.Normal;
310
- this._type = ActionTypeEnum.Editor;
311
- this._editorDescriptor = editorDescriptor;
312
- this._editorActions.push(new ActionEditorSubmitDescriptor(this), new ActionEditorSubmitDescriptor(this, ActionEditorSubmitDescriptor.TypeEnum.Cancel));
313
- }
314
- get editorTitle() {
315
- return this._editorTitle;
316
- }
317
- get editorDescriptor() {
318
- return this._editorDescriptor;
319
- }
320
- get dialogSize() {
321
- return this._dialogSize;
322
- }
323
- get dialogClassName() {
324
- return this._dialogClassName;
325
- }
326
- get hasFetchNotificationSuccess() {
327
- return this._hasFetchNotificationSuccess;
328
- }
329
- get fetchNotificationSuccessTitle() {
330
- return this._fetchNotificationSuccessTitle;
331
- }
332
- get fetchNotificationSuccessMessage() {
333
- return this._fetchNotificationSuccessMessage;
334
- }
335
- get dataProvider() {
336
- return this._dataProvider;
337
- }
338
- get runFunction() {
339
- throw new Error('Run function cannot be used in editor action. Use submit function instead!');
340
- }
341
- get fetchFunction() {
342
- if (!this._fetchFunction) {
343
- return ctx => {
344
- console.debug(`Fetch function is not provided for function ${this._actionNameLong}, using default and returning context item`, ctx.parameters?.item);
345
- return of(ctx.parameters?.item ? ctx.parameters.item : {});
346
- };
347
- }
348
- return this._fetchFunction;
349
- }
350
- get submitFunction() {
351
- return this._submitFunction;
352
- }
353
- get editorActions() {
354
- return this._editorActions;
355
- }
356
- get editorComponent() {
357
- return this._editorComponent;
358
- }
359
- withEditorTitle(title) {
360
- this._editorTitle = title;
361
- return this;
362
- }
363
- withDataProvider(dataProvider) {
364
- this._dataProvider = dataProvider;
365
- return this;
366
- }
367
- withServiceType(serviceType) {
368
- if (!this._model) {
369
- throw new Error(`Cannot set data provider if no model type is provided for action ${this._actionName}`);
370
- }
371
- this._dataProvider = new EditorDataProvider(this._model.type, serviceType);
372
- return this;
373
- }
374
- withDialogSize(size = ActionEditorDescriptor.DialogSizeEnum.Normal) {
375
- this._dialogSize = size;
376
- return this;
377
- }
378
- withDialogClassName(className) {
379
- this._dialogClassName = className;
380
- return this;
381
- }
382
- withRunFunction(fn) {
383
- return this.withSubmitFunction(fn);
384
- }
385
- withFetchFunction(fn) {
386
- this._fetchFunction = fn;
387
- return this;
388
- }
389
- withSubmitFunction(fn) {
390
- this._submitFunction = fn;
391
- return this;
392
- }
393
- withFetchNotificationError(title, message, hasNotification = true) {
394
- this._hasFetchNotificationSuccess = hasNotification;
395
- this._fetchNotificationSuccessTitle = title;
396
- this._fetchNotificationSuccessMessage = message;
397
- return this;
398
- }
399
- withEditorAction(action) {
400
- this._editorActions.push(action);
401
- return this;
402
- }
403
- withEditorActions(actions) {
404
- this._editorActions = actions;
405
- return this;
406
- }
407
- withEditorComponent(editorComponent) {
408
- this._editorComponent = editorComponent;
409
- return this;
410
- }
411
- }
412
- (function (ActionEditorDescriptor) {
413
- let DialogSizeEnum;
414
- (function (DialogSizeEnum) {
415
- DialogSizeEnum[DialogSizeEnum["ExtraSmall"] = 0] = "ExtraSmall";
416
- DialogSizeEnum[DialogSizeEnum["Small"] = 1] = "Small";
417
- DialogSizeEnum[DialogSizeEnum["Normal"] = 2] = "Normal";
418
- DialogSizeEnum[DialogSizeEnum["Large"] = 3] = "Large";
419
- DialogSizeEnum[DialogSizeEnum["ExtraLarge"] = 4] = "ExtraLarge";
420
- })(DialogSizeEnum = ActionEditorDescriptor.DialogSizeEnum || (ActionEditorDescriptor.DialogSizeEnum = {}));
421
- })(ActionEditorDescriptor || (ActionEditorDescriptor = {}));
422
- export class ActionEditorSubmitDescriptor extends ActionDescriptor {
423
- constructor(editorAction, submitType = ActionEditorSubmitDescriptor.TypeEnum.Submit) {
424
- super(editorAction.model, submitType === ActionEditorSubmitDescriptor.TypeEnum.Submit ? 'submit' : 'cancel');
425
- this._editorAction = editorAction;
426
- this._submitType = submitType;
427
- this._position = ActionPositionEnum.FooterRight;
428
- this._isStyleText = true;
429
- }
430
- get submitType() {
431
- return this._submitType;
432
- }
433
- }
434
- (function (ActionEditorSubmitDescriptor) {
435
- let TypeEnum;
436
- (function (TypeEnum) {
437
- TypeEnum[TypeEnum["Submit"] = 0] = "Submit";
438
- TypeEnum[TypeEnum["Cancel"] = 1] = "Cancel";
439
- })(TypeEnum = ActionEditorSubmitDescriptor.TypeEnum || (ActionEditorSubmitDescriptor.TypeEnum = {}));
440
- })(ActionEditorSubmitDescriptor || (ActionEditorSubmitDescriptor = {}));
441
- export class ActionEditorDetailsDescriptor extends ActionEditorDescriptor {
442
- constructor(editorDescriptor) {
443
- super(editorDescriptor, ActionEditorDetailsDescriptor.ACTION_NAME);
444
- this.withPosition(ActionPositionEnum.RowClick);
445
- this.withRouteTrigger(':itemId');
446
- this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
447
- this.withEditorActions([new ActionEditorSubmitDescriptor(this, ActionEditorSubmitDescriptor.TypeEnum.Cancel)]);
448
- }
449
- withServiceType(serviceType) {
450
- return this.withServiceFetchFunction(serviceType);
451
- }
452
- withServiceFetchFunction(serviceType, fetchFn) {
453
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
454
- if (fetchFn) {
455
- dataProvider.withFetch(fetchFn);
456
- }
457
- this._dataProvider = dataProvider;
458
- return this;
459
- }
460
- }
461
- ActionEditorDetailsDescriptor.ACTION_NAME = 'details';
462
- export class ActionEditorAddDescriptor extends ActionEditorDescriptor {
463
- constructor(editorDescriptor) {
464
- super(editorDescriptor, ActionEditorAddDescriptor.ACTION_NAME);
465
- this.withPosition(ActionPositionEnum.ToolbarLeft);
466
- this.withRouteTrigger('add');
467
- this.withSubmitFunction(ActionDataProviderUtil.runCreateOrFail);
468
- this.withLevel(ActionLevelEnum.Success);
469
- this.withIcon('pi pi-plus');
470
- }
471
- withServiceType(serviceType) {
472
- return this.withServiceSubmitFunction(serviceType);
473
- }
474
- withServiceSubmitFunction(serviceType, createFn, fetchFn) {
475
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
476
- if (createFn) {
477
- dataProvider.withCreate(createFn);
478
- }
479
- if (fetchFn) {
480
- dataProvider.withFetch(fetchFn);
481
- }
482
- this._dataProvider = dataProvider;
483
- return this;
484
- }
485
- }
486
- ActionEditorAddDescriptor.ACTION_NAME = 'add';
487
- export class ActionEditorEditDescriptor extends ActionEditorDescriptor {
488
- constructor(editorDescriptor) {
489
- super(editorDescriptor, ActionEditorEditDescriptor.ACTION_NAME);
490
- this.withPosition(ActionPositionEnum.RowInline);
491
- this.withTitle(null);
492
- this.withRouteTrigger(':itemId/edit');
493
- this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
494
- this.withSubmitFunction(ActionDataProviderUtil.runUpdateOrFail);
495
- this.withIcon('pi pi-pencil');
496
- }
497
- withServiceType(serviceType) {
498
- return this.withServiceSubmitFunction(serviceType);
499
- }
500
- withServiceSubmitFunction(serviceType, updateFn, fetchFn) {
501
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
502
- if (updateFn) {
503
- dataProvider.withUpdate(updateFn);
504
- }
505
- if (fetchFn) {
506
- dataProvider.withFetch(fetchFn);
507
- }
508
- this._dataProvider = dataProvider;
509
- return this;
510
- }
511
- }
512
- ActionEditorEditDescriptor.ACTION_NAME = 'edit';
513
- export class ActionDeleteDescriptor extends ActionDescriptor {
514
- constructor(model) {
515
- super(model, ActionDeleteDescriptor.ACTION_NAME);
516
- this.withPosition(ActionPositionEnum.RowInline);
517
- this.withTitle(null);
518
- this.withRunFunction(ActionDataProviderUtil.runDeleteOrFail);
519
- this.withLevel(ActionLevelEnum.Danger);
520
- this.withIcon('pi pi-trash');
521
- this.withRunConfirmation(undefined);
522
- }
523
- withServiceType(serviceType) {
524
- return this.withServiceDeleteFunction(serviceType);
525
- }
526
- withServiceDeleteFunction(serviceType, deleteFn) {
527
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
528
- if (deleteFn) {
529
- dataProvider.withDelete(deleteFn);
530
- }
531
- this._dataProvider = dataProvider;
532
- return this;
533
- }
534
- }
535
- ActionDeleteDescriptor.ACTION_NAME = 'delete';
536
- export class ActionLinkDescriptor extends ActionDescriptor {
537
- constructor(model = null, actionName = 'link') {
538
- super(model, actionName);
539
- this._url = '';
540
- this._pathSegments = [];
541
- this._replaceUrl = false;
542
- this._target = '_self';
543
- this._isStyleLink = false;
544
- }
545
- get url() {
546
- return this._url;
547
- }
548
- get pathSegments() {
549
- return this._pathSegments;
550
- }
551
- get queryParams() {
552
- return this._queryParams;
553
- }
554
- get queryParamsHandling() {
555
- return this._queryParamsHandling;
556
- }
557
- get replaceUrl() {
558
- return this._replaceUrl;
559
- }
560
- get target() {
561
- return this._target;
562
- }
563
- get isStyleLink() {
564
- return this._isStyleLink;
565
- }
566
- withHref(url) {
567
- this._url = url;
568
- return this;
569
- }
570
- withRouterLink(...pathSegments) {
571
- this._pathSegments = pathSegments;
572
- return this;
573
- }
574
- withQueryParams(queryParams, queryParamsHandling) {
575
- this._queryParams = queryParams;
576
- this._queryParamsHandling = queryParamsHandling;
577
- return this;
578
- }
579
- withReplaceUrl(replaceUrl = false) {
580
- this._replaceUrl = replaceUrl;
581
- return this;
582
- }
583
- withTarget(target = '_self') {
584
- this._target = target;
585
- return this;
586
- }
587
- withStyleLink(isStyleLink) {
588
- this._isStyleLink = isStyleLink;
589
- return this;
590
- }
591
- }
592
- export var ActionPositionEnum;
593
- (function (ActionPositionEnum) {
594
- ActionPositionEnum[ActionPositionEnum["ToolbarLeft"] = 0] = "ToolbarLeft";
595
- ActionPositionEnum[ActionPositionEnum["ToolbarRight"] = 1] = "ToolbarRight";
596
- ActionPositionEnum[ActionPositionEnum["TableHeader"] = 2] = "TableHeader";
597
- ActionPositionEnum[ActionPositionEnum["RowInline"] = 3] = "RowInline";
598
- ActionPositionEnum[ActionPositionEnum["RowClick"] = 4] = "RowClick";
599
- ActionPositionEnum[ActionPositionEnum["FooterLeft"] = 5] = "FooterLeft";
600
- ActionPositionEnum[ActionPositionEnum["FooterRight"] = 6] = "FooterRight";
601
- })(ActionPositionEnum || (ActionPositionEnum = {}));
602
- export var ActionActivationTriggerEnum;
603
- (function (ActionActivationTriggerEnum) {
604
- ActionActivationTriggerEnum[ActionActivationTriggerEnum["OnClick"] = 0] = "OnClick";
605
- ActionActivationTriggerEnum[ActionActivationTriggerEnum["OnRoute"] = 1] = "OnRoute"; // action is triggered for activation by route url
606
- })(ActionActivationTriggerEnum || (ActionActivationTriggerEnum = {}));
607
- export var ActionTypeEnum;
608
- (function (ActionTypeEnum) {
609
- ActionTypeEnum[ActionTypeEnum["Direct"] = 0] = "Direct";
610
- ActionTypeEnum[ActionTypeEnum["Editor"] = 1] = "Editor"; // editor providing middle step for activation
611
- })(ActionTypeEnum || (ActionTypeEnum = {}));
612
- export var ActionLevelEnum;
613
- (function (ActionLevelEnum) {
614
- ActionLevelEnum[ActionLevelEnum["Default"] = 0] = "Default";
615
- ActionLevelEnum[ActionLevelEnum["Primary"] = 1] = "Primary";
616
- ActionLevelEnum[ActionLevelEnum["Secondary"] = 2] = "Secondary";
617
- ActionLevelEnum[ActionLevelEnum["Info"] = 3] = "Info";
618
- ActionLevelEnum[ActionLevelEnum["Help"] = 4] = "Help";
619
- ActionLevelEnum[ActionLevelEnum["Success"] = 5] = "Success";
620
- ActionLevelEnum[ActionLevelEnum["Warning"] = 6] = "Warning";
621
- ActionLevelEnum[ActionLevelEnum["Danger"] = 7] = "Danger";
622
- })(ActionLevelEnum || (ActionLevelEnum = {}));
1
+ import { of } from 'rxjs';
2
+ import { DataProvider, EditorDataProvider } from '../data-providers';
3
+ import { ActionDataProviderUtil, TypeUtil } from '../utils';
4
+ import { ModelDescriptor } from './';
5
+ export class ActionDescriptor {
6
+ constructor(model, actionName, parentType, parentProperty) {
7
+ this._type = ActionTypeEnum.Direct;
8
+ this._activationTrigger = ActionActivationTriggerEnum.OnClick;
9
+ this._position = ActionPositionEnum.ToolbarRight;
10
+ this._level = ActionLevelEnum.Default;
11
+ this._routeUrl = null;
12
+ this._className = '';
13
+ this._size = ActionDescriptor.SizeEnum.Normal;
14
+ this._isStyleText = false;
15
+ this._isStyleOutlined = false;
16
+ this._isStyleRaised = false;
17
+ this._hasRunConfirmation = false;
18
+ this._hasRunNotificationSuccess = true;
19
+ this._hasRunNotificationError = true;
20
+ this._model = model;
21
+ this._actionName = actionName;
22
+ if ((parentType && !parentProperty) || (!parentProperty && parentProperty)) {
23
+ throw new Error(`Provide both the parent type and parent property or none: ${parentType}, ${parentProperty}.`);
24
+ }
25
+ this._parentType = parentType;
26
+ this._parentTypeName = parentType ? TypeUtil.findTypeName(parentType) : undefined;
27
+ this._parentProperty = parentProperty;
28
+ if (this._parentTypeName || this._model) {
29
+ this._i18nModelActionBaseKey = this._parentTypeName
30
+ ? `${this._parentTypeName}.actions.${this._parentProperty}_${actionName}`
31
+ : `${this._model.typeName}.actions.${actionName}`;
32
+ }
33
+ let displayName = actionName;
34
+ if (this._model)
35
+ displayName = `${this._model.typeName}.${displayName}`;
36
+ if (this._parentTypeName) {
37
+ displayName = `${this._parentTypeName}.${this._parentProperty}_${displayName}`;
38
+ }
39
+ this._actionNameLong = displayName;
40
+ }
41
+ get model() {
42
+ return this._model;
43
+ }
44
+ get parentTypeName() {
45
+ return this._parentTypeName;
46
+ }
47
+ get parentProperty() {
48
+ return this._parentProperty;
49
+ }
50
+ get i18nModelActionBaseKey() {
51
+ return this._i18nModelActionBaseKey;
52
+ }
53
+ get type() {
54
+ return this._type;
55
+ }
56
+ get activationTrigger() {
57
+ return this._activationTrigger;
58
+ }
59
+ get position() {
60
+ return this._position;
61
+ }
62
+ get level() {
63
+ return this._level;
64
+ }
65
+ get routeUrl() {
66
+ return this._routeUrl;
67
+ }
68
+ get title() {
69
+ return this._title;
70
+ }
71
+ get icon() {
72
+ return this._icon;
73
+ }
74
+ get tooltip() {
75
+ return this._tooltip;
76
+ }
77
+ get dataProvider() {
78
+ return this._dataProvider;
79
+ }
80
+ get hasRunFunction() {
81
+ return typeof this._runFunction === 'function';
82
+ }
83
+ get runFunction() {
84
+ if (!this._runFunction) {
85
+ throw new Error('Run function is not defined and cannot be invoked');
86
+ }
87
+ return this._runFunction;
88
+ }
89
+ get isVisibleFunction() {
90
+ return this._isVisibleFunction;
91
+ }
92
+ get isEnabledFunction() {
93
+ return this._isEnabledFunction;
94
+ }
95
+ get actionName() {
96
+ return this._actionName;
97
+ }
98
+ get actionNameLong() {
99
+ return this._actionNameLong;
100
+ }
101
+ get className() {
102
+ return this._className;
103
+ }
104
+ get isStyleText() {
105
+ return this._isStyleText;
106
+ }
107
+ get isStyleOutlined() {
108
+ return this._isStyleOutlined;
109
+ }
110
+ get isStyleRaised() {
111
+ return this._isStyleRaised;
112
+ }
113
+ get size() {
114
+ return this._size;
115
+ }
116
+ get isSizeExtraSmall() {
117
+ return this._size === ActionDescriptor.SizeEnum.ExtraSmall;
118
+ }
119
+ get isSizeSmall() {
120
+ return this._size === ActionDescriptor.SizeEnum.Small;
121
+ }
122
+ get isSizeLarge() {
123
+ return this._size === ActionDescriptor.SizeEnum.Large;
124
+ }
125
+ get isSizeExtraLarge() {
126
+ return this._size === ActionDescriptor.SizeEnum.ExtraLarge;
127
+ }
128
+ get hasRunConfirmation() {
129
+ return this._hasRunConfirmation;
130
+ }
131
+ get runConfirmationIcon() {
132
+ return this._runConfirmationIcon;
133
+ }
134
+ get runConfirmationTitle() {
135
+ return this._runConfirmationTitle;
136
+ }
137
+ get runConfirmationMessage() {
138
+ return this._runConfirmationMessage;
139
+ }
140
+ get runConfirmationAcceptTitle() {
141
+ return this._runConfirmationAcceptTitle;
142
+ }
143
+ get runConfirmationRejectTitle() {
144
+ return this._runConfirmationRejectTitle;
145
+ }
146
+ get runConfirmationConfigMapFn() {
147
+ return this._runConfirmationConfigMapFn;
148
+ }
149
+ get hasRunNotificationSuccess() {
150
+ return this._hasRunNotificationSuccess;
151
+ }
152
+ get runNotificationSuccessTitle() {
153
+ return this._runNotificationSuccessTitle;
154
+ }
155
+ get runNotificationSuccessMessage() {
156
+ return this._runNotificationSuccessMessage;
157
+ }
158
+ get hasRunNotificationError() {
159
+ return this._hasRunNotificationError;
160
+ }
161
+ get runNotificationErrorTitle() {
162
+ return this._runNotificationErrorTitle;
163
+ }
164
+ get runNotificationErrorMessage() {
165
+ return this._runNotificationErrorMessage;
166
+ }
167
+ get afterRunAction() {
168
+ return this._afterRunAction;
169
+ }
170
+ get onRunErrorAction() {
171
+ return this._onRunErrorAction;
172
+ }
173
+ withDataProvider(dataProvider) {
174
+ this._dataProvider = dataProvider;
175
+ return this;
176
+ }
177
+ withServiceType(serviceType) {
178
+ if (!this._model) {
179
+ throw new Error(`Cannot set data provider if no model type is provided for action ${this._actionName}`);
180
+ }
181
+ this._dataProvider = new DataProvider(this._model.type, serviceType);
182
+ return this;
183
+ }
184
+ withRunFunction(fn) {
185
+ this._runFunction = fn;
186
+ return this;
187
+ }
188
+ withIsVisibleFunction(fn) {
189
+ this._isVisibleFunction = fn;
190
+ return this;
191
+ }
192
+ withIsEnabledFunction(fn) {
193
+ this._isEnabledFunction = fn;
194
+ return this;
195
+ }
196
+ withRouteTrigger(routeUrl) {
197
+ this._activationTrigger = ActionActivationTriggerEnum.OnRoute;
198
+ this._routeUrl = routeUrl;
199
+ return this;
200
+ }
201
+ withLevel(level) {
202
+ this._level = level;
203
+ return this;
204
+ }
205
+ /**
206
+ * Overrides default title key with model action key (${model.typeName}.actions.${actionName}). Not relevant if parentType name is provided.
207
+ */
208
+ withModelTitle() {
209
+ this._title = `${this._i18nModelActionBaseKey}.title`;
210
+ return this;
211
+ }
212
+ /**
213
+ * Overrides default title key (${actionName}.title). If null, no title will be shown.
214
+ * @param title Title i18n key or title.
215
+ */
216
+ withTitle(title) {
217
+ this._title = title;
218
+ return this;
219
+ }
220
+ withIcon(icon) {
221
+ this._icon = icon;
222
+ return this;
223
+ }
224
+ withTooltip(tooltip) {
225
+ this._title = tooltip;
226
+ return this;
227
+ }
228
+ withClassName(className) {
229
+ this._className = className;
230
+ return this;
231
+ }
232
+ withSize(size = ActionDescriptor.SizeEnum.Normal) {
233
+ this._size = size;
234
+ return this;
235
+ }
236
+ withStyle(styleText = false, styleOutlined = false, styleRaised = false) {
237
+ this._isStyleText = styleText;
238
+ this._isStyleOutlined = styleOutlined;
239
+ this._isStyleRaised = styleRaised;
240
+ return this;
241
+ }
242
+ withPosition(position) {
243
+ this._position = position;
244
+ return this;
245
+ }
246
+ /**
247
+ * Add a confirmation dialogue to the action
248
+ * @param icon the icon to display on the confirmation dialogue
249
+ * @param title the title of the confirmation dialogue
250
+ * @param message the message on the confirmation dialogue
251
+ * @param acceptTitle the title of the accepting button
252
+ * @param rejectTitle the title of the rejecting button
253
+ * @param runConfirmationConfigMapFn function used to generate the confirmation dialogue. **WARNING** changing the *accept* and *reject* methods of the *confirmConfig* parameter
254
+ * may lead to unexpected behaviour
255
+ */
256
+ withRunConfirmation(icon = 'pi pi-exclamation-triangle', title, message, acceptTitle, rejectTitle, runConfirmationConfigMapFn) {
257
+ this._hasRunConfirmation = true;
258
+ this._runConfirmationIcon = icon;
259
+ this._runConfirmationTitle = title;
260
+ this._runConfirmationMessage = message;
261
+ this._runConfirmationAcceptTitle = acceptTitle;
262
+ this._runConfirmationRejectTitle = rejectTitle;
263
+ this._runConfirmationConfigMapFn = runConfirmationConfigMapFn;
264
+ return this;
265
+ }
266
+ withRunNotificationSuccess(title, message, hasNotification = true) {
267
+ this._hasRunNotificationSuccess = hasNotification;
268
+ this._runNotificationSuccessTitle = title;
269
+ this._runNotificationSuccessMessage = message;
270
+ return this;
271
+ }
272
+ withRunNotificationError(title, message, hasNotification = true) {
273
+ this._hasRunNotificationError = hasNotification;
274
+ this._runNotificationErrorTitle = title;
275
+ this._runNotificationErrorMessage = message;
276
+ return this;
277
+ }
278
+ withAfterRunAction(action) {
279
+ this._afterRunAction = action;
280
+ return this;
281
+ }
282
+ withOnRunErrorAction(action) {
283
+ this._onRunErrorAction = action;
284
+ return this;
285
+ }
286
+ }
287
+ (function (ActionDescriptor) {
288
+ let SizeEnum;
289
+ (function (SizeEnum) {
290
+ SizeEnum[SizeEnum["ExtraSmall"] = 0] = "ExtraSmall";
291
+ SizeEnum[SizeEnum["Small"] = 1] = "Small";
292
+ SizeEnum[SizeEnum["Normal"] = 2] = "Normal";
293
+ SizeEnum[SizeEnum["Large"] = 3] = "Large";
294
+ SizeEnum[SizeEnum["ExtraLarge"] = 4] = "ExtraLarge";
295
+ })(SizeEnum = ActionDescriptor.SizeEnum || (ActionDescriptor.SizeEnum = {}));
296
+ })(ActionDescriptor || (ActionDescriptor = {}));
297
+ export class ActionSimpleDescriptor extends ActionDescriptor {
298
+ constructor(actionName, modelType, idProperty, titleProperty) {
299
+ const model = modelType ? new ModelDescriptor(modelType, idProperty, titleProperty) : null;
300
+ super(model, actionName);
301
+ }
302
+ }
303
+ export class ActionEditorDescriptor extends ActionDescriptor {
304
+ constructor(editorDescriptor, actionName, parentType, parentProperty) {
305
+ super(editorDescriptor.model, actionName, parentType, parentProperty);
306
+ this._editorActions = [];
307
+ this._editorTitle = undefined;
308
+ this._hasFetchNotificationSuccess = false;
309
+ this._dialogSize = ActionEditorDescriptor.DialogSizeEnum.Normal;
310
+ this._type = ActionTypeEnum.Editor;
311
+ this._editorDescriptor = editorDescriptor;
312
+ this._editorActions.push(new ActionEditorSubmitDescriptor(this), new ActionEditorSubmitDescriptor(this, ActionEditorSubmitDescriptor.TypeEnum.Cancel));
313
+ }
314
+ get editorTitle() {
315
+ return this._editorTitle;
316
+ }
317
+ get editorDescriptor() {
318
+ return this._editorDescriptor;
319
+ }
320
+ get dialogSize() {
321
+ return this._dialogSize;
322
+ }
323
+ get dialogClassName() {
324
+ return this._dialogClassName;
325
+ }
326
+ get hasFetchNotificationSuccess() {
327
+ return this._hasFetchNotificationSuccess;
328
+ }
329
+ get fetchNotificationSuccessTitle() {
330
+ return this._fetchNotificationSuccessTitle;
331
+ }
332
+ get fetchNotificationSuccessMessage() {
333
+ return this._fetchNotificationSuccessMessage;
334
+ }
335
+ get dataProvider() {
336
+ return this._dataProvider;
337
+ }
338
+ get runFunction() {
339
+ throw new Error('Run function cannot be used in editor action. Use submit function instead!');
340
+ }
341
+ get fetchFunction() {
342
+ if (!this._fetchFunction) {
343
+ return ctx => {
344
+ console.debug(`Fetch function is not provided for function ${this._actionNameLong}, using default and returning context item`, ctx.parameters?.item);
345
+ return of(ctx.parameters?.item ? ctx.parameters.item : {});
346
+ };
347
+ }
348
+ return this._fetchFunction;
349
+ }
350
+ get submitFunction() {
351
+ return this._submitFunction;
352
+ }
353
+ get editorActions() {
354
+ return this._editorActions;
355
+ }
356
+ get editorComponent() {
357
+ return this._editorComponent;
358
+ }
359
+ withEditorTitle(title) {
360
+ this._editorTitle = title;
361
+ return this;
362
+ }
363
+ withDataProvider(dataProvider) {
364
+ this._dataProvider = dataProvider;
365
+ return this;
366
+ }
367
+ withServiceType(serviceType) {
368
+ if (!this._model) {
369
+ throw new Error(`Cannot set data provider if no model type is provided for action ${this._actionName}`);
370
+ }
371
+ this._dataProvider = new EditorDataProvider(this._model.type, serviceType);
372
+ return this;
373
+ }
374
+ withDialogSize(size = ActionEditorDescriptor.DialogSizeEnum.Normal) {
375
+ this._dialogSize = size;
376
+ return this;
377
+ }
378
+ withDialogClassName(className) {
379
+ this._dialogClassName = className;
380
+ return this;
381
+ }
382
+ withRunFunction(fn) {
383
+ return this.withSubmitFunction(fn);
384
+ }
385
+ withFetchFunction(fn) {
386
+ this._fetchFunction = fn;
387
+ return this;
388
+ }
389
+ withSubmitFunction(fn) {
390
+ this._submitFunction = fn;
391
+ return this;
392
+ }
393
+ withFetchNotificationError(title, message, hasNotification = true) {
394
+ this._hasFetchNotificationSuccess = hasNotification;
395
+ this._fetchNotificationSuccessTitle = title;
396
+ this._fetchNotificationSuccessMessage = message;
397
+ return this;
398
+ }
399
+ withEditorAction(action) {
400
+ this._editorActions.push(action);
401
+ return this;
402
+ }
403
+ withEditorActions(actions) {
404
+ this._editorActions = actions;
405
+ return this;
406
+ }
407
+ withEditorComponent(editorComponent) {
408
+ this._editorComponent = editorComponent;
409
+ return this;
410
+ }
411
+ }
412
+ (function (ActionEditorDescriptor) {
413
+ let DialogSizeEnum;
414
+ (function (DialogSizeEnum) {
415
+ DialogSizeEnum[DialogSizeEnum["ExtraSmall"] = 0] = "ExtraSmall";
416
+ DialogSizeEnum[DialogSizeEnum["Small"] = 1] = "Small";
417
+ DialogSizeEnum[DialogSizeEnum["Normal"] = 2] = "Normal";
418
+ DialogSizeEnum[DialogSizeEnum["Large"] = 3] = "Large";
419
+ DialogSizeEnum[DialogSizeEnum["ExtraLarge"] = 4] = "ExtraLarge";
420
+ })(DialogSizeEnum = ActionEditorDescriptor.DialogSizeEnum || (ActionEditorDescriptor.DialogSizeEnum = {}));
421
+ })(ActionEditorDescriptor || (ActionEditorDescriptor = {}));
422
+ export class ActionEditorSubmitDescriptor extends ActionDescriptor {
423
+ constructor(editorAction, submitType = ActionEditorSubmitDescriptor.TypeEnum.Submit) {
424
+ super(editorAction.model, submitType === ActionEditorSubmitDescriptor.TypeEnum.Submit ? 'submit' : 'cancel');
425
+ this._editorAction = editorAction;
426
+ this._submitType = submitType;
427
+ this._position = ActionPositionEnum.FooterRight;
428
+ this._isStyleText = true;
429
+ }
430
+ get submitType() {
431
+ return this._submitType;
432
+ }
433
+ }
434
+ (function (ActionEditorSubmitDescriptor) {
435
+ let TypeEnum;
436
+ (function (TypeEnum) {
437
+ TypeEnum[TypeEnum["Submit"] = 0] = "Submit";
438
+ TypeEnum[TypeEnum["Cancel"] = 1] = "Cancel";
439
+ })(TypeEnum = ActionEditorSubmitDescriptor.TypeEnum || (ActionEditorSubmitDescriptor.TypeEnum = {}));
440
+ })(ActionEditorSubmitDescriptor || (ActionEditorSubmitDescriptor = {}));
441
+ export class ActionEditorDetailsDescriptor extends ActionEditorDescriptor {
442
+ constructor(editorDescriptor) {
443
+ super(editorDescriptor, ActionEditorDetailsDescriptor.ACTION_NAME);
444
+ this.withPosition(ActionPositionEnum.RowClick);
445
+ this.withRouteTrigger(':itemId');
446
+ this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
447
+ this.withEditorActions([new ActionEditorSubmitDescriptor(this, ActionEditorSubmitDescriptor.TypeEnum.Cancel)]);
448
+ }
449
+ withServiceType(serviceType) {
450
+ return this.withServiceFetchFunction(serviceType);
451
+ }
452
+ withServiceFetchFunction(serviceType, fetchFn) {
453
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
454
+ if (fetchFn) {
455
+ dataProvider.withFetch(fetchFn);
456
+ }
457
+ this._dataProvider = dataProvider;
458
+ return this;
459
+ }
460
+ }
461
+ ActionEditorDetailsDescriptor.ACTION_NAME = 'details';
462
+ export class ActionEditorAddDescriptor extends ActionEditorDescriptor {
463
+ constructor(editorDescriptor) {
464
+ super(editorDescriptor, ActionEditorAddDescriptor.ACTION_NAME);
465
+ this.withPosition(ActionPositionEnum.ToolbarLeft);
466
+ this.withRouteTrigger('add');
467
+ this.withSubmitFunction(ActionDataProviderUtil.runCreateOrFail);
468
+ this.withLevel(ActionLevelEnum.Success);
469
+ this.withIcon('pi pi-plus');
470
+ }
471
+ withServiceType(serviceType) {
472
+ return this.withServiceSubmitFunction(serviceType);
473
+ }
474
+ withServiceSubmitFunction(serviceType, createFn, fetchFn) {
475
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
476
+ if (createFn) {
477
+ dataProvider.withCreate(createFn);
478
+ }
479
+ if (fetchFn) {
480
+ dataProvider.withFetch(fetchFn);
481
+ }
482
+ this._dataProvider = dataProvider;
483
+ return this;
484
+ }
485
+ }
486
+ ActionEditorAddDescriptor.ACTION_NAME = 'add';
487
+ export class ActionEditorEditDescriptor extends ActionEditorDescriptor {
488
+ constructor(editorDescriptor) {
489
+ super(editorDescriptor, ActionEditorEditDescriptor.ACTION_NAME);
490
+ this.withPosition(ActionPositionEnum.RowInline);
491
+ this.withTitle(null);
492
+ this.withRouteTrigger(':itemId/edit');
493
+ this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
494
+ this.withSubmitFunction(ActionDataProviderUtil.runUpdateOrFail);
495
+ this.withIcon('pi pi-pencil');
496
+ }
497
+ withServiceType(serviceType) {
498
+ return this.withServiceSubmitFunction(serviceType);
499
+ }
500
+ withServiceSubmitFunction(serviceType, updateFn, fetchFn) {
501
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
502
+ if (updateFn) {
503
+ dataProvider.withUpdate(updateFn);
504
+ }
505
+ if (fetchFn) {
506
+ dataProvider.withFetch(fetchFn);
507
+ }
508
+ this._dataProvider = dataProvider;
509
+ return this;
510
+ }
511
+ }
512
+ ActionEditorEditDescriptor.ACTION_NAME = 'edit';
513
+ export class ActionDeleteDescriptor extends ActionDescriptor {
514
+ constructor(model) {
515
+ super(model, ActionDeleteDescriptor.ACTION_NAME);
516
+ this.withPosition(ActionPositionEnum.RowInline);
517
+ this.withTitle(null);
518
+ this.withRunFunction(ActionDataProviderUtil.runDeleteOrFail);
519
+ this.withLevel(ActionLevelEnum.Danger);
520
+ this.withIcon('pi pi-trash');
521
+ this.withRunConfirmation(undefined);
522
+ }
523
+ withServiceType(serviceType) {
524
+ return this.withServiceDeleteFunction(serviceType);
525
+ }
526
+ withServiceDeleteFunction(serviceType, deleteFn) {
527
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
528
+ if (deleteFn) {
529
+ dataProvider.withDelete(deleteFn);
530
+ }
531
+ this._dataProvider = dataProvider;
532
+ return this;
533
+ }
534
+ }
535
+ ActionDeleteDescriptor.ACTION_NAME = 'delete';
536
+ export class ActionLinkDescriptor extends ActionDescriptor {
537
+ constructor(model = null, actionName = 'link') {
538
+ super(model, actionName);
539
+ this._url = '';
540
+ this._pathSegments = [];
541
+ this._replaceUrl = false;
542
+ this._target = '_self';
543
+ this._isStyleLink = false;
544
+ }
545
+ get url() {
546
+ return this._url;
547
+ }
548
+ get pathSegments() {
549
+ return this._pathSegments;
550
+ }
551
+ get queryParams() {
552
+ return this._queryParams;
553
+ }
554
+ get queryParamsHandling() {
555
+ return this._queryParamsHandling;
556
+ }
557
+ get replaceUrl() {
558
+ return this._replaceUrl;
559
+ }
560
+ get target() {
561
+ return this._target;
562
+ }
563
+ get isStyleLink() {
564
+ return this._isStyleLink;
565
+ }
566
+ withHref(url) {
567
+ this._url = url;
568
+ return this;
569
+ }
570
+ withRouterLink(...pathSegments) {
571
+ this._pathSegments = pathSegments;
572
+ return this;
573
+ }
574
+ withQueryParams(queryParams, queryParamsHandling) {
575
+ this._queryParams = queryParams;
576
+ this._queryParamsHandling = queryParamsHandling;
577
+ return this;
578
+ }
579
+ withReplaceUrl(replaceUrl = false) {
580
+ this._replaceUrl = replaceUrl;
581
+ return this;
582
+ }
583
+ withTarget(target = '_self') {
584
+ this._target = target;
585
+ return this;
586
+ }
587
+ withStyleLink(isStyleLink) {
588
+ this._isStyleLink = isStyleLink;
589
+ return this;
590
+ }
591
+ }
592
+ export var ActionPositionEnum;
593
+ (function (ActionPositionEnum) {
594
+ ActionPositionEnum[ActionPositionEnum["ToolbarLeft"] = 0] = "ToolbarLeft";
595
+ ActionPositionEnum[ActionPositionEnum["ToolbarRight"] = 1] = "ToolbarRight";
596
+ ActionPositionEnum[ActionPositionEnum["TableHeader"] = 2] = "TableHeader";
597
+ ActionPositionEnum[ActionPositionEnum["RowInline"] = 3] = "RowInline";
598
+ ActionPositionEnum[ActionPositionEnum["RowClick"] = 4] = "RowClick";
599
+ ActionPositionEnum[ActionPositionEnum["FooterLeft"] = 5] = "FooterLeft";
600
+ ActionPositionEnum[ActionPositionEnum["FooterRight"] = 6] = "FooterRight";
601
+ })(ActionPositionEnum || (ActionPositionEnum = {}));
602
+ export var ActionActivationTriggerEnum;
603
+ (function (ActionActivationTriggerEnum) {
604
+ ActionActivationTriggerEnum[ActionActivationTriggerEnum["OnClick"] = 0] = "OnClick";
605
+ ActionActivationTriggerEnum[ActionActivationTriggerEnum["OnRoute"] = 1] = "OnRoute"; // action is triggered for activation by route url
606
+ })(ActionActivationTriggerEnum || (ActionActivationTriggerEnum = {}));
607
+ export var ActionTypeEnum;
608
+ (function (ActionTypeEnum) {
609
+ ActionTypeEnum[ActionTypeEnum["Direct"] = 0] = "Direct";
610
+ ActionTypeEnum[ActionTypeEnum["Editor"] = 1] = "Editor"; // editor providing middle step for activation
611
+ })(ActionTypeEnum || (ActionTypeEnum = {}));
612
+ export var ActionLevelEnum;
613
+ (function (ActionLevelEnum) {
614
+ ActionLevelEnum[ActionLevelEnum["Default"] = 0] = "Default";
615
+ ActionLevelEnum[ActionLevelEnum["Primary"] = 1] = "Primary";
616
+ ActionLevelEnum[ActionLevelEnum["Secondary"] = 2] = "Secondary";
617
+ ActionLevelEnum[ActionLevelEnum["Info"] = 3] = "Info";
618
+ ActionLevelEnum[ActionLevelEnum["Help"] = 4] = "Help";
619
+ ActionLevelEnum[ActionLevelEnum["Success"] = 5] = "Success";
620
+ ActionLevelEnum[ActionLevelEnum["Warning"] = 6] = "Warning";
621
+ ActionLevelEnum[ActionLevelEnum["Danger"] = 7] = "Danger";
622
+ })(ActionLevelEnum || (ActionLevelEnum = {}));
623
623
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2FjdGlvbi5kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHcEMsT0FBTyxFQUFDLFlBQVksRUFBRSxrQkFBa0IsRUFBcUMsTUFBTSxtQkFBbUIsQ0FBQztBQUV2RyxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQzFELE9BQU8sRUFBbUIsZUFBZSxFQUFDLE1BQU0sSUFBSSxDQUFDO0FBRXJELE1BQU0sT0FBTyxnQkFBZ0I7SUFpRHpCLFlBQVksS0FBZ0MsRUFBRSxVQUFrQixFQUFFLFVBQTJCLEVBQUUsY0FBdUI7UUF4QzVHLFVBQUssR0FBbUIsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUM5Qyx1QkFBa0IsR0FBZ0MsMkJBQTJCLENBQUMsT0FBTyxDQUFDO1FBQ3RGLGNBQVMsR0FBdUIsa0JBQWtCLENBQUMsWUFBWSxDQUFDO1FBQ2hFLFdBQU0sR0FBb0IsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUVsRCxjQUFTLEdBQWtCLElBQUksQ0FBQztRQUtoQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLFVBQUssR0FBOEIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNwRSxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFPdkIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBUTVCLCtCQUEwQixHQUFHLElBQUksQ0FBQztRQUlsQyw2QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFRdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxV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O0lBQ1AsbUZBQU8sQ0FBQSxDQUFDLGtEQUFrRDtBQUM5RCxDQUFDLEVBSFcsMkJBQTJCLEtBQTNCLDJCQUEyQixRQUd0QztBQUVELE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDdEIsdURBQU0sQ0FBQTtJQUNOLHVEQUFNLENBQUEsQ0FBQyw4Q0FBOEM7QUFDekQsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCO0FBRUQsTUFBTSxDQUFOLElBQVksZUFTWDtBQVRELFdBQVksZUFBZTtJQUN2QiwyREFBTyxDQUFBO0lBQ1AsMkRBQU8sQ0FBQTtJQUNQLCtEQUFTLENBQUE7SUFDVCxxREFBSSxDQUFBO0lBQ0oscURBQUksQ0FBQTtJQUNKLDJEQUFPLENBQUE7SUFDUCwyREFBTyxDQUFBO0lBQ1AseURBQU0sQ0FBQTtBQUNWLENBQUMsRUFUVyxlQUFlLEtBQWYsZUFBZSxRQVMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1BhcmFtcywgUXVlcnlQYXJhbXNIYW5kbGluZ30gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtDb25maXJtYXRpb259IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0FjdGlvbkNvbnRleHQsIEFjdGlvbkNvbnRleHRWYWxpZGF0aW9ufSBmcm9tICcuLi9jb21wb25lbnRzL2FjdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHtEYXRhUHJvdmlkZXIsIEVkaXRvckRhdGFQcm92aWRlciwgSURhdGFQcm92aWRlciwgSUVkaXRvckRhdGFQcm92aWRlcn0gZnJvbSAnLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtDbGFzc1R5cGUsIElkVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLCBUeXBlVXRpbH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9yLCBNb2RlbERlc2NyaXB0b3J9IGZyb20gJy4vJztcblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPiB8IG51bGw7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hY3Rpb25OYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hY3Rpb25OYW1lTG9uZzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcGFyZW50VHlwZT86IENsYXNzVHlwZTxhbnk+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcGFyZW50VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wYXJlbnRQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXk/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX3R5cGU6IEFjdGlvblR5cGVFbnVtID0gQWN0aW9uVHlwZUVudW0uRGlyZWN0O1xuICAgIHByb3RlY3RlZCBfYWN0aXZhdGlvblRyaWdnZXI6IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bSA9IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PbkNsaWNrO1xuICAgIHByb3RlY3RlZCBfcG9zaXRpb246IEFjdGlvblBvc2l0aW9uRW51bSA9IEFjdGlvblBvc2l0aW9uRW51bS5Ub29sYmFyUmlnaHQ7XG4gICAgcHJvdGVjdGVkIF9sZXZlbDogQWN0aW9uTGV2ZWxFbnVtID0gQWN0aW9uTGV2ZWxFbnVtLkRlZmF1bHQ7XG5cbiAgICBwcm90ZWN0ZWQgX3JvdXRlVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCBfdGl0bGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHByb3RlY3RlZCBfaWNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvdGVjdGVkIF90b29sdGlwPzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgX2NsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfc2l6ZTogQWN0aW9uRGVzY3JpcHRvci5TaXplRW51bSA9IEFjdGlvbkRlc2NyaXB0b3IuU2l6ZUVudW0uTm9ybWFsO1xuICAgIHByb3RlY3RlZCBfaXNTdHlsZVRleHQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2lzU3R5bGVPdXRsaW5lZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfaXNTdHlsZVJhaXNlZCA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIF9kYXRhUHJvdmlkZXI/OiBJRGF0YVByb3ZpZGVyPFQsIGFueT47XG4gICAgcHJvdGVjdGVkIF9ydW5GdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PikgPT4gT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkIHwgbnVsbD47XG4gICAgcHJvdGVjdGVkIF9pc1Zpc2libGVGdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPFQsIGFueT4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJvdGVjdGVkIF9pc0VuYWJsZWRGdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPFQsIGFueT4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBwcm90ZWN0ZWQgX2hhc1J1bkNvbmZpcm1hdGlvbiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfcnVuQ29uZmlybWF0aW9uSWNvbj86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3J1bkNvbmZpcm1hdGlvblRpdGxlPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcnVuQ29uZmlybWF0aW9uTWVzc2FnZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3J1bkNvbmZpcm1hdGlvbkFjY2VwdFRpdGxlPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcnVuQ29uZmlybWF0aW9uUmVqZWN0VGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ydW5Db25maXJtYXRpb25Db25maWdNYXBGbj86IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PiwgY29uZmlybUNvbmZpZzogQ29uZmlybWF0aW9uKSA9PiBDb25maXJtYXRpb247XG5cbiAgICBwcm90ZWN0ZWQgX2hhc1J1bk5vdGlmaWNhdGlvblN1Y2Nlc3MgPSB0cnVlO1xuICAgIHByb3RlY3RlZCBfcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX2FmdGVyUnVuQWN0aW9uPzogQWN0aW9uRGVzY3JpcHRvcjx1bmtub3duPjtcbiAgICBwcm90ZWN0ZWQgX29uUnVuRXJyb3JBY3Rpb24/OiBBY3Rpb25EZXNjcmlwdG9yPHVua25vd24+O1xuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPiB8IG51bGwsIGFjdGlvbk5hbWU6IHN0cmluZywgcGFyZW50VHlwZT86IENsYXNzVHlwZTxhbnk+LCBwYXJlbnRQcm9wZXJ0eT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuICAgICAgICB0aGlzLl9hY3Rpb25OYW1lID0gYWN0aW9uTmFtZTtcblxuICAgICAgICBpZiAoKHBhcmVudFR5cGUgJiYgIXBhcmVudFByb3BlcnR5KSB8fCAoIXBhcmVudFByb3BlcnR5ICYmIHBhcmVudFByb3BlcnR5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlIGJvdGggdGhlIHBhcmVudCB0eXBlIGFuZCBwYXJlbnQgcHJvcGVydHkgb3Igbm9uZTogJHtwYXJlbnRUeXBlfSwgJHtwYXJlbnRQcm9wZXJ0eX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGFyZW50VHlwZSA9IHBhcmVudFR5cGU7XG4gICAgICAgIHRoaXMuX3BhcmVudFR5cGVOYW1lID0gcGFyZW50VHlwZSA/IFR5cGVVdGlsLmZpbmRUeXBlTmFtZShwYXJlbnRUeXBlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fcGFyZW50UHJvcGVydHkgPSBwYXJlbnRQcm9wZXJ0eTtcblxuICAgICAgICBpZiAodGhpcy5fcGFyZW50VHlwZU5hbWUgfHwgdGhpcy5fbW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXkgPSB0aGlzLl9wYXJlbnRUeXBlTmFtZVxuICAgICAgICAgICAgICAgID8gYCR7dGhpcy5fcGFyZW50VHlwZU5hbWV9LmFjdGlvbnMuJHt0aGlzLl9wYXJlbnRQcm9wZXJ0eX1fJHthY3Rpb25OYW1lfWBcbiAgICAgICAgICAgICAgICA6IGAke3RoaXMuX21vZGVsIS50eXBlTmFtZX0uYWN0aW9ucy4ke2FjdGlvbk5hbWV9YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlzcGxheU5hbWUgPSBhY3Rpb25OYW1lO1xuICAgICAgICBpZiAodGhpcy5fbW9kZWwpIGRpc3BsYXlOYW1lID0gYCR7dGhpcy5fbW9kZWwudHlwZU5hbWV9LiR7ZGlzcGxheU5hbWV9YDtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGVOYW1lKSB7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGAke3RoaXMuX3BhcmVudFR5cGVOYW1lfS4ke3RoaXMuX3BhcmVudFByb3BlcnR5fV8ke2Rpc3BsYXlOYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWN0aW9uTmFtZUxvbmcgPSBkaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJlbnRUeXBlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFR5cGVOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyZW50UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGkxOG5Nb2RlbEFjdGlvbkJhc2VLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmF0aW9uVHJpZ2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2YXRpb25UcmlnZ2VyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3V0ZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlVXJsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGljb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pY29uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG9vbHRpcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rvb2x0aXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5GdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9ydW5GdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkZ1bmN0aW9uKCk6IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PikgPT4gT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkIHwgbnVsbD4ge1xuICAgICAgICBpZiAoIXRoaXMuX3J1bkZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1biBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZCBhbmQgY2Fubm90IGJlIGludm9rZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcnVuRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc1Zpc2libGVGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmlzaWJsZUZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNFbmFibGVkRnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0VuYWJsZWRGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbk5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25OYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9uTmFtZUxvbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25OYW1lTG9uZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTdHlsZVRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1N0eWxlVGV4dDtcbiAgICB9XG5cbiAgICBnZXQgaXNTdHlsZU91dGxpbmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNTdHlsZU91dGxpbmVkO1xuICAgIH1cblxuICAgIGdldCBpc1N0eWxlUmFpc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNTdHlsZVJhaXNlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNTaXplRXh0cmFTbWFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemUgPT09IEFjdGlvbkRlc2NyaXB0b3IuU2l6ZUVudW0uRXh0cmFTbWFsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZVNtYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gQWN0aW9uRGVzY3JpcHRvci5TaXplRW51bS5TbWFsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZUxhcmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gQWN0aW9uRGVzY3JpcHRvci5TaXplRW51bS5MYXJnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZUV4dHJhTGFyZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplID09PSBBY3Rpb25EZXNjcmlwdG9yLlNpemVFbnVtLkV4dHJhTGFyZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5Db25maXJtYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNSdW5Db25maXJtYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Db25maXJtYXRpb25JY29uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uSWNvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkNvbmZpcm1hdGlvblRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uVGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Db25maXJtYXRpb25NZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkNvbmZpcm1hdGlvbkFjY2VwdFRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uQWNjZXB0VGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Db25maXJtYXRpb25SZWplY3RUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkNvbmZpcm1hdGlvblJlamVjdFRpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuQ29uZmlybWF0aW9uQ29uZmlnTWFwRm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Db25maXJtYXRpb25Db25maWdNYXBGbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc1J1bk5vdGlmaWNhdGlvblN1Y2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc1J1bk5vdGlmaWNhdGlvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uRXJyb3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFmdGVyUnVuQWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWZ0ZXJSdW5BY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvblJ1bkVycm9yQWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25SdW5FcnJvckFjdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXI6IElEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZVR5cGU8Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tb2RlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0IGRhdGEgcHJvdmlkZXIgaWYgbm8gbW9kZWwgdHlwZSBpcyBwcm92aWRlZCBmb3IgYWN0aW9uICR7dGhpcy5fYWN0aW9uTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBuZXcgRGF0YVByb3ZpZGVyKHRoaXMuX21vZGVsLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSdW5GdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dDxULCBTPikgPT4gT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkIHwgbnVsbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcnVuRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJc1Zpc2libGVGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248VCwgUz4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNWaXNpYmxlRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJc0VuYWJsZWRGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248VCwgUz4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNFbmFibGVkRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSb3V0ZVRyaWdnZXIocm91dGVVcmw6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9hY3RpdmF0aW9uVHJpZ2dlciA9IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlO1xuICAgICAgICB0aGlzLl9yb3V0ZVVybCA9IHJvdXRlVXJsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExldmVsKGxldmVsOiBBY3Rpb25MZXZlbEVudW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgdGl0bGUga2V5IHdpdGggbW9kZWwgYWN0aW9uIGtleSAoJHttb2RlbC50eXBlTmFtZX0uYWN0aW9ucy4ke2FjdGlvbk5hbWV9KS4gTm90IHJlbGV2YW50IGlmIHBhcmVudFR5cGUgbmFtZSBpcyBwcm92aWRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aE1vZGVsVGl0bGUoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gYCR7dGhpcy5faTE4bk1vZGVsQWN0aW9uQmFzZUtleX0udGl0bGVgO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCB0aXRsZSBrZXkgKCR7YWN0aW9uTmFtZX0udGl0bGUpLiBJZiBudWxsLCBubyB0aXRsZSB3aWxsIGJlIHNob3duLlxuICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBpMThuIGtleSBvciB0aXRsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSWNvbihpY29uOiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ljb24gPSBpY29uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRvb2x0aXAodG9vbHRpcDogc3RyaW5nIHwgbnVsbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRvb2x0aXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IEFjdGlvbkRlc2NyaXB0b3IuU2l6ZUVudW0gPSBBY3Rpb25EZXNjcmlwdG9yLlNpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTdHlsZShzdHlsZVRleHQgPSBmYWxzZSwgc3R5bGVPdXRsaW5lZCA9IGZhbHNlLCBzdHlsZVJhaXNlZCA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzU3R5bGVUZXh0ID0gc3R5bGVUZXh0O1xuICAgICAgICB0aGlzLl9pc1N0eWxlT3V0bGluZWQgPSBzdHlsZU91dGxpbmVkO1xuICAgICAgICB0aGlzLl9pc1N0eWxlUmFpc2VkID0gc3R5bGVSYWlzZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUG9zaXRpb24ocG9zaXRpb246IEFjdGlvblBvc2l0aW9uRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjb25maXJtYXRpb24gZGlhbG9ndWUgdG8gdGhlIGFjdGlvblxuICAgICAqIEBwYXJhbSBpY29uIHRoZSBpY29uIHRvIGRpc3BsYXkgb24gdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2d1ZVxuICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgb2YgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2d1ZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIG9uIHRoZSBjb25maXJtYXRpb24gZGlhbG9ndWVcbiAgICAgKiBAcGFyYW0gYWNjZXB0VGl0bGUgdGhlIHRpdGxlIG9mIHRoZSBhY2NlcHRpbmcgYnV0dG9uXG4gICAgICogQHBhcmFtIHJlamVjdFRpdGxlIHRoZSB0aXRsZSBvZiB0aGUgcmVqZWN0aW5nIGJ1dHRvblxuICAgICAqIEBwYXJhbSBydW5Db25maXJtYXRpb25Db25maWdNYXBGbiBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb25maXJtYXRpb24gZGlhbG9ndWUuICoqV0FSTklORyoqIGNoYW5naW5nIHRoZSAqYWNjZXB0KiBhbmQgKnJlamVjdCogbWV0aG9kcyBvZiB0aGUgKmNvbmZpcm1Db25maWcqIHBhcmFtZXRlclxuICAgICAqIG1heSBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3VyXG4gICAgICovXG4gICAgcHVibGljIHdpdGhSdW5Db25maXJtYXRpb24oXG4gICAgICAgIGljb24gPSAncGkgcGktZXhjbGFtYXRpb24tdHJpYW5nbGUnLFxuICAgICAgICB0aXRsZT86IHN0cmluZyxcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZyxcbiAgICAgICAgYWNjZXB0VGl0bGU/OiBzdHJpbmcsXG4gICAgICAgIHJlamVjdFRpdGxlPzogc3RyaW5nLFxuICAgICAgICBydW5Db25maXJtYXRpb25Db25maWdNYXBGbj86IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PiwgY29uZmlybUNvbmZpZzogQ29uZmlybWF0aW9uKSA9PiBDb25maXJtYXRpb25cbiAgICApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzUnVuQ29uZmlybWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uSWNvbiA9IGljb247XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvblRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvbk1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25BY2NlcHRUaXRsZSA9IGFjY2VwdFRpdGxlO1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25SZWplY3RUaXRsZSA9IHJlamVjdFRpdGxlO1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25Db25maWdNYXBGbiA9IHJ1bkNvbmZpcm1hdGlvbkNvbmZpZ01hcEZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3ModGl0bGU/OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIGhhc05vdGlmaWNhdGlvbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcyA9IGhhc05vdGlmaWNhdGlvbjtcbiAgICAgICAgdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSdW5Ob3RpZmljYXRpb25FcnJvcih0aXRsZT86IHN0cmluZywgbWVzc2FnZT86IHN0cmluZywgaGFzTm90aWZpY2F0aW9uID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25FcnJvciA9IGhhc05vdGlmaWNhdGlvbjtcbiAgICAgICAgdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEFmdGVyUnVuQWN0aW9uPFJUPihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8UlQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2FmdGVyUnVuQWN0aW9uID0gYWN0aW9uIGFzIEFjdGlvbkRlc2NyaXB0b3I8dW5rbm93bj47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoT25SdW5FcnJvckFjdGlvbjxSVD4oYWN0aW9uOiBBY3Rpb25EZXNjcmlwdG9yPFJUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9vblJ1bkVycm9yQWN0aW9uID0gYWN0aW9uIGFzIEFjdGlvbkRlc2NyaXB0b3I8dW5rbm93bj47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBY3Rpb25EZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBTaXplRW51bSB7XG4gICAgICAgIEV4dHJhU21hbGwsXG4gICAgICAgIFNtYWxsLFxuICAgICAgICBOb3JtYWwsXG4gICAgICAgIExhcmdlLFxuICAgICAgICBFeHRyYUxhcmdlXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uU2ltcGxlRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIGNvbnN0cnVjdG9yKGFjdGlvbk5hbWU6IHN0cmluZywgbW9kZWxUeXBlPzogQ2xhc3NUeXBlPFQ+LCBpZFByb3BlcnR5Pzogc3RyaW5nLCB0aXRsZVByb3BlcnR5Pzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9kZWxUeXBlID8gbmV3IE1vZGVsRGVzY3JpcHRvcjxUPihtb2RlbFR5cGUsIGlkUHJvcGVydHksIHRpdGxlUHJvcGVydHkpIDogbnVsbDtcbiAgICAgICAgc3VwZXIobW9kZWwsIGFjdGlvbk5hbWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25EZXNjcmlwdG9yPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+O1xuXG4gICAgcHJvdGVjdGVkIF9lZGl0b3JBY3Rpb25zOiBBY3Rpb25EZXNjcmlwdG9yPFQ+W10gPSBbXTtcbiAgICBwcm90ZWN0ZWQgX2VkaXRvclRpdGxlPzogc3RyaW5nIHwgbnVsbCA9IHVuZGVmaW5lZDtcblxuICAgIHByb3RlY3RlZCBfaGFzRmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1NpemU6IEFjdGlvbkVkaXRvckRlc2NyaXB0b3IuRGlhbG9nU2l6ZUVudW0gPSBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yLkRpYWxvZ1NpemVFbnVtLk5vcm1hbDtcbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ0NsYXNzTmFtZT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBfZGF0YVByb3ZpZGVyPzogSUVkaXRvckRhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgIHByb3RlY3RlZCBfZmV0Y2hGdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PikgPT4gT2JzZXJ2YWJsZTxUPjtcbiAgICBwcm90ZWN0ZWQgX3N1Ym1pdEZ1bmN0aW9uPzogKGN0eDogQWN0aW9uQ29udGV4dDxULCBhbnk+KSA9PiBPYnNlcnZhYmxlPFQ+O1xuXG4gICAgcHJvdGVjdGVkIF9lZGl0b3JDb21wb25lbnQ/OiBUeXBlPGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+LCBhY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmVudFR5cGU/OiBDbGFzc1R5cGU8YW55PiwgcGFyZW50UHJvcGVydHk/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yRGVzY3JpcHRvci5tb2RlbCwgYWN0aW9uTmFtZSwgcGFyZW50VHlwZSwgcGFyZW50UHJvcGVydHkpO1xuICAgICAgICB0aGlzLl90eXBlID0gQWN0aW9uVHlwZUVudW0uRWRpdG9yO1xuICAgICAgICB0aGlzLl9lZGl0b3JEZXNjcmlwdG9yID0gZWRpdG9yRGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9ucy5wdXNoKG5ldyBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yKHRoaXMpLCBuZXcgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcih0aGlzLCBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yLlR5cGVFbnVtLkNhbmNlbCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckRlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlhbG9nU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpYWxvZ1NpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaWFsb2dDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWFsb2dDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNGZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNGZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBydW5GdW5jdGlvbigpOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIHVua25vd24+KSA9PiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW4gZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgaW4gZWRpdG9yIGFjdGlvbi4gVXNlIHN1Ym1pdCBmdW5jdGlvbiBpbnN0ZWFkIScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmV0Y2hGdW5jdGlvbigpOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIHVua25vd24+KSA9PiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9mZXRjaEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gY3R4ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBGZXRjaCBmdW5jdGlvbiBpcyBub3QgcHJvdmlkZWQgZm9yIGZ1bmN0aW9uICR7dGhpcy5fYWN0aW9uTmFtZUxvbmd9LCB1c2luZyBkZWZhdWx0IGFuZCByZXR1cm5pbmcgY29udGV4dCBpdGVtYCwgY3R4LnBhcmFtZXRlcnM/Lml0ZW0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihjdHgucGFyYW1ldGVycz8uaXRlbSA/IGN0eC5wYXJhbWV0ZXJzLml0ZW0gOiAoe30gYXMgVCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1Ym1pdEZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VibWl0RnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JBY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yQWN0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvckNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvclRpdGxlKHRpdGxlOiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2VkaXRvclRpdGxlID0gdGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUVkaXRvckRhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgZGF0YSBwcm92aWRlciBpZiBubyBtb2RlbCB0eXBlIGlzIHByb3ZpZGVkIGZvciBhY3Rpb24gJHt0aGlzLl9hY3Rpb25OYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IG5ldyBFZGl0b3JEYXRhUHJvdmlkZXIodGhpcy5fbW9kZWwudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpYWxvZ1NpemUoc2l6ZSA9IEFjdGlvbkVkaXRvckRlc2NyaXB0b3IuRGlhbG9nU2l6ZUVudW0uTm9ybWFsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RpYWxvZ1NpemUgPSBzaXplO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpYWxvZ0NsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaWFsb2dDbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoUnVuRnVuY3Rpb248Uz4oZm46IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFN1Ym1pdEZ1bmN0aW9uKGZuIGFzIChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pID0+IE9ic2VydmFibGU8VD4pO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmV0Y2hGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dDxULCBTPikgPT4gT2JzZXJ2YWJsZTxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9mZXRjaEZ1bmN0aW9uID0gZm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU3VibWl0RnVuY3Rpb248Uz4oZm46IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc3VibWl0RnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGZXRjaE5vdGlmaWNhdGlvbkVycm9yKHRpdGxlPzogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBoYXNOb3RpZmljYXRpb24gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc0ZldGNoTm90aWZpY2F0aW9uU3VjY2VzcyA9IGhhc05vdGlmaWNhdGlvbjtcbiAgICAgICAgdGhpcy5fZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRWRpdG9yQWN0aW9uKGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9lZGl0b3JBY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhFZGl0b3JBY3Rpb25zKGFjdGlvbnM6IEFjdGlvbkRlc2NyaXB0b3I8VD5bXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9lZGl0b3JBY3Rpb25zID0gYWN0aW9ucztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhFZGl0b3JDb21wb25lbnQoZWRpdG9yQ29tcG9uZW50OiBUeXBlPGFueT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yQ29tcG9uZW50ID0gZWRpdG9yQ29tcG9uZW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQWN0aW9uRWRpdG9yRGVzY3JpcHRvciB7XG4gICAgZXhwb3J0IGVudW0gRGlhbG9nU2l6ZUVudW0ge1xuICAgICAgICBFeHRyYVNtYWxsLFxuICAgICAgICBTbWFsbCxcbiAgICAgICAgTm9ybWFsLFxuICAgICAgICBMYXJnZSxcbiAgICAgICAgRXh0cmFMYXJnZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25EZXNjcmlwdG9yPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0b3JBY3Rpb246IEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3VibWl0VHlwZTogQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvci5UeXBlRW51bTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPiwgc3VibWl0VHlwZSA9IEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3IuVHlwZUVudW0uU3VibWl0KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvckFjdGlvbi5tb2RlbCwgc3VibWl0VHlwZSA9PT0gQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvci5UeXBlRW51bS5TdWJtaXQgPyAnc3VibWl0JyA6ICdjYW5jZWwnKTtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9uID0gZWRpdG9yQWN0aW9uO1xuICAgICAgICB0aGlzLl9zdWJtaXRUeXBlID0gc3VibWl0VHlwZTtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBBY3Rpb25Qb3NpdGlvbkVudW0uRm9vdGVyUmlnaHQ7XG4gICAgICAgIHRoaXMuX2lzU3R5bGVUZXh0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1Ym1pdFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJtaXRUeXBlO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIFN1Ym1pdCxcbiAgICAgICAgQ2FuY2VsXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yRGV0YWlsc0Rlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2RldGFpbHMnO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yRGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3JEZXNjcmlwdG9yLCBBY3Rpb25FZGl0b3JEZXRhaWxzRGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dDbGljayk7XG4gICAgICAgIHRoaXMud2l0aFJvdXRlVHJpZ2dlcignOml0ZW1JZCcpO1xuICAgICAgICB0aGlzLndpdGhGZXRjaEZ1bmN0aW9uKEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRmV0Y2hPckZhaWwpO1xuICAgICAgICB0aGlzLndpdGhFZGl0b3JBY3Rpb25zKFtuZXcgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcih0aGlzLCBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yLlR5cGVFbnVtLkNhbmNlbCldKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFNlcnZpY2VUeXBlPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZXJ2aWNlRmV0Y2hGdW5jdGlvbihzZXJ2aWNlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXJ2aWNlRmV0Y2hGdW5jdGlvbjxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPiwgZmV0Y2hGbj86IChpZDogSWRUeXBlLCBzZXJ2aWNlPzogUykgPT4gT2JzZXJ2YWJsZTxUPik6IHRoaXMge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgRWRpdG9yRGF0YVByb3ZpZGVyKHRoaXMuX21vZGVsIS50eXBlLCBzZXJ2aWNlVHlwZSk7XG4gICAgICAgIGlmIChmZXRjaEZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aEZldGNoKGZldGNoRm4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yQWRkRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQUNUSU9OX05BTUUgPSAnYWRkJztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yRGVzY3JpcHRvciwgQWN0aW9uRWRpdG9yQWRkRGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Ub29sYmFyTGVmdCk7XG4gICAgICAgIHRoaXMud2l0aFJvdXRlVHJpZ2dlcignYWRkJyk7XG4gICAgICAgIHRoaXMud2l0aFN1Ym1pdEZ1bmN0aW9uKEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuQ3JlYXRlT3JGYWlsKTtcbiAgICAgICAgdGhpcy53aXRoTGV2ZWwoQWN0aW9uTGV2ZWxFbnVtLlN1Y2Nlc3MpO1xuICAgICAgICB0aGlzLndpdGhJY29uKCdwaSBwaS1wbHVzJyk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU2VydmljZVN1Ym1pdEZ1bmN0aW9uKHNlcnZpY2VUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNlcnZpY2VTdWJtaXRGdW5jdGlvbjxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPiwgY3JlYXRlRm4/OiAoaXRlbT86IFQsIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPFQ+LCBmZXRjaEZuPzogKGlkOiBJZFR5cGUsIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBFZGl0b3JEYXRhUHJvdmlkZXIodGhpcy5fbW9kZWwhLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgaWYgKGNyZWF0ZUZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aENyZWF0ZShjcmVhdGVGbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZldGNoRm4pIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoRmV0Y2goZmV0Y2hGbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FZGl0b3JFZGl0RGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQUNUSU9OX05BTUUgPSAnZWRpdCc7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvckRlc2NyaXB0b3IsIEFjdGlvbkVkaXRvckVkaXREZXNjcmlwdG9yLkFDVElPTl9OQU1FKTtcbiAgICAgICAgdGhpcy53aXRoUG9zaXRpb24oQWN0aW9uUG9zaXRpb25FbnVtLlJvd0lubGluZSk7XG4gICAgICAgIHRoaXMud2l0aFRpdGxlKG51bGwpO1xuICAgICAgICB0aGlzLndpdGhSb3V0ZVRyaWdnZXIoJzppdGVtSWQvZWRpdCcpO1xuICAgICAgICB0aGlzLndpdGhGZXRjaEZ1bmN0aW9uKEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRmV0Y2hPckZhaWwpO1xuICAgICAgICB0aGlzLndpdGhTdWJtaXRGdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1blVwZGF0ZU9yRmFpbCk7XG4gICAgICAgIHRoaXMud2l0aEljb24oJ3BpIHBpLXBlbmNpbCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoU2VydmljZVR5cGU8Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNlcnZpY2VTdWJtaXRGdW5jdGlvbihzZXJ2aWNlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXJ2aWNlU3VibWl0RnVuY3Rpb248Uz4oXG4gICAgICAgIHNlcnZpY2VUeXBlOiBUeXBlPFM+LFxuICAgICAgICB1cGRhdGVGbj86IChpZDogSWRUeXBlLCBpdGVtPzogVCwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD4sXG4gICAgICAgIGZldGNoRm4/OiAoaWQ6IElkVHlwZSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD5cbiAgICApOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IEVkaXRvckRhdGFQcm92aWRlcih0aGlzLl9tb2RlbCEudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICBpZiAodXBkYXRlRm4pIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoVXBkYXRlKHVwZGF0ZUZuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmV0Y2hGbikge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhGZXRjaChmZXRjaEZuKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRlbGV0ZURlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25EZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2RlbGV0ZSc7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKG1vZGVsLCBBY3Rpb25EZWxldGVEZXNjcmlwdG9yLkFDVElPTl9OQU1FKTtcbiAgICAgICAgdGhpcy53aXRoUG9zaXRpb24oQWN0aW9uUG9zaXRpb25FbnVtLlJvd0lubGluZSk7XG4gICAgICAgIHRoaXMud2l0aFRpdGxlKG51bGwpO1xuICAgICAgICB0aGlzLndpdGhSdW5GdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkRlbGV0ZU9yRmFpbCk7XG4gICAgICAgIHRoaXMud2l0aExldmVsKEFjdGlvbkxldmVsRW51bS5EYW5nZXIpO1xuICAgICAgICB0aGlzLndpdGhJY29uKCdwaSBwaS10cmFzaCcpO1xuICAgICAgICB0aGlzLndpdGhSdW5Db25maXJtYXRpb24odW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFNlcnZpY2VUeXBlPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZXJ2aWNlRGVsZXRlRnVuY3Rpb24oc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZURlbGV0ZUZ1bmN0aW9uPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+LCBkZWxldGVGbj86IChpZDogSWRUeXBlLCBpdGVtPzogVCwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IEVkaXRvckRhdGFQcm92aWRlcih0aGlzLl9tb2RlbCEudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICBpZiAoZGVsZXRlRm4pIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoRGVsZXRlKGRlbGV0ZUZuKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkxpbmtEZXNjcmlwdG9yPFQ+IGV4dGVuZHMgQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG4gICAgcHJpdmF0ZSBfdXJsID0gJyc7XG4gICAgcHJpdmF0ZSBfcGF0aFNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zSGFuZGxpbmc/OiBRdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgIHByaXZhdGUgX3JlcGxhY2VVcmwgPSBmYWxzZTtcbiAgICBwcml2YXRlIF90YXJnZXQgPSAnX3NlbGYnO1xuICAgIHByaXZhdGUgX2lzU3R5bGVMaW5rID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+IHwgbnVsbCA9IG51bGwsIGFjdGlvbk5hbWUgPSAnbGluaycpIHtcbiAgICAgICAgc3VwZXIobW9kZWwsIGFjdGlvbk5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXRoU2VnbWVudHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0aFNlZ21lbnRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcXVlcnlQYXJhbXMoKTogUGFyYW1zIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5UGFyYW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcXVlcnlQYXJhbXNIYW5kbGluZygpOiBRdWVyeVBhcmFtc0hhbmRsaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5UGFyYW1zSGFuZGxpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXBsYWNlVXJsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVwbGFjZVVybDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhcmdldCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFyZ2V0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNTdHlsZUxpbmsoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1N0eWxlTGluaztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEhyZWYodXJsOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvdXRlckxpbmsoLi4ucGF0aFNlZ21lbnRzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wYXRoU2VnbWVudHMgPSBwYXRoU2VnbWVudHM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUXVlcnlQYXJhbXMocXVlcnlQYXJhbXM6IFBhcmFtcywgcXVlcnlQYXJhbXNIYW5kbGluZz86IFF1ZXJ5UGFyYW1zSGFuZGxpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtcztcbiAgICAgICAgdGhpcy5fcXVlcnlQYXJhbXNIYW5kbGluZyA9IHF1ZXJ5UGFyYW1zSGFuZGxpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUmVwbGFjZVVybChyZXBsYWNlVXJsID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcmVwbGFjZVVybCA9IHJlcGxhY2VVcmw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVGFyZ2V0KHRhcmdldDogJ19zZWxmJyB8ICdfYmxhbmsnID0gJ19zZWxmJyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU3R5bGVMaW5rKGlzU3R5bGVMaW5rOiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzU3R5bGVMaW5rID0gaXNTdHlsZUxpbms7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gQWN0aW9uUG9zaXRpb25FbnVtIHtcbiAgICBUb29sYmFyTGVmdCxcbiAgICBUb29sYmFyUmlnaHQsXG4gICAgVGFibGVIZWFkZXIsXG4gICAgUm93SW5saW5lLFxuICAgIFJvd0NsaWNrLFxuICAgIEZvb3RlckxlZnQsXG4gICAgRm9vdGVyUmlnaHRcbn1cblxuZXhwb3J0IGVudW0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtIHtcbiAgICBPbkNsaWNrLCAvLyBhY3Rpb24gaXMgdHJpZ2dlcmVkIGZvciBhY3RpdmF0aW9uIG9uIGNsaWNrXG4gICAgT25Sb3V0ZSAvLyBhY3Rpb24gaXMgdHJpZ2dlcmVkIGZvciBhY3RpdmF0aW9uIGJ5IHJvdXRlIHVybFxufVxuXG5leHBvcnQgZW51bSBBY3Rpb25UeXBlRW51bSB7XG4gICAgRGlyZWN0LCAvLyBhY3Rpb24gaXMgZGlyZWN0bHkgYWN0aXZhdGVkIGFuZCBleGVjdXRlZFxuICAgIEVkaXRvciAvLyBlZGl0b3IgcHJvdmlkaW5nIG1pZGRsZSBzdGVwIGZvciBhY3RpdmF0aW9uXG59XG5cbmV4cG9ydCBlbnVtIEFjdGlvbkxldmVsRW51bSB7XG4gICAgRGVmYXVsdCxcbiAgICBQcmltYXJ5LFxuICAgIFNlY29uZGFyeSxcbiAgICBJbmZvLFxuICAgIEhlbHAsXG4gICAgU3VjY2VzcyxcbiAgICBXYXJuaW5nLFxuICAgIERhbmdlclxufVxuIl19