@nlabs/metropolisjs 0.1.2 → 0.2.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 (329) hide show
  1. package/.github/copilot-instructions.md +167 -0
  2. package/AGENTS.md +13 -0
  3. package/CHANGELOG.md +112 -0
  4. package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
  5. package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
  6. package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
  7. package/README.md +1123 -112
  8. package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
  9. package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
  10. package/docs/ACTIONS.md +63 -0
  11. package/docs/COLLECTIONS.md +1038 -0
  12. package/docs/CONNECTIONS.md +1367 -0
  13. package/docs/CRUD_INTEGRATION.md +702 -0
  14. package/examples/connections-usage.tsx +909 -0
  15. package/examples/content-actions-usage.ts +144 -0
  16. package/examples/crud-usage.tsx +847 -0
  17. package/examples/extensibility-usage.tsx +889 -0
  18. package/examples/i18n-import-examples.ts +86 -0
  19. package/examples/i18n-namespace-usage.ts +118 -0
  20. package/examples/i18next-singleton-demo.ts +187 -0
  21. package/examples/permission-system-usage.tsx +415 -0
  22. package/examples/project-details.tsx +397 -0
  23. package/examples/shared-i18n-usage.tsx +203 -0
  24. package/examples/signup-error-handling.ts +100 -0
  25. package/examples/translation-types.ts +86 -0
  26. package/examples/translation-usage.tsx +336 -0
  27. package/index.js +1 -0
  28. package/jest.config.mjs +28 -0
  29. package/lex.config.mjs +11 -2
  30. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
  31. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
  32. package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
  33. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
  34. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
  35. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
  36. package/lib/actions/appActions/appActions.d.ts +29 -0
  37. package/lib/actions/appActions/appActions.d.ts.map +1 -0
  38. package/lib/actions/appActions/appActions.js +159 -0
  39. package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
  40. package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
  41. package/lib/actions/connectionActions/connectionActions.js +131 -0
  42. package/lib/actions/contentActions/contentActions.d.ts +34 -0
  43. package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
  44. package/lib/actions/contentActions/contentActions.js +314 -0
  45. package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
  46. package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
  47. package/lib/actions/conversationActions/conversationActions.js +225 -0
  48. package/lib/actions/eventActions/eventActions.d.ts +27 -7
  49. package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
  50. package/lib/actions/eventActions/eventActions.js +436 -2
  51. package/lib/actions/groupActions/groupActions.d.ts +30 -0
  52. package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
  53. package/lib/actions/groupActions/groupActions.js +229 -0
  54. package/lib/actions/imageActions/imageActions.d.ts +16 -10
  55. package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
  56. package/lib/actions/imageActions/imageActions.js +593 -2
  57. package/lib/actions/index.d.ts +21 -9
  58. package/lib/actions/index.d.ts.map +1 -0
  59. package/lib/actions/index.js +22 -2
  60. package/lib/actions/locationActions/locationActions.d.ts +11 -9
  61. package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
  62. package/lib/actions/locationActions/locationActions.js +388 -2
  63. package/lib/actions/messageActions/messageActions.d.ts +16 -32
  64. package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
  65. package/lib/actions/messageActions/messageActions.js +235 -2
  66. package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
  67. package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
  68. package/lib/actions/permissionActions/permissionActions.js +330 -0
  69. package/lib/actions/personaActions/personaActions.d.ts +65 -0
  70. package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
  71. package/lib/actions/personaActions/personaActions.js +572 -0
  72. package/lib/actions/postActions/postActions.d.ts +12 -32
  73. package/lib/actions/postActions/postActions.d.ts.map +1 -0
  74. package/lib/actions/postActions/postActions.js +447 -2
  75. package/lib/actions/reactionActions/reactionActions.d.ts +13 -27
  76. package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
  77. package/lib/actions/reactionActions/reactionActions.js +413 -2
  78. package/lib/actions/sseActions/sseActions.d.ts +1 -0
  79. package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
  80. package/lib/actions/sseActions/sseActions.js +148 -2
  81. package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
  82. package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
  83. package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
  84. package/lib/actions/tagActions/tagActions.d.ts +13 -31
  85. package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
  86. package/lib/actions/tagActions/tagActions.js +347 -2
  87. package/lib/actions/translationActions/translationActions.d.ts +38 -0
  88. package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
  89. package/lib/actions/translationActions/translationActions.js +189 -0
  90. package/lib/actions/userActions/userActions.d.ts +42 -95
  91. package/lib/actions/userActions/userActions.d.ts.map +1 -0
  92. package/lib/actions/userActions/userActions.js +844 -2
  93. package/lib/actions/videoActions/videoActions.d.ts +41 -0
  94. package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
  95. package/lib/actions/videoActions/videoActions.js +532 -0
  96. package/lib/actions/websocketActions/websocketActions.d.ts +20 -21
  97. package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
  98. package/lib/actions/websocketActions/websocketActions.js +377 -2
  99. package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
  100. package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
  101. package/lib/adapters/appAdapter/appAdapter.js +90 -0
  102. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +3 -2
  103. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
  104. package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -2
  105. package/lib/adapters/contentAdapter/contentAdapter.d.ts +3 -2
  106. package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
  107. package/lib/adapters/contentAdapter/contentAdapter.js +107 -2
  108. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +3 -2
  109. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
  110. package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -2
  111. package/lib/adapters/eventAdapter/eventAdapter.d.ts +5 -2
  112. package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
  113. package/lib/adapters/eventAdapter/eventAdapter.js +162 -2
  114. package/lib/adapters/fileAdapter/fileAdapter.d.ts +3 -2
  115. package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
  116. package/lib/adapters/fileAdapter/fileAdapter.js +118 -2
  117. package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
  118. package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
  119. package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
  120. package/lib/adapters/imageAdapter/imageAdapter.d.ts +9 -2
  121. package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
  122. package/lib/adapters/imageAdapter/imageAdapter.js +134 -2
  123. package/lib/adapters/index.d.ts +34 -16
  124. package/lib/adapters/index.d.ts.map +1 -0
  125. package/lib/adapters/index.js +19 -2
  126. package/lib/adapters/locationAdapter/locationAdapter.d.ts +3 -2
  127. package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
  128. package/lib/adapters/locationAdapter/locationAdapter.js +95 -2
  129. package/lib/adapters/messageAdapter/messageAdapter.d.ts +23 -19
  130. package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
  131. package/lib/adapters/messageAdapter/messageAdapter.js +82 -2
  132. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
  133. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
  134. package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
  135. package/lib/adapters/personaAdapter/personaAdapter.d.ts +28 -2
  136. package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
  137. package/lib/adapters/personaAdapter/personaAdapter.js +161 -2
  138. package/lib/adapters/postAdapter/postAdapter.d.ts +3 -2
  139. package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
  140. package/lib/adapters/postAdapter/postAdapter.js +115 -2
  141. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +5 -2
  142. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
  143. package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -2
  144. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +3 -2
  145. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
  146. package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -2
  147. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +3 -2
  148. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
  149. package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -2
  150. package/lib/adapters/tagAdapter/tagAdapter.d.ts +3 -2
  151. package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
  152. package/lib/adapters/tagAdapter/tagAdapter.js +98 -2
  153. package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
  154. package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
  155. package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
  156. package/lib/adapters/userAdapter/userAdapter.d.ts +18 -6
  157. package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
  158. package/lib/adapters/userAdapter/userAdapter.js +302 -2
  159. package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
  160. package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
  161. package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
  162. package/lib/config/index.d.ts +19 -6
  163. package/lib/config/index.d.ts.map +1 -0
  164. package/lib/config/index.js +97 -2
  165. package/lib/constants/Collections.d.ts +44 -0
  166. package/lib/constants/Collections.d.ts.map +1 -0
  167. package/lib/constants/Collections.js +40 -0
  168. package/lib/constants/MetropolisConstants.d.ts +1 -0
  169. package/lib/constants/MetropolisConstants.d.ts.map +1 -0
  170. package/lib/constants/MetropolisConstants.js +15 -2
  171. package/lib/graphql/message.d.ts +1 -0
  172. package/lib/graphql/message.d.ts.map +1 -0
  173. package/lib/graphql/message.js +6 -4
  174. package/lib/graphql/notification.d.ts +1 -0
  175. package/lib/graphql/notification.d.ts.map +1 -0
  176. package/lib/graphql/notification.js +6 -4
  177. package/lib/graphql/session.d.ts +1 -0
  178. package/lib/graphql/session.d.ts.map +1 -0
  179. package/lib/graphql/session.js +4 -3
  180. package/lib/index.d.ts +45 -22
  181. package/lib/index.d.ts.map +1 -0
  182. package/lib/index.js +248 -2
  183. package/lib/stores/appStore.d.ts +1 -0
  184. package/lib/stores/appStore.d.ts.map +1 -0
  185. package/lib/stores/appStore.js +23 -2
  186. package/lib/stores/contentStore.d.ts +36 -0
  187. package/lib/stores/contentStore.d.ts.map +1 -0
  188. package/lib/stores/contentStore.js +139 -0
  189. package/lib/stores/conversationStore.d.ts +38 -0
  190. package/lib/stores/conversationStore.d.ts.map +1 -0
  191. package/lib/stores/conversationStore.js +117 -0
  192. package/lib/stores/eventStore.d.ts +4 -1
  193. package/lib/stores/eventStore.d.ts.map +1 -0
  194. package/lib/stores/eventStore.js +47 -2
  195. package/lib/stores/groupStore.d.ts +37 -0
  196. package/lib/stores/groupStore.d.ts.map +1 -0
  197. package/lib/stores/groupStore.js +68 -0
  198. package/lib/stores/imageStore.d.ts +6 -1
  199. package/lib/stores/imageStore.d.ts.map +1 -0
  200. package/lib/stores/imageStore.js +53 -2
  201. package/lib/stores/index.d.ts +20 -11
  202. package/lib/stores/index.d.ts.map +1 -0
  203. package/lib/stores/index.js +24 -2
  204. package/lib/stores/locationStore.d.ts +2 -1
  205. package/lib/stores/locationStore.d.ts.map +1 -0
  206. package/lib/stores/locationStore.js +42 -2
  207. package/lib/stores/messageStore.d.ts +19 -4
  208. package/lib/stores/messageStore.d.ts.map +1 -0
  209. package/lib/stores/messageStore.js +137 -2
  210. package/lib/stores/notificationStore.d.ts +33 -0
  211. package/lib/stores/notificationStore.d.ts.map +1 -0
  212. package/lib/stores/notificationStore.js +55 -0
  213. package/lib/stores/permissionStore.d.ts +37 -0
  214. package/lib/stores/permissionStore.d.ts.map +1 -0
  215. package/lib/stores/permissionStore.js +117 -0
  216. package/lib/stores/personaStore.d.ts +26 -0
  217. package/lib/stores/personaStore.d.ts.map +1 -0
  218. package/lib/stores/personaStore.js +118 -0
  219. package/lib/stores/postStore.d.ts +2 -1
  220. package/lib/stores/postStore.d.ts.map +1 -0
  221. package/lib/stores/postStore.js +53 -2
  222. package/lib/stores/reactionStore.d.ts +1 -0
  223. package/lib/stores/reactionStore.d.ts.map +1 -0
  224. package/lib/stores/reactionStore.js +28 -2
  225. package/lib/stores/subscriptionStore.d.ts +41 -0
  226. package/lib/stores/subscriptionStore.d.ts.map +1 -0
  227. package/lib/stores/subscriptionStore.js +85 -0
  228. package/lib/stores/tagStore.d.ts +8 -5
  229. package/lib/stores/tagStore.d.ts.map +1 -0
  230. package/lib/stores/tagStore.js +87 -2
  231. package/lib/stores/translationStore.d.ts +42 -0
  232. package/lib/stores/translationStore.d.ts.map +1 -0
  233. package/lib/stores/translationStore.js +122 -0
  234. package/lib/stores/userStore.d.ts +5 -4
  235. package/lib/stores/userStore.d.ts.map +1 -0
  236. package/lib/stores/userStore.js +319 -2
  237. package/lib/stores/videoStore.d.ts +39 -0
  238. package/lib/stores/videoStore.d.ts.map +1 -0
  239. package/lib/stores/videoStore.js +132 -0
  240. package/lib/stores/websocketStore.d.ts +1 -0
  241. package/lib/stores/websocketStore.d.ts.map +1 -0
  242. package/lib/stores/websocketStore.js +51 -2
  243. package/lib/types/apps.types.d.ts +17 -0
  244. package/lib/types/apps.types.d.ts.map +1 -0
  245. package/lib/types/apps.types.js +6 -0
  246. package/lib/types/common.types.d.ts +31 -0
  247. package/lib/types/common.types.d.ts.map +1 -0
  248. package/lib/types/common.types.js +6 -0
  249. package/lib/types/conversations.types.d.ts +17 -0
  250. package/lib/types/conversations.types.d.ts.map +1 -0
  251. package/lib/types/conversations.types.js +6 -0
  252. package/lib/types/edges.types.d.ts +38 -0
  253. package/lib/types/edges.types.d.ts.map +1 -0
  254. package/lib/types/edges.types.js +6 -0
  255. package/lib/types/groups.types.d.ts +19 -0
  256. package/lib/types/groups.types.d.ts.map +1 -0
  257. package/lib/types/groups.types.js +6 -0
  258. package/lib/types/index.d.ts +12 -0
  259. package/lib/types/index.d.ts.map +1 -0
  260. package/lib/types/index.js +12 -0
  261. package/lib/types/subscriptions.types.d.ts +32 -0
  262. package/lib/types/subscriptions.types.d.ts.map +1 -0
  263. package/lib/types/subscriptions.types.js +6 -0
  264. package/lib/types/videos.types.d.ts +61 -0
  265. package/lib/types/videos.types.d.ts.map +1 -0
  266. package/lib/types/videos.types.js +6 -0
  267. package/lib/utils/MetropolisProvider.d.ts +39 -15
  268. package/lib/utils/MetropolisProvider.d.ts.map +1 -0
  269. package/lib/utils/MetropolisProvider.js +31 -2
  270. package/lib/utils/actionFactory.d.ts +21 -19
  271. package/lib/utils/actionFactory.d.ts.map +1 -0
  272. package/lib/utils/actionFactory.js +95 -2
  273. package/lib/utils/api.d.ts +5 -4
  274. package/lib/utils/api.d.ts.map +1 -0
  275. package/lib/utils/api.js +252 -6
  276. package/lib/utils/app.d.ts +1 -0
  277. package/lib/utils/app.d.ts.map +1 -0
  278. package/lib/utils/app.js +15 -2
  279. package/lib/utils/baseActionFactory.d.ts +5 -23
  280. package/lib/utils/baseActionFactory.d.ts.map +1 -0
  281. package/lib/utils/baseActionFactory.js +72 -2
  282. package/lib/utils/configUtils.d.ts +11 -0
  283. package/lib/utils/configUtils.d.ts.map +1 -0
  284. package/lib/utils/configUtils.js +20 -0
  285. package/lib/utils/dateUtils.d.ts +1 -0
  286. package/lib/utils/dateUtils.d.ts.map +1 -0
  287. package/lib/utils/dateUtils.js +11 -2
  288. package/lib/utils/file.d.ts +3 -1
  289. package/lib/utils/file.d.ts.map +1 -0
  290. package/lib/utils/file.js +156 -2
  291. package/lib/utils/i18n.d.ts +7 -0
  292. package/lib/utils/i18n.d.ts.map +1 -0
  293. package/lib/utils/i18n.js +96 -0
  294. package/lib/utils/index.d.ts +20 -0
  295. package/lib/utils/index.d.ts.map +1 -0
  296. package/lib/utils/index.js +26 -0
  297. package/lib/utils/location.d.ts +4 -3
  298. package/lib/utils/location.d.ts.map +1 -0
  299. package/lib/utils/location.js +82 -2
  300. package/lib/utils/permissionUtils.d.ts +22 -0
  301. package/lib/utils/permissionUtils.d.ts.map +1 -0
  302. package/lib/utils/permissionUtils.js +72 -0
  303. package/lib/utils/requestCache.d.ts +8 -0
  304. package/lib/utils/requestCache.d.ts.map +1 -0
  305. package/lib/utils/requestCache.js +53 -0
  306. package/lib/utils/session.d.ts +14 -0
  307. package/lib/utils/session.d.ts.map +1 -0
  308. package/lib/utils/session.js +107 -0
  309. package/lib/utils/useConversationTyping.d.ts +26 -0
  310. package/lib/utils/useConversationTyping.d.ts.map +1 -0
  311. package/lib/utils/useConversationTyping.js +117 -0
  312. package/lib/utils/useMetropolis.d.ts +67 -12
  313. package/lib/utils/useMetropolis.d.ts.map +1 -0
  314. package/lib/utils/useMetropolis.js +311 -2
  315. package/lib/utils/useTranslations.d.ts +16 -0
  316. package/lib/utils/useTranslations.d.ts.map +1 -0
  317. package/lib/utils/useTranslations.js +105 -0
  318. package/lib/utils/validatorFactory.d.ts +3 -2
  319. package/lib/utils/validatorFactory.d.ts.map +1 -0
  320. package/lib/utils/validatorFactory.js +95 -2
  321. package/package.json +58 -17
  322. package/temp_signin.ts +73 -0
  323. package/lib/actions/profileActions/profileActions.d.ts +0 -50
  324. package/lib/actions/profileActions/profileActions.js +0 -2
  325. package/lib/adapters/profileAdapter/profileAdapter.d.ts +0 -32
  326. package/lib/adapters/profileAdapter/profileAdapter.js +0 -2
  327. package/lib/stores/profileStore.d.ts +0 -24
  328. package/lib/stores/profileStore.js +0 -2
  329. /package/{FACTORY_PATTERN_GUIDE.md → factoryPatternGuide.md} +0 -0
@@ -1,9 +1,21 @@
1
- export * from './eventActions/eventActions';
2
- export * from './imageActions/imageActions';
3
- export * from './locationActions/locationActions';
4
- export * from './messageActions/messageActions';
5
- export * from './postActions/postActions';
6
- export * from './reactionActions/reactionActions';
7
- export * from './tagActions/tagActions';
8
- export * from './userActions/userActions';
9
- export * from './websocketActions/websocketActions';
1
+ export * from './appActions/appActions.js';
2
+ export * from './connectionActions/connectionActions.js';
3
+ export * from './contentActions/contentActions.js';
4
+ export * from './conversationActions/conversationActions.js';
5
+ export * from './eventActions/eventActions.js';
6
+ export * from './groupActions/groupActions.js';
7
+ export * from './imageActions/imageActions.js';
8
+ export * from './locationActions/locationActions.js';
9
+ export * from './messageActions/messageActions.js';
10
+ export * from './permissionActions/permissionActions.js';
11
+ export * from './postActions/postActions.js';
12
+ export * from './personaActions/personaActions.js';
13
+ export * from './reactionActions/reactionActions.js';
14
+ export * from './sseActions/sseActions.js';
15
+ export * from './subscriptionActions/subscriptionActions.js';
16
+ export * from './tagActions/tagActions.js';
17
+ export * from './translationActions/translationActions.js';
18
+ export * from './userActions/userActions.js';
19
+ export * from './videoActions/videoActions.js';
20
+ export * from './websocketActions/websocketActions.js';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8CAA8C,CAAC;AAC7D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC"}
@@ -1,2 +1,22 @@
1
- export*from"./eventActions/eventActions";export*from"./imageActions/imageActions";export*from"./locationActions/locationActions";export*from"./messageActions/messageActions";export*from"./postActions/postActions";export*from"./reactionActions/reactionActions";export*from"./tagActions/tagActions";export*from"./userActions/userActions";export*from"./websocketActions/websocketActions";
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCAqIGZyb20gJy4vZXZlbnRBY3Rpb25zL2V2ZW50QWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlQWN0aW9ucy9pbWFnZUFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9sb2NhdGlvbkFjdGlvbnMvbG9jYXRpb25BY3Rpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZUFjdGlvbnMvbWVzc2FnZUFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9wb3N0QWN0aW9ucy9wb3N0QWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3JlYWN0aW9uQWN0aW9ucy9yZWFjdGlvbkFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi90YWdBY3Rpb25zL3RhZ0FjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyQWN0aW9ucy91c2VyQWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3dlYnNvY2tldEFjdGlvbnMvd2Vic29ja2V0QWN0aW9ucyc7XG5cbiJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFdBQWMsOEJBQ2QsV0FBYyw4QkFDZCxXQUFjLG9DQUNkLFdBQWMsa0NBQ2QsV0FBYyw0QkFDZCxXQUFjLG9DQUNkLFdBQWMsMEJBQ2QsV0FBYyw0QkFDZCxXQUFjIiwKICAibmFtZXMiOiBbXQp9Cg==
1
+ export * from './appActions/appActions.js';
2
+ export * from './connectionActions/connectionActions.js';
3
+ export * from './contentActions/contentActions.js';
4
+ export * from './conversationActions/conversationActions.js';
5
+ export * from './eventActions/eventActions.js';
6
+ export * from './groupActions/groupActions.js';
7
+ export * from './imageActions/imageActions.js';
8
+ export * from './locationActions/locationActions.js';
9
+ export * from './messageActions/messageActions.js';
10
+ export * from './permissionActions/permissionActions.js';
11
+ export * from './postActions/postActions.js';
12
+ export * from './personaActions/personaActions.js';
13
+ export * from './reactionActions/reactionActions.js';
14
+ export * from './sseActions/sseActions.js';
15
+ export * from './subscriptionActions/subscriptionActions.js';
16
+ export * from './tagActions/tagActions.js';
17
+ export * from './translationActions/translationActions.js';
18
+ export * from './userActions/userActions.js';
19
+ export * from './videoActions/videoActions.js';
20
+ export * from './websocketActions/websocketActions.js';
21
+
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FwcEFjdGlvbnMvYXBwQWN0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2Nvbm5lY3Rpb25BY3Rpb25zL2Nvbm5lY3Rpb25BY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udGVudEFjdGlvbnMvY29udGVudEFjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb252ZXJzYXRpb25BY3Rpb25zL2NvbnZlcnNhdGlvbkFjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ldmVudEFjdGlvbnMvZXZlbnRBY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZ3JvdXBBY3Rpb25zL2dyb3VwQWN0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlQWN0aW9ucy9pbWFnZUFjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9sb2NhdGlvbkFjdGlvbnMvbG9jYXRpb25BY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZUFjdGlvbnMvbWVzc2FnZUFjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wZXJtaXNzaW9uQWN0aW9ucy9wZXJtaXNzaW9uQWN0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Bvc3RBY3Rpb25zL3Bvc3RBY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGVyc29uYUFjdGlvbnMvcGVyc29uYUFjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWFjdGlvbkFjdGlvbnMvcmVhY3Rpb25BY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3NlQWN0aW9ucy9zc2VBY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3Vic2NyaXB0aW9uQWN0aW9ucy9zdWJzY3JpcHRpb25BY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdGFnQWN0aW9ucy90YWdBY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdHJhbnNsYXRpb25BY3Rpb25zL3RyYW5zbGF0aW9uQWN0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3VzZXJBY3Rpb25zL3VzZXJBY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdmlkZW9BY3Rpb25zL3ZpZGVvQWN0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3dlYnNvY2tldEFjdGlvbnMvd2Vic29ja2V0QWN0aW9ucy5qcyc7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkI7QUFDM0MsY0FBYywyQ0FBMkM7QUFDekQsY0FBYyxxQ0FBcUM7QUFDbkQsY0FBYywrQ0FBK0M7QUFDN0QsY0FBYyxpQ0FBaUM7QUFDL0MsY0FBYyxpQ0FBaUM7QUFDL0MsY0FBYyxpQ0FBaUM7QUFDL0MsY0FBYyx1Q0FBdUM7QUFDckQsY0FBYyxxQ0FBcUM7QUFDbkQsY0FBYywyQ0FBMkM7QUFDekQsY0FBYywrQkFBK0I7QUFDN0MsY0FBYyxxQ0FBcUM7QUFDbkQsY0FBYyx1Q0FBdUM7QUFDckQsY0FBYyw2QkFBNkI7QUFDM0MsY0FBYywrQ0FBK0M7QUFDN0QsY0FBYyw2QkFBNkI7QUFDM0MsY0FBYyw2Q0FBNkM7QUFDM0QsY0FBYywrQkFBK0I7QUFDN0MsY0FBYyxpQ0FBaUM7QUFDL0MsY0FBYyx5Q0FBeUMifQ==
@@ -1,5 +1,6 @@
1
1
  import type { FluxFramework } from '@nlabs/arkhamjs';
2
- import type { LocationType } from '../../adapters/locationAdapter/locationAdapter';
2
+ import type { LocationType } from '../../adapters/locationAdapter/locationAdapter.js';
3
+ import type { ActionRequestOptions } from '../../utils/requestCache.js';
3
4
  export interface LocationAdapterOptions {
4
5
  strict?: boolean;
5
6
  allowPartial?: boolean;
@@ -18,18 +19,18 @@ export type LocationApiResultsType = {
18
19
  updateLocation: LocationType;
19
20
  };
20
21
  export interface LocationActions {
21
- autocompleteLocation: (address: string, latitude?: number, longitude?: number, locationProps?: string[]) => Promise<LocationType[]>;
22
- add: (location: Partial<LocationType>, locationProps?: string[]) => Promise<LocationType>;
23
- delete: (locationId: string) => Promise<LocationType>;
24
- getCurrentLocation: (setLocation?: (location: LocationType) => void) => Promise<LocationType>;
25
- getGoogleLocation: (address: string) => Promise<{
22
+ autocompleteLocation: (address: string, latitude?: number, longitude?: number, locationProps?: string[], requestOptions?: ActionRequestOptions) => Promise<LocationType[]>;
23
+ add: (location: Partial<LocationType>, locationProps?: string[], requestOptions?: ActionRequestOptions) => Promise<LocationType>;
24
+ delete: (locationId: string, requestOptions?: ActionRequestOptions) => Promise<LocationType>;
25
+ getCurrentLocation: (setLocation?: (location: LocationType) => void, requestOptions?: ActionRequestOptions) => Promise<LocationType>;
26
+ getGoogleLocation: (address: string, requestOptions?: ActionRequestOptions) => Promise<{
26
27
  latitude: number;
27
28
  location: string;
28
29
  longitude: number;
29
30
  }>;
30
- getLocation: (location: Partial<LocationType>, locationProps?: string[]) => Promise<LocationType>;
31
- listByItem: (itemId: string, locationProps?: string[]) => Promise<LocationType[]>;
32
- update: (location: Partial<LocationType>, locationProps?: string[]) => Promise<LocationType>;
31
+ getLocation: (location: Partial<LocationType>, locationProps?: string[], requestOptions?: ActionRequestOptions) => Promise<LocationType>;
32
+ listByItem: (itemId: string, locationProps?: string[], requestOptions?: ActionRequestOptions) => Promise<LocationType[]>;
33
+ update: (location: Partial<LocationType>, locationProps?: string[], requestOptions?: ActionRequestOptions) => Promise<LocationType>;
33
34
  updateLocationAdapter: (adapter: (input: unknown, options?: LocationAdapterOptions) => any) => void;
34
35
  updateLocationAdapterOptions: (options: LocationAdapterOptions) => void;
35
36
  }
@@ -56,3 +57,4 @@ export interface LocationActions {
56
57
  * });
57
58
  */
58
59
  export declare const createLocationActions: (flux: FluxFramework, options?: LocationActionsOptions) => LocationActions;
60
+ //# sourceMappingURL=locationActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locationActions.d.ts","sourceRoot":"","sources":["../../../src/actions/locationActions/locationActions.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,388 @@
1
- import{get as I}from"@nlabs/rip-hunter";import{validateLocationInput as S}from"../../adapters/locationAdapter/locationAdapter";import{Config as h}from"../../config";import{LOCATION_CONSTANTS as s}from"../../stores/locationStore";import{appMutation as g}from"../../utils/api";import{autoCompleteLocation as C}from"../../utils/location";const m="locations",_=(o,L)=>S(o),O=(o,L)=>(p,l)=>{const d={...L,...l};let u=_(p,d);return o&&(u=o(u,d)),d?.customValidation&&(u=d.customValidation(u)),u},$=(o,L)=>{let p=L?.locationAdapterOptions||{},l=L?.locationAdapter,d=O(l,p);return{autocompleteLocation:async(e,n,t,i=[])=>C(o,e,n,t,i),add:async(e,n=[])=>{try{const t={location:{type:"LocationInput!",value:d(e,p)}},i=(c={})=>{const{addLocation:r={}}=c;return o.dispatch({location:r,type:s.ADD_ITEM_SUCCESS})},{location:a}=await g(o,"addLocation",m,t,["added","address","city","country","id","latitude","longitude","modified","state","street","zip",...n],{onSuccess:i});return a}catch(t){throw o.dispatch({error:t,type:s.ADD_ITEM_ERROR}),t}},delete:async e=>{try{const n={locationId:{type:"ID!",value:e}},t=(a={})=>{const{deleteLocation:c={}}=a;return o.dispatch({location:c,type:s.REMOVE_ITEM_SUCCESS})},{location:i}=await g(o,"deleteLocation",m,n,["id"],{onSuccess:t});return i}catch(n){throw o.dispatch({error:n,type:s.REMOVE_ITEM_ERROR}),n}},getCurrentLocation:async e=>new Promise((n,t)=>{const{userId:i}=o.getState("user.session",{}),{city:a,country:c,latitude:r,longitude:A,state:E}=o.getState(["user","users",i||""],{}),R=[a,E,c].join(", "),y={latitude:r,location:R,longitude:A};navigator.geolocation?navigator.geolocation.getCurrentPosition(async({coords:T})=>{const P={latitude:T.latitude,location:"Current Location",longitude:T.longitude};await o.dispatch({current:P,type:s.SET_CURRENT}),e&&e(P),n(P)},T=>{e&&e(y),o.dispatch({current:y,type:s.SET_CURRENT}),t(T)},{enableHighAccuracy:!1,maximumAge:0,timeout:3e4}):(e&&e(y),o.dispatch({current:y,type:s.SET_CURRENT}),t("Geolocation is not supported by this browser."))}),getGoogleLocation:async e=>{const{key:n,url:t}=h.get("google.maps"),i=encodeURI(e),a=`${t}?address=${i}&key=${n}`;return a?{latitude:0,location:"",longitude:0}:I(a).then(c=>{const{results:r}=c,A=r&&r.length?r[0]:{},{formatted_address:E,geometry:{location:{lat:R,lng:y}}}=A;return{latitude:R,location:E,longitude:y}})},getLocation:async(e,n=[])=>{try{const t={location:{type:"LocationInput!",value:d(e,p)}},i=(c={})=>{const{getLocation:r={}}=c;return o.dispatch({location:r,type:s.GET_ITEM_SUCCESS})},{location:a}=await g(o,"getLocation",m,t,["added","address","city","country","id","latitude","longitude","modified","state","street","zip",...n],{onSuccess:i});return a}catch(t){throw o.dispatch({error:t,type:s.GET_ITEM_ERROR}),t}},listByItem:async(e,n=[])=>{try{const t={itemId:{type:"ID!",value:e}},i=(c={})=>{const{locationsByItem:r=[]}=c;return o.dispatch({itemId:e,list:r,type:s.GET_LIST_SUCCESS})},{locationsByItem:a}=await g(o,"locationsByItem",m,t,["added","address","city","country","id","latitude","longitude","modified","state","street","zip",...n],{onSuccess:i});return a}catch(t){throw o.dispatch({error:t,type:s.GET_LIST_ERROR}),t}},update:async(e,n=[])=>{try{const t={location:{type:"LocationUpdateInput!",value:d(e,p)}},i=(c={})=>{const{updateLocation:r={}}=c;return o.dispatch({location:r,type:s.UPDATE_ITEM_SUCCESS})},{location:a}=await g(o,"updateLocation",m,t,["added","address","city","country","id","latitude","longitude","modified","state","street","zip",...n],{onSuccess:i});return a}catch(t){throw o.dispatch({error:t,type:s.UPDATE_ITEM_ERROR}),t}},updateLocationAdapter:e=>{l=e,d=O(l,p)},updateLocationAdapterOptions:e=>{p={...p,...e},d=O(l,p)}}};export{$ as createLocationActions};
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FjdGlvbnMvbG9jYXRpb25BY3Rpb25zL2xvY2F0aW9uQWN0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Z2V0IGFzIGh0dHBHZXR9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHt2YWxpZGF0ZUxvY2F0aW9uSW5wdXR9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL2xvY2F0aW9uQWRhcHRlci9sb2NhdGlvbkFkYXB0ZXInO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge0xPQ0FUSU9OX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL2xvY2F0aW9uU3RvcmUnO1xuaW1wb3J0IHthcHBNdXRhdGlvbn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpJztcbmltcG9ydCB7YXV0b0NvbXBsZXRlTG9jYXRpb259IGZyb20gJy4uLy4uL3V0aWxzL2xvY2F0aW9uJztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7VXNlcn0gZnJvbSAnLi4vLi4vYWRhcHRlcnMnO1xuaW1wb3J0IHR5cGUge0xvY2F0aW9uVHlwZX0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvbG9jYXRpb25BZGFwdGVyL2xvY2F0aW9uQWRhcHRlcic7XG5pbXBvcnQgdHlwZSB7QXBpUmVzdWx0c1R5cGUsIFJlYWt0b3JEYkNvbGxlY3Rpb259IGZyb20gJy4uLy4uL3V0aWxzL2FwaSc7XG5cbmNvbnN0IERBVEFfVFlQRTogUmVha3RvckRiQ29sbGVjdGlvbiA9ICdsb2NhdGlvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQWRhcHRlck9wdGlvbnMge1xuICBzdHJpY3Q/OiBib29sZWFuO1xuICBhbGxvd1BhcnRpYWw/OiBib29sZWFuO1xuICBlbnZpcm9ubWVudD86ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbicgfCAndGVzdCc7XG4gIGN1c3RvbVZhbGlkYXRpb24/OiAoaW5wdXQ6IHVua25vd24pID0+IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb25BY3Rpb25zT3B0aW9ucyB7XG4gIGxvY2F0aW9uQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IExvY2F0aW9uQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgbG9jYXRpb25BZGFwdGVyT3B0aW9ucz86IExvY2F0aW9uQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCB0eXBlIExvY2F0aW9uQXBpUmVzdWx0c1R5cGUgPSB7XG4gIGFkZExvY2F0aW9uOiBMb2NhdGlvblR5cGU7XG4gIGRlbGV0ZUxvY2F0aW9uOiBMb2NhdGlvblR5cGU7XG4gIGdldExvY2F0aW9uOiBMb2NhdGlvblR5cGU7XG4gIGdldExvY2F0aW9uc0J5SXRlbTogTG9jYXRpb25UeXBlW107XG4gIHVwZGF0ZUxvY2F0aW9uOiBMb2NhdGlvblR5cGU7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQWN0aW9ucyB7XG4gIGF1dG9jb21wbGV0ZUxvY2F0aW9uOiAoYWRkcmVzczogc3RyaW5nLCBsYXRpdHVkZT86IG51bWJlciwgbG9uZ2l0dWRlPzogbnVtYmVyLCBsb2NhdGlvblByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8TG9jYXRpb25UeXBlW10+O1xuICBhZGQ6IChsb2NhdGlvbjogUGFydGlhbDxMb2NhdGlvblR5cGU+LCBsb2NhdGlvblByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8TG9jYXRpb25UeXBlPjtcbiAgZGVsZXRlOiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPExvY2F0aW9uVHlwZT47XG4gIGdldEN1cnJlbnRMb2NhdGlvbjogKHNldExvY2F0aW9uPzogKGxvY2F0aW9uOiBMb2NhdGlvblR5cGUpID0+IHZvaWQpID0+IFByb21pc2U8TG9jYXRpb25UeXBlPjtcbiAgZ2V0R29vZ2xlTG9jYXRpb246IChhZGRyZXNzOiBzdHJpbmcpID0+IFByb21pc2U8e2xhdGl0dWRlOiBudW1iZXI7IGxvY2F0aW9uOiBzdHJpbmc7IGxvbmdpdHVkZTogbnVtYmVyfT47XG4gIGdldExvY2F0aW9uOiAobG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb25UeXBlPiwgbG9jYXRpb25Qcm9wcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPExvY2F0aW9uVHlwZT47XG4gIGxpc3RCeUl0ZW06IChpdGVtSWQ6IHN0cmluZywgbG9jYXRpb25Qcm9wcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPExvY2F0aW9uVHlwZVtdPjtcbiAgdXBkYXRlOiAobG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb25UeXBlPiwgbG9jYXRpb25Qcm9wcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPExvY2F0aW9uVHlwZT47XG4gIHVwZGF0ZUxvY2F0aW9uQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IExvY2F0aW9uQWRhcHRlck9wdGlvbnMpID0+IGFueSkgPT4gdm9pZDtcbiAgdXBkYXRlTG9jYXRpb25BZGFwdGVyT3B0aW9uczogKG9wdGlvbnM6IExvY2F0aW9uQWRhcHRlck9wdGlvbnMpID0+IHZvaWQ7XG59XG5cbi8vIERlZmF1bHQgdmFsaWRhdGlvbiBmdW5jdGlvblxuY29uc3QgZGVmYXVsdExvY2F0aW9uVmFsaWRhdG9yID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogTG9jYXRpb25BZGFwdGVyT3B0aW9ucykgPT4gdmFsaWRhdGVMb2NhdGlvbklucHV0KGlucHV0KTtcblxuLy8gRW5oYW5jZWQgdmFsaWRhdGlvbiBmdW5jdGlvbiB0aGF0IG1lcmdlcyBjdXN0b20gbG9naWMgd2l0aCBkZWZhdWx0c1xuY29uc3QgY3JlYXRlTG9jYXRpb25WYWxpZGF0b3IgPSAoXG4gIGN1c3RvbUFkYXB0ZXI/OiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zKSA9PiBhbnksXG4gIG9wdGlvbnM/OiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zXG4pID0+IChpbnB1dDogdW5rbm93biwgdmFsaWRhdG9yT3B0aW9ucz86IExvY2F0aW9uQWRhcHRlck9wdGlvbnMpID0+IHtcbiAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsuLi5vcHRpb25zLCAuLi52YWxpZGF0b3JPcHRpb25zfTtcblxuICAvLyBTdGFydCB3aXRoIGRlZmF1bHQgdmFsaWRhdGlvblxuICBsZXQgdmFsaWRhdGVkID0gZGVmYXVsdExvY2F0aW9uVmFsaWRhdG9yKGlucHV0LCBtZXJnZWRPcHRpb25zKTtcblxuICAvLyBBcHBseSBjdXN0b20gdmFsaWRhdGlvbiBpZiBwcm92aWRlZFxuICBpZihjdXN0b21BZGFwdGVyKSB7XG4gICAgdmFsaWRhdGVkID0gY3VzdG9tQWRhcHRlcih2YWxpZGF0ZWQsIG1lcmdlZE9wdGlvbnMpO1xuICB9XG5cbiAgLy8gQXBwbHkgY3VzdG9tIHZhbGlkYXRpb24gZnJvbSBvcHRpb25zIGlmIHByb3ZpZGVkXG4gIGlmKG1lcmdlZE9wdGlvbnM/LmN1c3RvbVZhbGlkYXRpb24pIHtcbiAgICB2YWxpZGF0ZWQgPSBtZXJnZWRPcHRpb25zLmN1c3RvbVZhbGlkYXRpb24odmFsaWRhdGVkKSBhcyBMb2NhdGlvblR5cGU7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkO1xufTtcblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBMb2NhdGlvbkFjdGlvbnMgd2l0aCBlbmhhbmNlZCBhZGFwdGVyIGluamVjdGlvbiBjYXBhYmlsaXRpZXMuXG4gKiBDdXN0b20gYWRhcHRlcnMgYXJlIG1lcmdlZCB3aXRoIGRlZmF1bHQgYmVoYXZpb3IsIGFsbG93aW5nIHBhcnRpYWwgb3ZlcnJpZGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZSB3aXRoIGRlZmF1bHQgYWRhcHRlcnNcbiAqIGNvbnN0IGxvY2F0aW9uQWN0aW9ucyA9IGNyZWF0ZUxvY2F0aW9uQWN0aW9ucyhmbHV4KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3VzdG9tIGFkYXB0ZXIgdGhhdCBleHRlbmRzIGRlZmF1bHQgYmVoYXZpb3JcbiAqIGNvbnN0IGN1c3RvbUxvY2F0aW9uQWRhcHRlciA9IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IExvY2F0aW9uQWRhcHRlck9wdGlvbnMpID0+IHtcbiAqICAgLy8gaW5wdXQgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgYnkgZGVmYXVsdCBhZGFwdGVyXG4gKiAgIGlmIChpbnB1dC5sYXRpdHVkZSAmJiAoaW5wdXQubGF0aXR1ZGUgPCAtOTAgfHwgaW5wdXQubGF0aXR1ZGUgPiA5MCkpIHtcbiAqICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGF0aXR1ZGUnKTtcbiAqICAgfVxuICogICByZXR1cm4gaW5wdXQ7XG4gKiB9O1xuICpcbiAqIGNvbnN0IGxvY2F0aW9uQWN0aW9ucyA9IGNyZWF0ZUxvY2F0aW9uQWN0aW9ucyhmbHV4LCB7XG4gKiAgIGxvY2F0aW9uQWRhcHRlcjogY3VzdG9tTG9jYXRpb25BZGFwdGVyXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvY2F0aW9uQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IExvY2F0aW9uQWN0aW9uc09wdGlvbnNcbik6IExvY2F0aW9uQWN0aW9ucyA9PiB7XG4gIC8vIEluaXRpYWxpemUgYWRhcHRlciBzdGF0ZVxuICBsZXQgbG9jYXRpb25BZGFwdGVyT3B0aW9uczogTG9jYXRpb25BZGFwdGVyT3B0aW9ucyA9IG9wdGlvbnM/LmxvY2F0aW9uQWRhcHRlck9wdGlvbnMgfHwge307XG4gIGxldCBjdXN0b21Mb2NhdGlvbkFkYXB0ZXIgPSBvcHRpb25zPy5sb2NhdGlvbkFkYXB0ZXI7XG5cbiAgLy8gQ3JlYXRlIHZhbGlkYXRvcnMgdGhhdCBtZXJnZSBjdXN0b20gYWRhcHRlcnMgd2l0aCBkZWZhdWx0c1xuICBsZXQgdmFsaWRhdGVMb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uVmFsaWRhdG9yKGN1c3RvbUxvY2F0aW9uQWRhcHRlciwgbG9jYXRpb25BZGFwdGVyT3B0aW9ucyk7XG5cbiAgLy8gVXBkYXRlIGZ1bmN0aW9ucyB0aGF0IHJlY3JlYXRlIHZhbGlkYXRvcnNcbiAgY29uc3QgdXBkYXRlTG9jYXRpb25BZGFwdGVyID0gKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IExvY2F0aW9uQWRhcHRlck9wdGlvbnMpID0+IGFueSk6IHZvaWQgPT4ge1xuICAgIGN1c3RvbUxvY2F0aW9uQWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgdmFsaWRhdGVMb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uVmFsaWRhdG9yKGN1c3RvbUxvY2F0aW9uQWRhcHRlciwgbG9jYXRpb25BZGFwdGVyT3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlTG9jYXRpb25BZGFwdGVyT3B0aW9ucyA9IChvcHRpb25zOiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zKTogdm9pZCA9PiB7XG4gICAgbG9jYXRpb25BZGFwdGVyT3B0aW9ucyA9IHsuLi5sb2NhdGlvbkFkYXB0ZXJPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICB2YWxpZGF0ZUxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb25WYWxpZGF0b3IoY3VzdG9tTG9jYXRpb25BZGFwdGVyLCBsb2NhdGlvbkFkYXB0ZXJPcHRpb25zKTtcbiAgfTtcblxuICAvLyBBY3Rpb24gaW1wbGVtZW50YXRpb25zXG4gIGNvbnN0IGF1dG9jb21wbGV0ZUxvY2F0aW9uID0gYXN5bmMgKFxuICAgIGFkZHJlc3M6IHN0cmluZyxcbiAgICBsYXRpdHVkZT86IG51bWJlcixcbiAgICBsb25naXR1ZGU/OiBudW1iZXIsXG4gICAgbG9jYXRpb25Qcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPExvY2F0aW9uVHlwZVtdPiA9PiBhdXRvQ29tcGxldGVMb2NhdGlvbihmbHV4LCBhZGRyZXNzLCBsYXRpdHVkZSwgbG9uZ2l0dWRlLCBsb2NhdGlvblByb3BzKTtcblxuICBjb25zdCBhZGQgPSBhc3luYyAoXG4gICAgbG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb25UeXBlPixcbiAgICBsb2NhdGlvblByb3BzOiBzdHJpbmdbXSA9IFtdXG4gICk6IFByb21pc2U8TG9jYXRpb25UeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgIHR5cGU6ICdMb2NhdGlvbklucHV0IScsXG4gICAgICAgICAgdmFsdWU6IHZhbGlkYXRlTG9jYXRpb24obG9jYXRpb24sIGxvY2F0aW9uQWRhcHRlck9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHthZGRMb2NhdGlvbiA9IHt9fSA9IGRhdGE7XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsb2NhdGlvbjogYWRkTG9jYXRpb24sIHR5cGU6IExPQ0FUSU9OX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7bG9jYXRpb246IGFkZGVkTG9jYXRpb259ID0gYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdhZGRMb2NhdGlvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnYWRkZWQnLFxuICAgICAgICAgICdhZGRyZXNzJyxcbiAgICAgICAgICAnY2l0eScsXG4gICAgICAgICAgJ2NvdW50cnknLFxuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAgICdzdGF0ZScsXG4gICAgICAgICAgJ3N0cmVldCcsXG4gICAgICAgICAgJ3ppcCcsXG4gICAgICAgICAgLi4ubG9jYXRpb25Qcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBhZGRlZExvY2F0aW9uIGFzIExvY2F0aW9uVHlwZTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLkFERF9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlTG9jYXRpb24gPSBhc3luYyAobG9jYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxMb2NhdGlvblR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGxvY2F0aW9uSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogbG9jYXRpb25JZFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCB7ZGVsZXRlTG9jYXRpb246IGxvY2F0aW9uID0ge319ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xvY2F0aW9uLCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuUkVNT1ZFX0lURU1fU1VDQ0VTU30pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qge2xvY2F0aW9uOiBkZWxldGVkTG9jYXRpb259ID0gYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdkZWxldGVMb2NhdGlvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsnaWQnXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVsZXRlZExvY2F0aW9uIGFzIExvY2F0aW9uVHlwZTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLlJFTU9WRV9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0Q3VycmVudExvY2F0aW9uID0gYXN5bmMgKHNldExvY2F0aW9uPzogKGxvY2F0aW9uOiBMb2NhdGlvblR5cGUpID0+IHZvaWQpOiBQcm9taXNlPExvY2F0aW9uVHlwZT4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHt1c2VySWR9OiBVc2VyID0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pO1xuICAgIGNvbnN0IHtjaXR5LCBjb3VudHJ5LCBsYXRpdHVkZSwgbG9uZ2l0dWRlLCBzdGF0ZX06IFVzZXIgPSBmbHV4LmdldFN0YXRlKFsndXNlcicsICd1c2VycycsIHVzZXJJZCB8fCAnJ10sIHt9KTtcbiAgICBjb25zdCBsb2NhdGlvblN0cjogc3RyaW5nID0gW2NpdHksIHN0YXRlLCBjb3VudHJ5XS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHByb2ZpbGVMb2NhdGlvbiA9IHtcbiAgICAgIGxhdGl0dWRlLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU3RyLFxuICAgICAgbG9uZ2l0dWRlXG4gICAgfSBhcyBMb2NhdGlvblR5cGU7XG5cbiAgICBpZihuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pIHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oXG4gICAgICAgIGFzeW5jICh7Y29vcmRzfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB7XG4gICAgICAgICAgICBsYXRpdHVkZTogY29vcmRzLmxhdGl0dWRlLFxuICAgICAgICAgICAgbG9jYXRpb246ICdDdXJyZW50IExvY2F0aW9uJyxcbiAgICAgICAgICAgIGxvbmdpdHVkZTogY29vcmRzLmxvbmdpdHVkZVxuICAgICAgICAgIH0gYXMgTG9jYXRpb25UeXBlO1xuICAgICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2N1cnJlbnQsIHR5cGU6IExPQ0FUSU9OX0NPTlNUQU5UUy5TRVRfQ1VSUkVOVH0pO1xuICAgICAgICAgIGlmKHNldExvY2F0aW9uKSB7XG4gICAgICAgICAgICBzZXRMb2NhdGlvbihjdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShjdXJyZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgKGxvY2F0aW9uRXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0Q3VycmVudExvY2F0aW9uOjpsb2NhdGlvbkVycm9yJywgbG9jYXRpb25FcnJvcik7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2dldEN1cnJlbnRMb2NhdGlvbjo6cHJvZmlsZUxvY2F0aW9uMScsIHByb2ZpbGVMb2NhdGlvbik7XG4gICAgICAgICAgaWYoc2V0TG9jYXRpb24pIHtcbiAgICAgICAgICAgIHNldExvY2F0aW9uKHByb2ZpbGVMb2NhdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmx1eC5kaXNwYXRjaCh7Y3VycmVudDogcHJvZmlsZUxvY2F0aW9uLCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuU0VUX0NVUlJFTlR9KTtcbiAgICAgICAgICByZWplY3QobG9jYXRpb25FcnJvcik7XG4gICAgICAgIH0sXG4gICAgICAgIHtlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLCBtYXhpbXVtQWdlOiAwLCB0aW1lb3V0OiAzMDAwMH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdnZXRDdXJyZW50TG9jYXRpb246OnByb2ZpbGVMb2NhdGlvbjInLCBwcm9maWxlTG9jYXRpb24pO1xuICAgICAgaWYoc2V0TG9jYXRpb24pIHtcbiAgICAgICAgc2V0TG9jYXRpb24ocHJvZmlsZUxvY2F0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZmx1eC5kaXNwYXRjaCh7Y3VycmVudDogcHJvZmlsZUxvY2F0aW9uLCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuU0VUX0NVUlJFTlR9KTtcbiAgICAgIHJlamVjdCgnR2VvbG9jYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuJyk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBnZXRHb29nbGVMb2NhdGlvbiA9IGFzeW5jIChhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPHtsYXRpdHVkZTogbnVtYmVyOyBsb2NhdGlvbjogc3RyaW5nOyBsb25naXR1ZGU6IG51bWJlcn0+ID0+IHtcbiAgICBjb25zdCB7a2V5OiBnb29nbGVLZXksIHVybDogZ29vZ2xlVXJsfSA9IENvbmZpZy5nZXQoJ2dvb2dsZS5tYXBzJykgYXMge2tleTogc3RyaW5nOyB1cmw6IHN0cmluZ307XG4gICAgY29uc3QgZm9ybWF0QWRkcmVzczogc3RyaW5nID0gZW5jb2RlVVJJKGFkZHJlc3MpO1xuICAgIGNvbnN0IHVybDogc3RyaW5nID0gYCR7Z29vZ2xlVXJsfT9hZGRyZXNzPSR7Zm9ybWF0QWRkcmVzc30ma2V5PSR7Z29vZ2xlS2V5fWA7XG5cbiAgICBpZih1cmwpIHtcbiAgICAgIHJldHVybiB7bGF0aXR1ZGU6IDAsIGxvY2F0aW9uOiAnJywgbG9uZ2l0dWRlOiAwfTtcbiAgICB9XG4gICAgcmV0dXJuIGh0dHBHZXQodXJsKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCB7cmVzdWx0c30gPSBkYXRhO1xuICAgICAgY29uc3QgbG9jYXRpb25EYXRhID0gcmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA/IHJlc3VsdHNbMF0gOiB7fTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZm9ybWF0dGVkX2FkZHJlc3M6IGxvY2F0aW9uLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgIGxvY2F0aW9uOiB7bGF0OiBsYXRpdHVkZSwgbG5nOiBsb25naXR1ZGV9XG4gICAgICAgIH1cbiAgICAgIH0gPSBsb2NhdGlvbkRhdGE7XG4gICAgICByZXR1cm4ge2xhdGl0dWRlLCBsb2NhdGlvbiwgbG9uZ2l0dWRlfTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBnZXRMb2NhdGlvbiA9IGFzeW5jIChcbiAgICBsb2NhdGlvbjogUGFydGlhbDxMb2NhdGlvblR5cGU+LFxuICAgIGxvY2F0aW9uUHJvcHM6IHN0cmluZ1tdID0gW11cbiAgKTogUHJvbWlzZTxMb2NhdGlvblR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgdHlwZTogJ0xvY2F0aW9uSW5wdXQhJyxcbiAgICAgICAgICB2YWx1ZTogdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbiwgbG9jYXRpb25BZGFwdGVyT3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgICAgY29uc3Qge2dldExvY2F0aW9uID0ge319ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xvY2F0aW9uOiBnZXRMb2NhdGlvbiwgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLkdFVF9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHtsb2NhdGlvbjogbG9jYXRpb25SZXN1bHR9ID0gYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdnZXRMb2NhdGlvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnYWRkZWQnLFxuICAgICAgICAgICdhZGRyZXNzJyxcbiAgICAgICAgICAnY2l0eScsXG4gICAgICAgICAgJ2NvdW50cnknLFxuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAgICdzdGF0ZScsXG4gICAgICAgICAgJ3N0cmVldCcsXG4gICAgICAgICAgJ3ppcCcsXG4gICAgICAgICAgLi4ubG9jYXRpb25Qcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBsb2NhdGlvblJlc3VsdCBhcyBMb2NhdGlvblR5cGU7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IExPQ0FUSU9OX0NPTlNUQU5UUy5HRVRfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUl0ZW0gPSBhc3luYyAoXG4gICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgbG9jYXRpb25Qcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPExvY2F0aW9uVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBpdGVtSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogaXRlbUlkXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtsb2NhdGlvbnNCeUl0ZW0gPSBbXX0gPSBkYXRhIGFzIHtsb2NhdGlvbnNCeUl0ZW06IExvY2F0aW9uVHlwZVtdfTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICBsaXN0OiBsb2NhdGlvbnNCeUl0ZW0sXG4gICAgICAgICAgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1NcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7bG9jYXRpb25zQnlJdGVtfSA9IGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAnbG9jYXRpb25zQnlJdGVtJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgW1xuICAgICAgICAgICdhZGRlZCcsXG4gICAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgICAgICdjaXR5JyxcbiAgICAgICAgICAnY291bnRyeScsXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAnbGF0aXR1ZGUnLFxuICAgICAgICAgICdsb25naXR1ZGUnLFxuICAgICAgICAgICdtb2RpZmllZCcsXG4gICAgICAgICAgJ3N0YXRlJyxcbiAgICAgICAgICAnc3RyZWV0JyxcbiAgICAgICAgICAnemlwJyxcbiAgICAgICAgICAuLi5sb2NhdGlvblByb3BzXG4gICAgICAgIF0sXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGxvY2F0aW9uc0J5SXRlbSBhcyBMb2NhdGlvblR5cGVbXTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLkdFVF9MSVNUX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlID0gYXN5bmMgKFxuICAgIGxvY2F0aW9uOiBQYXJ0aWFsPExvY2F0aW9uVHlwZT4sXG4gICAgbG9jYXRpb25Qcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPExvY2F0aW9uVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICB0eXBlOiAnTG9jYXRpb25VcGRhdGVJbnB1dCEnLFxuICAgICAgICAgIHZhbHVlOiB2YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uLCBsb2NhdGlvbkFkYXB0ZXJPcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCB7dXBkYXRlTG9jYXRpb24gPSB7fX0gPSBkYXRhO1xuICAgICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7bG9jYXRpb246IHVwZGF0ZUxvY2F0aW9uLCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTU30pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qge2xvY2F0aW9uOiB1cGRhdGVkTG9jYXRpb259ID0gYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICd1cGRhdGVMb2NhdGlvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnYWRkZWQnLFxuICAgICAgICAgICdhZGRyZXNzJyxcbiAgICAgICAgICAnY2l0eScsXG4gICAgICAgICAgJ2NvdW50cnknLFxuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAgICdzdGF0ZScsXG4gICAgICAgICAgJ3N0cmVldCcsXG4gICAgICAgICAgJ3ppcCcsXG4gICAgICAgICAgLi4ubG9jYXRpb25Qcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICAgIHJldHVybiB1cGRhdGVkTG9jYXRpb24gYXMgTG9jYXRpb25UeXBlO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuVVBEQVRFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIGFjdGlvbnMgb2JqZWN0XG4gIHJldHVybiB7XG4gICAgYXV0b2NvbXBsZXRlTG9jYXRpb24sXG4gICAgYWRkLFxuICAgIGRlbGV0ZTogZGVsZXRlTG9jYXRpb24sXG4gICAgZ2V0Q3VycmVudExvY2F0aW9uLFxuICAgIGdldEdvb2dsZUxvY2F0aW9uLFxuICAgIGdldExvY2F0aW9uLFxuICAgIGxpc3RCeUl0ZW0sXG4gICAgdXBkYXRlLFxuICAgIHVwZGF0ZUxvY2F0aW9uQWRhcHRlcixcbiAgICB1cGRhdGVMb2NhdGlvbkFkYXB0ZXJPcHRpb25zXG4gIH07XG59O1xuXG4iXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFRLE9BQU9BLE1BQWMsb0JBRTdCLE9BQVEseUJBQUFDLE1BQTRCLGlEQUNwQyxPQUFRLFVBQUFDLE1BQWEsZUFDckIsT0FBUSxzQkFBQUMsTUFBeUIsNkJBQ2pDLE9BQVEsZUFBQUMsTUFBa0Isa0JBQzFCLE9BQVEsd0JBQUFDLE1BQTJCLHVCQU9uQyxNQUFNQyxFQUFpQyxZQW9DakNDLEVBQTJCLENBQUNDLEVBQWdCQyxJQUFxQ1IsRUFBc0JPLENBQUssRUFHNUdFLEVBQTBCLENBQzlCQyxFQUNBRixJQUNHLENBQUNELEVBQWdCSSxJQUE4QyxDQUNsRSxNQUFNQyxFQUFnQixDQUFDLEdBQUdKLEVBQVMsR0FBR0csQ0FBZ0IsRUFHdEQsSUFBSUUsRUFBWVAsRUFBeUJDLEVBQU9LLENBQWEsRUFHN0QsT0FBR0YsSUFDREcs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dHRwR2V0IiwgInZhbGlkYXRlTG9jYXRpb25JbnB1dCIsICJDb25maWciLCAiTE9DQVRJT05fQ09OU1RBTlRTIiwgImFwcE11dGF0aW9uIiwgImF1dG9Db21wbGV0ZUxvY2F0aW9uIiwgIkRBVEFfVFlQRSIsICJkZWZhdWx0TG9jYXRpb25WYWxpZGF0b3IiLCAiaW5wdXQiLCAib3B0aW9ucyIsICJjcmVhdGVMb2NhdGlvblZhbGlkYXRvciIsICJjdXN0b21BZGFwdGVyIiwgInZhbGlkYXRvck9wdGlvbnMiLCAibWVyZ2VkT3B0aW9ucyIsICJ2YWxpZGF0ZWQiLCAiY3JlYXRlTG9jYXRpb25BY3Rpb25zIiwgImZsdXgiLCAibG9jYXRpb25BZGFwdGVyT3B0aW9ucyIsICJjdXN0b21Mb2NhdGlvbkFkYXB0ZXIiLCAidmFsaWRhdGVMb2NhdGlvbiIsICJhZGRyZXNzIiwgImxhdGl0dWRlIiwgImxvbmdpdHVkZSIsICJsb2NhdGlvblByb3BzIiwgImxvY2F0aW9uIiwgInF1ZXJ5VmFyaWFibGVzIiwgIm9uU3VjY2VzcyIsICJkYXRhIiwgImFkZExvY2F0aW9uIiwgImFkZGVkTG9jYXRpb24iLCAiZXJyb3IiLCAibG9jYXRpb25JZCIsICJkZWxldGVkTG9jYXRpb24iLCAic2V0TG9jYXRpb24iLCAicmVzb2x2ZSIsICJyZWplY3QiLCAidXNlcklkIiwgImNpdHkiLCAiY291bnRyeSIsICJzdGF0ZSIsICJsb2NhdGlvblN0ciIsICJwcm9maWxlTG9jYXRpb24iLCAiY29vcmRzIiwgImN1cnJlbnQiLCAibG9jYXRpb25FcnJvciIsICJnb29nbGVLZXkiLCAiZ29vZ2xlVXJsIiwgImZvcm1hdEFkZHJlc3MiLCAidXJsIiwgInJlc3VsdHMiLCAibG9jYXRpb25EYXRhIiwgImdldExvY2F0aW9uIiwgImxvY2F0aW9uUmVzdWx0IiwgIml0ZW1JZCIsICJsb2NhdGlvbnNCeUl0ZW0iLCAidXBkYXRlTG9jYXRpb24iLCAidXBkYXRlZExvY2F0aW9uIiwgImFkYXB0ZXIiXQp9Cg==
1
+ /**
2
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { validateLocationInput } from '../../adapters/locationAdapter/locationAdapter.js';
5
+ import { LOCATION_CONSTANTS } from '../../stores/locationStore.js';
6
+ import { appMutation } from '../../utils/api.js';
7
+ import { autoCompleteLocation } from '../../utils/location.js';
8
+ import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
9
+ const DATA_TYPE = 'locations';
10
+ // Default validation function
11
+ const defaultLocationValidator = (input, options)=>validateLocationInput(input);
12
+ // Enhanced validation function that merges custom logic with defaults
13
+ const createLocationValidator = (customAdapter, options)=>(input, validatorOptions)=>{
14
+ const mergedOptions = {
15
+ ...options,
16
+ ...validatorOptions
17
+ };
18
+ // Start with default validation
19
+ let validated = defaultLocationValidator(input, mergedOptions);
20
+ // Apply custom validation if provided
21
+ if (customAdapter) {
22
+ validated = customAdapter(validated, mergedOptions);
23
+ }
24
+ // Apply custom validation from options if provided
25
+ if (mergedOptions?.customValidation) {
26
+ validated = mergedOptions.customValidation(validated);
27
+ }
28
+ return validated;
29
+ };
30
+ /**
31
+ * Factory function to create LocationActions with enhanced adapter injection capabilities.
32
+ * Custom adapters are merged with default behavior, allowing partial overrides.
33
+ *
34
+ * @example
35
+ * // Basic usage with default adapters
36
+ * const locationActions = createLocationActions(flux);
37
+ *
38
+ * @example
39
+ * // Custom adapter that extends default behavior
40
+ * const customLocationAdapter = (input: unknown, options?: LocationAdapterOptions) => {
41
+ * // input is already validated by default adapter
42
+ * if (input.latitude && (input.latitude < -90 || input.latitude > 90)) {
43
+ * throw new Error('Invalid latitude');
44
+ * }
45
+ * return input;
46
+ * };
47
+ *
48
+ * const locationActions = createLocationActions(flux, {
49
+ * locationAdapter: customLocationAdapter
50
+ * });
51
+ */ export const createLocationActions = (flux, options)=>{
52
+ // Initialize adapter state
53
+ let locationAdapterOptions = options?.locationAdapterOptions || {};
54
+ let customLocationAdapter = options?.locationAdapter;
55
+ // Create validators that merge custom adapters with defaults
56
+ let validateLocation = createLocationValidator(customLocationAdapter, locationAdapterOptions);
57
+ // Update functions that recreate validators
58
+ const updateLocationAdapter = (adapter)=>{
59
+ customLocationAdapter = adapter;
60
+ validateLocation = createLocationValidator(customLocationAdapter, locationAdapterOptions);
61
+ };
62
+ const updateLocationAdapterOptions = (options)=>{
63
+ locationAdapterOptions = {
64
+ ...locationAdapterOptions,
65
+ ...options
66
+ };
67
+ validateLocation = createLocationValidator(customLocationAdapter, locationAdapterOptions);
68
+ };
69
+ // Action implementations
70
+ const autocompleteLocation = async (address, latitude, longitude, locationProps = [], requestOptions = {})=>{
71
+ const cachedResult = getCachedRequest(flux, 'location.autocompleteLocation', {
72
+ address,
73
+ latitude,
74
+ locationProps,
75
+ longitude
76
+ }, requestOptions);
77
+ if (cachedResult) {
78
+ return cachedResult;
79
+ }
80
+ const result = await autoCompleteLocation(flux, address, latitude, longitude, locationProps);
81
+ return await setCachedRequest(flux, 'location.autocompleteLocation', {
82
+ address,
83
+ latitude,
84
+ locationProps,
85
+ longitude
86
+ }, result, requestOptions);
87
+ };
88
+ const add = async (location, locationProps = [], requestOptions = {})=>{
89
+ try {
90
+ const queryVariables = {
91
+ location: {
92
+ type: 'LocationInput!',
93
+ value: validateLocation(location, locationAdapterOptions)
94
+ }
95
+ };
96
+ const onSuccess = (data = {})=>{
97
+ const addLocation = data?.addLocation || {};
98
+ return flux.dispatch({
99
+ location: addLocation,
100
+ type: LOCATION_CONSTANTS.ADD_ITEM_SUCCESS
101
+ });
102
+ };
103
+ return await appMutation(flux, 'addLocation', DATA_TYPE, queryVariables, [
104
+ 'added',
105
+ 'address',
106
+ 'city',
107
+ 'country',
108
+ 'id',
109
+ 'latitude',
110
+ 'longitude',
111
+ 'modified',
112
+ 'state',
113
+ 'street',
114
+ 'zip',
115
+ ...locationProps
116
+ ], {
117
+ onSuccess
118
+ });
119
+ } catch (error) {
120
+ flux.dispatch({
121
+ error,
122
+ type: LOCATION_CONSTANTS.ADD_ITEM_ERROR
123
+ });
124
+ throw error;
125
+ } finally{
126
+ await clearCachedRequest(flux, 'location.autocompleteLocation');
127
+ }
128
+ };
129
+ const deleteLocation = async (locationId, requestOptions = {})=>{
130
+ try {
131
+ const queryVariables = {
132
+ locationId: {
133
+ type: 'ID!',
134
+ value: locationId
135
+ }
136
+ };
137
+ const onSuccess = (data = {})=>{
138
+ const location = data?.deleteLocation || {};
139
+ return flux.dispatch({
140
+ location,
141
+ type: LOCATION_CONSTANTS.REMOVE_ITEM_SUCCESS
142
+ });
143
+ };
144
+ return await appMutation(flux, 'deleteLocation', DATA_TYPE, queryVariables, [
145
+ 'id'
146
+ ], {
147
+ onSuccess
148
+ });
149
+ } catch (error) {
150
+ flux.dispatch({
151
+ error,
152
+ type: LOCATION_CONSTANTS.REMOVE_ITEM_ERROR
153
+ });
154
+ throw error;
155
+ } finally{
156
+ await clearCachedRequest(flux, `location.listByItem:${locationId}`);
157
+ }
158
+ };
159
+ const getCurrentLocation = async (setLocation, requestOptions = {})=>new Promise((resolve, reject)=>{
160
+ const { userId } = flux.getState('user.session', {});
161
+ const { city, country, latitude, longitude, state } = flux.getState([
162
+ 'user',
163
+ 'users',
164
+ userId || ''
165
+ ], {});
166
+ const locationStr = [
167
+ city,
168
+ state,
169
+ country
170
+ ].join(', ');
171
+ const personaLocation = {
172
+ latitude,
173
+ location: locationStr,
174
+ longitude
175
+ };
176
+ if (navigator.geolocation) {
177
+ navigator.geolocation.getCurrentPosition(async ({ coords })=>{
178
+ const current = {
179
+ latitude: coords.latitude,
180
+ location: 'Current Location',
181
+ longitude: coords.longitude
182
+ };
183
+ await flux.dispatch({
184
+ current,
185
+ type: LOCATION_CONSTANTS.SET_CURRENT
186
+ });
187
+ if (setLocation) {
188
+ setLocation(current);
189
+ }
190
+ resolve(current);
191
+ }, (locationError)=>{
192
+ console.log('getCurrentLocation::locationError', locationError);
193
+ console.log('getCurrentLocation::personaLocation1', personaLocation);
194
+ if (setLocation) {
195
+ setLocation(personaLocation);
196
+ }
197
+ flux.dispatch({
198
+ current: personaLocation,
199
+ type: LOCATION_CONSTANTS.SET_CURRENT
200
+ });
201
+ reject(locationError);
202
+ }, {
203
+ enableHighAccuracy: false,
204
+ maximumAge: 0,
205
+ timeout: 30000
206
+ });
207
+ } else {
208
+ console.log('getCurrentLocation::personaLocation2', personaLocation);
209
+ if (setLocation) {
210
+ setLocation(personaLocation);
211
+ }
212
+ flux.dispatch({
213
+ current: personaLocation,
214
+ type: LOCATION_CONSTANTS.SET_CURRENT
215
+ });
216
+ reject('Geolocation is not supported by this browser.');
217
+ }
218
+ });
219
+ const getGoogleLocation = async (address, requestOptions = {})=>{
220
+ const locations = await autocompleteLocation(address, undefined, undefined, [], requestOptions);
221
+ const [firstLocation = {}] = locations;
222
+ return {
223
+ latitude: firstLocation.latitude || 0,
224
+ location: firstLocation.location || '',
225
+ longitude: firstLocation.longitude || 0
226
+ };
227
+ };
228
+ const getLocation = async (location, locationProps = [], requestOptions = {})=>{
229
+ try {
230
+ const cachedResult = getCachedRequest(flux, 'location.getLocation', {
231
+ location,
232
+ locationProps
233
+ }, requestOptions);
234
+ if (cachedResult) {
235
+ return cachedResult;
236
+ }
237
+ const queryVariables = {
238
+ location: {
239
+ type: 'LocationInput!',
240
+ value: validateLocation(location, locationAdapterOptions)
241
+ }
242
+ };
243
+ const onSuccess = (data = {})=>{
244
+ const getLocation = data?.getLocation || {};
245
+ return flux.dispatch({
246
+ location: getLocation,
247
+ type: LOCATION_CONSTANTS.GET_ITEM_SUCCESS
248
+ });
249
+ };
250
+ const result = await appMutation(flux, 'getLocation', DATA_TYPE, queryVariables, [
251
+ 'added',
252
+ 'address',
253
+ 'city',
254
+ 'country',
255
+ 'id',
256
+ 'latitude',
257
+ 'longitude',
258
+ 'modified',
259
+ 'state',
260
+ 'street',
261
+ 'zip',
262
+ ...locationProps
263
+ ], {
264
+ onSuccess
265
+ });
266
+ return await setCachedRequest(flux, 'location.getLocation', {
267
+ location,
268
+ locationProps
269
+ }, result, requestOptions);
270
+ } catch (error) {
271
+ flux.dispatch({
272
+ error,
273
+ type: LOCATION_CONSTANTS.GET_ITEM_ERROR
274
+ });
275
+ throw error;
276
+ }
277
+ };
278
+ const listByItem = async (itemId, locationProps = [], requestOptions = {})=>{
279
+ try {
280
+ const cachedResult = getCachedRequest(flux, `location.listByItem:${itemId}`, {
281
+ itemId,
282
+ locationProps
283
+ }, requestOptions);
284
+ if (cachedResult) {
285
+ return cachedResult;
286
+ }
287
+ const queryVariables = {
288
+ itemId: {
289
+ type: 'ID!',
290
+ value: itemId
291
+ }
292
+ };
293
+ const onSuccess = (data = {})=>{
294
+ const locationsByItem = Array.isArray(data?.locationsByItem) ? data.locationsByItem || [] : [];
295
+ return flux.dispatch({
296
+ itemId,
297
+ list: locationsByItem,
298
+ type: LOCATION_CONSTANTS.GET_LIST_SUCCESS
299
+ });
300
+ };
301
+ const result = await appMutation(flux, 'locationsByItem', DATA_TYPE, queryVariables, [
302
+ 'added',
303
+ 'address',
304
+ 'city',
305
+ 'country',
306
+ 'id',
307
+ 'latitude',
308
+ 'longitude',
309
+ 'modified',
310
+ 'state',
311
+ 'street',
312
+ 'zip',
313
+ ...locationProps
314
+ ], {
315
+ onSuccess
316
+ });
317
+ return await setCachedRequest(flux, `location.listByItem:${itemId}`, {
318
+ itemId,
319
+ locationProps
320
+ }, result, requestOptions);
321
+ } catch (error) {
322
+ flux.dispatch({
323
+ error,
324
+ type: LOCATION_CONSTANTS.GET_LIST_ERROR
325
+ });
326
+ throw error;
327
+ }
328
+ };
329
+ const update = async (location, locationProps = [], requestOptions = {})=>{
330
+ try {
331
+ const queryVariables = {
332
+ location: {
333
+ type: 'LocationUpdateInput!',
334
+ value: validateLocation(location, locationAdapterOptions)
335
+ }
336
+ };
337
+ const onSuccess = (data = {})=>{
338
+ const updateLocation = data?.updateLocation || {};
339
+ return flux.dispatch({
340
+ location: updateLocation,
341
+ type: LOCATION_CONSTANTS.UPDATE_ITEM_SUCCESS
342
+ });
343
+ };
344
+ const result = await appMutation(flux, 'updateLocation', DATA_TYPE, queryVariables, [
345
+ 'added',
346
+ 'address',
347
+ 'city',
348
+ 'country',
349
+ 'id',
350
+ 'latitude',
351
+ 'longitude',
352
+ 'modified',
353
+ 'state',
354
+ 'street',
355
+ 'zip',
356
+ ...locationProps
357
+ ], {
358
+ onSuccess
359
+ });
360
+ return result;
361
+ } catch (error) {
362
+ flux.dispatch({
363
+ error,
364
+ type: LOCATION_CONSTANTS.UPDATE_ITEM_ERROR
365
+ });
366
+ throw error;
367
+ } finally{
368
+ await clearCachedRequest(flux, 'location.getLocation');
369
+ await clearCachedRequest(flux, 'location.autocompleteLocation');
370
+ await clearCachedRequest(flux, `location.listByItem:${String(location?.itemId || '')}`);
371
+ }
372
+ };
373
+ // Return the actions object
374
+ return {
375
+ autocompleteLocation,
376
+ add,
377
+ delete: deleteLocation,
378
+ getCurrentLocation,
379
+ getGoogleLocation,
380
+ getLocation,
381
+ listByItem,
382
+ update,
383
+ updateLocationAdapter,
384
+ updateLocationAdapterOptions
385
+ };
386
+ };
387
+
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9sb2NhdGlvbkFjdGlvbnMvbG9jYXRpb25BY3Rpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgeyB2YWxpZGF0ZUxvY2F0aW9uSW5wdXQgfSBmcm9tICcuLi8uLi9hZGFwdGVycy9sb2NhdGlvbkFkYXB0ZXIvbG9jYXRpb25BZGFwdGVyLmpzJztcbmltcG9ydCB7IExPQ0FUSU9OX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N0b3Jlcy9sb2NhdGlvblN0b3JlLmpzJztcbmltcG9ydCB7IGFwcE11dGF0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB7IGF1dG9Db21wbGV0ZUxvY2F0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9jYXRpb24uanMnO1xuaW1wb3J0IHsgY2xlYXJDYWNoZWRSZXF1ZXN0LCBnZXRDYWNoZWRSZXF1ZXN0LCBzZXRDYWNoZWRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdENhY2hlLmpzJztcblxuaW1wb3J0IHR5cGUgeyBGbHV4RnJhbWV3b3JrIH0gZnJvbSAnQG5sYWJzL2Fya2hhbWpzJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgTG9jYXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvbG9jYXRpb25BZGFwdGVyL2xvY2F0aW9uQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFwaVJlc3VsdHNUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aW9uUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuXG5jb25zdCBEQVRBX1RZUEUgPSAnbG9jYXRpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zIHtcbiAgc3RyaWN0PzogYm9vbGVhbjtcbiAgYWxsb3dQYXJ0aWFsPzogYm9vbGVhbjtcbiAgZW52aXJvbm1lbnQ/OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nIHwgJ3Rlc3QnO1xuICBjdXN0b21WYWxpZGF0aW9uPzogKGlucHV0OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQWN0aW9uc09wdGlvbnMge1xuICBsb2NhdGlvbkFkYXB0ZXI/OiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zKSA9PiBhbnk7XG4gIGxvY2F0aW9uQWRhcHRlck9wdGlvbnM/OiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgdHlwZSBMb2NhdGlvbkFwaVJlc3VsdHNUeXBlID0ge1xuICBhZGRMb2NhdGlvbjogTG9jYXRpb25UeXBlO1xuICBkZWxldGVMb2NhdGlvbjogTG9jYXRpb25UeXBlO1xuICBnZXRMb2NhdGlvbjogTG9jYXRpb25UeXBlO1xuICBnZXRMb2NhdGlvbnNCeUl0ZW06IExvY2F0aW9uVHlwZVtdO1xuICB1cGRhdGVMb2NhdGlvbjogTG9jYXRpb25UeXBlO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvbkFjdGlvbnMge1xuICBhdXRvY29tcGxldGVMb2NhdGlvbjogKGFkZHJlc3M6IHN0cmluZywgbGF0aXR1ZGU/OiBudW1iZXIsIGxvbmdpdHVkZT86IG51bWJlciwgbG9jYXRpb25Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPExvY2F0aW9uVHlwZVtdPjtcbiAgYWRkOiAobG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb25UeXBlPiwgbG9jYXRpb25Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPExvY2F0aW9uVHlwZT47XG4gIGRlbGV0ZTogKGxvY2F0aW9uSWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxMb2NhdGlvblR5cGU+O1xuICBnZXRDdXJyZW50TG9jYXRpb246IChzZXRMb2NhdGlvbj86IChsb2NhdGlvbjogTG9jYXRpb25UeXBlKSA9PiB2b2lkLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPExvY2F0aW9uVHlwZT47XG4gIGdldEdvb2dsZUxvY2F0aW9uOiAoYWRkcmVzczogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPHtsYXRpdHVkZTogbnVtYmVyOyBsb2NhdGlvbjogc3RyaW5nOyBsb25naXR1ZGU6IG51bWJlcn0+O1xuICBnZXRMb2NhdGlvbjogKGxvY2F0aW9uOiBQYXJ0aWFsPExvY2F0aW9uVHlwZT4sIGxvY2F0aW9uUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxMb2NhdGlvblR5cGU+O1xuICBsaXN0QnlJdGVtOiAoaXRlbUlkOiBzdHJpbmcsIGxvY2F0aW9uUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxMb2NhdGlvblR5cGVbXT47XG4gIHVwZGF0ZTogKGxvY2F0aW9uOiBQYXJ0aWFsPExvY2F0aW9uVHlwZT4sIGxvY2F0aW9uUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxMb2NhdGlvblR5cGU+O1xuICB1cGRhdGVMb2NhdGlvbkFkYXB0ZXI6IChhZGFwdGVyOiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zKSA9PiBhbnkpID0+IHZvaWQ7XG4gIHVwZGF0ZUxvY2F0aW9uQWRhcHRlck9wdGlvbnM6IChvcHRpb25zOiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zKSA9PiB2b2lkO1xufVxuXG4vLyBEZWZhdWx0IHZhbGlkYXRpb24gZnVuY3Rpb25cbmNvbnN0IGRlZmF1bHRMb2NhdGlvblZhbGlkYXRvciA9IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IExvY2F0aW9uQWRhcHRlck9wdGlvbnMpID0+IHZhbGlkYXRlTG9jYXRpb25JbnB1dChpbnB1dCk7XG5cbi8vIEVuaGFuY2VkIHZhbGlkYXRpb24gZnVuY3Rpb24gdGhhdCBtZXJnZXMgY3VzdG9tIGxvZ2ljIHdpdGggZGVmYXVsdHNcbmNvbnN0IGNyZWF0ZUxvY2F0aW9uVmFsaWRhdG9yID0gKFxuICBjdXN0b21BZGFwdGVyPzogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogTG9jYXRpb25BZGFwdGVyT3B0aW9ucykgPT4gYW55LFxuICBvcHRpb25zPzogTG9jYXRpb25BZGFwdGVyT3B0aW9uc1xuKSA9PiAoaW5wdXQ6IHVua25vd24sIHZhbGlkYXRvck9wdGlvbnM/OiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zKSA9PiB7XG4gIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7Li4ub3B0aW9ucywgLi4udmFsaWRhdG9yT3B0aW9uc307XG5cbiAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IHZhbGlkYXRpb25cbiAgbGV0IHZhbGlkYXRlZCA9IGRlZmF1bHRMb2NhdGlvblZhbGlkYXRvcihpbnB1dCwgbWVyZ2VkT3B0aW9ucyk7XG5cbiAgLy8gQXBwbHkgY3VzdG9tIHZhbGlkYXRpb24gaWYgcHJvdmlkZWRcbiAgaWYoY3VzdG9tQWRhcHRlcikge1xuICAgIHZhbGlkYXRlZCA9IGN1c3RvbUFkYXB0ZXIodmFsaWRhdGVkLCBtZXJnZWRPcHRpb25zKTtcbiAgfVxuXG4gIC8vIEFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIGZyb20gb3B0aW9ucyBpZiBwcm92aWRlZFxuICBpZihtZXJnZWRPcHRpb25zPy5jdXN0b21WYWxpZGF0aW9uKSB7XG4gICAgdmFsaWRhdGVkID0gbWVyZ2VkT3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uKHZhbGlkYXRlZCkgYXMgTG9jYXRpb25UeXBlO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZDtcbn07XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgTG9jYXRpb25BY3Rpb25zIHdpdGggZW5oYW5jZWQgYWRhcHRlciBpbmplY3Rpb24gY2FwYWJpbGl0aWVzLlxuICogQ3VzdG9tIGFkYXB0ZXJzIGFyZSBtZXJnZWQgd2l0aCBkZWZhdWx0IGJlaGF2aW9yLCBhbGxvd2luZyBwYXJ0aWFsIG92ZXJyaWRlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2Ugd2l0aCBkZWZhdWx0IGFkYXB0ZXJzXG4gKiBjb25zdCBsb2NhdGlvbkFjdGlvbnMgPSBjcmVhdGVMb2NhdGlvbkFjdGlvbnMoZmx1eCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEN1c3RvbSBhZGFwdGVyIHRoYXQgZXh0ZW5kcyBkZWZhdWx0IGJlaGF2aW9yXG4gKiBjb25zdCBjdXN0b21Mb2NhdGlvbkFkYXB0ZXIgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zKSA9PiB7XG4gKiAgIC8vIGlucHV0IGlzIGFscmVhZHkgdmFsaWRhdGVkIGJ5IGRlZmF1bHQgYWRhcHRlclxuICogICBpZiAoaW5wdXQubGF0aXR1ZGUgJiYgKGlucHV0LmxhdGl0dWRlIDwgLTkwIHx8IGlucHV0LmxhdGl0dWRlID4gOTApKSB7XG4gKiAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxhdGl0dWRlJyk7XG4gKiAgIH1cbiAqICAgcmV0dXJuIGlucHV0O1xuICogfTtcbiAqXG4gKiBjb25zdCBsb2NhdGlvbkFjdGlvbnMgPSBjcmVhdGVMb2NhdGlvbkFjdGlvbnMoZmx1eCwge1xuICogICBsb2NhdGlvbkFkYXB0ZXI6IGN1c3RvbUxvY2F0aW9uQWRhcHRlclxuICogfSk7XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2NhdGlvbkFjdGlvbnMgPSAoXG4gIGZsdXg6IEZsdXhGcmFtZXdvcmssXG4gIG9wdGlvbnM/OiBMb2NhdGlvbkFjdGlvbnNPcHRpb25zXG4pOiBMb2NhdGlvbkFjdGlvbnMgPT4ge1xuICAvLyBJbml0aWFsaXplIGFkYXB0ZXIgc3RhdGVcbiAgbGV0IGxvY2F0aW9uQWRhcHRlck9wdGlvbnMgPSBvcHRpb25zPy5sb2NhdGlvbkFkYXB0ZXJPcHRpb25zIHx8IHt9O1xuICBsZXQgY3VzdG9tTG9jYXRpb25BZGFwdGVyID0gb3B0aW9ucz8ubG9jYXRpb25BZGFwdGVyO1xuXG4gIC8vIENyZWF0ZSB2YWxpZGF0b3JzIHRoYXQgbWVyZ2UgY3VzdG9tIGFkYXB0ZXJzIHdpdGggZGVmYXVsdHNcbiAgbGV0IHZhbGlkYXRlTG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvblZhbGlkYXRvcihjdXN0b21Mb2NhdGlvbkFkYXB0ZXIsIGxvY2F0aW9uQWRhcHRlck9wdGlvbnMpO1xuXG4gIC8vIFVwZGF0ZSBmdW5jdGlvbnMgdGhhdCByZWNyZWF0ZSB2YWxpZGF0b3JzXG4gIGNvbnN0IHVwZGF0ZUxvY2F0aW9uQWRhcHRlciA9IChhZGFwdGVyOiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBMb2NhdGlvbkFkYXB0ZXJPcHRpb25zKSA9PiBhbnkpOiB2b2lkID0+IHtcbiAgICBjdXN0b21Mb2NhdGlvbkFkYXB0ZXIgPSBhZGFwdGVyO1xuICAgIHZhbGlkYXRlTG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvblZhbGlkYXRvcihjdXN0b21Mb2NhdGlvbkFkYXB0ZXIsIGxvY2F0aW9uQWRhcHRlck9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZUxvY2F0aW9uQWRhcHRlck9wdGlvbnMgPSAob3B0aW9uczogTG9jYXRpb25BZGFwdGVyT3B0aW9ucyk6IHZvaWQgPT4ge1xuICAgIGxvY2F0aW9uQWRhcHRlck9wdGlvbnMgPSB7Li4ubG9jYXRpb25BZGFwdGVyT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgdmFsaWRhdGVMb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uVmFsaWRhdG9yKGN1c3RvbUxvY2F0aW9uQWRhcHRlciwgbG9jYXRpb25BZGFwdGVyT3B0aW9ucyk7XG4gIH07XG5cbiAgLy8gQWN0aW9uIGltcGxlbWVudGF0aW9uc1xuICBjb25zdCBhdXRvY29tcGxldGVMb2NhdGlvbiA9IGFzeW5jIChcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgbGF0aXR1ZGU/OiBudW1iZXIsXG4gICAgbG9uZ2l0dWRlPzogbnVtYmVyLFxuICAgIGxvY2F0aW9uUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxMb2NhdGlvblR5cGVbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8TG9jYXRpb25UeXBlW10+KFxuICAgICAgZmx1eCxcbiAgICAgICdsb2NhdGlvbi5hdXRvY29tcGxldGVMb2NhdGlvbicsXG4gICAgICB7YWRkcmVzcywgbGF0aXR1ZGUsIGxvY2F0aW9uUHJvcHMsIGxvbmdpdHVkZX0sXG4gICAgICByZXF1ZXN0T3B0aW9uc1xuICAgICk7XG5cbiAgICBpZihjYWNoZWRSZXN1bHQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXV0b0NvbXBsZXRlTG9jYXRpb24oZmx1eCwgYWRkcmVzcywgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgbG9jYXRpb25Qcm9wcyk7XG4gICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgJ2xvY2F0aW9uLmF1dG9jb21wbGV0ZUxvY2F0aW9uJywge2FkZHJlc3MsIGxhdGl0dWRlLCBsb2NhdGlvblByb3BzLCBsb25naXR1ZGV9LCByZXN1bHQsIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBhZGQgPSBhc3luYyAoXG4gICAgbG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb25UeXBlPixcbiAgICBsb2NhdGlvblByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8TG9jYXRpb25UeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgIHR5cGU6ICdMb2NhdGlvbklucHV0IScsXG4gICAgICAgICAgdmFsdWU6IHZhbGlkYXRlTG9jYXRpb24obG9jYXRpb24sIGxvY2F0aW9uQWRhcHRlck9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZExvY2F0aW9uID0gZGF0YT8uYWRkTG9jYXRpb24gfHwge307XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsb2NhdGlvbjogYWRkTG9jYXRpb24sIHR5cGU6IExPQ0FUSU9OX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTfSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb248TG9jYXRpb25UeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2FkZExvY2F0aW9uJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgW1xuICAgICAgICAgICdhZGRlZCcsXG4gICAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgICAgICdjaXR5JyxcbiAgICAgICAgICAnY291bnRyeScsXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAnbGF0aXR1ZGUnLFxuICAgICAgICAgICdsb25naXR1ZGUnLFxuICAgICAgICAgICdtb2RpZmllZCcsXG4gICAgICAgICAgJ3N0YXRlJyxcbiAgICAgICAgICAnc3RyZWV0JyxcbiAgICAgICAgICAnemlwJyxcbiAgICAgICAgICAuLi5sb2NhdGlvblByb3BzXG4gICAgICAgIF0sXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuQUREX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ2xvY2F0aW9uLmF1dG9jb21wbGV0ZUxvY2F0aW9uJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZUxvY2F0aW9uID0gYXN5bmMgKGxvY2F0aW9uSWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPExvY2F0aW9uVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgbG9jYXRpb25JZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBsb2NhdGlvbklkXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZGF0YT8uZGVsZXRlTG9jYXRpb24gfHwge307XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsb2NhdGlvbiwgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLlJFTU9WRV9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxMb2NhdGlvblR5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZGVsZXRlTG9jYXRpb24nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ2lkJ10sXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuUkVNT1ZFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYGxvY2F0aW9uLmxpc3RCeUl0ZW06JHtsb2NhdGlvbklkfWApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRDdXJyZW50TG9jYXRpb24gPSBhc3luYyAoXG4gICAgc2V0TG9jYXRpb24/OiAobG9jYXRpb246IExvY2F0aW9uVHlwZSkgPT4gdm9pZCxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPExvY2F0aW9uVHlwZT4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHt1c2VySWR9OiBVc2VyID0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pO1xuICAgIGNvbnN0IHtjaXR5LCBjb3VudHJ5LCBsYXRpdHVkZSwgbG9uZ2l0dWRlLCBzdGF0ZX06IFVzZXIgPSBmbHV4LmdldFN0YXRlKFsndXNlcicsICd1c2VycycsIHVzZXJJZCB8fCAnJ10sIHt9KTtcbiAgICBjb25zdCBsb2NhdGlvblN0ciA9IFtjaXR5LCBzdGF0ZSwgY291bnRyeV0uam9pbignLCAnKTtcbiAgICBjb25zdCBwZXJzb25hTG9jYXRpb24gPSB7XG4gICAgICBsYXRpdHVkZSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblN0cixcbiAgICAgIGxvbmdpdHVkZVxuICAgIH0gYXMgTG9jYXRpb25UeXBlO1xuXG4gICAgaWYobmF2aWdhdG9yLmdlb2xvY2F0aW9uKSB7XG4gICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICBhc3luYyAoe2Nvb3Jkc30pID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0ge1xuICAgICAgICAgICAgbGF0aXR1ZGU6IGNvb3Jkcy5sYXRpdHVkZSxcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnQ3VycmVudCBMb2NhdGlvbicsXG4gICAgICAgICAgICBsb25naXR1ZGU6IGNvb3Jkcy5sb25naXR1ZGVcbiAgICAgICAgICB9IGFzIExvY2F0aW9uVHlwZTtcbiAgICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtjdXJyZW50LCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuU0VUX0NVUlJFTlR9KTtcbiAgICAgICAgICBpZihzZXRMb2NhdGlvbikge1xuICAgICAgICAgICAgc2V0TG9jYXRpb24oY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoY3VycmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIChsb2NhdGlvbkVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2dldEN1cnJlbnRMb2NhdGlvbjo6bG9jYXRpb25FcnJvcicsIGxvY2F0aW9uRXJyb3IpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXRDdXJyZW50TG9jYXRpb246OnBlcnNvbmFMb2NhdGlvbjEnLCBwZXJzb25hTG9jYXRpb24pO1xuICAgICAgICAgIGlmKHNldExvY2F0aW9uKSB7XG4gICAgICAgICAgICBzZXRMb2NhdGlvbihwZXJzb25hTG9jYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZsdXguZGlzcGF0Y2goe2N1cnJlbnQ6IHBlcnNvbmFMb2NhdGlvbiwgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLlNFVF9DVVJSRU5UfSk7XG4gICAgICAgICAgcmVqZWN0KGxvY2F0aW9uRXJyb3IpO1xuICAgICAgICB9LFxuICAgICAgICB7ZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZSwgbWF4aW11bUFnZTogMCwgdGltZW91dDogMzAwMDB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnZ2V0Q3VycmVudExvY2F0aW9uOjpwZXJzb25hTG9jYXRpb24yJywgcGVyc29uYUxvY2F0aW9uKTtcbiAgICAgIGlmKHNldExvY2F0aW9uKSB7XG4gICAgICAgIHNldExvY2F0aW9uKHBlcnNvbmFMb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGZsdXguZGlzcGF0Y2goe2N1cnJlbnQ6IHBlcnNvbmFMb2NhdGlvbiwgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLlNFVF9DVVJSRU5UfSk7XG4gICAgICByZWplY3QoJ0dlb2xvY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZ2V0R29vZ2xlTG9jYXRpb24gPSBhc3luYyAoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8e2xhdGl0dWRlOiBudW1iZXI7IGxvY2F0aW9uOiBzdHJpbmc7IGxvbmdpdHVkZTogbnVtYmVyfT4gPT4ge1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IGF3YWl0IGF1dG9jb21wbGV0ZUxvY2F0aW9uKGFkZHJlc3MsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIGNvbnN0IFtmaXJzdExvY2F0aW9uID0ge30gYXMgTG9jYXRpb25UeXBlXSA9IGxvY2F0aW9ucztcblxuICAgIHJldHVybiB7XG4gICAgICBsYXRpdHVkZTogZmlyc3RMb2NhdGlvbi5sYXRpdHVkZSB8fCAwLFxuICAgICAgbG9jYXRpb246IGZpcnN0TG9jYXRpb24ubG9jYXRpb24gfHwgJycsXG4gICAgICBsb25naXR1ZGU6IGZpcnN0TG9jYXRpb24ubG9uZ2l0dWRlIHx8IDBcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGdldExvY2F0aW9uID0gYXN5bmMgKFxuICAgIGxvY2F0aW9uOiBQYXJ0aWFsPExvY2F0aW9uVHlwZT4sXG4gICAgbG9jYXRpb25Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPExvY2F0aW9uVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PExvY2F0aW9uVHlwZT4oZmx1eCwgJ2xvY2F0aW9uLmdldExvY2F0aW9uJywge2xvY2F0aW9uLCBsb2NhdGlvblByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgICBpZihjYWNoZWRSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgdHlwZTogJ0xvY2F0aW9uSW5wdXQhJyxcbiAgICAgICAgICB2YWx1ZTogdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbiwgbG9jYXRpb25BZGFwdGVyT3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgZ2V0TG9jYXRpb24gPSBkYXRhPy5nZXRMb2NhdGlvbiB8fCB7fTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xvY2F0aW9uOiBnZXRMb2NhdGlvbiwgdHlwZTogTE9DQVRJT05fQ09OU1RBTlRTLkdFVF9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcE11dGF0aW9uPExvY2F0aW9uVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdnZXRMb2NhdGlvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnYWRkZWQnLFxuICAgICAgICAgICdhZGRyZXNzJyxcbiAgICAgICAgICAnY2l0eScsXG4gICAgICAgICAgJ2NvdW50cnknLFxuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAgICdzdGF0ZScsXG4gICAgICAgICAgJ3N0cmVldCcsXG4gICAgICAgICAgJ3ppcCcsXG4gICAgICAgICAgLi4ubG9jYXRpb25Qcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgJ2xvY2F0aW9uLmdldExvY2F0aW9uJywge2xvY2F0aW9uLCBsb2NhdGlvblByb3BzfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IExPQ0FUSU9OX0NPTlNUQU5UUy5HRVRfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUl0ZW0gPSBhc3luYyAoXG4gICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgbG9jYXRpb25Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPExvY2F0aW9uVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8TG9jYXRpb25UeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICBgbG9jYXRpb24ubGlzdEJ5SXRlbToke2l0ZW1JZH1gLFxuICAgICAgICB7aXRlbUlkLCBsb2NhdGlvblByb3BzfSxcbiAgICAgICAgcmVxdWVzdE9wdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgaXRlbUlkOiB7XG4gICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgdmFsdWU6IGl0ZW1JZFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbnNCeUl0ZW0gPSBBcnJheS5pc0FycmF5KChkYXRhIGFzIHtsb2NhdGlvbnNCeUl0ZW0/OiBMb2NhdGlvblR5cGVbXX0pPy5sb2NhdGlvbnNCeUl0ZW0pXG4gICAgICAgICAgPyAoZGF0YSBhcyB7bG9jYXRpb25zQnlJdGVtPzogTG9jYXRpb25UeXBlW119KS5sb2NhdGlvbnNCeUl0ZW0gfHwgW11cbiAgICAgICAgICA6IFtdO1xuICAgICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgaXRlbUlkLFxuICAgICAgICAgIGxpc3Q6IGxvY2F0aW9uc0J5SXRlbSxcbiAgICAgICAgICB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcE11dGF0aW9uPExvY2F0aW9uVHlwZVtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2xvY2F0aW9uc0J5SXRlbScsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnYWRkZWQnLFxuICAgICAgICAgICdhZGRyZXNzJyxcbiAgICAgICAgICAnY2l0eScsXG4gICAgICAgICAgJ2NvdW50cnknLFxuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAgICdzdGF0ZScsXG4gICAgICAgICAgJ3N0cmVldCcsXG4gICAgICAgICAgJ3ppcCcsXG4gICAgICAgICAgLi4ubG9jYXRpb25Qcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgYGxvY2F0aW9uLmxpc3RCeUl0ZW06JHtpdGVtSWR9YCwge2l0ZW1JZCwgbG9jYXRpb25Qcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBMT0NBVElPTl9DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGUgPSBhc3luYyAoXG4gICAgbG9jYXRpb246IFBhcnRpYWw8TG9jYXRpb25UeXBlPixcbiAgICBsb2NhdGlvblByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8TG9jYXRpb25UeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgIHR5cGU6ICdMb2NhdGlvblVwZGF0ZUlucHV0IScsXG4gICAgICAgICAgdmFsdWU6IHZhbGlkYXRlTG9jYXRpb24obG9jYXRpb24sIGxvY2F0aW9uQWRhcHRlck9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZUxvY2F0aW9uID0gZGF0YT8udXBkYXRlTG9jYXRpb24gfHwge307XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsb2NhdGlvbjogdXBkYXRlTG9jYXRpb24sIHR5cGU6IExPQ0FUSU9OX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9TVUNDRVNTfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBNdXRhdGlvbjxMb2NhdGlvblR5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAndXBkYXRlTG9jYXRpb24nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2FkZGVkJyxcbiAgICAgICAgICAnYWRkcmVzcycsXG4gICAgICAgICAgJ2NpdHknLFxuICAgICAgICAgICdjb3VudHJ5JyxcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICdsYXRpdHVkZScsXG4gICAgICAgICAgJ2xvbmdpdHVkZScsXG4gICAgICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICAgICAnc3RhdGUnLFxuICAgICAgICAgICdzdHJlZXQnLFxuICAgICAgICAgICd6aXAnLFxuICAgICAgICAgIC4uLmxvY2F0aW9uUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IExPQ0FUSU9OX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnbG9jYXRpb24uZ2V0TG9jYXRpb24nKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnbG9jYXRpb24uYXV0b2NvbXBsZXRlTG9jYXRpb24nKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgbG9jYXRpb24ubGlzdEJ5SXRlbToke1N0cmluZyhsb2NhdGlvbj8uaXRlbUlkIHx8ICcnKX1gKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBhY3Rpb25zIG9iamVjdFxuICByZXR1cm4ge1xuICAgIGF1dG9jb21wbGV0ZUxvY2F0aW9uLFxuICAgIGFkZCxcbiAgICBkZWxldGU6IGRlbGV0ZUxvY2F0aW9uLFxuICAgIGdldEN1cnJlbnRMb2NhdGlvbixcbiAgICBnZXRHb29nbGVMb2NhdGlvbixcbiAgICBnZXRMb2NhdGlvbixcbiAgICBsaXN0QnlJdGVtLFxuICAgIHVwZGF0ZSxcbiAgICB1cGRhdGVMb2NhdGlvbkFkYXB0ZXIsXG4gICAgdXBkYXRlTG9jYXRpb25BZGFwdGVyT3B0aW9uc1xuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJ2YWxpZGF0ZUxvY2F0aW9uSW5wdXQiLCJMT0NBVElPTl9DT05TVEFOVFMiLCJhcHBNdXRhdGlvbiIsImF1dG9Db21wbGV0ZUxvY2F0aW9uIiwiY2xlYXJDYWNoZWRSZXF1ZXN0IiwiZ2V0Q2FjaGVkUmVxdWVzdCIsInNldENhY2hlZFJlcXVlc3QiLCJEQVRBX1RZUEUiLCJkZWZhdWx0TG9jYXRpb25WYWxpZGF0b3IiLCJpbnB1dCIsIm9wdGlvbnMiLCJjcmVhdGVMb2NhdGlvblZhbGlkYXRvciIsImN1c3RvbUFkYXB0ZXIiLCJ2YWxpZGF0b3JPcHRpb25zIiwibWVyZ2VkT3B0aW9ucyIsInZhbGlkYXRlZCIsImN1c3RvbVZhbGlkYXRpb24iLCJjcmVhdGVMb2NhdGlvbkFjdGlvbnMiLCJmbHV4IiwibG9jYXRpb25BZGFwdGVyT3B0aW9ucyIsImN1c3RvbUxvY2F0aW9uQWRhcHRlciIsImxvY2F0aW9uQWRhcHRlciIsInZhbGlkYXRlTG9jYXRpb24iLCJ1cGRhdGVMb2NhdGlvbkFkYXB0ZXIiLCJhZGFwdGVyIiwidXBkYXRlTG9jYXRpb25BZGFwdGVyT3B0aW9ucyIsImF1dG9jb21wbGV0ZUxvY2F0aW9uIiwiYWRkcmVzcyIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwibG9jYXRpb25Qcm9wcyIsInJlcXVlc3RPcHRpb25zIiwiY2FjaGVkUmVzdWx0IiwicmVzdWx0IiwiYWRkIiwibG9jYXRpb24iLCJxdWVyeVZhcmlhYmxlcyIsInR5cGUiLCJ2YWx1ZSIsIm9uU3VjY2VzcyIsImRhdGEiLCJhZGRMb2NhdGlvbiIsImRpc3BhdGNoIiwiQUREX0lURU1fU1VDQ0VTUyIsImVycm9yIiwiQUREX0lURU1fRVJST1IiLCJkZWxldGVMb2NhdGlvbiIsImxvY2F0aW9uSWQiLCJSRU1PVkVfSVRFTV9TVUNDRVNTIiwiUkVNT1ZFX0lURU1fRVJST1IiLCJnZXRDdXJyZW50TG9jYXRpb24iLCJzZXRMb2NhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidXNlcklkIiwiZ2V0U3RhdGUiLCJjaXR5IiwiY291bnRyeSIsInN0YXRlIiwibG9jYXRpb25TdHIiLCJqb2luIiwicGVyc29uYUxvY2F0aW9uIiwibmF2aWdhdG9yIiwiZ2VvbG9jYXRpb24iLCJnZXRDdXJyZW50UG9zaXRpb24iLCJjb29yZHMiLCJjdXJyZW50IiwiU0VUX0NVUlJFTlQiLCJsb2NhdGlvbkVycm9yIiwiY29uc29sZSIsImxvZyIsImVuYWJsZUhpZ2hBY2N1cmFjeSIsIm1heGltdW1BZ2UiLCJ0aW1lb3V0IiwiZ2V0R29vZ2xlTG9jYXRpb24iLCJsb2NhdGlvbnMiLCJ1bmRlZmluZWQiLCJmaXJzdExvY2F0aW9uIiwiZ2V0TG9jYXRpb24iLCJHRVRfSVRFTV9TVUNDRVNTIiwiR0VUX0lURU1fRVJST1IiLCJsaXN0QnlJdGVtIiwiaXRlbUlkIiwibG9jYXRpb25zQnlJdGVtIiwiQXJyYXkiLCJpc0FycmF5IiwibGlzdCIsIkdFVF9MSVNUX1NVQ0NFU1MiLCJHRVRfTElTVF9FUlJPUiIsInVwZGF0ZSIsInVwZGF0ZUxvY2F0aW9uIiwiVVBEQVRFX0lURU1fU1VDQ0VTUyIsIlVQREFURV9JVEVNX0VSUk9SIiwiU3RyaW5nIiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFTQSxxQkFBcUIsUUFBUSxvREFBb0Q7QUFDMUYsU0FBU0Msa0JBQWtCLFFBQVEsZ0NBQWdDO0FBQ25FLFNBQVNDLFdBQVcsUUFBUSxxQkFBcUI7QUFDakQsU0FBU0Msb0JBQW9CLFFBQVEsMEJBQTBCO0FBQy9ELFNBQVNDLGtCQUFrQixFQUFFQyxnQkFBZ0IsRUFBRUMsZ0JBQWdCLFFBQVEsOEJBQThCO0FBUXJHLE1BQU1DLFlBQVk7QUFtQ2xCLDhCQUE4QjtBQUM5QixNQUFNQywyQkFBMkIsQ0FBQ0MsT0FBZ0JDLFVBQXFDVixzQkFBc0JTO0FBRTdHLHNFQUFzRTtBQUN0RSxNQUFNRSwwQkFBMEIsQ0FDOUJDLGVBQ0FGLFVBQ0csQ0FBQ0QsT0FBZ0JJO1FBQ3BCLE1BQU1DLGdCQUFnQjtZQUFDLEdBQUdKLE9BQU87WUFBRSxHQUFHRyxnQkFBZ0I7UUFBQTtRQUV0RCxnQ0FBZ0M7UUFDaEMsSUFBSUUsWUFBWVAseUJBQXlCQyxPQUFPSztRQUVoRCxzQ0FBc0M7UUFDdEMsSUFBR0YsZUFBZTtZQUNoQkcsWUFBWUgsY0FBY0csV0FBV0Q7UUFDdkM7UUFFQSxtREFBbUQ7UUFDbkQsSUFBR0EsZUFBZUUsa0JBQWtCO1lBQ2xDRCxZQUFZRCxjQUFjRSxnQkFBZ0IsQ0FBQ0Q7UUFDN0M7UUFFQSxPQUFPQTtJQUNUO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFCQyxHQUNELE9B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