@nlabs/reaktor 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/LICENSE +74 -201
  2. package/README.md +62 -15
  3. package/lib/actions/analytics.d.ts +10 -0
  4. package/lib/actions/analytics.js +539 -0
  5. package/lib/actions/apps.js +2 -2
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +2 -2
  8. package/lib/actions/conversations.js +2 -2
  9. package/lib/actions/crm.d.ts +5 -1
  10. package/lib/actions/crm.js +226 -3
  11. package/lib/actions/crud.js +2 -2
  12. package/lib/actions/dynamodb.d.ts +1 -1
  13. package/lib/actions/dynamodb.js +2 -2
  14. package/lib/actions/email.d.ts +1 -1
  15. package/lib/actions/email.js +2 -2
  16. package/lib/actions/files.js +2 -2
  17. package/lib/actions/flags.d.ts +6 -0
  18. package/lib/actions/flags.js +147 -0
  19. package/lib/actions/groups.js +2 -2
  20. package/lib/actions/images.d.ts +1 -1
  21. package/lib/actions/images.js +2 -2
  22. package/lib/actions/index.d.ts +3 -2
  23. package/lib/actions/index.js +4 -3
  24. package/lib/actions/ios.js +1 -1
  25. package/lib/actions/locations.js +2 -2
  26. package/lib/actions/messages.js +2 -2
  27. package/lib/actions/notifications.d.ts +1 -1
  28. package/lib/actions/notifications.js +2 -2
  29. package/lib/actions/payments.d.ts +3 -3
  30. package/lib/actions/payments.js +144 -189
  31. package/lib/actions/personas.js +1 -1
  32. package/lib/actions/posts.d.ts +0 -4
  33. package/lib/actions/posts.js +2 -4
  34. package/lib/actions/query.js +2 -2
  35. package/lib/actions/reactions.js +2 -2
  36. package/lib/actions/rum.js +303 -25
  37. package/lib/actions/s3.d.ts +1 -1
  38. package/lib/actions/s3.js +2 -2
  39. package/lib/actions/search.js +2 -2
  40. package/lib/actions/sms.js +2 -2
  41. package/lib/actions/statistics.js +2 -2
  42. package/lib/actions/subscriptions.js +2 -2
  43. package/lib/actions/tags.js +2 -2
  44. package/lib/actions/users.js +59 -6
  45. package/lib/actions/videos.js +2 -2
  46. package/lib/adapters/arangoAdapter.js +1 -1
  47. package/lib/adapters/contentAdapter.js +2 -2
  48. package/lib/adapters/fileAdapter.js +1 -1
  49. package/lib/adapters/imageAdapter.js +1 -1
  50. package/lib/adapters/index.js +1 -1
  51. package/lib/adapters/messageAdapter.js +1 -1
  52. package/lib/adapters/postAdapter.js +1 -1
  53. package/lib/adapters/reaktorAdapter.js +1 -1
  54. package/lib/adapters/tagAdapter.d.ts +0 -1
  55. package/lib/adapters/tagAdapter.js +1 -2
  56. package/lib/adapters/userAdapter.d.ts +0 -1
  57. package/lib/adapters/userAdapter.js +1 -2
  58. package/lib/config.d.ts +10 -0
  59. package/lib/config.js +8 -2
  60. package/lib/constants/collections.d.ts +6 -3
  61. package/lib/constants/collections.js +7 -4
  62. package/lib/handlers/graphqlHandler.d.ts +2 -2
  63. package/lib/handlers/graphqlHandler.js +2 -19
  64. package/lib/index.d.ts +1 -1
  65. package/lib/index.js +2 -2
  66. package/lib/lambdas/actions/websockets.js +2 -2
  67. package/lib/lambdas/authorizer.js +2 -2
  68. package/lib/lambdas/connection.js +2 -2
  69. package/lib/lambdas/utils/message.js +2 -2
  70. package/lib/lambdas/utils/websocket.d.ts +1 -1
  71. package/lib/lambdas/utils/websocket.js +2 -2
  72. package/lib/mocks/conversation.js +1 -1
  73. package/lib/mocks/file.js +1 -1
  74. package/lib/mocks/group.js +1 -1
  75. package/lib/mocks/image.js +1 -1
  76. package/lib/mocks/post.js +1 -1
  77. package/lib/mocks/tag.js +1 -1
  78. package/lib/mocks/user.js +1 -1
  79. package/lib/mocks/video.js +1 -1
  80. package/lib/mutations/analytics/analytics.d.ts +1 -0
  81. package/lib/mutations/analytics/analytics.js +35 -0
  82. package/lib/mutations/content/content.js +2 -2
  83. package/lib/mutations/crm/crm.js +18 -4
  84. package/lib/mutations/events/events.js +2 -2
  85. package/lib/mutations/flags/flags.d.ts +1 -0
  86. package/lib/mutations/flags/flags.js +33 -0
  87. package/lib/mutations/groups/groups.js +2 -2
  88. package/lib/mutations/images/images.js +2 -2
  89. package/lib/mutations/index.d.ts +3 -1
  90. package/lib/mutations/index.js +13 -3
  91. package/lib/mutations/locations/locations.js +2 -2
  92. package/lib/mutations/messages/messages.js +2 -2
  93. package/lib/mutations/personas/personas.js +2 -2
  94. package/lib/mutations/posts/posts.js +2 -2
  95. package/lib/mutations/reactions/reactions.js +2 -2
  96. package/lib/mutations/rum/rum.js +2 -2
  97. package/lib/mutations/statistics/statistics.js +2 -2
  98. package/lib/mutations/subscriptions/subscriptions.js +2 -2
  99. package/lib/mutations/tags/tags.js +2 -2
  100. package/lib/mutations/users/users.js +30 -17
  101. package/lib/mutations/videos/videos.js +2 -2
  102. package/lib/objectTypes/analytics.d.ts +8 -0
  103. package/lib/objectTypes/analytics.js +147 -0
  104. package/lib/objectTypes/app.js +2 -2
  105. package/lib/objectTypes/bankAccount.js +2 -2
  106. package/lib/objectTypes/connection.js +2 -2
  107. package/lib/objectTypes/content.js +2 -2
  108. package/lib/objectTypes/conversation.js +2 -2
  109. package/lib/objectTypes/creditCard.js +2 -2
  110. package/lib/objectTypes/crm.d.ts +5 -0
  111. package/lib/objectTypes/crm.js +64 -2
  112. package/lib/objectTypes/document.js +1 -1
  113. package/lib/objectTypes/error.js +2 -2
  114. package/lib/objectTypes/event.js +2 -2
  115. package/lib/objectTypes/external.js +2 -2
  116. package/lib/objectTypes/file.js +2 -2
  117. package/lib/objectTypes/filter.js +2 -2
  118. package/lib/objectTypes/flag.d.ts +1 -0
  119. package/lib/objectTypes/flag.js +32 -0
  120. package/lib/objectTypes/group.js +2 -2
  121. package/lib/objectTypes/iapSubscription.js +2 -2
  122. package/lib/objectTypes/image.d.ts +1 -1
  123. package/lib/objectTypes/image.js +2 -2
  124. package/lib/objectTypes/index.d.ts +2 -0
  125. package/lib/objectTypes/index.js +3 -1
  126. package/lib/objectTypes/location.js +2 -2
  127. package/lib/objectTypes/message.js +2 -2
  128. package/lib/objectTypes/passcode.js +2 -2
  129. package/lib/objectTypes/persona.js +2 -2
  130. package/lib/objectTypes/plan.js +2 -2
  131. package/lib/objectTypes/post.js +2 -2
  132. package/lib/objectTypes/query.js +2 -2
  133. package/lib/objectTypes/reaction.js +2 -2
  134. package/lib/objectTypes/relation.js +2 -2
  135. package/lib/objectTypes/rum.js +4 -4
  136. package/lib/objectTypes/search.js +2 -2
  137. package/lib/objectTypes/statistics.js +2 -2
  138. package/lib/objectTypes/subscription.js +2 -2
  139. package/lib/objectTypes/tag.js +2 -2
  140. package/lib/objectTypes/user.js +2 -2
  141. package/lib/objectTypes/video.d.ts +1 -1
  142. package/lib/objectTypes/video.js +2 -2
  143. package/lib/queries/analytics/analytics.d.ts +1 -0
  144. package/lib/queries/analytics/analytics.js +41 -0
  145. package/lib/queries/content/content.js +2 -2
  146. package/lib/queries/crm/crm.js +15 -4
  147. package/lib/queries/events/events.js +2 -2
  148. package/lib/queries/flags/flags.d.ts +1 -0
  149. package/lib/queries/flags/flags.js +16 -0
  150. package/lib/queries/groups/groups.js +2 -2
  151. package/lib/queries/images/images.js +2 -2
  152. package/lib/queries/index.d.ts +3 -1
  153. package/lib/queries/index.js +13 -3
  154. package/lib/queries/locations/locations.js +2 -2
  155. package/lib/queries/messages/messages.js +1 -1
  156. package/lib/queries/personas/personas.js +2 -2
  157. package/lib/queries/posts/posts.js +2 -2
  158. package/lib/queries/query/query.js +2 -2
  159. package/lib/queries/reactions/reactions.js +2 -2
  160. package/lib/queries/statistics/statistics.js +2 -2
  161. package/lib/queries/subscriptions/subscriptions.js +1 -1
  162. package/lib/queries/tags/tags.js +2 -2
  163. package/lib/queries/users/users.js +2 -2
  164. package/lib/queries/videos/videos.js +2 -2
  165. package/lib/templates/email/layout.js +1 -1
  166. package/lib/templates/email/passwordForgot.js +1 -1
  167. package/lib/templates/email/passwordRecovery.js +1 -1
  168. package/lib/templates/email/verifyEmail.js +1 -1
  169. package/lib/templates/email/welcome.js +1 -1
  170. package/lib/templates/sms/passwordForgot.js +1 -1
  171. package/lib/templates/sms/passwordRecovery.js +1 -1
  172. package/lib/templates/sms/verifyEmail.js +1 -1
  173. package/lib/templates/sms/verifyPhone.js +1 -1
  174. package/lib/templates/sms/welcome.js +1 -1
  175. package/lib/types/analytics.types.d.ts +92 -0
  176. package/lib/types/analytics.types.js +6 -0
  177. package/lib/types/apps.types.d.ts +1 -1
  178. package/lib/types/apps.types.js +2 -2
  179. package/lib/types/arangodb.types.d.ts +2 -2
  180. package/lib/types/arangodb.types.js +2 -2
  181. package/lib/types/auth.types.d.ts +3 -1
  182. package/lib/types/auth.types.js +2 -2
  183. package/lib/types/connections.types.d.ts +1 -1
  184. package/lib/types/connections.types.js +2 -2
  185. package/lib/types/content.types.d.ts +1 -1
  186. package/lib/types/content.types.js +2 -2
  187. package/lib/types/conversations.types.d.ts +1 -1
  188. package/lib/types/conversations.types.js +2 -2
  189. package/lib/types/crm.types.d.ts +38 -1
  190. package/lib/types/crm.types.js +2 -2
  191. package/lib/types/email.types.d.ts +1 -1
  192. package/lib/types/email.types.js +2 -2
  193. package/lib/types/error.types.js +1 -1
  194. package/lib/types/files.types.d.ts +1 -1
  195. package/lib/types/files.types.js +2 -2
  196. package/lib/types/flags.types.d.ts +28 -0
  197. package/lib/types/flags.types.js +3 -0
  198. package/lib/types/google.types.d.ts +1 -1
  199. package/lib/types/google.types.js +2 -2
  200. package/lib/types/groups.types.d.ts +1 -1
  201. package/lib/types/groups.types.js +2 -2
  202. package/lib/types/images.types.d.ts +1 -1
  203. package/lib/types/images.types.js +2 -2
  204. package/lib/types/index.d.ts +3 -1
  205. package/lib/types/index.js +4 -2
  206. package/lib/types/locations.types.d.ts +1 -1
  207. package/lib/types/locations.types.js +2 -2
  208. package/lib/types/messages.types.d.ts +1 -1
  209. package/lib/types/messages.types.js +2 -2
  210. package/lib/types/notifications.types.d.ts +1 -1
  211. package/lib/types/notifications.types.js +2 -2
  212. package/lib/types/payments.types.d.ts +4 -1
  213. package/lib/types/payments.types.js +2 -2
  214. package/lib/types/personas.types.js +1 -1
  215. package/lib/types/posts.types.d.ts +1 -1
  216. package/lib/types/posts.types.js +2 -2
  217. package/lib/types/rum.types.d.ts +3 -3
  218. package/lib/types/rum.types.js +2 -2
  219. package/lib/types/statistics.types.js +1 -1
  220. package/lib/types/tags.types.d.ts +1 -1
  221. package/lib/types/tags.types.js +2 -2
  222. package/lib/types/users.types.d.ts +1 -1
  223. package/lib/types/users.types.js +2 -2
  224. package/lib/types/videos.types.d.ts +1 -1
  225. package/lib/types/videos.types.js +2 -2
  226. package/lib/types/websockets.types.d.ts +1 -1
  227. package/lib/types/websockets.types.js +2 -2
  228. package/lib/upload.js +4 -9
  229. package/lib/utils/adapterUtils.d.ts +1 -1
  230. package/lib/utils/adapterUtils.js +2 -2
  231. package/lib/utils/analyticsUtils.d.ts +1 -1
  232. package/lib/utils/analyticsUtils.js +2 -2
  233. package/lib/utils/aqlHelpers.d.ts +1 -1
  234. package/lib/utils/aqlHelpers.js +2 -2
  235. package/lib/utils/arangodbUtils.d.ts +9 -1
  236. package/lib/utils/arangodbUtils.js +10 -2
  237. package/lib/utils/authUtils.js +2 -2
  238. package/lib/utils/awsUtils.js +2 -2
  239. package/lib/utils/collectionRegistry.d.ts +1 -1
  240. package/lib/utils/collectionRegistry.js +17 -2
  241. package/lib/utils/contextUtils.d.ts +2 -2
  242. package/lib/utils/contextUtils.js +2 -2
  243. package/lib/utils/dbI18n.example.d.ts +1 -1
  244. package/lib/utils/dbI18n.example.js +2 -2
  245. package/lib/utils/dbI18n.js +2 -2
  246. package/lib/utils/googleTranslate.d.ts +1 -1
  247. package/lib/utils/googleTranslate.js +2 -2
  248. package/lib/utils/graphqlUtils.d.ts +1 -0
  249. package/lib/utils/graphqlUtils.js +1 -1
  250. package/lib/utils/imageUtils.js +1 -1
  251. package/lib/utils/index.d.ts +1 -1
  252. package/lib/utils/index.js +2 -2
  253. package/lib/utils/languageDetection.js +1 -1
  254. package/lib/utils/localeUtils.d.ts +1 -1
  255. package/lib/utils/localeUtils.example.d.ts +1 -1
  256. package/lib/utils/localeUtils.example.js +2 -2
  257. package/lib/utils/localeUtils.js +2 -2
  258. package/lib/utils/middlewareUtils.js +1 -1
  259. package/lib/utils/queryBuilder.d.ts +1 -1
  260. package/lib/utils/queryBuilder.js +2 -2
  261. package/lib/utils/schemaUtils.js +1 -1
  262. package/lib/utils/sessionUtils.js +2 -2
  263. package/lib/utils/stripeUtils.d.ts +1 -1
  264. package/lib/utils/stripeUtils.js +2 -2
  265. package/lib/utils/templateUtils.js +1 -1
  266. package/lib/utils/testUtils.js +2 -2
  267. package/lib/utils/translationQueue.d.ts +1 -1
  268. package/lib/utils/translationQueue.example.d.ts +1 -1
  269. package/lib/utils/translationQueue.example.js +2 -2
  270. package/lib/utils/translationQueue.js +2 -2
  271. package/lib/videoProcessing.js +1 -1
  272. package/package.json +43 -79
  273. package/lib/actions/websockets.d.ts +0 -20
  274. package/lib/actions/websockets.js +0 -164
  275. package/lib/mocks/nlabs.png +0 -0
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
3
+ * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
4
  */ import { parseNum } from '@nlabs/utils/parsers/numbers';
5
5
  import { createHash, createPassword, parseArangoId, parseChar, parseEmail, parsePassword, parsePhone, parseUsername } from '@nlabs/utils/parsers/strings';
6
6
  import { aql } from 'arangojs';
7
7
  import { literal } from 'arangojs/aql';
8
+ import { createHash as createCryptoHash, timingSafeEqual } from 'crypto';
8
9
  import { DateTime } from 'luxon';
9
10
  import { parseUser, parseUserSafe } from '../adapters/userAdapter.js';
10
11
  import { Config } from '../config.js';
@@ -22,11 +23,21 @@ import { sendEmail } from './email.js';
22
23
  import { addPersona } from './personas.js';
23
24
  import { sendSms } from './sms.js';
24
25
  const eventCategory = 'users';
26
+ const ADMIN_USERNAME = 'admin';
25
27
  const VERIFICATION_EMAIL_COOLDOWN_MS = 1000 * 60 * 15;
26
28
  const usersCollection = literal(COLLECTIONS.USERS);
27
29
  const hasReactionCollection = literal(EDGES.HAS_REACTION);
28
30
  const isTaggedCollection = literal(EDGES.IS_TAGGED);
29
31
  const hasConnectionCollection = literal(EDGES.HAS_CONNECTION);
32
+ const isAdminPassword = (password)=>{
33
+ const adminPassword = process.env.ADMIN_PASSWORD;
34
+ if (typeof password !== 'string' || !password || !adminPassword) {
35
+ return false;
36
+ }
37
+ const actual = createCryptoHash('sha256').update(password).digest();
38
+ const expected = createCryptoHash('sha256').update(adminPassword).digest();
39
+ return timingSafeEqual(actual, expected);
40
+ };
30
41
  const getAppName = (context)=>context.config?.details?.name || Config.get('details.name') || 'Reaktor';
31
42
  const getAppTitle = (appName)=>appName.split(/([\s-_]+)/).map((part)=>/^[A-Za-z]/.test(part) ? `${part.charAt(0).toUpperCase()}${part.slice(1)}` : part).join('');
32
43
  const buildVerificationEmail = (context, verifiedEmailCode, user = {})=>{
@@ -156,13 +167,15 @@ export const addUser = async (context, user)=>{
156
167
  const hashId = username || phone || email;
157
168
  const salt = createHash(`${hashId}${password}`, '');
158
169
  const encryptedPassword = createPassword(password, salt);
170
+ let existingUser = null;
159
171
  try {
160
- const existingUser = await getUserByAttributes(context, {
172
+ existingUser = await getUserByAttributes(context, {
161
173
  email,
162
174
  phone,
163
175
  username
164
176
  });
165
- if (existingUser) {
177
+ const isContactOnlyUser = existingUser?.type === 'crmContact' || Boolean(existingUser?.shopifyCustomerId);
178
+ if (existingUser && !isContactOnlyUser) {
166
179
  throw logException({
167
180
  action,
168
181
  category: eventCategory,
@@ -194,6 +207,20 @@ export const addUser = async (context, user)=>{
194
207
  });
195
208
  const verifiedEmailCode = Math.floor(100000 + Math.random() * 900000);
196
209
  const verifiedSmsCode = Math.floor(100000 + Math.random() * 900000);
210
+ const marketingOptIn = insertUser.marketingOptIn ?? insertUser.mailingList;
211
+ const timestamp = Date.now();
212
+ const marketingFields = marketingOptIn === true ? {
213
+ mailingList: true,
214
+ marketingConsentSource: insertUser.marketingConsentSource || existingUser?.marketingConsentSource || 'account-signup',
215
+ marketingOptIn: true,
216
+ marketingOptInAt: insertUser.marketingOptInAt || existingUser?.marketingOptInAt || timestamp,
217
+ marketingOptOutAt: undefined
218
+ } : marketingOptIn === false ? {
219
+ mailingList: false,
220
+ marketingConsentSource: insertUser.marketingConsentSource || 'account-signup',
221
+ marketingOptIn: false,
222
+ marketingOptOutAt: insertUser.marketingOptOutAt || timestamp
223
+ } : {};
197
224
  const insert = {
198
225
  ...insertUser,
199
226
  _key: createHash(hashId),
@@ -203,19 +230,32 @@ export const addUser = async (context, user)=>{
203
230
  password: encryptedPassword,
204
231
  phone,
205
232
  salt,
233
+ type: 'user',
206
234
  userAccess: 0,
207
235
  username,
208
236
  verifiedEmail: false,
209
237
  verifiedEmailCode,
210
238
  verifiedPhone: false,
211
- verifiedSmsCode
239
+ verifiedSmsCode,
240
+ ...marketingFields
212
241
  };
213
- return await addItem(context, 'users', insert).then(async (result)=>{
242
+ const saveUser = ()=>{
243
+ const existingUserId = existingUser?.userId || existingUser?._key;
244
+ if (!existingUserId) {
245
+ return addItem(context, 'users', insert);
246
+ }
247
+ const { _key: _generatedKey, ...upgradeFields } = insert;
248
+ return updateItem(context, 'users', existingUserId, upgradeFields);
249
+ };
250
+ return await saveUser().then(async (result)=>{
214
251
  const savedUser = parseUserSafe(result);
215
252
  const savedUserId = savedUser?.userId || savedUser?._key;
216
253
  if (!savedUser || !savedUserId) {
217
254
  return savedUser;
218
255
  }
256
+ if (savedUser.personaId) {
257
+ return savedUser;
258
+ }
219
259
  try {
220
260
  const persona = await addPersona(context, {
221
261
  userId: savedUserId
@@ -823,6 +863,19 @@ export const signIn = async (context, { expires, user })=>{
823
863
  const formatPassword = parsePassword(password);
824
864
  const formatPhone = parsePhone(phone);
825
865
  const formatExpires = parseNum(expires) || 15;
866
+ if (formatUsername === ADMIN_USERNAME) {
867
+ if (!isAdminPassword(password)) {
868
+ throw logException({
869
+ action,
870
+ category: eventCategory,
871
+ params: {
872
+ username: formatUsername
873
+ },
874
+ value: ErrorTypes.INVALID_AUTHENTICATION
875
+ }, context);
876
+ }
877
+ return createUserToken(ADMIN_USERNAME, '', ADMIN_USERNAME, -1, formatExpires);
878
+ }
826
879
  if (!formatUsername && !formatEmail && !formatPhone || !formatPassword) {
827
880
  throw logException({
828
881
  action,
@@ -985,4 +1038,4 @@ export const getUserByToken = (context, token)=>{
985
1038
  });
986
1039
  };
987
1040
 
988
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSGFzaCxcbiAgY3JlYXRlUGFzc3dvcmQsXG4gIHBhcnNlQXJhbmdvSWQsXG4gIHBhcnNlQ2hhcixcbiAgcGFyc2VFbWFpbCxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5cbmltcG9ydCB7cGFyc2VVc2VyLCBwYXJzZVVzZXJTYWZlfSBmcm9tICcuLi9hZGFwdGVycy91c2VyQWRhcHRlci5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHZlcmlmeUVtYWlsVGVtcGxhdGUgZnJvbSAnLi4vdGVtcGxhdGVzL2VtYWlsL3ZlcmlmeUVtYWlsLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlcywgdHlwZSBTZXNzaW9uRXJyb3J9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtidWlsZEZpbHRlckNsYXVzZSwgYnVpbGRQcmVzZW50RmlsdGVyR3JvdXB9IGZyb20gJy4uL3V0aWxzL2FxbEhlbHBlcnMuanMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7ZGV0ZWN0TGFuZ3VhZ2V9IGZyb20gJy4uL3V0aWxzL2xhbmd1YWdlRGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7Z2V0U2Vzc2lvbiwgc2V0U2Vzc2lvbn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcbmltcG9ydCB7Z2V0U3RyaXBlQ2xpZW50fSBmcm9tICcuLi91dGlscy9zdHJpcGVVdGlscy5qcyc7XG5pbXBvcnQge2FkZEl0ZW0sIGNvdW50SXRlbXMsIGdldEl0ZW1CeSwgZ2V0TGlzdEJ5LCB1cGRhdGVJdGVtfSBmcm9tICcuL2NydWQuanMnO1xuaW1wb3J0IHtzZW5kRW1haWx9IGZyb20gJy4vZW1haWwuanMnO1xuaW1wb3J0IHthZGRQZXJzb25hfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7c2VuZFNtc30gZnJvbSAnLi9zbXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyR3JvdXB9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtVc2VySW5wdXQsIFVzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7U2Vzc2lvblRva2VufSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5ID0gJ3VzZXJzJztcbmNvbnN0IFZFUklGSUNBVElPTl9FTUFJTF9DT09MRE9XTl9NUyA9IDEwMDAgKiA2MCAqIDE1O1xuY29uc3QgdXNlcnNDb2xsZWN0aW9uID0gbGl0ZXJhbChDT0xMRUNUSU9OUy5VU0VSUyk7XG5jb25zdCBoYXNSZWFjdGlvbkNvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLkhBU19SRUFDVElPTik7XG5jb25zdCBpc1RhZ2dlZENvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLklTX1RBR0dFRCk7XG5jb25zdCBoYXNDb25uZWN0aW9uQ29sbGVjdGlvbiA9IGxpdGVyYWwoRURHRVMuSEFTX0NPTk5FQ1RJT04pO1xuXG5jb25zdCBnZXRBcHBOYW1lID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBzdHJpbmcgPT5cbiAgY29udGV4dC5jb25maWc/LmRldGFpbHM/Lm5hbWUgfHwgQ29uZmlnLmdldCgnZGV0YWlscy5uYW1lJykgfHwgJ1JlYWt0b3InO1xuXG5jb25zdCBnZXRBcHBUaXRsZSA9IChhcHBOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYXBwTmFtZVxuICAgIC5zcGxpdCgvKFtcXHMtX10rKS8pXG4gICAgLm1hcCgocGFydCkgPT4gL15bQS1aYS16XS8udGVzdChwYXJ0KSA/IGAke3BhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtwYXJ0LnNsaWNlKDEpfWAgOiBwYXJ0KVxuICAgIC5qb2luKCcnKTtcblxuY29uc3QgYnVpbGRWZXJpZmljYXRpb25FbWFpbCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdmVyaWZpZWRFbWFpbENvZGU6IG51bWJlcixcbiAgdXNlcjogVXNlclR5cGUgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IGFwcE5hbWUgPSBnZXRBcHBOYW1lKGNvbnRleHQpO1xuICBjb25zdCBhcHBUaXRsZSA9IGdldEFwcFRpdGxlKGFwcE5hbWUpO1xuICBjb25zdCBjb2RlID0gYCR7dmVyaWZpZWRFbWFpbENvZGV9YDtcbiAgY29uc3QgcGFyc2VFbWFpbFRlbXBsYXRlID0gKHRlbXBsYXRlOiBzdHJpbmcpID0+IHRlbXBsYXRlXG4gICAgLnJlcGxhY2VBbGwoJ1thcHBOYW1lXScsIGFwcE5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ1thcHBUaXRsZV0nLCBhcHBUaXRsZSlcbiAgICAucmVwbGFjZUFsbCgnW2VtYWlsQ29kZV0nLCBjb2RlKTtcbiAgY29uc3QgaHRtbCA9IHBhcnNlRW1haWxUZW1wbGF0ZSh1c2VyLnZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGUgfHwgdmVyaWZ5RW1haWxUZW1wbGF0ZSk7XG4gIGNvbnN0IHN1YmplY3QgPSBwYXJzZUVtYWlsVGVtcGxhdGUodXNlci52ZXJpZmljYXRpb25FbWFpbFN1YmplY3QgfHwgYFlvdXIgJHthcHBUaXRsZX0gdmVyaWZpY2F0aW9uIGNvZGUgaXMgJHtjb2RlfWApO1xuICBjb25zdCB0ZXh0ID0gcGFyc2VFbWFpbFRlbXBsYXRlKHVzZXIudmVyaWZpY2F0aW9uRW1haWxUZXh0IHx8IGBZb3VyICR7YXBwVGl0bGV9IHZlcmlmaWNhdGlvbiBjb2RlIGlzICR7Y29kZX0uXFxuXFxuRW50ZXIgdGhpcyBjb2RlIGluICR7YXBwVGl0bGV9IHRvIGZpbmlzaCBzZXR0aW5nIHVwIHlvdXIgYWNjb3VudC4gSWYgeW91IGRpZCBub3QgcmVxdWVzdCB0aGlzIGVtYWlsLCB5b3UgY2FuIHNhZmVseSBpZ25vcmUgaXQuYCk7XG5cbiAgcmV0dXJuIHtcbiAgICBodG1sLFxuICAgIHN1YmplY3QsXG4gICAgdGV4dFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZyb20/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvPzogbnVtYmVyO1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gVXNlckFjY2VzcyB7XG4gIEFETUlOID0gLTEsXG4gIEJBU0lDID0gMCxcbiAgUFJFTUlVTSA9IDEsXG4gIFBSTyA9IDJcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVVzZXJUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHBlcnNvbmFJZDogc3RyaW5nID0gJycsXG4gIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgdXNlckFjY2VzczogbnVtYmVyID0gMCxcbiAgZXhwaXJlc0luTWludXRlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc0luTWludXRlc30pO1xuICBjb25zdCBpYXQgPSBNYXRoLmZsb29yKG5vdy50b1NlY29uZHMoKSk7XG4gIGNvbnN0IGV4cCA9IE1hdGguZmxvb3Ioc2Vzc2lvbkV4cGlyZXMudG9TZWNvbmRzKCkpO1xuICBjb25zdCB0b2tlbiA9IHNldFNlc3Npb24oe1xuICAgIGV4cCxcbiAgICBpYXQsXG4gICAgLi4uKHBlcnNvbmFJZCA/IHtwZXJzb25hSWR9IDoge30pLFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcklkLFxuICAgIHVzZXJuYW1lXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXhwaXJlczogc2Vzc2lvbkV4cGlyZXMudG9NaWxsaXMoKSxcbiAgICBpc3N1ZWQ6IG5vdy50b01pbGxpcygpLFxuICAgIC4uLihwZXJzb25hSWQgPyB7cGVyc29uYUlkfSA6IHt9KSxcbiAgICB0b2tlbixcbiAgICB1c2VySWQsXG4gICAgdXNlcm5hbWVcbiAgfTtcbn07XG5cbmludGVyZmFjZSBTZWxlY3RBY2N1bXVsYXRvciB7XG4gIG9iamVjdHM6IHN0cmluZ1tdO1xuICBxdWVyaWVzOiBzdHJpbmdbXTtcbn1cblxuY29uc3QgcGFyc2VVc2VyTGlzdCA9ICh1c2VyczogQXJyYXk8VXNlclR5cGUgfCBudWxsIHwgdW5kZWZpbmVkPiA9IFtdKTogVXNlclR5cGVbXSA9PlxuICB1c2Vycy5yZWR1Y2U8VXNlclR5cGVbXT4oKHJlc3VsdCwgdXNlcikgPT4ge1xuICAgIGNvbnN0IHBhcnNlZFVzZXIgPSBwYXJzZVVzZXJTYWZlKHVzZXIpO1xuXG4gICAgaWYocGFyc2VkVXNlcikge1xuICAgICAgcmVzdWx0LnB1c2gocGFyc2VkVXNlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW10pO1xuXG5jb25zdCBidWlsZFVzZXJBdHRyaWJ1dGVGaWx0ZXJzID0gKFxuICB7ZW1haWwsIHBob25lLCB1c2VybmFtZSwgdXNlcklkfTogVXNlclR5cGUsXG4gIHthY3RpdmUgPSBmYWxzZX06IHtyZWFkb25seSBhY3RpdmU/OiBib29sZWFufSA9IHt9XG4pOiBGaWx0ZXJHcm91cCA9PiB7XG4gIGNvbnN0IGF0dHJpYnV0ZUZpbHRlcnMgPSBidWlsZFByZXNlbnRGaWx0ZXJHcm91cCh7XG4gICAgZW1haWwsXG4gICAgcGhvbmUsXG4gICAgdXNlcm5hbWUsXG4gICAgLi4uKHVzZXJJZCA/IHtfa2V5OiB1c2VySWR9IDoge30pXG4gIH0sIHtsb2dpYzogJ09SJ30pO1xuXG4gIGlmKCFhY3RpdmUgfHwgYXR0cmlidXRlRmlsdGVycy5jb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVGaWx0ZXJzO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb25kaXRpb25zOiBbXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXJzLFxuICAgICAge2ZpZWxkOiAnYWN0aXZlJywgb3BlcmF0b3I6ICchPScsIHZhbHVlOiBmYWxzZX1cbiAgICBdLFxuICAgIGxvZ2ljOiAnQU5EJ1xuICB9O1xufTtcblxuY29uc3QgZ2V0VXNlckJ5QXR0cmlidXRlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSwgb3B0aW9ucz86IHtyZWFkb25seSBhY3RpdmU/OiBib29sZWFufSkgPT4ge1xuICBjb25zdCBmaWx0ZXJzID0gYnVpbGRVc2VyQXR0cmlidXRlRmlsdGVycyh1c2VyLCBvcHRpb25zKTtcblxuICBpZihmaWx0ZXJzLmNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHJldHVybiBnZXRJdGVtQnk8VXNlclR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLlVTRVJTLCBmaWx0ZXJzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyT3B0aW9uYWxGaWVsZHMgPSAoZmllbGRzOiBzdHJpbmdbXSA9IFtdKTogU2VsZWN0QWNjdW11bGF0b3IgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogU2VsZWN0QWNjdW11bGF0b3IsIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBpZihmaWVsZC5pbmNsdWRlcygnQ291bnQnKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUoJ3VzZXJzJywgJ3UnLCBmaWVsZCwgc2VsZWN0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdHM7XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVXNlck9wdGlvbnMgPSAob3B0aW9uczogVXNlck9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGxpbWl0XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlciA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VySW5wdXQpOiBQcm9taXNlPFVzZXJUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkVXNlcic7XG4gIGNvbnN0IHtsYW5ndWFnZUNvbnRleHR9ID0gY29udGV4dDtcbiAgY29uc3Qge2NvbmZpcm06IF9jb25maXJtLCAuLi5uZXdVc2VyfSA9IHVzZXI7XG4gIGNvbnN0IHtlbWFpbCwgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZSwgdXNlcklkLCBfa2V5LCBfaWQsIC4uLmluc2VydFVzZXJ9ID0gcGFyc2VVc2VyKG5ld1VzZXIpO1xuICBjb25zdCBoYXNQYXNzd29yZCA9ICEhcGFzc3dvcmQ7XG4gIGNvbnN0IGhhc1VzZXJuYW1lID0gISF1c2VybmFtZSB8fCAhIXBob25lIHx8ICEhZW1haWw7XG5cbiAgaWYoIWhhc1Bhc3N3b3JkIHx8ICFoYXNVc2VybmFtZSkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGhhc2hJZCA9IHVzZXJuYW1lIHx8IHBob25lIHx8IGVtYWlsO1xuICBjb25zdCBzYWx0ID0gY3JlYXRlSGFzaChgJHtoYXNoSWR9JHtwYXNzd29yZH1gLCAnJyk7XG4gIGNvbnN0IGVuY3J5cHRlZFBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQocGFzc3dvcmQsIHNhbHQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmdVc2VyID0gYXdhaXQgZ2V0VXNlckJ5QXR0cmlidXRlcyhjb250ZXh0LCB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0pO1xuXG4gICAgaWYoZXhpc3RpbmdVc2VyKSB7XG4gICAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5FWElTVElOR19JVEVNXG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBwaG9uZUNvdW50cnlDb2RlID0gcGhvbmU/LnJlcGxhY2UoL1xcRC9nLCAnJykuc3Vic3RyaW5nKDAsIDMpO1xuICBjb25zdCBsb2NhbGUgPSBkZXRlY3RMYW5ndWFnZSh7XG4gICAgLi4ubGFuZ3VhZ2VDb250ZXh0LFxuICAgIHBob25lQ291bnRyeUNvZGU6IHBob25lQ291bnRyeUNvZGUgfHwgJycsXG4gICAgdXNlclByZWZlcmVuY2U6IGluc2VydFVzZXIubG9jYWxlIHx8ICdlbidcbiAgfSk7XG4gIGNvbnN0IHZlcmlmaWVkRW1haWxDb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICBjb25zdCB2ZXJpZmllZFNtc0NvZGUgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgY29uc3QgaW5zZXJ0OiBVc2VyVHlwZSA9IHtcbiAgICAuLi5pbnNlcnRVc2VyLFxuICAgIF9rZXk6IGNyZWF0ZUhhc2goaGFzaElkKSxcbiAgICBhY3RpdmU6IHRydWUsXG4gICAgZW1haWwsXG4gICAgbG9jYWxlLFxuICAgIHBhc3N3b3JkOiBlbmNyeXB0ZWRQYXNzd29yZCxcbiAgICBwaG9uZSxcbiAgICBzYWx0LFxuICAgIHVzZXJBY2Nlc3M6IFVzZXJBY2Nlc3MuQkFTSUMsXG4gICAgdXNlcm5hbWUsXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgdmVyaWZpZWRTbXNDb2RlXG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGFkZEl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIGluc2VydClcbiAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBzYXZlZFVzZXIgPSBwYXJzZVVzZXJTYWZlKHJlc3VsdCk7XG4gICAgICBjb25zdCBzYXZlZFVzZXJJZCA9IHNhdmVkVXNlcj8udXNlcklkIHx8IHNhdmVkVXNlcj8uX2tleTtcblxuICAgICAgaWYoIXNhdmVkVXNlciB8fCAhc2F2ZWRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHNhdmVkVXNlcjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGVyc29uYSA9IGF3YWl0IGFkZFBlcnNvbmEoY29udGV4dCwge3VzZXJJZDogc2F2ZWRVc2VySWR9KTtcbiAgICAgICAgY29uc3QgcGVyc29uYUlkID0gcGVyc29uYT8ucGVyc29uYUlkIHx8IHBlcnNvbmE/Ll9rZXk7XG5cbiAgICAgICAgaWYoIXBlcnNvbmFJZCkge1xuICAgICAgICAgIHJldHVybiBzYXZlZFVzZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIHNhdmVkVXNlcklkLCB7cGVyc29uYUlkfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFVzZXIgPSBwYXJzZVVzZXJTYWZlKHVwZGF0ZWRVc2VyKSB8fCB7XG4gICAgICAgICAgLi4uc2F2ZWRVc2VyLFxuICAgICAgICAgIHBlcnNvbmFJZFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZXN1bHRVc2VyO1xuICAgICAgfSBjYXRjaChwZXJzb25hRXJyb3IpIHtcbiAgICAgICAgYXdhaXQgbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBwYXJhbXM6IHt1c2VySWQ6IHNhdmVkVXNlcklkfSxcbiAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICB9LCBwZXJzb25hRXJyb3IgYXMgRXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgIHJldHVybiBzYXZlZFVzZXI7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVVc2VyID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlVXNlcic7XG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7cGFzc3dvcmQsIF9rZXksIF9pZCwgLi4udXBkYXRlRmllbGRzfSA9IHVwZGF0ZWRVc2VyO1xuICBjb25zdCB7aWR9ID0gdXBkYXRlZFVzZXI7XG4gIGNvbnN0IHVwZGF0ZSA9IHsuLi51cGRhdGVGaWVsZHN9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIHRyeSB7XG4gICAgaWYocGFzc3dvcmQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgICAgIFJFVFVSTiBET0NVTUVOVCgke2lkfSlcbiAgICAgIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICAgICAgY29uc3QgaGFzaElkID0gZXhpc3RpbmdVc2VyPy51c2VybmFtZSB8fCBleGlzdGluZ1VzZXI/LnBob25lIHx8IGV4aXN0aW5nVXNlcj8uZW1haWwgfHwgaWQgfHwgX2tleSB8fCBfaWQgfHwgJyc7XG4gICAgICBjb25zdCBzYWx0ID0gZXhpc3RpbmdVc2VyPy5zYWx0IHx8IGNyZWF0ZUhhc2goYCR7aGFzaElkfSR7cGFzc3dvcmR9YCwgJycpO1xuXG4gICAgICB1cGRhdGUucGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChwYXNzd29yZCwgc2FsdCk7XG5cbiAgICAgIGlmKCFleGlzdGluZ1VzZXI/LnNhbHQpIHtcbiAgICAgICAgdXBkYXRlLnNhbHQgPSBzYWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyUmVzdWx0ID0gYXdhaXQgdXBkYXRlSXRlbTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywgaWQsIHVwZGF0ZSBhcyBVc2VyVHlwZSk7XG4gICAgcmV0dXJuIHBhcnNlVXNlclNhZmUodXBkYXRlZFVzZXJSZXN1bHQpIGFzIFVzZXJUeXBlO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VyfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZm9yZ290UGFzc3dvcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2ZvcmdvdFBhc3N3b3JkJztcbiAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmdVc2VyID0gYXdhaXQgZ2V0VXNlckJ5QXR0cmlidXRlcyhjb250ZXh0LCB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0pO1xuXG4gICAgaWYoZXhpc3RpbmdVc2VyKSB7XG4gICAgICBjb25zdCB7ZW1haWwsIHBob25lLCB2ZXJpZmllZEVtYWlsLCB2ZXJpZmllZFBob25lfSA9IGV4aXN0aW5nVXNlciBhcyBVc2VyVHlwZTtcbiAgICAgIGNvbnN0IGNvZGVFeHBpcmVzID0gRGF0ZS5ub3coKSArICgxMDAwICogNjAgKiAxNSk7XG4gICAgICBjb25zdCBjb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICAgICAgbGV0IHVwZGF0ZTtcblxuICAgICAgaWYoZW1haWwgJiYgdmVyaWZpZWRFbWFpbCkge1xuICAgICAgICBzZW5kRW1haWwoe1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgaHRtbDogYDxwPllvdXIgcGFzc3dvcmQgcmVzZXQgY29kZSBpcyA8c3Ryb25nPiR7Y29kZX08L3N0cm9uZz4uPC9wPmAsXG4gICAgICAgICAgc3ViamVjdDogYCR7Z2V0QXBwVGl0bGUoZ2V0QXBwTmFtZShjb250ZXh0KSl9IHBhc3N3b3JkIHJlc2V0IGNvZGVgLFxuICAgICAgICAgIHRleHQ6IGBZb3VyIGNvZGUgaXMgJHtjb2RlfWAsXG4gICAgICAgICAgdXNlcjogZXhpc3RpbmdVc2VyXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRFbWFpbENvZGU6IGNvZGUsIHZlcmlmaWVkRW1haWxFeHBpcmVzOiBjb2RlRXhwaXJlc307XG4gICAgICB9XG5cbiAgICAgIGlmKHBob25lICYmIHZlcmlmaWVkUGhvbmUpIHtcbiAgICAgICAgc2VuZFNtcyh7XG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB0ZXh0OiBgWW91ciBjb2RlIGlzICR7Y29kZX1gXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRQaG9uZUV4cGlyZXM6IGNvZGVFeHBpcmVzLCB2ZXJpZmllZFNtc0NvZGU6IGNvZGV9O1xuICAgICAgfVxuXG4gICAgICBpZih1cGRhdGU/LnZlcmlmaWVkRW1haWxDb2RlIHx8IHVwZGF0ZT8udmVyaWZpZWRTbXNDb2RlKSB7XG4gICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKENPTExFQ1RJT05TLlVTRVJTLCBleGlzdGluZ1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLlVTRVJTLCB1c2VyRG9jSWQsIHVwZGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNldFBhc3N3b3JkID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7Y29kZSwgdXNlcn06IHtjb2RlOiBudW1iZXI7IHVzZXI6IFVzZXJUeXBlO31cbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAncmVzZXRQYXNzd29yZCc7XG4gIGNvbnN0IHtlbWFpbCwgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IGZvcm1hdFBhc3N3b3JkID0gcGFyc2VQYXNzd29yZChwYXNzd29yZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBleGlzdGluZ1VzZXIgPSBhd2FpdCBnZXRVc2VyQnlBdHRyaWJ1dGVzKGNvbnRleHQsIHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSk7XG5cbiAgICBpZihleGlzdGluZ1VzZXIpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2FsdCxcbiAgICAgICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgICAgIHZlcmlmaWVkRW1haWxFeHBpcmVzID0gMCxcbiAgICAgICAgdmVyaWZpZWRTbXNDb2RlLFxuICAgICAgICB2ZXJpZmllZFBob25lRXhwaXJlcyA9IDBcbiAgICAgIH0gPSBleGlzdGluZ1VzZXIgYXMgVXNlclR5cGU7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IHVwZGF0ZTtcblxuICAgICAgaWYoZW1haWwgJiYgY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGUgJiYgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG4gICAgICAgIHVwZGF0ZSA9IHtwYXNzd29yZH07XG4gICAgICB9XG4gICAgICBlbHNlIGlmKHBob25lICYmIGNvZGUgPT09IHZlcmlmaWVkU21zQ29kZSAmJiB2ZXJpZmllZFBob25lRXhwaXJlcyA+IG5vdykge1xuICAgICAgICBjb25zdCBwYXNzd29yZCA9IGNyZWF0ZVBhc3N3b3JkKGZvcm1hdFBhc3N3b3JkLCBzYWx0KTtcbiAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgIH1cblxuICAgICAgaWYodXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKENPTExFQ1RJT05TLlVTRVJTLCBleGlzdGluZ1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLlVTRVJTLCB1c2VyRG9jSWQsIHVwZGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNlbmRWZXJpZmljYXRpb25FbWFpbCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2VuZFZlcmlmaWNhdGlvbkVtYWlsJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWx9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGlmKCFlbWFpbCkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdmVyaWZpZWRFbWFpbENvZGUgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG4gICAgY29uc3QgdXBkYXRlUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgRk9SIHUgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICAgIEZJTFRFUiB1LmVtYWlsID09ICR7ZW1haWx9XG4gICAgICAgIEZJTFRFUiB1LnZlcmlmaWVkRW1haWwgIT0gdHJ1ZVxuICAgICAgICBGSUxURVIgIUhBUyh1LCBcInZlcmlmaWVkRW1haWxFeHBpcmVzXCIpIHx8IHUudmVyaWZpZWRFbWFpbEV4cGlyZXMgPD0gJHtub3d9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgVVBEQVRFIHUgV0lUSCAke3tcbiAgICAgICAgICB2ZXJpZmllZEVtYWlsQ29kZSxcbiAgICAgICAgICB2ZXJpZmllZEVtYWlsRXhwaXJlczogbm93ICsgVkVSSUZJQ0FUSU9OX0VNQUlMX0NPT0xET1dOX01TXG4gICAgICAgIH19IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgICBSRVRVUk4gTkVXXG4gICAgYDtcblxuICAgIGNvbnN0IGN1cnNvciA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodXBkYXRlUXVlcnkpO1xuICAgIGNvbnN0IHJhd1VzZXIgPSBhd2FpdCBjdXJzb3IubmV4dCgpO1xuICAgIGNvbnN0IGZvdW5kVXNlciA9IHJhd1VzZXIgPyBwYXJzZVVzZXIocmF3VXNlcikgOiBudWxsO1xuXG4gICAgaWYoIWZvdW5kVXNlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzZW5kRW1haWwoe1xuICAgICAgY29udGV4dCxcbiAgICAgIC4uLmJ1aWxkVmVyaWZpY2F0aW9uRW1haWwoY29udGV4dCwgdmVyaWZpZWRFbWFpbENvZGUsIHVzZXIpLFxuICAgICAgdXNlcjoge1xuICAgICAgICAuLi5mb3VuZFVzZXIsXG4gICAgICAgIHZlcmlmaWVkRW1haWxDb2RlXG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlybUNvZGUgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHR5cGUsXG4gICAgdmFsdWVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICB0eXBlOiAnc21zJyB8ICdlbWFpbCc7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgfVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdjb25maXJtQ29kZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgaXNTbXMgPSB0eXBlID09PSAnc21zJztcbiAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBpc1NtcyA/IHBhcnNlUGhvbmUodmFsdWUpIDogcGFyc2VFbWFpbCh2YWx1ZSk7XG4gIGNvbnN0IGZpbHRlckJ5VHlwZSA9IGlzU21zXG4gICAgPyBhcWxgRklMVEVSIHUucGhvbmUgPT0gJHtmb3JtYXR0ZWRWYWx1ZX0gJiYgdS52ZXJpZmllZFNtc0NvZGUgPT0gJHtjb2RlfWBcbiAgICA6IGFxbGBGSUxURVIgdS5lbWFpbCA9PSAke2Zvcm1hdHRlZFZhbHVlfSAmJiB1LnZlcmlmaWVkRW1haWxDb2RlID09ICR7Y29kZX1gO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIHUgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICAke2ZpbHRlckJ5VHlwZX1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB1XG4gIGA7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigodXNlcikgPT4ge1xuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZFVzZXIgPSBpc1Ntc1xuICAgICAgICAgICAgPyB7dmVyaWZpZWRQaG9uZTogdHJ1ZSwgdmVyaWZpZWRTbXNDb2RlOiAwfVxuICAgICAgICAgICAgOiB7dmVyaWZpZWRFbWFpbDogdHJ1ZSwgdmVyaWZpZWRFbWFpbENvZGU6IDB9O1xuICAgICAgICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyLl9rZXl9IFdJVEggJHt1cGRhdGVkVXNlcn0gSU4gdXNlcnNgO1xuXG4gICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtjb2RlLCB0eXBlLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWV9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtjb2RlLCB0eXBlLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2lkfSA9IHBhcnNlVXNlcih1c2VyKTtcblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke2lkfSlcbiAgICBSRU1PVkUgdSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHBhcnNlVXNlclNhZmUodXNlcikpXG4gICAgLnRoZW4oKGRlbGV0ZWRVc2VyKSA9PiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbChkZWxldGVkVXNlcj8uc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUFjY291bnRJZCkpXG4gICAgICAudGhlbigoKSA9PiBkZWxldGVkVXNlciBhcyBVc2VyVHlwZSkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYWN0aXZhdGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVhY3RpdmF0ZVVzZXInO1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB1cGRhdGVkOiBVc2VyVHlwZSA9IHtcbiAgICBhY3RpdmU6IGZhbHNlXG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIGlkLCB1cGRhdGVkKVxuICAgIC50aGVuKCh1cGRhdGVkVXNlcikgPT4gcGFyc2VVc2VyU2FmZSh1cGRhdGVkVXNlcikgYXMgVXNlclR5cGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJEaXNwbGF5TmFtZSA9ICh1c2VyOiBVc2VyVHlwZSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHtmaXJzdE5hbWUsIGxhc3ROYW1lLCBuYW1lID0gJycsIHVzZXJuYW1lID0gJyd9ID0gdXNlcjtcbiAgY29uc3QgZnVsbG5hbWUgPSAoW2ZpcnN0TmFtZSwgbGFzdE5hbWVdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfSBlbHNlIGlmKGZ1bGxuYW1lICE9PSAnJykge1xuICAgIHJldHVybiBmdWxsbmFtZTtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgcmV0dXJuIHVzZXJuYW1lO1xuICB9XG5cbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZXNzaW9uVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0U2Vzc2lvblVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZCA9IHBhcnNlQXJhbmdvSWQoYHVzZXJzLyR7c2Vzc2lvbklkfWApO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgdSA9IERPQ1VNRU5UKCR7Zm9ybWF0U2Vzc2lvbklkfSlcbiAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgUkVUVVJOICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCd1Jyl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXNlcikgPT4gcGFyc2VVc2VyU2FmZSh1c2VyKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJCeUlkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckJ5SWQnO1xuICBjb25zdCB7ZW1haWwsIGlkLCBwaG9uZSwgdXNlcklkLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHtmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG5cbiAgaWYoaWQpIHtcbiAgICByZXR1cm4gZ2V0SXRlbUJ5PFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgICBsb2dpYzogJ0FORCcsXG4gICAgICBjb25kaXRpb25zOiBbXG4gICAgICAgIHtmaWVsZDogJ19pZCcsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogaWR9LFxuICAgICAgICB7ZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJyE9JywgdmFsdWU6IGZhbHNlfVxuICAgICAgXVxuICAgIH0gYXMgYW55LCB7XG4gICAgICBjdXN0b21RdWVyaWVzOiBzZWxlY3RRdWVyaWVzLFxuICAgICAgY3VzdG9tT2JqZWN0czogc2VsZWN0T2JqZWN0c1xuICAgIH0pXG4gICAgICAudGhlbigocmVzdWx0KSA9PiBwYXJzZVVzZXJTYWZlKHJlc3VsdCkgYXMgVXNlclR5cGUpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtpZCwgdXNlcklkLCB1c2VybmFtZX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVycyA9IGJ1aWxkVXNlckF0dHJpYnV0ZUZpbHRlcnMoe2VtYWlsLCBwaG9uZSwgdXNlcklkLCB1c2VybmFtZX0sIHthY3RpdmU6IHRydWV9KTtcblxuICBpZihmaWx0ZXJzLmNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsIGFzIHVua25vd24gYXMgVXNlclR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIGdldEl0ZW1CeTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywgZmlsdGVycywge1xuICAgIGN1c3RvbVF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXMsXG4gICAgY3VzdG9tT2JqZWN0czogc2VsZWN0T2JqZWN0c1xuICB9KVxuICAgIC50aGVuKChyZXN1bHQpID0+IHBhcnNlVXNlclNhZmUocmVzdWx0KSBhcyBVc2VyVHlwZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpZCwgdXNlcklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckxpc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyTGlzdCc7XG4gIGNvbnN0IHtmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgY29uZGl0aW9uczogYW55W10gPSBbXG4gICAge2ZpZWxkOiAnYWN0aXZlJywgb3BlcmF0b3I6ICchPScsIHZhbHVlOiBmYWxzZX1cbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGNvbmRpdGlvbnMucHVzaCh7ZmllbGQ6ICd1c2VybmFtZScsIG9wZXJhdG9yOiAnQ09OVEFJTlMnLCB2YWx1ZTogcGFyc2VVc2VybmFtZSh1c2VybmFtZSksIGNhc2VTZW5zaXRpdmU6IGZhbHNlfSk7XG4gIH1cblxuICByZXR1cm4gZ2V0TGlzdEJ5PFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgbG9naWM6ICdBTkQnLFxuICAgIGNvbmRpdGlvbnNcbiAgfSBhcyBhbnksIHtcbiAgICBzb3J0OiBbe2ZpZWxkOiAndXNlcm5hbWUnLCBkaXJlY3Rpb246ICdBU0MnfV0sXG4gICAgbGltaXQ6IHtmcm9tOiBsaW1pdC5zdGFydCwgdG86IGxpbWl0LnN0YXJ0ICsgbGltaXQubnVtfSxcbiAgICBjdXN0b21RdWVyaWVzOiBzZWxlY3RRdWVyaWVzLFxuICAgIGN1c3RvbU9iamVjdHM6IHNlbGVjdE9iamVjdHNcbiAgfSlcbiAgICAudGhlbigocmVzdWx0KSA9PiBwYXJzZVVzZXJMaXN0KHJlc3VsdCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckxpc3RCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3JlYWN0aW9ucyA9IFtdLCB1c2VybmFtZX06IHtyZWFjdGlvbnM/OiBzdHJpbmdbXTsgdXNlcm5hbWU/OiBzdHJpbmd9LFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3RCeVJlYWN0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nW10gPSByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWU6IHN0cmluZykgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZCA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZSA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgJ3UuYWN0aXZlICE9IGZhbHNlJyxcbiAgICBgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRSZWFjdGlvbnMpfSwgTE9XRVIoci5uYW1lKSlgXG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7Zm9ybWF0VXNlcm5hbWV9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIHUsIHIgSU4gT1VUQk9VTkQgJHtmb3JtYXRTZXNzaW9uSWR9ICR7aGFzUmVhY3Rpb25Db2xsZWN0aW9ufVxuICAgICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6ICR7Q09MTEVDVElPTlMuVVNFUlN9fVxuICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJCeS5qb2luKCcgJiYgJykpfVxuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ3UnKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHVzZXJzKSA9PiBwYXJzZVVzZXJMaXN0KHVzZXJzKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyTGlzdEJ5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3RhZ3MsIHVzZXJuYW1lfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJMaXN0QnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VGFnczogc3RyaW5nW10gPSB0YWdzPy5yZWR1Y2UoKGxpc3Q6IHN0cmluZ1tdLCB0YWdOYW1lOiBzdHJpbmcpID0+IHtcbiAgICBpZih0YWdOYW1lKSB7XG4gICAgICBsaXN0LnB1c2gocGFyc2VDaGFyKHRhZ05hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICBgdS5fa2V5ICE9IFwiJHtzZXNzaW9uSWR9XCJgLFxuICAgICd1LmFjdGl2ZSAhPSBmYWxzZSdcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtmb3JtYXRVc2VybmFtZX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgdCBJTiB0YWdzXG4gICAgICBGSUxURVIgUE9TSVRJT04oJHtmb3JtYXRUYWdzfSwgTE9XRVIodC5uYW1lKSlcbiAgICAgIEZPUiB1LCBpdCBJTiBPVVRCT1VORCB0ICR7aXNUYWdnZWRDb2xsZWN0aW9ufVxuICAgICAgICBPUFRJT05TIHtiZnM6IHRydWUsIHVuaXF1ZVZlcnRpY2VzOiBcImdsb2JhbFwiLCB2ZXJ0ZXhDb2xsZWN0aW9uczogJHtDT0xMRUNUSU9OUy5VU0VSU319XG4gICAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJCeS5qb2luKCcgJiYgJykpfVxuICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgUkVUVVJOIERJU1RJTkNUICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCd1Jyl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKCh1c2VycykgPT4gcGFyc2VVc2VyTGlzdCh1c2VycykpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckxpc3RCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB7dXNlcm5hbWV9LCBvcHRpb25zPzogVXNlck9wdGlvbnMpOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJMaXN0QnlMYXRlc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZpbHRlciA9IFtcbiAgICAndS5faWQgIT0gc2Vzc2lvbi5faWQnLFxuICAgICd1LmFjdGl2ZSAhPSBmYWxzZSdcbiAgXTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXIucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke3BhcnNlVXNlcm5hbWUodXNlcm5hbWUpfVwiKWApO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIHUgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKCR7YHVzZXJzLyR7dXNlcklkfWB9KVxuICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXIuam9pbignICYmICcpKX1cbiAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgIExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKHUubGF0aXR1ZGUgfHwgMCwgdS5sb25naXR1ZGUgfHwgMCwgc2Vzc2lvbi5sYXRpdHVkZSB8fCAwLCBzZXNzaW9uLmxvbmdpdHVkZSB8fCAwKVxuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBTT1JUIGRpc3RhbmNlIEFTQywgdS5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ3UnKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHVzZXJzKSA9PiBwYXJzZVVzZXJMaXN0KHVzZXJzKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyTGlzdEJ5Q29ubmVjdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3VzZXJJZH06IFVzZXJUeXBlLFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3RCeUNvbm5lY3Rpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VBcmFuZ29JZChgdXNlcnMvJHt1c2VySWR9YCk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAndS5hY3RpdmUgIT0gZmFsc2UnXG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGN1IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgTEVUIHNlc3Npb24gPSBET0NVTUVOVCgke2Zvcm1hdFVzZXJJZH0pXG4gICAgICBGT1IgdSwgY29ubmVjdGlvbiBJTiBPVVRCT1VORCBjdSAke2hhc0Nvbm5lY3Rpb25Db2xsZWN0aW9ufVxuICAgICAgICBPUFRJT05TIHtiZnM6IHRydWUsIHVuaXF1ZVZlcnRpY2VzOiBcImdsb2JhbFwiLCB2ZXJ0ZXhDb2xsZWN0aW9uczogJHtDT0xMRUNUSU9OUy5VU0VSU319XG4gICAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJCeS5qb2luKCcgJiYgJykpfVxuICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgUkVUVVJOIERJU1RJTkNUICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCd1Jyl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKCh1c2VycykgPT4gcGFyc2VVc2VyTGlzdCh1c2VycykpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVmcmVzaFNlc3Npb24gPSAoe2V4cGlyZXMsIHRva2VufSk6IFNlc3Npb25Ub2tlbiB8IFNlc3Npb25FcnJvciA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qge3BlcnNvbmFJZCwgdXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2Vzc30gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgICByZXR1cm4gY3JlYXRlVXNlclRva2VuKHVzZXJJZCwgcGVyc29uYUlkIHx8ICcnLCB1c2VybmFtZSwgdXNlckFjY2VzcywgZXhwaXJlcyk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdGhlIGVycm9yIGZyb20gZ2V0U2Vzc2lvblxuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbkluID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHtleHBpcmVzLCB1c2VyfSk6IFByb21pc2U8U2Vzc2lvblRva2VuIHwgbnVsbD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2lnbkluJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWwsIHBhc3N3b3JkLCBwaG9uZSwgdXNlcm5hbWV9ID0gdXNlciB8fCB7fTtcbiAgY29uc3QgZm9ybWF0RW1haWwgPSBwYXJzZUVtYWlsKGVtYWlsKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWUgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQgPSBwYXJzZVBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgY29uc3QgZm9ybWF0UGhvbmUgPSBwYXJzZVBob25lKHBob25lKTtcbiAgY29uc3QgZm9ybWF0RXhwaXJlcyA9IHBhcnNlTnVtKGV4cGlyZXMpIHx8IDE1O1xuXG4gIGlmKCghZm9ybWF0VXNlcm5hbWUgJiYgIWZvcm1hdEVtYWlsICYmICFmb3JtYXRQaG9uZSkgfHwgIWZvcm1hdFBhc3N3b3JkKSB7XG4gICAgdGhyb3cgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIGZvcm1hdEVtYWlsLCBmb3JtYXRQaG9uZSwgZm9ybWF0VXNlcm5hbWUsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVycyA9IGJ1aWxkVXNlckF0dHJpYnV0ZUZpbHRlcnMoe1xuICAgIGVtYWlsOiBmb3JtYXRFbWFpbCxcbiAgICBwaG9uZTogZm9ybWF0UGhvbmUsXG4gICAgdXNlcm5hbWU6IGZvcm1hdFVzZXJuYW1lXG4gIH0pO1xuICBjb25zdCBmaWx0ZXJDbGF1c2UgPSBidWlsZEZpbHRlckNsYXVzZShmaWx0ZXJzLCAndScpO1xuXG4gIGNvbnN0IGNoZWNrUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB1IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJDbGF1c2UpfVxuICAgICAgUkVUVVJOIHVcbiAgYDtcblxuICBsZXQgY2hlY2tVc2VyczogVXNlclR5cGVbXTtcblxuICB0cnkge1xuICAgIGNoZWNrVXNlcnMgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNoZWNrUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGNoZWNrVXNlciA9IGNoZWNrVXNlcnMuZmluZCgodXNlckl0ZW0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtwYXNzd29yZDogdmFsaWRQYXNzd29yZCwgc2FsdH0gPSB1c2VySXRlbSBhcyBVc2VyVHlwZTtcbiAgICByZXR1cm4gQm9vbGVhbih2YWxpZFBhc3N3b3JkICYmIHNhbHQgJiYgdmFsaWRQYXNzd29yZCA9PT0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpKTtcbiAgfSk7XG5cbiAgaWYoIWNoZWNrVXNlcikge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgaWYoY2hlY2tVc2VyLmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT05cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBfa2V5OiB1c2VySWQsXG4gICAgcGVyc29uYUlkLFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcm5hbWU6IGNoZWNrVXNlcm5hbWVcbiAgfSA9IGNoZWNrVXNlciBhcyBVc2VyVHlwZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHRva2VuID0gY3JlYXRlVXNlclRva2VuKHVzZXJJZCB8fCAnJywgcGVyc29uYUlkIHx8ICcnLCBjaGVja1VzZXJuYW1lIHx8ICcnLCB1c2VyQWNjZXNzLCBmb3JtYXRFeHBpcmVzKTtcblxuICAgIHJldHVybiB0b2tlbjtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25PdXQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2lnbk91dCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG5cbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIGxhc3RPbmxpbmU6IERhdGUubm93KCksXG4gICAgc2Vzc2lvbklkOiBudWxsXG4gIH07XG4gIGNvbnN0IHNlc3Npb25RdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke3VzZXJEb2NJZH0pXG4gICAgVVBEQVRFIHUgV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnNcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHNlc3Npb25RdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWN0aXZlVXNlckNvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0QWN0aXZlVXNlckNvdW50JztcblxuICByZXR1cm4gY291bnRJdGVtcyhjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgbG9naWM6ICdBTkQnLFxuICAgIGNvbmRpdGlvbnM6IFt7ZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IHRydWV9XVxuICB9IGFzIGFueSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckJ5VG9rZW4gPSAoY29udGV4dDogQXBpQ29udGV4dCwgdG9rZW46IHN0cmluZyk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJCeVRva2VuJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7dXNlcklkfSA9IGdldFNlc3Npb24odG9rZW4pO1xuICBjb25zdCB1c2VyRG9jSWQgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3VzZXJJZH1gKTtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoXCIke3VzZXJEb2NJZH1cIikgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHtcbiAgICAgIGlmKHVzZXI/LmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgcGFyYW1zOiB7dXNlcklkfSxcbiAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VVc2VyU2FmZSh1c2VyKSBhcyBVc2VyVHlwZTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJJZH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuIl0sIm5hbWVzIjpbInBhcnNlTnVtIiwiY3JlYXRlSGFzaCIsImNyZWF0ZVBhc3N3b3JkIiwicGFyc2VBcmFuZ29JZCIsInBhcnNlQ2hhciIsInBhcnNlRW1haWwiLCJwYXJzZVBhc3N3b3JkIiwicGFyc2VQaG9uZSIsInBhcnNlVXNlcm5hbWUiLCJhcWwiLCJsaXRlcmFsIiwiRGF0ZVRpbWUiLCJwYXJzZVVzZXIiLCJwYXJzZVVzZXJTYWZlIiwiQ29uZmlnIiwiQ09MTEVDVElPTlMiLCJFREdFUyIsInZlcmlmeUVtYWlsVGVtcGxhdGUiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJsb2dFeGNlcHRpb24iLCJidWlsZEZpbHRlckNsYXVzZSIsImJ1aWxkUHJlc2VudEZpbHRlckdyb3VwIiwiZ2V0RG9jSWQiLCJnZXRMaW1pdCIsInNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUiLCJ1c2VEYiIsImRldGVjdExhbmd1YWdlIiwiZ2V0U2Vzc2lvbiIsInNldFNlc3Npb24iLCJnZXRTdHJpcGVDbGllbnQiLCJhZGRJdGVtIiwiY291bnRJdGVtcyIsImdldEl0ZW1CeSIsImdldExpc3RCeSIsInVwZGF0ZUl0ZW0iLCJzZW5kRW1haWwiLCJhZGRQZXJzb25hIiwic2VuZFNtcyIsImV2ZW50Q2F0ZWdvcnkiLCJWRVJJRklDQVRJT05fRU1BSUxfQ09PTERPV05fTVMiLCJ1c2Vyc0NvbGxlY3Rpb24iLCJVU0VSUyIsImhhc1JlYWN0aW9uQ29sbGVjdGlvbiIsIkhBU19SRUFDVElPTiIsImlzVGFnZ2VkQ29sbGVjdGlvbiIsIklTX1RBR0dFRCIsImhhc0Nvbm5lY3Rpb25Db2xsZWN0aW9uIiwiSEFTX0NPTk5FQ1RJT04iLCJnZXRBcHBOYW1lIiwiY29udGV4dCIsImNvbmZpZyIsImRldGFpbHMiLCJuYW1lIiwiZ2V0IiwiZ2V0QXBwVGl0bGUiLCJhcHBOYW1lIiwic3BsaXQiLCJtYXAiLCJwYXJ0IiwidGVzdCIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJqb2luIiwiYnVpbGRWZXJpZmljYXRpb25FbWFpbCIsInZlcmlmaWVkRW1haWxDb2RlIiwidXNlciIsImFwcFRpdGxlIiwiY29kZSIsInBhcnNlRW1haWxUZW1wbGF0ZSIsInRlbXBsYXRlIiwicmVwbGFjZUFsbCIsImh0bWwiLCJ2ZXJpZmljYXRpb25FbWFpbFRlbXBsYXRlIiwic3ViamVjdCIsInZlcmlmaWNhdGlvbkVtYWlsU3ViamVjdCIsInRleHQiLCJ2ZXJpZmljYXRpb25FbWFpbFRleHQiLCJVc2VyQWNjZXNzIiwiY3JlYXRlVXNlclRva2VuIiwidXNlcklkIiwicGVyc29uYUlkIiwidXNlcm5hbWUiLCJ1c2VyQWNjZXNzIiwiZXhwaXJlc0luTWludXRlcyIsIm5vdyIsImxvY2FsIiwic2Vzc2lvbkV4cGlyZXMiLCJwbHVzIiwibWludXRlcyIsImlhdCIsIk1hdGgiLCJmbG9vciIsInRvU2Vjb25kcyIsImV4cCIsInRva2VuIiwiZXhwaXJlcyIsInRvTWlsbGlzIiwiaXNzdWVkIiwicGFyc2VVc2VyTGlzdCIsInVzZXJzIiwicmVkdWNlIiwicmVzdWx0IiwicGFyc2VkVXNlciIsInB1c2giLCJidWlsZFVzZXJBdHRyaWJ1dGVGaWx0ZXJzIiwiZW1haWwiLCJwaG9uZSIsImFjdGl2ZSIsImF0dHJpYnV0ZUZpbHRlcnMiLCJfa2V5IiwibG9naWMiLCJjb25kaXRpb25zIiwibGVuZ3RoIiwiZmllbGQiLCJvcGVyYXRvciIsInZhbHVlIiwiZ2V0VXNlckJ5QXR0cmlidXRlcyIsIm9wdGlvbnMiLCJmaWx0ZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRVc2VyT3B0aW9uYWxGaWVsZHMiLCJmaWVsZHMiLCJzZWxlY3RzIiwiaW5jbHVkZXMiLCJvYmplY3RzIiwicXVlcmllcyIsInBhcnNlVXNlck9wdGlvbnMiLCJmcm9tIiwidG8iLCJsaW1pdCIsImFkZFVzZXIiLCJhY3Rpb24iLCJsYW5ndWFnZUNvbnRleHQiLCJjb25maXJtIiwiX2NvbmZpcm0iLCJuZXdVc2VyIiwicGFzc3dvcmQiLCJfaWQiLCJpbnNlcnRVc2VyIiwiaGFzUGFzc3dvcmQiLCJoYXNVc2VybmFtZSIsImNhdGVnb3J5IiwicGFyYW1zIiwiSU5WQUxJRF9BUkdVTUVOVFMiLCJoYXNoSWQiLCJzYWx0IiwiZW5jcnlwdGVkUGFzc3dvcmQiLCJleGlzdGluZ1VzZXIiLCJFWElTVElOR19JVEVNIiwiZXJyb3IiLCJEQVRBQkFTRV9FUlJPUiIsInBob25lQ291bnRyeUNvZGUiLCJyZXBsYWNlIiwic3Vic3RyaW5nIiwibG9jYWxlIiwidXNlclByZWZlcmVuY2UiLCJyYW5kb20iLCJ2ZXJpZmllZFNtc0NvZGUiLCJpbnNlcnQiLCJ2ZXJpZmllZEVtYWlsIiwidmVyaWZpZWRQaG9uZSIsInRoZW4iLCJzYXZlZFVzZXIiLCJzYXZlZFVzZXJJZCIsInBlcnNvbmEiLCJ1cGRhdGVkVXNlciIsInJlc3VsdFVzZXIiLCJwZXJzb25hRXJyb3IiLCJjYXRjaCIsInVwZGF0ZVVzZXIiLCJ1cGRhdGVGaWVsZHMiLCJpZCIsInVwZGF0ZSIsImRhdGFiYXNlTmFtZSIsInF1ZXJ5IiwiY3Vyc29yIiwibmV4dCIsInVwZGF0ZWRVc2VyUmVzdWx0IiwiZm9yZ290UGFzc3dvcmQiLCJjb2RlRXhwaXJlcyIsIkRhdGUiLCJ2ZXJpZmllZEVtYWlsRXhwaXJlcyIsInZlcmlmaWVkUGhvbmVFeHBpcmVzIiwidXNlckRvY0lkIiwicmVzZXRQYXNzd29yZCIsImZvcm1hdFBhc3N3b3JkIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwidXBkYXRlUXVlcnkiLCJyYXdVc2VyIiwiZm91bmRVc2VyIiwiY29uZmlybUNvZGUiLCJ0eXBlIiwiaXNTbXMiLCJmb3JtYXR0ZWRWYWx1ZSIsImZpbHRlckJ5VHlwZSIsImFxbFF1ZXJ5IiwiZGVsZXRlVXNlciIsInN0cmlwZUNsaWVudCIsImRlbGV0ZWRVc2VyIiwiY3VzdG9tZXJzIiwiZGVsIiwic3RyaXBlQ3VzdG9tZXJJZCIsImFjY291bnRzIiwic3RyaXBlQWNjb3VudElkIiwiZGVhY3RpdmF0ZVVzZXIiLCJ1cGRhdGVkIiwiZ2V0VXNlckRpc3BsYXlOYW1lIiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJmdWxsbmFtZSIsInRyaW0iLCJnZXRTZXNzaW9uVXNlciIsInNlc3Npb24iLCJzZXNzaW9uSWQiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImZvcm1hdFNlc3Npb25JZCIsImdldFVzZXJCeUlkIiwiY3VzdG9tUXVlcmllcyIsImN1c3RvbU9iamVjdHMiLCJnZXRVc2VyTGlzdCIsImNhc2VTZW5zaXRpdmUiLCJzb3J0IiwiZGlyZWN0aW9uIiwic3RhcnQiLCJudW0iLCJnZXRVc2VyTGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25zIiwiZm9ybWF0UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lIiwidG9Mb3dlckNhc2UiLCJmb3JtYXRVc2VybmFtZSIsImZpbHRlckJ5IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbCIsImdldFVzZXJMaXN0QnlUYWdzIiwidGFncyIsImZvcm1hdFRhZ3MiLCJsaXN0IiwidGFnTmFtZSIsImdldFVzZXJMaXN0QnlMYXRlc3QiLCJmaWx0ZXIiLCJnZXRVc2VyTGlzdEJ5Q29ubmVjdGlvbiIsImZvcm1hdFVzZXJJZCIsInJlZnJlc2hTZXNzaW9uIiwic2lnbkluIiwiZm9ybWF0RW1haWwiLCJmb3JtYXRQaG9uZSIsImZvcm1hdEV4cGlyZXMiLCJmaWx0ZXJDbGF1c2UiLCJjaGVja1F1ZXJ5IiwiY2hlY2tVc2VycyIsImNoZWNrVXNlciIsImZpbmQiLCJ1c2VySXRlbSIsInZhbGlkUGFzc3dvcmQiLCJCb29sZWFuIiwiSU5WQUxJRF9BVVRIRU5USUNBVElPTiIsImNoZWNrVXNlcm5hbWUiLCJzaWduT3V0IiwibGFzdE9ubGluZSIsInNlc3Npb25RdWVyeSIsImdldEFjdGl2ZVVzZXJDb3VudCIsImdldFVzZXJCeVRva2VuIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxRQUFRLFFBQU8sK0JBQStCO0FBQ3RELFNBQ0VDLFVBQVUsRUFDVkMsY0FBYyxFQUNkQyxhQUFhLEVBQ2JDLFNBQVMsRUFDVEMsVUFBVSxFQUNWQyxhQUFhLEVBQ2JDLFVBQVUsRUFDVkMsYUFBYSxRQUNSLCtCQUErQjtBQUN0QyxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUNyQyxTQUFRQyxRQUFRLFFBQU8sUUFBUTtBQUUvQixTQUFRQyxTQUFTLEVBQUVDLGFBQWEsUUFBTyw2QkFBNkI7QUFDcEUsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsV0FBVyxFQUFFQyxLQUFLLFFBQU8sOEJBQThCO0FBQy9ELE9BQU9DLHlCQUF5QixvQ0FBb0M7QUFDcEUsU0FBUUMsVUFBVSxRQUEwQiwwQkFBMEI7QUFDdEUs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
1041
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC9ubGFicy1yZWFrdG9yLXJlbGVhc2UuZU1RNVNoL2NoZWNrb3V0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSGFzaCxcbiAgY3JlYXRlUGFzc3dvcmQsXG4gIHBhcnNlQXJhbmdvSWQsXG4gIHBhcnNlQ2hhcixcbiAgcGFyc2VFbWFpbCxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge2NyZWF0ZUhhc2ggYXMgY3JlYXRlQ3J5cHRvSGFzaCwgdGltaW5nU2FmZUVxdWFsfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHtEYXRlVGltZX0gZnJvbSAnbHV4b24nO1xuXG5pbXBvcnQge3BhcnNlVXNlciwgcGFyc2VVc2VyU2FmZX0gZnJvbSAnLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge0NPTExFQ1RJT05TLCBFREdFU30gZnJvbSAnLi4vY29uc3RhbnRzL2NvbGxlY3Rpb25zLmpzJztcbmltcG9ydCB2ZXJpZnlFbWFpbFRlbXBsYXRlIGZyb20gJy4uL3RlbXBsYXRlcy9lbWFpbC92ZXJpZnlFbWFpbC5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXMsIHR5cGUgU2Vzc2lvbkVycm9yfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yLCBsb2dFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7YnVpbGRGaWx0ZXJDbGF1c2UsIGJ1aWxkUHJlc2VudEZpbHRlckdyb3VwfSBmcm9tICcuLi91dGlscy9hcWxIZWxwZXJzLmpzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0LCBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2RldGVjdExhbmd1YWdlfSBmcm9tICcuLi91dGlscy9sYW5ndWFnZURldGVjdGlvbi5qcyc7XG5pbXBvcnQge2dldFNlc3Npb24sIHNldFNlc3Npb259IGZyb20gJy4uL3V0aWxzL3Nlc3Npb25VdGlscy5qcyc7XG5pbXBvcnQge2dldFN0cmlwZUNsaWVudH0gZnJvbSAnLi4vdXRpbHMvc3RyaXBlVXRpbHMuanMnO1xuaW1wb3J0IHthZGRJdGVtLCBjb3VudEl0ZW1zLCBnZXRJdGVtQnksIGdldExpc3RCeSwgdXBkYXRlSXRlbX0gZnJvbSAnLi9jcnVkLmpzJztcbmltcG9ydCB7c2VuZEVtYWlsfSBmcm9tICcuL2VtYWlsLmpzJztcbmltcG9ydCB7YWRkUGVyc29uYX0gZnJvbSAnLi9wZXJzb25hcy5qcyc7XG5pbXBvcnQge3NlbmRTbXN9IGZyb20gJy4vc21zLmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0ZpbHRlckdyb3VwfSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYi50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VXNlcklucHV0LCBVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvdXNlcnMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1Nlc3Npb25Ub2tlbn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICd1c2Vycyc7XG5jb25zdCBBRE1JTl9VU0VSTkFNRSA9ICdhZG1pbic7XG5jb25zdCBWRVJJRklDQVRJT05fRU1BSUxfQ09PTERPV05fTVMgPSAxMDAwICogNjAgKiAxNTtcbmNvbnN0IHVzZXJzQ29sbGVjdGlvbiA9IGxpdGVyYWwoQ09MTEVDVElPTlMuVVNFUlMpO1xuY29uc3QgaGFzUmVhY3Rpb25Db2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5IQVNfUkVBQ1RJT04pO1xuY29uc3QgaXNUYWdnZWRDb2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5JU19UQUdHRUQpO1xuY29uc3QgaGFzQ29ubmVjdGlvbkNvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLkhBU19DT05ORUNUSU9OKTtcblxuY29uc3QgaXNBZG1pblBhc3N3b3JkID0gKHBhc3N3b3JkOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGFkbWluUGFzc3dvcmQgPSBwcm9jZXNzLmVudi5BRE1JTl9QQVNTV09SRDtcbiAgaWYodHlwZW9mIHBhc3N3b3JkICE9PSAnc3RyaW5nJyB8fCAhcGFzc3dvcmQgfHwgIWFkbWluUGFzc3dvcmQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBhY3R1YWwgPSBjcmVhdGVDcnlwdG9IYXNoKCdzaGEyNTYnKS51cGRhdGUocGFzc3dvcmQpLmRpZ2VzdCgpO1xuICBjb25zdCBleHBlY3RlZCA9IGNyZWF0ZUNyeXB0b0hhc2goJ3NoYTI1NicpLnVwZGF0ZShhZG1pblBhc3N3b3JkKS5kaWdlc3QoKTtcbiAgcmV0dXJuIHRpbWluZ1NhZmVFcXVhbChhY3R1YWwsIGV4cGVjdGVkKTtcbn07XG5cbmNvbnN0IGdldEFwcE5hbWUgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IHN0cmluZyA9PlxuICBjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8ubmFtZSB8fCBDb25maWcuZ2V0KCdkZXRhaWxzLm5hbWUnKSB8fCAnUmVha3Rvcic7XG5cbmNvbnN0IGdldEFwcFRpdGxlID0gKGFwcE5hbWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICBhcHBOYW1lXG4gICAgLnNwbGl0KC8oW1xccy1fXSspLylcbiAgICAubWFwKChwYXJ0KSA9PiAvXltBLVphLXpdLy50ZXN0KHBhcnQpID8gYCR7cGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke3BhcnQuc2xpY2UoMSl9YCA6IHBhcnQpXG4gICAgLmpvaW4oJycpO1xuXG5jb25zdCBidWlsZFZlcmlmaWNhdGlvbkVtYWlsID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB2ZXJpZmllZEVtYWlsQ29kZTogbnVtYmVyLFxuICB1c2VyOiBVc2VyVHlwZSA9IHt9XG4pID0+IHtcbiAgY29uc3QgYXBwTmFtZSA9IGdldEFwcE5hbWUoY29udGV4dCk7XG4gIGNvbnN0IGFwcFRpdGxlID0gZ2V0QXBwVGl0bGUoYXBwTmFtZSk7XG4gIGNvbnN0IGNvZGUgPSBgJHt2ZXJpZmllZEVtYWlsQ29kZX1gO1xuICBjb25zdCBwYXJzZUVtYWlsVGVtcGxhdGUgPSAodGVtcGxhdGU6IHN0cmluZykgPT4gdGVtcGxhdGVcbiAgICAucmVwbGFjZUFsbCgnW2FwcE5hbWVdJywgYXBwTmFtZSlcbiAgICAucmVwbGFjZUFsbCgnW2FwcFRpdGxlXScsIGFwcFRpdGxlKVxuICAgIC5yZXBsYWNlQWxsKCdbZW1haWxDb2RlXScsIGNvZGUpO1xuICBjb25zdCBodG1sID0gcGFyc2VFbWFpbFRlbXBsYXRlKHVzZXIudmVyaWZpY2F0aW9uRW1haWxUZW1wbGF0ZSB8fCB2ZXJpZnlFbWFpbFRlbXBsYXRlKTtcbiAgY29uc3Qgc3ViamVjdCA9IHBhcnNlRW1haWxUZW1wbGF0ZSh1c2VyLnZlcmlmaWNhdGlvbkVtYWlsU3ViamVjdCB8fCBgWW91ciAke2FwcFRpdGxlfSB2ZXJpZmljYXRpb24gY29kZSBpcyAke2NvZGV9YCk7XG4gIGNvbnN0IHRleHQgPSBwYXJzZUVtYWlsVGVtcGxhdGUodXNlci52ZXJpZmljYXRpb25FbWFpbFRleHQgfHwgYFlvdXIgJHthcHBUaXRsZX0gdmVyaWZpY2F0aW9uIGNvZGUgaXMgJHtjb2RlfS5cXG5cXG5FbnRlciB0aGlzIGNvZGUgaW4gJHthcHBUaXRsZX0gdG8gZmluaXNoIHNldHRpbmcgdXAgeW91ciBhY2NvdW50LiBJZiB5b3UgZGlkIG5vdCByZXF1ZXN0IHRoaXMgZW1haWwsIHlvdSBjYW4gc2FmZWx5IGlnbm9yZSBpdC5gKTtcblxuICByZXR1cm4ge1xuICAgIGh0bWwsXG4gICAgc3ViamVjdCxcbiAgICB0ZXh0XG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZnJvbT86IG51bWJlcjtcbiAgcmVhZG9ubHkgdG8/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBVc2VyQWNjZXNzIHtcbiAgQURNSU4gPSAtMSxcbiAgQkFTSUMgPSAwLFxuICBQUkVNSVVNID0gMSxcbiAgUFJPID0gMlxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlVXNlclRva2VuID0gKFxuICB1c2VySWQ6IHN0cmluZyxcbiAgcGVyc29uYUlkOiBzdHJpbmcgPSAnJyxcbiAgdXNlcm5hbWU6IHN0cmluZyA9ICcnLFxuICB1c2VyQWNjZXNzOiBudW1iZXIgPSAwLFxuICBleHBpcmVzSW5NaW51dGVzOiBudW1iZXIgPSAxNVxuKTogU2Vzc2lvblRva2VuID0+IHtcbiAgY29uc3Qgbm93OiBEYXRlVGltZSA9IERhdGVUaW1lLmxvY2FsKCk7XG4gIGNvbnN0IHNlc3Npb25FeHBpcmVzOiBEYXRlVGltZSA9IG5vdy5wbHVzKHttaW51dGVzOiBleHBpcmVzSW5NaW51dGVzfSk7XG4gIGNvbnN0IGlhdCA9IE1hdGguZmxvb3Iobm93LnRvU2Vjb25kcygpKTtcbiAgY29uc3QgZXhwID0gTWF0aC5mbG9vcihzZXNzaW9uRXhwaXJlcy50b1NlY29uZHMoKSk7XG4gIGNvbnN0IHRva2VuID0gc2V0U2Vzc2lvbih7XG4gICAgZXhwLFxuICAgIGlhdCxcbiAgICAuLi4ocGVyc29uYUlkID8ge3BlcnNvbmFJZH0gOiB7fSksXG4gICAgdXNlckFjY2VzcyxcbiAgICB1c2VySWQsXG4gICAgdXNlcm5hbWVcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBleHBpcmVzOiBzZXNzaW9uRXhwaXJlcy50b01pbGxpcygpLFxuICAgIGlzc3VlZDogbm93LnRvTWlsbGlzKCksXG4gICAgLi4uKHBlcnNvbmFJZCA/IHtwZXJzb25hSWR9IDoge30pLFxuICAgIHRva2VuLFxuICAgIHVzZXJJZCxcbiAgICB1c2VybmFtZVxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNlbGVjdEFjY3VtdWxhdG9yIHtcbiAgb2JqZWN0czogc3RyaW5nW107XG4gIHF1ZXJpZXM6IHN0cmluZ1tdO1xufVxuXG5jb25zdCBwYXJzZVVzZXJMaXN0ID0gKHVzZXJzOiBBcnJheTxVc2VyVHlwZSB8IG51bGwgfCB1bmRlZmluZWQ+ID0gW10pOiBVc2VyVHlwZVtdID0+XG4gIHVzZXJzLnJlZHVjZTxVc2VyVHlwZVtdPigocmVzdWx0LCB1c2VyKSA9PiB7XG4gICAgY29uc3QgcGFyc2VkVXNlciA9IHBhcnNlVXNlclNhZmUodXNlcik7XG5cbiAgICBpZihwYXJzZWRVc2VyKSB7XG4gICAgICByZXN1bHQucHVzaChwYXJzZWRVc2VyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbXSk7XG5cbmNvbnN0IGJ1aWxkVXNlckF0dHJpYnV0ZUZpbHRlcnMgPSAoXG4gIHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lLCB1c2VySWR9OiBVc2VyVHlwZSxcbiAge2FjdGl2ZSA9IGZhbHNlfToge3JlYWRvbmx5IGFjdGl2ZT86IGJvb2xlYW59ID0ge31cbik6IEZpbHRlckdyb3VwID0+IHtcbiAgY29uc3QgYXR0cmlidXRlRmlsdGVycyA9IGJ1aWxkUHJlc2VudEZpbHRlckdyb3VwKHtcbiAgICBlbWFpbCxcbiAgICBwaG9uZSxcbiAgICB1c2VybmFtZSxcbiAgICAuLi4odXNlcklkID8ge19rZXk6IHVzZXJJZH0gOiB7fSlcbiAgfSwge2xvZ2ljOiAnT1InfSk7XG5cbiAgaWYoIWFjdGl2ZSB8fCBhdHRyaWJ1dGVGaWx0ZXJzLmNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZUZpbHRlcnM7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbmRpdGlvbnM6IFtcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcnMsXG4gICAgICB7ZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJyE9JywgdmFsdWU6IGZhbHNlfVxuICAgIF0sXG4gICAgbG9naWM6ICdBTkQnXG4gIH07XG59O1xuXG5jb25zdCBnZXRVc2VyQnlBdHRyaWJ1dGVzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlLCBvcHRpb25zPzoge3JlYWRvbmx5IGFjdGl2ZT86IGJvb2xlYW59KSA9PiB7XG4gIGNvbnN0IGZpbHRlcnMgPSBidWlsZFVzZXJBdHRyaWJ1dGVGaWx0ZXJzKHVzZXIsIG9wdGlvbnMpO1xuXG4gIGlmKGZpbHRlcnMuY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcmV0dXJuIGdldEl0ZW1CeTxVc2VyVHlwZT4oY29udGV4dCwgQ09MTEVDVElPTlMuVVNFUlMsIGZpbHRlcnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJPcHRpb25hbEZpZWxkcyA9IChmaWVsZHM6IHN0cmluZ1tdID0gW10pOiBTZWxlY3RBY2N1bXVsYXRvciA9PlxuICBmaWVsZHMucmVkdWNlKChzZWxlY3RzOiBTZWxlY3RBY2N1bXVsYXRvciwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGlmKGZpZWxkLmluY2x1ZGVzKCdDb3VudCcpKSB7XG4gICAgICByZXR1cm4gc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSgndXNlcnMnLCAndScsIGZpZWxkLCBzZWxlY3RzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0cztcbiAgfSwge29iamVjdHM6IFtdLCBxdWVyaWVzOiBbXX0pO1xuXG5leHBvcnQgY29uc3QgcGFyc2VVc2VyT3B0aW9ucyA9IChvcHRpb25zOiBVc2VyT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICB0byA9IDMwXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbGltaXRcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRVc2VyID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJJbnB1dCk6IFByb21pc2U8VXNlclR5cGUgfCBudWxsPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRVc2VyJztcbiAgY29uc3Qge2xhbmd1YWdlQ29udGV4dH0gPSBjb250ZXh0O1xuICBjb25zdCB7Y29uZmlybTogX2NvbmZpcm0sIC4uLm5ld1VzZXJ9ID0gdXNlcjtcbiAgY29uc3Qge2VtYWlsLCBwYXNzd29yZCwgcGhvbmUsIHVzZXJuYW1lLCB1c2VySWQsIF9rZXksIF9pZCwgLi4uaW5zZXJ0VXNlcn0gPSBwYXJzZVVzZXIobmV3VXNlcik7XG4gIGNvbnN0IGhhc1Bhc3N3b3JkID0gISFwYXNzd29yZDtcbiAgY29uc3QgaGFzVXNlcm5hbWUgPSAhIXVzZXJuYW1lIHx8ICEhcGhvbmUgfHwgISFlbWFpbDtcblxuICBpZighaGFzUGFzc3dvcmQgfHwgIWhhc1VzZXJuYW1lKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgaGFzaElkID0gdXNlcm5hbWUgfHwgcGhvbmUgfHwgZW1haWw7XG4gIGNvbnN0IHNhbHQgPSBjcmVhdGVIYXNoKGAke2hhc2hJZH0ke3Bhc3N3b3JkfWAsICcnKTtcbiAgY29uc3QgZW5jcnlwdGVkUGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChwYXNzd29yZCwgc2FsdCk7XG4gIGxldCBleGlzdGluZ1VzZXI6IFVzZXJUeXBlIHwgbnVsbCA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBleGlzdGluZ1VzZXIgPSBhd2FpdCBnZXRVc2VyQnlBdHRyaWJ1dGVzKGNvbnRleHQsIHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSk7XG4gICAgY29uc3QgaXNDb250YWN0T25seVVzZXIgPSBleGlzdGluZ1VzZXI/LnR5cGUgPT09ICdjcm1Db250YWN0JyB8fCBCb29sZWFuKGV4aXN0aW5nVXNlcj8uc2hvcGlmeUN1c3RvbWVySWQpO1xuXG4gICAgaWYoZXhpc3RpbmdVc2VyICYmICFpc0NvbnRhY3RPbmx5VXNlcikge1xuICAgICAgdGhyb3cgbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGhvbmUsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuRVhJU1RJTkdfSVRFTVxuICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgcGhvbmVDb3VudHJ5Q29kZSA9IHBob25lPy5yZXBsYWNlKC9cXEQvZywgJycpLnN1YnN0cmluZygwLCAzKTtcbiAgY29uc3QgbG9jYWxlID0gZGV0ZWN0TGFuZ3VhZ2Uoe1xuICAgIC4uLmxhbmd1YWdlQ29udGV4dCxcbiAgICBwaG9uZUNvdW50cnlDb2RlOiBwaG9uZUNvdW50cnlDb2RlIHx8ICcnLFxuICAgIHVzZXJQcmVmZXJlbmNlOiBpbnNlcnRVc2VyLmxvY2FsZSB8fCAnZW4nXG4gIH0pO1xuICBjb25zdCB2ZXJpZmllZEVtYWlsQ29kZSA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcbiAgY29uc3QgdmVyaWZpZWRTbXNDb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICBjb25zdCBtYXJrZXRpbmdPcHRJbiA9IGluc2VydFVzZXIubWFya2V0aW5nT3B0SW4gPz8gaW5zZXJ0VXNlci5tYWlsaW5nTGlzdDtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgbWFya2V0aW5nRmllbGRzID0gbWFya2V0aW5nT3B0SW4gPT09IHRydWVcbiAgICA/IHtcbiAgICAgIG1haWxpbmdMaXN0OiB0cnVlLFxuICAgICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogaW5zZXJ0VXNlci5tYXJrZXRpbmdDb25zZW50U291cmNlIHx8IGV4aXN0aW5nVXNlcj8ubWFya2V0aW5nQ29uc2VudFNvdXJjZSB8fCAnYWNjb3VudC1zaWdudXAnLFxuICAgICAgbWFya2V0aW5nT3B0SW46IHRydWUsXG4gICAgICBtYXJrZXRpbmdPcHRJbkF0OiBpbnNlcnRVc2VyLm1hcmtldGluZ09wdEluQXQgfHwgZXhpc3RpbmdVc2VyPy5tYXJrZXRpbmdPcHRJbkF0IHx8IHRpbWVzdGFtcCxcbiAgICAgIG1hcmtldGluZ09wdE91dEF0OiB1bmRlZmluZWRcbiAgICB9XG4gICAgOiAobWFya2V0aW5nT3B0SW4gPT09IGZhbHNlID8ge1xuICAgICAgbWFpbGluZ0xpc3Q6IGZhbHNlLFxuICAgICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogaW5zZXJ0VXNlci5tYXJrZXRpbmdDb25zZW50U291cmNlIHx8ICdhY2NvdW50LXNpZ251cCcsXG4gICAgICBtYXJrZXRpbmdPcHRJbjogZmFsc2UsXG4gICAgICBtYXJrZXRpbmdPcHRPdXRBdDogaW5zZXJ0VXNlci5tYXJrZXRpbmdPcHRPdXRBdCB8fCB0aW1lc3RhbXBcbiAgICB9IDoge30pO1xuXG4gIGNvbnN0IGluc2VydDogVXNlclR5cGUgPSB7XG4gICAgLi4uaW5zZXJ0VXNlcixcbiAgICBfa2V5OiBjcmVhdGVIYXNoKGhhc2hJZCksXG4gICAgYWN0aXZlOiB0cnVlLFxuICAgIGVtYWlsLFxuICAgIGxvY2FsZSxcbiAgICBwYXNzd29yZDogZW5jcnlwdGVkUGFzc3dvcmQsXG4gICAgcGhvbmUsXG4gICAgc2FsdCxcbiAgICB0eXBlOiAndXNlcicsXG4gICAgdXNlckFjY2VzczogVXNlckFjY2Vzcy5CQVNJQyxcbiAgICB1c2VybmFtZSxcbiAgICB2ZXJpZmllZEVtYWlsOiBmYWxzZSxcbiAgICB2ZXJpZmllZEVtYWlsQ29kZSxcbiAgICB2ZXJpZmllZFBob25lOiBmYWxzZSxcbiAgICB2ZXJpZmllZFNtc0NvZGUsXG4gICAgLi4ubWFya2V0aW5nRmllbGRzXG4gIH07XG5cbiAgY29uc3Qgc2F2ZVVzZXIgPSAoKTogUHJvbWlzZTxVc2VyVHlwZSB8IG51bGw+ID0+IHtcbiAgICBjb25zdCBleGlzdGluZ1VzZXJJZCA9IGV4aXN0aW5nVXNlcj8udXNlcklkIHx8IGV4aXN0aW5nVXNlcj8uX2tleTtcblxuICAgIGlmKCFleGlzdGluZ1VzZXJJZCkge1xuICAgICAgcmV0dXJuIGFkZEl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIGluc2VydCk7XG4gICAgfVxuXG4gICAgY29uc3Qge19rZXk6IF9nZW5lcmF0ZWRLZXksIC4uLnVwZ3JhZGVGaWVsZHN9ID0gaW5zZXJ0O1xuICAgIHJldHVybiB1cGRhdGVJdGVtPFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCBleGlzdGluZ1VzZXJJZCwgdXBncmFkZUZpZWxkcyk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IHNhdmVVc2VyKClcbiAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBzYXZlZFVzZXIgPSBwYXJzZVVzZXJTYWZlKHJlc3VsdCk7XG4gICAgICBjb25zdCBzYXZlZFVzZXJJZCA9IHNhdmVkVXNlcj8udXNlcklkIHx8IHNhdmVkVXNlcj8uX2tleTtcblxuICAgICAgaWYoIXNhdmVkVXNlciB8fCAhc2F2ZWRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHNhdmVkVXNlcjtcbiAgICAgIH1cblxuICAgICAgaWYoc2F2ZWRVc2VyLnBlcnNvbmFJZCkge1xuICAgICAgICByZXR1cm4gc2F2ZWRVc2VyO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwZXJzb25hID0gYXdhaXQgYWRkUGVyc29uYShjb250ZXh0LCB7dXNlcklkOiBzYXZlZFVzZXJJZH0pO1xuICAgICAgICBjb25zdCBwZXJzb25hSWQgPSBwZXJzb25hPy5wZXJzb25hSWQgfHwgcGVyc29uYT8uX2tleTtcblxuICAgICAgICBpZighcGVyc29uYUlkKSB7XG4gICAgICAgICAgcmV0dXJuIHNhdmVkVXNlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRVc2VyID0gYXdhaXQgdXBkYXRlSXRlbTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywgc2F2ZWRVc2VySWQsIHtwZXJzb25hSWR9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0VXNlciA9IHBhcnNlVXNlclNhZmUodXBkYXRlZFVzZXIpIHx8IHtcbiAgICAgICAgICAuLi5zYXZlZFVzZXIsXG4gICAgICAgICAgcGVyc29uYUlkXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFVzZXI7XG4gICAgICB9IGNhdGNoKHBlcnNvbmFFcnJvcikge1xuICAgICAgICBhd2FpdCBsb2dFcnJvcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIHBhcmFtczoge3VzZXJJZDogc2F2ZWRVc2VySWR9LFxuICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgIH0sIHBlcnNvbmFFcnJvciBhcyBFcnJvciwgY29udGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIHNhdmVkVXNlcjtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7dXNlcm5hbWV9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGVVc2VyJztcbiAgY29uc3QgdXBkYXRlZFVzZXIgPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHtwYXNzd29yZCwgX2tleSwgX2lkLCAuLi51cGRhdGVGaWVsZHN9ID0gdXBkYXRlZFVzZXI7XG4gIGNvbnN0IHtpZH0gPSB1cGRhdGVkVXNlcjtcbiAgY29uc3QgdXBkYXRlID0gey4uLnVwZGF0ZUZpZWxkc30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgdHJ5IHtcbiAgICBpZihwYXNzd29yZCkge1xuICAgICAgY29uc3QgZXhpc3RpbmdVc2VyID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICAgICAgUkVUVVJOIERPQ1VNRU5UKCR7aWR9KVxuICAgICAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZSB8IG51bGw7XG4gICAgICBjb25zdCBoYXNoSWQgPSBleGlzdGluZ1VzZXI/LnVzZXJuYW1lIHx8IGV4aXN0aW5nVXNlcj8ucGhvbmUgfHwgZXhpc3RpbmdVc2VyPy5lbWFpbCB8fCBpZCB8fCBfa2V5IHx8IF9pZCB8fCAnJztcbiAgICAgIGNvbnN0IHNhbHQgPSBleGlzdGluZ1VzZXI/LnNhbHQgfHwgY3JlYXRlSGFzaChgJHtoYXNoSWR9JHtwYXNzd29yZH1gLCAnJyk7XG5cbiAgICAgIHVwZGF0ZS5wYXNzd29yZCA9IGNyZWF0ZVBhc3N3b3JkKHBhc3N3b3JkLCBzYWx0KTtcblxuICAgICAgaWYoIWV4aXN0aW5nVXNlcj8uc2FsdCkge1xuICAgICAgICB1cGRhdGUuc2FsdCA9IHNhbHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlZFVzZXJSZXN1bHQgPSBhd2FpdCB1cGRhdGVJdGVtPFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCBpZCwgdXBkYXRlIGFzIFVzZXJUeXBlKTtcbiAgICByZXR1cm4gcGFyc2VVc2VyU2FmZSh1cGRhdGVkVXNlclJlc3VsdCkgYXMgVXNlclR5cGU7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJ9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBmb3Jnb3RQYXNzd29yZCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZm9yZ290UGFzc3dvcmQnO1xuICBjb25zdCB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBleGlzdGluZ1VzZXIgPSBhd2FpdCBnZXRVc2VyQnlBdHRyaWJ1dGVzKGNvbnRleHQsIHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSk7XG5cbiAgICBpZihleGlzdGluZ1VzZXIpIHtcbiAgICAgIGNvbnN0IHtlbWFpbCwgcGhvbmUsIHZlcmlmaWVkRW1haWwsIHZlcmlmaWVkUGhvbmV9ID0gZXhpc3RpbmdVc2VyIGFzIFVzZXJUeXBlO1xuICAgICAgY29uc3QgY29kZUV4cGlyZXMgPSBEYXRlLm5vdygpICsgKDEwMDAgKiA2MCAqIDE1KTtcbiAgICAgIGNvbnN0IGNvZGUgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG4gICAgICBsZXQgdXBkYXRlO1xuXG4gICAgICBpZihlbWFpbCAmJiB2ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgIHNlbmRFbWFpbCh7XG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBodG1sOiBgPHA+WW91ciBwYXNzd29yZCByZXNldCBjb2RlIGlzIDxzdHJvbmc+JHtjb2RlfTwvc3Ryb25nPi48L3A+YCxcbiAgICAgICAgICBzdWJqZWN0OiBgJHtnZXRBcHBUaXRsZShnZXRBcHBOYW1lKGNvbnRleHQpKX0gcGFzc3dvcmQgcmVzZXQgY29kZWAsXG4gICAgICAgICAgdGV4dDogYFlvdXIgY29kZSBpcyAke2NvZGV9YCxcbiAgICAgICAgICB1c2VyOiBleGlzdGluZ1VzZXJcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZSA9IHt2ZXJpZmllZEVtYWlsQ29kZTogY29kZSwgdmVyaWZpZWRFbWFpbEV4cGlyZXM6IGNvZGVFeHBpcmVzfTtcbiAgICAgIH1cblxuICAgICAgaWYocGhvbmUgJiYgdmVyaWZpZWRQaG9uZSkge1xuICAgICAgICBzZW5kU21zKHtcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHRleHQ6IGBZb3VyIGNvZGUgaXMgJHtjb2RlfWBcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZSA9IHt2ZXJpZmllZFBob25lRXhwaXJlczogY29kZUV4cGlyZXMsIHZlcmlmaWVkU21zQ29kZTogY29kZX07XG4gICAgICB9XG5cbiAgICAgIGlmKHVwZGF0ZT8udmVyaWZpZWRFbWFpbENvZGUgfHwgdXBkYXRlPy52ZXJpZmllZFNtc0NvZGUpIHtcbiAgICAgICAgY29uc3QgdXNlckRvY0lkID0gZ2V0RG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIGV4aXN0aW5nVXNlcik7XG5cbiAgICAgICAgYXdhaXQgdXBkYXRlSXRlbTxVc2VyVHlwZT4oY29udGV4dCwgQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJEb2NJZCwgdXBkYXRlKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtjb2RlLCB1c2VyfToge2NvZGU6IG51bWJlcjsgdXNlcjogVXNlclR5cGU7fVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdyZXNldFBhc3N3b3JkJztcbiAgY29uc3Qge2VtYWlsLCBwYXNzd29yZCwgcGhvbmUsIHVzZXJuYW1lfSA9IHBhcnNlVXNlcih1c2VyKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQgPSBwYXJzZVBhc3N3b3JkKHBhc3N3b3JkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGV4aXN0aW5nVXNlciA9IGF3YWl0IGdldFVzZXJCeUF0dHJpYnV0ZXMoY29udGV4dCwge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9KTtcblxuICAgIGlmKGV4aXN0aW5nVXNlcikge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzYWx0LFxuICAgICAgICB2ZXJpZmllZEVtYWlsQ29kZSxcbiAgICAgICAgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPSAwLFxuICAgICAgICB2ZXJpZmllZFNtc0NvZGUsXG4gICAgICAgIHZlcmlmaWVkUGhvbmVFeHBpcmVzID0gMFxuICAgICAgfSA9IGV4aXN0aW5nVXNlciBhcyBVc2VyVHlwZTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBsZXQgdXBkYXRlO1xuXG4gICAgICBpZihlbWFpbCAmJiBjb2RlID09PSB2ZXJpZmllZEVtYWlsQ29kZSAmJiB2ZXJpZmllZEVtYWlsRXhwaXJlcyA+IG5vdykge1xuICAgICAgICBjb25zdCBwYXNzd29yZCA9IGNyZWF0ZVBhc3N3b3JkKGZvcm1hdFBhc3N3b3JkLCBzYWx0KTtcbiAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYocGhvbmUgJiYgY29kZSA9PT0gdmVyaWZpZWRTbXNDb2RlICYmIHZlcmlmaWVkUGhvbmVFeHBpcmVzID4gbm93KSB7XG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICAgICAgICB1cGRhdGUgPSB7cGFzc3dvcmR9O1xuICAgICAgfVxuXG4gICAgICBpZih1cGRhdGUpIHtcbiAgICAgICAgY29uc3QgdXNlckRvY0lkID0gZ2V0RG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIGV4aXN0aW5nVXNlcik7XG5cbiAgICAgICAgYXdhaXQgdXBkYXRlSXRlbTxVc2VyVHlwZT4oY29udGV4dCwgQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJEb2NJZCwgdXBkYXRlKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2VuZFZlcmlmaWNhdGlvbkVtYWlsID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdzZW5kVmVyaWZpY2F0aW9uRW1haWwnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtlbWFpbH0gPSBwYXJzZVVzZXIodXNlcik7XG5cbiAgaWYoIWVtYWlsKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWx9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB2ZXJpZmllZEVtYWlsQ29kZSA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcbiAgICBjb25zdCB1cGRhdGVRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICBGT1IgdSBJTiAke3VzZXJzQ29sbGVjdGlvbn1cbiAgICAgICAgRklMVEVSIHUuZW1haWwgPT0gJHtlbWFpbH1cbiAgICAgICAgRklMVEVSIHUudmVyaWZpZWRFbWFpbCAhPSB0cnVlXG4gICAgICAgIEZJTFRFUiAhSEFTKHUsIFwidmVyaWZpZWRFbWFpbEV4cGlyZXNcIikgfHwgdS52ZXJpZmllZEVtYWlsRXhwaXJlcyA8PSAke25vd31cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBVUERBVEUgdSBXSVRIICR7e1xuICAgICAgICAgIHZlcmlmaWVkRW1haWxDb2RlLFxuICAgICAgICAgIHZlcmlmaWVkRW1haWxFeHBpcmVzOiBub3cgKyBWRVJJRklDQVRJT05fRU1BSUxfQ09PTERPV05fTVNcbiAgICAgICAgfX0gSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICAgIFJFVFVSTiBORVdcbiAgICBgO1xuXG4gICAgY29uc3QgY3Vyc29yID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeSh1cGRhdGVRdWVyeSk7XG4gICAgY29uc3QgcmF3VXNlciA9IGF3YWl0IGN1cnNvci5uZXh0KCk7XG4gICAgY29uc3QgZm91bmRVc2VyID0gcmF3VXNlciA/IHBhcnNlVXNlcihyYXdVc2VyKSA6IG51bGw7XG5cbiAgICBpZighZm91bmRVc2VyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHNlbmRFbWFpbCh7XG4gICAgICBjb250ZXh0LFxuICAgICAgLi4uYnVpbGRWZXJpZmljYXRpb25FbWFpbChjb250ZXh0LCB2ZXJpZmllZEVtYWlsQ29kZSwgdXNlciksXG4gICAgICB1c2VyOiB7XG4gICAgICAgIC4uLmZvdW5kVXNlcixcbiAgICAgICAgdmVyaWZpZWRFbWFpbENvZGVcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWx9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb25maXJtQ29kZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvZGUsXG4gICAgdHlwZSxcbiAgICB2YWx1ZVxuICB9OiB7XG4gICAgY29kZTogbnVtYmVyO1xuICAgIHR5cGU6ICdzbXMnIHwgJ2VtYWlsJztcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9XG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2NvbmZpcm1Db2RlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBpc1NtcyA9IHR5cGUgPT09ICdzbXMnO1xuICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGlzU21zID8gcGFyc2VQaG9uZSh2YWx1ZSkgOiBwYXJzZUVtYWlsKHZhbHVlKTtcbiAgY29uc3QgZmlsdGVyQnlUeXBlID0gaXNTbXNcbiAgICA/IGFxbGBGSUxURVIgdS5waG9uZSA9PSAke2Zvcm1hdHRlZFZhbHVlfSAmJiB1LnZlcmlmaWVkU21zQ29kZSA9PSAke2NvZGV9YFxuICAgIDogYXFsYEZJTFRFUiB1LmVtYWlsID09ICR7Zm9ybWF0dGVkVmFsdWV9ICYmIHUudmVyaWZpZWRFbWFpbENvZGUgPT0gJHtjb2RlfWA7XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgdSBJTiAke3VzZXJzQ29sbGVjdGlvbn1cbiAgICAgICR7ZmlsdGVyQnlUeXBlfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIHVcbiAgYDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC50aGVuKCh1c2VyKSA9PiB7XG4gICAgICAgIGlmKHVzZXIpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkVXNlciA9IGlzU21zXG4gICAgICAgICAgICA/IHt2ZXJpZmllZFBob25lOiB0cnVlLCB2ZXJpZmllZFNtc0NvZGU6IDB9XG4gICAgICAgICAgICA6IHt2ZXJpZmllZEVtYWlsOiB0cnVlLCB2ZXJpZmllZEVtYWlsQ29kZTogMH07XG4gICAgICAgICAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3VzZXIuX2tleX0gV0lUSCAke3VwZGF0ZWRVc2VyfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICAgIHBhcmFtczoge2NvZGUsIHR5cGUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZX0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2NvZGUsIHR5cGUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKCR7aWR9KVxuICAgIFJFTU9WRSB1IElOIHVzZXJzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXNlcikgPT4gcGFyc2VVc2VyU2FmZSh1c2VyKSlcbiAgICAudGhlbigoZGVsZXRlZFVzZXIpID0+IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuZGVsKGRlbGV0ZWRVc2VyPy5zdHJpcGVDdXN0b21lcklkKVxuICAgICAgLnRoZW4oKCkgPT4gc3RyaXBlQ2xpZW50LmFjY291bnRzLmRlbChkZWxldGVkVXNlcj8uc3RyaXBlQWNjb3VudElkKSlcbiAgICAgIC50aGVuKCgpID0+IGRlbGV0ZWRVc2VyIGFzIFVzZXJUeXBlKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVhY3RpdmF0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWFjdGl2YXRlVXNlcic7XG4gIGNvbnN0IHtpZH0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHVwZGF0ZWQ6IFVzZXJUeXBlID0ge1xuICAgIGFjdGl2ZTogZmFsc2VcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlSXRlbTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywgaWQsIHVwZGF0ZWQpXG4gICAgLnRoZW4oKHVwZGF0ZWRVc2VyKSA9PiBwYXJzZVVzZXJTYWZlKHVwZGF0ZWRVc2VyKSBhcyBVc2VyVHlwZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckRpc3BsYXlOYW1lID0gKHVzZXI6IFVzZXJUeXBlKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge2ZpcnN0TmFtZSwgbGFzdE5hbWUsIG5hbWUgPSAnJywgdXNlcm5hbWUgPSAnJ30gPSB1c2VyO1xuICBjb25zdCBmdWxsbmFtZSA9IChbZmlyc3ROYW1lLCBsYXN0TmFtZV0pLmpvaW4oJyAnKS50cmltKCk7XG5cbiAgaWYobmFtZSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9IGVsc2UgaWYoZnVsbG5hbWUgIT09ICcnKSB7XG4gICAgcmV0dXJuIGZ1bGxuYW1lO1xuICB9IGVsc2UgaWYodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdXNlcm5hbWU7XG4gIH1cblxuICByZXR1cm4gJ1Vua25vd24nO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNlc3Npb25Vc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRTZXNzaW9uVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkID0gcGFyc2VBcmFuZ29JZChgdXNlcnMvJHtzZXNzaW9uSWR9YCk7XG5cbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIExFVCB1ID0gRE9DVU1FTlQoJHtmb3JtYXRTZXNzaW9uSWR9KVxuICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICBSRVRVUk4gJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ3UnKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyKSA9PiBwYXJzZVVzZXJTYWZlKHVzZXIpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckJ5SWQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyQnlJZCc7XG4gIGNvbnN0IHtlbWFpbCwgaWQsIHBob25lLCB1c2VySWQsIHVzZXJuYW1lfSA9IHBhcnNlVXNlcih1c2VyKTtcbiAgY29uc3Qge2ZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcblxuICBpZihpZCkge1xuICAgIHJldHVybiBnZXRJdGVtQnk8VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIHtcbiAgICAgIGxvZ2ljOiAnQU5EJyxcbiAgICAgIGNvbmRpdGlvbnM6IFtcbiAgICAgICAge2ZpZWxkOiAnX2lkJywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiBpZH0sXG4gICAgICAgIHtmaWVsZDogJ2FjdGl2ZScsIG9wZXJhdG9yOiAnIT0nLCB2YWx1ZTogZmFsc2V9XG4gICAgICBdXG4gICAgfSBhcyBhbnksIHtcbiAgICAgIGN1c3RvbVF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXMsXG4gICAgICBjdXN0b21PYmplY3RzOiBzZWxlY3RPYmplY3RzXG4gICAgfSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHBhcnNlVXNlclNhZmUocmVzdWx0KSBhcyBVc2VyVHlwZSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge2lkLCB1c2VySWQsIHVzZXJuYW1lfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJzID0gYnVpbGRVc2VyQXR0cmlidXRlRmlsdGVycyh7ZW1haWwsIHBob25lLCB1c2VySWQsIHVzZXJuYW1lfSwge2FjdGl2ZTogdHJ1ZX0pO1xuXG4gIGlmKGZpbHRlcnMuY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwgYXMgdW5rbm93biBhcyBVc2VyVHlwZSk7XG4gIH1cblxuICByZXR1cm4gZ2V0SXRlbUJ5PFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCBmaWx0ZXJzLCB7XG4gICAgY3VzdG9tUXVlcmllczogc2VsZWN0UXVlcmllcyxcbiAgICBjdXN0b21PYmplY3RzOiBzZWxlY3RPYmplY3RzXG4gIH0pXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4gcGFyc2VVc2VyU2FmZShyZXN1bHQpIGFzIFVzZXJUeXBlKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2lkLCB1c2VySWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyTGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogVXNlck9wdGlvbnMpOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJMaXN0JztcbiAgY29uc3Qge2ZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHVzZXJuYW1lfSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBjb25kaXRpb25zOiBhbnlbXSA9IFtcbiAgICB7ZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJyE9JywgdmFsdWU6IGZhbHNlfVxuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKHtmaWVsZDogJ3VzZXJuYW1lJywgb3BlcmF0b3I6ICdDT05UQUlOUycsIHZhbHVlOiBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKSwgY2FzZVNlbnNpdGl2ZTogZmFsc2V9KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMaXN0Qnk8VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIHtcbiAgICBsb2dpYzogJ0FORCcsXG4gICAgY29uZGl0aW9uc1xuICB9IGFzIGFueSwge1xuICAgIHNvcnQ6IFt7ZmllbGQ6ICd1c2VybmFtZScsIGRpcmVjdGlvbjogJ0FTQyd9XSxcbiAgICBsaW1pdDoge2Zyb206IGxpbWl0LnN0YXJ0LCB0bzogbGltaXQuc3RhcnQgKyBsaW1pdC5udW19LFxuICAgIGN1c3RvbVF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXMsXG4gICAgY3VzdG9tT2JqZWN0czogc2VsZWN0T2JqZWN0c1xuICB9KVxuICAgIC50aGVuKChyZXN1bHQpID0+IHBhcnNlVXNlckxpc3QocmVzdWx0KSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyTGlzdEJ5UmVhY3Rpb25zID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7cmVhY3Rpb25zID0gW10sIHVzZXJuYW1lfToge3JlYWN0aW9ucz86IHN0cmluZ1tdOyB1c2VybmFtZT86IHN0cmluZ30sXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyTGlzdEJ5UmVhY3Rpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmdbXSA9IHJlYWN0aW9ucy5tYXAoKHJlYWN0aW9uTmFtZTogc3RyaW5nKSA9PiBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMikudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAndS5hY3RpdmUgIT0gZmFsc2UnLFxuICAgIGBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFJlYWN0aW9ucyl9LCBMT1dFUihyLm5hbWUpKWBcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtmb3JtYXRVc2VybmFtZX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgdSwgciBJTiBPVVRCT1VORCAke2Zvcm1hdFNlc3Npb25JZH0gJHtoYXNSZWFjdGlvbkNvbGxlY3Rpb259XG4gICAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogJHtDT0xMRUNUSU9OUy5VU0VSU319XG4gICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlckJ5LmpvaW4oJyAmJiAnKSl9XG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIFJFVFVSTiAke3NlbGVjdE9iamVjdHMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWApIDogbGl0ZXJhbCgndScpfVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigodXNlcnMpID0+IHBhcnNlVXNlckxpc3QodXNlcnMpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJMaXN0QnlUYWdzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7dGFncywgdXNlcm5hbWV9LFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3RCeVRhZ3MnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRUYWdzOiBzdHJpbmdbXSA9IHRhZ3M/LnJlZHVjZSgobGlzdDogc3RyaW5nW10sIHRhZ05hbWU6IHN0cmluZykgPT4ge1xuICAgIGlmKHRhZ05hbWUpIHtcbiAgICAgIGxpc3QucHVzaChwYXJzZUNoYXIodGFnTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9LCBbXSk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWUgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgIGB1Ll9rZXkgIT0gXCIke3Nlc3Npb25JZH1cImAsXG4gICAgJ3UuYWN0aXZlICE9IGZhbHNlJ1xuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB0IElOIHRhZ3NcbiAgICAgIEZJTFRFUiBQT1NJVElPTigke2Zvcm1hdFRhZ3N9LCBMT1dFUih0Lm5hbWUpKVxuICAgICAgRk9SIHUsIGl0IElOIE9VVEJPVU5EIHQgJHtpc1RhZ2dlZENvbGxlY3Rpb259XG4gICAgICAgIE9QVElPTlMge2JmczogdHJ1ZSwgdW5pcXVlVmVydGljZXM6IFwiZ2xvYmFsXCIsIHZlcnRleENvbGxlY3Rpb25zOiAke0NPTExFQ1RJT05TLlVTRVJTfX1cbiAgICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlckJ5LmpvaW4oJyAmJiAnKSl9XG4gICAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgICBSRVRVUk4gRElTVElOQ1QgJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ3UnKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHVzZXJzKSA9PiBwYXJzZVVzZXJMaXN0KHVzZXJzKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyTGlzdEJ5TGF0ZXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHt1c2VybmFtZX0sIG9wdGlvbnM/OiBVc2VyT3B0aW9ucyk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3RCeUxhdGVzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZmlsdGVyID0gW1xuICAgICd1Ll9pZCAhPSBzZXNzaW9uLl9pZCcsXG4gICAgJ3UuYWN0aXZlICE9IGZhbHNlJ1xuICBdO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlci5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgdSBJTiAke3VzZXJzQ29sbGVjdGlvbn1cbiAgICAgIExFVCBzZXNzaW9uID0gRE9DVU1FTlQoJHtgdXNlcnMvJHt1c2VySWR9YH0pXG4gICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlci5qb2luKCcgJiYgJykpfVxuICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UodS5sYXRpdHVkZSB8fCAwLCB1LmxvbmdpdHVkZSB8fCAwLCBzZXNzaW9uLmxhdGl0dWRlIHx8IDAsIHNlc3Npb24ubG9uZ2l0dWRlIHx8IDApXG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIFNPUlQgZGlzdGFuY2UgQVNDLCB1LmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiAke3NlbGVjdE9iamVjdHMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWApIDogbGl0ZXJhbCgndScpfVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigodXNlcnMpID0+IHBhcnNlVXNlckxpc3QodXNlcnMpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJMaXN0QnlDb25uZWN0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7dXNlcklkfTogVXNlclR5cGUsXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyTGlzdEJ5Q29ubmVjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHVzZXJuYW1lfSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3VzZXJJZH1gKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICd1LmFjdGl2ZSAhPSBmYWxzZSdcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgY3UgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKCR7Zm9ybWF0VXNlcklkfSlcbiAgICAgIEZPUiB1LCBjb25uZWN0aW9uIElOIE9VVEJPVU5EIGN1ICR7aGFzQ29ubmVjdGlvbkNvbGxlY3Rpb259XG4gICAgICAgIE9QVElPTlMge2JmczogdHJ1ZSwgdW5pcXVlVmVydGljZXM6IFwiZ2xvYmFsXCIsIHZlcnRleENvbGxlY3Rpb25zOiAke0NPTExFQ1RJT05TLlVTRVJTfX1cbiAgICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlckJ5LmpvaW4oJyAmJiAnKSl9XG4gICAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgICBSRVRVUk4gRElTVElOQ1QgJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ3UnKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHVzZXJzKSA9PiBwYXJzZVVzZXJMaXN0KHVzZXJzKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWZyZXNoU2Vzc2lvbiA9ICh7ZXhwaXJlcywgdG9rZW59KTogU2Vzc2lvblRva2VuIHwgU2Vzc2lvbkVycm9yID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7cGVyc29uYUlkLCB1c2VySWQsIHVzZXJuYW1lLCB1c2VyQWNjZXNzfSA9IGdldFNlc3Npb24odG9rZW4pO1xuICAgIHJldHVybiBjcmVhdGVVc2VyVG9rZW4odXNlcklkLCBwZXJzb25hSWQgfHwgJycsIHVzZXJuYW1lLCB1c2VyQWNjZXNzLCBleHBpcmVzKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0aGUgZXJyb3IgZnJvbSBnZXRTZXNzaW9uXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduSW4gPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwge2V4cGlyZXMsIHVzZXJ9KTogUHJvbWlzZTxTZXNzaW9uVG9rZW4gfCBudWxsPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdzaWduSW4nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtlbWFpbCwgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZX0gPSB1c2VyIHx8IHt9O1xuICBjb25zdCBmb3JtYXRFbWFpbCA9IHBhcnNlRW1haWwoZW1haWwpO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZSA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmb3JtYXRQYXNzd29yZCA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBmb3JtYXRQaG9uZSA9IHBhcnNlUGhvbmUocGhvbmUpO1xuICBjb25zdCBmb3JtYXRFeHBpcmVzID0gcGFyc2VOdW0oZXhwaXJlcykgfHwgMTU7XG5cbiAgaWYoZm9ybWF0VXNlcm5hbWUgPT09IEFETUlOX1VTRVJOQU1FKSB7XG4gICAgaWYoIWlzQWRtaW5QYXNzd29yZChwYXNzd29yZCkpIHtcbiAgICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJuYW1lOiBmb3JtYXRVc2VybmFtZX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT05cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVVc2VyVG9rZW4oQURNSU5fVVNFUk5BTUUsICcnLCBBRE1JTl9VU0VSTkFNRSwgVXNlckFjY2Vzcy5BRE1JTiwgZm9ybWF0RXhwaXJlcyk7XG4gIH1cblxuICBpZigoIWZvcm1hdFVzZXJuYW1lICYmICFmb3JtYXRFbWFpbCAmJiAhZm9ybWF0UGhvbmUpIHx8ICFmb3JtYXRQYXNzd29yZCkge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBmb3JtYXRFbWFpbCwgZm9ybWF0UGhvbmUsIGZvcm1hdFVzZXJuYW1lLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcnMgPSBidWlsZFVzZXJBdHRyaWJ1dGVGaWx0ZXJzKHtcbiAgICBlbWFpbDogZm9ybWF0RW1haWwsXG4gICAgcGhvbmU6IGZvcm1hdFBob25lLFxuICAgIHVzZXJuYW1lOiBmb3JtYXRVc2VybmFtZVxuICB9KTtcbiAgY29uc3QgZmlsdGVyQ2xhdXNlID0gYnVpbGRGaWx0ZXJDbGF1c2UoZmlsdGVycywgJ3UnKTtcblxuICBjb25zdCBjaGVja1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgdSBJTiAke3VzZXJzQ29sbGVjdGlvbn1cbiAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyQ2xhdXNlKX1cbiAgICAgIFJFVFVSTiB1XG4gIGA7XG5cbiAgbGV0IGNoZWNrVXNlcnM6IFVzZXJUeXBlW107XG5cbiAgdHJ5IHtcbiAgICBjaGVja1VzZXJzID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShjaGVja1F1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBjaGVja1VzZXIgPSBjaGVja1VzZXJzLmZpbmQoKHVzZXJJdGVtID0ge30pID0+IHtcbiAgICBjb25zdCB7cGFzc3dvcmQ6IHZhbGlkUGFzc3dvcmQsIHNhbHR9ID0gdXNlckl0ZW0gYXMgVXNlclR5cGU7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsaWRQYXNzd29yZCAmJiBzYWx0ICYmIHZhbGlkUGFzc3dvcmQgPT09IGNyZWF0ZVBhc3N3b3JkKGZvcm1hdFBhc3N3b3JkLCBzYWx0KSk7XG4gIH0pO1xuXG4gIGlmKCFjaGVja1VzZXIpIHtcbiAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT05cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGlmKGNoZWNrVXNlci5hY3RpdmUgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgX2tleTogdXNlcklkLFxuICAgIHBlcnNvbmFJZCxcbiAgICB1c2VyQWNjZXNzLFxuICAgIHVzZXJuYW1lOiBjaGVja1VzZXJuYW1lXG4gIH0gPSBjaGVja1VzZXIgYXMgVXNlclR5cGU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNyZWF0ZVVzZXJUb2tlbih1c2VySWQgfHwgJycsIHBlcnNvbmFJZCB8fCAnJywgY2hlY2tVc2VybmFtZSB8fCAnJywgdXNlckFjY2VzcywgZm9ybWF0RXhwaXJlcyk7XG5cbiAgICByZXR1cm4gdG9rZW47XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduT3V0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3NpZ25PdXQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBsYXN0T25saW5lOiBEYXRlLm5vdygpLFxuICAgIHNlc3Npb25JZDogbnVsbFxuICB9O1xuICBjb25zdCBzZXNzaW9uUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShzZXNzaW9uUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZVVzZXJDb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEFjdGl2ZVVzZXJDb3VudCc7XG5cbiAgcmV0dXJuIGNvdW50SXRlbXMoY29udGV4dCwgJ3VzZXJzJywge1xuICAgIGxvZ2ljOiAnQU5EJyxcbiAgICBjb25kaXRpb25zOiBbe2ZpZWxkOiAnYWN0aXZlJywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiB0cnVlfV1cbiAgfSBhcyBhbnkpXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJCeVRva2VuID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyQnlUb2tlbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJJZH0gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgY29uc3QgdXNlckRvY0lkID0gcGFyc2VBcmFuZ29JZChgdXNlcnMvJHt1c2VySWR9YCk7XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKFwiJHt1c2VyRG9jSWR9XCIpIFJFVFVSTiB1YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyKSA9PiB7XG4gICAgICBpZih1c2VyPy5hY3RpdmUgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIHBhcmFtczoge3VzZXJJZH0sXG4gICAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgICAgICB9LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlVXNlclNhZmUodXNlcikgYXMgVXNlclR5cGU7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VySWR9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTtcbiJdLCJuYW1lcyI6WyJwYXJzZU51bSIsImNyZWF0ZUhhc2giLCJjcmVhdGVQYXNzd29yZCIsInBhcnNlQXJhbmdvSWQiLCJwYXJzZUNoYXIiLCJwYXJzZUVtYWlsIiwicGFyc2VQYXNzd29yZCIsInBhcnNlUGhvbmUiLCJwYXJzZVVzZXJuYW1lIiwiYXFsIiwibGl0ZXJhbCIsImNyZWF0ZUNyeXB0b0hhc2giLCJ0aW1pbmdTYWZlRXF1YWwiLCJEYXRlVGltZSIsInBhcnNlVXNlciIsInBhcnNlVXNlclNhZmUiLCJDb25maWciLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwidmVyaWZ5RW1haWxUZW1wbGF0ZSIsIkVycm9yVHlwZXMiLCJsb2dFcnJvciIsImxvZ0V4Y2VwdGlvbiIsImJ1aWxkRmlsdGVyQ2xhdXNlIiwiYnVpbGRQcmVzZW50RmlsdGVyR3JvdXAiLCJnZXREb2NJZCIsImdldExpbWl0Iiwic2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSIsInVzZURiIiwiZGV0ZWN0TGFuZ3VhZ2UiLCJnZXRTZXNzaW9uIiwic2V0U2Vzc2lvbiIsImdldFN0cmlwZUNsaWVudCIsImFkZEl0ZW0iLCJjb3VudEl0ZW1zIiwiZ2V0SXRlbUJ5IiwiZ2V0TGlzdEJ5IiwidXBkYXRlSXRlbSIsInNlbmRFbWFpbCIsImFkZFBlcnNvbmEiLCJzZW5kU21zIiwiZXZlbnRDYXRlZ29yeSIsIkFETUlOX1VTRVJOQU1FIiwiVkVSSUZJQ0FUSU9OX0VNQUlMX0NPT0xET1dOX01TIiwidXNlcnNDb2xsZWN0aW9uIiwiVVNFUlMiLCJoYXNSZWFjdGlvbkNvbGxlY3Rpb24iLCJIQVNfUkVBQ1RJT04iLCJpc1RhZ2dlZENvbGxlY3Rpb24iLCJJU19UQUdHRUQiLCJoYXNDb25uZWN0aW9uQ29sbGVjdGlvbiIsIkhBU19DT05ORUNUSU9OIiwiaXNBZG1pblBhc3N3b3JkIiwicGFzc3dvcmQiLCJhZG1pblBhc3N3b3JkIiwicHJvY2VzcyIsImVudiIsIkFETUlOX1BBU1NXT1JEIiwiYWN0dWFsIiwidXBkYXRlIiwiZGlnZXN0IiwiZXhwZWN0ZWQiLCJnZXRBcHBOYW1lIiwiY29udGV4dCIsImNvbmZpZyIsImRldGFpbHMiLCJuYW1lIiwiZ2V0IiwiZ2V0QXBwVGl0bGUiLCJhcHBOYW1lIiwic3BsaXQiLCJtYXAiLCJwYXJ0IiwidGVzdCIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJqb2luIiwiYnVpbGRWZXJpZmljYXRpb25FbWFpbCIsInZlcmlmaWVkRW1haWxDb2RlIiwidXNlciIsImFwcFRpdGxlIiwiY29kZSIsInBhcnNlRW1haWxUZW1wbGF0ZSIsInRlbXBsYXRlIiwicmVwbGFjZUFsbCIsImh0bWwiLCJ2ZXJpZmljYXRpb25FbWFpbFRlbXBsYXRlIiwic3ViamVjdCIsInZlcmlmaWNhdGlvbkVtYWlsU3ViamVjdCIsInRleHQiLCJ2ZXJpZmljYXRpb25FbWFpbFRleHQiLCJVc2VyQWNjZXNzIiwiY3JlYXRlVXNlclRva2VuIiwidXNlcklkIiwicGVyc29uYUlkIiwidXNlcm5hbWUiLCJ1c2VyQWNjZXNzIiwiZXhwaXJlc0luTWludXRlcyIsIm5vdyIsImxvY2FsIiwic2Vzc2lvbkV4cGlyZXMiLCJwbHVzIiwibWludXRlcyIsImlhdCIsIk1hdGgiLCJmbG9vciIsInRvU2Vjb25kcyIsImV4cCIsInRva2VuIiwiZXhwaXJlcyIsInRvTWlsbGlzIiwiaXNzdWVkIiwicGFyc2VVc2VyTGlzdCIsInVzZXJzIiwicmVkdWNlIiwicmVzdWx0IiwicGFyc2VkVXNlciIsInB1c2giLCJidWlsZFVzZXJBdHRyaWJ1dGVGaWx0ZXJzIiwiZW1haWwiLCJwaG9uZSIsImFjdGl2ZSIsImF0dHJpYnV0ZUZpbHRlcnMiLCJfa2V5IiwibG9naWMiLCJjb25kaXRpb25zIiwibGVuZ3RoIiwiZmllbGQiLCJvcGVyYXRvciIsInZhbHVlIiwiZ2V0VXNlckJ5QXR0cmlidXRlcyIsIm9wdGlvbnMiLCJmaWx0ZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRVc2VyT3B0aW9uYWxGaWVsZHMiLCJmaWVsZHMiLCJzZWxlY3RzIiwiaW5jbHVkZXMiLCJvYmplY3RzIiwicXVlcmllcyIsInBhcnNlVXNlck9wdGlvbnMiLCJmcm9tIiwidG8iLCJsaW1pdCIsImFkZFVzZXIiLCJhY3Rpb24iLCJsYW5ndWFnZUNvbnRleHQiLCJjb25maXJtIiwiX2NvbmZpcm0iLCJuZXdVc2VyIiwiX2lkIiwiaW5zZXJ0VXNlciIsImhhc1Bhc3N3b3JkIiwiaGFzVXNlcm5hbWUiLCJjYXRlZ29yeSIsInBhcmFtcyIsIklOVkFMSURfQVJHVU1FTlRTIiwiaGFzaElkIiwic2FsdCIsImVuY3J5cHRlZFBhc3N3b3JkIiwiZXhpc3RpbmdVc2VyIiwiaXNDb250YWN0T25seVVzZXIiLCJ0eXBlIiwiQm9vbGVhbiIsInNob3BpZnlDdXN0b21lcklkIiwiRVhJU1RJTkdfSVRFTSIsImVycm9yIiwiREFUQUJBU0VfRVJST1IiLCJwaG9uZUNvdW50cnlDb2RlIiwicmVwbGFjZSIsInN1YnN0cmluZyIsImxvY2FsZSIsInVzZXJQcmVmZXJlbmNlIiwicmFuZG9tIiwidmVyaWZpZWRTbXNDb2RlIiwibWFya2V0aW5nT3B0SW4iLCJtYWlsaW5nTGlzdCIsInRpbWVzdGFtcCIsIkRhdGUiLCJtYXJrZXRpbmdGaWVsZHMiLCJtYXJrZXRpbmdDb25zZW50U291cmNlIiwibWFya2V0aW5nT3B0SW5BdCIsIm1hcmtldGluZ09wdE91dEF0IiwidW5kZWZpbmVkIiwiaW5zZXJ0IiwidmVyaWZpZWRFbWFpbCIsInZlcmlmaWVkUGhvbmUiLCJzYXZlVXNlciIsImV4aXN0aW5nVXNlcklkIiwiX2dlbmVyYXRlZEtleSIsInVwZ3JhZGVGaWVsZHMiLCJ0aGVuIiwic2F2ZWRVc2VyIiwic2F2ZWRVc2VySWQiLCJwZXJzb25hIiwidXBkYXRlZFVzZXIiLCJyZXN1bHRVc2VyIiwicGVyc29uYUVycm9yIiwiY2F0Y2giLCJ1cGRhdGVVc2VyIiwidXBkYXRlRmllbGRzIiwiaWQiLCJkYXRhYmFzZU5hbWUiLCJxdWVyeSIsImN1cnNvciIsIm5leHQiLCJ1cGRhdGVkVXNlclJlc3VsdCIsImZvcmdvdFBhc3N3b3JkIiwiY29kZUV4cGlyZXMiLCJ2ZXJpZmllZEVtYWlsRXhwaXJlcyIsInZlcmlmaWVkUGhvbmVFeHBpcmVzIiwidXNlckRvY0lkIiwicmVzZXRQYXNzd29yZCIsImZvcm1hdFBhc3N3b3JkIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwidXBkYXRlUXVlcnkiLCJyYXdVc2VyIiwiZm91bmRVc2VyIiwiY29uZmlybUNvZGUiLCJpc1NtcyIsImZvcm1hdHRlZFZhbHVlIiwiZmlsdGVyQnlUeXBlIiwiYXFsUXVlcnkiLCJkZWxldGVVc2VyIiwic3RyaXBlQ2xpZW50IiwiZGVsZXRlZFVzZXIiLCJjdXN0b21lcnMiLCJkZWwiLCJzdHJpcGVDdXN0b21lcklkIiwiYWNjb3VudHMiLCJzdHJpcGVBY2NvdW50SWQiLCJkZWFjdGl2YXRlVXNlciIsInVwZGF0ZWQiLCJnZXRVc2VyRGlzcGxheU5hbWUiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsImZ1bGxuYW1lIiwidHJpbSIsImdldFNlc3Npb25Vc2VyIiwic2Vzc2lvbiIsInNlc3Npb25JZCIsInNlbGVjdE9iamVjdHMiLCJzZWxlY3RRdWVyaWVzIiwiZm9ybWF0U2Vzc2lvbklkIiwiZ2V0VXNlckJ5SWQiLCJjdXN0b21RdWVyaWVzIiwiY3VzdG9tT2JqZWN0cyIsImdldFVzZXJMaXN0IiwiY2FzZVNlbnNpdGl2ZSIsInNvcnQiLCJkaXJlY3Rpb24iLCJzdGFydCIsIm51bSIsImdldFVzZXJMaXN0QnlSZWFjdGlvbnMiLCJyZWFjdGlvbnMiLCJmb3JtYXRSZWFjdGlvbnMiLCJyZWFjdGlvbk5hbWUiLCJ0b0xvd2VyQ2FzZSIsImZvcm1hdFVzZXJuYW1lIiwiZmlsdGVyQnkiLCJKU09OIiwic3RyaW5naWZ5IiwiYWxsIiwiZ2V0VXNlckxpc3RCeVRhZ3MiLCJ0YWdzIiwiZm9ybWF0VGFncyIsImxpc3QiLCJ0YWdOYW1lIiwiZ2V0VXNlckxpc3RCeUxhdGVzdCIsImZpbHRlciIsImdldFVzZXJMaXN0QnlDb25uZWN0aW9uIiwiZm9ybWF0VXNlcklkIiwicmVmcmVzaFNlc3Npb24iLCJzaWduSW4iLCJmb3JtYXRFbWFpbCIsImZvcm1hdFBob25lIiwiZm9ybWF0RXhwaXJlcyIsIklOVkFMSURfQVVUSEVOVElDQVRJT04iLCJmaWx0ZXJDbGF1c2UiLCJjaGVja1F1ZXJ5IiwiY2hlY2tVc2VycyIsImNoZWNrVXNlciIsImZpbmQiLCJ1c2VySXRlbSIsInZhbGlkUGFzc3dvcmQiLCJjaGVja1VzZXJuYW1lIiwic2lnbk91dCIsImxhc3RPbmxpbmUiLCJzZXNzaW9uUXVlcnkiLCJnZXRBY3RpdmVVc2VyQ291bnQiLCJnZXRVc2VyQnlUb2tlbiJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsUUFBUSxRQUFPLCtCQUErQjtBQUN0RCxTQUNFQyxVQUFVLEVBQ1ZDLGNBQWMsRUFDZEMsYUFBYSxFQUNiQyxTQUFTLEVBQ1RDLFVBQVUsRUFDVkMsYUFBYSxFQUNiQyxVQUFVLEVBQ1ZDLGFBQWEsUUFDUiwrQkFBK0I7QUFDdEMsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBUUMsT0FBTyxRQUFPLGVBQWU7QUFDckMsU0FBUVQsY0FBY1UsZ0JBQWdCLEVBQUVDLGVBQWUsUUFBTyxTQUFTO0FBQ3ZFLFNBQVFDLFFBQVEsUUFBTyxRQUFRO0FBRS9CLFNBQVFDLFNBQVMsRUFBRUMsYUFBYSxRQUFPLDZCQUE2QjtBQUNwRSxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyxXQUFXLEVBQUVDLEtBQUssUUFBTyw4QkFBOEI7QUFDL0QsT0FBT0MseUJB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