@kaspernj/api-maker 1.0.2054 → 1.0.2056

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 (386) hide show
  1. package/build/api.js +65 -213
  2. package/build/attribute-not-loaded-error.js +3 -26
  3. package/build/base-component.js +4 -27
  4. package/build/base-error.js +21 -46
  5. package/build/base-model/attribute.js +15 -22
  6. package/build/base-model/column.js +5 -9
  7. package/build/base-model/reflection.js +12 -52
  8. package/build/base-model/scope.js +9 -46
  9. package/build/base-model.js +584 -837
  10. package/build/bootstrap/attribute-row.js +88 -173
  11. package/build/bootstrap/attribute-rows.js +22 -51
  12. package/build/bootstrap/card.js +77 -160
  13. package/build/bootstrap/checkbox.js +54 -103
  14. package/build/bootstrap/checkboxes.js +117 -203
  15. package/build/bootstrap/index.js +1 -1
  16. package/build/bootstrap/input.js +81 -132
  17. package/build/bootstrap/invalid-feedback.js +19 -47
  18. package/build/bootstrap/paginate.js +100 -165
  19. package/build/bootstrap/radio-buttons.js +44 -81
  20. package/build/bootstrap/select.js +44 -91
  21. package/build/bootstrap/sort-link.js +69 -152
  22. package/build/cable-connection-pool.js +44 -66
  23. package/build/cable-subscription-pool.js +105 -162
  24. package/build/cable-subscription.js +10 -17
  25. package/build/cache-key-generator.js +28 -37
  26. package/build/can-can.js +81 -202
  27. package/build/channels-consumer.js +6 -11
  28. package/build/collection-loader.js +36 -54
  29. package/build/collection.d.ts.map +1 -1
  30. package/build/collection.js +160 -308
  31. package/build/command-submit-data.d.ts +1 -1
  32. package/build/command-submit-data.d.ts.map +1 -1
  33. package/build/command-submit-data.js +30 -39
  34. package/build/commands-pool.js +140 -216
  35. package/build/compose.js +4 -12
  36. package/build/config.js +21 -68
  37. package/build/custom-error.js +5 -30
  38. package/build/data-set-to-attributes.js +6 -42
  39. package/build/deserializer.js +27 -80
  40. package/build/destroy-error.js +5 -30
  41. package/build/devise.js +84 -188
  42. package/build/draggable-sort/controller.js +88 -111
  43. package/build/draggable-sort/index.js +68 -145
  44. package/build/draggable-sort/item.js +132 -198
  45. package/build/error-logger.js +79 -164
  46. package/build/error-messages.js +5 -8
  47. package/build/event-connection.js +24 -62
  48. package/build/event-emitter-listener.js +7 -24
  49. package/build/event-model-class.js +20 -47
  50. package/build/events.js +4 -9
  51. package/build/form.js +66 -154
  52. package/build/history-expo.js +13 -25
  53. package/build/history-react-native.js +15 -27
  54. package/build/history.js +3 -5
  55. package/build/index.js +3 -6
  56. package/build/inputs/attachment.js +72 -123
  57. package/build/inputs/auto-submit.js +16 -55
  58. package/build/inputs/checkbox.js +78 -167
  59. package/build/inputs/checkboxes.js +76 -159
  60. package/build/inputs/id-for-component.js +5 -41
  61. package/build/inputs/input-wrapper.js +8 -27
  62. package/build/inputs/input.js +159 -245
  63. package/build/inputs/money.js +124 -186
  64. package/build/inputs/name-for-component.js +5 -41
  65. package/build/inputs/select.js +69 -123
  66. package/build/instance-of-class-name.js +16 -21
  67. package/build/is-expo.js +9 -11
  68. package/build/key-value-store.js +52 -128
  69. package/build/link.js +52 -115
  70. package/build/logger.js +20 -26
  71. package/build/merge-styles.js +6 -10
  72. package/build/modal.js +15 -62
  73. package/build/model-class-require.js +9 -44
  74. package/build/model-events.js +25 -34
  75. package/build/model-name.js +16 -57
  76. package/build/model-prop-type.js +52 -63
  77. package/build/model-recipes-loader.js +17 -25
  78. package/build/model-recipes-model-loader.d.ts +1 -1
  79. package/build/model-recipes-model-loader.js +130 -208
  80. package/build/models-response-reader.js +25 -66
  81. package/build/models.js +6 -11
  82. package/build/money-formatter.d.ts +2 -2
  83. package/build/money-formatter.d.ts.map +1 -1
  84. package/build/money-formatter.js +46 -56
  85. package/build/not-loaded-error.js +3 -26
  86. package/build/params.js +32 -42
  87. package/build/preloaded.js +19 -59
  88. package/build/resize-observer.js +6 -12
  89. package/build/rest-props-validator.js +5 -7
  90. package/build/result.js +11 -15
  91. package/build/router/route.js +179 -312
  92. package/build/router/switch.js +56 -130
  93. package/build/router.js +34 -94
  94. package/build/routes-native.js +64 -148
  95. package/build/routes.js +26 -80
  96. package/build/run-last.js +20 -25
  97. package/build/serializer.js +29 -34
  98. package/build/services.js +10 -19
  99. package/build/session-status-updater.js +85 -184
  100. package/build/source-maps-loader.d.ts +37 -0
  101. package/build/source-maps-loader.d.ts.map +1 -0
  102. package/build/source-maps-loader.js +103 -225
  103. package/build/super-admin/config-reader.d.ts +2 -2
  104. package/build/super-admin/config-reader.js +42 -83
  105. package/build/super-admin/edit-page/edit-attribute-checkbox.js +53 -115
  106. package/build/super-admin/edit-page/edit-attribute-content.js +47 -77
  107. package/build/super-admin/edit-page/edit-attribute-input.js +57 -119
  108. package/build/super-admin/edit-page/edit-attribute.js +40 -104
  109. package/build/super-admin/edit-page.js +88 -201
  110. package/build/super-admin/has-edit-config.js +7 -13
  111. package/build/super-admin/index-page.js +17 -44
  112. package/build/super-admin/index.js +87 -210
  113. package/build/super-admin/layout/header/index.js +91 -152
  114. package/build/super-admin/layout/index.js +70 -153
  115. package/build/super-admin/layout/menu/index.js +85 -161
  116. package/build/super-admin/layout/menu/menu-content.js +25 -85
  117. package/build/super-admin/layout/menu/menu-item.js +52 -102
  118. package/build/super-admin/layout/no-access.js +19 -45
  119. package/build/super-admin/model-class-table.js +45 -129
  120. package/build/super-admin/models.js +6 -42
  121. package/build/super-admin/show-nav.js +27 -89
  122. package/build/super-admin/show-page/belongs-to-attribute-row.js +18 -76
  123. package/build/super-admin/show-page/index.js +101 -187
  124. package/build/super-admin/show-reflection-actions.js +39 -100
  125. package/build/super-admin/show-reflection-link.js +27 -99
  126. package/build/super-admin/show-reflection-page.js +34 -97
  127. package/build/table/column-content.js +77 -121
  128. package/build/table/column-identifier.js +7 -11
  129. package/build/table/column-visible.js +2 -5
  130. package/build/table/components/column.js +13 -60
  131. package/build/table/components/flat-list.js +13 -60
  132. package/build/table/components/header.js +15 -62
  133. package/build/table/components/row.js +16 -63
  134. package/build/table/filters/attribute-element.js +34 -62
  135. package/build/table/filters/filter-form.js +280 -483
  136. package/build/table/filters/filter.js +45 -73
  137. package/build/table/filters/index.js +95 -139
  138. package/build/table/filters/load-search-modal.js +64 -212
  139. package/build/table/filters/reflection-element.js +27 -55
  140. package/build/table/filters/save-search-modal.js +44 -140
  141. package/build/table/filters/scope-element.js +28 -56
  142. package/build/table/header-column-content.js +33 -71
  143. package/build/table/header-column.js +89 -218
  144. package/build/table/header-select.js +45 -77
  145. package/build/table/model-callback-args.js +5 -41
  146. package/build/table/model-column.js +59 -144
  147. package/build/table/model-row.js +75 -187
  148. package/build/table/select-calculator.js +27 -86
  149. package/build/table/settings/column-row.js +66 -186
  150. package/build/table/settings/download-action.js +38 -74
  151. package/build/table/settings/index.js +38 -102
  152. package/build/table/table-settings.js +185 -323
  153. package/build/table/table.js +583 -781
  154. package/build/table/use-sorting.js +16 -35
  155. package/build/table/widths.js +32 -38
  156. package/build/table/worker-plugins-check-all-checkbox.js +77 -225
  157. package/build/table/worker-plugins-checkbox.js +74 -185
  158. package/build/translated-attributes.js +6 -11
  159. package/build/translated-collections.js +11 -20
  160. package/build/updated-attribute.js +47 -120
  161. package/build/url-encode.js +6 -12
  162. package/build/use-breakpoint.js +43 -95
  163. package/build/use-can-can.js +30 -92
  164. package/build/use-collection.js +119 -229
  165. package/build/use-created-event.js +27 -44
  166. package/build/use-current-user-context.js +57 -151
  167. package/build/use-current-user.js +14 -32
  168. package/build/use-destroyed-event.js +22 -43
  169. package/build/use-event-emitter.d.ts +1 -2
  170. package/build/use-event-emitter.d.ts.map +1 -1
  171. package/build/use-event-emitter.js +10 -16
  172. package/build/use-event-listener.js +13 -22
  173. package/build/use-input.js +49 -69
  174. package/build/use-model-event.js +22 -43
  175. package/build/use-model.js +96 -199
  176. package/build/use-resize-observer.js +11 -21
  177. package/build/use-router.js +65 -107
  178. package/build/use-screen-layout.js +17 -19
  179. package/build/use-styles.js +24 -75
  180. package/build/use-updated-event.js +22 -44
  181. package/build/use-validation-errors.js +12 -18
  182. package/build/utils/button.js +86 -136
  183. package/build/utils/card.js +31 -106
  184. package/build/utils/checkbox.js +51 -112
  185. package/build/utils/checkboxes.js +109 -182
  186. package/build/utils/default-style.js +29 -103
  187. package/build/utils/header.js +8 -35
  188. package/build/utils/icon.js +36 -117
  189. package/build/utils/invalid-feedback.js +16 -43
  190. package/build/utils/modal.js +25 -108
  191. package/build/utils/text.js +10 -37
  192. package/build/validation-error.js +31 -89
  193. package/build/validation-errors.js +61 -111
  194. package/build/with-api-maker.js +15 -67
  195. package/build/with-collection.js +14 -64
  196. package/build/with-current-user.js +7 -23
  197. package/build/with-model.js +11 -27
  198. package/build/with-router.js +8 -35
  199. package/package.json +4 -3
  200. package/build/api.js.map +0 -1
  201. package/build/attribute-not-loaded-error.js.map +0 -1
  202. package/build/base-component.js.map +0 -1
  203. package/build/base-error.js.map +0 -1
  204. package/build/base-model/attribute.js.map +0 -1
  205. package/build/base-model/column.js.map +0 -1
  206. package/build/base-model/reflection.js.map +0 -1
  207. package/build/base-model/scope.js.map +0 -1
  208. package/build/base-model.js.map +0 -1
  209. package/build/bootstrap/attribute-row.js.map +0 -1
  210. package/build/bootstrap/attribute-rows.js.map +0 -1
  211. package/build/bootstrap/card.js.map +0 -1
  212. package/build/bootstrap/checkbox.js.map +0 -1
  213. package/build/bootstrap/checkboxes.js.map +0 -1
  214. package/build/bootstrap/index.js.map +0 -1
  215. package/build/bootstrap/input.js.map +0 -1
  216. package/build/bootstrap/invalid-feedback.js.map +0 -1
  217. package/build/bootstrap/paginate.js.map +0 -1
  218. package/build/bootstrap/radio-buttons.js.map +0 -1
  219. package/build/bootstrap/select.js.map +0 -1
  220. package/build/bootstrap/sort-link.js.map +0 -1
  221. package/build/cable-connection-pool.js.map +0 -1
  222. package/build/cable-subscription-pool.js.map +0 -1
  223. package/build/cable-subscription.js.map +0 -1
  224. package/build/cache-key-generator.js.map +0 -1
  225. package/build/can-can.js.map +0 -1
  226. package/build/channels-consumer.js.map +0 -1
  227. package/build/collection-loader.js.map +0 -1
  228. package/build/collection.js.map +0 -1
  229. package/build/command-submit-data.js.map +0 -1
  230. package/build/commands-pool.js.map +0 -1
  231. package/build/compose.js.map +0 -1
  232. package/build/config.js.map +0 -1
  233. package/build/custom-error.js.map +0 -1
  234. package/build/data-set-to-attributes.js.map +0 -1
  235. package/build/deserializer.js.map +0 -1
  236. package/build/destroy-error.js.map +0 -1
  237. package/build/devise.js.map +0 -1
  238. package/build/draggable-sort/controller.js.map +0 -1
  239. package/build/draggable-sort/index.js.map +0 -1
  240. package/build/draggable-sort/item.js.map +0 -1
  241. package/build/error-logger.js.map +0 -1
  242. package/build/error-messages.js.map +0 -1
  243. package/build/event-connection.js.map +0 -1
  244. package/build/event-emitter-listener.js.map +0 -1
  245. package/build/event-model-class.js.map +0 -1
  246. package/build/events.js.map +0 -1
  247. package/build/form.js.map +0 -1
  248. package/build/history-expo.js.map +0 -1
  249. package/build/history-react-native.js.map +0 -1
  250. package/build/history.js.map +0 -1
  251. package/build/index.js.map +0 -1
  252. package/build/inputs/attachment.js.map +0 -1
  253. package/build/inputs/auto-submit.js.map +0 -1
  254. package/build/inputs/checkbox.js.map +0 -1
  255. package/build/inputs/checkboxes.js.map +0 -1
  256. package/build/inputs/id-for-component.js.map +0 -1
  257. package/build/inputs/input-wrapper.js.map +0 -1
  258. package/build/inputs/input.js.map +0 -1
  259. package/build/inputs/money.js.map +0 -1
  260. package/build/inputs/name-for-component.js.map +0 -1
  261. package/build/inputs/select.js.map +0 -1
  262. package/build/instance-of-class-name.js.map +0 -1
  263. package/build/is-expo.js.map +0 -1
  264. package/build/key-value-store.js.map +0 -1
  265. package/build/link.js.map +0 -1
  266. package/build/logger.js.map +0 -1
  267. package/build/merge-styles.js.map +0 -1
  268. package/build/modal.js.map +0 -1
  269. package/build/model-class-require.js.map +0 -1
  270. package/build/model-events.js.map +0 -1
  271. package/build/model-name.js.map +0 -1
  272. package/build/model-prop-type.js.map +0 -1
  273. package/build/model-recipes-loader.js.map +0 -1
  274. package/build/model-recipes-model-loader.js.map +0 -1
  275. package/build/models-response-reader.js.map +0 -1
  276. package/build/models.js.map +0 -1
  277. package/build/money-formatter.js.map +0 -1
  278. package/build/not-loaded-error.js.map +0 -1
  279. package/build/params.js.map +0 -1
  280. package/build/preloaded.js.map +0 -1
  281. package/build/resize-observer.js.map +0 -1
  282. package/build/rest-props-validator.js.map +0 -1
  283. package/build/result.js.map +0 -1
  284. package/build/router/route.js.map +0 -1
  285. package/build/router/switch.js.map +0 -1
  286. package/build/router.js.map +0 -1
  287. package/build/routes-native.js.map +0 -1
  288. package/build/routes.js.map +0 -1
  289. package/build/run-last.js.map +0 -1
  290. package/build/serializer.js.map +0 -1
  291. package/build/services.js.map +0 -1
  292. package/build/session-status-updater.js.map +0 -1
  293. package/build/source-maps-loader.js.map +0 -1
  294. package/build/super-admin/config-reader.js.map +0 -1
  295. package/build/super-admin/edit-page/edit-attribute-checkbox.js.map +0 -1
  296. package/build/super-admin/edit-page/edit-attribute-content.js.map +0 -1
  297. package/build/super-admin/edit-page/edit-attribute-input.js.map +0 -1
  298. package/build/super-admin/edit-page/edit-attribute.js.map +0 -1
  299. package/build/super-admin/edit-page.js.map +0 -1
  300. package/build/super-admin/has-edit-config.js.map +0 -1
  301. package/build/super-admin/index-page.js.map +0 -1
  302. package/build/super-admin/index.js.map +0 -1
  303. package/build/super-admin/layout/header/index.js.map +0 -1
  304. package/build/super-admin/layout/index.js.map +0 -1
  305. package/build/super-admin/layout/menu/index.js.map +0 -1
  306. package/build/super-admin/layout/menu/menu-content.js.map +0 -1
  307. package/build/super-admin/layout/menu/menu-item.js.map +0 -1
  308. package/build/super-admin/layout/no-access.js.map +0 -1
  309. package/build/super-admin/model-class-table.js.map +0 -1
  310. package/build/super-admin/models.js.map +0 -1
  311. package/build/super-admin/show-nav.js.map +0 -1
  312. package/build/super-admin/show-page/belongs-to-attribute-row.js.map +0 -1
  313. package/build/super-admin/show-page/index.js.map +0 -1
  314. package/build/super-admin/show-reflection-actions.js.map +0 -1
  315. package/build/super-admin/show-reflection-link.js.map +0 -1
  316. package/build/super-admin/show-reflection-page.js.map +0 -1
  317. package/build/table/column-content.js.map +0 -1
  318. package/build/table/column-identifier.js.map +0 -1
  319. package/build/table/column-visible.js.map +0 -1
  320. package/build/table/components/column.js.map +0 -1
  321. package/build/table/components/flat-list.js.map +0 -1
  322. package/build/table/components/header.js.map +0 -1
  323. package/build/table/components/row.js.map +0 -1
  324. package/build/table/filters/attribute-element.js.map +0 -1
  325. package/build/table/filters/filter-form.js.map +0 -1
  326. package/build/table/filters/filter.js.map +0 -1
  327. package/build/table/filters/index.js.map +0 -1
  328. package/build/table/filters/load-search-modal.js.map +0 -1
  329. package/build/table/filters/reflection-element.js.map +0 -1
  330. package/build/table/filters/save-search-modal.js.map +0 -1
  331. package/build/table/filters/scope-element.js.map +0 -1
  332. package/build/table/header-column-content.js.map +0 -1
  333. package/build/table/header-column.js.map +0 -1
  334. package/build/table/header-select.js.map +0 -1
  335. package/build/table/model-callback-args.js.map +0 -1
  336. package/build/table/model-column.js.map +0 -1
  337. package/build/table/model-row.js.map +0 -1
  338. package/build/table/select-calculator.js.map +0 -1
  339. package/build/table/settings/column-row.js.map +0 -1
  340. package/build/table/settings/download-action.js.map +0 -1
  341. package/build/table/settings/index.js.map +0 -1
  342. package/build/table/table-settings.js.map +0 -1
  343. package/build/table/table.js.map +0 -1
  344. package/build/table/use-sorting.js.map +0 -1
  345. package/build/table/widths.js.map +0 -1
  346. package/build/table/worker-plugins-check-all-checkbox.js.map +0 -1
  347. package/build/table/worker-plugins-checkbox.js.map +0 -1
  348. package/build/translated-attributes.js.map +0 -1
  349. package/build/translated-collections.js.map +0 -1
  350. package/build/updated-attribute.js.map +0 -1
  351. package/build/url-encode.js.map +0 -1
  352. package/build/use-breakpoint.js.map +0 -1
  353. package/build/use-can-can.js.map +0 -1
  354. package/build/use-collection.js.map +0 -1
  355. package/build/use-created-event.js.map +0 -1
  356. package/build/use-current-user-context.js.map +0 -1
  357. package/build/use-current-user.js.map +0 -1
  358. package/build/use-destroyed-event.js.map +0 -1
  359. package/build/use-event-emitter.js.map +0 -1
  360. package/build/use-event-listener.js.map +0 -1
  361. package/build/use-input.js.map +0 -1
  362. package/build/use-model-event.js.map +0 -1
  363. package/build/use-model.js.map +0 -1
  364. package/build/use-resize-observer.js.map +0 -1
  365. package/build/use-router.js.map +0 -1
  366. package/build/use-screen-layout.js.map +0 -1
  367. package/build/use-styles.js.map +0 -1
  368. package/build/use-updated-event.js.map +0 -1
  369. package/build/use-validation-errors.js.map +0 -1
  370. package/build/utils/button.js.map +0 -1
  371. package/build/utils/card.js.map +0 -1
  372. package/build/utils/checkbox.js.map +0 -1
  373. package/build/utils/checkboxes.js.map +0 -1
  374. package/build/utils/default-style.js.map +0 -1
  375. package/build/utils/header.js.map +0 -1
  376. package/build/utils/icon.js.map +0 -1
  377. package/build/utils/invalid-feedback.js.map +0 -1
  378. package/build/utils/modal.js.map +0 -1
  379. package/build/utils/text.js.map +0 -1
  380. package/build/validation-error.js.map +0 -1
  381. package/build/validation-errors.js.map +0 -1
  382. package/build/with-api-maker.js.map +0 -1
  383. package/build/with-collection.js.map +0 -1
  384. package/build/with-current-user.js.map +0 -1
  385. package/build/with-model.js.map +0 -1
  386. package/build/with-router.js.map +0 -1
@@ -1,346 +1,208 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
- return new (P || (P = Promise))(function (resolve, reject) {
38
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
- step((generator = generator.apply(thisArg, _arguments || [])).next());
42
- });
43
- };
44
- var __generator = (this && this.__generator) || function (thisArg, body) {
45
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
46
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47
- function verb(n) { return function (v) { return step([n, v]); }; }
48
- function step(op) {
49
- if (f) throw new TypeError("Generator is already executing.");
50
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
51
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52
- if (y = 0, t) op = [op[0] & 2, t.value];
53
- switch (op[0]) {
54
- case 0: case 1: t = op; break;
55
- case 4: _.label++; return { value: op[1], done: false };
56
- case 5: _.label++; y = op[1]; op = [0]; continue;
57
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
58
- default:
59
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63
- if (t[2]) _.ops.pop();
64
- _.trys.pop(); continue;
65
- }
66
- op = body.call(thisArg, _);
67
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
- }
70
- };
71
- var __importDefault = (this && this.__importDefault) || function (mod) {
72
- return (mod && mod.__esModule) ? mod : { "default": mod };
73
- };
74
- Object.defineProperty(exports, "__esModule", { value: true });
75
- var column_identifier_js_1 = __importDefault(require("./column-identifier.js"));
76
- var column_visible_js_1 = __importDefault(require("./column-visible.js"));
77
- var diggerize_1 = require("diggerize");
78
- var inflection = __importStar(require("inflection"));
79
- var logger_js_1 = __importDefault(require("../logger.js"));
80
- var epic_locks_1 = require("epic-locks");
81
- var object_to_formdata_1 = require("object-to-formdata");
82
- var models_js_1 = require("models.js");
83
- var uuid_1 = require("uuid");
84
- var logger = new logger_js_1.default({ name: "ApiMaker / TableSettings" });
1
+ import columnIdentifier from "./column-identifier.js";
2
+ import columnVisible from "./column-visible.js";
3
+ import { digg } from "diggerize";
4
+ import * as inflection from "inflection";
5
+ import Logger from "../logger.js";
6
+ import { ReadersWriterLock } from "epic-locks";
7
+ import { serialize as objectToFormData } from "object-to-formdata";
8
+ import { TableSetting } from "models.js";
9
+ import { v4 as uuidv4 } from "uuid";
10
+ const logger = new Logger({ name: "ApiMaker / TableSettings" });
85
11
  // Have a lock for each unique table identifier
86
- var tableSettingsLocks = {};
87
- var ApiMakerTableSettings = /** @class */ (function () {
88
- function ApiMakerTableSettings(_a) {
89
- var table = _a.table;
90
- var _this = this;
91
- this.columns = function () { return (0, diggerize_1.digg)(_this, "table", "columnsAsArray")(); };
92
- this.currentUser = function () { return (0, diggerize_1.digg)(_this, "table", "props", "currentUser"); };
93
- this.identifier = function () { return (0, diggerize_1.digg)(_this, "table", "state", "identifier"); };
94
- this.preparedColumns = function (tableSetting) {
95
- var columns = _this.table.columnsAsArray();
96
- var ordered = _this.orderedTableSettingColumns(tableSetting);
97
- var result = {
98
- columns: [],
99
- preload: []
100
- };
101
- if (!ordered)
102
- return;
103
- var _loop_1 = function (tableSettingColumn) {
104
- var column = columns.find(function (column) { return (0, column_identifier_js_1.default)(column) == tableSettingColumn.identifier(); });
105
- result.columns.push({ column: column, tableSettingColumn: tableSettingColumn });
106
- // Add needed preloads if column is visible
107
- if ((0, column_visible_js_1.default)(column, tableSettingColumn)) {
108
- if (column.path) {
109
- var preload = column.path.map(function (pathPart) { return inflection.underscore(pathPart); }).join(".");
110
- if (!result.preload.includes(preload))
111
- result.preload.push(preload);
112
- }
113
- }
114
- };
115
- for (var _i = 0, ordered_1 = ordered; _i < ordered_1.length; _i++) {
116
- var tableSettingColumn = ordered_1[_i];
117
- _loop_1(tableSettingColumn);
118
- }
119
- return result;
120
- };
121
- this.orderedTableSettingColumns = function (tableSetting) {
122
- return tableSetting
123
- .columns()
124
- .loaded()
125
- .sort(function (tableSettingColumn1, tableSettingColumn2) { return tableSettingColumn1.position() - tableSettingColumn2.position(); });
126
- };
127
- this.loadExistingOrCreateTableSettings = function () { return __awaiter(_this, void 0, void 0, function () {
128
- var _this = this;
129
- return __generator(this, function (_a) {
130
- switch (_a.label) {
131
- case 0: return [4 /*yield*/, this.tableSettingsLock.write(function () { return __awaiter(_this, void 0, void 0, function () {
132
- var tableSetting;
133
- return __generator(this, function (_a) {
134
- switch (_a.label) {
135
- case 0: return [4 /*yield*/, this.loadTableSetting()];
136
- case 1:
137
- tableSetting = _a.sent();
138
- if (!tableSetting) return [3 /*break*/, 3];
139
- return [4 /*yield*/, this.updateTableSetting(tableSetting)];
140
- case 2:
141
- tableSetting = _a.sent();
142
- return [3 /*break*/, 5];
143
- case 3: return [4 /*yield*/, this.createInitialTableSetting()];
144
- case 4:
145
- tableSetting = _a.sent();
146
- _a.label = 5;
147
- case 5: return [2 /*return*/, tableSetting];
148
- }
149
- });
150
- }); })];
151
- case 1: return [2 /*return*/, _a.sent()];
152
- }
153
- });
154
- }); };
155
- this.loadTableSetting = function () { return __awaiter(_this, void 0, void 0, function () {
156
- var tableSetting;
157
- return __generator(this, function (_a) {
158
- switch (_a.label) {
159
- case 0:
160
- if (!models_js_1.TableSetting)
161
- throw new Error("TableSetting model isn't globally available");
162
- return [4 /*yield*/, models_js_1.TableSetting
163
- .ransack({
164
- identifier_eq: this.identifier(),
165
- user_id_eq: this.currentUserIdOrFallback(),
166
- user_type_eq: this.currentUserTypeOrFallback()
167
- })
168
- .preload("columns")
169
- .first()];
170
- case 1:
171
- tableSetting = _a.sent();
172
- return [2 /*return*/, tableSetting];
173
- }
174
- });
175
- }); };
176
- this.createInitialTableSetting = function () { return __awaiter(_this, void 0, void 0, function () {
177
- var tableSettingData, columns, columnKey, column, identifier, columnData, tableSetting, tableSettingFormData, reloadedTableSetting;
178
- return __generator(this, function (_a) {
179
- switch (_a.label) {
180
- case 0:
181
- tableSettingData = {
182
- identifier: this.identifier(),
183
- user_id: this.currentUserIdOrFallback(),
184
- user_type: this.currentUserTypeOrFallback(),
185
- columns_attributes: {}
186
- };
187
- columns = this.columns();
188
- for (columnKey in columns) {
189
- column = (0, diggerize_1.digg)(columns, columnKey);
190
- identifier = (0, column_identifier_js_1.default)(column);
191
- columnData = this.columnSaveData(column, { identifier: identifier, position: columnKey });
192
- tableSettingData.columns_attributes[columnKey] = columnData;
193
- }
194
- tableSetting = new models_js_1.TableSetting();
195
- tableSettingFormData = (0, object_to_formdata_1.serialize)({ table_setting: tableSettingData });
196
- return [4 /*yield*/, tableSetting.saveRaw(tableSettingFormData)];
197
- case 1:
198
- _a.sent();
199
- return [4 /*yield*/, this.loadTableSetting()];
200
- case 2:
201
- reloadedTableSetting = _a.sent();
202
- return [2 /*return*/, reloadedTableSetting];
203
- }
204
- });
205
- }); };
206
- this.updateTableSetting = function (tableSetting) { return __awaiter(_this, void 0, void 0, function () {
207
- var changedAttributesList, columns, columnsData, tableSettingData, columnsKeyCount, changed, _loop_2, this_1, _i, columns_1, column, _loop_3, _a, _b, tableSettingColumn, tableSettingFormData;
208
- return __generator(this, function (_c) {
209
- switch (_c.label) {
210
- case 0:
211
- changedAttributesList = ["attributeName", "sortKey"];
212
- columns = this.columns();
213
- columnsData = {};
214
- tableSettingData = { columns_attributes: columnsData };
215
- columnsKeyCount = 0;
216
- changed = false;
217
- _loop_2 = function (column) {
218
- var identifier = (0, column_identifier_js_1.default)(column);
219
- var tableSettingColumn = tableSetting.columns().loaded().find(function (tableSettingColumn) { return tableSettingColumn.identifier() == identifier; });
220
- if (!tableSettingColumn) {
221
- var columnKey = ++columnsKeyCount;
222
- columnsData[columnKey] = this_1.columnSaveData(column, {
223
- identifier: identifier,
224
- position: tableSetting.columns().loaded().length + columnKey
225
- });
226
- logger.debug(function () { return "Changed because of new column: ".concat(column.label); });
227
- changed = true;
228
- }
229
- };
230
- this_1 = this;
231
- // Add missing columns
232
- for (_i = 0, columns_1 = columns; _i < columns_1.length; _i++) {
233
- column = columns_1[_i];
234
- _loop_2(column);
235
- }
236
- _loop_3 = function (tableSettingColumn) {
237
- var column = columns.find(function (column) { return (0, column_identifier_js_1.default)(column) == tableSettingColumn.identifier(); });
238
- if (column) {
239
- // TODO: Update column if changed
240
- var columnChanged = false;
241
- var _loop_4 = function (changedAttribute) {
242
- var columnAttributeName = void 0;
243
- if (changedAttribute == "attributeName") {
244
- columnAttributeName = "attribute";
245
- }
246
- else {
247
- columnAttributeName = changedAttribute;
248
- }
249
- var oldAttributeValue = tableSettingColumn[changedAttribute]();
250
- var newAttributeValue = column[columnAttributeName];
251
- if (oldAttributeValue != newAttributeValue) {
252
- logger.debug(function () { return "".concat(changedAttribute, " changed from ").concat(oldAttributeValue, " to ").concat(newAttributeValue, " on column: ").concat(column.label); });
253
- columnChanged = true;
254
- }
255
- };
256
- for (var _d = 0, changedAttributesList_1 = changedAttributesList; _d < changedAttributesList_1.length; _d++) {
257
- var changedAttribute = changedAttributesList_1[_d];
258
- _loop_4(changedAttribute);
259
- }
260
- var columnPathAsString_1 = JSON.stringify(column.path);
261
- var tableSettingColumnPathAsString_1 = tableSettingColumn.path();
262
- if (columnPathAsString_1 != tableSettingColumnPathAsString_1) {
263
- logger.debug(function () { return "Path changed on ".concat(column.label, " from ").concat(columnPathAsString_1, " to ").concat(tableSettingColumnPathAsString_1); });
264
- columnChanged = true;
265
- }
266
- if (columnChanged) {
267
- var columnKey = ++columnsKeyCount;
268
- changed = true;
269
- columnsData[columnKey] = {
270
- attribute_name: column.attributeName,
271
- id: tableSettingColumn.id(),
272
- path: column.path,
273
- sort_key: column.sortKey
274
- };
275
- }
276
- }
277
- else {
278
- // Removed saved columns no longer found
279
- var columnKey = ++columnsKeyCount;
280
- columnsData[columnKey] = {
281
- id: tableSettingColumn.id(),
282
- _destroy: true
283
- };
284
- changed = true;
285
- logger.debug(function () { return "Column got removed: ".concat(tableSettingColumn.identifier()); });
286
- }
287
- };
288
- for (_a = 0, _b = tableSetting.columns().loaded(); _a < _b.length; _a++) {
289
- tableSettingColumn = _b[_a];
290
- _loop_3(tableSettingColumn);
291
- }
292
- if (!changed) return [3 /*break*/, 2];
293
- tableSettingFormData = (0, object_to_formdata_1.serialize)({ table_setting: tableSettingData });
294
- return [4 /*yield*/, tableSetting.saveRaw(tableSettingFormData)];
295
- case 1:
296
- _c.sent();
297
- _c.label = 2;
298
- case 2: return [2 /*return*/, tableSetting];
299
- }
300
- });
301
- }); };
12
+ const tableSettingsLocks = {};
13
+ export default class ApiMakerTableSettings {
14
+ constructor({ table }) {
302
15
  this.table = table;
303
16
  this.setTableSettingsLock();
304
17
  }
305
- ApiMakerTableSettings.prototype.setTableSettingsLock = function () {
306
- var identifier = this.identifier();
18
+ setTableSettingsLock() {
19
+ const identifier = this.identifier();
307
20
  if (!(identifier in tableSettingsLocks)) {
308
- tableSettingsLocks[identifier] = new epic_locks_1.ReadersWriterLock();
21
+ tableSettingsLocks[identifier] = new ReadersWriterLock();
22
+ }
23
+ this.tableSettingsLock = digg(tableSettingsLocks, identifier);
24
+ }
25
+ columns = () => digg(this, "table", "columnsAsArray")();
26
+ currentUser = () => digg(this, "table", "props", "currentUser");
27
+ identifier = () => digg(this, "table", "state", "identifier");
28
+ preparedColumns = (tableSetting) => {
29
+ const columns = this.table.columnsAsArray();
30
+ const ordered = this.orderedTableSettingColumns(tableSetting);
31
+ const result = {
32
+ columns: [],
33
+ preload: []
34
+ };
35
+ if (!ordered)
36
+ return;
37
+ for (const tableSettingColumn of ordered) {
38
+ const column = columns.find((column) => columnIdentifier(column) == tableSettingColumn.identifier());
39
+ result.columns.push({ column, tableSettingColumn });
40
+ // Add needed preloads if column is visible
41
+ if (columnVisible(column, tableSettingColumn)) {
42
+ if (column.path) {
43
+ const preload = column.path.map((pathPart) => inflection.underscore(pathPart)).join(".");
44
+ if (!result.preload.includes(preload))
45
+ result.preload.push(preload);
46
+ }
47
+ }
309
48
  }
310
- this.tableSettingsLock = (0, diggerize_1.digg)(tableSettingsLocks, identifier);
49
+ return result;
50
+ };
51
+ orderedTableSettingColumns = (tableSetting) => {
52
+ return tableSetting
53
+ .columns()
54
+ .loaded()
55
+ .sort((tableSettingColumn1, tableSettingColumn2) => tableSettingColumn1.position() - tableSettingColumn2.position());
311
56
  };
312
- ApiMakerTableSettings.prototype.currentUserIdOrFallback = function () {
313
- var currentUser = this.currentUser();
57
+ loadExistingOrCreateTableSettings = async () => {
58
+ return await this.tableSettingsLock.write(async () => {
59
+ let tableSetting = await this.loadTableSetting();
60
+ if (tableSetting) {
61
+ tableSetting = await this.updateTableSetting(tableSetting);
62
+ }
63
+ else {
64
+ tableSetting = await this.createInitialTableSetting();
65
+ }
66
+ return tableSetting;
67
+ });
68
+ };
69
+ loadTableSetting = async () => {
70
+ if (!TableSetting)
71
+ throw new Error("TableSetting model isn't globally available");
72
+ const tableSetting = await TableSetting
73
+ .ransack({
74
+ identifier_eq: this.identifier(),
75
+ user_id_eq: this.currentUserIdOrFallback(),
76
+ user_type_eq: this.currentUserTypeOrFallback()
77
+ })
78
+ .preload("columns")
79
+ .first();
80
+ return tableSetting;
81
+ };
82
+ currentUserIdOrFallback() {
83
+ const currentUser = this.currentUser();
314
84
  if (currentUser)
315
85
  return currentUser.id();
316
86
  return this.anonymouseUserId();
317
- };
318
- ApiMakerTableSettings.prototype.currentUserTypeOrFallback = function () {
319
- var currentUser = this.currentUser();
87
+ }
88
+ currentUserTypeOrFallback() {
89
+ const currentUser = this.currentUser();
320
90
  if (currentUser)
321
- return (0, diggerize_1.digg)(currentUser.modelClassData(), "name");
91
+ return digg(currentUser.modelClassData(), "name");
322
92
  return null;
323
- };
324
- ApiMakerTableSettings.prototype.anonymouseUserId = function () {
325
- var variableName = "ApiMakerTableAnonymousUserId-".concat(this.identifier());
93
+ }
94
+ anonymouseUserId() {
95
+ const variableName = `ApiMakerTableAnonymousUserId-${this.identifier()}`;
326
96
  if (!(variableName in localStorage)) {
327
- var generatedId = (0, uuid_1.v4)();
97
+ const generatedId = uuidv4();
328
98
  localStorage[variableName] = generatedId;
329
99
  }
330
- return (0, diggerize_1.digg)(localStorage, variableName);
100
+ return digg(localStorage, variableName);
101
+ }
102
+ createInitialTableSetting = async () => {
103
+ const tableSettingData = {
104
+ identifier: this.identifier(),
105
+ user_id: this.currentUserIdOrFallback(),
106
+ user_type: this.currentUserTypeOrFallback(),
107
+ columns_attributes: {}
108
+ };
109
+ const columns = this.columns();
110
+ for (const columnKey in columns) {
111
+ const column = digg(columns, columnKey);
112
+ const identifier = columnIdentifier(column);
113
+ const columnData = this.columnSaveData(column, { identifier, position: columnKey });
114
+ tableSettingData.columns_attributes[columnKey] = columnData;
115
+ }
116
+ const tableSetting = new TableSetting();
117
+ const tableSettingFormData = objectToFormData({ table_setting: tableSettingData });
118
+ await tableSetting.saveRaw(tableSettingFormData);
119
+ const reloadedTableSetting = await this.loadTableSetting();
120
+ return reloadedTableSetting;
331
121
  };
332
- ApiMakerTableSettings.prototype.columnSaveData = function (column, _a) {
333
- var identifier = _a.identifier, position = _a.position;
122
+ columnSaveData(column, { identifier, position }) {
334
123
  return {
335
124
  attribute_name: column.attribute,
336
- identifier: identifier,
125
+ identifier,
337
126
  path: column.path,
338
- position: position,
127
+ position,
339
128
  sort_key: column.sortKey,
340
129
  visible: null
341
130
  };
131
+ }
132
+ updateTableSetting = async (tableSetting) => {
133
+ const changedAttributesList = ["attributeName", "sortKey"];
134
+ const columns = this.columns();
135
+ const columnsData = {};
136
+ const tableSettingData = { columns_attributes: columnsData };
137
+ let columnsKeyCount = 0;
138
+ let changed = false;
139
+ // Add missing columns
140
+ for (const column of columns) {
141
+ const identifier = columnIdentifier(column);
142
+ const tableSettingColumn = tableSetting.columns().loaded().find((tableSettingColumn) => tableSettingColumn.identifier() == identifier);
143
+ if (!tableSettingColumn) {
144
+ const columnKey = ++columnsKeyCount;
145
+ columnsData[columnKey] = this.columnSaveData(column, {
146
+ identifier,
147
+ position: tableSetting.columns().loaded().length + columnKey
148
+ });
149
+ logger.debug(() => `Changed because of new column: ${column.label}`);
150
+ changed = true;
151
+ }
152
+ }
153
+ for (const tableSettingColumn of tableSetting.columns().loaded()) {
154
+ const column = columns.find((column) => columnIdentifier(column) == tableSettingColumn.identifier());
155
+ if (column) {
156
+ // TODO: Update column if changed
157
+ let columnChanged = false;
158
+ for (const changedAttribute of changedAttributesList) {
159
+ let columnAttributeName;
160
+ if (changedAttribute == "attributeName") {
161
+ columnAttributeName = "attribute";
162
+ }
163
+ else {
164
+ columnAttributeName = changedAttribute;
165
+ }
166
+ const oldAttributeValue = tableSettingColumn[changedAttribute]();
167
+ const newAttributeValue = column[columnAttributeName];
168
+ if (oldAttributeValue != newAttributeValue) {
169
+ logger.debug(() => `${changedAttribute} changed from ${oldAttributeValue} to ${newAttributeValue} on column: ${column.label}`);
170
+ columnChanged = true;
171
+ }
172
+ }
173
+ const columnPathAsString = JSON.stringify(column.path);
174
+ const tableSettingColumnPathAsString = tableSettingColumn.path();
175
+ if (columnPathAsString != tableSettingColumnPathAsString) {
176
+ logger.debug(() => `Path changed on ${column.label} from ${columnPathAsString} to ${tableSettingColumnPathAsString}`);
177
+ columnChanged = true;
178
+ }
179
+ if (columnChanged) {
180
+ const columnKey = ++columnsKeyCount;
181
+ changed = true;
182
+ columnsData[columnKey] = {
183
+ attribute_name: column.attributeName,
184
+ id: tableSettingColumn.id(),
185
+ path: column.path,
186
+ sort_key: column.sortKey
187
+ };
188
+ }
189
+ }
190
+ else {
191
+ // Removed saved columns no longer found
192
+ const columnKey = ++columnsKeyCount;
193
+ columnsData[columnKey] = {
194
+ id: tableSettingColumn.id(),
195
+ _destroy: true
196
+ };
197
+ changed = true;
198
+ logger.debug(() => `Column got removed: ${tableSettingColumn.identifier()}`);
199
+ }
200
+ }
201
+ if (changed) {
202
+ const tableSettingFormData = objectToFormData({ table_setting: tableSettingData });
203
+ await tableSetting.saveRaw(tableSettingFormData);
204
+ }
205
+ return tableSetting;
342
206
  };
343
- return ApiMakerTableSettings;
344
- }());
345
- exports.default = ApiMakerTableSettings;
346
- //# sourceMappingURL=table-settings.js.map
207
+ }
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInRhYmxlL3RhYmxlLXNldHRpbmdzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQzVDLE9BQU8sRUFBQyxTQUFTLElBQUksZ0JBQWdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUNoRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQ3RDLE9BQU8sRUFBQyxFQUFFLElBQUksTUFBTSxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBRWpDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFDLENBQUMsQ0FBQTtBQUU3RCwrQ0FBK0M7QUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUE7QUFFN0IsTUFBTSxDQUFDLE9BQU8sT0FBTyxxQkFBcUI7SUFDeEMsWUFBWSxFQUFDLEtBQUssRUFBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtJQUM3QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUVwQyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ3hDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksaUJBQWlC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QkFBdUIsa0JBQWtCLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQzlFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUMsRUFBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFBO1lBRWhGLE1BQU0sWUFBWSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ2xELENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDLENBQUE7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb2x1bW5JZGVudGlmaWVyIGZyb20gXCIuL2NvbHVtbi1pZGVudGlmaWVyLmpzXCJcbmltcG9ydCBjb2x1bW5WaXNpYmxlIGZyb20gXCIuL2NvbHVtbi12aXNpYmxlLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQge1JlYWRlcnNXcml0ZXJMb2NrfSBmcm9tIFwiZXBpYy1sb2Nrc1wiXG5pbXBvcnQge3NlcmlhbGl6ZSBhcyBvYmplY3RUb0Zvcm1EYXRhfSBmcm9tIFwib2JqZWN0LXRvLWZvcm1kYXRhXCJcbmltcG9ydCB7VGFibGVTZXR0aW5nfSBmcm9tIFwibW9kZWxzLmpzXCJcbmltcG9ydCB7djQgYXMgdXVpZHY0fSBmcm9tIFwidXVpZFwiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoe25hbWU6IFwiQXBpTWFrZXIgLyBUYWJsZVNldHRpbmdzXCJ9KVxuXG4vLyBIYXZlIGEgbG9jayBmb3IgZWFjaCB1bmlxdWUgdGFibGUgaWRlbnRpZmllclxuY29uc3QgdGFibGVTZXR0aW5nc0xvY2tzID0ge31cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJUYWJsZVNldHRpbmdzIHtcbiAgY29uc3RydWN0b3Ioe3RhYmxlfSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZVxuICAgIHRoaXMuc2V0VGFibGVTZXR0aW5nc0xvY2soKVxuICB9XG5cbiAgc2V0VGFibGVTZXR0aW5nc0xvY2soKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuaWRlbnRpZmllcigpXG5cbiAgICBpZiAoIShpZGVudGlmaWVyIGluIHRhYmxlU2V0dGluZ3NMb2NrcykpIHtcbiAgICAgIHRhYmxlU2V0dGluZ3NMb2Nrc1tpZGVudGlmaWVyXSA9IG5ldyBSZWFkZXJzV3JpdGVyTG9jaygpXG4gICAgfVxuXG4gICAgdGhpcy50YWJsZVNldHRpbmdzTG9jayA9IGRpZ2codGFibGVTZXR0aW5nc0xvY2tzLCBpZGVudGlmaWVyKVxuICB9XG5cbiAgY29sdW1ucyA9ICgpID0+IGRpZ2codGhpcywgXCJ0YWJsZVwiLCBcImNvbHVtbnNBc0FycmF5XCIpKClcbiAgY3VycmVudFVzZXIgPSAoKSA9PiBkaWdnKHRoaXMsIFwidGFibGVcIiwgXCJwcm9wc1wiLCBcImN1cnJlbnRVc2VyXCIpXG4gIGlkZW50aWZpZXIgPSAoKSA9PiBkaWdnKHRoaXMsIFwidGFibGVcIiwgXCJzdGF0ZVwiLCBcImlkZW50aWZpZXJcIilcblxuICBwcmVwYXJlZENvbHVtbnMgPSAodGFibGVTZXR0aW5nKSA9PiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMudGFibGUuY29sdW1uc0FzQXJyYXkoKVxuICAgIGNvbnN0IG9yZGVyZWQgPSB0aGlzLm9yZGVyZWRUYWJsZVNldHRpbmdDb2x1bW5zKHRhYmxlU2V0dGluZylcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBjb2x1bW5zOiBbXSxcbiAgICAgIHByZWxvYWQ6IFtdXG4gICAgfVxuXG4gICAgaWYgKCFvcmRlcmVkKSByZXR1cm5cblxuICAgIGZvciAoY29uc3QgdGFibGVTZXR0aW5nQ29sdW1uIG9mIG9yZGVyZWQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW5JZGVudGlmaWVyKGNvbHVtbikgPT0gdGFibGVTZXR0aW5nQ29sdW1uLmlkZW50aWZpZXIoKSlcblxuICAgICAgcmVzdWx0LmNvbHVtbnMucHVzaCh7Y29sdW1uLCB0YWJsZVNldHRpbmdDb2x1bW59KVxuXG4gICAgICAvLyBBZGQgbmVlZGVkIHByZWxvYWRzIGlmIGNvbHVtbiBpcyB2aXNpYmxlXG4gICAgICBpZiAoY29sdW1uVmlzaWJsZShjb2x1bW4sIHRhYmxlU2V0dGluZ0NvbHVtbikpIHtcbiAgICAgICAgaWYgKGNvbHVtbi5wYXRoKSB7XG4gICAgICAgICAgY29uc3QgcHJlbG9hZCA9IGNvbHVtbi5wYXRoLm1hcCgocGF0aFBhcnQpID0+IGluZmxlY3Rpb24udW5kZXJzY29yZShwYXRoUGFydCkpLmpvaW4oXCIuXCIpXG5cbiAgICAgICAgICBpZiAoIXJlc3VsdC5wcmVsb2FkLmluY2x1ZGVzKHByZWxvYWQpKSByZXN1bHQucHJlbG9hZC5wdXNoKHByZWxvYWQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBvcmRlcmVkVGFibGVTZXR0aW5nQ29sdW1ucyA9ICh0YWJsZVNldHRpbmcpID0+IHtcbiAgICByZXR1cm4gdGFibGVTZXR0aW5nXG4gICAgICAuY29sdW1ucygpXG4gICAgICAubG9hZGVkKClcbiAgICAgIC5zb3J0KCh0YWJsZVNldHRpbmdDb2x1bW4xLCB0YWJsZVNldHRpbmdDb2x1bW4yKSA9PiB0YWJsZVNldHRpbmdDb2x1bW4xLnBvc2l0aW9uKCkgLSB0YWJsZVNldHRpbmdDb2x1bW4yLnBvc2l0aW9uKCkpXG4gIH1cblxuICBsb2FkRXhpc3RpbmdPckNyZWF0ZVRhYmxlU2V0dGluZ3MgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudGFibGVTZXR0aW5nc0xvY2sud3JpdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHRhYmxlU2V0dGluZyA9IGF3YWl0IHRoaXMubG9hZFRhYmxlU2V0dGluZygpXG5cbiAgICAgIGlmICh0YWJsZVNldHRpbmcpIHtcbiAgICAgICAgdGFibGVTZXR0aW5nID0gYXdhaXQgdGhpcy51cGRhdGVUYWJsZVNldHRpbmcodGFibGVTZXR0aW5nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGVTZXR0aW5nID0gYXdhaXQgdGhpcy5jcmVhdGVJbml0aWFsVGFibGVTZXR0aW5nKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlU2V0dGluZ1xuICAgIH0pXG4gIH1cblxuICBsb2FkVGFibGVTZXR0aW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghVGFibGVTZXR0aW5nKSB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZVNldHRpbmcgbW9kZWwgaXNuJ3QgZ2xvYmFsbHkgYXZhaWxhYmxlXCIpXG5cbiAgICBjb25zdCB0YWJsZVNldHRpbmcgPSBhd2FpdCBUYWJsZVNldHRpbmdcbiAgICAgIC5yYW5zYWNrKHtcbiAgICAgICAgaWRlbnRpZmllcl9lcTogdGhpcy5pZGVudGlmaWVyKCksXG4gICAgICAgIHVzZXJfaWRfZXE6IHRoaXMuY3VycmVudFVzZXJJZE9yRmFsbGJhY2soKSxcbiAgICAgICAgdXNlcl90eXBlX2VxOiB0aGlzLmN1cnJlbnRVc2VyVHlwZU9yRmFsbGJhY2soKVxuICAgICAgfSlcbiAgICAgIC5wcmVsb2FkKFwiY29sdW1uc1wiKVxuICAgICAgLmZpcnN0KClcblxuICAgIHJldHVybiB0YWJsZVNldHRpbmdcbiAgfVxuXG4gIGN1cnJlbnRVc2VySWRPckZhbGxiYWNrKCkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gdGhpcy5jdXJyZW50VXNlcigpXG5cbiAgICBpZiAoY3VycmVudFVzZXIpIHJldHVybiBjdXJyZW50VXNlci5pZCgpXG5cbiAgICByZXR1cm4gdGhpcy5hbm9ueW1vdXNlVXNlcklkKClcbiAgfVxuXG4gIGN1cnJlbnRVc2VyVHlwZU9yRmFsbGJhY2soKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSB0aGlzLmN1cnJlbnRVc2VyKClcblxuICAgIGlmIChjdXJyZW50VXNlcikgcmV0dXJuIGRpZ2coY3VycmVudFVzZXIubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgYW5vbnltb3VzZVVzZXJJZCgpIHtcbiAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBgQXBpTWFrZXJUYWJsZUFub255bW91c1VzZXJJZC0ke3RoaXMuaWRlbnRpZmllcigpfWBcblxuICAgIGlmICghKHZhcmlhYmxlTmFtZSBpbiBsb2NhbFN0b3JhZ2UpKSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRJZCA9IHV1aWR2NCgpXG5cbiAgICAgIGxvY2FsU3RvcmFnZVt2YXJpYWJsZU5hbWVdID0gZ2VuZXJhdGVkSWRcbiAgICB9XG5cbiAgICByZXR1cm4gZGlnZyhsb2NhbFN0b3JhZ2UsIHZhcmlhYmxlTmFtZSlcbiAgfVxuXG4gIGNyZWF0ZUluaXRpYWxUYWJsZVNldHRpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVTZXR0aW5nRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcigpLFxuICAgICAgdXNlcl9pZDogdGhpcy5jdXJyZW50VXNlcklkT3JGYWxsYmFjaygpLFxuICAgICAgdXNlcl90eXBlOiB0aGlzLmN1cnJlbnRVc2VyVHlwZU9yRmFsbGJhY2soKSxcbiAgICAgIGNvbHVtbnNfYXR0cmlidXRlczoge31cbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zKClcblxuICAgIGZvciAoY29uc3QgY29sdW1uS2V5IGluIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGRpZ2coY29sdW1ucywgY29sdW1uS2V5KVxuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGNvbHVtbklkZW50aWZpZXIoY29sdW1uKVxuICAgICAgY29uc3QgY29sdW1uRGF0YSA9IHRoaXMuY29sdW1uU2F2ZURhdGEoY29sdW1uLCB7aWRlbnRpZmllciwgcG9zaXRpb246IGNvbHVtbktleX0pXG5cbiAgICAgIHRhYmxlU2V0dGluZ0RhdGEuY29sdW1uc19hdHRyaWJ1dGVzW2NvbHVtbktleV0gPSBjb2x1bW5EYXRhXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVTZXR0aW5nID0gbmV3IFRhYmxlU2V0dGluZygpXG4gICAgY29uc3QgdGFibGVTZXR0aW5nRm9ybURhdGEgPSBvYmplY3RUb0Zvcm1EYXRhKHt0YWJsZV9zZXR0aW5nOiB0YWJsZVNldHRpbmdEYXRhfSlcblxuICAgIGF3YWl0IHRhYmxlU2V0dGluZy5zYXZlUmF3KHRhYmxlU2V0dGluZ0Zvcm1EYXRhKVxuXG4gICAgY29uc3QgcmVsb2FkZWRUYWJsZVNldHRpbmcgPSBhd2FpdCB0aGlzLmxvYWRUYWJsZVNldHRpbmcoKVxuXG4gICAgcmV0dXJuIHJlbG9hZGVkVGFibGVTZXR0aW5nXG4gIH1cblxuICBjb2x1bW5TYXZlRGF0YShjb2x1bW4sIHtpZGVudGlmaWVyLCBwb3NpdGlvbn0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlX25hbWU6IGNvbHVtbi5hdHRyaWJ1dGUsXG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgcGF0aDogY29sdW1uLnBhdGgsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIHNvcnRfa2V5OiBjb2x1bW4uc29ydEtleSxcbiAgICAgIHZpc2libGU6IG51bGxcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUYWJsZVNldHRpbmcgPSBhc3luYyAodGFibGVTZXR0aW5nKSA9PiB7XG4gICAgY29uc3QgY2hhbmdlZEF0dHJpYnV0ZXNMaXN0ID0gW1wiYXR0cmlidXRlTmFtZVwiLCBcInNvcnRLZXlcIl1cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zKClcbiAgICBjb25zdCBjb2x1bW5zRGF0YSA9IHt9XG4gICAgY29uc3QgdGFibGVTZXR0aW5nRGF0YSA9IHtjb2x1bW5zX2F0dHJpYnV0ZXM6IGNvbHVtbnNEYXRhfVxuICAgIGxldCBjb2x1bW5zS2V5Q291bnQgPSAwXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgLy8gQWRkIG1pc3NpbmcgY29sdW1uc1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBjb2x1bW5JZGVudGlmaWVyKGNvbHVtbilcbiAgICAgIGNvbnN0IHRhYmxlU2V0dGluZ0NvbHVtbiA9IHRhYmxlU2V0dGluZy5jb2x1bW5zKCkubG9hZGVkKCkuZmluZCgodGFibGVTZXR0aW5nQ29sdW1uKSA9PiB0YWJsZVNldHRpbmdDb2x1bW4uaWRlbnRpZmllcigpID09IGlkZW50aWZpZXIpXG5cbiAgICAgIGlmICghdGFibGVTZXR0aW5nQ29sdW1uKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbktleSA9ICsrY29sdW1uc0tleUNvdW50XG5cbiAgICAgICAgY29sdW1uc0RhdGFbY29sdW1uS2V5XSA9IHRoaXMuY29sdW1uU2F2ZURhdGEoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgICAgICBwb3NpdGlvbjogdGFibGVTZXR0aW5nLmNvbHVtbnMoKS5sb2FkZWQoKS5sZW5ndGggKyBjb2x1bW5LZXlcbiAgICAgICAgICB9XG4gICAgICAgIClcblxuICAgICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYENoYW5nZWQgYmVjYXVzZSBvZiBuZXcgY29sdW1uOiAke2NvbHVtbi5sYWJlbH1gKVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFibGVTZXR0aW5nQ29sdW1uIG9mIHRhYmxlU2V0dGluZy5jb2x1bW5zKCkubG9hZGVkKCkpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW5JZGVudGlmaWVyKGNvbHVtbikgPT0gdGFibGVTZXR0aW5nQ29sdW1uLmlkZW50aWZpZXIoKSlcblxuICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAvLyBUT0RPOiBVcGRhdGUgY29sdW1uIGlmIGNoYW5nZWRcbiAgICAgICAgbGV0IGNvbHVtbkNoYW5nZWQgPSBmYWxzZVxuXG4gICAgICAgIGZvciAoY29uc3QgY2hhbmdlZEF0dHJpYnV0ZSBvZiBjaGFuZ2VkQXR0cmlidXRlc0xpc3QpIHtcbiAgICAgICAgICBsZXQgY29sdW1uQXR0cmlidXRlTmFtZVxuXG4gICAgICAgICAgaWYgKGNoYW5nZWRBdHRyaWJ1dGUgPT0gXCJhdHRyaWJ1dGVOYW1lXCIpIHtcbiAgICAgICAgICAgIGNvbHVtbkF0dHJpYnV0ZU5hbWUgPSBcImF0dHJpYnV0ZVwiXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbHVtbkF0dHJpYnV0ZU5hbWUgPSBjaGFuZ2VkQXR0cmlidXRlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgb2xkQXR0cmlidXRlVmFsdWUgPSB0YWJsZVNldHRpbmdDb2x1bW5bY2hhbmdlZEF0dHJpYnV0ZV0oKVxuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZVZhbHVlID0gY29sdW1uW2NvbHVtbkF0dHJpYnV0ZU5hbWVdXG5cbiAgICAgICAgICBpZiAob2xkQXR0cmlidXRlVmFsdWUgIT0gbmV3QXR0cmlidXRlVmFsdWUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgJHtjaGFuZ2VkQXR0cmlidXRlfSBjaGFuZ2VkIGZyb20gJHtvbGRBdHRyaWJ1dGVWYWx1ZX0gdG8gJHtuZXdBdHRyaWJ1dGVWYWx1ZX0gb24gY29sdW1uOiAke2NvbHVtbi5sYWJlbH1gKVxuICAgICAgICAgICAgY29sdW1uQ2hhbmdlZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW5QYXRoQXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShjb2x1bW4ucGF0aClcbiAgICAgICAgY29uc3QgdGFibGVTZXR0aW5nQ29sdW1uUGF0aEFzU3RyaW5nID0gdGFibGVTZXR0aW5nQ29sdW1uLnBhdGgoKVxuXG4gICAgICAgIGlmIChjb2x1bW5QYXRoQXNTdHJpbmcgIT0gdGFibGVTZXR0aW5nQ29sdW1uUGF0aEFzU3RyaW5nKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCgpID0+IGBQYXRoIGNoYW5nZWQgb24gJHtjb2x1bW4ubGFiZWx9IGZyb20gJHtjb2x1bW5QYXRoQXNTdHJpbmd9IHRvICR7dGFibGVTZXR0aW5nQ29sdW1uUGF0aEFzU3RyaW5nfWApXG4gICAgICAgICAgY29sdW1uQ2hhbmdlZCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5DaGFuZ2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sdW1uS2V5ID0gKytjb2x1bW5zS2V5Q291bnRcblxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgY29sdW1uc0RhdGFbY29sdW1uS2V5XSA9IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lOiBjb2x1bW4uYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgIGlkOiB0YWJsZVNldHRpbmdDb2x1bW4uaWQoKSxcbiAgICAgICAgICAgIHBhdGg6IGNvbHVtbi5wYXRoLFxuICAgICAgICAgICAgc29ydF9rZXk6IGNvbHVtbi5zb3J0S2V5XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmVkIHNhdmVkIGNvbHVtbnMgbm8gbG9uZ2VyIGZvdW5kXG4gICAgICAgIGNvbnN0IGNvbHVtbktleSA9ICsrY29sdW1uc0tleUNvdW50XG5cbiAgICAgICAgY29sdW1uc0RhdGFbY29sdW1uS2V5XSA9IHtcbiAgICAgICAgICBpZDogdGFibGVTZXR0aW5nQ29sdW1uLmlkKCksXG4gICAgICAgICAgX2Rlc3Ryb3k6IHRydWVcbiAgICAgICAgfVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgQ29sdW1uIGdvdCByZW1vdmVkOiAke3RhYmxlU2V0dGluZ0NvbHVtbi5pZGVudGlmaWVyKCl9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgY29uc3QgdGFibGVTZXR0aW5nRm9ybURhdGEgPSBvYmplY3RUb0Zvcm1EYXRhKHt0YWJsZV9zZXR0aW5nOiB0YWJsZVNldHRpbmdEYXRhfSlcblxuICAgICAgYXdhaXQgdGFibGVTZXR0aW5nLnNhdmVSYXcodGFibGVTZXR0aW5nRm9ybURhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlU2V0dGluZ1xuICB9XG59XG4iXX0=