@nlabs/reaktor 1.7.0 → 1.9.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 (230) hide show
  1. package/README.md +75 -0
  2. package/lib/actions/analytics.js +1 -1
  3. package/lib/actions/apps.js +1 -1
  4. package/lib/actions/connections.js +1 -1
  5. package/lib/actions/content.js +1 -1
  6. package/lib/actions/conversations.js +1 -1
  7. package/lib/actions/crm.d.ts +7 -1
  8. package/lib/actions/crm.js +224 -17
  9. package/lib/actions/crud.js +1 -1
  10. package/lib/actions/dynamodb.js +1 -1
  11. package/lib/actions/email.js +1 -1
  12. package/lib/actions/files.js +1 -1
  13. package/lib/actions/flags.js +1 -1
  14. package/lib/actions/groups.js +1 -1
  15. package/lib/actions/images.js +1 -1
  16. package/lib/actions/index.js +1 -1
  17. package/lib/actions/ios.js +1 -1
  18. package/lib/actions/locations.js +1 -1
  19. package/lib/actions/messages.js +1 -1
  20. package/lib/actions/notifications.js +1 -1
  21. package/lib/actions/payments.js +1 -1
  22. package/lib/actions/personas.js +1 -1
  23. package/lib/actions/posts.js +1 -1
  24. package/lib/actions/query.js +1 -1
  25. package/lib/actions/reactions.js +1 -1
  26. package/lib/actions/rum.js +14 -9
  27. package/lib/actions/s3.js +1 -1
  28. package/lib/actions/search.js +1 -1
  29. package/lib/actions/sms.js +1 -1
  30. package/lib/actions/statistics.js +1 -1
  31. package/lib/actions/subscriptions.js +1 -1
  32. package/lib/actions/tags.js +1 -1
  33. package/lib/actions/users.d.ts +4 -1
  34. package/lib/actions/users.js +28 -7
  35. package/lib/actions/videos.js +1 -1
  36. package/lib/adapters/arangoAdapter.js +1 -1
  37. package/lib/adapters/contentAdapter.js +1 -1
  38. package/lib/adapters/fileAdapter.js +1 -1
  39. package/lib/adapters/imageAdapter.js +1 -1
  40. package/lib/adapters/index.js +1 -1
  41. package/lib/adapters/messageAdapter.js +1 -1
  42. package/lib/adapters/postAdapter.js +1 -1
  43. package/lib/adapters/reaktorAdapter.js +1 -1
  44. package/lib/adapters/tagAdapter.js +1 -1
  45. package/lib/adapters/userAdapter.js +1 -1
  46. package/lib/config.js +1 -1
  47. package/lib/constants/collections.d.ts +12 -0
  48. package/lib/constants/collections.js +13 -1
  49. package/lib/durableChat/conversations.d.ts +62 -0
  50. package/lib/durableChat/conversations.js +729 -0
  51. package/lib/durableChat/errors.d.ts +6 -0
  52. package/lib/durableChat/errors.js +11 -0
  53. package/lib/durableChat/events.d.ts +22 -0
  54. package/lib/durableChat/events.js +50 -0
  55. package/lib/durableChat/index.d.ts +8 -0
  56. package/lib/durableChat/index.js +10 -0
  57. package/lib/durableChat/membership.d.ts +24 -0
  58. package/lib/durableChat/membership.js +85 -0
  59. package/lib/durableChat/messageTypes.d.ts +76 -0
  60. package/lib/durableChat/messageTypes.js +3 -0
  61. package/lib/durableChat/messages.d.ts +16 -0
  62. package/lib/durableChat/messages.js +257 -0
  63. package/lib/durableChat/transaction.d.ts +10 -0
  64. package/lib/durableChat/transaction.js +53 -0
  65. package/lib/durableChat/types.d.ts +81 -0
  66. package/lib/durableChat/types.js +3 -0
  67. package/lib/handlers/graphqlHandler.js +1 -1
  68. package/lib/index.d.ts +4 -1
  69. package/lib/index.js +4 -2
  70. package/lib/lambdas/actions/websockets.js +1 -1
  71. package/lib/lambdas/authorizer.js +1 -1
  72. package/lib/lambdas/connection.js +1 -1
  73. package/lib/lambdas/utils/message.js +1 -1
  74. package/lib/lambdas/utils/websocket.js +1 -1
  75. package/lib/mocks/conversation.js +1 -1
  76. package/lib/mocks/file.js +1 -1
  77. package/lib/mocks/group.js +1 -1
  78. package/lib/mocks/image.js +1 -1
  79. package/lib/mocks/post.js +1 -1
  80. package/lib/mocks/tag.js +1 -1
  81. package/lib/mocks/user.js +1 -1
  82. package/lib/mocks/video.js +1 -1
  83. package/lib/mutations/analytics/analytics.js +1 -1
  84. package/lib/mutations/content/content.js +1 -1
  85. package/lib/mutations/crm/crm.js +43 -11
  86. package/lib/mutations/events/events.js +1 -1
  87. package/lib/mutations/flags/flags.js +1 -1
  88. package/lib/mutations/groups/groups.js +1 -1
  89. package/lib/mutations/images/images.js +1 -1
  90. package/lib/mutations/index.js +1 -1
  91. package/lib/mutations/locations/locations.js +1 -1
  92. package/lib/mutations/messages/messages.js +1 -1
  93. package/lib/mutations/personas/personas.js +1 -1
  94. package/lib/mutations/posts/posts.js +1 -1
  95. package/lib/mutations/reactions/reactions.js +1 -1
  96. package/lib/mutations/rum/rum.js +1 -1
  97. package/lib/mutations/statistics/statistics.js +1 -1
  98. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  99. package/lib/mutations/tags/tags.js +1 -1
  100. package/lib/mutations/users/users.js +1 -1
  101. package/lib/mutations/videos/videos.js +1 -1
  102. package/lib/objectTypes/analytics.js +1 -1
  103. package/lib/objectTypes/app.js +1 -1
  104. package/lib/objectTypes/bankAccount.js +1 -1
  105. package/lib/objectTypes/connection.js +1 -1
  106. package/lib/objectTypes/content.js +1 -1
  107. package/lib/objectTypes/conversation.js +1 -1
  108. package/lib/objectTypes/creditCard.js +1 -1
  109. package/lib/objectTypes/crm.js +5 -1
  110. package/lib/objectTypes/document.js +1 -1
  111. package/lib/objectTypes/error.js +1 -1
  112. package/lib/objectTypes/event.js +1 -1
  113. package/lib/objectTypes/external.js +1 -1
  114. package/lib/objectTypes/file.js +1 -1
  115. package/lib/objectTypes/filter.js +1 -1
  116. package/lib/objectTypes/flag.js +5 -2
  117. package/lib/objectTypes/group.js +1 -1
  118. package/lib/objectTypes/iapSubscription.js +1 -1
  119. package/lib/objectTypes/image.js +1 -1
  120. package/lib/objectTypes/index.js +1 -1
  121. package/lib/objectTypes/location.js +1 -1
  122. package/lib/objectTypes/message.js +1 -1
  123. package/lib/objectTypes/passcode.js +1 -1
  124. package/lib/objectTypes/persona.js +1 -1
  125. package/lib/objectTypes/plan.js +1 -1
  126. package/lib/objectTypes/post.js +1 -1
  127. package/lib/objectTypes/query.js +1 -1
  128. package/lib/objectTypes/reaction.js +1 -1
  129. package/lib/objectTypes/relation.js +1 -1
  130. package/lib/objectTypes/rum.js +1 -1
  131. package/lib/objectTypes/search.js +1 -1
  132. package/lib/objectTypes/statistics.js +1 -1
  133. package/lib/objectTypes/subscription.js +1 -1
  134. package/lib/objectTypes/tag.js +1 -1
  135. package/lib/objectTypes/user.js +9 -1
  136. package/lib/objectTypes/video.js +1 -1
  137. package/lib/queries/analytics/analytics.js +1 -1
  138. package/lib/queries/content/content.js +1 -1
  139. package/lib/queries/crm/crm.js +41 -13
  140. package/lib/queries/events/events.js +1 -1
  141. package/lib/queries/flags/flags.js +1 -1
  142. package/lib/queries/groups/groups.js +1 -1
  143. package/lib/queries/images/images.js +1 -1
  144. package/lib/queries/index.js +1 -1
  145. package/lib/queries/locations/locations.js +1 -1
  146. package/lib/queries/messages/messages.js +1 -1
  147. package/lib/queries/personas/personas.js +1 -1
  148. package/lib/queries/posts/posts.js +1 -1
  149. package/lib/queries/query/query.js +1 -1
  150. package/lib/queries/reactions/reactions.js +1 -1
  151. package/lib/queries/statistics/statistics.js +1 -1
  152. package/lib/queries/subscriptions/subscriptions.js +1 -1
  153. package/lib/queries/tags/tags.js +1 -1
  154. package/lib/queries/users/users.js +1 -1
  155. package/lib/queries/videos/videos.js +1 -1
  156. package/lib/templates/email/layout.js +1 -1
  157. package/lib/templates/email/passwordForgot.js +1 -1
  158. package/lib/templates/email/passwordRecovery.js +1 -1
  159. package/lib/templates/email/verifyEmail.js +1 -1
  160. package/lib/templates/email/welcome.js +1 -1
  161. package/lib/templates/sms/passwordForgot.js +1 -1
  162. package/lib/templates/sms/passwordRecovery.js +1 -1
  163. package/lib/templates/sms/verifyEmail.js +1 -1
  164. package/lib/templates/sms/verifyPhone.js +1 -1
  165. package/lib/templates/sms/welcome.js +1 -1
  166. package/lib/types/analytics.types.js +1 -1
  167. package/lib/types/apps.types.js +1 -1
  168. package/lib/types/arangodb.types.d.ts +1 -1
  169. package/lib/types/arangodb.types.js +1 -1
  170. package/lib/types/auth.types.d.ts +1 -0
  171. package/lib/types/auth.types.js +1 -1
  172. package/lib/types/connections.types.js +1 -1
  173. package/lib/types/content.types.js +1 -1
  174. package/lib/types/conversations.types.js +1 -1
  175. package/lib/types/crm.types.d.ts +20 -1
  176. package/lib/types/crm.types.js +1 -1
  177. package/lib/types/email.types.js +1 -1
  178. package/lib/types/error.types.js +1 -1
  179. package/lib/types/files.types.js +1 -1
  180. package/lib/types/flags.types.js +1 -1
  181. package/lib/types/google.types.js +1 -1
  182. package/lib/types/groups.types.js +1 -1
  183. package/lib/types/images.types.js +1 -1
  184. package/lib/types/index.js +1 -1
  185. package/lib/types/locations.types.js +1 -1
  186. package/lib/types/messages.types.js +1 -1
  187. package/lib/types/notifications.types.js +1 -1
  188. package/lib/types/payments.types.js +1 -1
  189. package/lib/types/personas.types.js +1 -1
  190. package/lib/types/posts.types.js +1 -1
  191. package/lib/types/rum.types.js +1 -1
  192. package/lib/types/statistics.types.js +1 -1
  193. package/lib/types/tags.types.js +1 -1
  194. package/lib/types/users.types.d.ts +1 -0
  195. package/lib/types/users.types.js +1 -1
  196. package/lib/types/videos.types.js +1 -1
  197. package/lib/types/websockets.types.js +1 -1
  198. package/lib/upload.js +1 -1
  199. package/lib/utils/adapterUtils.js +1 -1
  200. package/lib/utils/analyticsUtils.js +1 -1
  201. package/lib/utils/appContext.d.ts +2 -0
  202. package/lib/utils/appContext.js +10 -0
  203. package/lib/utils/aqlHelpers.js +1 -1
  204. package/lib/utils/arangodbUtils.js +1 -1
  205. package/lib/utils/authUtils.js +1 -1
  206. package/lib/utils/awsUtils.js +1 -1
  207. package/lib/utils/collectionRegistry.js +1 -1
  208. package/lib/utils/contextUtils.js +1 -1
  209. package/lib/utils/dbI18n.example.js +1 -1
  210. package/lib/utils/dbI18n.js +1 -1
  211. package/lib/utils/googleTranslate.js +1 -1
  212. package/lib/utils/graphqlUtils.d.ts +1 -0
  213. package/lib/utils/graphqlUtils.js +1 -1
  214. package/lib/utils/imageUtils.js +1 -1
  215. package/lib/utils/index.js +1 -1
  216. package/lib/utils/languageDetection.js +1 -1
  217. package/lib/utils/localeUtils.example.js +1 -1
  218. package/lib/utils/localeUtils.js +1 -1
  219. package/lib/utils/middlewareUtils.js +1 -1
  220. package/lib/utils/queryBuilder.js +1 -1
  221. package/lib/utils/schemaUtils.js +1 -1
  222. package/lib/utils/sessionUtils.d.ts +4 -0
  223. package/lib/utils/sessionUtils.js +1 -1
  224. package/lib/utils/stripeUtils.js +2 -1
  225. package/lib/utils/templateUtils.js +1 -1
  226. package/lib/utils/testUtils.js +1 -1
  227. package/lib/utils/translationQueue.example.js +1 -1
  228. package/lib/utils/translationQueue.js +1 -1
  229. package/lib/videoProcessing.js +1 -1
  230. package/package.json +19 -19
@@ -5,6 +5,7 @@
5
5
  import { aql } from 'arangojs';
6
6
  import { literal } from 'arangojs/aql';
7
7
  import { COLLECTIONS, EDGES } from '../constants/collections.js';
8
+ import { Config } from '../config.js';
8
9
  import { useDb } from '../utils/arangodbUtils.js';
9
10
  import { isAdminUser } from '../utils/sessionUtils.js';
10
11
  import { sesSend } from './email.js';
@@ -15,11 +16,30 @@ const docId = (collectionName, key = '')=>`${collectionName}/${docKey(key)}`;
15
16
  const externalKey = (prefix, id = '')=>createHash(`${prefix}-${String(id)}`, null);
16
17
  const cleanString = (value, length = 640)=>parseString(String(value || ''), length);
17
18
  const cleanExternalId = (value, length = 320)=>String(value || '').trim().slice(0, length);
19
+ const ensureDocumentCollection = async (database, name)=>{
20
+ const target = database.collection(name);
21
+ if (await target.exists()) return;
22
+ try {
23
+ await database.createCollection(name);
24
+ } catch (error) {
25
+ if (!await target.exists()) throw error;
26
+ }
27
+ };
28
+ const ensureEdgeCollection = async (database, name)=>{
29
+ const target = database.collection(name);
30
+ if (await target.exists()) return;
31
+ try {
32
+ await database.createEdgeCollection(name);
33
+ } catch (error) {
34
+ if (!await target.exists()) throw error;
35
+ }
36
+ };
18
37
  const requireCrmAdmin = (context)=>{
19
38
  if (!isAdminUser(context.session)) {
20
39
  throw new Error('administrator_access_required');
21
40
  }
22
41
  };
42
+ export const requireCrmAdministrator = requireCrmAdmin;
23
43
  const allowedContactFields = new Set([
24
44
  'email',
25
45
  'firstName',
@@ -28,6 +48,27 @@ const allowedContactFields = new Set([
28
48
  'marketingConsentSource',
29
49
  'crmSource'
30
50
  ]);
51
+ const supportPriorities = new Set([
52
+ 'low',
53
+ 'normal',
54
+ 'high',
55
+ 'urgent'
56
+ ]);
57
+ const supportStatuses = new Set([
58
+ 'submitted',
59
+ 'in_progress',
60
+ 'done',
61
+ 'completed'
62
+ ]);
63
+ const supportTypes = new Set([
64
+ 'delivery_issue',
65
+ 'refund_request',
66
+ 'bug_report',
67
+ 'account_issue',
68
+ 'general_support'
69
+ ]);
70
+ const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/u;
71
+ const escapeHtml = (value)=>value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
31
72
  const sanitizeHtml = (value)=>String(value || '').replace(/<(script|iframe|object|embed)\b[^>]*>[\s\S]*?<\/\1>/gi, '').replace(/\son\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, '');
32
73
  const sanitizeCss = (value)=>String(value || '').replace(/<\/?style\b[^>]*>/gi, '').replace(/@import\s+[^;]+;?/gi, '').replace(/url\s*\(\s*(['"]?)javascript:[^)]+\)/gi, '');
33
74
  const htmlToText = (value)=>value.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
@@ -43,6 +84,7 @@ export const submitCrmForm = async (context, input)=>{
43
84
  const phone = rawPhone ? parsePhone(rawPhone) || rawPhone : '';
44
85
  if (!email && !phone) throw new Error('required_email_or_phone');
45
86
  const database = useDb(context.databaseName);
87
+ await ensureDocumentCollection(database, COLLECTIONS.CRM_FORM_SUBMISSIONS);
46
88
  const timestamp = now();
47
89
  const source = cleanString(input.source || input.formId || 'form', 160);
48
90
  const values = input.values || {};
@@ -130,12 +172,16 @@ export const submitCrmForm = async (context, input)=>{
130
172
  };
131
173
  export const getCrmFormSubmissions = (context)=>{
132
174
  requireCrmAdmin(context);
133
- return useDb(context.databaseName).query(aql`
134
- FOR submission IN ${collection(COLLECTIONS.CRM_FORM_SUBMISSIONS)}
135
- SORT submission.added DESC
136
- LIMIT 500
137
- RETURN submission
138
- `).then((cursor)=>cursor.all());
175
+ const database = useDb(context.databaseName);
176
+ return (async ()=>{
177
+ if (!await database.collection(COLLECTIONS.CRM_FORM_SUBMISSIONS).exists()) return [];
178
+ return database.query(aql`
179
+ FOR submission IN ${collection(COLLECTIONS.CRM_FORM_SUBMISSIONS)}
180
+ SORT submission.added DESC
181
+ LIMIT 500
182
+ RETURN submission
183
+ `).then((cursor)=>cursor.all());
184
+ })();
139
185
  };
140
186
  export const getCrmContacts = (context, filter = {})=>{
141
187
  requireCrmAdmin(context);
@@ -516,10 +562,43 @@ export const getCustomerOrdersByUser = (context, userId)=>{
516
562
  `;
517
563
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
518
564
  };
565
+ const sendSupportTicketEmail = async (context, ticket, details, heading)=>{
566
+ const user = await useDb(context.databaseName).query(aql`
567
+ RETURN DOCUMENT(${docId(COLLECTIONS.USERS, ticket.userId)})
568
+ `).then((cursor)=>cursor.next());
569
+ if (!user?.email) return;
570
+ const supportName = context.config?.details?.supportName || Config.get('details.supportName') || 'Reaktor Support';
571
+ const supportEmail = context.config?.details?.supportEmail || Config.get('details.supportEmail') || 'support@reaktor.io';
572
+ const ticketNumber = String(ticket.ticketNumber || ticket.supportTicketId || ticket._key || '');
573
+ const statusUrl = `https://crm.reaktor.io/support/status?ticket=${encodeURIComponent(ticketNumber)}`;
574
+ const text = `${heading}\n\nTicket: ${ticketNumber}\nStatus: ${ticket.status || 'submitted'}\n\n${details}\n\nTrack this ticket: ${statusUrl}`;
575
+ await sesSend({
576
+ Destination: {
577
+ ToAddresses: [
578
+ String(user.email)
579
+ ]
580
+ },
581
+ Message: {
582
+ Body: {
583
+ Html: {
584
+ Data: `<h1>${escapeHtml(heading)}</h1><p><strong>Ticket:</strong> ${escapeHtml(ticketNumber)}</p><p><strong>Status:</strong> ${escapeHtml(String(ticket.status || 'submitted'))}</p><pre style="white-space:pre-wrap;font-family:inherit">${escapeHtml(details)}</pre><p><a href="${escapeHtml(statusUrl)}">Track this ticket online</a></p>`
585
+ },
586
+ Text: {
587
+ Data: text
588
+ }
589
+ },
590
+ Subject: {
591
+ Data: `[${ticketNumber}] ${heading}`
592
+ }
593
+ },
594
+ Source: `"${supportName}" <${supportEmail}>`
595
+ }).catch(()=>undefined);
596
+ };
519
597
  export const createSupportTicket = async (context, input)=>{
520
598
  const timestamp = now();
521
599
  const userKey = docKey(String(input.userId || ''));
522
600
  const ticketKey = docKey(String(input.supportTicketId || createHash(`support-ticket-${userKey}-${timestamp}`)));
601
+ const ticketNumber = cleanString(input.ticketNumber, 80) || `RKT-${new Date(timestamp).toISOString().slice(0, 10).replace(/-/g, '')}-${ticketKey.slice(0, 8).toUpperCase()}`;
523
602
  const ticket = {
524
603
  _key: ticketKey,
525
604
  added: timestamp,
@@ -529,9 +608,10 @@ export const createSupportTicket = async (context, input)=>{
529
608
  priority: input.priority || 'normal',
530
609
  productId: cleanExternalId(input.productId, 320),
531
610
  shopifyOrderId: cleanString(input.shopifyOrderId, 160),
532
- status: 'open',
611
+ status: 'submitted',
533
612
  subject: cleanString(input.subject, 320),
534
613
  supportTicketId: ticketKey,
614
+ ticketNumber,
535
615
  type: input.type || 'general_support',
536
616
  userId: userKey
537
617
  };
@@ -547,28 +627,131 @@ export const createSupportTicket = async (context, input)=>{
547
627
  });
548
628
  await addSupportTicketEvent(context, {
549
629
  actorUserId: docKey(String(context?.session?.userId || userKey)),
550
- eventType: 'created',
630
+ eventType: 'submitted',
631
+ metadata: {
632
+ details: ticket.description
633
+ },
551
634
  supportTicketId: ticketKey,
552
635
  toValue: ticket.status
553
636
  });
554
637
  return savedTicket;
555
638
  };
556
- export const getSupportTickets = (context, filters = {})=>{
557
- const query = aql`
639
+ export const submitPublicSupportTicket = async (context, input)=>{
640
+ const email = cleanString(input.email, 320).toLowerCase();
641
+ const description = cleanString(input.description, 4000);
642
+ const subject = cleanString(input.subject, 320);
643
+ if (!emailPattern.test(email)) throw new Error('required_valid_email');
644
+ if (!subject) throw new Error('required_subject');
645
+ if (!description) throw new Error('required_description');
646
+ const database = useDb(context.databaseName);
647
+ await Promise.all([
648
+ COLLECTIONS.SUPPORT_TICKET_EVENTS,
649
+ COLLECTIONS.SUPPORT_TICKET_MESSAGES,
650
+ COLLECTIONS.SUPPORT_TICKETS,
651
+ COLLECTIONS.USERS
652
+ ].map((name)=>ensureDocumentCollection(database, name)));
653
+ await Promise.all([
654
+ EDGES.HAS_SUPPORT_TICKET,
655
+ EDGES.HAS_SUPPORT_TICKET_EVENT,
656
+ EDGES.HAS_SUPPORT_TICKET_MESSAGE
657
+ ].map((name)=>ensureEdgeCollection(database, name)));
658
+ const timestamp = now();
659
+ const generatedUserKey = createHash(email, null);
660
+ const optedIn = input.marketingOptIn === true;
661
+ const userInsert = {
662
+ _key: generatedUserKey,
663
+ active: false,
664
+ added: timestamp,
665
+ email,
666
+ firstName: cleanString(input.firstName, 160),
667
+ lastName: cleanString(input.lastName, 160),
668
+ mailingList: optedIn,
669
+ marketingOptIn: optedIn,
670
+ modified: timestamp,
671
+ userId: generatedUserKey
672
+ };
673
+ const userUpdate = {
674
+ ...optedIn ? {
675
+ mailingList: true,
676
+ marketingOptIn: true,
677
+ marketingOptInAt: timestamp
678
+ } : {},
679
+ firstName: cleanString(input.firstName, 160) || undefined,
680
+ lastName: cleanString(input.lastName, 160) || undefined,
681
+ modified: timestamp
682
+ };
683
+ const user = await database.query(aql`
684
+ UPSERT {email: ${email}}
685
+ INSERT ${userInsert}
686
+ UPDATE ${userUpdate}
687
+ IN ${collection(COLLECTIONS.USERS)}
688
+ RETURN NEW
689
+ `).then((cursor)=>cursor.next());
690
+ const ticket = await createSupportTicket(context, {
691
+ description,
692
+ priority: supportPriorities.has(String(input.priority)) ? input.priority : 'normal',
693
+ subject,
694
+ type: supportTypes.has(String(input.type)) ? input.type : 'general_support',
695
+ userId: String(user?._key || user?.userId || generatedUserKey)
696
+ });
697
+ await sendSupportTicketEmail(context, ticket, description, 'We received your support ticket');
698
+ return ticket;
699
+ };
700
+ export const getPublicSupportTicket = async (context, ticketNumber, emailAddress)=>{
701
+ const email = cleanString(emailAddress, 320).toLowerCase();
702
+ const number = cleanString(ticketNumber, 80).toUpperCase();
703
+ if (!emailPattern.test(email) || !number) return null;
704
+ const database = useDb(context.databaseName);
705
+ if (!await database.collection(COLLECTIONS.SUPPORT_TICKETS).exists()) return null;
706
+ return database.query(aql`
558
707
  FOR ticket IN ${collection(COLLECTIONS.SUPPORT_TICKETS)}
559
- ${filters.status ? aql`FILTER ticket.status == ${filters.status}` : aql``}
560
- ${filters.userId ? aql`FILTER ticket.userId == ${docKey(filters.userId)}` : aql``}
708
+ FILTER UPPER(ticket.ticketNumber) == ${number}
561
709
  LET user = DOCUMENT(${COLLECTIONS.USERS}, ticket.userId)
562
- SORT ticket.added DESC
563
- RETURN MERGE(ticket, {user})
564
- `;
565
- return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
710
+ FILTER LOWER(user.email) == ${email}
711
+ LET messages = (
712
+ FOR message IN ${collection(COLLECTIONS.SUPPORT_TICKET_MESSAGES)}
713
+ FILTER message.supportTicketId == ticket._key AND message.visibility == "customer"
714
+ SORT message.added ASC
715
+ RETURN message
716
+ )
717
+ LET events = (
718
+ FOR event IN ${collection(COLLECTIONS.SUPPORT_TICKET_EVENTS)}
719
+ FILTER event.supportTicketId == ticket._key
720
+ SORT event.added ASC
721
+ RETURN event
722
+ )
723
+ LIMIT 1
724
+ RETURN {ticket, messages, events}
725
+ `).then((cursor)=>cursor.next());
726
+ };
727
+ export const getSupportTickets = (context, filters = {})=>{
728
+ const database = useDb(context.databaseName);
729
+ return (async ()=>{
730
+ if (!await database.collection(COLLECTIONS.SUPPORT_TICKETS).exists()) return [];
731
+ const query = aql`
732
+ FOR ticket IN ${collection(COLLECTIONS.SUPPORT_TICKETS)}
733
+ ${filters.status ? aql`FILTER ticket.status == ${filters.status}` : aql``}
734
+ ${filters.userId ? aql`FILTER ticket.userId == ${docKey(filters.userId)}` : aql``}
735
+ LET user = DOCUMENT(${COLLECTIONS.USERS}, ticket.userId)
736
+ SORT ticket.added DESC
737
+ RETURN MERGE(ticket, {user})
738
+ `;
739
+ return database.query(query).then((cursor)=>cursor.all());
740
+ })();
566
741
  };
567
742
  export const updateSupportTicketStatus = async (context, supportTicketId, status, resolutionSummary = '')=>{
568
743
  const ticketKey = docKey(supportTicketId);
569
744
  const timestamp = now();
570
745
  const previous = await useDb(context.databaseName).query(aql`RETURN DOCUMENT(${docId(COLLECTIONS.SUPPORT_TICKETS, ticketKey)})`).then((cursor)=>cursor.next());
571
746
  const update = {
747
+ ...status === 'completed' && {
748
+ completedAt: timestamp,
749
+ resolutionSummary: cleanString(resolutionSummary, 4000)
750
+ },
751
+ ...status === 'done' && {
752
+ doneAt: timestamp,
753
+ resolutionSummary: cleanString(resolutionSummary, 4000)
754
+ },
572
755
  ...status === 'resolved' && {
573
756
  resolvedAt: timestamp,
574
757
  resolutionSummary: cleanString(resolutionSummary, 4000)
@@ -576,6 +759,7 @@ export const updateSupportTicketStatus = async (context, supportTicketId, status
576
759
  ...status === 'closed' && {
577
760
  closedAt: timestamp
578
761
  },
762
+ lastUpdateDetails: cleanString(resolutionSummary, 4000),
579
763
  modified: timestamp,
580
764
  status
581
765
  };
@@ -612,6 +796,29 @@ export const updateSupportTicketStatus = async (context, supportTicketId, status
612
796
  }
613
797
  return ticket;
614
798
  };
799
+ export const updateSupportTicketProgress = async (context, supportTicketId, status, details)=>{
800
+ requireCrmAdmin(context);
801
+ if (!supportStatuses.has(status)) throw new Error('invalid_support_ticket_status');
802
+ const markdown = cleanString(details, 4000);
803
+ if (!markdown) throw new Error('required_update_details');
804
+ const ticket = await updateSupportTicketStatus(context, supportTicketId, status, markdown);
805
+ await addSupportTicketMessage(context, {
806
+ authorUserId: String(context.session?.userId || ''),
807
+ body: markdown,
808
+ supportTicketId,
809
+ visibility: 'customer'
810
+ });
811
+ await createCustomerNotification(context, {
812
+ body: markdown,
813
+ status: 'sent',
814
+ subject: `Ticket ${ticket.ticketNumber || supportTicketId}: ${status.replace(/_/g, ' ')}`,
815
+ supportTicketId,
816
+ type: 'support_ticket_progress',
817
+ userId: ticket.userId
818
+ });
819
+ await sendSupportTicketEmail(context, ticket, markdown, `Support ticket ${status.replace(/_/g, ' ')}`);
820
+ return ticket;
821
+ };
615
822
  export const addSupportTicketMessage = async (context, input)=>{
616
823
  const timestamp = now();
617
824
  const ticketKey = docKey(String(input.supportTicketId || ''));
@@ -718,4 +925,4 @@ export const getCustomerNotificationsByUser = (context, userId)=>{
718
925
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
719
926
  };
720
927
 
721
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC9ubGFicy1yZWFrdG9yLXJlbGVhc2UuZU1RNVNoL2NoZWNrb3V0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2FjdGlvbnMvY3JtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlSWQsIHBhcnNlUGhvbmUsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2lzQWRtaW5Vc2VyfSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuaW1wb3J0IHtzZXNTZW5kfSBmcm9tICcuL2VtYWlsLmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDdXN0b21lck5vdGlmaWNhdGlvblR5cGUsXG4gIEN1c3RvbWVyT3JkZXJUeXBlLFxuICBDcm1DYW1wYWlnbklucHV0LFxuICBDcm1DYW1wYWlnblR5cGUsXG4gIENybUNvbnRhY3RGaWx0ZXIsXG4gIENybUZvcm1TdWJtaXNzaW9uSW5wdXQsXG4gIENybUZvcm1TdWJtaXNzaW9uVHlwZSxcbiAgTWFpbGluZ0xpc3RUeXBlLFxuICBTaG9waWZ5Q3VzdG9tZXJPcmRlcklucHV0LFxuICBTdXBwb3J0VGlja2V0RXZlbnRUeXBlLFxuICBTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGUsXG4gIFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIFN1cHBvcnRUaWNrZXRUeXBlRGF0YVxufSBmcm9tICcuLi90eXBlcy9jcm0udHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IG5vdyA9ICgpOiBudW1iZXIgPT4gRGF0ZS5ub3coKTtcbmNvbnN0IGNvbGxlY3Rpb24gPSAobmFtZTogc3RyaW5nKSA9PiBsaXRlcmFsKG5hbWUpO1xuY29uc3QgZG9jS2V5ID0gKHZhbHVlID0gJycpOiBzdHJpbmcgPT4gcGFyc2VJZChTdHJpbmcodmFsdWUpKTtcbmNvbnN0IGRvY0lkID0gKGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsIGtleSA9ICcnKTogc3RyaW5nID0+IGAke2NvbGxlY3Rpb25OYW1lfS8ke2RvY0tleShrZXkpfWA7XG5jb25zdCBleHRlcm5hbEtleSA9IChwcmVmaXg6IHN0cmluZywgaWQgPSAnJyk6IHN0cmluZyA9PiBjcmVhdGVIYXNoKGAke3ByZWZpeH0tJHtTdHJpbmcoaWQpfWAsIG51bGwpO1xuY29uc3QgY2xlYW5TdHJpbmcgPSAodmFsdWU6IHVua25vd24sIGxlbmd0aCA9IDY0MCk6IHN0cmluZyA9PiBwYXJzZVN0cmluZyhTdHJpbmcodmFsdWUgfHwgJycpLCBsZW5ndGgpO1xuY29uc3QgY2xlYW5FeHRlcm5hbElkID0gKHZhbHVlOiB1bmtub3duLCBsZW5ndGggPSAzMjApOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCkuc2xpY2UoMCwgbGVuZ3RoKTtcblxuY29uc3QgcmVxdWlyZUNybUFkbWluID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiB2b2lkID0+IHtcbiAgaWYoIWlzQWRtaW5Vc2VyKGNvbnRleHQuc2Vzc2lvbiBhcyBhbnkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZG1pbmlzdHJhdG9yX2FjY2Vzc19yZXF1aXJlZCcpO1xuICB9XG59O1xuXG5jb25zdCBhbGxvd2VkQ29udGFjdEZpZWxkcyA9IG5ldyBTZXQoWydlbWFpbCcsICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAncGhvbmUnLCAnbWFya2V0aW5nQ29uc2VudFNvdXJjZScsICdjcm1Tb3VyY2UnXSk7XG5jb25zdCBzYW5pdGl6ZUh0bWwgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKVxuICAucmVwbGFjZSgvPChzY3JpcHR8aWZyYW1lfG9iamVjdHxlbWJlZClcXGJbXj5dKj5bXFxzXFxTXSo/PFxcL1xcMT4vZ2ksICcnKVxuICAucmVwbGFjZSgvXFxzb25cXHcrXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzPl0rKS9naSwgJycpO1xuY29uc3Qgc2FuaXRpemVDc3MgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKVxuICAucmVwbGFjZSgvPFxcLz9zdHlsZVxcYltePl0qPi9naSwgJycpXG4gIC5yZXBsYWNlKC9AaW1wb3J0XFxzK1teO10rOz8vZ2ksICcnKVxuICAucmVwbGFjZSgvdXJsXFxzKlxcKFxccyooWydcIl0/KWphdmFzY3JpcHQ6W14pXStcXCkvZ2ksICcnKTtcbmNvbnN0IGh0bWxUb1RleHQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB2YWx1ZS5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbmNvbnN0IGNodW5rID0gPFQ+KGl0ZW1zOiByZWFkb25seSBUW10sIHNpemU6IG51bWJlcik6IFRbXVtdID0+IHtcbiAgY29uc3QgZ3JvdXBzOiBUW11bXSA9IFtdO1xuICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ICs9IHNpemUpIGdyb3Vwcy5wdXNoKGl0ZW1zLnNsaWNlKGluZGV4LCBpbmRleCArIHNpemUpKTtcbiAgcmV0dXJuIGdyb3Vwcztcbn07XG5cbmV4cG9ydCBjb25zdCBzdWJtaXRDcm1Gb3JtID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogQ3JtRm9ybVN1Ym1pc3Npb25JbnB1dFxuKTogUHJvbWlzZTxDcm1Gb3JtU3VibWlzc2lvblR5cGU+ID0+IHtcbiAgaWYodHlwZW9mIGlucHV0Py5tYXJrZXRpbmdPcHRJbiAhPT0gJ2Jvb2xlYW4nKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX21hcmtldGluZ09wdEluJyk7XG4gIGNvbnN0IGVtYWlsID0gY2xlYW5TdHJpbmcoaW5wdXQuZW1haWwsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmF3UGhvbmUgPSBjbGVhblN0cmluZyhpbnB1dC5waG9uZSwgODApO1xuICBjb25zdCBwaG9uZSA9IHJhd1Bob25lID8gKHBhcnNlUGhvbmUocmF3UGhvbmUpIHx8IHJhd1Bob25lKSA6ICcnO1xuICBpZighZW1haWwgJiYgIXBob25lKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2VtYWlsX29yX3Bob25lJyk7XG5cbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBzb3VyY2UgPSBjbGVhblN0cmluZyhpbnB1dC5zb3VyY2UgfHwgaW5wdXQuZm9ybUlkIHx8ICdmb3JtJywgMTYwKTtcbiAgY29uc3QgdmFsdWVzID0gaW5wdXQudmFsdWVzIHx8IHt9O1xuICBjb25zdCBmaXJzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUgfHwgdmFsdWVzLmZpcnN0TmFtZSwgMTYwKTtcbiAgY29uc3QgbGFzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSB8fCB2YWx1ZXMubGFzdE5hbWUsIDE2MCk7XG4gIGNvbnN0IGdlbmVyYXRlZFVzZXJLZXkgPSBjcmVhdGVIYXNoKGVtYWlsIHx8IHBob25lLCBudWxsKTtcbiAgY29uc3QgY29uc2VudCA9IGlucHV0Lm1hcmtldGluZ09wdEluXG4gICAgPyB7bWFya2V0aW5nT3B0SW5BdDogdGltZXN0YW1wLCBtYXJrZXRpbmdPcHRPdXRBdDogbnVsbH1cbiAgICA6IHttYXJrZXRpbmdPcHRPdXRBdDogdGltZXN0YW1wfTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWUsXG4gICAgbGFzdE5hbWUsXG4gICAgbWFpbGluZ0xpc3Q6IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6IHNvdXJjZSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwaG9uZSxcbiAgICB0eXBlOiAnY3JtQ29udGFjdCcsXG4gICAgdXNlckFjY2VzczogMCxcbiAgICB1c2VySWQ6IGdlbmVyYXRlZFVzZXJLZXksXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgLi4uY29uc2VudFxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIC4uLihlbWFpbCA/IHtlbWFpbH0gOiB7fSksXG4gICAgLi4uKGZpcnN0TmFtZSA/IHtmaXJzdE5hbWV9IDoge30pLFxuICAgIC4uLihsYXN0TmFtZSA/IHtsYXN0TmFtZX0gOiB7fSksXG4gICAgLi4uKHBob25lID8ge3Bob25lfSA6IHt9KSxcbiAgICBtYWlsaW5nTGlzdDogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogc291cmNlLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIC4uLmNvbnNlbnRcbiAgfTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBMRVQgZXhpc3RpbmcgPSBGSVJTVChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiAoJHtlbWFpbH0gIT0gXCJcIiAmJiBMT1dFUih1c2VyLmVtYWlsIHx8IFwiXCIpID09ICR7ZW1haWx9KVxuICAgICAgICAgIHx8ICgke3Bob25lfSAhPSBcIlwiICYmIHVzZXIucGhvbmUgPT0gJHtwaG9uZX0pXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke2dlbmVyYXRlZFVzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZSB8IG51bGw7XG4gIGNvbnN0IHVzZXJJZCA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgZ2VuZXJhdGVkVXNlcktleSkpO1xuXG4gIGNvbnN0IHN1Ym1pc3Npb25JZCA9IGNyZWF0ZUhhc2goYGNybS1zdWJtaXNzaW9uLSR7dGltZXN0YW1wfS0ke2VtYWlsfS0ke3Bob25lfWAsIG51bGwpO1xuICBjb25zdCBzdWJtaXNzaW9uID0ge1xuICAgIF9rZXk6IHN1Ym1pc3Npb25JZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZvcm1JZDogY2xlYW5TdHJpbmcoaW5wdXQuZm9ybUlkLCAxNjApLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHBob25lLFxuICAgIHNvdXJjZSxcbiAgICBzdWJtaXNzaW9uSWQsXG4gICAgdXNlcklkLFxuICAgIHZhbHVlc1xuICB9O1xuICBjb25zdCBzYXZlZCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBJTlNFUlQgJHtzdWJtaXNzaW9ufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICByZXR1cm4gc2F2ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JtRm9ybVN1Ym1pc3Npb25zID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPENybUZvcm1TdWJtaXNzaW9uVHlwZVtdPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIHN1Ym1pc3Npb24gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKX1cbiAgICAgIFNPUlQgc3VibWlzc2lvbi5hZGRlZCBERVNDXG4gICAgICBMSU1JVCA1MDBcbiAgICAgIFJFVFVSTiBzdWJtaXNzaW9uXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcm1Db250YWN0cyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBmaWx0ZXI6IENybUNvbnRhY3RGaWx0ZXIgPSB7fSk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGNvbnN0IHNlYXJjaCA9IGNsZWFuU3RyaW5nKGZpbHRlci5zZWFyY2gsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZmllbGQgPSBhbGxvd2VkQ29udGFjdEZpZWxkcy5oYXMoZmlsdGVyLmZpZWxkIHx8ICcnKSA/IFN0cmluZyhmaWx0ZXIuZmllbGQpIDogJyc7XG4gIGNvbnN0IHZhbHVlID0gY2xlYW5TdHJpbmcoZmlsdGVyLnZhbHVlLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wdGVkSW5Pbmx5ID0gZmlsdGVyLm9wdGVkSW5Pbmx5ICE9PSBmYWxzZTtcbiAgY29uc3Qgb3BlcmF0b3IgPSBbJ2NvbnRhaW5zJywgJ2VxdWFscycsICdleGlzdHMnXS5pbmNsdWRlcyhmaWx0ZXIub3BlcmF0b3IgfHwgJycpID8gZmlsdGVyLm9wZXJhdG9yIDogJ2NvbnRhaW5zJztcbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgIEZJTFRFUiAkeyFvcHRlZEluT25seX0gfHwgdXNlci5tYXJrZXRpbmdPcHRJbiA9PSB0cnVlXG4gICAgICBGSUxURVIgJHshc2VhcmNofSB8fCBDT05UQUlOUyhMT1dFUihDT05DQVRfU0VQQVJBVE9SKFwiIFwiLCB1c2VyLmZpcnN0TmFtZSwgdXNlci5sYXN0TmFtZSwgdXNlci5lbWFpbCwgdXNlci5waG9uZSkpLCAke3NlYXJjaH0pXG4gICAgICBGSUxURVIgJHshZmllbGR9IHx8ICgke29wZXJhdG9yID09PSAnZXhpc3RzJ31cbiAgICAgICAgPyBIQVModXNlciwgJHtmaWVsZH0pXG4gICAgICAgIDogKCR7b3BlcmF0b3IgPT09ICdlcXVhbHMnfSA/IExPV0VSKFRPX1NUUklORyh1c2VyWyR7ZmllbGR9XSkpID09ICR7dmFsdWV9IDogQ09OVEFJTlMoTE9XRVIoVE9fU1RSSU5HKHVzZXJbJHtmaWVsZH1dKSksICR7dmFsdWV9KSkpXG4gICAgICBTT1JUIHVzZXIuYWRkZWQgREVTQ1xuICAgICAgTElNSVQgMTAwMFxuICAgICAgUkVUVVJOIE1FUkdFKHVzZXIsIHtjcm1Tb3VyY2U6IHVzZXIubWFya2V0aW5nQ29uc2VudFNvdXJjZX0pXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kQ3JtQ2FtcGFpZ24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBDcm1DYW1wYWlnbklucHV0XG4pOiBQcm9taXNlPENybUNhbXBhaWduVHlwZT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGNvbnN0IHN1YmplY3QgPSBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApO1xuICBjb25zdCBib2R5SHRtbCA9IHNhbml0aXplSHRtbChpbnB1dC5odG1sKTtcbiAgY29uc3QgY3NzID0gc2FuaXRpemVDc3MoaW5wdXQuY3NzKTtcbiAgaWYoIXN1YmplY3QgfHwgIWJvZHlIdG1sKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2NhbXBhaWduX2NvbnRlbnQnKTtcblxuICBjb25zdCBjYW5kaWRhdGVzID0gYXdhaXQgZ2V0Q3JtQ29udGFjdHMoY29udGV4dCwgey4uLmlucHV0LmZpbHRlciwgb3B0ZWRJbk9ubHk6IHRydWV9KTtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0KChpbnB1dC51c2VySWRzIHx8IFtdKS5tYXAoKGlkKSA9PiBkb2NLZXkoaWQpKSk7XG4gIGNvbnN0IHJlY2lwaWVudHMgPSBjYW5kaWRhdGVzLmZpbHRlcigodXNlcikgPT5cbiAgICBCb29sZWFuKHVzZXIuZW1haWwpICYmICghc2VsZWN0ZWRJZHMuc2l6ZSB8fCBzZWxlY3RlZElkcy5oYXMoZG9jS2V5KHVzZXIudXNlcklkIHx8IHVzZXIuX2tleSkpKSk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBjYW1wYWlnbklkID0gY3JlYXRlSGFzaChgY3JtLWNhbXBhaWduLSR7dGltZXN0YW1wfS0ke3N1YmplY3R9YCwgbnVsbCk7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICBjb25zdCBjYW1wYWlnbiA9IHtcbiAgICBfa2V5OiBjYW1wYWlnbklkLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgY2FtcGFpZ25JZCxcbiAgICBjc3MsXG4gICAgZmFpbGVkQ291bnQ6IDAsXG4gICAgaHRtbDogYm9keUh0bWwsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICByZWNpcGllbnRDb3VudDogcmVjaXBpZW50cy5sZW5ndGgsXG4gICAgc2VudENvdW50OiAwLFxuICAgIHN0YXR1czogJ3NlbmRpbmcnLFxuICAgIHN1YmplY3RcbiAgfTtcbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYElOU0VSVCAke2NhbXBhaWdufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0NBTVBBSUdOUyl9YCk7XG5cbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgbGV0IHNlbnRDb3VudCA9IDA7XG4gIGZvcihjb25zdCByZWNpcGllbnRzQmF0Y2ggb2YgY2h1bmsocmVjaXBpZW50cywgNTApKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlc1NlbmQoe1xuICAgICAgICBEZXN0aW5hdGlvbjoge0JjY0FkZHJlc3NlczogcmVjaXBpZW50c0JhdGNoLm1hcCgocmVjaXBpZW50KSA9PiBTdHJpbmcocmVjaXBpZW50LmVtYWlsKSl9LFxuICAgICAgICBNZXNzYWdlOiB7XG4gICAgICAgICAgQm9keToge0h0bWw6IHtEYXRhOiBgPHN0eWxlPiR7Y3NzfTwvc3R5bGU+JHtib2R5SHRtbH1gfSwgVGV4dDoge0RhdGE6IGh0bWxUb1RleHQoYm9keUh0bWwpfX0sXG4gICAgICAgICAgU3ViamVjdDoge0RhdGE6IHN1YmplY3R9XG4gICAgICAgIH0sXG4gICAgICAgIFNvdXJjZTogYFwiJHtjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydE5hbWUgfHwgJ1JlYWt0b3InfVwiIDwke2NvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0RW1haWwgfHwgJ3N1cHBvcnRAcmVha3Rvci5pbyd9PmBcbiAgICAgIH0pO1xuICAgICAgc2VudENvdW50ICs9IHJlY2lwaWVudHNCYXRjaC5sZW5ndGg7XG4gICAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICAgIGZhaWxlZENvdW50ICs9IHJlY2lwaWVudHNCYXRjaC5sZW5ndGg7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHsuLi5jYW1wYWlnbiwgZmFpbGVkQ291bnQsIHNlbnRBdDogbm93KCksIHNlbnRDb3VudCwgc3RhdHVzOiBmYWlsZWRDb3VudCA/IChzZW50Q291bnQgPyAncGFydGlhbCcgOiAnZmFpbGVkJykgOiAnc2VudCd9O1xuICBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgVVBEQVRFICR7Y2FtcGFpZ25JZH0gV0lUSCAke3tcbiAgICAgIGZhaWxlZENvdW50OiByZXN1bHQuZmFpbGVkQ291bnQsXG4gICAgICBtb2RpZmllZDogcmVzdWx0LnNlbnRBdCxcbiAgICAgIHNlbnRBdDogcmVzdWx0LnNlbnRBdCxcbiAgICAgIHNlbnRDb3VudDogcmVzdWx0LnNlbnRDb3VudCxcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1c1xuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fQ0FNUEFJR05TKX1cbiAgYCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBzYXZlRWRnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZWRnZUNvbGxlY3Rpb246IHN0cmluZyxcbiAgZWRnZUtleTogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgZWRnZSA9IHtcbiAgICBfZnJvbTogZnJvbSxcbiAgICBfa2V5OiBlZGdlS2V5LFxuICAgIF90bzogdG8sXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIC4uLmRhdGFcbiAgfTtcbiAgY29uc3QgcXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHtlZGdlS2V5fX1cbiAgICBJTlNFUlQgJHtlZGdlfVxuICAgIFVQREFURSAke2RhdGF9IElOICR7Y29sbGVjdGlvbihlZGdlQ29sbGVjdGlvbil9XG4gIGA7XG5cbiAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVNYWlsaW5nTGlzdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8TWFpbGluZ0xpc3RUeXBlPlxuKTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IG1haWxpbmdMaXN0SWQgPSBkb2NLZXkoU3RyaW5nKGlucHV0Py5tYWlsaW5nTGlzdElkIHx8IGNyZWF0ZUhhc2goYG1haWxpbmctbGlzdC0ke2lucHV0Py5uYW1lfS0ke3RpbWVzdGFtcH1gKSkpO1xuICBjb25zdCBtYWlsaW5nTGlzdCA9IHtcbiAgICBfa2V5OiBtYWlsaW5nTGlzdElkLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgY3JlYXRlZEJ5VXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGRlc2NyaXB0aW9uOiBjbGVhblN0cmluZyhpbnB1dD8uZGVzY3JpcHRpb24sIDIwMDApLFxuICAgIG1haWxpbmdMaXN0SWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBuYW1lOiBjbGVhblN0cmluZyhpbnB1dD8ubmFtZSwgMTYwKSxcbiAgICBzdGF0dXM6IGlucHV0Py5zdGF0dXMgfHwgJ2FjdGl2ZSdcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke21haWxpbmdMaXN0SWR9fVxuICAgIElOU0VSVCAke21haWxpbmdMaXN0fVxuICAgIFVQREFURSAke3tcbiAgICAgIGRlc2NyaXB0aW9uOiBtYWlsaW5nTGlzdC5kZXNjcmlwdGlvbixcbiAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICBuYW1lOiBtYWlsaW5nTGlzdC5uYW1lLFxuICAgICAgc3RhdHVzOiBtYWlsaW5nTGlzdC5zdGF0dXNcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWFpbGluZ0xpc3RzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBsaXN0IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTKX1cbiAgICAgIEZJTFRFUiBsaXN0LnN0YXR1cyAhPSBcImFyY2hpdmVkXCJcbiAgICAgIFNPUlQgbGlzdC5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbGlzdFxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRVc2VyVG9NYWlsaW5nTGlzdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG1haWxpbmdMaXN0SWQ6IHN0cmluZyxcbiAgc291cmNlID0gJ21hbnVhbCdcbik6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KHVzZXJJZCk7XG4gIGNvbnN0IGxpc3RLZXkgPSBkb2NLZXkobWFpbGluZ0xpc3RJZCk7XG4gIGNvbnN0IGVkZ2VLZXkgPSBjcmVhdGVIYXNoKGBoYXNNYWlsaW5nTGlzdC0ke3VzZXJLZXl9LSR7bGlzdEtleX1gKTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19NQUlMSU5HX0xJU1QsXG4gICAgZWRnZUtleSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUywgbGlzdEtleSksXG4gICAge1xuICAgICAgYWRkZWRCeVVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICAgIHNvdXJjZTogY2xlYW5TdHJpbmcoc291cmNlLCA4MCksXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnXG4gICAgfVxuICApO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSlcbiAgICAucXVlcnkoYXFsYFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIGxpc3RLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVVzZXJGcm9tTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KHVzZXJJZCk7XG4gIGNvbnN0IGxpc3RLZXkgPSBkb2NLZXkobWFpbGluZ0xpc3RJZCk7XG4gIGNvbnN0IGVkZ2VLZXkgPSBjcmVhdGVIYXNoKGBoYXNNYWlsaW5nTGlzdC0ke3VzZXJLZXl9LSR7bGlzdEtleX1gKTtcbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIG1vZGlmaWVkOiBub3coKSxcbiAgICByZW1vdmVkQXQ6IG5vdygpLFxuICAgIHN0YXR1czogJ3JlbW92ZWQnXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke2VkZ2VLZXl9IFdJVEggJHt1cGRhdGV9IElOICR7Y29sbGVjdGlvbihFREdFUy5IQVNfTUFJTElOR19MSVNUKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKS50aGVuKEJvb2xlYW4pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1haWxpbmdMaXN0VXNlcnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG1haWxpbmdMaXN0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGxpc3RJZCA9IGRvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgdXNlciwgZWRnZSBJTiAxLi4xIElOQk9VTkQgJHtsaXN0SWR9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfTUFJTElOR19MSVNUKX1cbiAgICAgIEZJTFRFUiBlZGdlLnN0YXR1cyA9PSBcImFjdGl2ZVwiXG4gICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICBSRVRVUk4gdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5UHVyY2hhc2VkUHJvZHVjdCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcHJvZHVjdElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBwcm9kdWN0S2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktcHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBvcmRlciBJTiAxLi4xIElOQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TSE9QSUZZX1BST0RVQ1RTLCBwcm9kdWN0S2V5KX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCl9XG4gICAgICBGT1IgdXNlciBJTiAxLi4xIElOQk9VTkQgb3JkZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICAgIFJFVFVSTiBESVNUSU5DVCB1c2VyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsaWdpYmxlTWFpbGluZ1VzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBvcHRpb25zOiB7cmVhZG9ubHkgbWFpbGluZ0xpc3RJZD86IHN0cmluZzsgcmVhZG9ubHkgcHJvZHVjdElkPzogc3RyaW5nOyByZWFkb25seSBleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzPzogYm9vbGVhbn0gPSB7fVxuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgPSBvcHRpb25zLmV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgIT09IGZhbHNlO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBMRVQgYmFzZVVzZXJzID0gKFxuICAgICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgICAgRklMVEVSIHVzZXIubWFya2V0aW5nT3B0SW4gPT0gdHJ1ZVxuICAgICAgICBGSUxURVIgdXNlci5lbWFpbCAhPSBudWxsICYmIHVzZXIuZW1haWwgIT0gXCJcIlxuICAgICAgICBGSUxURVIgdXNlci5lbWFpbERlbGl2ZXJ5U3RhdHVzID09IG51bGwgfHwgdXNlci5lbWFpbERlbGl2ZXJ5U3RhdHVzID09IFwidmFsaWRcIlxuICAgICAgICAke29wdGlvbnMubWFpbGluZ0xpc3RJZCA/IGFxbGBcbiAgICAgICAgICBGSUxURVIgTEVOR1RIKFxuICAgICAgICAgICAgRk9SIGxpc3QgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgICAgICAgICAgIEZJTFRFUiBsaXN0Ll9rZXkgPT0gJHtkb2NLZXkob3B0aW9ucy5tYWlsaW5nTGlzdElkKX1cbiAgICAgICAgICAgICAgUkVUVVJOIGxpc3RcbiAgICAgICAgICApID4gMFxuICAgICAgICBgIDogYXFsYGB9XG4gICAgICAgICR7b3B0aW9ucy5wcm9kdWN0SWQgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EIHVzZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgICAgICBGT1IgcHJvZHVjdCBJTiAxLi4xIE9VVEJPVU5EIG9yZGVyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1BVUkNIQVNFRF9QUk9EVUNUKX1cbiAgICAgICAgICAgICAgICBGSUxURVIgcHJvZHVjdC5wcm9kdWN0SWQgPT0gJHtTdHJpbmcob3B0aW9ucy5wcm9kdWN0SWQpfVxuICAgICAgICAgICAgICAgIFJFVFVSTiBwcm9kdWN0XG4gICAgICAgICAgKSA+IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICAke2V4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiB0aWNrZXQgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUKX1cbiAgICAgICAgICAgICAgRklMVEVSIHRpY2tldC5zdGF0dXMgSU4gW1wib3BlblwiLCBcImluX3Byb2dyZXNzXCIsIFwid2FpdGluZ19vbl9jdXN0b21lclwiLCBcIndhaXRpbmdfb25faW50ZXJuYWxcIl1cbiAgICAgICAgICAgICAgRklMVEVSIHRpY2tldC5wcmlvcml0eSBJTiBbXCJoaWdoXCIsIFwidXJnZW50XCJdXG4gICAgICAgICAgICAgIFJFVFVSTiB0aWNrZXRcbiAgICAgICAgICApID09IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICBSRVRVUk4gdXNlclxuICAgIClcbiAgICBGT1IgdXNlciBJTiBiYXNlVXNlcnNcbiAgICAgIFNPUlQgdXNlci5lbWFpbCBBU0NcbiAgICAgIFJFVFVSTiBESVNUSU5DVCB1c2VyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluZ2VzdFNob3BpZnlDdXN0b21lck9yZGVyID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogU2hvcGlmeUN1c3RvbWVyT3JkZXJJbnB1dFxuKTogUHJvbWlzZTxDdXN0b21lck9yZGVyVHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3Qgc2hvcGlmeUN1c3RvbWVySWQgPSBjbGVhbkV4dGVybmFsSWQoaW5wdXQuc2hvcGlmeUN1c3RvbWVySWQsIDE2MCk7XG4gIGNvbnN0IHNob3BpZnlPcmRlcklkID0gY2xlYW5FeHRlcm5hbElkKGlucHV0LnNob3BpZnlPcmRlcklkLCAxNjApO1xuICBjb25zdCBjdXN0b21lciA9IGlucHV0LmN1c3RvbWVyIHx8IHt9O1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmVtYWlsLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHByb2R1Y3RJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLihpbnB1dC5wcm9kdWN0SWRzIHx8IFtdKSwgLi4uKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5tYXAoKHByb2R1Y3QpID0+IHByb2R1Y3QucHJvZHVjdElkKV1cbiAgICAubWFwKChwcm9kdWN0SWQpID0+IGNsZWFuRXh0ZXJuYWxJZChwcm9kdWN0SWQsIDMyMCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSkpO1xuXG4gIGlmKCFzaG9waWZ5Q3VzdG9tZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc2hvcGlmeUN1c3RvbWVySWQnKTtcbiAgfVxuICBpZighc2hvcGlmeU9yZGVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3Nob3BpZnlPcmRlcklkJyk7XG4gIH1cbiAgaWYoIWVtYWlsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9jdXN0b21lckVtYWlsJyk7XG4gIH1cblxuICBjb25zdCB1c2VyS2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktdXNlcicsIHNob3BpZnlDdXN0b21lcklkKTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiB1c2VyS2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmxhc3ROYW1lLCAxNjApLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6ICdzaG9waWZ5JyxcbiAgICBtYXJrZXRpbmdPcHRJbjogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUsXG4gICAgbWFya2V0aW5nT3B0SW5BdDogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZCxcbiAgICB0eXBlOiAnY3JtQ29udGFjdCcsXG4gICAgdXNlcklkOiB1c2VyS2V5XG4gIH07XG4gIGNvbnN0IHVzZXJVcGRhdGUgPSB7XG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmxhc3ROYW1lLCAxNjApLFxuICAgIGxhc3RQdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6ICdzaG9waWZ5JyxcbiAgICBtYXJrZXRpbmdPcHRJbjogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZFxuICB9O1xuICBjb25zdCB1c2VyUXVlcnkgPSBhcWxgXG4gICAgTEVUIGV4aXN0aW5nID0gRklSU1QoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgdXNlci5zaG9waWZ5Q3VzdG9tZXJJZCA9PSAke3Nob3BpZnlDdXN0b21lcklkfSB8fCB1c2VyLmVtYWlsID09ICR7ZW1haWx9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke3VzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3QgdXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeSh1c2VyUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGU7XG4gIGNvbnN0IHJlc29sdmVkVXNlcktleSA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgdXNlcktleSkpO1xuICBjb25zdCBvcmRlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LW9yZGVyJywgc2hvcGlmeU9yZGVySWQpO1xuICBjb25zdCBvcmRlciA9IHtcbiAgICBfa2V5OiBvcmRlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGN1cnJlbmN5OiBjbGVhblN0cmluZyhpbnB1dC5jdXJyZW5jeSwgMykudG9VcHBlckNhc2UoKSxcbiAgICBjdXN0b21lck9yZGVySWQ6IG9yZGVyS2V5LFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJvZHVjdElkcyxcbiAgICBwdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkLFxuICAgIHNob3BpZnlPcmRlcklkLFxuICAgIHRvdGFsUHJpY2U6IE51bWJlcihpbnB1dC50b3RhbFByaWNlIHx8IDApLFxuICAgIHVzZXJJZDogcmVzb2x2ZWRVc2VyS2V5XG4gIH07XG4gIGNvbnN0IG9yZGVyUXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke29yZGVyS2V5fX1cbiAgICBJTlNFUlQgJHtvcmRlcn1cbiAgICBVUERBVEUgJHt7XG4gICAgICBjdXJyZW5jeTogb3JkZXIuY3VycmVuY3ksXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcHJvZHVjdElkcyxcbiAgICAgIHB1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCxcbiAgICAgIHRvdGFsUHJpY2U6IG9yZGVyLnRvdGFsUHJpY2UsXG4gICAgICB1c2VySWQ6IHJlc29sdmVkVXNlcktleVxuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRPcmRlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShvcmRlclF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIEN1c3RvbWVyT3JkZXJUeXBlO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX09SREVSLFxuICAgIGNyZWF0ZUhhc2goYGhhc0N1c3RvbWVyT3JkZXItJHtyZXNvbHZlZFVzZXJLZXl9LSR7b3JkZXJLZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTLCBvcmRlcktleSksXG4gICAge3B1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCwgc2hvcGlmeUN1c3RvbWVySWQsIHNob3BpZnlPcmRlcklkfVxuICApO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb2R1Y3RJZHMubWFwKGFzeW5jIChwcm9kdWN0SWQpID0+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5maW5kKChpdGVtKSA9PiBpdGVtLnByb2R1Y3RJZCA9PT0gcHJvZHVjdElkKSB8fCB7cHJvZHVjdElkfTtcbiAgICBjb25zdCBwcm9kdWN0S2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktcHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gICAgY29uc3QgcHJvZHVjdERvYyA9IHtcbiAgICAgIF9rZXk6IHByb2R1Y3RLZXksXG4gICAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZCxcbiAgICAgIHRpdGxlOiBjbGVhblN0cmluZyhwcm9kdWN0LnRpdGxlLCAzMjApLFxuICAgICAgdmFyaWFudElkOiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdC52YXJpYW50SWQsIDE2MClcbiAgICB9O1xuICAgIGNvbnN0IHByb2R1Y3RRdWVyeSA9IGFxbGBcbiAgICAgIFVQU0VSVCB7X2tleTogJHtwcm9kdWN0S2V5fX1cbiAgICAgIElOU0VSVCAke3Byb2R1Y3REb2N9XG4gICAgICBVUERBVEUgJHt7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICAgIHRpdGxlOiBwcm9kdWN0RG9jLnRpdGxlLFxuICAgICAgICB2YXJpYW50SWQ6IHByb2R1Y3REb2MudmFyaWFudElkXG4gICAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUyl9XG4gICAgYDtcbiAgICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocHJvZHVjdFF1ZXJ5KTtcbiAgICBhd2FpdCBzYXZlRWRnZShcbiAgICAgIGNvbnRleHQsXG4gICAgICBFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QsXG4gICAgICBjcmVhdGVIYXNoKGBoYXNQdXJjaGFzZWRQcm9kdWN0LSR7b3JkZXJLZXl9LSR7cHJvZHVjdEtleX1gKSxcbiAgICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgb3JkZXJLZXkpLFxuICAgICAgZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSksXG4gICAgICB7cHJvZHVjdElkLCBwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXR9XG4gICAgKTtcbiAgfSkpO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgVVBEQVRFICR7cmVzb2x2ZWRVc2VyS2V5fVxuICAgIFdJVEgge1xuICAgICAgbGFzdFB1cmNoYXNlZEF0OiAke29yZGVyLnB1cmNoYXNlZEF0fSxcbiAgICAgIHRvdGFsT3JkZXJDb3VudDogTEVOR1RIKFxuICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICBSRVRVUk4gb3JkZXJcbiAgICAgICksXG4gICAgICB0b3RhbFNwZW5kOiBTVU0oXG4gICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgIFJFVFVSTiBUT19OVU1CRVIob3JkZXIudG90YWxQcmljZSlcbiAgICAgIClcbiAgICB9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gIGApO1xuXG4gIHJldHVybiBzYXZlZE9yZGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1c3RvbWVyT3JkZXJzQnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxDdXN0b21lck9yZGVyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgU09SVCBvcmRlci5wdXJjaGFzZWRBdCBERVNDXG4gICAgICBSRVRVUk4gb3JkZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldFR5cGVEYXRhPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IHRpY2tldCA9IHtcbiAgICBfa2V5OiB0aWNrZXRLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhc3NpZ25lZFRvVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmFzc2lnbmVkVG9Vc2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQuZGVzY3JpcHRpb24sIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJpb3JpdHk6IGlucHV0LnByaW9yaXR5IHx8ICdub3JtYWwnLFxuICAgIHByb2R1Y3RJZDogY2xlYW5FeHRlcm5hbElkKGlucHV0LnByb2R1Y3RJZCwgMzIwKSxcbiAgICBzaG9waWZ5T3JkZXJJZDogY2xlYW5TdHJpbmcoaW5wdXQuc2hvcGlmeU9yZGVySWQsIDE2MCksXG4gICAgc3RhdHVzOiAnb3BlbicsXG4gICAgc3ViamVjdDogY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0eXBlOiBpbnB1dC50eXBlIHx8ICdnZW5lcmFsX3N1cHBvcnQnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHt0aWNrZXR9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRUaWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldC0ke3VzZXJLZXl9LSR7dGlja2V0S2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAge3ByaW9yaXR5OiB0aWNrZXQucHJpb3JpdHksIHN0YXR1czogdGlja2V0LnN0YXR1cywgdHlwZTogdGlja2V0LnR5cGV9XG4gICk7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRFdmVudChjb250ZXh0LCB7XG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8IHVzZXJLZXkpKSxcbiAgICBldmVudFR5cGU6ICdjcmVhdGVkJyxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiB0aWNrZXQuc3RhdHVzXG4gIH0pO1xuXG4gIHJldHVybiBzYXZlZFRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZmlsdGVyczoge3JlYWRvbmx5IHN0YXR1cz86IHN0cmluZzsgcmVhZG9ubHkgdXNlcklkPzogc3RyaW5nfSA9IHt9XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB0aWNrZXQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgICAke2ZpbHRlcnMuc3RhdHVzID8gYXFsYEZJTFRFUiB0aWNrZXQuc3RhdHVzID09ICR7ZmlsdGVycy5zdGF0dXN9YCA6IGFxbGBgfVxuICAgICAgJHtmaWx0ZXJzLnVzZXJJZCA/IGFxbGBGSUxURVIgdGlja2V0LnVzZXJJZCA9PSAke2RvY0tleShmaWx0ZXJzLnVzZXJJZCl9YCA6IGFxbGBgfVxuICAgICAgTEVUIHVzZXIgPSBET0NVTUVOVCgke0NPTExFQ1RJT05TLlVTRVJTfSwgdGlja2V0LnVzZXJJZClcbiAgICAgIFNPUlQgdGlja2V0LmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiBNRVJHRSh0aWNrZXQsIHt1c2VyfSlcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmcsXG4gIHN0YXR1czogU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgcmVzb2x1dGlvblN1bW1hcnkgPSAnJ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KHN1cHBvcnRUaWNrZXRJZCk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFN1cHBvcnRUaWNrZXRUeXBlRGF0YSB8IG51bGw7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAuLi4oc3RhdHVzID09PSAncmVzb2x2ZWQnICYmIHtyZXNvbHZlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnY2xvc2VkJyAmJiB7Y2xvc2VkQXQ6IHRpbWVzdGFtcH0pLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3RhdHVzXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke3RpY2tldEtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgU3VwcG9ydFRpY2tldFR5cGVEYXRhO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIGVkZ2UgSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICBGSUxURVIgZWRnZS5fdG8gPT0gJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSl9XG4gICAgICBVUERBVEUgZWRnZSBXSVRIICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICByZXNvbHZlZEF0OiBzdGF0dXMgPT09ICdyZXNvbHZlZCcgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1c1xuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gIGApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogJ3N0YXR1c19jaGFuZ2VkJyxcbiAgICBmcm9tVmFsdWU6IHByZXZpb3VzPy5zdGF0dXMsXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogc3RhdHVzXG4gIH0pO1xuXG4gIGlmKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJykge1xuICAgIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICAgIGJvZHk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5IHx8ICdZb3VyIHN1cHBvcnQgdGlja2V0IGhhcyBiZWVuIHJlc29sdmVkLicsIDQwMDApLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIHN1YmplY3Q6IGBSZXNvbHZlZDogJHt0aWNrZXQuc3ViamVjdCB8fCAnU3VwcG9ydCB0aWNrZXQnfWAsXG4gICAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9yZXNvbHZlZCcsXG4gICAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpO1xuICBjb25zdCBtZXNzYWdlS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0TWVzc2FnZUlkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LW1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgX2tleTogbWVzc2FnZUtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGF1dGhvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hdXRob3JVc2VySWQgfHwgY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgYm9keTogY2xlYW5TdHJpbmcoaW5wdXQuYm9keSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICBzdXBwb3J0VGlja2V0TWVzc2FnZUlkOiBtZXNzYWdlS2V5LFxuICAgIHZpc2liaWxpdHk6IGlucHV0LnZpc2liaWxpdHkgfHwgJ2N1c3RvbWVyJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHttZXNzYWdlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRNZXNzYWdlID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldE1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7bWVzc2FnZUtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMsIG1lc3NhZ2VLZXkpLFxuICAgIHthdXRob3JVc2VySWQ6IG1lc3NhZ2UuYXV0aG9yVXNlcklkLCB2aXNpYmlsaXR5OiBtZXNzYWdlLnZpc2liaWxpdHl9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBtZXNzYWdlIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSl9XG4gICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gbWVzc2FnZVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IGV2ZW50S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0RXZlbnRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC1ldmVudC0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9LSR7aW5wdXQuZXZlbnRUeXBlfWApKSk7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIF9rZXk6IGV2ZW50S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYWN0b3JVc2VySWQgfHwgJycpKSxcbiAgICBldmVudFR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LmV2ZW50VHlwZSwgMTYwKSxcbiAgICBmcm9tVmFsdWU6IGNsZWFuU3RyaW5nKGlucHV0LmZyb21WYWx1ZSwgMzIwKSxcbiAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEgfHwge30sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0RXZlbnRJZDogZXZlbnRLZXksXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQudG9WYWx1ZSwgMzIwKVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtldmVudH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZEV2ZW50ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5ULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXRFdmVudC0ke3RpY2tldEtleX0tJHtldmVudEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLCBldmVudEtleSksXG4gICAge2FjdG9yVXNlcklkOiBldmVudC5hY3RvclVzZXJJZCwgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGV9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkRXZlbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBldmVudCBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCBzdXBwb3J0VGlja2V0SWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UKX1cbiAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gZXZlbnRcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZT5cbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5jdXN0b21lck5vdGlmaWNhdGlvbklkIHx8IGNyZWF0ZUhhc2goYGN1c3RvbWVyLW5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICBfa2V5OiBub3RpZmljYXRpb25LZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBjdXN0b21lck5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25LZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzZW50QXQ6IGlucHV0LnNlbnRBdCxcbiAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyB8fCAncXVldWVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKSxcbiAgICB0eXBlOiBjbGVhblN0cmluZyhpbnB1dC50eXBlLCAxNjApLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtub3RpZmljYXRpb259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkTm90aWZpY2F0aW9uID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7bm90aWZpY2F0aW9uS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TLCBub3RpZmljYXRpb25LZXkpLFxuICAgIHtcbiAgICAgIHN0YXR1czogbm90aWZpY2F0aW9uLnN0YXR1cyxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogbm90aWZpY2F0aW9uLnN1cHBvcnRUaWNrZXRJZCxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBzYXZlZE5vdGlmaWNhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBub3RpZmljYXRpb24gSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTil9XG4gICAgICBTT1JUIG5vdGlmaWNhdGlvbi5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbm90aWZpY2F0aW9uXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlUGhvbmUiLCJwYXJzZVN0cmluZyIsImFxbCIsImxpdGVyYWwiLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwidXNlRGIiLCJpc0FkbWluVXNlciIsInNlc1NlbmQiLCJub3ciLCJEYXRlIiwiY29sbGVjdGlvbiIsIm5hbWUiLCJkb2NLZXkiLCJ2YWx1ZSIsIlN0cmluZyIsImRvY0lkIiwiY29sbGVjdGlvbk5hbWUiLCJrZXkiLCJleHRlcm5hbEtleSIsInByZWZpeCIsImlkIiwiY2xlYW5TdHJpbmciLCJsZW5ndGgiLCJjbGVhbkV4dGVybmFsSWQiLCJ0cmltIiwic2xpY2UiLCJyZXF1aXJlQ3JtQWRtaW4iLCJjb250ZXh0Iiwic2Vzc2lvbiIsIkVycm9yIiwiYWxsb3dlZENvbnRhY3RGaWVsZHMiLCJTZXQiLCJzYW5pdGl6ZUh0bWwiLCJyZXBsYWNlIiwic2FuaXRpemVDc3MiLCJodG1sVG9UZXh0IiwiY2h1bmsiLCJpdGVtcyIsInNpemUiLCJncm91cHMiLCJpbmRleCIsInB1c2giLCJzdWJtaXRDcm1Gb3JtIiwiaW5wdXQiLCJtYXJrZXRpbmdPcHRJbiIsImVtYWlsIiwidG9Mb3dlckNhc2UiLCJyYXdQaG9uZSIsInBob25lIiwiZGF0YWJhc2UiLCJkYXRhYmFzZU5hbWUiLCJ0aW1lc3RhbXAiLCJzb3VyY2UiLCJmb3JtSWQiLCJ2YWx1ZXMiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsImdlbmVyYXRlZFVzZXJLZXkiLCJjb25zZW50IiwibWFya2V0aW5nT3B0SW5BdCIsIm1hcmtldGluZ09wdE91dEF0IiwidXNlckluc2VydCIsIl9rZXkiLCJhY3RpdmUiLCJhZGRlZCIsIm1haWxpbmdMaXN0IiwibWFya2V0aW5nQ29uc2VudFNvdXJjZSIsIm1vZGlmaWVkIiwidHlwZSIsInVzZXJBY2Nlc3MiLCJ1c2VySWQiLCJ2ZXJpZmllZEVtYWlsIiwidmVyaWZpZWRQaG9uZSIsInVzZXJVcGRhdGUiLCJ1c2VyIiwicXVlcnkiLCJVU0VSUyIsInRoZW4iLCJjdXJzb3IiLCJuZXh0Iiwic3VibWlzc2lvbklkIiwic3VibWlzc2lvbiIsInNhdmVkIiwiQ1JNX0ZPUk1fU1VCTUlTU0lPTlMiLCJnZXRDcm1Gb3JtU3VibWlzc2lvbnMiLCJhbGwiLCJnZXRDcm1Db250YWN0cyIsImZpbHRlciIsInNlYXJjaCIsImZpZWxkIiwiaGFzIiwib3B0ZWRJbk9ubHkiLCJvcGVyYXRvciIsImluY2x1ZGVzIiwic2VuZENybUNhbXBhaWduIiwic3ViamVjdCIsImJvZHlIdG1sIiwiaHRtbCIsImNzcyIsImNhbmRpZGF0ZXMiLCJzZWxlY3RlZElkcyIsInVzZXJJZHMiLCJtYXAiLCJyZWNpcGllbnRzIiwiQm9vbGVhbiIsImNhbXBhaWduSWQiLCJjYW1wYWlnbiIsImZhaWxlZENvdW50IiwicmVjaXBpZW50Q291bnQiLCJzZW50Q291bnQiLCJzdGF0dXMiLCJDUk1fQ0FNUEFJR05TIiwicmVjaXBpZW50c0JhdGNoIiwiRGVzdGluYXRpb24iLCJCY2NBZGRyZXNzZXMiLCJyZWNpcGllbnQiLCJNZXNzYWdlIiwiQm9keSIsIkh0bWwiLCJEYXRhIiwiVGV4dCIsIlN1YmplY3QiLCJTb3VyY2UiLCJjb25maWciLCJkZXRhaWxzIiwic3VwcG9ydE5hbWUiLCJzdXBwb3J0RW1haWwiLCJfZXJyb3IiLCJyZXN1bHQiLCJzZW50QXQiLCJzYXZlRWRnZSIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUtleSIsImZyb20iLCJ0byIsImRhdGEiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJjcmVhdGVNYWlsaW5nTGlzdCIsIm1haWxpbmdMaXN0SWQiLCJjcmVhdGVkQnlVc2VySWQiLCJkZXNjcmlwdGlvbiIsIk1BSUxJTkdfTElTVFMiLCJnZXRNYWlsaW5nTGlzdHMiLCJhZGRVc2VyVG9NYWlsaW5nTGlzdCIsInVzZXJLZXkiLCJsaXN0S2V5IiwiSEFTX01BSUxJTkdfTElTVCIsImFkZGVkQnlVc2VySWQiLCJyZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0IiwidXBkYXRlIiwicmVtb3ZlZEF0IiwiZ2V0TWFpbGluZ0xpc3RVc2VycyIsImxpc3RJZCIsImdldFVzZXJzQnlQdXJjaGFzZWRQcm9kdWN0IiwicHJvZHVjdElkIiwicHJvZHVjdEtleSIsIlNIT1BJRllfUFJPRFVDVFMiLCJIQVNfUFVSQ0hBU0VEX1BST0RVQ1QiLCJIQVNfQ1VTVE9NRVJfT1JERVIiLCJnZXRFbGlnaWJsZU1haWxpbmdVc2VycyIsIm9wdGlvbnMiLCJleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzIiwiSEFTX1NVUFBPUlRfVElDS0VUIiwiaW5nZXN0U2hvcGlmeUN1c3RvbWVyT3JkZXIiLCJzaG9waWZ5Q3VzdG9tZXJJZCIsInNob3BpZnlPcmRlcklkIiwiY3VzdG9tZXIiLCJwcm9kdWN0SWRzIiwiQXJyYXkiLCJwcm9kdWN0cyIsInByb2R1Y3QiLCJ1bmRlZmluZWQiLCJsYXN0UHVyY2hhc2VkQXQiLCJwdXJjaGFzZWRBdCIsInVzZXJRdWVyeSIsInJlc29sdmVkVXNlcktleSIsIm9yZGVyS2V5Iiwib3JkZXIiLCJjdXJyZW5jeSIsInRvVXBwZXJDYXNlIiwiY3VzdG9tZXJPcmRlcklkIiwidG90YWxQcmljZSIsIk51bWJlciIsIm9yZGVyUXVlcnkiLCJDVVNUT01FUl9PUkRFUlMiLCJzYXZlZE9yZGVyIiwiUHJvbWlzZSIsImZpbmQiLCJpdGVtIiwicHJvZHVjdERvYyIsInRpdGxlIiwidmFyaWFudElkIiwicHJvZHVjdFF1ZXJ5IiwiZ2V0Q3VzdG9tZXJPcmRlcnNCeVVzZXIiLCJjcmVhdGVTdXBwb3J0VGlja2V0IiwidGlja2V0S2V5Iiwic3VwcG9ydFRpY2tldElkIiwidGlja2V0IiwiYXNzaWduZWRUb1VzZXJJZCIsInByaW9yaXR5IiwiU1VQUE9SVF9USUNLRVRTIiwic2F2ZWRUaWNrZXQiLCJhZGRTdXBwb3J0VGlja2V0RXZlbnQiLCJhY3RvclVzZXJJZCIsImV2ZW50VHlwZSIsInRvVmFsdWUiLCJnZXRTdXBwb3J0VGlja2V0cyIsImZpbHRlcnMiLCJ1cGRhdGVTdXBwb3J0VGlja2V0U3RhdHVzIiwicmVzb2x1dGlvblN1bW1hcnkiLCJwcmV2aW91cyIsInJlc29sdmVkQXQiLCJjbG9zZWRBdCIsImZyb21WYWx1ZSIsImNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uIiwiYm9keSIsImFkZFN1cHBvcnRUaWNrZXRNZXNzYWdlIiwibWVzc2FnZUtleSIsInN1cHBvcnRUaWNrZXRNZXNzYWdlSWQiLCJtZXNzYWdlIiwiYXV0aG9yVXNlcklkIiwidmlzaWJpbGl0eSIsIlNVUFBPUlRfVElDS0VUX01FU1NBR0VTIiwic2F2ZWRNZXNzYWdlIiwiSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UiLCJnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMiLCJldmVudEtleSIsInN1cHBvcnRUaWNrZXRFdmVudElkIiwiZXZlbnQiLCJtZXRhZGF0YSIsIlNVUFBPUlRfVElDS0VUX0VWRU5UUyIsInNhdmVkRXZlbnQiLCJIQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQiLCJnZXRTdXBwb3J0VGlja2V0RXZlbnRzIiwibm90aWZpY2F0aW9uS2V5IiwiY3VzdG9tZXJOb3RpZmljYXRpb25JZCIsIm5vdGlmaWNhdGlvbiIsIkNVU1RPTUVSX05PVElGSUNBVElPTlMiLCJzYXZlZE5vdGlmaWNhdGlvbiIsIkhBU19DVVNUT01FUl9OT1RJRklDQVRJT04iLCJnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDMUYsU0FB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
928
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50Ly5jb2RleC13b3JrdHJlZXMvcmVha3Rvci1waGFudGF6ZS1jaGF0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2FjdGlvbnMvY3JtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlSWQsIHBhcnNlUGhvbmUsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7aXNBZG1pblVzZXJ9IGZyb20gJy4uL3V0aWxzL3Nlc3Npb25VdGlscy5qcyc7XG5pbXBvcnQge3Nlc1NlbmR9IGZyb20gJy4vZW1haWwuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZSxcbiAgQ3VzdG9tZXJPcmRlclR5cGUsXG4gIENybUNhbXBhaWduSW5wdXQsXG4gIENybUNhbXBhaWduVHlwZSxcbiAgQ3JtQ29udGFjdEZpbHRlcixcbiAgQ3JtRm9ybVN1Ym1pc3Npb25JbnB1dCxcbiAgQ3JtRm9ybVN1Ym1pc3Npb25UeXBlLFxuICBNYWlsaW5nTGlzdFR5cGUsXG4gIFB1YmxpY1N1cHBvcnRUaWNrZXRGZWVkLFxuICBQdWJsaWNTdXBwb3J0VGlja2V0SW5wdXQsXG4gIFNob3BpZnlDdXN0b21lck9yZGVySW5wdXQsXG4gIFN1cHBvcnRUaWNrZXRFdmVudFR5cGUsXG4gIFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZSxcbiAgU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgU3VwcG9ydFRpY2tldFR5cGVEYXRhXG59IGZyb20gJy4uL3R5cGVzL2NybS50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL3VzZXJzLnR5cGVzLmpzJztcblxuY29uc3Qgbm93ID0gKCk6IG51bWJlciA9PiBEYXRlLm5vdygpO1xuY29uc3QgY29sbGVjdGlvbiA9IChuYW1lOiBzdHJpbmcpID0+IGxpdGVyYWwobmFtZSk7XG5jb25zdCBkb2NLZXkgPSAodmFsdWUgPSAnJyk6IHN0cmluZyA9PiBwYXJzZUlkKFN0cmluZyh2YWx1ZSkpO1xuY29uc3QgZG9jSWQgPSAoY29sbGVjdGlvbk5hbWU6IHN0cmluZywga2V5ID0gJycpOiBzdHJpbmcgPT4gYCR7Y29sbGVjdGlvbk5hbWV9LyR7ZG9jS2V5KGtleSl9YDtcbmNvbnN0IGV4dGVybmFsS2V5ID0gKHByZWZpeDogc3RyaW5nLCBpZCA9ICcnKTogc3RyaW5nID0+IGNyZWF0ZUhhc2goYCR7cHJlZml4fS0ke1N0cmluZyhpZCl9YCwgbnVsbCk7XG5jb25zdCBjbGVhblN0cmluZyA9ICh2YWx1ZTogdW5rbm93biwgbGVuZ3RoID0gNjQwKTogc3RyaW5nID0+IHBhcnNlU3RyaW5nKFN0cmluZyh2YWx1ZSB8fCAnJyksIGxlbmd0aCk7XG5jb25zdCBjbGVhbkV4dGVybmFsSWQgPSAodmFsdWU6IHVua25vd24sIGxlbmd0aCA9IDMyMCk6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUgfHwgJycpLnRyaW0oKS5zbGljZSgwLCBsZW5ndGgpO1xuY29uc3QgZW5zdXJlRG9jdW1lbnRDb2xsZWN0aW9uID0gYXN5bmMgKGRhdGFiYXNlOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VEYj4sIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0YXJnZXQgPSBkYXRhYmFzZS5jb2xsZWN0aW9uKG5hbWUpO1xuICBpZihhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBkYXRhYmFzZS5jcmVhdGVDb2xsZWN0aW9uKG5hbWUpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgaWYoIWF3YWl0IHRhcmdldC5leGlzdHMoKSkgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5jb25zdCBlbnN1cmVFZGdlQ29sbGVjdGlvbiA9IGFzeW5jIChkYXRhYmFzZTogUmV0dXJuVHlwZTx0eXBlb2YgdXNlRGI+LCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdGFyZ2V0ID0gZGF0YWJhc2UuY29sbGVjdGlvbihuYW1lKTtcbiAgaWYoYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgZGF0YWJhc2UuY3JlYXRlRWRnZUNvbGxlY3Rpb24obmFtZSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBpZighYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuY29uc3QgcmVxdWlyZUNybUFkbWluID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiB2b2lkID0+IHtcbiAgaWYoIWlzQWRtaW5Vc2VyKGNvbnRleHQuc2Vzc2lvbiBhcyBhbnkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZG1pbmlzdHJhdG9yX2FjY2Vzc19yZXF1aXJlZCcpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IHJlcXVpcmVDcm1BZG1pbmlzdHJhdG9yID0gcmVxdWlyZUNybUFkbWluO1xuXG5jb25zdCBhbGxvd2VkQ29udGFjdEZpZWxkcyA9IG5ldyBTZXQoWydlbWFpbCcsICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAncGhvbmUnLCAnbWFya2V0aW5nQ29uc2VudFNvdXJjZScsICdjcm1Tb3VyY2UnXSk7XG5jb25zdCBzdXBwb3J0UHJpb3JpdGllcyA9IG5ldyBTZXQoWydsb3cnLCAnbm9ybWFsJywgJ2hpZ2gnLCAndXJnZW50J10pO1xuY29uc3Qgc3VwcG9ydFN0YXR1c2VzID0gbmV3IFNldChbJ3N1Ym1pdHRlZCcsICdpbl9wcm9ncmVzcycsICdkb25lJywgJ2NvbXBsZXRlZCddKTtcbmNvbnN0IHN1cHBvcnRUeXBlcyA9IG5ldyBTZXQoWydkZWxpdmVyeV9pc3N1ZScsICdyZWZ1bmRfcmVxdWVzdCcsICdidWdfcmVwb3J0JywgJ2FjY291bnRfaXNzdWUnLCAnZ2VuZXJhbF9zdXBwb3J0J10pO1xuY29uc3QgZW1haWxQYXR0ZXJuID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC91O1xuY29uc3QgZXNjYXBlSHRtbCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHZhbHVlLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG5jb25zdCBzYW5pdGl6ZUh0bWwgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKVxuICAucmVwbGFjZSgvPChzY3JpcHR8aWZyYW1lfG9iamVjdHxlbWJlZClcXGJbXj5dKj5bXFxzXFxTXSo/PFxcL1xcMT4vZ2ksICcnKVxuICAucmVwbGFjZSgvXFxzb25cXHcrXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzPl0rKS9naSwgJycpO1xuY29uc3Qgc2FuaXRpemVDc3MgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKVxuICAucmVwbGFjZSgvPFxcLz9zdHlsZVxcYltePl0qPi9naSwgJycpXG4gIC5yZXBsYWNlKC9AaW1wb3J0XFxzK1teO10rOz8vZ2ksICcnKVxuICAucmVwbGFjZSgvdXJsXFxzKlxcKFxccyooWydcIl0/KWphdmFzY3JpcHQ6W14pXStcXCkvZ2ksICcnKTtcbmNvbnN0IGh0bWxUb1RleHQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB2YWx1ZS5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbmNvbnN0IGNodW5rID0gPFQ+KGl0ZW1zOiByZWFkb25seSBUW10sIHNpemU6IG51bWJlcik6IFRbXVtdID0+IHtcbiAgY29uc3QgZ3JvdXBzOiBUW11bXSA9IFtdO1xuICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ICs9IHNpemUpIGdyb3Vwcy5wdXNoKGl0ZW1zLnNsaWNlKGluZGV4LCBpbmRleCArIHNpemUpKTtcbiAgcmV0dXJuIGdyb3Vwcztcbn07XG5cbmV4cG9ydCBjb25zdCBzdWJtaXRDcm1Gb3JtID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogQ3JtRm9ybVN1Ym1pc3Npb25JbnB1dFxuKTogUHJvbWlzZTxDcm1Gb3JtU3VibWlzc2lvblR5cGU+ID0+IHtcbiAgaWYodHlwZW9mIGlucHV0Py5tYXJrZXRpbmdPcHRJbiAhPT0gJ2Jvb2xlYW4nKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX21hcmtldGluZ09wdEluJyk7XG4gIGNvbnN0IGVtYWlsID0gY2xlYW5TdHJpbmcoaW5wdXQuZW1haWwsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmF3UGhvbmUgPSBjbGVhblN0cmluZyhpbnB1dC5waG9uZSwgODApO1xuICBjb25zdCBwaG9uZSA9IHJhd1Bob25lID8gKHBhcnNlUGhvbmUocmF3UGhvbmUpIHx8IHJhd1Bob25lKSA6ICcnO1xuICBpZighZW1haWwgJiYgIXBob25lKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2VtYWlsX29yX3Bob25lJyk7XG5cbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGF3YWl0IGVuc3VyZURvY3VtZW50Q29sbGVjdGlvbihkYXRhYmFzZSwgQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3Qgc291cmNlID0gY2xlYW5TdHJpbmcoaW5wdXQuc291cmNlIHx8IGlucHV0LmZvcm1JZCB8fCAnZm9ybScsIDE2MCk7XG4gIGNvbnN0IHZhbHVlcyA9IGlucHV0LnZhbHVlcyB8fCB7fTtcbiAgY29uc3QgZmlyc3ROYW1lID0gY2xlYW5TdHJpbmcoaW5wdXQuZmlyc3ROYW1lIHx8IHZhbHVlcy5maXJzdE5hbWUsIDE2MCk7XG4gIGNvbnN0IGxhc3ROYW1lID0gY2xlYW5TdHJpbmcoaW5wdXQubGFzdE5hbWUgfHwgdmFsdWVzLmxhc3ROYW1lLCAxNjApO1xuICBjb25zdCBnZW5lcmF0ZWRVc2VyS2V5ID0gY3JlYXRlSGFzaChlbWFpbCB8fCBwaG9uZSwgbnVsbCk7XG4gIGNvbnN0IGNvbnNlbnQgPSBpbnB1dC5tYXJrZXRpbmdPcHRJblxuICAgID8ge21hcmtldGluZ09wdEluQXQ6IHRpbWVzdGFtcCwgbWFya2V0aW5nT3B0T3V0QXQ6IG51bGx9XG4gICAgOiB7bWFya2V0aW5nT3B0T3V0QXQ6IHRpbWVzdGFtcH07XG4gIGNvbnN0IHVzZXJJbnNlcnQgPSB7XG4gICAgX2tleTogZ2VuZXJhdGVkVXNlcktleSxcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lLFxuICAgIGxhc3ROYW1lLFxuICAgIG1haWxpbmdMaXN0OiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiBzb3VyY2UsXG4gICAgbWFya2V0aW5nT3B0SW46IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcGhvbmUsXG4gICAgdHlwZTogJ2NybUNvbnRhY3QnLFxuICAgIHVzZXJBY2Nlc3M6IDAsXG4gICAgdXNlcklkOiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIHZlcmlmaWVkRW1haWw6IGZhbHNlLFxuICAgIHZlcmlmaWVkUGhvbmU6IGZhbHNlLFxuICAgIC4uLmNvbnNlbnRcbiAgfTtcbiAgY29uc3QgdXNlclVwZGF0ZSA9IHtcbiAgICAuLi4oZW1haWwgPyB7ZW1haWx9IDoge30pLFxuICAgIC4uLihmaXJzdE5hbWUgPyB7Zmlyc3ROYW1lfSA6IHt9KSxcbiAgICAuLi4obGFzdE5hbWUgPyB7bGFzdE5hbWV9IDoge30pLFxuICAgIC4uLihwaG9uZSA/IHtwaG9uZX0gOiB7fSksXG4gICAgbWFpbGluZ0xpc3Q6IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6IHNvdXJjZSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi5jb25zZW50XG4gIH07XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgTEVUIGV4aXN0aW5nID0gRklSU1QoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgKCR7ZW1haWx9ICE9IFwiXCIgJiYgTE9XRVIodXNlci5lbWFpbCB8fCBcIlwiKSA9PSAke2VtYWlsfSlcbiAgICAgICAgICB8fCAoJHtwaG9uZX0gIT0gXCJcIiAmJiB1c2VyLnBob25lID09ICR7cGhvbmV9KVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiB1c2VyXG4gICAgKVxuICAgIExFVCB1c2VyS2V5ID0gZXhpc3RpbmcgPyBleGlzdGluZy5fa2V5IDogJHtnZW5lcmF0ZWRVc2VyS2V5fVxuICAgIFVQU0VSVCB7X2tleTogdXNlcktleX1cbiAgICBJTlNFUlQgTUVSR0UoJHt1c2VySW5zZXJ0fSwge19rZXk6IHVzZXJLZXksIHVzZXJJZDogdXNlcktleX0pXG4gICAgVVBEQVRFICR7dXNlclVwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBjb25zdCB1c2VySWQgPSBkb2NLZXkoU3RyaW5nKHVzZXI/Ll9rZXkgfHwgdXNlcj8udXNlcklkIHx8IGdlbmVyYXRlZFVzZXJLZXkpKTtcblxuICBjb25zdCBzdWJtaXNzaW9uSWQgPSBjcmVhdGVIYXNoKGBjcm0tc3VibWlzc2lvbi0ke3RpbWVzdGFtcH0tJHtlbWFpbH0tJHtwaG9uZX1gLCBudWxsKTtcbiAgY29uc3Qgc3VibWlzc2lvbiA9IHtcbiAgICBfa2V5OiBzdWJtaXNzaW9uSWQsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmb3JtSWQ6IGNsZWFuU3RyaW5nKGlucHV0LmZvcm1JZCwgMTYwKSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwaG9uZSxcbiAgICBzb3VyY2UsXG4gICAgc3VibWlzc2lvbklkLFxuICAgIHVzZXJJZCxcbiAgICB2YWx1ZXNcbiAgfTtcbiAgY29uc3Qgc2F2ZWQgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgSU5TRVJUICR7c3VibWlzc2lvbn0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgcmV0dXJuIHNhdmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENybUZvcm1TdWJtaXNzaW9ucyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxDcm1Gb3JtU3VibWlzc2lvblR5cGVbXT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICBpZighYXdhaXQgZGF0YWJhc2UuY29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fRk9STV9TVUJNSVNTSU9OUykuZXhpc3RzKCkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgICAgRk9SIHN1Ym1pc3Npb24gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKX1cbiAgICAgICAgU09SVCBzdWJtaXNzaW9uLmFkZGVkIERFU0NcbiAgICAgICAgTElNSVQgNTAwXG4gICAgICAgIFJFVFVSTiBzdWJtaXNzaW9uXG4gICAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xuICB9KSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENybUNvbnRhY3RzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZpbHRlcjogQ3JtQ29udGFjdEZpbHRlciA9IHt9KTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgY29uc3Qgc2VhcmNoID0gY2xlYW5TdHJpbmcoZmlsdGVyLnNlYXJjaCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmaWVsZCA9IGFsbG93ZWRDb250YWN0RmllbGRzLmhhcyhmaWx0ZXIuZmllbGQgfHwgJycpID8gU3RyaW5nKGZpbHRlci5maWVsZCkgOiAnJztcbiAgY29uc3QgdmFsdWUgPSBjbGVhblN0cmluZyhmaWx0ZXIudmFsdWUsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgb3B0ZWRJbk9ubHkgPSBmaWx0ZXIub3B0ZWRJbk9ubHkgIT09IGZhbHNlO1xuICBjb25zdCBvcGVyYXRvciA9IFsnY29udGFpbnMnLCAnZXF1YWxzJywgJ2V4aXN0cyddLmluY2x1ZGVzKGZpbHRlci5vcGVyYXRvciB8fCAnJykgPyBmaWx0ZXIub3BlcmF0b3IgOiAnY29udGFpbnMnO1xuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgRklMVEVSICR7IW9wdGVkSW5Pbmx5fSB8fCB1c2VyLm1hcmtldGluZ09wdEluID09IHRydWVcbiAgICAgIEZJTFRFUiAkeyFzZWFyY2h9IHx8IENPTlRBSU5TKExPV0VSKENPTkNBVF9TRVBBUkFUT1IoXCIgXCIsIHVzZXIuZmlyc3ROYW1lLCB1c2VyLmxhc3ROYW1lLCB1c2VyLmVtYWlsLCB1c2VyLnBob25lKSksICR7c2VhcmNofSlcbiAgICAgIEZJTFRFUiAkeyFmaWVsZH0gfHwgKCR7b3BlcmF0b3IgPT09ICdleGlzdHMnfVxuICAgICAgICA/IEhBUyh1c2VyLCAke2ZpZWxkfSlcbiAgICAgICAgOiAoJHtvcGVyYXRvciA9PT0gJ2VxdWFscyd9ID8gTE9XRVIoVE9fU1RSSU5HKHVzZXJbJHtmaWVsZH1dKSkgPT0gJHt2YWx1ZX0gOiBDT05UQUlOUyhMT1dFUihUT19TVFJJTkcodXNlclske2ZpZWxkfV0pKSwgJHt2YWx1ZX0pKSlcbiAgICAgIFNPUlQgdXNlci5hZGRlZCBERVNDXG4gICAgICBMSU1JVCAxMDAwXG4gICAgICBSRVRVUk4gTUVSR0UodXNlciwge2NybVNvdXJjZTogdXNlci5tYXJrZXRpbmdDb25zZW50U291cmNlfSlcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbmRDcm1DYW1wYWlnbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IENybUNhbXBhaWduSW5wdXRcbik6IFByb21pc2U8Q3JtQ2FtcGFpZ25UeXBlPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgY29uc3Qgc3ViamVjdCA9IGNsZWFuU3RyaW5nKGlucHV0LnN1YmplY3QsIDMyMCk7XG4gIGNvbnN0IGJvZHlIdG1sID0gc2FuaXRpemVIdG1sKGlucHV0Lmh0bWwpO1xuICBjb25zdCBjc3MgPSBzYW5pdGl6ZUNzcyhpbnB1dC5jc3MpO1xuICBpZighc3ViamVjdCB8fCAhYm9keUh0bWwpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfY2FtcGFpZ25fY29udGVudCcpO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBhd2FpdCBnZXRDcm1Db250YWN0cyhjb250ZXh0LCB7Li4uaW5wdXQuZmlsdGVyLCBvcHRlZEluT25seTogdHJ1ZX0pO1xuICBjb25zdCBzZWxlY3RlZElkcyA9IG5ldyBTZXQoKGlucHV0LnVzZXJJZHMgfHwgW10pLm1hcCgoaWQpID0+IGRvY0tleShpZCkpKTtcbiAgY29uc3QgcmVjaXBpZW50cyA9IGNhbmRpZGF0ZXMuZmlsdGVyKCh1c2VyKSA9PlxuICAgIEJvb2xlYW4odXNlci5lbWFpbCkgJiYgKCFzZWxlY3RlZElkcy5zaXplIHx8IHNlbGVjdGVkSWRzLmhhcyhkb2NLZXkodXNlci51c2VySWQgfHwgdXNlci5fa2V5KSkpKTtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGNhbXBhaWduSWQgPSBjcmVhdGVIYXNoKGBjcm0tY2FtcGFpZ24tJHt0aW1lc3RhbXB9LSR7c3ViamVjdH1gLCBudWxsKTtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IGNhbXBhaWduID0ge1xuICAgIF9rZXk6IGNhbXBhaWduSWQsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBjYW1wYWlnbklkLFxuICAgIGNzcyxcbiAgICBmYWlsZWRDb3VudDogMCxcbiAgICBodG1sOiBib2R5SHRtbCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHJlY2lwaWVudENvdW50OiByZWNpcGllbnRzLmxlbmd0aCxcbiAgICBzZW50Q291bnQ6IDAsXG4gICAgc3RhdHVzOiAnc2VuZGluZycsXG4gICAgc3ViamVjdFxuICB9O1xuICBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgSU5TRVJUICR7Y2FtcGFpZ259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fQ0FNUEFJR05TKX1gKTtcblxuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBsZXQgc2VudENvdW50ID0gMDtcbiAgZm9yKGNvbnN0IHJlY2lwaWVudHNCYXRjaCBvZiBjaHVuayhyZWNpcGllbnRzLCA1MCkpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VzU2VuZCh7XG4gICAgICAgIERlc3RpbmF0aW9uOiB7QmNjQWRkcmVzc2VzOiByZWNpcGllbnRzQmF0Y2gubWFwKChyZWNpcGllbnQpID0+IFN0cmluZyhyZWNpcGllbnQuZW1haWwpKX0sXG4gICAgICAgIE1lc3NhZ2U6IHtcbiAgICAgICAgICBCb2R5OiB7SHRtbDoge0RhdGE6IGA8c3R5bGU+JHtjc3N9PC9zdHlsZT4ke2JvZHlIdG1sfWB9LCBUZXh0OiB7RGF0YTogaHRtbFRvVGV4dChib2R5SHRtbCl9fSxcbiAgICAgICAgICBTdWJqZWN0OiB7RGF0YTogc3ViamVjdH1cbiAgICAgICAgfSxcbiAgICAgICAgU291cmNlOiBgXCIke2NvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0TmFtZSB8fCAnUmVha3Rvcid9XCIgPCR7Y29udGV4dC5jb25maWc/LmRldGFpbHM/LnN1cHBvcnRFbWFpbCB8fCAnc3VwcG9ydEByZWFrdG9yLmlvJ30+YFxuICAgICAgfSk7XG4gICAgICBzZW50Q291bnQgKz0gcmVjaXBpZW50c0JhdGNoLmxlbmd0aDtcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgZmFpbGVkQ291bnQgKz0gcmVjaXBpZW50c0JhdGNoLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gey4uLmNhbXBhaWduLCBmYWlsZWRDb3VudCwgc2VudEF0OiBub3coKSwgc2VudENvdW50LCBzdGF0dXM6IGZhaWxlZENvdW50ID8gKHNlbnRDb3VudCA/ICdwYXJ0aWFsJyA6ICdmYWlsZWQnKSA6ICdzZW50J307XG4gIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBVUERBVEUgJHtjYW1wYWlnbklkfSBXSVRIICR7e1xuICAgICAgZmFpbGVkQ291bnQ6IHJlc3VsdC5mYWlsZWRDb3VudCxcbiAgICAgIG1vZGlmaWVkOiByZXN1bHQuc2VudEF0LFxuICAgICAgc2VudEF0OiByZXN1bHQuc2VudEF0LFxuICAgICAgc2VudENvdW50OiByZXN1bHQuc2VudENvdW50LFxuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzXG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9DQU1QQUlHTlMpfVxuICBgKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHNhdmVFZGdlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBlZGdlQ29sbGVjdGlvbjogc3RyaW5nLFxuICBlZGdlS2V5OiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBlZGdlID0ge1xuICAgIF9mcm9tOiBmcm9tLFxuICAgIF9rZXk6IGVkZ2VLZXksXG4gICAgX3RvOiB0byxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgLi4uZGF0YVxuICB9O1xuICBjb25zdCBxdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke2VkZ2VLZXl9fVxuICAgIElOU0VSVCAke2VkZ2V9XG4gICAgVVBEQVRFICR7ZGF0YX0gSU4gJHtjb2xsZWN0aW9uKGVkZ2VDb2xsZWN0aW9uKX1cbiAgYDtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU1haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogUGFydGlhbDxNYWlsaW5nTGlzdFR5cGU+XG4pOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgbWFpbGluZ0xpc3RJZCA9IGRvY0tleShTdHJpbmcoaW5wdXQ/Lm1haWxpbmdMaXN0SWQgfHwgY3JlYXRlSGFzaChgbWFpbGluZy1saXN0LSR7aW5wdXQ/Lm5hbWV9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1haWxpbmdMaXN0ID0ge1xuICAgIF9rZXk6IG1haWxpbmdMaXN0SWQsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBjcmVhdGVkQnlVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgZGVzY3JpcHRpb246IGNsZWFuU3RyaW5nKGlucHV0Py5kZXNjcmlwdGlvbiwgMjAwMCksXG4gICAgbWFpbGluZ0xpc3RJZCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIG5hbWU6IGNsZWFuU3RyaW5nKGlucHV0Py5uYW1lLCAxNjApLFxuICAgIHN0YXR1czogaW5wdXQ/LnN0YXR1cyB8fCAnYWN0aXZlJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7bWFpbGluZ0xpc3RJZH19XG4gICAgSU5TRVJUICR7bWFpbGluZ0xpc3R9XG4gICAgVVBEQVRFICR7e1xuICAgICAgZGVzY3JpcHRpb246IG1haWxpbmdMaXN0LmRlc2NyaXB0aW9uLFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIG5hbWU6IG1haWxpbmdMaXN0Lm5hbWUsXG4gICAgICBzdGF0dXM6IG1haWxpbmdMaXN0LnN0YXR1c1xuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYWlsaW5nTGlzdHMgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIGxpc3QgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMpfVxuICAgICAgRklMVEVSIGxpc3Quc3RhdHVzICE9IFwiYXJjaGl2ZWRcIlxuICAgICAgU09SVCBsaXN0LmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiBsaXN0XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXJUb01haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nLFxuICBzb3VyY2UgPSAnbWFudWFsJ1xuKTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGUgfCBudWxsPiA9PiB7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkodXNlcklkKTtcbiAgY29uc3QgbGlzdEtleSA9IGRvY0tleShtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgZWRnZUtleSA9IGNyZWF0ZUhhc2goYGhhc01haWxpbmdMaXN0LSR7dXNlcktleX0tJHtsaXN0S2V5fWApO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX01BSUxJTkdfTElTVCxcbiAgICBlZGdlS2V5LFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBsaXN0S2V5KSxcbiAgICB7XG4gICAgICBhZGRlZEJ5VXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgICAgc291cmNlOiBjbGVhblN0cmluZyhzb3VyY2UsIDgwKSxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZSdcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUywgbGlzdEtleSl9KWApXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlVXNlckZyb21NYWlsaW5nTGlzdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG1haWxpbmdMaXN0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkodXNlcklkKTtcbiAgY29uc3QgbGlzdEtleSA9IGRvY0tleShtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgZWRnZUtleSA9IGNyZWF0ZUhhc2goYGhhc01haWxpbmdMaXN0LSR7dXNlcktleX0tJHtsaXN0S2V5fWApO1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgbW9kaWZpZWQ6IG5vdygpLFxuICAgIHJlbW92ZWRBdDogbm93KCksXG4gICAgc3RhdHVzOiAncmVtb3ZlZCdcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgVVBEQVRFICR7ZWRnZUtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpLnRoZW4oQm9vbGVhbik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWFpbGluZ0xpc3RVc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgbGlzdElkID0gZG9jSWQoQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUywgbWFpbGluZ0xpc3RJZCk7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB1c2VyLCBlZGdlIElOIDEuLjEgSU5CT1VORCAke2xpc3RJZH0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgICAgRklMVEVSIGVkZ2Uuc3RhdHVzID09IFwiYWN0aXZlXCJcbiAgICAgIFNPUlQgdXNlci5lbWFpbCBBU0NcbiAgICAgIFJFVFVSTiB1c2VyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlQdXJjaGFzZWRQcm9kdWN0ID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwcm9kdWN0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHByb2R1Y3RLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS1wcm9kdWN0JywgcHJvZHVjdElkKTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG9yZGVyIElOIDEuLjEgSU5CT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlNIT1BJRllfUFJPRFVDVFMsIHByb2R1Y3RLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1BVUkNIQVNFRF9QUk9EVUNUKX1cbiAgICAgIEZPUiB1c2VyIElOIDEuLjEgSU5CT1VORCBvcmRlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgIFNPUlQgdXNlci5lbWFpbCBBU0NcbiAgICAgICAgUkVUVVJOIERJU1RJTkNUIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RWxpZ2libGVNYWlsaW5nVXNlcnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG9wdGlvbnM6IHtyZWFkb25seSBtYWlsaW5nTGlzdElkPzogc3RyaW5nOyByZWFkb25seSBwcm9kdWN0SWQ/OiBzdHJpbmc7IHJlYWRvbmx5IGV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHM/OiBib29sZWFufSA9IHt9XG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cyA9IG9wdGlvbnMuZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cyAhPT0gZmFsc2U7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIExFVCBiYXNlVXNlcnMgPSAoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgdXNlci5tYXJrZXRpbmdPcHRJbiA9PSB0cnVlXG4gICAgICAgIEZJTFRFUiB1c2VyLmVtYWlsICE9IG51bGwgJiYgdXNlci5lbWFpbCAhPSBcIlwiXG4gICAgICAgIEZJTFRFUiB1c2VyLmVtYWlsRGVsaXZlcnlTdGF0dXMgPT0gbnVsbCB8fCB1c2VyLmVtYWlsRGVsaXZlcnlTdGF0dXMgPT0gXCJ2YWxpZFwiXG4gICAgICAgICR7b3B0aW9ucy5tYWlsaW5nTGlzdElkID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1IgbGlzdCBJTiAxLi4xIE9VVEJPVU5EIHVzZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfTUFJTElOR19MSVNUKX1cbiAgICAgICAgICAgICAgRklMVEVSIGxpc3QuX2tleSA9PSAke2RvY0tleShvcHRpb25zLm1haWxpbmdMaXN0SWQpfVxuICAgICAgICAgICAgICBSRVRVUk4gbGlzdFxuICAgICAgICAgICkgPiAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgJHtvcHRpb25zLnByb2R1Y3RJZCA/IGFxbGBcbiAgICAgICAgICBGSUxURVIgTEVOR1RIKFxuICAgICAgICAgICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgICAgICAgIEZPUiBwcm9kdWN0IElOIDEuLjEgT1VUQk9VTkQgb3JkZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QpfVxuICAgICAgICAgICAgICAgIEZJTFRFUiBwcm9kdWN0LnByb2R1Y3RJZCA9PSAke1N0cmluZyhvcHRpb25zLnByb2R1Y3RJZCl9XG4gICAgICAgICAgICAgICAgUkVUVVJOIHByb2R1Y3RcbiAgICAgICAgICApID4gMFxuICAgICAgICBgIDogYXFsYGB9XG4gICAgICAgICR7ZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cyA/IGFxbGBcbiAgICAgICAgICBGSUxURVIgTEVOR1RIKFxuICAgICAgICAgICAgRk9SIHRpY2tldCBJTiAxLi4xIE9VVEJPVU5EIHVzZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQpfVxuICAgICAgICAgICAgICBGSUxURVIgdGlja2V0LnN0YXR1cyBJTiBbXCJvcGVuXCIsIFwiaW5fcHJvZ3Jlc3NcIiwgXCJ3YWl0aW5nX29uX2N1c3RvbWVyXCIsIFwid2FpdGluZ19vbl9pbnRlcm5hbFwiXVxuICAgICAgICAgICAgICBGSUxURVIgdGlja2V0LnByaW9yaXR5IElOIFtcImhpZ2hcIiwgXCJ1cmdlbnRcIl1cbiAgICAgICAgICAgICAgUkVUVVJOIHRpY2tldFxuICAgICAgICAgICkgPT0gMFxuICAgICAgICBgIDogYXFsYGB9XG4gICAgICAgIFJFVFVSTiB1c2VyXG4gICAgKVxuICAgIEZPUiB1c2VyIElOIGJhc2VVc2Vyc1xuICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgUkVUVVJOIERJU1RJTkNUIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaW5nZXN0U2hvcGlmeUN1c3RvbWVyT3JkZXIgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBTaG9waWZ5Q3VzdG9tZXJPcmRlcklucHV0XG4pOiBQcm9taXNlPEN1c3RvbWVyT3JkZXJUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBzaG9waWZ5Q3VzdG9tZXJJZCA9IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5zaG9waWZ5Q3VzdG9tZXJJZCwgMTYwKTtcbiAgY29uc3Qgc2hvcGlmeU9yZGVySWQgPSBjbGVhbkV4dGVybmFsSWQoaW5wdXQuc2hvcGlmeU9yZGVySWQsIDE2MCk7XG4gIGNvbnN0IGN1c3RvbWVyID0gaW5wdXQuY3VzdG9tZXIgfHwge307XG4gIGNvbnN0IGVtYWlsID0gY2xlYW5TdHJpbmcoY3VzdG9tZXIuZW1haWwsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcHJvZHVjdElkcyA9IEFycmF5LmZyb20obmV3IFNldChbLi4uKGlucHV0LnByb2R1Y3RJZHMgfHwgW10pLCAuLi4oaW5wdXQucHJvZHVjdHMgfHwgW10pLm1hcCgocHJvZHVjdCkgPT4gcHJvZHVjdC5wcm9kdWN0SWQpXVxuICAgIC5tYXAoKHByb2R1Y3RJZCkgPT4gY2xlYW5FeHRlcm5hbElkKHByb2R1Y3RJZCwgMzIwKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pKSk7XG5cbiAgaWYoIXNob3BpZnlDdXN0b21lcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9zaG9waWZ5Q3VzdG9tZXJJZCcpO1xuICB9XG4gIGlmKCFzaG9waWZ5T3JkZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc2hvcGlmeU9yZGVySWQnKTtcbiAgfVxuICBpZighZW1haWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2N1c3RvbWVyRW1haWwnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS11c2VyJywgc2hvcGlmeUN1c3RvbWVySWQpO1xuICBjb25zdCB1c2VySW5zZXJ0ID0ge1xuICAgIF9rZXk6IHVzZXJLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmZpcnN0TmFtZSwgMTYwKSxcbiAgICBsYXN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIubGFzdE5hbWUsIDE2MCksXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogJ3Nob3BpZnknLFxuICAgIG1hcmtldGluZ09wdEluOiBjdXN0b21lci5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZSxcbiAgICBtYXJrZXRpbmdPcHRJbkF0OiBjdXN0b21lci5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZSA/IHRpbWVzdGFtcCA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkLFxuICAgIHR5cGU6ICdjcm1Db250YWN0JyxcbiAgICB1c2VySWQ6IHVzZXJLZXlcbiAgfTtcbiAgY29uc3QgdXNlclVwZGF0ZSA9IHtcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmZpcnN0TmFtZSwgMTYwKSxcbiAgICBsYXN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIubGFzdE5hbWUsIDE2MCksXG4gICAgbGFzdFB1cmNoYXNlZEF0OiBpbnB1dC5wdXJjaGFzZWRBdCB8fCB0aW1lc3RhbXAsXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogJ3Nob3BpZnknLFxuICAgIG1hcmtldGluZ09wdEluOiBjdXN0b21lci5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkXG4gIH07XG4gIGNvbnN0IHVzZXJRdWVyeSA9IGFxbGBcbiAgICBMRVQgZXhpc3RpbmcgPSBGSVJTVChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiB1c2VyLnNob3BpZnlDdXN0b21lcklkID09ICR7c2hvcGlmeUN1c3RvbWVySWR9IHx8IHVzZXIuZW1haWwgPT0gJHtlbWFpbH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdXNlclxuICAgIClcbiAgICBMRVQgdXNlcktleSA9IGV4aXN0aW5nID8gZXhpc3RpbmcuX2tleSA6ICR7dXNlcktleX1cbiAgICBVUFNFUlQge19rZXk6IHVzZXJLZXl9XG4gICAgSU5TRVJUIE1FUkdFKCR7dXNlckluc2VydH0sIHtfa2V5OiB1c2VyS2V5LCB1c2VySWQ6IHVzZXJLZXl9KVxuICAgIFVQREFURSAke3VzZXJVcGRhdGV9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB1c2VyID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHVzZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZTtcbiAgY29uc3QgcmVzb2x2ZWRVc2VyS2V5ID0gZG9jS2V5KFN0cmluZyh1c2VyPy5fa2V5IHx8IHVzZXI/LnVzZXJJZCB8fCB1c2VyS2V5KSk7XG4gIGNvbnN0IG9yZGVyS2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktb3JkZXInLCBzaG9waWZ5T3JkZXJJZCk7XG4gIGNvbnN0IG9yZGVyID0ge1xuICAgIF9rZXk6IG9yZGVyS2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgY3VycmVuY3k6IGNsZWFuU3RyaW5nKGlucHV0LmN1cnJlbmN5LCAzKS50b1VwcGVyQ2FzZSgpLFxuICAgIGN1c3RvbWVyT3JkZXJJZDogb3JkZXJLZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwcm9kdWN0SWRzLFxuICAgIHB1cmNoYXNlZEF0OiBpbnB1dC5wdXJjaGFzZWRBdCB8fCB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWQsXG4gICAgc2hvcGlmeU9yZGVySWQsXG4gICAgdG90YWxQcmljZTogTnVtYmVyKGlucHV0LnRvdGFsUHJpY2UgfHwgMCksXG4gICAgdXNlcklkOiByZXNvbHZlZFVzZXJLZXlcbiAgfTtcbiAgY29uc3Qgb3JkZXJRdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7b3JkZXJLZXl9fVxuICAgIElOU0VSVCAke29yZGVyfVxuICAgIFVQREFURSAke3tcbiAgICAgIGN1cnJlbmN5OiBvcmRlci5jdXJyZW5jeSxcbiAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICBwcm9kdWN0SWRzLFxuICAgICAgcHVyY2hhc2VkQXQ6IG9yZGVyLnB1cmNoYXNlZEF0LFxuICAgICAgdG90YWxQcmljZTogb3JkZXIudG90YWxQcmljZSxcbiAgICAgIHVzZXJJZDogcmVzb2x2ZWRVc2VyS2V5XG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZE9yZGVyID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KG9yZGVyUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgQ3VzdG9tZXJPcmRlclR5cGU7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIsXG4gICAgY3JlYXRlSGFzaChgaGFzQ3VzdG9tZXJPcmRlci0ke3Jlc29sdmVkVXNlcktleX0tJHtvcmRlcktleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgcmVzb2x2ZWRVc2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMsIG9yZGVyS2V5KSxcbiAgICB7cHVyY2hhc2VkQXQ6IG9yZGVyLnB1cmNoYXNlZEF0LCBzaG9waWZ5Q3VzdG9tZXJJZCwgc2hvcGlmeU9yZGVySWR9XG4gICk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvZHVjdElkcy5tYXAoYXN5bmMgKHByb2R1Y3RJZCkgPT4ge1xuICAgIGNvbnN0IHByb2R1Y3QgPSAoaW5wdXQucHJvZHVjdHMgfHwgW10pLmZpbmQoKGl0ZW0pID0+IGl0ZW0ucHJvZHVjdElkID09PSBwcm9kdWN0SWQpIHx8IHtwcm9kdWN0SWR9O1xuICAgIGNvbnN0IHByb2R1Y3RLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS1wcm9kdWN0JywgcHJvZHVjdElkKTtcbiAgICBjb25zdCBwcm9kdWN0RG9jID0ge1xuICAgICAgX2tleTogcHJvZHVjdEtleSxcbiAgICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcHJvZHVjdElkLFxuICAgICAgdGl0bGU6IGNsZWFuU3RyaW5nKHByb2R1Y3QudGl0bGUsIDMyMCksXG4gICAgICB2YXJpYW50SWQ6IGNsZWFuRXh0ZXJuYWxJZChwcm9kdWN0LnZhcmlhbnRJZCwgMTYwKVxuICAgIH07XG4gICAgY29uc3QgcHJvZHVjdFF1ZXJ5ID0gYXFsYFxuICAgICAgVVBTRVJUIHtfa2V5OiAke3Byb2R1Y3RLZXl9fVxuICAgICAgSU5TRVJUICR7cHJvZHVjdERvY31cbiAgICAgIFVQREFURSAke3tcbiAgICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgICAgdGl0bGU6IHByb2R1Y3REb2MudGl0bGUsXG4gICAgICAgIHZhcmlhbnRJZDogcHJvZHVjdERvYy52YXJpYW50SWRcbiAgICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TSE9QSUZZX1BST0RVQ1RTKX1cbiAgICBgO1xuICAgIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShwcm9kdWN0UXVlcnkpO1xuICAgIGF3YWl0IHNhdmVFZGdlKFxuICAgICAgY29udGV4dCxcbiAgICAgIEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCxcbiAgICAgIGNyZWF0ZUhhc2goYGhhc1B1cmNoYXNlZFByb2R1Y3QtJHtvcmRlcktleX0tJHtwcm9kdWN0S2V5fWApLFxuICAgICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTLCBvcmRlcktleSksXG4gICAgICBkb2NJZChDT0xMRUNUSU9OUy5TSE9QSUZZX1BST0RVQ1RTLCBwcm9kdWN0S2V5KSxcbiAgICAgIHtwcm9kdWN0SWQsIHB1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdH1cbiAgICApO1xuICB9KSk7XG5cbiAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICBVUERBVEUgJHtyZXNvbHZlZFVzZXJLZXl9XG4gICAgV0lUSCB7XG4gICAgICBsYXN0UHVyY2hhc2VkQXQ6ICR7b3JkZXIucHVyY2hhc2VkQXR9LFxuICAgICAgdG90YWxPcmRlckNvdW50OiBMRU5HVEgoXG4gICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgIFJFVFVSTiBvcmRlclxuICAgICAgKSxcbiAgICAgIHRvdGFsU3BlbmQ6IFNVTShcbiAgICAgICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgcmVzb2x2ZWRVc2VyS2V5KX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgICAgUkVUVVJOIFRPX05VTUJFUihvcmRlci50b3RhbFByaWNlKVxuICAgICAgKVxuICAgIH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgYCk7XG5cbiAgcmV0dXJuIHNhdmVkT3JkZXI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VzdG9tZXJPcmRlcnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyT3JkZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcklkKX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICBTT1JUIG9yZGVyLnB1cmNoYXNlZEF0IERFU0NcbiAgICAgIFJFVFVSTiBvcmRlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmNvbnN0IHNlbmRTdXBwb3J0VGlja2V0RW1haWwgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRpY2tldDogU3VwcG9ydFRpY2tldFR5cGVEYXRhLFxuICBkZXRhaWxzOiBzdHJpbmcsXG4gIGhlYWRpbmc6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB0aWNrZXQudXNlcklkKX0pXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBpZighdXNlcj8uZW1haWwpIHJldHVybjtcbiAgY29uc3Qgc3VwcG9ydE5hbWUgPSBjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydE5hbWUgfHwgQ29uZmlnLmdldCgnZGV0YWlscy5zdXBwb3J0TmFtZScpIHx8ICdSZWFrdG9yIFN1cHBvcnQnO1xuICBjb25zdCBzdXBwb3J0RW1haWwgPSBjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydEVtYWlsIHx8IENvbmZpZy5nZXQoJ2RldGFpbHMuc3VwcG9ydEVtYWlsJykgfHwgJ3N1cHBvcnRAcmVha3Rvci5pbyc7XG4gIGNvbnN0IHRpY2tldE51bWJlciA9IFN0cmluZyh0aWNrZXQudGlja2V0TnVtYmVyIHx8IHRpY2tldC5zdXBwb3J0VGlja2V0SWQgfHwgdGlja2V0Ll9rZXkgfHwgJycpO1xuICBjb25zdCBzdGF0dXNVcmwgPSBgaHR0cHM6Ly9jcm0ucmVha3Rvci5pby9zdXBwb3J0L3N0YXR1cz90aWNrZXQ9JHtlbmNvZGVVUklDb21wb25lbnQodGlja2V0TnVtYmVyKX1gO1xuICBjb25zdCB0ZXh0ID0gYCR7aGVhZGluZ31cXG5cXG5UaWNrZXQ6ICR7dGlja2V0TnVtYmVyfVxcblN0YXR1czogJHt0aWNrZXQuc3RhdHVzIHx8ICdzdWJtaXR0ZWQnfVxcblxcbiR7ZGV0YWlsc31cXG5cXG5UcmFjayB0aGlzIHRpY2tldDogJHtzdGF0dXNVcmx9YDtcbiAgYXdhaXQgc2VzU2VuZCh7XG4gICAgRGVzdGluYXRpb246IHtUb0FkZHJlc3NlczogW1N0cmluZyh1c2VyLmVtYWlsKV19LFxuICAgIE1lc3NhZ2U6IHtcbiAgICAgIEJvZHk6IHtIdG1sOiB7RGF0YTogYDxoMT4ke2VzY2FwZUh0bWwoaGVhZGluZyl9PC9oMT48cD48c3Ryb25nPlRpY2tldDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHRpY2tldE51bWJlcil9PC9wPjxwPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoU3RyaW5nKHRpY2tldC5zdGF0dXMgfHwgJ3N1Ym1pdHRlZCcpKX08L3A+PHByZSBzdHlsZT1cIndoaXRlLXNwYWNlOnByZS13cmFwO2ZvbnQtZmFtaWx5OmluaGVyaXRcIj4ke2VzY2FwZUh0bWwoZGV0YWlscyl9PC9wcmU+PHA+PGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChzdGF0dXNVcmwpfVwiPlRyYWNrIHRoaXMgdGlja2V0IG9ubGluZTwvYT48L3A+YH0sIFRleHQ6IHtEYXRhOiB0ZXh0fX0sXG4gICAgICBTdWJqZWN0OiB7RGF0YTogYFske3RpY2tldE51bWJlcn1dICR7aGVhZGluZ31gfVxuICAgIH0sXG4gICAgU291cmNlOiBgXCIke3N1cHBvcnROYW1lfVwiIDwke3N1cHBvcnRFbWFpbH0+YFxuICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVN1cHBvcnRUaWNrZXQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgY3JlYXRlSGFzaChgc3VwcG9ydC10aWNrZXQtJHt1c2VyS2V5fS0ke3RpbWVzdGFtcH1gKSkpO1xuICBjb25zdCB0aWNrZXROdW1iZXIgPSBjbGVhblN0cmluZyhpbnB1dC50aWNrZXROdW1iZXIsIDgwKSB8fCBgUktULSR7bmV3IERhdGUodGltZXN0YW1wKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKS5yZXBsYWNlKC8tL2csICcnKX0tJHt0aWNrZXRLZXkuc2xpY2UoMCwgOCkudG9VcHBlckNhc2UoKX1gO1xuICBjb25zdCB0aWNrZXQgPSB7XG4gICAgX2tleTogdGlja2V0S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYXNzaWduZWRUb1VzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hc3NpZ25lZFRvVXNlcklkIHx8ICcnKSksXG4gICAgZGVzY3JpcHRpb246IGNsZWFuU3RyaW5nKGlucHV0LmRlc2NyaXB0aW9uLCA0MDAwKSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHByaW9yaXR5OiBpbnB1dC5wcmlvcml0eSB8fCAnbm9ybWFsJyxcbiAgICBwcm9kdWN0SWQ6IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5wcm9kdWN0SWQsIDMyMCksXG4gICAgc2hvcGlmeU9yZGVySWQ6IGNsZWFuU3RyaW5nKGlucHV0LnNob3BpZnlPcmRlcklkLCAxNjApLFxuICAgIHN0YXR1czogJ3N1Ym1pdHRlZCcsXG4gICAgc3ViamVjdDogY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0aWNrZXROdW1iZXIsXG4gICAgdHlwZTogaW5wdXQudHlwZSB8fCAnZ2VuZXJhbF9zdXBwb3J0JyxcbiAgICB1c2VySWQ6IHVzZXJLZXlcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgSU5TRVJUICR7dGlja2V0fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkVGlja2V0ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXQtJHt1c2VyS2V5fS0ke3RpY2tldEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpLFxuICAgIHtwcmlvcml0eTogdGlja2V0LnByaW9yaXR5LCBzdGF0dXM6IHRpY2tldC5zdGF0dXMsIHR5cGU6IHRpY2tldC50eXBlfVxuICApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCB1c2VyS2V5KSksXG4gICAgZXZlbnRUeXBlOiAnc3VibWl0dGVkJyxcbiAgICBtZXRhZGF0YToge2RldGFpbHM6IHRpY2tldC5kZXNjcmlwdGlvbn0sXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogdGlja2V0LnN0YXR1c1xuICB9KTtcblxuICByZXR1cm4gc2F2ZWRUaWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc3VibWl0UHVibGljU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFB1YmxpY1N1cHBvcnRUaWNrZXRJbnB1dFxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhpbnB1dC5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IGNsZWFuU3RyaW5nKGlucHV0LmRlc2NyaXB0aW9uLCA0MDAwKTtcbiAgY29uc3Qgc3ViamVjdCA9IGNsZWFuU3RyaW5nKGlucHV0LnN1YmplY3QsIDMyMCk7XG4gIGlmKCFlbWFpbFBhdHRlcm4udGVzdChlbWFpbCkpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfdmFsaWRfZW1haWwnKTtcbiAgaWYoIXN1YmplY3QpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc3ViamVjdCcpO1xuICBpZighZGVzY3JpcHRpb24pIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfZGVzY3JpcHRpb24nKTtcblxuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyxcbiAgICBDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyxcbiAgICBDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsXG4gICAgQ09MTEVDVElPTlMuVVNFUlNcbiAgXS5tYXAoKG5hbWUpID0+IGVuc3VyZURvY3VtZW50Q29sbGVjdGlvbihkYXRhYmFzZSwgbmFtZSkpKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0VcbiAgXS5tYXAoKG5hbWUpID0+IGVuc3VyZUVkZ2VDb2xsZWN0aW9uKGRhdGFiYXNlLCBuYW1lKSkpO1xuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBnZW5lcmF0ZWRVc2VyS2V5ID0gY3JlYXRlSGFzaChlbWFpbCwgbnVsbCk7XG4gIGNvbnN0IG9wdGVkSW4gPSBpbnB1dC5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGlucHV0LmZpcnN0TmFtZSwgMTYwKSxcbiAgICBsYXN0TmFtZTogY2xlYW5TdHJpbmcoaW5wdXQubGFzdE5hbWUsIDE2MCksXG4gICAgbWFpbGluZ0xpc3Q6IG9wdGVkSW4sXG4gICAgbWFya2V0aW5nT3B0SW46IG9wdGVkSW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICB1c2VySWQ6IGdlbmVyYXRlZFVzZXJLZXlcbiAgfTtcbiAgY29uc3QgdXNlclVwZGF0ZSA9IHtcbiAgICAuLi4ob3B0ZWRJbiA/IHttYWlsaW5nTGlzdDogdHJ1ZSwgbWFya2V0aW5nT3B0SW46IHRydWUsIG1hcmtldGluZ09wdEluQXQ6IHRpbWVzdGFtcH0gOiB7fSksXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUsIDE2MCkgfHwgdW5kZWZpbmVkLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSwgMTYwKSB8fCB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcFxuICB9O1xuICBjb25zdCB1c2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIFVQU0VSVCB7ZW1haWw6ICR7ZW1haWx9fVxuICAgICAgSU5TRVJUICR7dXNlckluc2VydH1cbiAgICAgIFVQREFURSAke3VzZXJVcGRhdGV9XG4gICAgICBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgUkVUVVJOIE5FV1xuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFVzZXJUeXBlO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCBjcmVhdGVTdXBwb3J0VGlja2V0KGNvbnRleHQsIHtcbiAgICBkZXNjcmlwdGlvbixcbiAgICBwcmlvcml0eTogc3VwcG9ydFByaW9yaXRpZXMuaGFzKFN0cmluZyhpbnB1dC5wcmlvcml0eSkpID8gaW5wdXQucHJpb3JpdHkgOiAnbm9ybWFsJyxcbiAgICBzdWJqZWN0LFxuICAgIHR5cGU6IHN1cHBvcnRUeXBlcy5oYXMoU3RyaW5nKGlucHV0LnR5cGUpKSA/IGlucHV0LnR5cGUgOiAnZ2VuZXJhbF9zdXBwb3J0JyxcbiAgICB1c2VySWQ6IFN0cmluZyh1c2VyPy5fa2V5IHx8IHVzZXI/LnVzZXJJZCB8fCBnZW5lcmF0ZWRVc2VyS2V5KVxuICB9KTtcbiAgYXdhaXQgc2VuZFN1cHBvcnRUaWNrZXRFbWFpbChjb250ZXh0LCB0aWNrZXQsIGRlc2NyaXB0aW9uLCAnV2UgcmVjZWl2ZWQgeW91ciBzdXBwb3J0IHRpY2tldCcpO1xuICByZXR1cm4gdGlja2V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFB1YmxpY1N1cHBvcnRUaWNrZXQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRpY2tldE51bWJlcjogc3RyaW5nLFxuICBlbWFpbEFkZHJlc3M6IHN0cmluZ1xuKTogUHJvbWlzZTxQdWJsaWNTdXBwb3J0VGlja2V0RmVlZCB8IG51bGw+ID0+IHtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhlbWFpbEFkZHJlc3MsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbnVtYmVyID0gY2xlYW5TdHJpbmcodGlja2V0TnVtYmVyLCA4MCkudG9VcHBlckNhc2UoKTtcbiAgaWYoIWVtYWlsUGF0dGVybi50ZXN0KGVtYWlsKSB8fCAhbnVtYmVyKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGlmKCFhd2FpdCBkYXRhYmFzZS5jb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUykuZXhpc3RzKCkpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIEZPUiB0aWNrZXQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgICBGSUxURVIgVVBQRVIodGlja2V0LnRpY2tldE51bWJlcikgPT0gJHtudW1iZXJ9XG4gICAgICBMRVQgdXNlciA9IERPQ1VNRU5UKCR7Q09MTEVDVElPTlMuVVNFUlN9LCB0aWNrZXQudXNlcklkKVxuICAgICAgRklMVEVSIExPV0VSKHVzZXIuZW1haWwpID09ICR7ZW1haWx9XG4gICAgICBMRVQgbWVzc2FnZXMgPSAoXG4gICAgICAgIEZPUiBtZXNzYWdlIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyl9XG4gICAgICAgICAgRklMVEVSIG1lc3NhZ2Uuc3VwcG9ydFRpY2tldElkID09IHRpY2tldC5fa2V5IEFORCBtZXNzYWdlLnZpc2liaWxpdHkgPT0gXCJjdXN0b21lclwiXG4gICAgICAgICAgU09SVCBtZXNzYWdlLmFkZGVkIEFTQ1xuICAgICAgICAgIFJFVFVSTiBtZXNzYWdlXG4gICAgICApXG4gICAgICBMRVQgZXZlbnRzID0gKFxuICAgICAgICBGT1IgZXZlbnQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgICAgICAgRklMVEVSIGV2ZW50LnN1cHBvcnRUaWNrZXRJZCA9PSB0aWNrZXQuX2tleVxuICAgICAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICAgICAgUkVUVVJOIGV2ZW50XG4gICAgICApXG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4ge3RpY2tldCwgbWVzc2FnZXMsIGV2ZW50c31cbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBQcm9taXNlPFB1YmxpY1N1cHBvcnRUaWNrZXRGZWVkIHwgbnVsbD47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldHMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGZpbHRlcnM6IHtyZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7IHJlYWRvbmx5IHVzZXJJZD86IHN0cmluZ30gPSB7fVxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGFbXT4gPT4ge1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgaWYoIWF3YWl0IGRhdGFiYXNlLmNvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKS5leGlzdHMoKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgICAgRk9SIHRpY2tldCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICAgICAgJHtmaWx0ZXJzLnN0YXR1cyA/IGFxbGBGSUxURVIgdGlja2V0LnN0YXR1cyA9PSAke2ZpbHRlcnMuc3RhdHVzfWAgOiBhcWxgYH1cbiAgICAgICAgJHtmaWx0ZXJzLnVzZXJJZCA/IGFxbGBGSUxURVIgdGlja2V0LnVzZXJJZCA9PSAke2RvY0tleShmaWx0ZXJzLnVzZXJJZCl9YCA6IGFxbGBgfVxuICAgICAgICBMRVQgdXNlciA9IERPQ1VNRU5UKCR7Q09MTEVDVElPTlMuVVNFUlN9LCB0aWNrZXQudXNlcklkKVxuICAgICAgICBTT1JUIHRpY2tldC5hZGRlZCBERVNDXG4gICAgICAgIFJFVFVSTiBNRVJHRSh0aWNrZXQsIHt1c2VyfSlcbiAgICBgO1xuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xuICB9KSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVN1cHBvcnRUaWNrZXRTdGF0dXMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nLFxuICBzdGF0dXM6IFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIHJlc29sdXRpb25TdW1tYXJ5ID0gJydcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShzdXBwb3J0VGlja2V0SWQpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSlcbiAgICAucXVlcnkoYXFsYFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KX0pYClcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBTdXBwb3J0VGlja2V0VHlwZURhdGEgfCBudWxsO1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgLi4uKHN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgJiYge2NvbXBsZXRlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnZG9uZScgJiYge2RvbmVBdDogdGltZXN0YW1wLCByZXNvbHV0aW9uU3VtbWFyeTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApfSksXG4gICAgLi4uKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJyAmJiB7cmVzb2x2ZWRBdDogdGltZXN0YW1wLCByZXNvbHV0aW9uU3VtbWFyeTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApfSksXG4gICAgLi4uKHN0YXR1cyA9PT0gJ2Nsb3NlZCcgJiYge2Nsb3NlZEF0OiB0aW1lc3RhbXB9KSxcbiAgICBsYXN0VXBkYXRlRGV0YWlsczogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3RhdHVzXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke3RpY2tldEtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgU3VwcG9ydFRpY2tldFR5cGVEYXRhO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIGVkZ2UgSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICBGSUxURVIgZWRnZS5fdG8gPT0gJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSl9XG4gICAgICBVUERBVEUgZWRnZSBXSVRIICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICByZXNvbHZlZEF0OiBzdGF0dXMgPT09ICdyZXNvbHZlZCcgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1c1xuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gIGApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogJ3N0YXR1c19jaGFuZ2VkJyxcbiAgICBmcm9tVmFsdWU6IHByZXZpb3VzPy5zdGF0dXMsXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogc3RhdHVzXG4gIH0pO1xuXG4gIGlmKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJykge1xuICAgIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICAgIGJvZHk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5IHx8ICdZb3VyIHN1cHBvcnQgdGlja2V0IGhhcyBiZWVuIHJlc29sdmVkLicsIDQwMDApLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIHN1YmplY3Q6IGBSZXNvbHZlZDogJHt0aWNrZXQuc3ViamVjdCB8fCAnU3VwcG9ydCB0aWNrZXQnfWAsXG4gICAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9yZXNvbHZlZCcsXG4gICAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFByb2dyZXNzID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBzdXBwb3J0VGlja2V0SWQ6IHN0cmluZyxcbiAgc3RhdHVzOiBTdXBwb3J0VGlja2V0U3RhdHVzLFxuICBkZXRhaWxzOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgaWYoIXN1cHBvcnRTdGF0dXNlcy5oYXMoc3RhdHVzKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkX3N1cHBvcnRfdGlja2V0X3N0YXR1cycpO1xuICBjb25zdCBtYXJrZG93biA9IGNsZWFuU3RyaW5nKGRldGFpbHMsIDQwMDApO1xuICBpZighbWFya2Rvd24pIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfdXBkYXRlX2RldGFpbHMnKTtcbiAgY29uc3QgdGlja2V0ID0gYXdhaXQgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyhjb250ZXh0LCBzdXBwb3J0VGlja2V0SWQsIHN0YXR1cywgbWFya2Rvd24pO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0TWVzc2FnZShjb250ZXh0LCB7XG4gICAgYXV0aG9yVXNlcklkOiBTdHJpbmcoY29udGV4dC5zZXNzaW9uPy51c2VySWQgfHwgJycpLFxuICAgIGJvZHk6IG1hcmtkb3duLFxuICAgIHN1cHBvcnRUaWNrZXRJZCxcbiAgICB2aXNpYmlsaXR5OiAnY3VzdG9tZXInXG4gIH0pO1xuICBhd2FpdCBjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbihjb250ZXh0LCB7XG4gICAgYm9keTogbWFya2Rvd24sXG4gICAgc3RhdHVzOiAnc2VudCcsXG4gICAgc3ViamVjdDogYFRpY2tldCAke3RpY2tldC50aWNrZXROdW1iZXIgfHwgc3VwcG9ydFRpY2tldElkfTogJHtzdGF0dXMucmVwbGFjZSgvXy9nLCAnICcpfWAsXG4gICAgc3VwcG9ydFRpY2tldElkLFxuICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9wcm9ncmVzcycsXG4gICAgdXNlcklkOiB0aWNrZXQudXNlcklkXG4gIH0pO1xuICBhd2FpdCBzZW5kU3VwcG9ydFRpY2tldEVtYWlsKGNvbnRleHQsIHRpY2tldCwgbWFya2Rvd24sIGBTdXBwb3J0IHRpY2tldCAke3N0YXR1cy5yZXBsYWNlKC9fL2csICcgJyl9YCk7XG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpO1xuICBjb25zdCBtZXNzYWdlS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0TWVzc2FnZUlkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LW1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgX2tleTogbWVzc2FnZUtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGF1dGhvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hdXRob3JVc2VySWQgfHwgY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgYm9keTogY2xlYW5TdHJpbmcoaW5wdXQuYm9keSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICBzdXBwb3J0VGlja2V0TWVzc2FnZUlkOiBtZXNzYWdlS2V5LFxuICAgIHZpc2liaWxpdHk6IGlucHV0LnZpc2liaWxpdHkgfHwgJ2N1c3RvbWVyJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHttZXNzYWdlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRNZXNzYWdlID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldE1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7bWVzc2FnZUtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMsIG1lc3NhZ2VLZXkpLFxuICAgIHthdXRob3JVc2VySWQ6IG1lc3NhZ2UuYXV0aG9yVXNlcklkLCB2aXNpYmlsaXR5OiBtZXNzYWdlLnZpc2liaWxpdHl9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBtZXNzYWdlIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSl9XG4gICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gbWVzc2FnZVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IGV2ZW50S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0RXZlbnRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC1ldmVudC0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9LSR7aW5wdXQuZXZlbnRUeXBlfWApKSk7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIF9rZXk6IGV2ZW50S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYWN0b3JVc2VySWQgfHwgJycpKSxcbiAgICBldmVudFR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LmV2ZW50VHlwZSwgMTYwKSxcbiAgICBmcm9tVmFsdWU6IGNsZWFuU3RyaW5nKGlucHV0LmZyb21WYWx1ZSwgMzIwKSxcbiAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEgfHwge30sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0RXZlbnRJZDogZXZlbnRLZXksXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQudG9WYWx1ZSwgMzIwKVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtldmVudH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZEV2ZW50ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5ULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXRFdmVudC0ke3RpY2tldEtleX0tJHtldmVudEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLCBldmVudEtleSksXG4gICAge2FjdG9yVXNlcklkOiBldmVudC5hY3RvclVzZXJJZCwgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGV9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkRXZlbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBldmVudCBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCBzdXBwb3J0VGlja2V0SWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UKX1cbiAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gZXZlbnRcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZT5cbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5jdXN0b21lck5vdGlmaWNhdGlvbklkIHx8IGNyZWF0ZUhhc2goYGN1c3RvbWVyLW5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICBfa2V5OiBub3RpZmljYXRpb25LZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBjdXN0b21lck5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25LZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzZW50QXQ6IGlucHV0LnNlbnRBdCxcbiAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyB8fCAncXVldWVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKSxcbiAgICB0eXBlOiBjbGVhblN0cmluZyhpbnB1dC50eXBlLCAxNjApLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtub3RpZmljYXRpb259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkTm90aWZpY2F0aW9uID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7bm90aWZpY2F0aW9uS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TLCBub3RpZmljYXRpb25LZXkpLFxuICAgIHtcbiAgICAgIHN0YXR1czogbm90aWZpY2F0aW9uLnN0YXR1cyxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogbm90aWZpY2F0aW9uLnN1cHBvcnRUaWNrZXRJZCxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBzYXZlZE5vdGlmaWNhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBub3RpZmljYXRpb24gSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTil9XG4gICAgICBTT1JUIG5vdGlmaWNhdGlvbi5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbm90aWZpY2F0aW9uXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlUGhvbmUiLCJwYXJzZVN0cmluZyIsImFxbCIsImxpdGVyYWwiLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwiQ29uZmlnIiwidXNlRGIiLCJpc0FkbWluVXNlciIsInNlc1NlbmQiLCJub3ciLCJEYXRlIiwiY29sbGVjdGlvbiIsIm5hbWUiLCJkb2NLZXkiLCJ2YWx1ZSIsIlN0cmluZyIsImRvY0lkIiwiY29sbGVjdGlvbk5hbWUiLCJrZXkiLCJleHRlcm5hbEtleSIsInByZWZpeCIsImlkIiwiY2xlYW5TdHJpbmciLCJsZW5ndGgiLCJjbGVhbkV4dGVybmFsSWQiLCJ0cmltIiwic2xpY2UiLCJlbnN1cmVEb2N1bWVudENvbGxlY3Rpb24iLCJkYXRhYmFzZSIsInRhcmdldCIsImV4aXN0cyIsImNyZWF0ZUNvbGxlY3Rpb24iLCJlcnJvciIsImVuc3VyZUVkZ2VDb2xsZWN0aW9uIiwiY3JlYXRlRWRnZUNvbGxlY3Rpb24iLCJyZXF1aXJlQ3JtQWRtaW4iLCJjb250ZXh0Iiwic2Vzc2lvbiIsIkVycm9yIiwicmVxdWlyZUNybUFkbWluaXN0cmF0b3IiLCJhbGxvd2VkQ29udGFjdEZpZWxkcyIsIlNldCIsInN1cHBvcnRQcmlvcml0aWVzIiwic3VwcG9ydFN0YXR1c2VzIiwic3VwcG9ydFR5cGVzIiwiZW1haWxQYXR0ZXJuIiwiZXNjYXBlSHRtbCIsInJlcGxhY2UiLCJzYW5pdGl6ZUh0bWwiLCJzYW5pdGl6ZUNzcyIsImh0bWxUb1RleHQiLCJjaHVuayIsIml0ZW1zIiwic2l6ZSIsImdyb3VwcyIsImluZGV4IiwicHVzaCIsInN1Ym1pdENybUZvcm0iLCJpbnB1dCIsIm1hcmtldGluZ09wdEluIiwiZW1haWwiLCJ0b0xvd2VyQ2FzZSIsInJhd1Bob25lIiwicGhvbmUiLCJkYXRhYmFzZU5hbWUiLCJDUk1fRk9STV9TVUJNSVNTSU9OUyIsInRpbWVzdGFtcCIsInNvdXJjZSIsImZvcm1JZCIsInZhbHVlcyIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZ2VuZXJhdGVkVXNlcktleSIsImNvbnNlbnQiLCJtYXJrZXRpbmdPcHRJbkF0IiwibWFya2V0aW5nT3B0T3V0QXQiLCJ1c2VySW5zZXJ0IiwiX2tleSIsImFjdGl2ZSIsImFkZGVkIiwibWFpbGluZ0xpc3QiLCJtYXJrZXRpbmdDb25zZW50U291cmNlIiwibW9kaWZpZWQiLCJ0eXBlIiwidXNlckFjY2VzcyIsInVzZXJJZCIsInZlcmlmaWVkRW1haWwiLCJ2ZXJpZmllZFBob25lIiwidXNlclVwZGF0ZSIsInVzZXIiLCJxdWVyeSIsIlVTRVJTIiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJzdWJtaXNzaW9uSWQiLCJzdWJtaXNzaW9uIiwic2F2ZWQiLCJnZXRDcm1Gb3JtU3VibWlzc2lvbnMiLCJhbGwiLCJnZXRDcm1Db250YWN0cyIsImZpbHRlciIsInNlYXJjaCIsImZpZWxkIiwiaGFzIiwib3B0ZWRJbk9ubHkiLCJvcGVyYXRvciIsImluY2x1ZGVzIiwic2VuZENybUNhbXBhaWduIiwic3ViamVjdCIsImJvZHlIdG1sIiwiaHRtbCIsImNzcyIsImNhbmRpZGF0ZXMiLCJzZWxlY3RlZElkcyIsInVzZXJJZHMiLCJtYXAiLCJyZWNpcGllbnRzIiwiQm9vbGVhbiIsImNhbXBhaWduSWQiLCJjYW1wYWlnbiIsImZhaWxlZENvdW50IiwicmVjaXBpZW50Q291bnQiLCJzZW50Q291bnQiLCJzdGF0dXMiLCJDUk1fQ0FNUEFJR05TIiwicmVjaXBpZW50c0JhdGNoIiwiRGVzdGluYXRpb24iLCJCY2NBZGRyZXNzZXMiLCJyZWNpcGllbnQiLCJNZXNzYWdlIiwiQm9keSIsIkh0bWwiLCJEYXRhIiwiVGV4dCIsIlN1YmplY3QiLCJTb3VyY2UiLCJjb25maWciLCJkZXRhaWxzIiwic3VwcG9ydE5hbWUiLCJzdXBwb3J0RW1haWwiLCJfZXJyb3IiLCJyZXN1bHQiLCJzZW50QXQiLCJzYXZlRWRnZSIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUtleSIsImZyb20iLCJ0byIsImRhdGEiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJjcmVhdGVNYWlsaW5nTGlzdCIsIm1haWxpbmdMaXN0SWQiLCJjcmVhdGVkQnlVc2VySWQiLCJkZXNjcmlwdGlvbiIsIk1BSUxJTkdfTElTVFMiLCJnZXRNYWlsaW5nTGlzdHMiLCJhZGRVc2VyVG9NYWlsaW5nTGlzdCIsInVzZXJLZXkiLCJsaXN0S2V5IiwiSEFTX01BSUxJTkdfTElTVCIsImFkZGVkQnlVc2VySWQiLCJyZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0IiwidXBkYXRlIiwicmVtb3ZlZEF0IiwiZ2V0TWFpbGluZ0xpc3RVc2VycyIsImxpc3RJZCIsImdldFVzZXJzQnlQdXJjaGFzZWRQcm9kdWN0IiwicHJvZHVjdElkIiwicHJvZHVjdEtleSIsIlNIT1BJRllfUFJPRFVDVFMiLCJIQVNfUFVSQ0hBU0VEX1BST0RVQ1QiLCJIQVNfQ1VTVE9NRVJfT1JERVIiLCJnZXRFbGlnaWJsZU1haWxpbmdVc2VycyIsIm9wdGlvbnMiLCJleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzIiwiSEFTX1NVUFBPUlRfVElDS0VUIiwiaW5nZXN0U2hvcGlmeUN1c3RvbWVyT3JkZXIiLCJzaG9waWZ5Q3VzdG9tZXJJZCIsInNob3BpZnlPcmRlcklkIiwiY3VzdG9tZXIiLCJwcm9kdWN0SWRzIiwiQXJyYXkiLCJwcm9kdWN0cyIsInByb2R1Y3QiLCJ1bmRlZmluZWQiLCJsYXN0UHVyY2hhc2VkQXQiLCJwdXJjaGFzZWRBdCIsInVzZXJRdWVyeSIsInJlc29sdmVkVXNlcktleSIsIm9yZGVyS2V5Iiwib3JkZXIiLCJjdXJyZW5jeSIsInRvVXBwZXJDYXNlIiwiY3VzdG9tZXJPcmRlcklkIiwidG90YWxQcmljZSIsIk51bWJlciIsIm9yZGVyUXVlcnkiLCJDVVNUT01FUl9PUkRFUlMiLCJzYXZlZE9yZGVyIiwiUHJvbWlzZSIsImZpbmQiLCJpdGVtIiwicHJvZHVjdERvYyIsInRpdGxlIiwidmFyaWFudElkIiwicHJvZHVjdFF1ZXJ5IiwiZ2V0Q3VzdG9tZXJPcmRlcnNCeVVzZXIiLCJzZW5kU3VwcG9ydFRpY2tldEVtYWlsIiwidGlja2V0IiwiaGVhZGluZyIsImdldCIsInRpY2tldE51bWJlciIsInN1cHBvcnRUaWNrZXRJZCIsInN0YXR1c1VybCIsImVuY29kZVVSSUNvbXBvbmVudCIsInRleHQiLCJUb0FkZHJlc3NlcyIsImNhdGNoIiwiY3JlYXRlU3VwcG9ydFRpY2tldCIsInRpY2tldEtleSIsInRvSVNPU3RyaW5nIiwiYXNzaWduZWRUb1VzZXJJZCIsInByaW9yaXR5IiwiU1VQUE9SVF9USUNLRVRTIiwic2F2ZWRUaWNrZXQiLCJhZGRTdXBwb3J0VGlja2V0RXZlbnQiLCJhY3RvclVzZXJJZCIsImV2ZW50VHlwZSIsIm1ldGFkYXRhIiwidG9WYWx1ZSIsInN1Ym1pdFB1YmxpY1N1cHBvcnRUaWNrZXQiLCJ0ZXN0IiwiU1VQUE9SVF9USUNLRVRfRVZFTlRTIiwiU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMiLCJIQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQiLCJIQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSIsIm9wdGVkSW4iLCJnZXRQdWJsaWNTdXBwb3J0VGlja2V0IiwiZW1haWxBZGRyZXNzIiwibnVtYmVyIiwiZ2V0U3VwcG9ydFRpY2tldHMiLCJmaWx0ZXJzIiwidXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyIsInJlc29sdXRpb25TdW1tYXJ5IiwicHJldmlvdXMiLCJjb21wbGV0ZWRBdCIsImRvbmVBdCIsInJlc29sdmVkQXQiLCJjbG9zZWRBdCIsImxhc3RVcGRhdGVEZXRhaWxzIiwiZnJvbVZhbHVlIiwiY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24iLCJib2R5IiwidXBkYXRlU3VwcG9ydFRpY2tldFByb2dyZXNzIiwibWFya2Rvd24iLCJhZGRTdXBwb3J0VGlja2V0TWVzc2FnZSIsImF1dGhvclVzZXJJZCIsInZpc2liaWxpdHkiLCJtZXNzYWdlS2V5Iiwic3VwcG9ydFRpY2tldE1lc3NhZ2VJZCIsIm1lc3NhZ2UiLCJzYXZlZE1lc3NhZ2UiLCJnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMiLCJldmVudEtleSIsInN1cHBvcnRUaWNrZXRFdmVudElkIiwiZXZlbnQiLCJzYXZlZEV2ZW50IiwiZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyIsIm5vdGlmaWNhdGlvbktleSIsImN1c3RvbWVyTm90aWZpY2F0aW9uSWQiLCJub3RpZmljYXRpb24iLCJDVVNUT01FUl9OT1RJRklDQVRJT05TIiwic2F2ZWROb3RpZmljYXRpb24iLCJIQVNfQ1VTVE9NRVJfTk9USUZJQ0FUSU9OIiwiZ2V0Q3VzdG9tZXJOb3RpZmljYXRpb25zQnlVc2VyIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxVQUFVLEVBQUVDLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBQzFGLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQVFDLE9BQU8sUUFBTyxlQUFlO0FBRXJDLFNBQVFDLFdBQVcsRUFBRUMsS0FBSyxRQUFPLDhCQUE4QjtBQUMvRCxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ2hELFNBQVFDLFdBQVcsUUFBTywyQkFBMkI7QUFDckQsU0FBUUMsT0FBTyxRQUFPLGFBQWE7QUF1Qm5DLE1BQU1DLE1BQU0sSUFBY0MsS0FBS0QsR0FBRztBQUNsQyxNQUFNRSxhQUFhLENBQUNDLE9BQWlCVixRQUFRVTtBQUM3QyxNQUFNQyxTQUFTLENBQUNDLFFBQVEsRUFBRSxHQUFhaEIsUUFBUWlCLE9BQU9EO0FBQ3RELE1BQU1FLFFBQVEsQ0FBQ0MsZ0JBQXdCQyxNQUFNLEVBQUUsR0FBYSxHQUFHRCxlQUFlLENBQUMsRUFBRUosT0FBT0ssTUFBTTtBQUM5RixNQUFNQyxjQUFjLENBQUNDLFFBQWdCQyxLQUFLLEVBQUUsR0FBYXhCLFdBQVcsR0FBR3VCLE9BQU8sQ0FBQyxFQUFFTCxPQUFPTSxLQUFLLEVBQUU7QUFDL0YsTUFBTUMsY0FBYyxDQUFDUixPQUFnQlMsU0FBUyxHQUFHLEdBQWF2QixZQUFZZSxPQUFPRCxTQUFTLEtBQUtTO0FBQy9GLE1BQU1DLGtCQUFrQixDQUFDVixPQUFnQlMsU0FBUyxHQUFHLEdBQWFSLE9BQU9ELFNBQVMsSUFBSVcsSUFBSSxHQUFHQyxLQUFLLENBQUMs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