@nlabs/reaktor 1.8.0 → 1.9.1

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 (283) hide show
  1. package/README.md +62 -1
  2. package/docs/GENERATION.md +63 -0
  3. package/lib/actions/analytics.js +1 -1
  4. package/lib/actions/apps.d.ts +2 -2
  5. package/lib/actions/apps.js +1 -1
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +1 -1
  8. package/lib/actions/contentGeneration.d.ts +40 -0
  9. package/lib/actions/contentGeneration.js +206 -0
  10. package/lib/actions/conversations.js +1 -1
  11. package/lib/actions/crm.js +1 -1
  12. package/lib/actions/crud.d.ts +2 -2
  13. package/lib/actions/crud.js +1 -1
  14. package/lib/actions/dynamodb.js +1 -1
  15. package/lib/actions/email.js +1 -1
  16. package/lib/actions/files.d.ts +42 -4
  17. package/lib/actions/files.js +1 -1
  18. package/lib/actions/flags.js +1 -1
  19. package/lib/actions/geminiVideo.d.ts +19 -0
  20. package/lib/actions/geminiVideo.js +161 -0
  21. package/lib/actions/groups.js +1 -1
  22. package/lib/actions/higgsfield.d.ts +20 -0
  23. package/lib/actions/higgsfield.js +148 -0
  24. package/lib/actions/imageGeneration.d.ts +37 -0
  25. package/lib/actions/imageGeneration.js +121 -0
  26. package/lib/actions/images.js +1 -1
  27. package/lib/actions/index.d.ts +5 -0
  28. package/lib/actions/index.js +6 -1
  29. package/lib/actions/ios.js +1 -1
  30. package/lib/actions/locations.js +1 -1
  31. package/lib/actions/messages.js +1 -1
  32. package/lib/actions/notifications.js +1 -1
  33. package/lib/actions/payments.js +27 -26
  34. package/lib/actions/personas.d.ts +4 -4
  35. package/lib/actions/personas.js +1 -1
  36. package/lib/actions/posts.js +1 -1
  37. package/lib/actions/query.js +1 -1
  38. package/lib/actions/reactions.d.ts +6 -6
  39. package/lib/actions/reactions.js +1 -1
  40. package/lib/actions/rum.js +1 -1
  41. package/lib/actions/s3.d.ts +4 -4
  42. package/lib/actions/s3.js +22 -6
  43. package/lib/actions/search.js +1 -1
  44. package/lib/actions/sms.js +1 -1
  45. package/lib/actions/statistics.js +1 -1
  46. package/lib/actions/subscriptions.js +1 -1
  47. package/lib/actions/tags.d.ts +2 -2
  48. package/lib/actions/tags.js +1 -1
  49. package/lib/actions/users.d.ts +2 -2
  50. package/lib/actions/users.js +1 -1
  51. package/lib/actions/videoGeneration.d.ts +20 -0
  52. package/lib/actions/videoGeneration.js +32 -0
  53. package/lib/actions/videos.js +1 -1
  54. package/lib/adapters/arangoAdapter.js +1 -1
  55. package/lib/adapters/contentAdapter.js +1 -1
  56. package/lib/adapters/fileAdapter.js +1 -1
  57. package/lib/adapters/geminiGenerationAdapter.d.ts +34 -0
  58. package/lib/adapters/geminiGenerationAdapter.js +41 -0
  59. package/lib/adapters/higgsfieldAdapter.d.ts +120 -0
  60. package/lib/adapters/higgsfieldAdapter.js +131 -0
  61. package/lib/adapters/imageAdapter.js +1 -1
  62. package/lib/adapters/imageGenerationAdapter.d.ts +17 -0
  63. package/lib/adapters/imageGenerationAdapter.js +18 -0
  64. package/lib/adapters/index.d.ts +3 -0
  65. package/lib/adapters/index.js +4 -1
  66. package/lib/adapters/messageAdapter.js +1 -1
  67. package/lib/adapters/postAdapter.js +1 -1
  68. package/lib/adapters/reaktorAdapter.js +1 -1
  69. package/lib/adapters/tagAdapter.js +1 -1
  70. package/lib/adapters/userAdapter.d.ts +76 -1
  71. package/lib/adapters/userAdapter.js +1 -1
  72. package/lib/config.d.ts +19 -14
  73. package/lib/config.js +9 -1
  74. package/lib/constants/collections.js +1 -1
  75. package/lib/handlers/graphqlHandler.js +1 -1
  76. package/lib/index.d.ts +1 -0
  77. package/lib/index.js +2 -1
  78. package/lib/lambdas/actions/websockets.d.ts +5 -0
  79. package/lib/lambdas/actions/websockets.js +16 -1
  80. package/lib/lambdas/authorizer.js +1 -1
  81. package/lib/lambdas/connection.d.ts +2 -2
  82. package/lib/lambdas/connection.js +1 -1
  83. package/lib/lambdas/utils/message.js +1 -1
  84. package/lib/lambdas/utils/websocket.d.ts +4 -4
  85. package/lib/lambdas/utils/websocket.js +1 -1
  86. package/lib/mocks/conversation.js +1 -1
  87. package/lib/mocks/file.js +1 -1
  88. package/lib/mocks/group.js +1 -1
  89. package/lib/mocks/image.js +1 -1
  90. package/lib/mocks/post.js +1 -1
  91. package/lib/mocks/tag.js +1 -1
  92. package/lib/mocks/user.js +1 -1
  93. package/lib/mocks/video.js +1 -1
  94. package/lib/mutations/analytics/analytics.js +1 -1
  95. package/lib/mutations/content/content.js +15 -1
  96. package/lib/mutations/crm/crm.js +1 -1
  97. package/lib/mutations/events/events.js +1 -1
  98. package/lib/mutations/flags/flags.js +1 -1
  99. package/lib/mutations/groups/groups.js +1 -1
  100. package/lib/mutations/higgsfield/higgsfield.d.ts +1 -0
  101. package/lib/mutations/higgsfield/higgsfield.js +62 -0
  102. package/lib/mutations/images/images.js +10 -1
  103. package/lib/mutations/index.d.ts +2 -1
  104. package/lib/mutations/index.js +11 -2
  105. package/lib/mutations/locations/locations.js +1 -1
  106. package/lib/mutations/messages/messages.js +1 -1
  107. package/lib/mutations/personas/personas.js +1 -1
  108. package/lib/mutations/posts/posts.js +1 -1
  109. package/lib/mutations/reactions/reactions.js +1 -1
  110. package/lib/mutations/rum/rum.js +1 -1
  111. package/lib/mutations/statistics/statistics.js +1 -1
  112. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  113. package/lib/mutations/tags/tags.js +1 -1
  114. package/lib/mutations/users/users.js +1 -1
  115. package/lib/mutations/videos/videos.js +24 -10
  116. package/lib/objectTypes/analytics.js +1 -1
  117. package/lib/objectTypes/app.js +1 -1
  118. package/lib/objectTypes/bankAccount.js +1 -1
  119. package/lib/objectTypes/connection.js +1 -1
  120. package/lib/objectTypes/content.js +1 -1
  121. package/lib/objectTypes/contentGeneration.d.ts +2 -0
  122. package/lib/objectTypes/contentGeneration.js +30 -0
  123. package/lib/objectTypes/conversation.js +1 -1
  124. package/lib/objectTypes/creditCard.js +1 -1
  125. package/lib/objectTypes/crm.js +1 -1
  126. package/lib/objectTypes/document.js +1 -1
  127. package/lib/objectTypes/error.js +1 -1
  128. package/lib/objectTypes/event.js +1 -1
  129. package/lib/objectTypes/external.js +1 -1
  130. package/lib/objectTypes/file.js +1 -1
  131. package/lib/objectTypes/filter.js +1 -1
  132. package/lib/objectTypes/flag.js +1 -1
  133. package/lib/objectTypes/group.js +1 -1
  134. package/lib/objectTypes/higgsfield.d.ts +5 -0
  135. package/lib/objectTypes/higgsfield.js +149 -0
  136. package/lib/objectTypes/iapSubscription.js +1 -1
  137. package/lib/objectTypes/image.js +1 -1
  138. package/lib/objectTypes/imageGeneration.d.ts +2 -0
  139. package/lib/objectTypes/imageGeneration.js +33 -0
  140. package/lib/objectTypes/index.d.ts +2 -0
  141. package/lib/objectTypes/index.js +3 -1
  142. package/lib/objectTypes/location.js +1 -1
  143. package/lib/objectTypes/message.js +1 -1
  144. package/lib/objectTypes/passcode.js +1 -1
  145. package/lib/objectTypes/persona.d.ts +37 -2
  146. package/lib/objectTypes/persona.js +1 -1
  147. package/lib/objectTypes/plan.js +1 -1
  148. package/lib/objectTypes/post.js +1 -1
  149. package/lib/objectTypes/query.js +1 -1
  150. package/lib/objectTypes/reaction.js +1 -1
  151. package/lib/objectTypes/relation.js +1 -1
  152. package/lib/objectTypes/rum.js +1 -1
  153. package/lib/objectTypes/search.js +1 -1
  154. package/lib/objectTypes/statistics.js +1 -1
  155. package/lib/objectTypes/subscription.js +1 -1
  156. package/lib/objectTypes/tag.js +1 -1
  157. package/lib/objectTypes/user.js +1 -1
  158. package/lib/objectTypes/video.js +1 -1
  159. package/lib/objectTypes/videoGeneration.d.ts +2 -0
  160. package/lib/objectTypes/videoGeneration.js +31 -0
  161. package/lib/queries/analytics/analytics.js +1 -1
  162. package/lib/queries/content/content.js +1 -1
  163. package/lib/queries/crm/crm.js +1 -1
  164. package/lib/queries/events/events.js +1 -1
  165. package/lib/queries/flags/flags.js +1 -1
  166. package/lib/queries/groups/groups.js +1 -1
  167. package/lib/queries/higgsfield/higgsfield.d.ts +1 -0
  168. package/lib/queries/higgsfield/higgsfield.js +22 -0
  169. package/lib/queries/images/images.js +1 -1
  170. package/lib/queries/index.d.ts +2 -1
  171. package/lib/queries/index.js +7 -2
  172. package/lib/queries/locations/locations.js +1 -1
  173. package/lib/queries/messages/messages.js +1 -1
  174. package/lib/queries/personas/personas.js +1 -1
  175. package/lib/queries/posts/posts.js +1 -1
  176. package/lib/queries/query/query.js +1 -1
  177. package/lib/queries/reactions/reactions.js +1 -1
  178. package/lib/queries/statistics/statistics.js +1 -1
  179. package/lib/queries/subscriptions/subscriptions.js +1 -1
  180. package/lib/queries/tags/tags.js +1 -1
  181. package/lib/queries/users/users.js +1 -1
  182. package/lib/queries/videos/videos.js +1 -1
  183. package/lib/templates/email/layout.js +1 -1
  184. package/lib/templates/email/passwordForgot.js +1 -1
  185. package/lib/templates/email/passwordRecovery.js +1 -1
  186. package/lib/templates/email/verifyEmail.js +1 -1
  187. package/lib/templates/email/welcome.js +1 -1
  188. package/lib/templates/sms/passwordForgot.js +1 -1
  189. package/lib/templates/sms/passwordRecovery.js +1 -1
  190. package/lib/templates/sms/verifyEmail.js +1 -1
  191. package/lib/templates/sms/verifyPhone.js +1 -1
  192. package/lib/templates/sms/welcome.js +1 -1
  193. package/lib/types/analytics.types.d.ts +16 -16
  194. package/lib/types/analytics.types.js +1 -1
  195. package/lib/types/apps.types.d.ts +4 -4
  196. package/lib/types/apps.types.js +1 -1
  197. package/lib/types/arangodb.types.d.ts +20 -20
  198. package/lib/types/arangodb.types.js +1 -1
  199. package/lib/types/auth.types.js +1 -1
  200. package/lib/types/connections.types.d.ts +2 -2
  201. package/lib/types/connections.types.js +1 -1
  202. package/lib/types/content.types.d.ts +6 -6
  203. package/lib/types/content.types.js +1 -1
  204. package/lib/types/conversations.types.d.ts +2 -2
  205. package/lib/types/conversations.types.js +1 -1
  206. package/lib/types/crm.types.d.ts +30 -30
  207. package/lib/types/crm.types.js +1 -1
  208. package/lib/types/email.types.d.ts +2 -2
  209. package/lib/types/email.types.js +1 -1
  210. package/lib/types/error.types.d.ts +1 -0
  211. package/lib/types/error.types.js +2 -1
  212. package/lib/types/files.types.d.ts +2 -2
  213. package/lib/types/files.types.js +1 -1
  214. package/lib/types/flags.types.d.ts +8 -8
  215. package/lib/types/flags.types.js +1 -1
  216. package/lib/types/google.types.js +1 -1
  217. package/lib/types/groups.types.d.ts +2 -2
  218. package/lib/types/groups.types.js +1 -1
  219. package/lib/types/images.types.d.ts +2 -2
  220. package/lib/types/images.types.js +1 -1
  221. package/lib/types/index.js +1 -1
  222. package/lib/types/locations.types.d.ts +2 -2
  223. package/lib/types/locations.types.js +1 -1
  224. package/lib/types/messages.types.d.ts +2 -2
  225. package/lib/types/messages.types.js +1 -1
  226. package/lib/types/notifications.types.js +1 -1
  227. package/lib/types/payments.types.d.ts +14 -14
  228. package/lib/types/payments.types.js +1 -1
  229. package/lib/types/personas.types.d.ts +2 -2
  230. package/lib/types/personas.types.js +1 -1
  231. package/lib/types/posts.types.d.ts +2 -2
  232. package/lib/types/posts.types.js +1 -1
  233. package/lib/types/rum.types.d.ts +6 -6
  234. package/lib/types/rum.types.js +1 -1
  235. package/lib/types/statistics.types.js +1 -1
  236. package/lib/types/tags.types.d.ts +4 -4
  237. package/lib/types/tags.types.js +1 -1
  238. package/lib/types/users.types.d.ts +2 -2
  239. package/lib/types/users.types.js +1 -1
  240. package/lib/types/videos.types.d.ts +2 -2
  241. package/lib/types/videos.types.js +1 -1
  242. package/lib/types/websockets.types.d.ts +4 -4
  243. package/lib/types/websockets.types.js +1 -1
  244. package/lib/upload.js +1 -1
  245. package/lib/utils/adapterUtils.js +1 -1
  246. package/lib/utils/analyticsUtils.js +1 -1
  247. package/lib/utils/appContext.js +1 -1
  248. package/lib/utils/aqlHelpers.js +1 -1
  249. package/lib/utils/arangodbUtils.js +1 -1
  250. package/lib/utils/authUtils.js +1 -1
  251. package/lib/utils/awsUtils.js +1 -1
  252. package/lib/utils/collectionRegistry.d.ts +2 -2
  253. package/lib/utils/collectionRegistry.js +1 -1
  254. package/lib/utils/contextUtils.js +1 -1
  255. package/lib/utils/dbI18n.example.js +1 -1
  256. package/lib/utils/dbI18n.js +1 -1
  257. package/lib/utils/googleTranslate.js +1 -1
  258. package/lib/utils/graphqlUtils.js +1 -1
  259. package/lib/utils/imageUtils.js +1 -1
  260. package/lib/utils/index.d.ts +3 -0
  261. package/lib/utils/index.js +4 -1
  262. package/lib/utils/languageDetection.js +1 -1
  263. package/lib/utils/localeUtils.example.js +1 -1
  264. package/lib/utils/localeUtils.js +1 -1
  265. package/lib/utils/mediaAccess.d.ts +5 -0
  266. package/lib/utils/mediaAccess.js +57 -0
  267. package/lib/utils/middlewareUtils.js +1 -1
  268. package/lib/utils/nodeRealtime.d.ts +14 -0
  269. package/lib/utils/nodeRealtime.js +84 -0
  270. package/lib/utils/opaqueToken.d.ts +4 -0
  271. package/lib/utils/opaqueToken.js +7 -0
  272. package/lib/utils/queryBuilder.js +1 -1
  273. package/lib/utils/schemaUtils.js +1 -1
  274. package/lib/utils/sessionUtils.js +1 -1
  275. package/lib/utils/stripeUtils.d.ts +1 -1
  276. package/lib/utils/stripeUtils.js +2 -2
  277. package/lib/utils/stripeUtils.ts.bak +12 -0
  278. package/lib/utils/templateUtils.js +1 -1
  279. package/lib/utils/testUtils.js +1 -1
  280. package/lib/utils/translationQueue.example.js +1 -1
  281. package/lib/utils/translationQueue.js +1 -1
  282. package/lib/videoProcessing.js +1 -1
  283. package/package.json +26 -25
@@ -0,0 +1,121 @@
1
+ import { post } from '@nlabs/rip-hunter';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { validateGeminiImageInput } from '../adapters/geminiGenerationAdapter.js';
4
+ import { validateOpenAIImageInput } from '../adapters/imageGenerationAdapter.js';
5
+ import { Config } from '../config.js';
6
+ import { ContentGenerationRejectedError, generateContent } from './contentGeneration.js';
7
+ import { generateMarketingStudioImage, generateSoulImage } from './higgsfield.js';
8
+ /** Only an explicit provider rejection proves it is safe to release a reservation. */ export class ImageGenerationRejectedError extends Error {
9
+ }
10
+ export const generateOpenAIImage = async (_context, input, config)=>{
11
+ const validated = validateOpenAIImageInput(input);
12
+ const key = config?.key || Config.get('openai.apiKey');
13
+ if (!key) {
14
+ throw new Error('OpenAI image generation is not configured.');
15
+ }
16
+ const response = await post('https://api.openai.com/v1/images/generations', {
17
+ model: validated.model || config?.model || Config.get('openai.imageModel') || 'gpt-image-1.5',
18
+ n: 1,
19
+ output_format: 'png',
20
+ prompt: validated.prompt,
21
+ quality: validated.quality,
22
+ size: validated.size
23
+ }, {
24
+ cache: false,
25
+ headers: new Headers({
26
+ Authorization: `Bearer ${key}`
27
+ }),
28
+ timeout: 180_000
29
+ });
30
+ if (response.error && [
31
+ 'invalid_request_error',
32
+ 'authentication_error',
33
+ 'permission_error'
34
+ ].includes(response.error.type || '')) {
35
+ throw new ImageGenerationRejectedError('OpenAI rejected the image request. Check model access and prompt.');
36
+ }
37
+ const encoded = response.data?.[0]?.b64_json;
38
+ if (response.error || !encoded || encoded.length > 40 * 1024 * 1024 || !/^[A-Za-z0-9+/]+={0,2}$/.test(encoded)) {
39
+ throw new Error('OpenAI image output could not be verified.');
40
+ }
41
+ if (!Buffer.from(encoded, 'base64').subarray(0, 8).equals(Buffer.from([
42
+ 137,
43
+ 80,
44
+ 78,
45
+ 71,
46
+ 13,
47
+ 10,
48
+ 26,
49
+ 10
50
+ ]))) {
51
+ throw new Error('OpenAI did not return PNG image bytes.');
52
+ }
53
+ return {
54
+ imageBase64: encoded,
55
+ provider: 'openai',
56
+ requestId: `openai-${randomUUID()}`,
57
+ status: 'completed'
58
+ };
59
+ };
60
+ /** Provider selection is data; credentials and paid-job orchestration stay server-side. */ export const generateImage = async (context, input)=>{
61
+ const { provider, ...options } = input;
62
+ if (provider === 'gemini') {
63
+ return generateGeminiImage(context, options);
64
+ }
65
+ if (provider === 'openai') {
66
+ return generateOpenAIImage(context, options);
67
+ }
68
+ if (provider !== 'higgsfield') {
69
+ throw new Error('Unsupported image provider.');
70
+ }
71
+ const request = 'imageUrls' in options && options.imageUrls?.length ? await generateMarketingStudioImage(context, options) : await generateSoulImage(context, options);
72
+ return {
73
+ ...request,
74
+ provider,
75
+ status: 'queued'
76
+ };
77
+ };
78
+ /** Reuses the Gemini content protocol while preserving the generic image result shape. */ export const generateGeminiImage = async (_context, input, config)=>{
79
+ const validated = validateGeminiImageInput(input);
80
+ try {
81
+ const result = await generateContent({
82
+ ...validated,
83
+ modality: 'image',
84
+ provider: 'gemini'
85
+ }, {
86
+ geminiImageModel: config?.model || Config.get('contentGeneration.geminiImageModel'),
87
+ geminiKey: config?.key || Config.get('contentGeneration.geminiKey')
88
+ });
89
+ const { image } = result;
90
+ if (!image || !(image.mime === 'image/png' ? image.bytes.subarray(0, 8).equals(Buffer.from([
91
+ 137,
92
+ 80,
93
+ 78,
94
+ 71,
95
+ 13,
96
+ 10,
97
+ 26,
98
+ 10
99
+ ])) : image.bytes.subarray(0, 3).equals(Buffer.from([
100
+ 255,
101
+ 216,
102
+ 255
103
+ ])))) {
104
+ throw new Error('Gemini image output could not be verified.');
105
+ }
106
+ return {
107
+ imageBase64: image.bytes.toString('base64'),
108
+ mimeType: image.mime,
109
+ provider: 'gemini',
110
+ requestId: `gemini-${randomUUID()}`,
111
+ status: 'completed'
112
+ };
113
+ } catch (error) {
114
+ if (error instanceof ContentGenerationRejectedError) {
115
+ throw new ImageGenerationRejectedError(error.message);
116
+ }
117
+ throw error;
118
+ }
119
+ };
120
+
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbWFnZUdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtwb3N0fSBmcm9tICdAbmxhYnMvcmlwLWh1bnRlcic7XG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gJ25vZGU6Y3J5cHRvJztcblxuaW1wb3J0IHt2YWxpZGF0ZUdlbWluaUltYWdlSW5wdXR9IGZyb20gJy4uL2FkYXB0ZXJzL2dlbWluaUdlbmVyYXRpb25BZGFwdGVyLmpzJztcbmltcG9ydCB7dmFsaWRhdGVPcGVuQUlJbWFnZUlucHV0fSBmcm9tICcuLi9hZGFwdGVycy9pbWFnZUdlbmVyYXRpb25BZGFwdGVyLmpzJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIGdlbmVyYXRlQ29udGVudH0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbi5qcyc7XG5pbXBvcnQge2dlbmVyYXRlTWFya2V0aW5nU3R1ZGlvSW1hZ2UsIGdlbmVyYXRlU291bEltYWdlfSBmcm9tICcuL2hpZ2dzZmllbGQuanMnO1xuXG5pbXBvcnQgdHlwZSB7R2VtaW5pSW1hZ2VJbnB1dH0gZnJvbSAnLi4vYWRhcHRlcnMvZ2VtaW5pR2VuZXJhdGlvbkFkYXB0ZXIuanMnO1xuaW1wb3J0IHR5cGUge01hcmtldGluZ1N0dWRpb0ltYWdlSW5wdXQsIFNvdWxJbWFnZUlucHV0fSBmcm9tICcuLi9hZGFwdGVycy9oaWdnc2ZpZWxkQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7T3BlbkFJSW1hZ2VJbnB1dH0gZnJvbSAnLi4vYWRhcHRlcnMvaW1hZ2VHZW5lcmF0aW9uQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5cbi8qKiBPbmx5IGFuIGV4cGxpY2l0IHByb3ZpZGVyIHJlamVjdGlvbiBwcm92ZXMgaXQgaXMgc2FmZSB0byByZWxlYXNlIGEgcmVzZXJ2YXRpb24uICovXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRlSW1hZ2VJbnB1dCA9XG4gIHwgKEdlbWluaUltYWdlSW5wdXQgJiB7cHJvdmlkZXI6ICdnZW1pbmknfSlcbiAgfCAoT3BlbkFJSW1hZ2VJbnB1dCAmIHtwcm92aWRlcjogJ29wZW5haSd9KVxuICB8IChTb3VsSW1hZ2VJbnB1dCAmIHtwcm92aWRlcjogJ2hpZ2dzZmllbGQnOyBpbWFnZVVybHM/OiB1bmRlZmluZWR9KVxuICB8IChNYXJrZXRpbmdTdHVkaW9JbWFnZUlucHV0ICYge3Byb3ZpZGVyOiAnaGlnZ3NmaWVsZCd9KTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUdlbmVyYXRpb25SZXN1bHQge1xuICBjYW5jZWxVcmw/OiBzdHJpbmc7XG4gIGltYWdlQmFzZTY0Pzogc3RyaW5nO1xuICBtaW1lVHlwZT86ICdpbWFnZS9qcGVnJyB8ICdpbWFnZS9wbmcnO1xuICBwcm92aWRlcjogJ2dlbWluaScgfCAnaGlnZ3NmaWVsZCcgfCAnb3BlbmFpJztcbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIHN0YXR1czogJ3F1ZXVlZCcgfCAnY29tcGxldGVkJztcbiAgc3RhdHVzVXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVPcGVuQUlJbWFnZSA9IGFzeW5jIChcbiAgX2NvbnRleHQ6IEFwaUNvbnRleHQsIGlucHV0OiBPcGVuQUlJbWFnZUlucHV0LCBjb25maWc/OiB7a2V5Pzogc3RyaW5nOyBtb2RlbD86IHN0cmluZ31cbik6IFByb21pc2U8SW1hZ2VHZW5lcmF0aW9uUmVzdWx0PiA9PiB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlT3BlbkFJSW1hZ2VJbnB1dChpbnB1dCk7XG4gIGNvbnN0IGtleSA9IGNvbmZpZz8ua2V5IHx8IENvbmZpZy5nZXQ8c3RyaW5nPignb3BlbmFpLmFwaUtleScpO1xuICBpZigha2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPcGVuQUkgaW1hZ2UgZ2VuZXJhdGlvbiBpcyBub3QgY29uZmlndXJlZC4nKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvaW1hZ2VzL2dlbmVyYXRpb25zJywge1xuICAgIG1vZGVsOiB2YWxpZGF0ZWQubW9kZWwgfHwgY29uZmlnPy5tb2RlbCB8fCBDb25maWcuZ2V0PHN0cmluZz4oJ29wZW5haS5pbWFnZU1vZGVsJykgfHwgJ2dwdC1pbWFnZS0xLjUnLFxuICAgIG46IDEsXG4gICAgb3V0cHV0X2Zvcm1hdDogJ3BuZycsXG4gICAgcHJvbXB0OiB2YWxpZGF0ZWQucHJvbXB0LFxuICAgIHF1YWxpdHk6IHZhbGlkYXRlZC5xdWFsaXR5LFxuICAgIHNpemU6IHZhbGlkYXRlZC5zaXplXG4gIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7a2V5fWB9KSwgdGltZW91dDogMTgwXzAwMH0pIGFzIHtcbiAgICBkYXRhPzoge2I2NF9qc29uPzogc3RyaW5nfVtdO1xuICAgIGVycm9yPzoge3R5cGU/OiBzdHJpbmd9O1xuICB9O1xuICBpZihyZXNwb25zZS5lcnJvciAmJiBbJ2ludmFsaWRfcmVxdWVzdF9lcnJvcicsICdhdXRoZW50aWNhdGlvbl9lcnJvcicsICdwZXJtaXNzaW9uX2Vycm9yJ10uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IudHlwZSB8fCAnJykpIHtcbiAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignT3BlbkFJIHJlamVjdGVkIHRoZSBpbWFnZSByZXF1ZXN0LiBDaGVjayBtb2RlbCBhY2Nlc3MgYW5kIHByb21wdC4nKTtcbiAgfVxuICBjb25zdCBlbmNvZGVkID0gcmVzcG9uc2UuZGF0YT8uWzBdPy5iNjRfanNvbjtcbiAgaWYocmVzcG9uc2UuZXJyb3IgfHwgIWVuY29kZWQgfHwgZW5jb2RlZC5sZW5ndGggPiA0MCAqIDEwMjQgKiAxMDI0IHx8ICEvXltBLVphLXowLTkrL10rPXswLDJ9JC8udGVzdChlbmNvZGVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT3BlbkFJIGltYWdlIG91dHB1dCBjb3VsZCBub3QgYmUgdmVyaWZpZWQuJyk7XG4gIH1cbiAgaWYoIUJ1ZmZlci5mcm9tKGVuY29kZWQsICdiYXNlNjQnKS5zdWJhcnJheSgwLCA4KS5lcXVhbHMoQnVmZmVyLmZyb20oWzEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTBdKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09wZW5BSSBkaWQgbm90IHJldHVybiBQTkcgaW1hZ2UgYnl0ZXMuJyk7XG4gIH1cbiAgcmV0dXJuIHtpbWFnZUJhc2U2NDogZW5jb2RlZCwgcHJvdmlkZXI6ICdvcGVuYWknLCByZXF1ZXN0SWQ6IGBvcGVuYWktJHtyYW5kb21VVUlEKCl9YCwgc3RhdHVzOiAnY29tcGxldGVkJ307XG59O1xuXG4vKiogUHJvdmlkZXIgc2VsZWN0aW9uIGlzIGRhdGE7IGNyZWRlbnRpYWxzIGFuZCBwYWlkLWpvYiBvcmNoZXN0cmF0aW9uIHN0YXkgc2VydmVyLXNpZGUuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVJbWFnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbnB1dDogR2VuZXJhdGVJbWFnZUlucHV0KTogUHJvbWlzZTxJbWFnZUdlbmVyYXRpb25SZXN1bHQ+ID0+IHtcbiAgY29uc3Qge3Byb3ZpZGVyLCAuLi5vcHRpb25zfSA9IGlucHV0O1xuICBpZihwcm92aWRlciA9PT0gJ2dlbWluaScpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVHZW1pbmlJbWFnZShjb250ZXh0LCBvcHRpb25zIGFzIEdlbWluaUltYWdlSW5wdXQpO1xuICB9XG4gIGlmKHByb3ZpZGVyID09PSAnb3BlbmFpJykge1xuICAgIHJldHVybiBnZW5lcmF0ZU9wZW5BSUltYWdlKGNvbnRleHQsIG9wdGlvbnMgYXMgT3BlbkFJSW1hZ2VJbnB1dCk7XG4gIH1cbiAgaWYocHJvdmlkZXIgIT09ICdoaWdnc2ZpZWxkJykge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgaW1hZ2UgcHJvdmlkZXIuJyk7XG4gIH1cbiAgY29uc3QgcmVxdWVzdCA9ICdpbWFnZVVybHMnIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5pbWFnZVVybHM/Lmxlbmd0aFxuICAgID8gYXdhaXQgZ2VuZXJhdGVNYXJrZXRpbmdTdHVkaW9JbWFnZShjb250ZXh0LCBvcHRpb25zIGFzIE1hcmtldGluZ1N0dWRpb0ltYWdlSW5wdXQpXG4gICAgOiBhd2FpdCBnZW5lcmF0ZVNvdWxJbWFnZShjb250ZXh0LCBvcHRpb25zIGFzIFNvdWxJbWFnZUlucHV0KTtcbiAgcmV0dXJuIHsuLi5yZXF1ZXN0LCBwcm92aWRlciwgc3RhdHVzOiAncXVldWVkJ307XG59O1xuXG4vKiogUmV1c2VzIHRoZSBHZW1pbmkgY29udGVudCBwcm90b2NvbCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBnZW5lcmljIGltYWdlIHJlc3VsdCBzaGFwZS4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUdlbWluaUltYWdlID0gYXN5bmMgKFxuICBfY29udGV4dDogQXBpQ29udGV4dCwgaW5wdXQ6IEdlbWluaUltYWdlSW5wdXQsIGNvbmZpZz86IHtrZXk/OiBzdHJpbmc7IG1vZGVsPzogc3RyaW5nfVxuKTogUHJvbWlzZTxJbWFnZUdlbmVyYXRpb25SZXN1bHQ+ID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVHZW1pbmlJbWFnZUlucHV0KGlucHV0KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUNvbnRlbnQoey4uLnZhbGlkYXRlZCwgbW9kYWxpdHk6ICdpbWFnZScsIHByb3ZpZGVyOiAnZ2VtaW5pJ30sIHtcbiAgICAgIGdlbWluaUltYWdlTW9kZWw6IGNvbmZpZz8ubW9kZWwgfHwgQ29uZmlnLmdldDxzdHJpbmc+KCdjb250ZW50R2VuZXJhdGlvbi5nZW1pbmlJbWFnZU1vZGVsJyksXG4gICAgICBnZW1pbmlLZXk6IGNvbmZpZz8ua2V5IHx8IENvbmZpZy5nZXQ8c3RyaW5nPignY29udGVudEdlbmVyYXRpb24uZ2VtaW5pS2V5JylcbiAgICB9KTtcbiAgICBjb25zdCB7aW1hZ2V9ID0gcmVzdWx0O1xuICAgIGlmKCFpbWFnZSB8fCAhKGltYWdlLm1pbWUgPT09ICdpbWFnZS9wbmcnXG4gICAgICA/IGltYWdlLmJ5dGVzLnN1YmFycmF5KDAsIDgpLmVxdWFscyhCdWZmZXIuZnJvbShbMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMF0pKVxuICAgICAgOiBpbWFnZS5ieXRlcy5zdWJhcnJheSgwLCAzKS5lcXVhbHMoQnVmZmVyLmZyb20oWzI1NSwgMjE2LCAyNTVdKSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbWluaSBpbWFnZSBvdXRwdXQgY291bGQgbm90IGJlIHZlcmlmaWVkLicpO1xuICAgIH1cbiAgICByZXR1cm4ge2ltYWdlQmFzZTY0OiBpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBpbWFnZS5taW1lLCBwcm92aWRlcjogJ2dlbWluaScsIHJlcXVlc3RJZDogYGdlbWluaS0ke3JhbmRvbVVVSUQoKX1gLCBzdGF0dXM6ICdjb21wbGV0ZWQnfTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGlmKGVycm9yIGluc3RhbmNlb2YgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iXSwibmFtZXMiOlsicG9zdCIsInJhbmRvbVVVSUQiLCJ2YWxpZGF0ZUdlbWluaUltYWdlSW5wdXQiLCJ2YWxpZGF0ZU9wZW5BSUltYWdlSW5wdXQiLCJDb25maWciLCJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJnZW5lcmF0ZUNvbnRlbnQiLCJnZW5lcmF0ZU1hcmtldGluZ1N0dWRpb0ltYWdlIiwiZ2VuZXJhdGVTb3VsSW1hZ2UiLCJJbWFnZUdlbmVyYXRpb25SZWplY3RlZEVycm9yIiwiRXJyb3IiLCJnZW5lcmF0ZU9wZW5BSUltYWdlIiwiX2NvbnRleHQiLCJpbnB1dCIsImNvbmZpZyIsInZhbGlkYXRlZCIsImtleSIsImdldCIsInJlc3BvbnNlIiwibW9kZWwiLCJuIiwib3V0cHV0X2Zvcm1hdCIsInByb21wdCIsInF1YWxpdHkiLCJzaXplIiwiY2FjaGUiLCJoZWFkZXJzIiwiSGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJ0aW1lb3V0IiwiZXJyb3IiLCJpbmNsdWRlcyIsInR5cGUiLCJlbmNvZGVkIiwiZGF0YSIsImI2NF9qc29uIiwibGVuZ3RoIiwidGVzdCIsIkJ1ZmZlciIsImZyb20iLCJzdWJhcnJheSIsImVxdWFscyIsImltYWdlQmFzZTY0IiwicHJvdmlkZXIiLCJyZXF1ZXN0SWQiLCJzdGF0dXMiLCJnZW5lcmF0ZUltYWdlIiwiY29udGV4dCIsIm9wdGlvbnMiLCJnZW5lcmF0ZUdlbWluaUltYWdlIiwicmVxdWVzdCIsImltYWdlVXJscyIsInJlc3VsdCIsIm1vZGFsaXR5IiwiZ2VtaW5pSW1hZ2VNb2RlbCIsImdlbWluaUtleSIsImltYWdlIiwibWltZSIsImJ5dGVzIiwidG9TdHJpbmciLCJtaW1lVHlwZSIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQUksUUFBTyxvQkFBb0I7QUFDdkMsU0FBUUMsVUFBVSxRQUFPLGNBQWM7QUFFdkMsU0FBUUMsd0JBQXdCLFFBQU8seUNBQXlDO0FBQ2hGLFNBQVFDLHdCQUF3QixRQUFPLHdDQUF3QztBQUMvRSxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyw4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
@@ -870,4 +870,4 @@ export const deleteImage = async (context, imageId)=>{
870
870
  }
871
871
  };
872
872
 
873
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3JlYWt0b3IvcmVha3Rvci9wYWNrYWdlcy9yZWFrdG9yL3NyYy9hY3Rpb25zL2ltYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuaW1wb3J0IHtEZWxldGVPYmplY3RzQ29tbWFuZElucHV0LCBQdXRPYmplY3RDb21tYW5kSW5wdXR9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQge2dldCBhcyBodHRwR2V0fSBmcm9tICdAbmxhYnMvcmlwLWh1bnRlcic7XG5pbXBvcnQge3BhcnNlTnVtfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9udW1iZXJzJztcbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VBcmFuZ29JZCwgcGFyc2VDaGFyLCBwYXJzZUlkLCBwYXJzZVN0cmluZ30gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeSwgbGl0ZXJhbH0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCBleGlmUmVhZGVyIGZyb20gJ2V4aWYtcmVhZGVyJztcbmltcG9ydCBzaGFycCBmcm9tICdzaGFycCc7XG5cbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtDT0xMRUNUSU9OUywgRURHRVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb2xsZWN0aW9ucy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7Z2V0SW1hZ2VFeHRlbnNpb259IGZyb20gJy4uL3V0aWxzL2ltYWdlVXRpbHMuanMnO1xuaW1wb3J0IHthZGRJdGVtLCBkZWxldGVJdGVtLCBnZXRJdGVtQnksIGdldExpc3RCeSwgdXBkYXRlSXRlbX0gZnJvbSAnLi9jcnVkLmpzJztcbmltcG9ydCB7Z2V0R3JvdXBEZXRhaWxzLCBpc0dyb3VwZWR9IGZyb20gJy4vZ3JvdXBzLmpzJztcbmltcG9ydCB7Z2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7czNEZWxldGVMaXN0LCBzM0dldFNpZ25lZFVybCwgczNQdXR9IGZyb20gJy4vczMuanMnO1xuaW1wb3J0IHtoYXNTdWJzY3JpcHRpb25Ub0l0ZW19IGZyb20gJy4vc3Vic2NyaXB0aW9ucy5qcyc7XG5cbmltcG9ydCB0eXBlIHtRdWVyeUZpbHRlcn0gZnJvbSAnLi4vdHlwZXMvYXBwcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QXJhbmdvRGJDb2xsZWN0aW9uLCBBcmFuZ29EYkxpbWl0fSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYi50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7R3JvdXBUeXBlLCBHcm91cFVzZXJ9IGZyb20gJy4uL3R5cGVzL2dyb3Vwcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VFZGdlVHlwZSwgSW1hZ2VPcHRpb25zLCBJbWFnZVR5cGUsIEltYWdlVXJsRGF0YX0gZnJvbSAnLi4vdHlwZXMvaW1hZ2VzLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtGaWx0ZXJHcm91cH0gZnJvbSAnLi4vdXRpbHMvYXFsSGVscGVycy5qcyc7XG5cbi8vIERlZmluZSBpbnRlcmZhY2UgZm9yIEhUVFAgcmVzcG9uc2Ugd2l0aCBidWZmZXIgbWV0aG9kXG5pbnRlcmZhY2UgSHR0cFJlc3BvbnNlIGV4dGVuZHMgUmVzcG9uc2Uge1xuICBidWZmZXIoKTogUHJvbWlzZTxCdWZmZXI+O1xufVxuXG5jb25zdCBldmVudENhdGVnb3J5ID0gJ2ltYWdlcyc7XG5jb25zdCBoYXNSZWFjdGlvbkNvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLkhBU19SRUFDVElPTik7XG5jb25zdCBoYXNNZWRpYUNvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLkhBU19NRURJQSk7XG5jb25zdCBwZXJzb25hc0NvbGxlY3Rpb24gPSBsaXRlcmFsKENPTExFQ1RJT05TLlBFUlNPTkFTKTtcbmNvbnN0IE1FRElBX0lURU1fQ09MTEVDVElPTlM6IHJlYWRvbmx5IEFyYW5nb0RiQ29sbGVjdGlvbltdID0gW1xuICBDT0xMRUNUSU9OUy5QRVJTT05BUyxcbiAgQ09MTEVDVElPTlMuVVNFUlMsXG4gIENPTExFQ1RJT05TLlBPU1RTLFxuICBDT0xMRUNUSU9OUy5HUk9VUFNcbl07XG5cbnR5cGUgU2hhcnBGb3JtYXQgPSBFeHRyYWN0PFBhcmFtZXRlcnM8UmV0dXJuVHlwZTx0eXBlb2Ygc2hhcnA+Wyd0b0Zvcm1hdCddPlswXSwgc3RyaW5nPjtcblxuY29uc3QgZ2V0TWVkaWFJdGVtRG9jSWRzID0gKGl0ZW1JZDogc3RyaW5nLCBpdGVtVHlwZT86IEFyYW5nb0RiQ29sbGVjdGlvbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZG9jSWQgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG5cbiAgaWYoZG9jSWQpIHtcbiAgICByZXR1cm4gW2RvY0lkXTtcbiAgfVxuXG4gIGNvbnN0IGl0ZW1LZXkgPSBwYXJzZUlkKGl0ZW1JZCk7XG5cbiAgaWYoIWl0ZW1LZXkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZihpdGVtVHlwZSAmJiBNRURJQV9JVEVNX0NPTExFQ1RJT05TLmluY2x1ZGVzKGl0ZW1UeXBlKSkge1xuICAgIHJldHVybiBbYCR7aXRlbVR5cGV9LyR7aXRlbUtleX1gXTtcbiAgfVxuXG4gIHJldHVybiBNRURJQV9JVEVNX0NPTExFQ1RJT05TLm1hcCgoY29sbGVjdGlvbikgPT4gYCR7Y29sbGVjdGlvbn0vJHtpdGVtS2V5fWApO1xufTtcblxuY29uc3Qgbm9ybWFsaXplSW1hZ2VGb3JtYXQgPSAoZm9ybWF0OiBzdHJpbmcpOiBTaGFycEZvcm1hdCA9PlxuICAoZm9ybWF0ID09PSAnanBnJyA/ICdqcGVnJyA6IGZvcm1hdCkgYXMgU2hhcnBGb3JtYXQ7XG5cbmNvbnN0IGltYWdlRXhpZk1ldGFkYXRhID0gKGV4aWY/OiBCdWZmZXIpID0+IHtcbiAgaWYoIWV4aWYpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZXhpZlJlYWRlcihleGlmKTtcbiAgICBjb25zdCB0YWtlbiA9IG1ldGFkYXRhLlBob3RvPy5EYXRlVGltZU9yaWdpbmFsO1xuICAgIHJldHVybiB7XG4gICAgICBtYWtlOiBtZXRhZGF0YS5JbWFnZT8uTWFrZSxcbiAgICAgIG1vZGVsOiBtZXRhZGF0YS5JbWFnZT8uTW9kZWwsXG4gICAgICB0YWtlbjogdGFrZW4gaW5zdGFuY2VvZiBEYXRlID8gdGFrZW4uZ2V0VGltZSgpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59O1xuXG5jb25zdCBub3JtYWxpemVJbWFnZVByaXZhY3kgPSAocHJpdmFjeTogdW5rbm93bik6ICdmcmllbmRzJyB8ICdwcml2YXRlJyB8ICdwdWJsaWMnIHwgJ3ZpcCcgPT4ge1xuICBzd2l0Y2goU3RyaW5nKHByaXZhY3kgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnZnJpZW5kcyc6XG4gICAgICByZXR1cm4gJ2ZyaWVuZHMnO1xuICAgIGNhc2UgJ3ByaXZhdGUnOlxuICAgICAgcmV0dXJuICdwcml2YXRlJztcbiAgICBjYXNlICd2aXAnOlxuICAgICAgcmV0dXJuICd2aXAnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbn07XG5cbmNvbnN0IGNhblZpZXdJbWFnZSA9IChcbiAgaW1hZ2U6IEltYWdlVHlwZSxcbiAgdmlld2VyVXNlcklkOiBzdHJpbmcsXG4gIGFjY2Vzczoge1xuICAgIHJlYWRvbmx5IGNhblZpZXdGcmllbmRzOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGNhblZpZXdWaXA6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgaXNPd25lcjogYm9vbGVhbjtcbiAgfVxuKSA9PiB7XG4gIGNvbnN0IHByaXZhY3kgPSBub3JtYWxpemVJbWFnZVByaXZhY3koaW1hZ2U/LnByaXZhY3kpO1xuXG4gIGlmKGFjY2Vzcy5pc093bmVyIHx8IFN0cmluZyhpbWFnZT8udXNlcklkIHx8ICcnKSA9PT0gdmlld2VyVXNlcklkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzd2l0Y2gocHJpdmFjeSkge1xuICAgIGNhc2UgJ3ByaXZhdGUnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNhc2UgJ2ZyaWVuZHMnOlxuICAgICAgcmV0dXJuIGFjY2Vzcy5jYW5WaWV3RnJpZW5kcztcbiAgICBjYXNlICd2aXAnOlxuICAgICAgcmV0dXJuIGFjY2Vzcy5jYW5WaWV3VmlwO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlSW1hZ2VPcHRpb25zID0gKG9wdGlvbnM6IEltYWdlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICB0byA9IDMwLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW1pdDogZ2V0TGltaXQoZnJvbSwgdG8pIGFzIEFyYW5nb0RiTGltaXQsXG4gICAgdHlwZTogcGFyc2VDaGFyKHR5cGUsIDMyKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlT3B0aW9uYWxGaWVsZHMgPSAoZmllbGRzOiBzdHJpbmdbXSA9IFtdKSA9PlxuICBmaWVsZHMucmVkdWNlKChzZWxlY3RzLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgaWYoZmllbGQuaW5jbHVkZXMoJ0NvdW50JykpIHtcbiAgICAgIHJldHVybiBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlKCdpbWFnZXMnLCAnaScsIGZpZWxkLCBzZWxlY3RzKTtcbiAgICB9XG5cbiAgICBzd2l0Y2goZmllbGQpIHtcbiAgICAgIGNhc2UgJ3JlYWN0aW9ucyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgRk9SIGltYWdlLCByIElOIElOQk9VTkQgaS5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHRhZ3MgPSAoXG4gICAgICAgICAgRk9SIHQsIHBsIElOIElOQk9VTkQgaS5faWQgaXNUYWdnZWRcbiAgICAgICAgICBSRVRVUk4gdFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2Vycyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB1c2VycyA9IEZJUlNUKFxuICAgICAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIGkudXNlcklkID09IHUuX2tleVxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4gdVxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd1c2Vyczp1c2VycycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgfVxuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUxpc3RCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBmcm9tOiBudW1iZXIgPSAwLFxuICB0bzogbnVtYmVyID0gMzBcbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlc0J5VXNlcic7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZCA9IHBhcnNlSWQodXNlcklkKTtcblxuICByZXR1cm4gZ2V0TGlzdEJ5PEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIHt1c2VySWQ6IGZvcm1hdFVzZXJJZH0sIHtcbiAgICBzb3J0OiBbe2ZpZWxkOiAnYWRkZWQnLCBkaXJlY3Rpb246ICdERVNDJ31dLFxuICAgIGxpbWl0OiB7ZnJvbSwgdG99LFxuICAgIGN1c3RvbVF1ZXJpZXM6IFtcbiAgICAgIGBMRVQgdXNlciA9IEZJUlNUKEZPUiB1IElOIHVzZXJzIEZJTFRFUiB1Ll9rZXkgPT0gZG9jLnVzZXJJZCBMSU1JVCAxIFJFVFVSTiB1KWBcbiAgICBdLFxuICAgIGN1c3RvbU9iamVjdHM6IFsndXNlcjp1c2VyJ11cbiAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtmcm9tLCB0bywgdXNlcklkfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlQ291bnRCeUl0ZW0gPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VDb3VudEJ5SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgaXRlbURvY0lkcyA9IGdldE1lZGlhSXRlbURvY0lkcyhpdGVtSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIExFVCBtZWRpYSA9IChcbiAgICAgIEZPUiBpIElOICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgICBGSUxURVIgaS5fZnJvbSBJTiAke2l0ZW1Eb2NJZHN9XG4gICAgICAgIEZJTFRFUiBpLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICAgIFJFVFVSTiAxXG4gICAgKVxuICAgIFJFVFVSTiB7Y291bnQ6IExFTkdUSChtZWRpYSl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHtjb3VudH0pID0+IGNvdW50KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2l0ZW1JZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlJdGVtID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpdGVtSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogSW1hZ2VPcHRpb25zID0ge31cbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlc0J5SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcyA9IFtdLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uVXNlcklkID0gJyd9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbVR5cGUgPSBvcHRpb25zPy5pdGVtVHlwZSA/IHBhcnNlQ2hhcihTdHJpbmcob3B0aW9ucy5pdGVtVHlwZSB8fCAnJyksIDMyKS50b0xvd2VyQ2FzZSgpIGFzIEFyYW5nb0RiQ29sbGVjdGlvbiA6IHVuZGVmaW5lZDtcbiAgY29uc3QgaXRlbURvY0lkcyA9IGdldE1lZGlhSXRlbURvY0lkcyhpdGVtSWQsIGZvcm1hdEl0ZW1UeXBlKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlSW1hZ2VPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRJbWFnZU9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGwgSU4gJHtoYXNNZWRpYUNvbGxlY3Rpb259XG4gICAgICBGSUxURVIgbC5fZnJvbSBJTiAke2l0ZW1Eb2NJZHN9XG4gICAgICBGSUxURVIgbC50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgTEVUIGkgPSBET0NVTUVOVChsLl90bylcbiAgICAgIEZJTFRFUiBOT1QgSVNfTlVMTChpKVxuICAgICAgTEVUIG93bmVyUGVyc29uYSA9IGwuaXRlbVR5cGUgPT0gXCJwZXJzb25hc1wiID8gRE9DVU1FTlQoJHtsaXRlcmFsKENPTExFQ1RJT05TLlBFUlNPTkFTKX0sIFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkua2V5KSA6IG51bGxcbiAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgIFNPUlQgaS5hZGRlZCBERVNDXG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIFJFVFVSTiBNRVJHRShcbiAgICAgICAgJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRShpLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ2knKX0sXG4gICAgICAgIHtcbiAgICAgICAgICBfbWVkaWFJdGVtS2V5OiBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmtleSxcbiAgICAgICAgICBfbWVkaWFJdGVtVHlwZTogbC5pdGVtVHlwZSB8fCBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmNvbGxlY3Rpb24sXG4gICAgICAgICAgb3duZXJQZXJzb25hSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5fa2V5IDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFJbWFnZUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VJZCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZVVybCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hTmFtZTogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLm5hbWUgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYVRodW1iVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudGh1bWJVcmwgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYVVzZXJJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnVzZXJJZCA6IG51bGxcbiAgICAgICAgfVxuICAgICAgKVxuICBgO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbGlzdCA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pO1xuXG4gICAgY29uc3Qgb3duZXJVc2VySWQgPSBTdHJpbmcobGlzdFswXT8udXNlcklkIHx8ICcnKTtcbiAgICBjb25zdCBpc093bmVyID0gISFzZXNzaW9uVXNlcklkICYmICEhb3duZXJVc2VySWQgJiYgc2Vzc2lvblVzZXJJZCA9PT0gb3duZXJVc2VySWQ7XG5cbiAgICBpZihpc093bmVyKSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBpZighc2Vzc2lvblVzZXJJZCkge1xuICAgICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpbWFnZSkgPT4gbm9ybWFsaXplSW1hZ2VQcml2YWN5KGltYWdlPy5wcml2YWN5KSA9PT0gJ3B1YmxpYycpO1xuICAgIH1cblxuICAgIGxldCBjYW5WaWV3RnJpZW5kcyA9IGZhbHNlO1xuICAgIGxldCBjYW5WaWV3VmlwID0gZmFsc2U7XG5cbiAgICBjb25zdCBtZWRpYUl0ZW1LZXkgPSBTdHJpbmcoKGxpc3RbMF0gYXMgSW1hZ2VUeXBlICYge19tZWRpYUl0ZW1LZXk/OiBzdHJpbmd9KT8uX21lZGlhSXRlbUtleSB8fCAnJyk7XG4gICAgY29uc3QgbWVkaWFJdGVtVHlwZSA9IFN0cmluZygobGlzdFswXSBhcyBJbWFnZVR5cGUgJiB7X21lZGlhSXRlbVR5cGU/OiBzdHJpbmd9KT8uX21lZGlhSXRlbVR5cGUgfHwgJycpO1xuXG4gICAgaWYobWVkaWFJdGVtVHlwZSA9PT0gQ09MTEVDVElPTlMuUEVSU09OQVMgJiYgbWVkaWFJdGVtS2V5KSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBhd2FpdCBnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUoY29udGV4dCwgbWVkaWFJdGVtS2V5KTtcbiAgICAgIGNhblZpZXdGcmllbmRzID0gISFyZWxhdGlvbnNoaXA/LmlzRnJpZW5kO1xuICAgICAgY2FuVmlld1ZpcCA9IGF3YWl0IGhhc1N1YnNjcmlwdGlvblRvSXRlbShjb250ZXh0LCBtZWRpYUl0ZW1LZXksIENPTExFQ1RJT05TLlBFUlNPTkFTKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKGltYWdlKSA9PiBjYW5WaWV3SW1hZ2UoaW1hZ2UsIHNlc3Npb25Vc2VySWQsIHtjYW5WaWV3RnJpZW5kcywgY2FuVmlld1ZpcCwgaXNPd25lcn0pKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtpdGVtSWQsIG9wdGlvbnM6IHsuLi5vcHRpb25zLCBpdGVtVHlwZTogZm9ybWF0SXRlbVR5cGV9fSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5R3JvdXAgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHBhcmFtczoge2ZpbHRlcnM6IFF1ZXJ5RmlsdGVyW10sIGdyb3VwSWQ6IHN0cmluZywgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyfVxuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VzQnlHcm91cCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2ZpbHRlcnMsIGdyb3VwSWQsIGZyb20sIHRvfSA9IHBhcmFtcztcbiAgY29uc3QgZm9ybWF0R3JvdXBJZCA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIGNvbnN0IGxpbWl0OiBBcmFuZ29EYkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuXG4gIGZpbHRlcnNcbiAgICAubWFwKChmaWx0ZXI6IFF1ZXJ5RmlsdGVyKSA9PiB7XG4gICAgICBjb25zdCB7Y29uZGl0aW9uYWwsIG5hbWUsIHZhbHVlfSA9IGZpbHRlcjtcbiAgICAgIGxldCBmb3JtYXRDb25kID0gY29uZGl0aW9uYWw7XG5cbiAgICAgIGlmKGNvbmRpdGlvbmFsICE9PSAnPj0nICYmIGNvbmRpdGlvbmFsICE9PSAnPD0nICYmIGNvbmRpdGlvbmFsICE9PSAnPicgJiYgY29uZGl0aW9uYWwgIT09ICc8Jykge1xuICAgICAgICBmb3JtYXRDb25kID0gJz09JztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKG5hbWUpIHtcbiAgICAgICAgY2FzZSAnYWRkZWQnOlxuICAgICAgICAgIHJldHVybiBgcC5hZGRlZCAke2Zvcm1hdENvbmR9ICR7cGFyc2VOdW0odmFsdWUpfWA7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiBnZXRHcm91cERldGFpbHMoY29udGV4dCwgZm9ybWF0R3JvdXBJZClcbiAgICAudGhlbigoZ3JvdXA6IEdyb3VwVHlwZSkgPT4ge1xuICAgICAgaWYoZ3JvdXAucHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgZmlsdGVycy5wdXNoKHtjb25kaXRpb25hbDogJz09JywgbmFtZTogJ2dyb3VwSWQnLCB2YWx1ZTogZm9ybWF0R3JvdXBJZH0pO1xuICAgICAgICBjb25zdCBmaWx0ZXJTdHIgPSBmaWx0ZXJzLmpvaW4oJyAmJiAnKTtcbiAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgICAgICBGT1IgaSBJTiBGTEFUVEVOKFxuICAgICAgICAgICAgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJTdHIpfVxuICAgICAgICAgICAgICBMRVQgaW1hZ2VzID0gKFxuICAgICAgICAgICAgICAgIEZPUiBpLCBlIElOIE9VVEJPVU5EIHAuX2lkICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgICAgICAgICAgICAgRklMVEVSIGUudHlwZSA9PSBcImltYWdlXCJcbiAgICAgICAgICAgICAgICAgIFJFVFVSTiBpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICAgICAgICAgICAgUkVUVVJOIGltYWdlc1xuICAgICAgICAgIClcbiAgICAgICAgICAgIFNPUlQgaS5hZGRlZCBERVNDXG4gICAgICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgICAgIFJFVFVSTiBpXG4gICAgICAgIGA7XG5cbiAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICAgIHBhcmFtczoge2ZpbHRlcnMsIGZyb20sIGdyb3VwSWQsIHRvfSxcbiAgICAgICAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0dyb3VwZWQoY29udGV4dCwgc2Vzc2lvbklkLCBncm91cElkKVxuICAgICAgICAudGhlbigoZ3JvdXBlZDogR3JvdXBVc2VyKSA9PiB7XG4gICAgICAgICAgaWYoZ3JvdXBlZC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2NvbmRpdGlvbmFsOiAnPT0nLCBuYW1lOiAnZ3JvdXBJZCcsIHZhbHVlOiBncm91cGVkLmdyb3VwSWR9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBmaWx0ZXJzLmpvaW4oJyAmJiAnKTtcbiAgICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgICAgICAgIEZPUiBwIElOIHBvc3RcbiAgICAgICAgICAgICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlckxpc3QpfVxuICAgICAgICAgICAgICAgIEZPUiBmIElOIHAuZmlsZXNcbiAgICAgICAgICAgICAgICAgIEZJTFRFUiBmLnR5cGUgPT0gXCJpbWFnZS9qcGVnXCIgfHwgZi50eXBlID09IFwiaW1hZ2UvcG5nXCJcbiAgICAgICAgICAgICAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgICAgICAgICAgICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICAgICAgICAgICAgICAgIFJFVFVSTiBmXG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7ZmlsdGVycywgZnJvbSwgZ3JvdXBJZCwgdG99LFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUxpc3RCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcmVhY3Rpb25zOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogSW1hZ2VPcHRpb25zXG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZUxpc3RCeVJlYWN0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcyA9IFtdLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUltYWdlT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0SW1hZ2VPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmdbXSA9IHJlYWN0aW9ucy5tYXAoKHJlYWN0aW9uTmFtZSkgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICdyLnR5cGUgPT0gXCJpbWFnZXNcIicsXG4gICAgYFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0UmVhY3Rpb25zKX0sIExPV0VSKHIubmFtZSkpYF07XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBpLCByIElOIE9VVEJPVU5EICR7Zm9ybWF0U2Vzc2lvbklkfSBoYXNSZWFjdGlvblxuICAgICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwiaW1hZ2VzXCJ9XG4gICAgICBMRVQgbWVkaWEgPSBGSVJTVChcbiAgICAgICAgRk9SIG93bmVyLCBsIElOIElOQk9VTkQgaS5faWQgJHtoYXNNZWRpYUNvbGxlY3Rpb259XG4gICAgICAgICAgRklMVEVSIGwudHlwZSA9PSBcImltYWdlXCJcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHtcbiAgICAgICAgICAgIGl0ZW1LZXk6IFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkua2V5LFxuICAgICAgICAgICAgaXRlbVR5cGU6IGwuaXRlbVR5cGUgfHwgUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5jb2xsZWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgKVxuICAgICAgTEVUIG93bmVyUGVyc29uYSA9IG1lZGlhICYmIG1lZGlhLml0ZW1UeXBlID09IFwicGVyc29uYXNcIiA/IERPQ1VNRU5UKCR7bGl0ZXJhbChDT0xMRUNUSU9OUy5QRVJTT05BUyl9LCBtZWRpYS5pdGVtS2V5KSA6IG51bGxcbiAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyQnkuam9pbignICYmICcpKX1cbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgUkVUVVJOIE1FUkdFKFxuICAgICAgICAke3NlbGVjdE9iamVjdHMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYE1FUkdFKGksIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWApIDogbGl0ZXJhbCgnaScpfSxcbiAgICAgICAge1xuICAgICAgICAgIG93bmVyUGVyc29uYUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuX2tleSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlSWQgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VVcmwgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYU5hbWU6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5uYW1lIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFUaHVtYlVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnRodW1iVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFVc2VySWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS51c2VySWQgOiBudWxsXG4gICAgICAgIH1cbiAgICAgIClcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7b3B0aW9ucywgcmVhY3Rpb25zfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGdldFBlcnNvbmFEb2NJZCA9IChwZXJzb25hSWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHBlcnNvbmFEb2NJZCA9IHBhcnNlQXJhbmdvSWQocGVyc29uYUlkKTtcblxuICBpZihwZXJzb25hRG9jSWQpIHtcbiAgICByZXR1cm4gcGVyc29uYURvY0lkO1xuICB9XG5cbiAgY29uc3QgcGVyc29uYUtleSA9IHBhcnNlSWQocGVyc29uYUlkKTtcbiAgcmV0dXJuIHBlcnNvbmFLZXkgPyBgJHtDT0xMRUNUSU9OUy5QRVJTT05BU30vJHtwZXJzb25hS2V5fWAgOiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUxpc3RCeVBlcnNvbmFSZWFjdGlvbnMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHBlcnNvbmFJZDogc3RyaW5nID0gJycsXG4gIHJlYWN0aW9uczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IEltYWdlT3B0aW9uc1xuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VMaXN0QnlQZXJzb25hUmVhY3Rpb25zJztcbiAgY29uc3Qgc2Vzc2lvblBlcnNvbmFJZCA9IFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy5wZXJzb25hSWQgfHwgJycpO1xuICBjb25zdCBwZXJzb25hRG9jSWQgPSBnZXRQZXJzb25hRG9jSWQocGVyc29uYUlkIHx8IHNlc3Npb25QZXJzb25hSWQpO1xuICBjb25zdCByZWFjdGlvbk5hbWVzID0gQXJyYXkuaXNBcnJheShyZWFjdGlvbnMpXG4gICAgPyByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWUpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoQm9vbGVhbilcbiAgICA6IFtdO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VJbWFnZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgaWYoIXBlcnNvbmFEb2NJZCB8fCAhcmVhY3Rpb25OYW1lcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBpbWFnZSwgcmVhY3Rpb24gSU4gT1VUQk9VTkQgJHtwZXJzb25hRG9jSWR9ICR7aGFzUmVhY3Rpb25Db2xsZWN0aW9ufVxuICAgICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwiaW1hZ2VzXCJ9XG4gICAgICBMRVQgbWVkaWEgPSBGSVJTVChcbiAgICAgICAgRk9SIG93bmVyLCBsaW5rIElOIElOQk9VTkQgaW1hZ2UuX2lkICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgICAgIEZJTFRFUiBsaW5rLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiB7XG4gICAgICAgICAgICBpdGVtS2V5OiBQQVJTRV9JREVOVElGSUVSKGxpbmsuX2Zyb20pLmtleSxcbiAgICAgICAgICAgIGl0ZW1UeXBlOiBsaW5rLml0ZW1UeXBlIHx8IFBBUlNFX0lERU5USUZJRVIobGluay5fZnJvbSkuY29sbGVjdGlvblxuICAgICAgICAgIH1cbiAgICAgIClcbiAgICAgIExFVCBvd25lclBlcnNvbmEgPSBtZWRpYSAmJiBtZWRpYS5pdGVtVHlwZSA9PSBcInBlcnNvbmFzXCIgPyBET0NVTUVOVCgke3BlcnNvbmFzQ29sbGVjdGlvbn0sIG1lZGlhLml0ZW1LZXkpIDogbnVsbFxuICAgICAgRklMVEVSIExPV0VSKHJlYWN0aW9uLnR5cGUgfHwgXCJcIikgSU4gW1wiaW1hZ2VcIiwgXCJpbWFnZXNcIl1cbiAgICAgIEZJTFRFUiBQT1NJVElPTigke3JlYWN0aW9uTmFtZXN9LCBMT1dFUihyZWFjdGlvbi5uYW1lIHx8IHJlYWN0aW9uLnZhbHVlIHx8IFwiXCIpKVxuICAgICAgU09SVCByZWFjdGlvbi5hZGRlZCBERVNDXG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIFJFVFVSTiBNRVJHRShpbWFnZSwge1xuICAgICAgICBvd25lclBlcnNvbmFJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLl9rZXkgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFJbWFnZUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VJZCA6IG51bGwsXG4gICAgICAgIG93bmVyUGVyc29uYUltYWdlVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VVcmwgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFOYW1lOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEubmFtZSA6IG51bGwsXG4gICAgICAgIG93bmVyUGVyc29uYVRodW1iVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudGh1bWJVcmwgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFVc2VySWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS51c2VySWQgOiBudWxsXG4gICAgICB9KVxuICBgO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge29wdGlvbnMsIHBlcnNvbmFJZCwgcmVhY3Rpb25zfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IgYXMgRXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VCeUlkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBwYXJzZUlkKGltYWdlSWQpO1xuICBjb25zdCBmaWx0ZXJzOiBGaWx0ZXJHcm91cCA9IHtcbiAgICBvcGVyYXRvcjogJ0FORCcsXG4gICAgZmlsdGVyczogW3tmaWVsZDogJ19rZXknLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IGZvcm1hdEltYWdlSWR9XVxuICB9IGFzIGFueTtcblxuICByZXR1cm4gZ2V0SXRlbUJ5PEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIGZpbHRlcnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJJbWFnZVBhdGggPSAodXNlcklkOiBzdHJpbmcsIGltYWdlSWQ6IHN0cmluZywgaW1hZ2VUeXBlOiBzdHJpbmcsIGRpcjogc3RyaW5nID0gJ2ltYWdlcycpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmaWxlbmFtZSA9IGAke2ltYWdlSWR9LiR7Z2V0SW1hZ2VFeHRlbnNpb24oaW1hZ2VUeXBlKX1gO1xuXG4gIHJldHVybiBgdXNlcnMvJHt1c2VySWR9LyR7ZGlyfS8ke2ZpbGVuYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwSW1hZ2VVcmwgPSAoe1xuICBidWNrZXQsXG4gIGRpcmVjdG9yeSA9ICdpbWFnZXMnLFxuICBpbWFnZUlkLFxuICBpbWFnZVR5cGUgPSAnanBnJyxcbiAgaXNUaHVtYiA9IGZhbHNlLFxuICB0eXBlLFxuICB0eXBlSWRcbn06IEltYWdlVXJsRGF0YSk6IHN0cmluZyA9PiB7XG4gIGlmKCF0eXBlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYoIWltYWdlSWQpIHtcbiAgICBpZihpbWFnZVR5cGUgPT09ICdwZXJzb25hJykge1xuICAgICAgcmV0dXJuIGAke0NvbmZpZy5nZXQoJ2ltYWdlLmRlZmF1bHRVcmwnKX0vdXNlcnNfYmsuanBnYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke0NvbmZpZy5nZXQoJ2ltYWdlLmRlZmF1bHRVcmwnKX0vdXNlcnNfd2guanBnYDtcbiAgfVxuXG4gIGNvbnN0IGJ1Y2tldE5hbWUgPSBidWNrZXQgfHwgQ29uZmlnLmdldCgnaW1hZ2UuYnVja2V0JykgfHwgJ2Rldi5yZWFrdG9yLmlvJztcbiAgY29uc3QgaW1hZ2VOYW1lID0gaXNUaHVtYiA/IGAke2ltYWdlSWR9LXRoLiR7aW1hZ2VUeXBlfWAgOiBgJHtpbWFnZUlkfS4ke2ltYWdlVHlwZSA9PT0gJ3BlcnNvbmEnIHx8IGltYWdlVHlwZSA9PT0gJ290aGVyJyA/ICdqcGcnIDogaW1hZ2VUeXBlfWA7XG4gIGNvbnN0IGltYWdlVXJsID0gQ29uZmlnLmdldCgnaW1hZ2UudXJsJykgfHwgYGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS8ke2J1Y2tldE5hbWV9YDtcblxuICBpZih0eXBlID09PSAnYXBwcycpIHtcbiAgICByZXR1cm4gYCR7aW1hZ2VVcmx9LyR7dHlwZX0vJHtkaXJlY3Rvcnl9LyR7aW1hZ2VOYW1lfWA7XG4gIH1cblxuICByZXR1cm4gYCR7aW1hZ2VVcmx9LyR7dHlwZX0vJHt0eXBlSWR9LyR7ZGlyZWN0b3J5fS8ke2ltYWdlTmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlVXJsID0gYXN5bmMgKHtcbiAgYnVja2V0LFxuICBpbWFnZURpciA9ICdpbWFnZXMnLFxuICBpbWFnZUlkLFxuICBpbWFnZVR5cGUgPSAnanBnJyxcbiAgaXNUaHVtYiA9IGZhbHNlLFxuICB0eXBlLFxuICB0eXBlSWQsXG4gIHVybFR5cGUgPSAncHVibGljJ1xufTogSW1hZ2VVcmxEYXRhKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgaWYoIWltYWdlSWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBidWNrZXROYW1lID0gYnVja2V0IHx8IENvbmZpZy5nZXQoJ2ltYWdlLmJ1Y2tldCcpIHx8ICdkZXYucmVha3Rvci5pbyc7XG4gIGNvbnN0IGNvbmZpZ3VyZWRJbWFnZVVybCA9IFN0cmluZyhDb25maWcuZ2V0KCdpbWFnZS51cmwnKSB8fCAnJyk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRBcHBVcmwgPSBTdHJpbmcoQ29uZmlnLmdldCgnYXBwLnVybCcpIHx8ICcnKTtcbiAgY29uc3QgcHVibGljQmFzZVVybCA9IGNvbmZpZ3VyZWRBcHBVcmxcbiAgICA/IGBodHRwczovL2JveC4ke2NvbmZpZ3VyZWRBcHBVcmx9YFxuICAgIDogKGNvbmZpZ3VyZWRJbWFnZVVybCB8fCBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tLyR7YnVja2V0TmFtZX1gKTtcbiAgY29uc3QgZGV2QmFzZVVybCA9IGNvbmZpZ3VyZWRBcHBVcmxcbiAgICA/IGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vZGV2LiR7Y29uZmlndXJlZEFwcFVybH1gXG4gICAgOiAoY29uZmlndXJlZEltYWdlVXJsIHx8IGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vJHtidWNrZXROYW1lfWApO1xuXG4gIC8vIEFsd2F5cyB1c2Ugc2lnbmVkIFVSTHMgZm9yIHRodW1ibmFpbHNcbiAgaWYoaXNUaHVtYikge1xuICAgIHVybFR5cGUgPSAnc2lnbmVkJztcbiAgfVxuXG4gIGNvbnN0IHRodW1iU3VmZml4ID0gaXNUaHVtYiA/ICctdGgnIDogJyc7XG4gIGNvbnN0IGltYWdlS2V5ID0gYCR7dHlwZX0vJHt0eXBlSWR9LyR7aW1hZ2VEaXJ9LyR7aW1hZ2VJZH0ke3RodW1iU3VmZml4fS4ke2ltYWdlVHlwZX1gO1xuXG4gIHN3aXRjaCh1cmxUeXBlKSB7XG4gICAgY2FzZSAnc2lnbmVkJzoge1xuICAgICAgcmV0dXJuIGF3YWl0IHMzR2V0U2lnbmVkVXJsKHtCdWNrZXQ6IGJ1Y2tldE5hbWUsIEV4cGlyZXM6IDYwICogNjAsIEtleTogaW1hZ2VLZXl9KTtcbiAgICB9XG4gICAgY2FzZSAncHVibGljJzoge1xuICAgICAgcmV0dXJuIGAke3B1YmxpY0Jhc2VVcmx9LyR7aW1hZ2VLZXl9YDtcbiAgICB9XG4gICAgY2FzZSAnZGV2Jzoge1xuICAgICAgcmV0dXJuIGAke2RldkJhc2VVcmx9LyR7aW1hZ2VLZXl9YDtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUFuZFNhdmVJbWFnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW1hZ2VJZDogc3RyaW5nLFxuICBidWZmZXI6IEJ1ZmZlcixcbiAgZmlsZVR5cGU6IHN0cmluZyA9ICdpbWFnZS9qcGVnJywgczNPcHRpb25zPzogUHV0T2JqZWN0Q29tbWFuZElucHV0XG4pOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAncmVzaXplU2F2ZUltYWdlJztcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgaW1nVyA9IENvbmZpZy5nZXQoJ2ltYWdlLmltZ1NpemUnKTtcbiAgY29uc3QgaW1nUSA9IENvbmZpZy5nZXQoJ2ltYWdlLmltZ1F1YWxpdHknKTtcbiAgY29uc3QgZm9ybWF0ID0gKGZpbGVUeXBlLnNwbGl0KCcvJykpWzFdIHx8ICdqcGVnJztcbiAgY29uc3Qgc2hhcnBGb3JtYXQgPSBub3JtYWxpemVJbWFnZUZvcm1hdChmb3JtYXQpO1xuICBsZXQgaW1hZ2VPcHRpbWl6ZWRCdWZmZXI6IEJ1ZmZlciA9IGJ1ZmZlcjtcbiAgbGV0IHRodW1iT3B0aW1pemVkQnVmZmVyOiBCdWZmZXIgPSBidWZmZXI7XG4gIGxldCBpbWFnZUlkZW50aXR5OiBJbWFnZVR5cGUgPSB7XG4gICAgZmlsZVNpemU6IGJ1ZmZlci5sZW5ndGgsXG4gICAgZmlsZVR5cGU6IGZvcm1hdCxcbiAgICBpbWFnZUlkXG4gIH07XG5cbiAgdHJ5IHtcbiAgICBpbWFnZU9wdGltaXplZEJ1ZmZlciA9IGF3YWl0IHNoYXJwKGJ1ZmZlcilcbiAgICAgIC5yb3RhdGUoKVxuICAgICAgLnJlc2l6ZSh7XG4gICAgICAgIGZpdDogJ2luc2lkZScsXG4gICAgICAgIGhlaWdodDogaW1nVyxcbiAgICAgICAgd2lkdGg6IGltZ1csXG4gICAgICAgIHdpdGhvdXRFbmxhcmdlbWVudDogdHJ1ZVxuICAgICAgfSlcbiAgICAgIC50b0Zvcm1hdChzaGFycEZvcm1hdCwge3F1YWxpdHk6IGltZ1F9KVxuICAgICAgLnRvQnVmZmVyKCk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtmaWxlVHlwZSwgaW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBpbWFnZU9iajogUHV0T2JqZWN0Q29tbWFuZElucHV0ID0ge1xuICAgICAgQm9keTogaW1hZ2VPcHRpbWl6ZWRCdWZmZXIsXG4gICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICBDb250ZW50VHlwZTogZmlsZVR5cGUsXG4gICAgICAuLi4oczNPcHRpb25zIHx8IHt9KSxcbiAgICAgIEtleTogZ2V0VXNlckltYWdlUGF0aChzZXNzaW9uSWQsIGltYWdlSWQsIGZpbGVUeXBlLCAnaW1hZ2VzJylcbiAgICB9O1xuICAgIGF3YWl0IHMzUHV0KGltYWdlT2JqKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2ZpbGVUeXBlLCBpbWFnZUlkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IFtpbWFnZU1ldGFkYXRhLCBpbWFnZVN0YXRzLCBzb3VyY2VNZXRhZGF0YV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBzaGFycChpbWFnZU9wdGltaXplZEJ1ZmZlcikubWV0YWRhdGEoKSxcbiAgICAgIHNoYXJwKGltYWdlT3B0aW1pemVkQnVmZmVyKS5zdGF0cygpLFxuICAgICAgc2hhcnAoYnVmZmVyKS5tZXRhZGF0YSgpXG4gICAgXSk7XG4gICAgY29uc3Qge2IsIGcsIHJ9ID0gaW1hZ2VTdGF0cy5kb21pbmFudDtcbiAgICBjb25zdCBjb2xvciA9IFtyLCBnLCBiXS5tYXAoKHZhbHVlKSA9PiB2YWx1ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgY29uc3QgZXhpZk1ldGFkYXRhID0gaW1hZ2VFeGlmTWV0YWRhdGEoc291cmNlTWV0YWRhdGEuZXhpZik7XG5cbiAgICBpbWFnZUlkZW50aXR5ID0ge1xuICAgICAgY29sb3IsXG4gICAgICBmaWxlU2l6ZTogaW1hZ2VPcHRpbWl6ZWRCdWZmZXIubGVuZ3RoLFxuICAgICAgZmlsZVR5cGU6IGZvcm1hdCxcbiAgICAgIGhlaWdodDogaW1hZ2VNZXRhZGF0YS5oZWlnaHQgfHwgMCxcbiAgICAgIGltYWdlSWQsXG4gICAgICAuLi5leGlmTWV0YWRhdGEsXG4gICAgICBvcmllbnRhdGlvbjogaW1hZ2VNZXRhZGF0YS5vcmllbnRhdGlvbiA/IFN0cmluZyhpbWFnZU1ldGFkYXRhLm9yaWVudGF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgIHF1YWxpdHk6IGltZ1EsXG4gICAgICByZXNvbHV0aW9uOiBpbWFnZU1ldGFkYXRhLmRlbnNpdHkgPyBgJHtpbWFnZU1ldGFkYXRhLmRlbnNpdHl9IHBwaWAgOiB1bmRlZmluZWQsXG4gICAgICB3aWR0aDogaW1hZ2VNZXRhZGF0YS53aWR0aCB8fCAwXG4gICAgfTtcblxuICAgIGNvbnN0IHRobVcgPSBDb25maWcuZ2V0KCdpbWFnZS50aG1TaXplJyk7XG4gICAgY29uc3QgdGhtUSA9IENvbmZpZy5nZXQoJ2ltYWdlLnRobVF1YWxpdHknKTtcbiAgICB0aHVtYk9wdGltaXplZEJ1ZmZlciA9IGF3YWl0IHNoYXJwKGltYWdlT3B0aW1pemVkQnVmZmVyKVxuICAgICAgLnJlc2l6ZSh7XG4gICAgICAgIGZpdDogJ2NvdmVyJyxcbiAgICAgICAgaGVpZ2h0OiB0aG1XLFxuICAgICAgICBwb3NpdGlvbjogJ2NlbnRyZScsXG4gICAgICAgIHdpZHRoOiB0aG1XXG4gICAgICB9KVxuICAgICAgLnRvRm9ybWF0KHNoYXJwRm9ybWF0LCB7cXVhbGl0eTogdGhtUX0pXG4gICAgICAudG9CdWZmZXIoKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2ZpbGVUeXBlLCBpbWFnZUlkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHRodW1iT2JqOiBQdXRPYmplY3RDb21tYW5kSW5wdXQgPSB7XG4gICAgICBCb2R5OiB0aHVtYk9wdGltaXplZEJ1ZmZlcixcbiAgICAgIEJ1Y2tldDogbnVsbCxcbiAgICAgIENvbnRlbnRUeXBlOiBmaWxlVHlwZSxcbiAgICAgIC4uLihzM09wdGlvbnMgfHwge30pLFxuICAgICAgS2V5OiBnZXRVc2VySW1hZ2VQYXRoKHNlc3Npb25JZCwgaW1hZ2VJZCwgZmlsZVR5cGUsICd0aHVtYnMnKVxuICAgIH07XG4gICAgYXdhaXQgczNQdXQodGh1bWJPYmopO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBpbWFnZUlkZW50aXR5O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEltYWdlID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbWFnZTogSW1hZ2VUeXBlLFxuICBzM09wdGlvbnM/OiBQdXRPYmplY3RDb21tYW5kSW5wdXRcbik6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtpbWFnZUlkLCBkZXNjcmlwdGlvbiwgYnVmZmVyLCBmaWxlVHlwZSwgaXRlbUlkLCBpdGVtVHlwZSwgcHJpdmFjeSA9ICdwdWJsaWMnfSA9IGltYWdlO1xuXG4gIHJldHVybiByZXNpemVBbmRTYXZlSW1hZ2UoY29udGV4dCwgaW1hZ2VJZCwgYnVmZmVyLCBmaWxlVHlwZSwgczNPcHRpb25zKVxuICAgIC50aGVuKChyZXNpemVkSW1hZ2U6IEltYWdlVHlwZSkgPT4ge1xuICAgICAgY29uc3QgaW5zZXJ0OiBJbWFnZVR5cGUgPSB7XG4gICAgICAgIC4uLnJlc2l6ZWRJbWFnZSxcbiAgICAgICAgX2tleTogaW1hZ2VJZCxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIGZpbGVUeXBlLFxuICAgICAgICBwcml2YWN5OiBub3JtYWxpemVJbWFnZVByaXZhY3kocHJpdmFjeSksXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYWRkSXRlbTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCBpbnNlcnQpXG4gICAgICAgIC50aGVuKChzYXZlZEltYWdlOiBJbWFnZVR5cGUpID0+IGFkZEltYWdlRWRnZShjb250ZXh0LCB7XG4gICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICBpdGVtSWQ6IGl0ZW1JZCB8fCBzZXNzaW9uSWQsXG4gICAgICAgICAgaXRlbVR5cGU6IHBhcnNlU3RyaW5nKGl0ZW1UeXBlIHx8ICd1c2VycycsIDMyKS50b0xvd2VyQ2FzZSgpIGFzIEFyYW5nb0RiQ29sbGVjdGlvbixcbiAgICAgICAgICB0eXBlOiAnaW1hZ2UnXG4gICAgICAgIH0pLnRoZW4oKCkgPT4gc2F2ZWRJbWFnZSkpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfUkVTSVpFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRJbWFnZUVkZ2UgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgaW1hZ2VFZGdlOiBJbWFnZUVkZ2VUeXBlKTogUHJvbWlzZTxvYmplY3Q+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZEltYWdlRWRnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2ltYWdlSWQsIGl0ZW1JZCwgaXRlbVR5cGV9ID0gaW1hZ2VFZGdlO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBoYXNNZWRpYS1pbWFnZS0ke2ltYWdlSWR9LSR7aXRlbUlkfS0ke3Nlc3Npb25JZH1gKTtcbiAgY29uc3QgZm9ybWF0SXRlbVR5cGU6IEFyYW5nb0RiQ29sbGVjdGlvbiA9IHBhcnNlQ2hhcihpdGVtVHlwZSkudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb247XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZCA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgY29uc3QgaXRlbURvY0lkID0gZ2V0RG9jSWQoZm9ybWF0SXRlbVR5cGUsIHtfa2V5OiBmb3JtYXRJdGVtSWR9KTtcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZCA9IHBhcnNlSWQoaW1hZ2VJZCk7XG4gIGNvbnN0IGZpbGVEb2NJZCA9IGBpbWFnZXMvJHtmb3JtYXRJbWFnZUlkfWA7XG5cbiAgY29uc3QgZWRnZTogSW1hZ2VFZGdlVHlwZSA9IHtcbiAgICBfZnJvbTogaXRlbURvY0lkLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBfdG86IGZpbGVEb2NJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIGl0ZW1UeXBlLFxuICAgIHR5cGU6ICdpbWFnZSdcbiAgfTtcblxuICBpZihpdGVtRG9jSWQpIHtcbiAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKEVER0VTLkhBU19NRURJQSkuc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAgIC50aGVuKChmaWxlRWRnZSkgPT4gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKEVER0VTLkhBU19NRURJQSkuZG9jdW1lbnQoZmlsZUVkZ2UpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZWRnZSxcbiAgICAgICAgICBmaWxlRG9jSWQsXG4gICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICBpdGVtRG9jSWQsXG4gICAgICAgICAgaXRlbUlkLFxuICAgICAgICAgIGl0ZW1UeXBlXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlSW1hZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlOiBJbWFnZVR5cGUsXG4gIHMzT3B0aW9ucz86IFB1dE9iamVjdENvbW1hbmRJbnB1dFxuKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZUltYWdlJztcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGJhc2U2NCA9ICcnLFxuICAgIGJ1ZmZlcjogaW1hZ2VCdWZmZXIsXG4gICAgZGVzY3JpcHRpb24sXG4gICAgaW1hZ2VJZCxcbiAgICBpdGVtSWQsXG4gICAgaXRlbVR5cGUsXG4gICAgZmlsZVR5cGUsXG4gICAgcHJpdmFjeSxcbiAgICB1cmwgPSAnJ1xuICB9ID0gaW1hZ2U7XG5cbiAgY29uc3QgZm9ybWF0SW1hZ2VJZCA9IGltYWdlSWQgfHwgY3JlYXRlSGFzaChgaW1hZ2UtJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZCA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0SXRlbVR5cGU6IEFyYW5nb0RiQ29sbGVjdGlvbiA9IHBhcnNlQ2hhcihpdGVtVHlwZSwgMTYpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uO1xuICBjb25zdCBjdXN0b21QYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICBkZXNjcmlwdGlvbixcbiAgICBpbWFnZUlkOiBmb3JtYXRJbWFnZUlkLFxuICAgIHByaXZhY3k6IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShwcml2YWN5KSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuXG4gIGlmKGJhc2U2NCB8fCBpbWFnZUJ1ZmZlcikge1xuICAgIGxldCBidWZmZXI6IEJ1ZmZlciA9IGltYWdlQnVmZmVyO1xuXG4gICAgaWYoYmFzZTY0KSB7XG4gICAgICBjb25zdCBmb3JtYXRCYXNlNjQgPSBiYXNlNjQuc3Vic3RyKGJhc2U2NC5pbmRleE9mKCcsJykgKyAxKTtcbiAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGZvcm1hdEJhc2U2NCwgJ2Jhc2U2NCcpO1xuICAgIH1cblxuICAgIGxldCB1cGRhdGVkRmlsZVR5cGUgPSBmaWxlVHlwZTtcblxuICAgIGlmKCFmaWxlVHlwZSkge1xuICAgICAgY29uc3Qge2ZpbGVUeXBlRnJvbUJ1ZmZlcn0gPSBhd2FpdCBpbXBvcnQoJ2ZpbGUtdHlwZScpO1xuICAgICAgY29uc3Qge21pbWV9ID0gYXdhaXQgZmlsZVR5cGVGcm9tQnVmZmVyKGJ1ZmZlcik7XG4gICAgICB1cGRhdGVkRmlsZVR5cGUgPSBtaW1lO1xuICAgIH1cblxuICAgIGNvbnN0IGltZ1BhcmFtczogSW1hZ2VUeXBlID0ge1xuICAgICAgLi4uY3VzdG9tUGFyYW1zLFxuICAgICAgYnVmZmVyLFxuICAgICAgZmlsZVR5cGU6IHVwZGF0ZWRGaWxlVHlwZVxuICAgIH07XG5cbiAgICByZXR1cm4gYWRkSW1hZ2UoY29udGV4dCwgaW1nUGFyYW1zLCBzM09wdGlvbnMpXG4gICAgICAudGhlbigoaW1hZ2U6IEltYWdlVHlwZSkgPT4ge1xuICAgICAgICBpZihmb3JtYXRJdGVtSWQgJiYgZm9ybWF0SXRlbVR5cGUpIHtcbiAgICAgICAgICBjb25zdCBpbWFnZUVkZ2U6IEltYWdlRWRnZVR5cGUgPSB7XG4gICAgICAgICAgICBpbWFnZUlkOiBmb3JtYXRJbWFnZUlkLFxuICAgICAgICAgICAgaXRlbUlkOiBmb3JtYXRJdGVtSWQsXG4gICAgICAgICAgICBpdGVtVHlwZTogZm9ybWF0SXRlbVR5cGUsXG4gICAgICAgICAgICB0eXBlOiAnaW1hZ2UnXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYWRkSW1hZ2VFZGdlKGNvbnRleHQsIGltYWdlRWRnZSkudGhlbigoKSA9PiBpbWFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9IGVsc2UgaWYodXJsICE9PSAnJykge1xuICAgIGxldCBjb250ZW50VHlwZTtcblxuICAgIHJldHVybiBodHRwR2V0KHVybClcbiAgICAgIC50aGVuKChyZXM6IEh0dHBSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfUkVRVUVTVFxuICAgICAgICAgIH0sIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGVudFR5cGUgPSByZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlcykgPT4gKHJlcyBhcyBIdHRwUmVzcG9uc2UpLmJ1ZmZlcigpKVxuICAgICAgLnRoZW4oKGJ1ZmZlcjogQnVmZmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGltZ1BhcmFtczogSW1hZ2VUeXBlID0ge1xuICAgICAgICAgIC4uLmN1c3RvbVBhcmFtcyxcbiAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgZmlsZVR5cGU6IGNvbnRlbnRUeXBlXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGFkZEltYWdlKGNvbnRleHQsIGltZ1BhcmFtcywgczNPcHRpb25zKVxuICAgICAgICAgIC50aGVuKChpbWFnZTogSW1hZ2VUeXBlKSA9PiB7XG4gICAgICAgICAgICBpZihmb3JtYXRJdGVtSWQgJiYgZm9ybWF0SXRlbVR5cGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW1hZ2VFZGdlOiBJbWFnZUVkZ2VUeXBlID0ge2ltYWdlSWQ6IGZvcm1hdEltYWdlSWQsIGl0ZW1JZDogZm9ybWF0SXRlbUlkLCBpdGVtVHlwZTogZm9ybWF0SXRlbVR5cGUsIHR5cGU6ICdpbWFnZSd9O1xuICAgICAgICAgICAgICByZXR1cm4gYWRkSW1hZ2VFZGdlKGNvbnRleHQsIGltYWdlRWRnZSkudGhlbigoKSA9PiBpbWFnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpbWFnZTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogJ2ZldGNoX2Vycm9yJ1xuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfSBlbHNlIGlmKGltYWdlSWQpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB7XG4gICAgICAuLi4oZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCA/IHtkZXNjcmlwdGlvbn0gOiB7fSksXG4gICAgICAuLi4ocHJpdmFjeSAhPT0gdW5kZWZpbmVkID8ge3ByaXZhY3k6IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShwcml2YWN5KX0gOiB7fSlcbiAgICB9O1xuXG4gICAgcmV0dXJuIHVwZGF0ZUl0ZW08SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgZm9ybWF0SW1hZ2VJZCwgdXBkYXRlKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUltYWdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGUnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gcGFyc2VJZChpbWFnZUlkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGltYWdlID0gYXdhaXQgZGVsZXRlSXRlbTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCBmb3JtYXRJbWFnZUlkLCB7XG4gICAgICBjYXNjYWRlOiBbRURHRVMuSEFTX01FRElBXSxcbiAgICAgIG93bmVyc2hpcDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYoIWltYWdlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgUzMgZmlsZXNcbiAgICBjb25zdCB7X2tleTogaW1hZ2VLZXl9ID0gaW1hZ2U7XG4gICAgY29uc3QgcGFyYW1zOiBEZWxldGVPYmplY3RzQ29tbWFuZElucHV0ID0ge1xuICAgICAgQnVja2V0OiBudWxsLFxuICAgICAgRGVsZXRlOiB7XG4gICAgICAgIE9iamVjdHM6IFtcbiAgICAgICAgICB7S2V5OiBgdXNlcnMvJHtzZXNzaW9uSWR9L2ltYWdlcy8ke2ltYWdlS2V5fS5qcGdgfSxcbiAgICAgICAgICB7S2V5OiBgdXNlcnMvJHtzZXNzaW9uSWR9L3RodW1icy8ke2ltYWdlS2V5fS5qcGdgfVxuICAgICAgICBdLFxuICAgICAgICBRdWlldDogdHJ1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gczNEZWxldGVMaXN0KHBhcmFtcykudGhlbigoKSA9PiBpbWFnZSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpbWFnZUlkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuIl0sIm5hbWVzIjpbImdldCIsImh0dHBHZXQiLCJwYXJzZU51bSIsImNyZWF0ZUhhc2giLCJwYXJzZUFyYW5nb0lkIiwicGFyc2VDaGFyIiwicGFyc2VJZCIsInBhcnNlU3RyaW5nIiwiYXFsIiwibGl0ZXJhbCIsImV4aWZSZWFkZXIiLCJzaGFycCIsIkNvbmZpZyIsIkNPTExFQ1RJT05TIiwiRURHRVMiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJsb2dFeGNlcHRpb24iLCJnZXREb2NJZCIsImdldExpbWl0Iiwic2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSIsInVzZURiIiwiZ2V0SW1hZ2VFeHRlbnNpb24iLCJhZGRJdGVtIiwiZGVsZXRlSXRlbSIsImdldEl0ZW1CeSIsImdldExpc3RCeSIsInVwZGF0ZUl0ZW0iLCJnZXRHcm91cERldGFpbHMiLCJpc0dyb3VwZWQiLCJnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUiLCJzM0RlbGV0ZUxpc3QiLCJzM0dldFNpZ25lZFVybCIsInMzUHV0IiwiaGFzU3Vic2NyaXB0aW9uVG9JdGVtIiwiZXZlbnRDYXRlZ29yeSIsImhhc1JlYWN0aW9uQ29sbGVjdGlvbiIsIkhBU19SRUFDVElPTiIsImhhc01lZGlhQ29sbGVjdGlvbiIsIkhBU19NRURJQSIsInBlcnNvbmFzQ29sbGVjdGlvbiIsIlBFUlNPTkFTIiwiTUVESUFfSVRFTV9DT0xMRUNUSU9OUyIsIlVTRVJTIiwiUE9TVFMiLCJHUk9VUFMiLCJnZXRNZWRpYUl0ZW1Eb2NJZHMiLCJpdGVtSWQiLCJpdGVtVHlwZSIsImRvY0lkIiwiaXRlbUtleSIsImluY2x1ZGVzIiwibWFwIiwiY29sbGVjdGlvbiIsIm5vcm1hbGl6ZUltYWdlRm9ybWF0IiwiZm9ybWF0IiwiaW1hZ2VFeGlmTWV0YWRhdGEiLCJleGlmIiwibWV0YWRhdGEiLCJ0YWtlbiIsIlBob3RvIiwiRGF0ZVRpbWVPcmlnaW5hbCIsIm1ha2UiLCJJbWFnZSIsIk1ha2UiLCJtb2RlbCIsIk1vZGVsIiwiRGF0ZSIsImdldFRpbWUiLCJ1bmRlZmluZWQiLCJub3JtYWxpemVJbWFnZVByaXZhY3kiLCJwcml2YWN5IiwiU3RyaW5nIiwidHJpbSIsInRvTG93ZXJDYXNlIiwiY2FuVmlld0ltYWdlIiwiaW1hZ2UiLCJ2aWV3ZXJVc2VySWQiLCJhY2Nlc3MiLCJpc093bmVyIiwidXNlcklkIiwiY2FuVmlld0ZyaWVuZHMiLCJjYW5WaWV3VmlwIiwicGFyc2VJbWFnZU9wdGlvbnMiLCJvcHRpb25zIiwiZnJvbSIsInRvIiwidHlwZSIsImxpbWl0IiwiZ2V0SW1hZ2VPcHRpb25hbEZpZWxkcyIsImZpZWxkcyIsInJlZHVjZSIsInNlbGVjdHMiLCJmaWVsZCIsInF1ZXJpZXMiLCJwdXNoIiwib2JqZWN0cyIsImdldEltYWdlTGlzdEJ5VXNlciIsImNvbnRleHQiLCJhY3Rpb24iLCJmb3JtYXRVc2VySWQiLCJzb3J0IiwiZGlyZWN0aW9uIiwiY3VzdG9tUXVlcmllcyIsImN1c3RvbU9iamVjdHMiLCJjYXRjaCIsImVycm9yIiwiY2F0ZWdvcnkiLCJwYXJhbXMiLCJ2YWx1ZSIsIkRBVEFCQVNFX0VSUk9SIiwiZ2V0SW1hZ2VDb3VudEJ5SXRlbSIsImRhdGFiYXNlTmFtZSIsIml0ZW1Eb2NJZHMiLCJhcWxRcnkiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwiY291bnQiLCJnZXRJbWFnZUxpc3RCeUl0ZW0iLCJzZXNzaW9uIiwic2Vzc2lvblVzZXJJZCIsImZvcm1hdEl0ZW1UeXBlIiwic2VsZWN0T2JqZWN0cyIsInNlbGVjdFF1ZXJpZXMiLCJqb2luIiwibGVuZ3RoIiwibGlzdCIsImFsbCIsIm93bmVyVXNlcklkIiwiZmlsdGVyIiwibWVkaWFJdGVtS2V5IiwiX21lZGlhSXRlbUtleSIsIm1lZGlhSXRlbVR5cGUiLCJfbWVkaWFJdGVtVHlwZSIsInJlbGF0aW9uc2hpcCIsImlzRnJpZW5kIiwiZ2V0SW1hZ2VMaXN0QnlHcm91cCIsInNlc3Npb25JZCIsImZpbHRlcnMiLCJncm91cElkIiwiZm9ybWF0R3JvdXBJZCIsImNvbmRpdGlvbmFsIiwibmFtZSIsImZvcm1hdENvbmQiLCJncm91cCIsImZpbHRlclN0ciIsImdyb3VwZWQiLCJpc1ZhbGlkIiwiZmlsdGVyTGlzdCIsImdldEltYWdlTGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25zIiwiZm9ybWF0U2Vzc2lvbklkIiwiZm9ybWF0UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lIiwiZmlsdGVyQnkiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0UGVyc29uYURvY0lkIiwicGVyc29uYUlkIiwicGVyc29uYURvY0lkIiwicGVyc29uYUtleSIsImdldEltYWdlTGlzdEJ5UGVyc29uYVJlYWN0aW9ucyIsInNlc3Npb25QZXJzb25hSWQiLCJyZWFjdGlvbk5hbWVzIiwiQXJyYXkiLCJpc0FycmF5IiwiQm9vbGVhbiIsImdldEltYWdlQnlJZCIsImltYWdlSWQiLCJmb3JtYXRJbWFnZUlkIiwib3BlcmF0b3IiLCJnZXRVc2VySW1hZ2VQYXRoIiwiaW1hZ2VUeXBlIiwiZGlyIiwiZmlsZW5hbWUiLCJnZXRBcHBJbWFnZVVybCIsImJ1Y2tldCIsImRpcmVjdG9yeSIsImlzVGh1bWIiLCJ0eXBlSWQiLCJidWNrZXROYW1lIiwiaW1hZ2VOYW1lIiwiaW1hZ2VVcmwiLCJnZXRJbWFnZVVybCIsImltYWdlRGlyIiwidXJsVHlwZSIsImNvbmZpZ3VyZWRJbWFnZVVybCIsImNvbmZpZ3VyZWRBcHBVcmwiLCJwdWJsaWNCYXNlVXJsIiwiZGV2QmFzZVVybCIsInRodW1iU3VmZml4IiwiaW1hZ2VLZXkiLCJCdWNrZXQiLCJFeHBpcmVzIiwiS2V5IiwicmVzaXplQW5kU2F2ZUltYWdlIiwiYnVmZmVyIiwiZmlsZVR5cGUiLCJzM09wdGlvbnMiLCJpbWdXIiwiaW1nUSIsInNwbGl0Iiwic2hhcnBGb3JtYXQiLCJpbWFnZU9wdGltaXplZEJ1ZmZlciIsInRodW1iT3B0aW1pemVkQnVmZmVyIiwiaW1hZ2VJZGVudGl0eSIsImZpbGVTaXplIiwicm90YXRlIiwicmVzaXplIiwiZml0IiwiaGVpZ2h0Iiwid2lkdGgiLCJ3aXRob3V0RW5sYXJnZW1lbnQiLCJ0b0Zvcm1hdCIsInF1YWxpdHkiLCJ0b0J1ZmZlciIsIklNQUdFX1NBVkUiLCJpbWFnZU9iaiIsIkJvZHkiLCJDb250ZW50VHlwZSIsImltYWdlTWV0YWRhdGEiLCJpbWFnZVN0YXRzIiwic291cmNlTWV0YWRhdGEiLCJQcm9taXNlIiwic3RhdHMiLCJiIiwiZyIsInIiLCJkb21pbmFudCIsImNvbG9yIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImV4aWZNZXRhZGF0YSIsIm9yaWVudGF0aW9uIiwicmVzb2x1dGlvbiIsImRlbnNpdHkiLCJ0aG1XIiwidGhtUSIsInBvc2l0aW9uIiwidGh1bWJPYmoiLCJhZGRJbWFnZSIsImRlc2NyaXB0aW9uIiwicmVzaXplZEltYWdlIiwiaW5zZXJ0IiwiX2tleSIsInNhdmVkSW1hZ2UiLCJhZGRJbWFnZUVkZ2UiLCJJTUFHRV9SRVNJWkUiLCJpbWFnZUVkZ2UiLCJub3ciLCJlZGdlSWQiLCJmb3JtYXRJdGVtSWQiLCJpdGVtRG9jSWQiLCJmaWxlRG9jSWQiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJhZGRlZCIsInNhdmUiLCJyZXR1cm5OZXciLCJmaWxlRWRnZSIsImRvY3VtZW50IiwidXBkYXRlSW1hZ2UiLCJiYXNlNjQiLCJpbWFnZUJ1ZmZlciIsInVybCIsImN1c3RvbVBhcmFtcyIsImZvcm1hdEJhc2U2NCIsInN1YnN0ciIsImluZGV4T2YiLCJCdWZmZXIiLCJ1cGRhdGVkRmlsZVR5cGUiLCJmaWxlVHlwZUZyb21CdWZmZXIiLCJtaW1lIiwiaW1nUGFyYW1zIiwiY29udGVudFR5cGUiLCJyZXMiLCJzdGF0dXMiLCJJTUFHRV9SRVFVRVNUIiwiaGVhZGVycyIsInVwZGF0ZSIsImRlbGV0ZUltYWdlIiwiY2FzY2FkZSIsIm93bmVyc2hpcCIsIkRlbGV0ZSIsIk9iamVjdHMiLCJRdWlldCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBRUQsU0FBUUEsT0FBT0MsT0FBTyxRQUFPLG9CQUFvQjtBQUNqRCxTQUFRQyxRQUFRLFFBQU8sK0JBQStCO0FBQ3RELFNBQVFDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsV0FBVyxRQUFPLCtCQUErQjtBQUN4RyxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFrQkMsT0FBTyxRQUFPLGVBQWU7QUFDL0MsT0FBT0MsZ0JBQWdCLGNBQWM7QUFDckMsT0FBT0MsV0FBVyxRQUFRO0FBRTFCLFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBQ3BDLFNBQVFDLFdBQVcsRUFBRUMsS0FBSyxRQUFPLDhCQUE4QjtBQUMvRCxTQUFRQyxVQUFVLFFBQU8sMEJBQTBCO0FBQ25ELFNBQVFDLFFBQVEsRUFBRUMsWUFBWSxRQUFPLDZCQUE2QjtBQUNsRSxTQUFRQyxRQUFRLEVB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
873
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbWFnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7RGVsZXRlT2JqZWN0c0NvbW1hbmRJbnB1dCwgUHV0T2JqZWN0Q29tbWFuZElucHV0fSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0IHtnZXQgYXMgaHR0cEdldH0gZnJvbSAnQG5sYWJzL3JpcC1odW50ZXInO1xuaW1wb3J0IHtwYXJzZU51bX0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvbnVtYmVycyc7XG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQXJhbmdvSWQsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnksIGxpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgZXhpZlJlYWRlciBmcm9tICdleGlmLXJlYWRlcic7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuXG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHtFcnJvclR5cGVzfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yLCBsb2dFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0LCBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2dldEltYWdlRXh0ZW5zaW9ufSBmcm9tICcuLi91dGlscy9pbWFnZVV0aWxzLmpzJztcbmltcG9ydCB7YWRkSXRlbSwgZGVsZXRlSXRlbSwgZ2V0SXRlbUJ5LCBnZXRMaXN0QnksIHVwZGF0ZUl0ZW19IGZyb20gJy4vY3J1ZC5qcyc7XG5pbXBvcnQge2dldEdyb3VwRGV0YWlscywgaXNHcm91cGVkfSBmcm9tICcuL2dyb3Vwcy5qcyc7XG5pbXBvcnQge2dldFBlcnNvbmFSZWxhdGlvbnNoaXBTdGF0ZX0gZnJvbSAnLi9wZXJzb25hcy5qcyc7XG5pbXBvcnQge3MzRGVsZXRlTGlzdCwgczNHZXRTaWduZWRVcmwsIHMzUHV0fSBmcm9tICcuL3MzLmpzJztcbmltcG9ydCB7aGFzU3Vic2NyaXB0aW9uVG9JdGVtfSBmcm9tICcuL3N1YnNjcmlwdGlvbnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7UXVlcnlGaWx0ZXJ9IGZyb20gJy4uL3R5cGVzL2FwcHMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0FyYW5nb0RiQ29sbGVjdGlvbiwgQXJhbmdvRGJMaW1pdH0gZnJvbSAnLi4vdHlwZXMvYXJhbmdvZGIudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0dyb3VwVHlwZSwgR3JvdXBVc2VyfSBmcm9tICcuLi90eXBlcy9ncm91cHMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0ltYWdlRWRnZVR5cGUsIEltYWdlT3B0aW9ucywgSW1hZ2VUeXBlLCBJbWFnZVVybERhdGF9IGZyb20gJy4uL3R5cGVzL2ltYWdlcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyR3JvdXB9IGZyb20gJy4uL3V0aWxzL2FxbEhlbHBlcnMuanMnO1xuXG4vLyBEZWZpbmUgaW50ZXJmYWNlIGZvciBIVFRQIHJlc3BvbnNlIHdpdGggYnVmZmVyIG1ldGhvZFxuaW50ZXJmYWNlIEh0dHBSZXNwb25zZSBleHRlbmRzIFJlc3BvbnNlIHtcbiAgYnVmZmVyKCk6IFByb21pc2U8QnVmZmVyPjtcbn1cblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICdpbWFnZXMnO1xuY29uc3QgaGFzUmVhY3Rpb25Db2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5IQVNfUkVBQ1RJT04pO1xuY29uc3QgaGFzTWVkaWFDb2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5IQVNfTUVESUEpO1xuY29uc3QgcGVyc29uYXNDb2xsZWN0aW9uID0gbGl0ZXJhbChDT0xMRUNUSU9OUy5QRVJTT05BUyk7XG5jb25zdCBNRURJQV9JVEVNX0NPTExFQ1RJT05TOiByZWFkb25seSBBcmFuZ29EYkNvbGxlY3Rpb25bXSA9IFtcbiAgQ09MTEVDVElPTlMuUEVSU09OQVMsXG4gIENPTExFQ1RJT05TLlVTRVJTLFxuICBDT0xMRUNUSU9OUy5QT1NUUyxcbiAgQ09MTEVDVElPTlMuR1JPVVBTXG5dO1xuXG50eXBlIFNoYXJwRm9ybWF0ID0gRXh0cmFjdDxQYXJhbWV0ZXJzPFJldHVyblR5cGU8dHlwZW9mIHNoYXJwPlsndG9Gb3JtYXQnXT5bMF0sIHN0cmluZz47XG5cbmNvbnN0IGdldE1lZGlhSXRlbURvY0lkcyA9IChpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU/OiBBcmFuZ29EYkNvbGxlY3Rpb24pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGRvY0lkID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuXG4gIGlmKGRvY0lkKSB7XG4gICAgcmV0dXJuIFtkb2NJZF07XG4gIH1cblxuICBjb25zdCBpdGVtS2V5ID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIGlmKCFpdGVtS2V5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYoaXRlbVR5cGUgJiYgTUVESUFfSVRFTV9DT0xMRUNUSU9OUy5pbmNsdWRlcyhpdGVtVHlwZSkpIHtcbiAgICByZXR1cm4gW2Ake2l0ZW1UeXBlfS8ke2l0ZW1LZXl9YF07XG4gIH1cblxuICByZXR1cm4gTUVESUFfSVRFTV9DT0xMRUNUSU9OUy5tYXAoKGNvbGxlY3Rpb24pID0+IGAke2NvbGxlY3Rpb259LyR7aXRlbUtleX1gKTtcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZUltYWdlRm9ybWF0ID0gKGZvcm1hdDogc3RyaW5nKTogU2hhcnBGb3JtYXQgPT5cbiAgKGZvcm1hdCA9PT0gJ2pwZycgPyAnanBlZycgOiBmb3JtYXQpIGFzIFNoYXJwRm9ybWF0O1xuXG5jb25zdCBpbWFnZUV4aWZNZXRhZGF0YSA9IChleGlmPzogQnVmZmVyKSA9PiB7XG4gIGlmKCFleGlmKSByZXR1cm4ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGV4aWZSZWFkZXIoZXhpZik7XG4gICAgY29uc3QgdGFrZW4gPSBtZXRhZGF0YS5QaG90bz8uRGF0ZVRpbWVPcmlnaW5hbDtcbiAgICByZXR1cm4ge1xuICAgICAgbWFrZTogbWV0YWRhdGEuSW1hZ2U/Lk1ha2UsXG4gICAgICBtb2RlbDogbWV0YWRhdGEuSW1hZ2U/Lk1vZGVsLFxuICAgICAgdGFrZW46IHRha2VuIGluc3RhbmNlb2YgRGF0ZSA/IHRha2VuLmdldFRpbWUoKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuY29uc3Qgbm9ybWFsaXplSW1hZ2VQcml2YWN5ID0gKHByaXZhY3k6IHVua25vd24pOiAnZnJpZW5kcycgfCAncHJpdmF0ZScgfCAncHVibGljJyB8ICd2aXAnID0+IHtcbiAgc3dpdGNoKFN0cmluZyhwcml2YWN5IHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2ZyaWVuZHMnOlxuICAgICAgcmV0dXJuICdmcmllbmRzJztcbiAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgIHJldHVybiAncHJpdmF0ZSc7XG4gICAgY2FzZSAndmlwJzpcbiAgICAgIHJldHVybiAndmlwJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG59O1xuXG5jb25zdCBjYW5WaWV3SW1hZ2UgPSAoXG4gIGltYWdlOiBJbWFnZVR5cGUsXG4gIHZpZXdlclVzZXJJZDogc3RyaW5nLFxuICBhY2Nlc3M6IHtcbiAgICByZWFkb25seSBjYW5WaWV3RnJpZW5kczogYm9vbGVhbjtcbiAgICByZWFkb25seSBjYW5WaWV3VmlwOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGlzT3duZXI6IGJvb2xlYW47XG4gIH1cbikgPT4ge1xuICBjb25zdCBwcml2YWN5ID0gbm9ybWFsaXplSW1hZ2VQcml2YWN5KGltYWdlPy5wcml2YWN5KTtcblxuICBpZihhY2Nlc3MuaXNPd25lciB8fCBTdHJpbmcoaW1hZ2U/LnVzZXJJZCB8fCAnJykgPT09IHZpZXdlclVzZXJJZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3dpdGNoKHByaXZhY3kpIHtcbiAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlICdmcmllbmRzJzpcbiAgICAgIHJldHVybiBhY2Nlc3MuY2FuVmlld0ZyaWVuZHM7XG4gICAgY2FzZSAndmlwJzpcbiAgICAgIHJldHVybiBhY2Nlc3MuY2FuVmlld1ZpcDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUltYWdlT3B0aW9ucyA9IChvcHRpb25zOiBJbWFnZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMCxcbiAgICB0eXBlID0gJ2RlZmF1bHQnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSBhcyBBcmFuZ29EYkxpbWl0LFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZU9wdGlvbmFsRmllbGRzID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0cywgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGlmKGZpZWxkLmluY2x1ZGVzKCdDb3VudCcpKSB7XG4gICAgICByZXR1cm4gc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSgnaW1hZ2VzJywgJ2knLCBmaWVsZCwgc2VsZWN0cyk7XG4gICAgfVxuXG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBpbWFnZSwgciBJTiBJTkJPVU5EIGkuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdyZWFjdGlvbnM6cmVhY3Rpb25zJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFncyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB0YWdzID0gKFxuICAgICAgICAgIEZPUiB0LCBwbCBJTiBJTkJPVU5EIGkuX2lkIGlzVGFnZ2VkXG4gICAgICAgICAgUkVUVVJOIHRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndGFnczp0YWdzJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAndXNlcnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgdXNlcnMgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBpLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcnM6dXNlcnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgIH1cbiAgfSwge29iamVjdHM6IFtdLCBxdWVyaWVzOiBbXX0pO1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgZnJvbTogbnVtYmVyID0gMCxcbiAgdG86IG51bWJlciA9IDMwXG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZXNCeVVzZXInO1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG5cbiAgcmV0dXJuIGdldExpc3RCeTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCB7dXNlcklkOiBmb3JtYXRVc2VySWR9LCB7XG4gICAgc29ydDogW3tmaWVsZDogJ2FkZGVkJywgZGlyZWN0aW9uOiAnREVTQyd9XSxcbiAgICBsaW1pdDoge2Zyb20sIHRvfSxcbiAgICBjdXN0b21RdWVyaWVzOiBbXG4gICAgICBgTEVUIHVzZXIgPSBGSVJTVChGT1IgdSBJTiB1c2VycyBGSUxURVIgdS5fa2V5ID09IGRvYy51c2VySWQgTElNSVQgMSBSRVRVUk4gdSlgXG4gICAgXSxcbiAgICBjdXN0b21PYmplY3RzOiBbJ3VzZXI6dXNlciddXG4gIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7ZnJvbSwgdG8sIHVzZXJJZH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUNvdW50QnlJdGVtID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlQ291bnRCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGl0ZW1Eb2NJZHMgPSBnZXRNZWRpYUl0ZW1Eb2NJZHMoaXRlbUlkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgbWVkaWEgPSAoXG4gICAgICBGT1IgaSBJTiAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgRklMVEVSIGkuX2Zyb20gSU4gJHtpdGVtRG9jSWRzfVxuICAgICAgICBGSUxURVIgaS50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICBSRVRVUk4gMVxuICAgIClcbiAgICBSRVRVUk4ge2NvdW50OiBMRU5HVEgobWVkaWEpfVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh7Y291bnR9KSA9PiBjb3VudClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpdGVtSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5SXRlbSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEltYWdlT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZXNCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMgPSBbXSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZCA9ICcnfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlID0gb3B0aW9ucz8uaXRlbVR5cGUgPyBwYXJzZUNoYXIoU3RyaW5nKG9wdGlvbnMuaXRlbVR5cGUgfHwgJycpLCAzMikudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb24gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGl0ZW1Eb2NJZHMgPSBnZXRNZWRpYUl0ZW1Eb2NJZHMoaXRlbUlkLCBmb3JtYXRJdGVtVHlwZSk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUltYWdlT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0SW1hZ2VPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBsIElOICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgRklMVEVSIGwuX2Zyb20gSU4gJHtpdGVtRG9jSWRzfVxuICAgICAgRklMVEVSIGwudHlwZSA9PSBcImltYWdlXCJcbiAgICAgIExFVCBpID0gRE9DVU1FTlQobC5fdG8pXG4gICAgICBGSUxURVIgTk9UIElTX05VTEwoaSlcbiAgICAgIExFVCBvd25lclBlcnNvbmEgPSBsLml0ZW1UeXBlID09IFwicGVyc29uYXNcIiA/IERPQ1VNRU5UKCR7bGl0ZXJhbChDT0xMRUNUSU9OUy5QRVJTT05BUyl9LCBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmtleSkgOiBudWxsXG4gICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICBTT1JUIGkuYWRkZWQgREVTQ1xuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gTUVSR0UoXG4gICAgICAgICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UoaSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCdpJyl9LFxuICAgICAgICB7XG4gICAgICAgICAgX21lZGlhSXRlbUtleTogUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5rZXksXG4gICAgICAgICAgX21lZGlhSXRlbVR5cGU6IGwuaXRlbVR5cGUgfHwgUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5jb2xsZWN0aW9uLFxuICAgICAgICAgIG93bmVyUGVyc29uYUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuX2tleSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlSWQgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VVcmwgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYU5hbWU6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5uYW1lIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFUaHVtYlVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnRodW1iVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFVc2VySWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS51c2VySWQgOiBudWxsXG4gICAgICAgIH1cbiAgICAgIClcbiAgYDtcblxuICB0cnkge1xuICAgIGNvbnN0IGxpc3QgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKTtcblxuICAgIGNvbnN0IG93bmVyVXNlcklkID0gU3RyaW5nKGxpc3RbMF0/LnVzZXJJZCB8fCAnJyk7XG4gICAgY29uc3QgaXNPd25lciA9ICEhc2Vzc2lvblVzZXJJZCAmJiAhIW93bmVyVXNlcklkICYmIHNlc3Npb25Vc2VySWQgPT09IG93bmVyVXNlcklkO1xuXG4gICAgaWYoaXNPd25lcikge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYoIXNlc3Npb25Vc2VySWQpIHtcbiAgICAgIHJldHVybiBsaXN0LmZpbHRlcigoaW1hZ2UpID0+IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShpbWFnZT8ucHJpdmFjeSkgPT09ICdwdWJsaWMnKTtcbiAgICB9XG5cbiAgICBsZXQgY2FuVmlld0ZyaWVuZHMgPSBmYWxzZTtcbiAgICBsZXQgY2FuVmlld1ZpcCA9IGZhbHNlO1xuXG4gICAgY29uc3QgbWVkaWFJdGVtS2V5ID0gU3RyaW5nKChsaXN0WzBdIGFzIEltYWdlVHlwZSAmIHtfbWVkaWFJdGVtS2V5Pzogc3RyaW5nfSk/Ll9tZWRpYUl0ZW1LZXkgfHwgJycpO1xuICAgIGNvbnN0IG1lZGlhSXRlbVR5cGUgPSBTdHJpbmcoKGxpc3RbMF0gYXMgSW1hZ2VUeXBlICYge19tZWRpYUl0ZW1UeXBlPzogc3RyaW5nfSk/Ll9tZWRpYUl0ZW1UeXBlIHx8ICcnKTtcblxuICAgIGlmKG1lZGlhSXRlbVR5cGUgPT09IENPTExFQ1RJT05TLlBFUlNPTkFTICYmIG1lZGlhSXRlbUtleSkge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gYXdhaXQgZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlKGNvbnRleHQsIG1lZGlhSXRlbUtleSk7XG4gICAgICBjYW5WaWV3RnJpZW5kcyA9ICEhcmVsYXRpb25zaGlwPy5pc0ZyaWVuZDtcbiAgICAgIGNhblZpZXdWaXAgPSBhd2FpdCBoYXNTdWJzY3JpcHRpb25Ub0l0ZW0oY29udGV4dCwgbWVkaWFJdGVtS2V5LCBDT0xMRUNUSU9OUy5QRVJTT05BUyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpbWFnZSkgPT4gY2FuVmlld0ltYWdlKGltYWdlLCBzZXNzaW9uVXNlcklkLCB7Y2FuVmlld0ZyaWVuZHMsIGNhblZpZXdWaXAsIGlzT3duZXJ9KSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7aXRlbUlkLCBvcHRpb25zOiB7Li4ub3B0aW9ucywgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlfX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUxpc3RCeUdyb3VwID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwYXJhbXM6IHtmaWx0ZXJzOiBRdWVyeUZpbHRlcltdLCBncm91cElkOiBzdHJpbmcsIGZyb206IG51bWJlciwgdG86IG51bWJlcn1cbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlc0J5R3JvdXAnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtmaWx0ZXJzLCBncm91cElkLCBmcm9tLCB0b30gPSBwYXJhbXM7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICBmaWx0ZXJzXG4gICAgLm1hcCgoZmlsdGVyOiBRdWVyeUZpbHRlcikgPT4ge1xuICAgICAgY29uc3Qge2NvbmRpdGlvbmFsLCBuYW1lLCB2YWx1ZX0gPSBmaWx0ZXI7XG4gICAgICBsZXQgZm9ybWF0Q29uZCA9IGNvbmRpdGlvbmFsO1xuXG4gICAgICBpZihjb25kaXRpb25hbCAhPT0gJz49JyAmJiBjb25kaXRpb25hbCAhPT0gJzw9JyAmJiBjb25kaXRpb25hbCAhPT0gJz4nICYmIGNvbmRpdGlvbmFsICE9PSAnPCcpIHtcbiAgICAgICAgZm9ybWF0Q29uZCA9ICc9PSc7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaChuYW1lKSB7XG4gICAgICAgIGNhc2UgJ2FkZGVkJzpcbiAgICAgICAgICByZXR1cm4gYHAuYWRkZWQgJHtmb3JtYXRDb25kfSAke3BhcnNlTnVtKHZhbHVlKX1gO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICByZXR1cm4gZ2V0R3JvdXBEZXRhaWxzKGNvbnRleHQsIGZvcm1hdEdyb3VwSWQpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUpID0+IHtcbiAgICAgIGlmKGdyb3VwLnByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIGZpbHRlcnMucHVzaCh7Y29uZGl0aW9uYWw6ICc9PScsIG5hbWU6ICdncm91cElkJywgdmFsdWU6IGZvcm1hdEdyb3VwSWR9KTtcbiAgICAgICAgY29uc3QgZmlsdGVyU3RyID0gZmlsdGVycy5qb2luKCcgJiYgJyk7XG4gICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgICAgRk9SIGkgSU4gRkxBVFRFTihcbiAgICAgICAgICAgIEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyU3RyKX1cbiAgICAgICAgICAgICAgTEVUIGltYWdlcyA9IChcbiAgICAgICAgICAgICAgICBGT1IgaSwgZSBJTiBPVVRCT1VORCBwLl9pZCAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgIEZJTFRFUiBlLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICBSRVRVUk4gaVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgICAgICAgICAgIFJFVFVSTiBpbWFnZXNcbiAgICAgICAgICApXG4gICAgICAgICAgICBTT1JUIGkuYWRkZWQgREVTQ1xuICAgICAgICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICAgICAgICBSRVRVUk4gaVxuICAgICAgICBgO1xuXG4gICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBwYXJhbXM6IHtmaWx0ZXJzLCBmcm9tLCBncm91cElkLCB0b30sXG4gICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNHcm91cGVkKGNvbnRleHQsIHNlc3Npb25JZCwgZ3JvdXBJZClcbiAgICAgICAgLnRoZW4oKGdyb3VwZWQ6IEdyb3VwVXNlcikgPT4ge1xuICAgICAgICAgIGlmKGdyb3VwZWQuaXNWYWxpZCkge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtjb25kaXRpb25hbDogJz09JywgbmFtZTogJ2dyb3VwSWQnLCB2YWx1ZTogZ3JvdXBlZC5ncm91cElkfSk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gZmlsdGVycy5qb2luKCcgJiYgJyk7XG4gICAgICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgICAgICAgICBGT1IgcCBJTiBwb3N0XG4gICAgICAgICAgICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJMaXN0KX1cbiAgICAgICAgICAgICAgICBGT1IgZiBJTiBwLmZpbGVzXG4gICAgICAgICAgICAgICAgICBGSUxURVIgZi50eXBlID09IFwiaW1hZ2UvanBlZ1wiIHx8IGYudHlwZSA9PSBcImltYWdlL3BuZ1wiXG4gICAgICAgICAgICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgICAgICAgICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgICAgICAgICAgICAgICBSRVRVUk4gZlxuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgIHBhcmFtczoge2ZpbHRlcnMsIGZyb20sIGdyb3VwSWQsIHRvfSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHJlYWN0aW9uczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IEltYWdlT3B0aW9uc1xuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMgPSBbXSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VJbWFnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldEltYWdlT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nW10gPSByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWUpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAnci50eXBlID09IFwiaW1hZ2VzXCInLFxuICAgIGBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFJlYWN0aW9ucyl9LCBMT1dFUihyLm5hbWUpKWBdO1xuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgaSwgciBJTiBPVVRCT1VORCAke2Zvcm1hdFNlc3Npb25JZH0gaGFzUmVhY3Rpb25cbiAgICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiBcImltYWdlc1wifVxuICAgICAgTEVUIG1lZGlhID0gRklSU1QoXG4gICAgICAgIEZPUiBvd25lciwgbCBJTiBJTkJPVU5EIGkuX2lkICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgICAgIEZJTFRFUiBsLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiB7XG4gICAgICAgICAgICBpdGVtS2V5OiBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmtleSxcbiAgICAgICAgICAgIGl0ZW1UeXBlOiBsLml0ZW1UeXBlIHx8IFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkuY29sbGVjdGlvblxuICAgICAgICAgIH1cbiAgICAgIClcbiAgICAgIExFVCBvd25lclBlcnNvbmEgPSBtZWRpYSAmJiBtZWRpYS5pdGVtVHlwZSA9PSBcInBlcnNvbmFzXCIgPyBET0NVTUVOVCgke2xpdGVyYWwoQ09MTEVDVElPTlMuUEVSU09OQVMpfSwgbWVkaWEuaXRlbUtleSkgOiBudWxsXG4gICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlckJ5LmpvaW4oJyAmJiAnKSl9XG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIFJFVFVSTiBNRVJHRShcbiAgICAgICAgJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRShpLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ2knKX0sXG4gICAgICAgIHtcbiAgICAgICAgICBvd25lclBlcnNvbmFJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLl9rZXkgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZUlkIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFJbWFnZVVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFOYW1lOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEubmFtZSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVGh1bWJVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS50aHVtYlVybCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVXNlcklkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudXNlcklkIDogbnVsbFxuICAgICAgICB9XG4gICAgICApXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge29wdGlvbnMsIHJlYWN0aW9uc30sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5jb25zdCBnZXRQZXJzb25hRG9jSWQgPSAocGVyc29uYUlkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwZXJzb25hRG9jSWQgPSBwYXJzZUFyYW5nb0lkKHBlcnNvbmFJZCk7XG5cbiAgaWYocGVyc29uYURvY0lkKSB7XG4gICAgcmV0dXJuIHBlcnNvbmFEb2NJZDtcbiAgfVxuXG4gIGNvbnN0IHBlcnNvbmFLZXkgPSBwYXJzZUlkKHBlcnNvbmFJZCk7XG4gIHJldHVybiBwZXJzb25hS2V5ID8gYCR7Q09MTEVDVElPTlMuUEVSU09OQVN9LyR7cGVyc29uYUtleX1gIDogJyc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlQZXJzb25hUmVhY3Rpb25zID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwZXJzb25hSWQ6IHN0cmluZyA9ICcnLFxuICByZWFjdGlvbnM6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBJbWFnZU9wdGlvbnNcbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlTGlzdEJ5UGVyc29uYVJlYWN0aW9ucyc7XG4gIGNvbnN0IHNlc3Npb25QZXJzb25hSWQgPSBTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8ucGVyc29uYUlkIHx8ICcnKTtcbiAgY29uc3QgcGVyc29uYURvY0lkID0gZ2V0UGVyc29uYURvY0lkKHBlcnNvbmFJZCB8fCBzZXNzaW9uUGVyc29uYUlkKTtcbiAgY29uc3QgcmVhY3Rpb25OYW1lcyA9IEFycmF5LmlzQXJyYXkocmVhY3Rpb25zKVxuICAgID8gcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lKSA9PiBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMikudG9Mb3dlckNhc2UoKSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgOiBbXTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlSW1hZ2VPcHRpb25zKG9wdGlvbnMpO1xuXG4gIGlmKCFwZXJzb25hRG9jSWQgfHwgIXJlYWN0aW9uTmFtZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgaW1hZ2UsIHJlYWN0aW9uIElOIE9VVEJPVU5EICR7cGVyc29uYURvY0lkfSAke2hhc1JlYWN0aW9uQ29sbGVjdGlvbn1cbiAgICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiBcImltYWdlc1wifVxuICAgICAgTEVUIG1lZGlhID0gRklSU1QoXG4gICAgICAgIEZPUiBvd25lciwgbGluayBJTiBJTkJPVU5EIGltYWdlLl9pZCAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgICBGSUxURVIgbGluay50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4ge1xuICAgICAgICAgICAgaXRlbUtleTogUEFSU0VfSURFTlRJRklFUihsaW5rLl9mcm9tKS5rZXksXG4gICAgICAgICAgICBpdGVtVHlwZTogbGluay5pdGVtVHlwZSB8fCBQQVJTRV9JREVOVElGSUVSKGxpbmsuX2Zyb20pLmNvbGxlY3Rpb25cbiAgICAgICAgICB9XG4gICAgICApXG4gICAgICBMRVQgb3duZXJQZXJzb25hID0gbWVkaWEgJiYgbWVkaWEuaXRlbVR5cGUgPT0gXCJwZXJzb25hc1wiID8gRE9DVU1FTlQoJHtwZXJzb25hc0NvbGxlY3Rpb259LCBtZWRpYS5pdGVtS2V5KSA6IG51bGxcbiAgICAgIEZJTFRFUiBMT1dFUihyZWFjdGlvbi50eXBlIHx8IFwiXCIpIElOIFtcImltYWdlXCIsIFwiaW1hZ2VzXCJdXG4gICAgICBGSUxURVIgUE9TSVRJT04oJHtyZWFjdGlvbk5hbWVzfSwgTE9XRVIocmVhY3Rpb24ubmFtZSB8fCByZWFjdGlvbi52YWx1ZSB8fCBcIlwiKSlcbiAgICAgIFNPUlQgcmVhY3Rpb24uYWRkZWQgREVTQ1xuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gTUVSR0UoaW1hZ2UsIHtcbiAgICAgICAgb3duZXJQZXJzb25hSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5fa2V5IDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlSWQgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFJbWFnZVVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlVXJsIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hTmFtZTogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLm5hbWUgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFUaHVtYlVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnRodW1iVXJsIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hVXNlcklkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudXNlcklkIDogbnVsbFxuICAgICAgfSlcbiAgYDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtvcHRpb25zLCBwZXJzb25hSWQsIHJlYWN0aW9uc30sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yIGFzIEVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlQnlJZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUlkOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gcGFyc2VJZChpbWFnZUlkKTtcbiAgY29uc3QgZmlsdGVyczogRmlsdGVyR3JvdXAgPSB7XG4gICAgb3BlcmF0b3I6ICdBTkQnLFxuICAgIGZpbHRlcnM6IFt7ZmllbGQ6ICdfa2V5Jywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiBmb3JtYXRJbWFnZUlkfV1cbiAgfSBhcyBhbnk7XG5cbiAgcmV0dXJuIGdldEl0ZW1CeTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCBmaWx0ZXJzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VySW1hZ2VQYXRoID0gKHVzZXJJZDogc3RyaW5nLCBpbWFnZUlkOiBzdHJpbmcsIGltYWdlVHlwZTogc3RyaW5nLCBkaXI6IHN0cmluZyA9ICdpbWFnZXMnKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZmlsZW5hbWUgPSBgJHtpbWFnZUlkfS4ke2dldEltYWdlRXh0ZW5zaW9uKGltYWdlVHlwZSl9YDtcblxuICByZXR1cm4gYHVzZXJzLyR7dXNlcklkfS8ke2Rpcn0vJHtmaWxlbmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcEltYWdlVXJsID0gKHtcbiAgYnVja2V0LFxuICBkaXJlY3RvcnkgPSAnaW1hZ2VzJyxcbiAgaW1hZ2VJZCxcbiAgaW1hZ2VUeXBlID0gJ2pwZycsXG4gIGlzVGh1bWIgPSBmYWxzZSxcbiAgdHlwZSxcbiAgdHlwZUlkXG59OiBJbWFnZVVybERhdGEpOiBzdHJpbmcgPT4ge1xuICBpZighdHlwZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmKCFpbWFnZUlkKSB7XG4gICAgaWYoaW1hZ2VUeXBlID09PSAncGVyc29uYScpIHtcbiAgICAgIHJldHVybiBgJHtDb25maWcuZ2V0KCdpbWFnZS5kZWZhdWx0VXJsJyl9L3VzZXJzX2JrLmpwZ2A7XG4gICAgfVxuICAgIHJldHVybiBgJHtDb25maWcuZ2V0KCdpbWFnZS5kZWZhdWx0VXJsJyl9L3VzZXJzX3doLmpwZ2A7XG4gIH1cblxuICBjb25zdCBidWNrZXROYW1lID0gYnVja2V0IHx8IENvbmZpZy5nZXQoJ2ltYWdlLmJ1Y2tldCcpIHx8ICdkZXYucmVha3Rvci5pbyc7XG4gIGNvbnN0IGltYWdlTmFtZSA9IGlzVGh1bWIgPyBgJHtpbWFnZUlkfS10aC4ke2ltYWdlVHlwZX1gIDogYCR7aW1hZ2VJZH0uJHtpbWFnZVR5cGUgPT09ICdwZXJzb25hJyB8fCBpbWFnZVR5cGUgPT09ICdvdGhlcicgPyAnanBnJyA6IGltYWdlVHlwZX1gO1xuICBjb25zdCBpbWFnZVVybCA9IENvbmZpZy5nZXQoJ2ltYWdlLnVybCcpIHx8IGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vJHtidWNrZXROYW1lfWA7XG5cbiAgaWYodHlwZSA9PT0gJ2FwcHMnKSB7XG4gICAgcmV0dXJuIGAke2ltYWdlVXJsfS8ke3R5cGV9LyR7ZGlyZWN0b3J5fS8ke2ltYWdlTmFtZX1gO1xuICB9XG5cbiAgcmV0dXJuIGAke2ltYWdlVXJsfS8ke3R5cGV9LyR7dHlwZUlkfS8ke2RpcmVjdG9yeX0vJHtpbWFnZU5hbWV9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZVVybCA9IGFzeW5jICh7XG4gIGJ1Y2tldCxcbiAgaW1hZ2VEaXIgPSAnaW1hZ2VzJyxcbiAgaW1hZ2VJZCxcbiAgaW1hZ2VUeXBlID0gJ2pwZycsXG4gIGlzVGh1bWIgPSBmYWxzZSxcbiAgdHlwZSxcbiAgdHlwZUlkLFxuICB1cmxUeXBlID0gJ3B1YmxpYydcbn06IEltYWdlVXJsRGF0YSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGlmKCFpbWFnZUlkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgYnVja2V0TmFtZSA9IGJ1Y2tldCB8fCBDb25maWcuZ2V0KCdpbWFnZS5idWNrZXQnKSB8fCAnZGV2LnJlYWt0b3IuaW8nO1xuICBjb25zdCBjb25maWd1cmVkSW1hZ2VVcmwgPSBTdHJpbmcoQ29uZmlnLmdldCgnaW1hZ2UudXJsJykgfHwgJycpO1xuICBjb25zdCBjb25maWd1cmVkQXBwVXJsID0gU3RyaW5nKENvbmZpZy5nZXQoJ2FwcC51cmwnKSB8fCAnJyk7XG4gIGNvbnN0IHB1YmxpY0Jhc2VVcmwgPSBjb25maWd1cmVkQXBwVXJsXG4gICAgPyBgaHR0cHM6Ly9ib3guJHtjb25maWd1cmVkQXBwVXJsfWBcbiAgICA6IChjb25maWd1cmVkSW1hZ2VVcmwgfHwgYGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS8ke2J1Y2tldE5hbWV9YCk7XG4gIGNvbnN0IGRldkJhc2VVcmwgPSBjb25maWd1cmVkQXBwVXJsXG4gICAgPyBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2Rldi4ke2NvbmZpZ3VyZWRBcHBVcmx9YFxuICAgIDogKGNvbmZpZ3VyZWRJbWFnZVVybCB8fCBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tLyR7YnVja2V0TmFtZX1gKTtcblxuICAvLyBBbHdheXMgdXNlIHNpZ25lZCBVUkxzIGZvciB0aHVtYm5haWxzXG4gIGlmKGlzVGh1bWIpIHtcbiAgICB1cmxUeXBlID0gJ3NpZ25lZCc7XG4gIH1cblxuICBjb25zdCB0aHVtYlN1ZmZpeCA9IGlzVGh1bWIgPyAnLXRoJyA6ICcnO1xuICBjb25zdCBpbWFnZUtleSA9IGAke3R5cGV9LyR7dHlwZUlkfS8ke2ltYWdlRGlyfS8ke2ltYWdlSWR9JHt0aHVtYlN1ZmZpeH0uJHtpbWFnZVR5cGV9YDtcblxuICBzd2l0Y2godXJsVHlwZSkge1xuICAgIGNhc2UgJ3NpZ25lZCc6IHtcbiAgICAgIHJldHVybiBhd2FpdCBzM0dldFNpZ25lZFVybCh7QnVja2V0OiBidWNrZXROYW1lLCBFeHBpcmVzOiA2MCAqIDYwLCBLZXk6IGltYWdlS2V5fSk7XG4gICAgfVxuICAgIGNhc2UgJ3B1YmxpYyc6IHtcbiAgICAgIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS8ke2ltYWdlS2V5fWA7XG4gICAgfVxuICAgIGNhc2UgJ2Rldic6IHtcbiAgICAgIHJldHVybiBgJHtkZXZCYXNlVXJsfS8ke2ltYWdlS2V5fWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNpemVBbmRTYXZlSW1hZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlSWQ6IHN0cmluZyxcbiAgYnVmZmVyOiBCdWZmZXIsXG4gIGZpbGVUeXBlOiBzdHJpbmcgPSAnaW1hZ2UvanBlZycsIHMzT3B0aW9ucz86IFB1dE9iamVjdENvbW1hbmRJbnB1dFxuKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3Jlc2l6ZVNhdmVJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGltZ1cgPSBDb25maWcuZ2V0KCdpbWFnZS5pbWdTaXplJyk7XG4gIGNvbnN0IGltZ1EgPSBDb25maWcuZ2V0KCdpbWFnZS5pbWdRdWFsaXR5Jyk7XG4gIGNvbnN0IGZvcm1hdCA9IChmaWxlVHlwZS5zcGxpdCgnLycpKVsxXSB8fCAnanBlZyc7XG4gIGNvbnN0IHNoYXJwRm9ybWF0ID0gbm9ybWFsaXplSW1hZ2VGb3JtYXQoZm9ybWF0KTtcbiAgbGV0IGltYWdlT3B0aW1pemVkQnVmZmVyOiBCdWZmZXIgPSBidWZmZXI7XG4gIGxldCB0aHVtYk9wdGltaXplZEJ1ZmZlcjogQnVmZmVyID0gYnVmZmVyO1xuICBsZXQgaW1hZ2VJZGVudGl0eTogSW1hZ2VUeXBlID0ge1xuICAgIGZpbGVTaXplOiBidWZmZXIubGVuZ3RoLFxuICAgIGZpbGVUeXBlOiBmb3JtYXQsXG4gICAgaW1hZ2VJZFxuICB9O1xuXG4gIHRyeSB7XG4gICAgaW1hZ2VPcHRpbWl6ZWRCdWZmZXIgPSBhd2FpdCBzaGFycChidWZmZXIpXG4gICAgICAucm90YXRlKClcbiAgICAgIC5yZXNpemUoe1xuICAgICAgICBmaXQ6ICdpbnNpZGUnLFxuICAgICAgICBoZWlnaHQ6IGltZ1csXG4gICAgICAgIHdpZHRoOiBpbWdXLFxuICAgICAgICB3aXRob3V0RW5sYXJnZW1lbnQ6IHRydWVcbiAgICAgIH0pXG4gICAgICAudG9Gb3JtYXQoc2hhcnBGb3JtYXQsIHtxdWFsaXR5OiBpbWdRfSlcbiAgICAgIC50b0J1ZmZlcigpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZmlsZVR5cGUsIGltYWdlSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgaW1hZ2VPYmo6IFB1dE9iamVjdENvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJvZHk6IGltYWdlT3B0aW1pemVkQnVmZmVyLFxuICAgICAgQnVja2V0OiBudWxsLFxuICAgICAgQ29udGVudFR5cGU6IGZpbGVUeXBlLFxuICAgICAgLi4uKHMzT3B0aW9ucyB8fCB7fSksXG4gICAgICBLZXk6IGdldFVzZXJJbWFnZVBhdGgoc2Vzc2lvbklkLCBpbWFnZUlkLCBmaWxlVHlwZSwgJ2ltYWdlcycpXG4gICAgfTtcbiAgICBhd2FpdCBzM1B1dChpbWFnZU9iaik7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtmaWxlVHlwZSwgaW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBbaW1hZ2VNZXRhZGF0YSwgaW1hZ2VTdGF0cywgc291cmNlTWV0YWRhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgc2hhcnAoaW1hZ2VPcHRpbWl6ZWRCdWZmZXIpLm1ldGFkYXRhKCksXG4gICAgICBzaGFycChpbWFnZU9wdGltaXplZEJ1ZmZlcikuc3RhdHMoKSxcbiAgICAgIHNoYXJwKGJ1ZmZlcikubWV0YWRhdGEoKVxuICAgIF0pO1xuICAgIGNvbnN0IHtiLCBnLCByfSA9IGltYWdlU3RhdHMuZG9taW5hbnQ7XG4gICAgY29uc3QgY29sb3IgPSBbciwgZywgYl0ubWFwKCh2YWx1ZSkgPT4gdmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIGNvbnN0IGV4aWZNZXRhZGF0YSA9IGltYWdlRXhpZk1ldGFkYXRhKHNvdXJjZU1ldGFkYXRhLmV4aWYpO1xuXG4gICAgaW1hZ2VJZGVudGl0eSA9IHtcbiAgICAgIGNvbG9yLFxuICAgICAgZmlsZVNpemU6IGltYWdlT3B0aW1pemVkQnVmZmVyLmxlbmd0aCxcbiAgICAgIGZpbGVUeXBlOiBmb3JtYXQsXG4gICAgICBoZWlnaHQ6IGltYWdlTWV0YWRhdGEuaGVpZ2h0IHx8IDAsXG4gICAgICBpbWFnZUlkLFxuICAgICAgLi4uZXhpZk1ldGFkYXRhLFxuICAgICAgb3JpZW50YXRpb246IGltYWdlTWV0YWRhdGEub3JpZW50YXRpb24gPyBTdHJpbmcoaW1hZ2VNZXRhZGF0YS5vcmllbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICBxdWFsaXR5OiBpbWdRLFxuICAgICAgcmVzb2x1dGlvbjogaW1hZ2VNZXRhZGF0YS5kZW5zaXR5ID8gYCR7aW1hZ2VNZXRhZGF0YS5kZW5zaXR5fSBwcGlgIDogdW5kZWZpbmVkLFxuICAgICAgd2lkdGg6IGltYWdlTWV0YWRhdGEud2lkdGggfHwgMFxuICAgIH07XG5cbiAgICBjb25zdCB0aG1XID0gQ29uZmlnLmdldCgnaW1hZ2UudGhtU2l6ZScpO1xuICAgIGNvbnN0IHRobVEgPSBDb25maWcuZ2V0KCdpbWFnZS50aG1RdWFsaXR5Jyk7XG4gICAgdGh1bWJPcHRpbWl6ZWRCdWZmZXIgPSBhd2FpdCBzaGFycChpbWFnZU9wdGltaXplZEJ1ZmZlcilcbiAgICAgIC5yZXNpemUoe1xuICAgICAgICBmaXQ6ICdjb3ZlcicsXG4gICAgICAgIGhlaWdodDogdGhtVyxcbiAgICAgICAgcG9zaXRpb246ICdjZW50cmUnLFxuICAgICAgICB3aWR0aDogdGhtV1xuICAgICAgfSlcbiAgICAgIC50b0Zvcm1hdChzaGFycEZvcm1hdCwge3F1YWxpdHk6IHRobVF9KVxuICAgICAgLnRvQnVmZmVyKCk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtmaWxlVHlwZSwgaW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0aHVtYk9iajogUHV0T2JqZWN0Q29tbWFuZElucHV0ID0ge1xuICAgICAgQm9keTogdGh1bWJPcHRpbWl6ZWRCdWZmZXIsXG4gICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICBDb250ZW50VHlwZTogZmlsZVR5cGUsXG4gICAgICAuLi4oczNPcHRpb25zIHx8IHt9KSxcbiAgICAgIEtleTogZ2V0VXNlckltYWdlUGF0aChzZXNzaW9uSWQsIGltYWdlSWQsIGZpbGVUeXBlLCAndGh1bWJzJylcbiAgICB9O1xuICAgIGF3YWl0IHMzUHV0KHRodW1iT2JqKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW1hZ2VJZGVudGl0eTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRJbWFnZSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW1hZ2U6IEltYWdlVHlwZSxcbiAgczNPcHRpb25zPzogUHV0T2JqZWN0Q29tbWFuZElucHV0XG4pOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkSW1hZ2UnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgZGVzY3JpcHRpb24sIGJ1ZmZlciwgZmlsZVR5cGUsIGl0ZW1JZCwgaXRlbVR5cGUsIHByaXZhY3kgPSAncHVibGljJ30gPSBpbWFnZTtcblxuICByZXR1cm4gcmVzaXplQW5kU2F2ZUltYWdlKGNvbnRleHQsIGltYWdlSWQsIGJ1ZmZlciwgZmlsZVR5cGUsIHMzT3B0aW9ucylcbiAgICAudGhlbigocmVzaXplZEltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGluc2VydDogSW1hZ2VUeXBlID0ge1xuICAgICAgICAuLi5yZXNpemVkSW1hZ2UsXG4gICAgICAgIF9rZXk6IGltYWdlSWQsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgcHJpdmFjeTogbm9ybWFsaXplSW1hZ2VQcml2YWN5KHByaXZhY3kpLFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFkZEl0ZW08SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgaW5zZXJ0KVxuICAgICAgICAudGhlbigoc2F2ZWRJbWFnZTogSW1hZ2VUeXBlKSA9PiBhZGRJbWFnZUVkZ2UoY29udGV4dCwge1xuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgaXRlbUlkOiBpdGVtSWQgfHwgc2Vzc2lvbklkLFxuICAgICAgICAgIGl0ZW1UeXBlOiBwYXJzZVN0cmluZyhpdGVtVHlwZSB8fCAndXNlcnMnLCAzMikudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb24sXG4gICAgICAgICAgdHlwZTogJ2ltYWdlJ1xuICAgICAgICB9KS50aGVuKCgpID0+IHNhdmVkSW1hZ2UpKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1JFU0laRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkSW1hZ2VFZGdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSk6IFByb21pc2U8b2JqZWN0PiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRJbWFnZUVkZ2UnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtpbWFnZUlkLCBpdGVtSWQsIGl0ZW1UeXBlfSA9IGltYWdlRWRnZTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUlkID0gY3JlYXRlSGFzaChgaGFzTWVkaWEtaW1hZ2UtJHtpbWFnZUlkfS0ke2l0ZW1JZH0tJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlOiBBcmFuZ29EYkNvbGxlY3Rpb24gPSBwYXJzZUNoYXIoaXRlbVR5cGUpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uO1xuICBjb25zdCBmb3JtYXRJdGVtSWQgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGl0ZW1Eb2NJZCA9IGdldERvY0lkKGZvcm1hdEl0ZW1UeXBlLCB7X2tleTogZm9ybWF0SXRlbUlkfSk7XG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBwYXJzZUlkKGltYWdlSWQpO1xuICBjb25zdCBmaWxlRG9jSWQgPSBgaW1hZ2VzLyR7Zm9ybWF0SW1hZ2VJZH1gO1xuXG4gIGNvbnN0IGVkZ2U6IEltYWdlRWRnZVR5cGUgPSB7XG4gICAgX2Zyb206IGl0ZW1Eb2NJZCxcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgX3RvOiBmaWxlRG9jSWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBpdGVtVHlwZSxcbiAgICB0eXBlOiAnaW1hZ2UnXG4gIH07XG5cbiAgaWYoaXRlbURvY0lkKSB7XG4gICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbihFREdFUy5IQVNfTUVESUEpLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgICAudGhlbigoZmlsZUVkZ2UpID0+IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbihFREdFUy5IQVNfTUVESUEpLmRvY3VtZW50KGZpbGVFZGdlKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGVkZ2UsXG4gICAgICAgICAgZmlsZURvY0lkLFxuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgaXRlbURvY0lkLFxuICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICBpdGVtVHlwZVxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUltYWdlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbWFnZTogSW1hZ2VUeXBlLFxuICBzM09wdGlvbnM/OiBQdXRPYmplY3RDb21tYW5kSW5wdXRcbik6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGVJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBiYXNlNjQgPSAnJyxcbiAgICBidWZmZXI6IGltYWdlQnVmZmVyLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIGltYWdlSWQsXG4gICAgaXRlbUlkLFxuICAgIGl0ZW1UeXBlLFxuICAgIGZpbGVUeXBlLFxuICAgIHByaXZhY3ksXG4gICAgdXJsID0gJydcbiAgfSA9IGltYWdlO1xuXG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBpbWFnZUlkIHx8IGNyZWF0ZUhhc2goYGltYWdlLSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBmb3JtYXRJdGVtSWQgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlOiBBcmFuZ29EYkNvbGxlY3Rpb24gPSBwYXJzZUNoYXIoaXRlbVR5cGUsIDE2KS50b0xvd2VyQ2FzZSgpIGFzIEFyYW5nb0RiQ29sbGVjdGlvbjtcbiAgY29uc3QgY3VzdG9tUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgZGVzY3JpcHRpb24sXG4gICAgaW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCxcbiAgICBwcml2YWN5OiBub3JtYWxpemVJbWFnZVByaXZhY3kocHJpdmFjeSksXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcblxuICBpZihiYXNlNjQgfHwgaW1hZ2VCdWZmZXIpIHtcbiAgICBsZXQgYnVmZmVyOiBCdWZmZXIgPSBpbWFnZUJ1ZmZlcjtcblxuICAgIGlmKGJhc2U2NCkge1xuICAgICAgY29uc3QgZm9ybWF0QmFzZTY0ID0gYmFzZTY0LnN1YnN0cihiYXNlNjQuaW5kZXhPZignLCcpICsgMSk7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShmb3JtYXRCYXNlNjQsICdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBsZXQgdXBkYXRlZEZpbGVUeXBlID0gZmlsZVR5cGU7XG5cbiAgICBpZighZmlsZVR5cGUpIHtcbiAgICAgIGNvbnN0IHtmaWxlVHlwZUZyb21CdWZmZXJ9ID0gYXdhaXQgaW1wb3J0KCdmaWxlLXR5cGUnKTtcbiAgICAgIGNvbnN0IHttaW1lfSA9IGF3YWl0IGZpbGVUeXBlRnJvbUJ1ZmZlcihidWZmZXIpO1xuICAgICAgdXBkYXRlZEZpbGVUeXBlID0gbWltZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbWdQYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICAgIC4uLmN1c3RvbVBhcmFtcyxcbiAgICAgIGJ1ZmZlcixcbiAgICAgIGZpbGVUeXBlOiB1cGRhdGVkRmlsZVR5cGVcbiAgICB9O1xuXG4gICAgcmV0dXJuIGFkZEltYWdlKGNvbnRleHQsIGltZ1BhcmFtcywgczNPcHRpb25zKVxuICAgICAgLnRoZW4oKGltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgICAgaWYoZm9ybWF0SXRlbUlkICYmIGZvcm1hdEl0ZW1UeXBlKSB7XG4gICAgICAgICAgY29uc3QgaW1hZ2VFZGdlOiBJbWFnZUVkZ2VUeXBlID0ge1xuICAgICAgICAgICAgaW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1JZDogZm9ybWF0SXRlbUlkLFxuICAgICAgICAgICAgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlLFxuICAgICAgICAgICAgdHlwZTogJ2ltYWdlJ1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFkZEltYWdlRWRnZShjb250ZXh0LCBpbWFnZUVkZ2UpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfSBlbHNlIGlmKHVybCAhPT0gJycpIHtcbiAgICBsZXQgY29udGVudFR5cGU7XG5cbiAgICByZXR1cm4gaHR0cEdldCh1cmwpXG4gICAgICAudGhlbigocmVzOiBIdHRwUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1JFUVVFU1RcbiAgICAgICAgICB9LCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IChyZXMgYXMgSHR0cFJlc3BvbnNlKS5idWZmZXIoKSlcbiAgICAgIC50aGVuKChidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBjb25zdCBpbWdQYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICAgICAgICAuLi5jdXN0b21QYXJhbXMsXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGZpbGVUeXBlOiBjb250ZW50VHlwZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhZGRJbWFnZShjb250ZXh0LCBpbWdQYXJhbXMsIHMzT3B0aW9ucylcbiAgICAgICAgICAudGhlbigoaW1hZ2U6IEltYWdlVHlwZSkgPT4ge1xuICAgICAgICAgICAgaWYoZm9ybWF0SXRlbUlkICYmIGZvcm1hdEl0ZW1UeXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSA9IHtpbWFnZUlkOiBmb3JtYXRJbWFnZUlkLCBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCwgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlLCB0eXBlOiAnaW1hZ2UnfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFkZEltYWdlRWRnZShjb250ZXh0LCBpbWFnZUVkZ2UpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6ICdmZXRjaF9lcnJvcidcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH0gZWxzZSBpZihpbWFnZUlkKSB7XG4gICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgLi4uKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7ZGVzY3JpcHRpb259IDoge30pLFxuICAgICAgLi4uKHByaXZhY3kgIT09IHVuZGVmaW5lZCA/IHtwcml2YWN5OiBub3JtYWxpemVJbWFnZVByaXZhY3kocHJpdmFjeSl9IDoge30pXG4gICAgfTtcblxuICAgIHJldHVybiB1cGRhdGVJdGVtPEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIGZvcm1hdEltYWdlSWQsIHVwZGF0ZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVJbWFnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUlkOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlJztcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZCA9IHBhcnNlSWQoaW1hZ2VJZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBpbWFnZSA9IGF3YWl0IGRlbGV0ZUl0ZW08SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgZm9ybWF0SW1hZ2VJZCwge1xuICAgICAgY2FzY2FkZTogW0VER0VTLkhBU19NRURJQV0sXG4gICAgICBvd25lcnNoaXA6IHRydWVcbiAgICB9KTtcblxuICAgIGlmKCFpbWFnZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIFMzIGZpbGVzXG4gICAgY29uc3Qge19rZXk6IGltYWdlS2V5fSA9IGltYWdlO1xuICAgIGNvbnN0IHBhcmFtczogRGVsZXRlT2JqZWN0c0NvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJ1Y2tldDogbnVsbCxcbiAgICAgIERlbGV0ZToge1xuICAgICAgICBPYmplY3RzOiBbXG4gICAgICAgICAge0tleTogYHVzZXJzLyR7c2Vzc2lvbklkfS9pbWFnZXMvJHtpbWFnZUtleX0uanBnYH0sXG4gICAgICAgICAge0tleTogYHVzZXJzLyR7c2Vzc2lvbklkfS90aHVtYnMvJHtpbWFnZUtleX0uanBnYH1cbiAgICAgICAgXSxcbiAgICAgICAgUXVpZXQ6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHMzRGVsZXRlTGlzdChwYXJhbXMpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJnZXQiLCJodHRwR2V0IiwicGFyc2VOdW0iLCJjcmVhdGVIYXNoIiwicGFyc2VBcmFuZ29JZCIsInBhcnNlQ2hhciIsInBhcnNlSWQiLCJwYXJzZVN0cmluZyIsImFxbCIsImxpdGVyYWwiLCJleGlmUmVhZGVyIiwic2hhcnAiLCJDb25maWciLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwibG9nRXhjZXB0aW9uIiwiZ2V0RG9jSWQiLCJnZXRMaW1pdCIsInNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUiLCJ1c2VEYiIsImdldEltYWdlRXh0ZW5zaW9uIiwiYWRkSXRlbSIsImRlbGV0ZUl0ZW0iLCJnZXRJdGVtQnkiLCJnZXRMaXN0QnkiLCJ1cGRhdGVJdGVtIiwiZ2V0R3JvdXBEZXRhaWxzIiwiaXNHcm91cGVkIiwiZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlIiwiczNEZWxldGVMaXN0IiwiczNHZXRTaWduZWRVcmwiLCJzM1B1dCIsImhhc1N1YnNjcmlwdGlvblRvSXRlbSIsImV2ZW50Q2F0ZWdvcnkiLCJoYXNSZWFjdGlvbkNvbGxlY3Rpb24iLCJIQVNfUkVBQ1RJT04iLCJoYXNNZWRpYUNvbGxlY3Rpb24iLCJIQVNfTUVESUEiLCJwZXJzb25hc0NvbGxlY3Rpb24iLCJQRVJTT05BUyIsIk1FRElBX0lURU1fQ09MTEVDVElPTlMiLCJVU0VSUyIsIlBPU1RTIiwiR1JPVVBTIiwiZ2V0TWVkaWFJdGVtRG9jSWRzIiwiaXRlbUlkIiwiaXRlbVR5cGUiLCJkb2NJZCIsIml0ZW1LZXkiLCJpbmNsdWRlcyIsIm1hcCIsImNvbGxlY3Rpb24iLCJub3JtYWxpemVJbWFnZUZvcm1hdCIsImZvcm1hdCIsImltYWdlRXhpZk1ldGFkYXRhIiwiZXhpZiIsIm1ldGFkYXRhIiwidGFrZW4iLCJQaG90byIsIkRhdGVUaW1lT3JpZ2luYWwiLCJtYWtlIiwiSW1hZ2UiLCJNYWtlIiwibW9kZWwiLCJNb2RlbCIsIkRhdGUiLCJnZXRUaW1lIiwidW5kZWZpbmVkIiwibm9ybWFsaXplSW1hZ2VQcml2YWN5IiwicHJpdmFjeSIsIlN0cmluZyIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImNhblZpZXdJbWFnZSIsImltYWdlIiwidmlld2VyVXNlcklkIiwiYWNjZXNzIiwiaXNPd25lciIsInVzZXJJZCIsImNhblZpZXdGcmllbmRzIiwiY2FuVmlld1ZpcCIsInBhcnNlSW1hZ2VPcHRpb25zIiwib3B0aW9ucyIsImZyb20iLCJ0byIsInR5cGUiLCJsaW1pdCIsImdldEltYWdlT3B0aW9uYWxGaWVsZHMiLCJmaWVsZHMiLCJyZWR1Y2UiLCJzZWxlY3RzIiwiZmllbGQiLCJxdWVyaWVzIiwicHVzaCIsIm9iamVjdHMiLCJnZXRJbWFnZUxpc3RCeVVzZXIiLCJjb250ZXh0IiwiYWN0aW9uIiwiZm9ybWF0VXNlcklkIiwic29ydCIsImRpcmVjdGlvbiIsImN1c3RvbVF1ZXJpZXMiLCJjdXN0b21PYmplY3RzIiwiY2F0Y2giLCJlcnJvciIsImNhdGVnb3J5IiwicGFyYW1zIiwidmFsdWUiLCJEQVRBQkFTRV9FUlJPUiIsImdldEltYWdlQ291bnRCeUl0ZW0iLCJkYXRhYmFzZU5hbWUiLCJpdGVtRG9jSWRzIiwiYXFsUXJ5IiwicXVlcnkiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsImNvdW50IiwiZ2V0SW1hZ2VMaXN0QnlJdGVtIiwic2Vzc2lvbiIsInNlc3Npb25Vc2VySWQiLCJmb3JtYXRJdGVtVHlwZSIsInNlbGVjdE9iamVjdHMiLCJzZWxlY3RRdWVyaWVzIiwiam9pbiIsImxlbmd0aCIsImxpc3QiLCJhbGwiLCJvd25lclVzZXJJZCIsImZpbHRlciIsIm1lZGlhSXRlbUtleSIsIl9tZWRpYUl0ZW1LZXkiLCJtZWRpYUl0ZW1UeXBlIiwiX21lZGlhSXRlbVR5cGUiLCJyZWxhdGlvbnNoaXAiLCJpc0ZyaWVuZCIsImdldEltYWdlTGlzdEJ5R3JvdXAiLCJzZXNzaW9uSWQiLCJmaWx0ZXJzIiwiZ3JvdXBJZCIsImZvcm1hdEdyb3VwSWQiLCJjb25kaXRpb25hbCIsIm5hbWUiLCJmb3JtYXRDb25kIiwiZ3JvdXAiLCJmaWx0ZXJTdHIiLCJncm91cGVkIiwiaXNWYWxpZCIsImZpbHRlckxpc3QiLCJnZXRJbWFnZUxpc3RCeVJlYWN0aW9ucyIsInJlYWN0aW9ucyIsImZvcm1hdFNlc3Npb25JZCIsImZvcm1hdFJlYWN0aW9ucyIsInJlYWN0aW9uTmFtZSIsImZpbHRlckJ5IiwiSlNPTiIsInN0cmluZ2lmeSIsImdldFBlcnNvbmFEb2NJZCIsInBlcnNvbmFJZCIsInBlcnNvbmFEb2NJZCIsInBlcnNvbmFLZXkiLCJnZXRJbWFnZUxpc3RCeVBlcnNvbmFSZWFjdGlvbnMiLCJzZXNzaW9uUGVyc29uYUlkIiwicmVhY3Rpb25OYW1lcyIsIkFycmF5IiwiaXNBcnJheSIsIkJvb2xlYW4iLCJnZXRJbWFnZUJ5SWQiLCJpbWFnZUlkIiwiZm9ybWF0SW1hZ2VJZCIsIm9wZXJhdG9yIiwiZ2V0VXNlckltYWdlUGF0aCIsImltYWdlVHlwZSIsImRpciIsImZpbGVuYW1lIiwiZ2V0QXBwSW1hZ2VVcmwiLCJidWNrZXQiLCJkaXJlY3RvcnkiLCJpc1RodW1iIiwidHlwZUlkIiwiYnVja2V0TmFtZSIsImltYWdlTmFtZSIsImltYWdlVXJsIiwiZ2V0SW1hZ2VVcmwiLCJpbWFnZURpciIsInVybFR5cGUiLCJjb25maWd1cmVkSW1hZ2VVcmwiLCJjb25maWd1cmVkQXBwVXJsIiwicHVibGljQmFzZVVybCIsImRldkJhc2VVcmwiLCJ0aHVtYlN1ZmZpeCIsImltYWdlS2V5IiwiQnVja2V0IiwiRXhwaXJlcyIsIktleSIsInJlc2l6ZUFuZFNhdmVJbWFnZSIsImJ1ZmZlciIsImZpbGVUeXBlIiwiczNPcHRpb25zIiwiaW1nVyIsImltZ1EiLCJzcGxpdCIsInNoYXJwRm9ybWF0IiwiaW1hZ2VPcHRpbWl6ZWRCdWZmZXIiLCJ0aHVtYk9wdGltaXplZEJ1ZmZlciIsImltYWdlSWRlbnRpdHkiLCJmaWxlU2l6ZSIsInJvdGF0ZSIsInJlc2l6ZSIsImZpdCIsImhlaWdodCIsIndpZHRoIiwid2l0aG91dEVubGFyZ2VtZW50IiwidG9Gb3JtYXQiLCJxdWFsaXR5IiwidG9CdWZmZXIiLCJJTUFHRV9TQVZFIiwiaW1hZ2VPYmoiLCJCb2R5IiwiQ29udGVudFR5cGUiLCJpbWFnZU1ldGFkYXRhIiwiaW1hZ2VTdGF0cyIsInNvdXJjZU1ldGFkYXRhIiwiUHJvbWlzZSIsInN0YXRzIiwiYiIsImciLCJyIiwiZG9taW5hbnQiLCJjb2xvciIsInRvU3RyaW5nIiwicGFkU3RhcnQiLCJleGlmTWV0YWRhdGEiLCJvcmllbnRhdGlvbiIsInJlc29sdXRpb24iLCJkZW5zaXR5IiwidGhtVyIsInRobVEiLCJwb3NpdGlvbiIsInRodW1iT2JqIiwiYWRkSW1hZ2UiLCJkZXNjcmlwdGlvbiIsInJlc2l6ZWRJbWFnZSIsImluc2VydCIsIl9rZXkiLCJzYXZlZEltYWdlIiwiYWRkSW1hZ2VFZGdlIiwiSU1BR0VfUkVTSVpFIiwiaW1hZ2VFZGdlIiwibm93IiwiZWRnZUlkIiwiZm9ybWF0SXRlbUlkIiwiaXRlbURvY0lkIiwiZmlsZURvY0lkIiwiZWRnZSIsIl9mcm9tIiwiX3RvIiwiYWRkZWQiLCJzYXZlIiwicmV0dXJuTmV3IiwiZmlsZUVkZ2UiLCJkb2N1bWVudCIsInVwZGF0ZUltYWdlIiwiYmFzZTY0IiwiaW1hZ2VCdWZmZXIiLCJ1cmwiLCJjdXN0b21QYXJhbXMiLCJmb3JtYXRCYXNlNjQiLCJzdWJzdHIiLCJpbmRleE9mIiwiQnVmZmVyIiwidXBkYXRlZEZpbGVUeXBlIiwiZmlsZVR5cGVGcm9tQnVmZmVyIiwibWltZSIsImltZ1BhcmFtcyIsImNvbnRlbnRUeXBlIiwicmVzIiwic3RhdHVzIiwiSU1BR0VfUkVRVUVTVCIsImhlYWRlcnMiLCJ1cGRhdGUiLCJkZWxldGVJbWFnZSIsImNhc2NhZGUiLCJvd25lcnNoaXAiLCJEZWxldGUiLCJPYmplY3RzIiwiUXVpZXQiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUVELFNBQVFBLE9BQU9DLE9BQU8sUUFBTyxvQkFBb0I7QUFDakQsU0FBUUMsUUFBUSxRQUFPLCtCQUErQjtBQUN0RCxTQUFRQyxVQUFVLEVBQUVDLGFBQWEsRUFBRUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDeEcsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBa0JDLE9BQU8sUUFBTyxlQUFlO0FBQy9DLE9BQU9DLGdCQUFnQixjQUFjO0FBQ3JDLE9BQU9DLFdBQVcsUUFBUTtBQUUxQixTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyxXQUFXLEVBQUVDLEtBQUssUUFBTyw4QkFBOEI7QUFDL0QsU0FBUUMsVUFBVSxRQUFPLDBCQUEwQjtBQUNuRCxTQUFRQyxRQUFRLEVBQUVDLFlBQVksUUFBTyw2QkFBNkI7QUFDbEUsU0FBUUMsUUFBUSxF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
@@ -12,6 +12,7 @@ export * from './email.js';
12
12
  export * from './files.js';
13
13
  export * from './flags.js';
14
14
  export * from './groups.js';
15
+ export * from './higgsfield.js';
15
16
  export * from './images.js';
16
17
  export * from './ios.js';
17
18
  export * from './locations.js';
@@ -30,3 +31,7 @@ export * from './subscriptions.js';
30
31
  export * from './tags.js';
31
32
  export * from './users.js';
32
33
  export * from './videos.js';
34
+ export * from './imageGeneration.js';
35
+ export * from './contentGeneration.js';
36
+ export * from './videoGeneration.js';
37
+ export * from './geminiVideo.js';
@@ -11,6 +11,7 @@ export * from './email.js';
11
11
  export * from './files.js';
12
12
  export * from './flags.js';
13
13
  export * from './groups.js';
14
+ export * from './higgsfield.js';
14
15
  export * from './images.js';
15
16
  export * from './ios.js';
16
17
  export * from './locations.js';
@@ -29,5 +30,9 @@ export * from './subscriptions.js';
29
30
  export * from './tags.js';
30
31
  export * from './users.js';
31
32
  export * from './videos.js';
33
+ export * from './imageGeneration.js';
34
+ export * from './contentGeneration.js';
35
+ export * from './videoGeneration.js';
36
+ export * from './geminiVideo.js';
32
37
 
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3JlYWt0b3IvcmVha3Rvci9wYWNrYWdlcy9yZWFrdG9yL3NyYy9hY3Rpb25zL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2FwcHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hbmFseXRpY3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25uZWN0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnNhdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jcm0uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9keW5hbW9kYi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VtYWlsLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZmlsZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9mbGFncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2dyb3Vwcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2lvcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvY2F0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2VzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3BheW1lbnRzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcG9zdHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wZXJzb25hcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlYWN0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3J1bS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3MzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VhcmNoLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc21zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhdGlzdGljcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3N1YnNjcmlwdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90YWdzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdXNlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi92aWRlb3MuanMnO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELGNBQWMsWUFBWTtBQUMxQixjQUFjLGlCQUFpQjtBQUMvQixjQUFjLG1CQUFtQjtBQUNqQyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLFdBQVc7QUFDekIsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUMzQixjQUFjLGFBQWE7QUFDM0IsY0FBYyxjQUFjO0FBQzVCLGNBQWMsY0FBYztBQUM1QixjQUFjLFdBQVc7QUFDekIsY0FBYyxpQkFBaUI7QUFDL0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsZ0JBQWdCO0FBQzlCLGNBQWMsaUJBQWlCO0FBQy9CLGNBQWMsV0FBVztBQUN6QixjQUFjLFVBQVU7QUFDeEIsY0FBYyxjQUFjO0FBQzVCLGNBQWMsV0FBVztBQUN6QixjQUFjLGtCQUFrQjtBQUNoQyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLFlBQVk7QUFDMUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsY0FBYyJ9
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9hcHBzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYW5hbHl0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29ubmVjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb252ZXJzYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY3JtLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZHluYW1vZGIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbWFpbC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZmxhZ3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ncm91cHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9oaWdnc2ZpZWxkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaW1hZ2VzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaW9zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGF5bWVudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wb3N0cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcnVtLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vczMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWFyY2guanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zbXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdGF0aXN0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3Vic2NyaXB0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RhZ3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2Vycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3ZpZGVvcy5qcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vaW1hZ2VHZW5lcmF0aW9uLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbi5qcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vdmlkZW9HZW5lcmF0aW9uLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9nZW1pbmlWaWRlby5qcyc7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsY0FBYyxZQUFZO0FBQzFCLGNBQWMsaUJBQWlCO0FBQy9CLGNBQWMsbUJBQW1CO0FBQ2pDLGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsV0FBVztBQUN6QixjQUFjLGdCQUFnQjtBQUM5QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUMzQixjQUFjLGNBQWM7QUFDNUIsY0FBYyxrQkFBa0I7QUFDaEMsY0FBYyxjQUFjO0FBQzVCLGNBQWMsV0FBVztBQUN6QixjQUFjLGlCQUFpQjtBQUMvQixjQUFjLGdCQUFnQjtBQUM5QixjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLGdCQUFnQjtBQUM5QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxpQkFBaUI7QUFDL0IsY0FBYyxXQUFXO0FBQ3pCLGNBQWMsVUFBVTtBQUN4QixjQUFjLGNBQWM7QUFDNUIsY0FBYyxXQUFXO0FBQ3pCLGNBQWMsa0JBQWtCO0FBQ2hDLGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsWUFBWTtBQUMxQixjQUFjLGFBQWE7QUFDM0IsY0FBYyxjQUFjO0FBRTVCLGNBQWMsdUJBQXVCO0FBRXJDLGNBQWMseUJBQXlCO0FBRXZDLGNBQWMsdUJBQXVCO0FBRXJDLGNBQWMsbUJBQW1CIn0=