@nlabs/reaktor 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/LICENSE +74 -201
  2. package/README.md +62 -15
  3. package/lib/actions/analytics.d.ts +10 -0
  4. package/lib/actions/analytics.js +539 -0
  5. package/lib/actions/apps.js +2 -2
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +2 -2
  8. package/lib/actions/conversations.js +2 -2
  9. package/lib/actions/crm.d.ts +5 -1
  10. package/lib/actions/crm.js +226 -3
  11. package/lib/actions/crud.js +2 -2
  12. package/lib/actions/dynamodb.d.ts +1 -1
  13. package/lib/actions/dynamodb.js +2 -2
  14. package/lib/actions/email.d.ts +1 -1
  15. package/lib/actions/email.js +2 -2
  16. package/lib/actions/files.js +2 -2
  17. package/lib/actions/flags.d.ts +6 -0
  18. package/lib/actions/flags.js +147 -0
  19. package/lib/actions/groups.js +2 -2
  20. package/lib/actions/images.d.ts +1 -1
  21. package/lib/actions/images.js +2 -2
  22. package/lib/actions/index.d.ts +3 -2
  23. package/lib/actions/index.js +4 -3
  24. package/lib/actions/ios.js +1 -1
  25. package/lib/actions/locations.js +2 -2
  26. package/lib/actions/messages.js +2 -2
  27. package/lib/actions/notifications.d.ts +1 -1
  28. package/lib/actions/notifications.js +2 -2
  29. package/lib/actions/payments.d.ts +3 -3
  30. package/lib/actions/payments.js +144 -189
  31. package/lib/actions/personas.js +1 -1
  32. package/lib/actions/posts.d.ts +0 -4
  33. package/lib/actions/posts.js +2 -4
  34. package/lib/actions/query.js +2 -2
  35. package/lib/actions/reactions.js +2 -2
  36. package/lib/actions/rum.js +303 -25
  37. package/lib/actions/s3.d.ts +1 -1
  38. package/lib/actions/s3.js +2 -2
  39. package/lib/actions/search.js +2 -2
  40. package/lib/actions/sms.js +2 -2
  41. package/lib/actions/statistics.js +2 -2
  42. package/lib/actions/subscriptions.js +2 -2
  43. package/lib/actions/tags.js +2 -2
  44. package/lib/actions/users.js +59 -6
  45. package/lib/actions/videos.js +2 -2
  46. package/lib/adapters/arangoAdapter.js +1 -1
  47. package/lib/adapters/contentAdapter.js +2 -2
  48. package/lib/adapters/fileAdapter.js +1 -1
  49. package/lib/adapters/imageAdapter.js +1 -1
  50. package/lib/adapters/index.js +1 -1
  51. package/lib/adapters/messageAdapter.js +1 -1
  52. package/lib/adapters/postAdapter.js +1 -1
  53. package/lib/adapters/reaktorAdapter.js +1 -1
  54. package/lib/adapters/tagAdapter.d.ts +0 -1
  55. package/lib/adapters/tagAdapter.js +1 -2
  56. package/lib/adapters/userAdapter.d.ts +0 -1
  57. package/lib/adapters/userAdapter.js +1 -2
  58. package/lib/config.d.ts +10 -0
  59. package/lib/config.js +8 -2
  60. package/lib/constants/collections.d.ts +6 -3
  61. package/lib/constants/collections.js +7 -4
  62. package/lib/handlers/graphqlHandler.d.ts +2 -2
  63. package/lib/handlers/graphqlHandler.js +2 -19
  64. package/lib/index.d.ts +1 -1
  65. package/lib/index.js +2 -2
  66. package/lib/lambdas/actions/websockets.js +2 -2
  67. package/lib/lambdas/authorizer.js +2 -2
  68. package/lib/lambdas/connection.js +2 -2
  69. package/lib/lambdas/utils/message.js +2 -2
  70. package/lib/lambdas/utils/websocket.d.ts +1 -1
  71. package/lib/lambdas/utils/websocket.js +2 -2
  72. package/lib/mocks/conversation.js +1 -1
  73. package/lib/mocks/file.js +1 -1
  74. package/lib/mocks/group.js +1 -1
  75. package/lib/mocks/image.js +1 -1
  76. package/lib/mocks/post.js +1 -1
  77. package/lib/mocks/tag.js +1 -1
  78. package/lib/mocks/user.js +1 -1
  79. package/lib/mocks/video.js +1 -1
  80. package/lib/mutations/analytics/analytics.d.ts +1 -0
  81. package/lib/mutations/analytics/analytics.js +35 -0
  82. package/lib/mutations/content/content.js +2 -2
  83. package/lib/mutations/crm/crm.js +18 -4
  84. package/lib/mutations/events/events.js +2 -2
  85. package/lib/mutations/flags/flags.d.ts +1 -0
  86. package/lib/mutations/flags/flags.js +33 -0
  87. package/lib/mutations/groups/groups.js +2 -2
  88. package/lib/mutations/images/images.js +2 -2
  89. package/lib/mutations/index.d.ts +3 -1
  90. package/lib/mutations/index.js +13 -3
  91. package/lib/mutations/locations/locations.js +2 -2
  92. package/lib/mutations/messages/messages.js +2 -2
  93. package/lib/mutations/personas/personas.js +2 -2
  94. package/lib/mutations/posts/posts.js +2 -2
  95. package/lib/mutations/reactions/reactions.js +2 -2
  96. package/lib/mutations/rum/rum.js +2 -2
  97. package/lib/mutations/statistics/statistics.js +2 -2
  98. package/lib/mutations/subscriptions/subscriptions.js +2 -2
  99. package/lib/mutations/tags/tags.js +2 -2
  100. package/lib/mutations/users/users.js +30 -17
  101. package/lib/mutations/videos/videos.js +2 -2
  102. package/lib/objectTypes/analytics.d.ts +8 -0
  103. package/lib/objectTypes/analytics.js +147 -0
  104. package/lib/objectTypes/app.js +2 -2
  105. package/lib/objectTypes/bankAccount.js +2 -2
  106. package/lib/objectTypes/connection.js +2 -2
  107. package/lib/objectTypes/content.js +2 -2
  108. package/lib/objectTypes/conversation.js +2 -2
  109. package/lib/objectTypes/creditCard.js +2 -2
  110. package/lib/objectTypes/crm.d.ts +5 -0
  111. package/lib/objectTypes/crm.js +64 -2
  112. package/lib/objectTypes/document.js +1 -1
  113. package/lib/objectTypes/error.js +2 -2
  114. package/lib/objectTypes/event.js +2 -2
  115. package/lib/objectTypes/external.js +2 -2
  116. package/lib/objectTypes/file.js +2 -2
  117. package/lib/objectTypes/filter.js +2 -2
  118. package/lib/objectTypes/flag.d.ts +1 -0
  119. package/lib/objectTypes/flag.js +32 -0
  120. package/lib/objectTypes/group.js +2 -2
  121. package/lib/objectTypes/iapSubscription.js +2 -2
  122. package/lib/objectTypes/image.d.ts +1 -1
  123. package/lib/objectTypes/image.js +2 -2
  124. package/lib/objectTypes/index.d.ts +2 -0
  125. package/lib/objectTypes/index.js +3 -1
  126. package/lib/objectTypes/location.js +2 -2
  127. package/lib/objectTypes/message.js +2 -2
  128. package/lib/objectTypes/passcode.js +2 -2
  129. package/lib/objectTypes/persona.js +2 -2
  130. package/lib/objectTypes/plan.js +2 -2
  131. package/lib/objectTypes/post.js +2 -2
  132. package/lib/objectTypes/query.js +2 -2
  133. package/lib/objectTypes/reaction.js +2 -2
  134. package/lib/objectTypes/relation.js +2 -2
  135. package/lib/objectTypes/rum.js +4 -4
  136. package/lib/objectTypes/search.js +2 -2
  137. package/lib/objectTypes/statistics.js +2 -2
  138. package/lib/objectTypes/subscription.js +2 -2
  139. package/lib/objectTypes/tag.js +2 -2
  140. package/lib/objectTypes/user.js +2 -2
  141. package/lib/objectTypes/video.d.ts +1 -1
  142. package/lib/objectTypes/video.js +2 -2
  143. package/lib/queries/analytics/analytics.d.ts +1 -0
  144. package/lib/queries/analytics/analytics.js +41 -0
  145. package/lib/queries/content/content.js +2 -2
  146. package/lib/queries/crm/crm.js +15 -4
  147. package/lib/queries/events/events.js +2 -2
  148. package/lib/queries/flags/flags.d.ts +1 -0
  149. package/lib/queries/flags/flags.js +16 -0
  150. package/lib/queries/groups/groups.js +2 -2
  151. package/lib/queries/images/images.js +2 -2
  152. package/lib/queries/index.d.ts +3 -1
  153. package/lib/queries/index.js +13 -3
  154. package/lib/queries/locations/locations.js +2 -2
  155. package/lib/queries/messages/messages.js +1 -1
  156. package/lib/queries/personas/personas.js +2 -2
  157. package/lib/queries/posts/posts.js +2 -2
  158. package/lib/queries/query/query.js +2 -2
  159. package/lib/queries/reactions/reactions.js +2 -2
  160. package/lib/queries/statistics/statistics.js +2 -2
  161. package/lib/queries/subscriptions/subscriptions.js +1 -1
  162. package/lib/queries/tags/tags.js +2 -2
  163. package/lib/queries/users/users.js +2 -2
  164. package/lib/queries/videos/videos.js +2 -2
  165. package/lib/templates/email/layout.js +1 -1
  166. package/lib/templates/email/passwordForgot.js +1 -1
  167. package/lib/templates/email/passwordRecovery.js +1 -1
  168. package/lib/templates/email/verifyEmail.js +1 -1
  169. package/lib/templates/email/welcome.js +1 -1
  170. package/lib/templates/sms/passwordForgot.js +1 -1
  171. package/lib/templates/sms/passwordRecovery.js +1 -1
  172. package/lib/templates/sms/verifyEmail.js +1 -1
  173. package/lib/templates/sms/verifyPhone.js +1 -1
  174. package/lib/templates/sms/welcome.js +1 -1
  175. package/lib/types/analytics.types.d.ts +92 -0
  176. package/lib/types/analytics.types.js +6 -0
  177. package/lib/types/apps.types.d.ts +1 -1
  178. package/lib/types/apps.types.js +2 -2
  179. package/lib/types/arangodb.types.d.ts +2 -2
  180. package/lib/types/arangodb.types.js +2 -2
  181. package/lib/types/auth.types.d.ts +3 -1
  182. package/lib/types/auth.types.js +2 -2
  183. package/lib/types/connections.types.d.ts +1 -1
  184. package/lib/types/connections.types.js +2 -2
  185. package/lib/types/content.types.d.ts +1 -1
  186. package/lib/types/content.types.js +2 -2
  187. package/lib/types/conversations.types.d.ts +1 -1
  188. package/lib/types/conversations.types.js +2 -2
  189. package/lib/types/crm.types.d.ts +38 -1
  190. package/lib/types/crm.types.js +2 -2
  191. package/lib/types/email.types.d.ts +1 -1
  192. package/lib/types/email.types.js +2 -2
  193. package/lib/types/error.types.js +1 -1
  194. package/lib/types/files.types.d.ts +1 -1
  195. package/lib/types/files.types.js +2 -2
  196. package/lib/types/flags.types.d.ts +28 -0
  197. package/lib/types/flags.types.js +3 -0
  198. package/lib/types/google.types.d.ts +1 -1
  199. package/lib/types/google.types.js +2 -2
  200. package/lib/types/groups.types.d.ts +1 -1
  201. package/lib/types/groups.types.js +2 -2
  202. package/lib/types/images.types.d.ts +1 -1
  203. package/lib/types/images.types.js +2 -2
  204. package/lib/types/index.d.ts +3 -1
  205. package/lib/types/index.js +4 -2
  206. package/lib/types/locations.types.d.ts +1 -1
  207. package/lib/types/locations.types.js +2 -2
  208. package/lib/types/messages.types.d.ts +1 -1
  209. package/lib/types/messages.types.js +2 -2
  210. package/lib/types/notifications.types.d.ts +1 -1
  211. package/lib/types/notifications.types.js +2 -2
  212. package/lib/types/payments.types.d.ts +4 -1
  213. package/lib/types/payments.types.js +2 -2
  214. package/lib/types/personas.types.js +1 -1
  215. package/lib/types/posts.types.d.ts +1 -1
  216. package/lib/types/posts.types.js +2 -2
  217. package/lib/types/rum.types.d.ts +3 -3
  218. package/lib/types/rum.types.js +2 -2
  219. package/lib/types/statistics.types.js +1 -1
  220. package/lib/types/tags.types.d.ts +1 -1
  221. package/lib/types/tags.types.js +2 -2
  222. package/lib/types/users.types.d.ts +1 -1
  223. package/lib/types/users.types.js +2 -2
  224. package/lib/types/videos.types.d.ts +1 -1
  225. package/lib/types/videos.types.js +2 -2
  226. package/lib/types/websockets.types.d.ts +1 -1
  227. package/lib/types/websockets.types.js +2 -2
  228. package/lib/upload.js +4 -9
  229. package/lib/utils/adapterUtils.d.ts +1 -1
  230. package/lib/utils/adapterUtils.js +2 -2
  231. package/lib/utils/analyticsUtils.d.ts +1 -1
  232. package/lib/utils/analyticsUtils.js +2 -2
  233. package/lib/utils/aqlHelpers.d.ts +1 -1
  234. package/lib/utils/aqlHelpers.js +2 -2
  235. package/lib/utils/arangodbUtils.d.ts +9 -1
  236. package/lib/utils/arangodbUtils.js +10 -2
  237. package/lib/utils/authUtils.js +2 -2
  238. package/lib/utils/awsUtils.js +2 -2
  239. package/lib/utils/collectionRegistry.d.ts +1 -1
  240. package/lib/utils/collectionRegistry.js +17 -2
  241. package/lib/utils/contextUtils.d.ts +2 -2
  242. package/lib/utils/contextUtils.js +2 -2
  243. package/lib/utils/dbI18n.example.d.ts +1 -1
  244. package/lib/utils/dbI18n.example.js +2 -2
  245. package/lib/utils/dbI18n.js +2 -2
  246. package/lib/utils/googleTranslate.d.ts +1 -1
  247. package/lib/utils/googleTranslate.js +2 -2
  248. package/lib/utils/graphqlUtils.d.ts +1 -0
  249. package/lib/utils/graphqlUtils.js +1 -1
  250. package/lib/utils/imageUtils.js +1 -1
  251. package/lib/utils/index.d.ts +1 -1
  252. package/lib/utils/index.js +2 -2
  253. package/lib/utils/languageDetection.js +1 -1
  254. package/lib/utils/localeUtils.d.ts +1 -1
  255. package/lib/utils/localeUtils.example.d.ts +1 -1
  256. package/lib/utils/localeUtils.example.js +2 -2
  257. package/lib/utils/localeUtils.js +2 -2
  258. package/lib/utils/middlewareUtils.js +1 -1
  259. package/lib/utils/queryBuilder.d.ts +1 -1
  260. package/lib/utils/queryBuilder.js +2 -2
  261. package/lib/utils/schemaUtils.js +1 -1
  262. package/lib/utils/sessionUtils.js +2 -2
  263. package/lib/utils/stripeUtils.d.ts +1 -1
  264. package/lib/utils/stripeUtils.js +2 -2
  265. package/lib/utils/templateUtils.js +1 -1
  266. package/lib/utils/testUtils.js +2 -2
  267. package/lib/utils/translationQueue.d.ts +1 -1
  268. package/lib/utils/translationQueue.example.d.ts +1 -1
  269. package/lib/utils/translationQueue.example.js +2 -2
  270. package/lib/utils/translationQueue.js +2 -2
  271. package/lib/videoProcessing.js +1 -1
  272. package/package.json +43 -79
  273. package/lib/actions/websockets.d.ts +0 -20
  274. package/lib/actions/websockets.js +0 -164
  275. package/lib/mocks/nlabs.png +0 -0
@@ -1,11 +1,13 @@
1
1
  /**
2
2
  * Copyright (c) 2026-Present, Nitrogen Labs, Inc.
3
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
- */ import { createHash, parseId, parseString } from '@nlabs/utils/parsers/strings';
3
+ * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
+ */ import { createHash, parseId, parsePhone, parseString } from '@nlabs/utils/parsers/strings';
5
5
  import { aql } from 'arangojs';
6
6
  import { literal } from 'arangojs/aql';
7
7
  import { COLLECTIONS, EDGES } from '../constants/collections.js';
8
8
  import { useDb } from '../utils/arangodbUtils.js';
9
+ import { isAdminUser } from '../utils/sessionUtils.js';
10
+ import { sesSend } from './email.js';
9
11
  const now = ()=>Date.now();
10
12
  const collection = (name)=>literal(name);
11
13
  const docKey = (value = '')=>parseId(String(value));
@@ -13,6 +15,226 @@ const docId = (collectionName, key = '')=>`${collectionName}/${docKey(key)}`;
13
15
  const externalKey = (prefix, id = '')=>createHash(`${prefix}-${String(id)}`, null);
14
16
  const cleanString = (value, length = 640)=>parseString(String(value || ''), length);
15
17
  const cleanExternalId = (value, length = 320)=>String(value || '').trim().slice(0, length);
18
+ const requireCrmAdmin = (context)=>{
19
+ if (!isAdminUser(context.session)) {
20
+ throw new Error('administrator_access_required');
21
+ }
22
+ };
23
+ const allowedContactFields = new Set([
24
+ 'email',
25
+ 'firstName',
26
+ 'lastName',
27
+ 'phone',
28
+ 'marketingConsentSource',
29
+ 'crmSource'
30
+ ]);
31
+ const sanitizeHtml = (value)=>String(value || '').replace(/<(script|iframe|object|embed)\b[^>]*>[\s\S]*?<\/\1>/gi, '').replace(/\son\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, '');
32
+ const sanitizeCss = (value)=>String(value || '').replace(/<\/?style\b[^>]*>/gi, '').replace(/@import\s+[^;]+;?/gi, '').replace(/url\s*\(\s*(['"]?)javascript:[^)]+\)/gi, '');
33
+ const htmlToText = (value)=>value.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
34
+ const chunk = (items, size)=>{
35
+ const groups = [];
36
+ for(let index = 0; index < items.length; index += size)groups.push(items.slice(index, index + size));
37
+ return groups;
38
+ };
39
+ export const submitCrmForm = async (context, input)=>{
40
+ if (typeof input?.marketingOptIn !== 'boolean') throw new Error('required_marketingOptIn');
41
+ const email = cleanString(input.email, 320).toLowerCase();
42
+ const rawPhone = cleanString(input.phone, 80);
43
+ const phone = rawPhone ? parsePhone(rawPhone) || rawPhone : '';
44
+ if (!email && !phone) throw new Error('required_email_or_phone');
45
+ const database = useDb(context.databaseName);
46
+ const timestamp = now();
47
+ const source = cleanString(input.source || input.formId || 'form', 160);
48
+ const values = input.values || {};
49
+ const firstName = cleanString(input.firstName || values.firstName, 160);
50
+ const lastName = cleanString(input.lastName || values.lastName, 160);
51
+ const generatedUserKey = createHash(email || phone, null);
52
+ const consent = input.marketingOptIn ? {
53
+ marketingOptInAt: timestamp,
54
+ marketingOptOutAt: null
55
+ } : {
56
+ marketingOptOutAt: timestamp
57
+ };
58
+ const userInsert = {
59
+ _key: generatedUserKey,
60
+ active: false,
61
+ added: timestamp,
62
+ email,
63
+ firstName,
64
+ lastName,
65
+ mailingList: input.marketingOptIn,
66
+ marketingConsentSource: source,
67
+ marketingOptIn: input.marketingOptIn,
68
+ modified: timestamp,
69
+ phone,
70
+ type: 'crmContact',
71
+ userAccess: 0,
72
+ userId: generatedUserKey,
73
+ verifiedEmail: false,
74
+ verifiedPhone: false,
75
+ ...consent
76
+ };
77
+ const userUpdate = {
78
+ ...email ? {
79
+ email
80
+ } : {},
81
+ ...firstName ? {
82
+ firstName
83
+ } : {},
84
+ ...lastName ? {
85
+ lastName
86
+ } : {},
87
+ ...phone ? {
88
+ phone
89
+ } : {},
90
+ mailingList: input.marketingOptIn,
91
+ marketingConsentSource: source,
92
+ marketingOptIn: input.marketingOptIn,
93
+ modified: timestamp,
94
+ ...consent
95
+ };
96
+ const user = await database.query(aql`
97
+ LET existing = FIRST(
98
+ FOR user IN ${collection(COLLECTIONS.USERS)}
99
+ FILTER (${email} != "" && LOWER(user.email || "") == ${email})
100
+ || (${phone} != "" && user.phone == ${phone})
101
+ LIMIT 1
102
+ RETURN user
103
+ )
104
+ LET userKey = existing ? existing._key : ${generatedUserKey}
105
+ UPSERT {_key: userKey}
106
+ INSERT MERGE(${userInsert}, {_key: userKey, userId: userKey})
107
+ UPDATE ${userUpdate} IN ${collection(COLLECTIONS.USERS)}
108
+ RETURN NEW
109
+ `).then((cursor)=>cursor.next());
110
+ const userId = docKey(String(user?._key || user?.userId || generatedUserKey));
111
+ const submissionId = createHash(`crm-submission-${timestamp}-${email}-${phone}`, null);
112
+ const submission = {
113
+ _key: submissionId,
114
+ added: timestamp,
115
+ email,
116
+ formId: cleanString(input.formId, 160),
117
+ marketingOptIn: input.marketingOptIn,
118
+ modified: timestamp,
119
+ phone,
120
+ source,
121
+ submissionId,
122
+ userId,
123
+ values
124
+ };
125
+ const saved = await database.query(aql`
126
+ INSERT ${submission} IN ${collection(COLLECTIONS.CRM_FORM_SUBMISSIONS)}
127
+ RETURN NEW
128
+ `).then((cursor)=>cursor.next());
129
+ return saved;
130
+ };
131
+ export const getCrmFormSubmissions = (context)=>{
132
+ 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());
139
+ };
140
+ export const getCrmContacts = (context, filter = {})=>{
141
+ requireCrmAdmin(context);
142
+ const search = cleanString(filter.search, 320).toLowerCase();
143
+ const field = allowedContactFields.has(filter.field || '') ? String(filter.field) : '';
144
+ const value = cleanString(filter.value, 320).toLowerCase();
145
+ const optedInOnly = filter.optedInOnly !== false;
146
+ const operator = [
147
+ 'contains',
148
+ 'equals',
149
+ 'exists'
150
+ ].includes(filter.operator || '') ? filter.operator : 'contains';
151
+ return useDb(context.databaseName).query(aql`
152
+ FOR user IN ${collection(COLLECTIONS.USERS)}
153
+ FILTER ${!optedInOnly} || user.marketingOptIn == true
154
+ FILTER ${!search} || CONTAINS(LOWER(CONCAT_SEPARATOR(" ", user.firstName, user.lastName, user.email, user.phone)), ${search})
155
+ FILTER ${!field} || (${operator === 'exists'}
156
+ ? HAS(user, ${field})
157
+ : (${operator === 'equals'} ? LOWER(TO_STRING(user[${field}])) == ${value} : CONTAINS(LOWER(TO_STRING(user[${field}])), ${value})))
158
+ SORT user.added DESC
159
+ LIMIT 1000
160
+ RETURN MERGE(user, {crmSource: user.marketingConsentSource})
161
+ `).then((cursor)=>cursor.all());
162
+ };
163
+ export const sendCrmCampaign = async (context, input)=>{
164
+ requireCrmAdmin(context);
165
+ const subject = cleanString(input.subject, 320);
166
+ const bodyHtml = sanitizeHtml(input.html);
167
+ const css = sanitizeCss(input.css);
168
+ if (!subject || !bodyHtml) throw new Error('required_campaign_content');
169
+ const candidates = await getCrmContacts(context, {
170
+ ...input.filter,
171
+ optedInOnly: true
172
+ });
173
+ const selectedIds = new Set((input.userIds || []).map((id)=>docKey(id)));
174
+ const recipients = candidates.filter((user)=>Boolean(user.email) && (!selectedIds.size || selectedIds.has(docKey(user.userId || user._key))));
175
+ const timestamp = now();
176
+ const campaignId = createHash(`crm-campaign-${timestamp}-${subject}`, null);
177
+ const database = useDb(context.databaseName);
178
+ const campaign = {
179
+ _key: campaignId,
180
+ added: timestamp,
181
+ campaignId,
182
+ css,
183
+ failedCount: 0,
184
+ html: bodyHtml,
185
+ modified: timestamp,
186
+ recipientCount: recipients.length,
187
+ sentCount: 0,
188
+ status: 'sending',
189
+ subject
190
+ };
191
+ await database.query(aql`INSERT ${campaign} IN ${collection(COLLECTIONS.CRM_CAMPAIGNS)}`);
192
+ let failedCount = 0;
193
+ let sentCount = 0;
194
+ for (const recipientsBatch of chunk(recipients, 50)){
195
+ try {
196
+ await sesSend({
197
+ Destination: {
198
+ BccAddresses: recipientsBatch.map((recipient)=>String(recipient.email))
199
+ },
200
+ Message: {
201
+ Body: {
202
+ Html: {
203
+ Data: `<style>${css}</style>${bodyHtml}`
204
+ },
205
+ Text: {
206
+ Data: htmlToText(bodyHtml)
207
+ }
208
+ },
209
+ Subject: {
210
+ Data: subject
211
+ }
212
+ },
213
+ Source: `"${context.config?.details?.supportName || 'Reaktor'}" <${context.config?.details?.supportEmail || 'support@reaktor.io'}>`
214
+ });
215
+ sentCount += recipientsBatch.length;
216
+ } catch (_error) {
217
+ failedCount += recipientsBatch.length;
218
+ }
219
+ }
220
+ const result = {
221
+ ...campaign,
222
+ failedCount,
223
+ sentAt: now(),
224
+ sentCount,
225
+ status: failedCount ? sentCount ? 'partial' : 'failed' : 'sent'
226
+ };
227
+ await database.query(aql`
228
+ UPDATE ${campaignId} WITH ${{
229
+ failedCount: result.failedCount,
230
+ modified: result.sentAt,
231
+ sentAt: result.sentAt,
232
+ sentCount: result.sentCount,
233
+ status: result.status
234
+ }} IN ${collection(COLLECTIONS.CRM_CAMPAIGNS)}
235
+ `);
236
+ return result;
237
+ };
16
238
  const saveEdge = async (context, edgeCollection, edgeKey, from, to, data = {})=>{
17
239
  const timestamp = now();
18
240
  const edge = {
@@ -181,6 +403,7 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
181
403
  marketingOptInAt: customer.marketingOptIn === true ? timestamp : undefined,
182
404
  modified: timestamp,
183
405
  shopifyCustomerId,
406
+ type: 'crmContact',
184
407
  userId: userKey
185
408
  };
186
409
  const userUpdate = {
@@ -495,4 +718,4 @@ export const getCustomerNotificationsByUser = (context, userId)=>{
495
718
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
496
719
  };
497
720
 
498
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvY3JtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlSWQsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tZXJOb3RpZmljYXRpb25UeXBlLFxuICBDdXN0b21lck9yZGVyVHlwZSxcbiAgTWFpbGluZ0xpc3RUeXBlLFxuICBTaG9waWZ5Q3VzdG9tZXJPcmRlcklucHV0LFxuICBTdXBwb3J0VGlja2V0RXZlbnRUeXBlLFxuICBTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGUsXG4gIFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIFN1cHBvcnRUaWNrZXRUeXBlRGF0YVxufSBmcm9tICcuLi90eXBlcy9jcm0udHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IG5vdyA9ICgpOiBudW1iZXIgPT4gRGF0ZS5ub3coKTtcbmNvbnN0IGNvbGxlY3Rpb24gPSAobmFtZTogc3RyaW5nKSA9PiBsaXRlcmFsKG5hbWUpO1xuY29uc3QgZG9jS2V5ID0gKHZhbHVlID0gJycpOiBzdHJpbmcgPT4gcGFyc2VJZChTdHJpbmcodmFsdWUpKTtcbmNvbnN0IGRvY0lkID0gKGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsIGtleSA9ICcnKTogc3RyaW5nID0+IGAke2NvbGxlY3Rpb25OYW1lfS8ke2RvY0tleShrZXkpfWA7XG5jb25zdCBleHRlcm5hbEtleSA9IChwcmVmaXg6IHN0cmluZywgaWQgPSAnJyk6IHN0cmluZyA9PiBjcmVhdGVIYXNoKGAke3ByZWZpeH0tJHtTdHJpbmcoaWQpfWAsIG51bGwpO1xuY29uc3QgY2xlYW5TdHJpbmcgPSAodmFsdWU6IHVua25vd24sIGxlbmd0aCA9IDY0MCk6IHN0cmluZyA9PiBwYXJzZVN0cmluZyhTdHJpbmcodmFsdWUgfHwgJycpLCBsZW5ndGgpO1xuY29uc3QgY2xlYW5FeHRlcm5hbElkID0gKHZhbHVlOiB1bmtub3duLCBsZW5ndGggPSAzMjApOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCkuc2xpY2UoMCwgbGVuZ3RoKTtcblxuY29uc3Qgc2F2ZUVkZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGVkZ2VDb2xsZWN0aW9uOiBzdHJpbmcsXG4gIGVkZ2VLZXk6IHN0cmluZyxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGVkZ2UgPSB7XG4gICAgX2Zyb206IGZyb20sXG4gICAgX2tleTogZWRnZUtleSxcbiAgICBfdG86IHRvLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi5kYXRhXG4gIH07XG4gIGNvbnN0IHF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7ZWRnZUtleX19XG4gICAgSU5TRVJUICR7ZWRnZX1cbiAgICBVUERBVEUgJHtkYXRhfSBJTiAke2NvbGxlY3Rpb24oZWRnZUNvbGxlY3Rpb24pfVxuICBgO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPE1haWxpbmdMaXN0VHlwZT5cbik6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBtYWlsaW5nTGlzdElkID0gZG9jS2V5KFN0cmluZyhpbnB1dD8ubWFpbGluZ0xpc3RJZCB8fCBjcmVhdGVIYXNoKGBtYWlsaW5nLWxpc3QtJHtpbnB1dD8ubmFtZX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3QgbWFpbGluZ0xpc3QgPSB7XG4gICAgX2tleTogbWFpbGluZ0xpc3RJZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGNyZWF0ZWRCeVVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQ/LmRlc2NyaXB0aW9uLCAyMDAwKSxcbiAgICBtYWlsaW5nTGlzdElkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgbmFtZTogY2xlYW5TdHJpbmcoaW5wdXQ/Lm5hbWUsIDE2MCksXG4gICAgc3RhdHVzOiBpbnB1dD8uc3RhdHVzIHx8ICdhY3RpdmUnXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHttYWlsaW5nTGlzdElkfX1cbiAgICBJTlNFUlQgJHttYWlsaW5nTGlzdH1cbiAgICBVUERBVEUgJHt7XG4gICAgICBkZXNjcmlwdGlvbjogbWFpbGluZ0xpc3QuZGVzY3JpcHRpb24sXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgbmFtZTogbWFpbGluZ0xpc3QubmFtZSxcbiAgICAgIHN0YXR1czogbWFpbGluZ0xpc3Quc3RhdHVzXG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1haWxpbmdMaXN0cyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgbGlzdCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUyl9XG4gICAgICBGSUxURVIgbGlzdC5zdGF0dXMgIT0gXCJhcmNoaXZlZFwiXG4gICAgICBTT1JUIGxpc3QuYWRkZWQgREVTQ1xuICAgICAgUkVUVVJOIGxpc3RcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlclRvTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmcsXG4gIHNvdXJjZSA9ICdtYW51YWwnXG4pOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZSB8IG51bGw+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfTUFJTElOR19MSVNULFxuICAgIGVkZ2VLZXksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIGxpc3RLZXkpLFxuICAgIHtcbiAgICAgIGFkZGVkQnlVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgICBzb3VyY2U6IGNsZWFuU3RyaW5nKHNvdXJjZSwgODApLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJ1xuICAgIH1cbiAgKTtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbGBSRVRVUk4gRE9DVU1FTlQoJHtkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBsaXN0S2V5KX0pYClcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBtb2RpZmllZDogbm93KCksXG4gICAgcmVtb3ZlZEF0OiBub3coKSxcbiAgICBzdGF0dXM6ICdyZW1vdmVkJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBVUERBVEUgJHtlZGdlS2V5fSBXSVRIICR7dXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkudGhlbihCb29sZWFuKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYWlsaW5nTGlzdFVzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBsaXN0SWQgPSBkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIHVzZXIsIGVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7bGlzdElkfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgICBGSUxURVIgZWRnZS5zdGF0dXMgPT0gXCJhY3RpdmVcIlxuICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgUkVUVVJOIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHByb2R1Y3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgcHJvZHVjdEtleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBwcm9kdWN0SWQpO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1Igb3JkZXIgSU4gMS4uMSBJTkJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QpfVxuICAgICAgRk9SIHVzZXIgSU4gMS4uMSBJTkJPVU5EIG9yZGVyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGlnaWJsZU1haWxpbmdVc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgb3B0aW9uczoge3JlYWRvbmx5IG1haWxpbmdMaXN0SWQ/OiBzdHJpbmc7IHJlYWRvbmx5IHByb2R1Y3RJZD86IHN0cmluZzsgcmVhZG9ubHkgZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cz86IGJvb2xlYW59ID0ge31cbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID0gb3B0aW9ucy5leGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzICE9PSBmYWxzZTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgTEVUIGJhc2VVc2VycyA9IChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiB1c2VyLm1hcmtldGluZ09wdEluID09IHRydWVcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWwgIT0gbnVsbCAmJiB1c2VyLmVtYWlsICE9IFwiXCJcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBudWxsIHx8IHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBcInZhbGlkXCJcbiAgICAgICAgJHtvcHRpb25zLm1haWxpbmdMaXN0SWQgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiBsaXN0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgICAgICAgICAgICBGSUxURVIgbGlzdC5fa2V5ID09ICR7ZG9jS2V5KG9wdGlvbnMubWFpbGluZ0xpc3RJZCl9XG4gICAgICAgICAgICAgIFJFVFVSTiBsaXN0XG4gICAgICAgICAgKSA+IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICAke29wdGlvbnMucHJvZHVjdElkID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICAgICAgRk9SIHByb2R1Y3QgSU4gMS4uMSBPVVRCT1VORCBvcmRlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCl9XG4gICAgICAgICAgICAgICAgRklMVEVSIHByb2R1Y3QucHJvZHVjdElkID09ICR7U3RyaW5nKG9wdGlvbnMucHJvZHVjdElkKX1cbiAgICAgICAgICAgICAgICBSRVRVUk4gcHJvZHVjdFxuICAgICAgICAgICkgPiAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgJHtleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1IgdGlja2V0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQuc3RhdHVzIElOIFtcIm9wZW5cIiwgXCJpbl9wcm9ncmVzc1wiLCBcIndhaXRpbmdfb25fY3VzdG9tZXJcIiwgXCJ3YWl0aW5nX29uX2ludGVybmFsXCJdXG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQucHJpb3JpdHkgSU4gW1wiaGlnaFwiLCBcInVyZ2VudFwiXVxuICAgICAgICAgICAgICBSRVRVUk4gdGlja2V0XG4gICAgICAgICAgKSA9PSAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgRk9SIHVzZXIgSU4gYmFzZVVzZXJzXG4gICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFNob3BpZnlDdXN0b21lck9yZGVySW5wdXRcbik6IFByb21pc2U8Q3VzdG9tZXJPcmRlclR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHNob3BpZnlDdXN0b21lcklkID0gY2xlYW5FeHRlcm5hbElkKGlucHV0LnNob3BpZnlDdXN0b21lcklkLCAxNjApO1xuICBjb25zdCBzaG9waWZ5T3JkZXJJZCA9IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5zaG9waWZ5T3JkZXJJZCwgMTYwKTtcbiAgY29uc3QgY3VzdG9tZXIgPSBpbnB1dC5jdXN0b21lciB8fCB7fTtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhjdXN0b21lci5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBwcm9kdWN0SWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi4oaW5wdXQucHJvZHVjdElkcyB8fCBbXSksIC4uLihpbnB1dC5wcm9kdWN0cyB8fCBbXSkubWFwKChwcm9kdWN0KSA9PiBwcm9kdWN0LnByb2R1Y3RJZCldXG4gICAgLm1hcCgocHJvZHVjdElkKSA9PiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdElkLCAzMjApKVxuICAgIC5maWx0ZXIoQm9vbGVhbikpKTtcblxuICBpZighc2hvcGlmeUN1c3RvbWVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3Nob3BpZnlDdXN0b21lcklkJyk7XG4gIH1cbiAgaWYoIXNob3BpZnlPcmRlcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9zaG9waWZ5T3JkZXJJZCcpO1xuICB9XG4gIGlmKCFlbWFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfY3VzdG9tZXJFbWFpbCcpO1xuICB9XG5cbiAgY29uc3QgdXNlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXVzZXInLCBzaG9waWZ5Q3VzdG9tZXJJZCk7XG4gIGNvbnN0IHVzZXJJbnNlcnQgPSB7XG4gICAgX2tleTogdXNlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5sYXN0TmFtZSwgMTYwKSxcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiAnc2hvcGlmeScsXG4gICAgbWFya2V0aW5nT3B0SW46IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlLFxuICAgIG1hcmtldGluZ09wdEluQXQ6IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlID8gdGltZXN0YW1wIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWQsXG4gICAgdXNlcklkOiB1c2VyS2V5XG4gIH07XG4gIGNvbnN0IHVzZXJVcGRhdGUgPSB7XG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmxhc3ROYW1lLCAxNjApLFxuICAgIGxhc3RQdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6ICdzaG9waWZ5JyxcbiAgICBtYXJrZXRpbmdPcHRJbjogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZFxuICB9O1xuICBjb25zdCB1c2VyUXVlcnkgPSBhcWxgXG4gICAgTEVUIGV4aXN0aW5nID0gRklSU1QoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgdXNlci5zaG9waWZ5Q3VzdG9tZXJJZCA9PSAke3Nob3BpZnlDdXN0b21lcklkfSB8fCB1c2VyLmVtYWlsID09ICR7ZW1haWx9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke3VzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3QgdXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeSh1c2VyUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGU7XG4gIGNvbnN0IHJlc29sdmVkVXNlcktleSA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgdXNlcktleSkpO1xuICBjb25zdCBvcmRlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LW9yZGVyJywgc2hvcGlmeU9yZGVySWQpO1xuICBjb25zdCBvcmRlciA9IHtcbiAgICBfa2V5OiBvcmRlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGN1cnJlbmN5OiBjbGVhblN0cmluZyhpbnB1dC5jdXJyZW5jeSwgMykudG9VcHBlckNhc2UoKSxcbiAgICBjdXN0b21lck9yZGVySWQ6IG9yZGVyS2V5LFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJvZHVjdElkcyxcbiAgICBwdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkLFxuICAgIHNob3BpZnlPcmRlcklkLFxuICAgIHRvdGFsUHJpY2U6IE51bWJlcihpbnB1dC50b3RhbFByaWNlIHx8IDApLFxuICAgIHVzZXJJZDogcmVzb2x2ZWRVc2VyS2V5XG4gIH07XG4gIGNvbnN0IG9yZGVyUXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke29yZGVyS2V5fX1cbiAgICBJTlNFUlQgJHtvcmRlcn1cbiAgICBVUERBVEUgJHt7XG4gICAgICBjdXJyZW5jeTogb3JkZXIuY3VycmVuY3ksXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcHJvZHVjdElkcyxcbiAgICAgIHB1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCxcbiAgICAgIHRvdGFsUHJpY2U6IG9yZGVyLnRvdGFsUHJpY2UsXG4gICAgICB1c2VySWQ6IHJlc29sdmVkVXNlcktleVxuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRPcmRlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShvcmRlclF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIEN1c3RvbWVyT3JkZXJUeXBlO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX09SREVSLFxuICAgIGNyZWF0ZUhhc2goYGhhc0N1c3RvbWVyT3JkZXItJHtyZXNvbHZlZFVzZXJLZXl9LSR7b3JkZXJLZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTLCBvcmRlcktleSksXG4gICAge3B1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCwgc2hvcGlmeUN1c3RvbWVySWQsIHNob3BpZnlPcmRlcklkfVxuICApO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb2R1Y3RJZHMubWFwKGFzeW5jIChwcm9kdWN0SWQpID0+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5maW5kKChpdGVtKSA9PiBpdGVtLnByb2R1Y3RJZCA9PT0gcHJvZHVjdElkKSB8fCB7cHJvZHVjdElkfTtcbiAgICBjb25zdCBwcm9kdWN0S2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktcHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gICAgY29uc3QgcHJvZHVjdERvYyA9IHtcbiAgICAgIF9rZXk6IHByb2R1Y3RLZXksXG4gICAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZCxcbiAgICAgIHRpdGxlOiBjbGVhblN0cmluZyhwcm9kdWN0LnRpdGxlLCAzMjApLFxuICAgICAgdmFyaWFudElkOiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdC52YXJpYW50SWQsIDE2MClcbiAgICB9O1xuICAgIGNvbnN0IHByb2R1Y3RRdWVyeSA9IGFxbGBcbiAgICAgIFVQU0VSVCB7X2tleTogJHtwcm9kdWN0S2V5fX1cbiAgICAgIElOU0VSVCAke3Byb2R1Y3REb2N9XG4gICAgICBVUERBVEUgJHt7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICAgIHRpdGxlOiBwcm9kdWN0RG9jLnRpdGxlLFxuICAgICAgICB2YXJpYW50SWQ6IHByb2R1Y3REb2MudmFyaWFudElkXG4gICAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUyl9XG4gICAgYDtcbiAgICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocHJvZHVjdFF1ZXJ5KTtcbiAgICBhd2FpdCBzYXZlRWRnZShcbiAgICAgIGNvbnRleHQsXG4gICAgICBFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QsXG4gICAgICBjcmVhdGVIYXNoKGBoYXNQdXJjaGFzZWRQcm9kdWN0LSR7b3JkZXJLZXl9LSR7cHJvZHVjdEtleX1gKSxcbiAgICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgb3JkZXJLZXkpLFxuICAgICAgZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSksXG4gICAgICB7cHJvZHVjdElkLCBwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXR9XG4gICAgKTtcbiAgfSkpO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgVVBEQVRFICR7cmVzb2x2ZWRVc2VyS2V5fVxuICAgIFdJVEgge1xuICAgICAgbGFzdFB1cmNoYXNlZEF0OiAke29yZGVyLnB1cmNoYXNlZEF0fSxcbiAgICAgIHRvdGFsT3JkZXJDb3VudDogTEVOR1RIKFxuICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICBSRVRVUk4gb3JkZXJcbiAgICAgICksXG4gICAgICB0b3RhbFNwZW5kOiBTVU0oXG4gICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgIFJFVFVSTiBUT19OVU1CRVIob3JkZXIudG90YWxQcmljZSlcbiAgICAgIClcbiAgICB9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gIGApO1xuXG4gIHJldHVybiBzYXZlZE9yZGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1c3RvbWVyT3JkZXJzQnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxDdXN0b21lck9yZGVyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgU09SVCBvcmRlci5wdXJjaGFzZWRBdCBERVNDXG4gICAgICBSRVRVUk4gb3JkZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldFR5cGVEYXRhPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IHRpY2tldCA9IHtcbiAgICBfa2V5OiB0aWNrZXRLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhc3NpZ25lZFRvVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmFzc2lnbmVkVG9Vc2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQuZGVzY3JpcHRpb24sIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJpb3JpdHk6IGlucHV0LnByaW9yaXR5IHx8ICdub3JtYWwnLFxuICAgIHByb2R1Y3RJZDogY2xlYW5FeHRlcm5hbElkKGlucHV0LnByb2R1Y3RJZCwgMzIwKSxcbiAgICBzaG9waWZ5T3JkZXJJZDogY2xlYW5TdHJpbmcoaW5wdXQuc2hvcGlmeU9yZGVySWQsIDE2MCksXG4gICAgc3RhdHVzOiAnb3BlbicsXG4gICAgc3ViamVjdDogY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0eXBlOiBpbnB1dC50eXBlIHx8ICdnZW5lcmFsX3N1cHBvcnQnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHt0aWNrZXR9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRUaWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldC0ke3VzZXJLZXl9LSR7dGlja2V0S2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAge3ByaW9yaXR5OiB0aWNrZXQucHJpb3JpdHksIHN0YXR1czogdGlja2V0LnN0YXR1cywgdHlwZTogdGlja2V0LnR5cGV9XG4gICk7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRFdmVudChjb250ZXh0LCB7XG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8IHVzZXJLZXkpKSxcbiAgICBldmVudFR5cGU6ICdjcmVhdGVkJyxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiB0aWNrZXQuc3RhdHVzXG4gIH0pO1xuXG4gIHJldHVybiBzYXZlZFRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZmlsdGVyczoge3JlYWRvbmx5IHN0YXR1cz86IHN0cmluZzsgcmVhZG9ubHkgdXNlcklkPzogc3RyaW5nfSA9IHt9XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB0aWNrZXQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgICAke2ZpbHRlcnMuc3RhdHVzID8gYXFsYEZJTFRFUiB0aWNrZXQuc3RhdHVzID09ICR7ZmlsdGVycy5zdGF0dXN9YCA6IGFxbGBgfVxuICAgICAgJHtmaWx0ZXJzLnVzZXJJZCA/IGFxbGBGSUxURVIgdGlja2V0LnVzZXJJZCA9PSAke2RvY0tleShmaWx0ZXJzLnVzZXJJZCl9YCA6IGFxbGBgfVxuICAgICAgTEVUIHVzZXIgPSBET0NVTUVOVCgke0NPTExFQ1RJT05TLlVTRVJTfSwgdGlja2V0LnVzZXJJZClcbiAgICAgIFNPUlQgdGlja2V0LmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiBNRVJHRSh0aWNrZXQsIHt1c2VyfSlcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmcsXG4gIHN0YXR1czogU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgcmVzb2x1dGlvblN1bW1hcnkgPSAnJ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KHN1cHBvcnRUaWNrZXRJZCk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFN1cHBvcnRUaWNrZXRUeXBlRGF0YSB8IG51bGw7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAuLi4oc3RhdHVzID09PSAncmVzb2x2ZWQnICYmIHtyZXNvbHZlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnY2xvc2VkJyAmJiB7Y2xvc2VkQXQ6IHRpbWVzdGFtcH0pLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3RhdHVzXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke3RpY2tldEtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgU3VwcG9ydFRpY2tldFR5cGVEYXRhO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIGVkZ2UgSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICBGSUxURVIgZWRnZS5fdG8gPT0gJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSl9XG4gICAgICBVUERBVEUgZWRnZSBXSVRIICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICByZXNvbHZlZEF0OiBzdGF0dXMgPT09ICdyZXNvbHZlZCcgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1c1xuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gIGApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogJ3N0YXR1c19jaGFuZ2VkJyxcbiAgICBmcm9tVmFsdWU6IHByZXZpb3VzPy5zdGF0dXMsXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogc3RhdHVzXG4gIH0pO1xuXG4gIGlmKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJykge1xuICAgIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICAgIGJvZHk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5IHx8ICdZb3VyIHN1cHBvcnQgdGlja2V0IGhhcyBiZWVuIHJlc29sdmVkLicsIDQwMDApLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIHN1YmplY3Q6IGBSZXNvbHZlZDogJHt0aWNrZXQuc3ViamVjdCB8fCAnU3VwcG9ydCB0aWNrZXQnfWAsXG4gICAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9yZXNvbHZlZCcsXG4gICAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpO1xuICBjb25zdCBtZXNzYWdlS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0TWVzc2FnZUlkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LW1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgX2tleTogbWVzc2FnZUtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGF1dGhvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hdXRob3JVc2VySWQgfHwgY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgYm9keTogY2xlYW5TdHJpbmcoaW5wdXQuYm9keSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICBzdXBwb3J0VGlja2V0TWVzc2FnZUlkOiBtZXNzYWdlS2V5LFxuICAgIHZpc2liaWxpdHk6IGlucHV0LnZpc2liaWxpdHkgfHwgJ2N1c3RvbWVyJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHttZXNzYWdlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRNZXNzYWdlID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldE1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7bWVzc2FnZUtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMsIG1lc3NhZ2VLZXkpLFxuICAgIHthdXRob3JVc2VySWQ6IG1lc3NhZ2UuYXV0aG9yVXNlcklkLCB2aXNpYmlsaXR5OiBtZXNzYWdlLnZpc2liaWxpdHl9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBtZXNzYWdlIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSl9XG4gICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gbWVzc2FnZVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IGV2ZW50S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0RXZlbnRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC1ldmVudC0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9LSR7aW5wdXQuZXZlbnRUeXBlfWApKSk7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIF9rZXk6IGV2ZW50S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYWN0b3JVc2VySWQgfHwgJycpKSxcbiAgICBldmVudFR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LmV2ZW50VHlwZSwgMTYwKSxcbiAgICBmcm9tVmFsdWU6IGNsZWFuU3RyaW5nKGlucHV0LmZyb21WYWx1ZSwgMzIwKSxcbiAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEgfHwge30sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0RXZlbnRJZDogZXZlbnRLZXksXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQudG9WYWx1ZSwgMzIwKVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtldmVudH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZEV2ZW50ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5ULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXRFdmVudC0ke3RpY2tldEtleX0tJHtldmVudEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLCBldmVudEtleSksXG4gICAge2FjdG9yVXNlcklkOiBldmVudC5hY3RvclVzZXJJZCwgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGV9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkRXZlbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBldmVudCBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCBzdXBwb3J0VGlja2V0SWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UKX1cbiAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gZXZlbnRcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZT5cbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5jdXN0b21lck5vdGlmaWNhdGlvbklkIHx8IGNyZWF0ZUhhc2goYGN1c3RvbWVyLW5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICBfa2V5OiBub3RpZmljYXRpb25LZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBjdXN0b21lck5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25LZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzZW50QXQ6IGlucHV0LnNlbnRBdCxcbiAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyB8fCAncXVldWVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKSxcbiAgICB0eXBlOiBjbGVhblN0cmluZyhpbnB1dC50eXBlLCAxNjApLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtub3RpZmljYXRpb259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkTm90aWZpY2F0aW9uID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7bm90aWZpY2F0aW9uS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TLCBub3RpZmljYXRpb25LZXkpLFxuICAgIHtcbiAgICAgIHN0YXR1czogbm90aWZpY2F0aW9uLnN0YXR1cyxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogbm90aWZpY2F0aW9uLnN1cHBvcnRUaWNrZXRJZCxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBzYXZlZE5vdGlmaWNhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBub3RpZmljYXRpb24gSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTil9XG4gICAgICBTT1JUIG5vdGlmaWNhdGlvbi5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbm90aWZpY2F0aW9uXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlU3RyaW5nIiwiYXFsIiwibGl0ZXJhbCIsIkNPTExFQ1RJT05TIiwiRURHRVMiLCJ1c2VEYiIsIm5vdyIsIkRhdGUiLCJjb2xsZWN0aW9uIiwibmFtZSIsImRvY0tleSIsInZhbHVlIiwiU3RyaW5nIiwiZG9jSWQiLCJjb2xsZWN0aW9uTmFtZSIsImtleSIsImV4dGVybmFsS2V5IiwicHJlZml4IiwiaWQiLCJjbGVhblN0cmluZyIsImxlbmd0aCIsImNsZWFuRXh0ZXJuYWxJZCIsInRyaW0iLCJzbGljZSIsInNhdmVFZGdlIiwiY29udGV4dCIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUtleSIsImZyb20iLCJ0byIsImRhdGEiLCJ0aW1lc3RhbXAiLCJlZGdlIiwiX2Zyb20iLCJfa2V5IiwiX3RvIiwiYWRkZWQiLCJtb2RpZmllZCIsInF1ZXJ5IiwiZGF0YWJhc2VOYW1lIiwiY3JlYXRlTWFpbGluZ0xpc3QiLCJpbnB1dCIsIm1haWxpbmdMaXN0SWQiLCJtYWlsaW5nTGlzdCIsImNyZWF0ZWRCeVVzZXJJZCIsInNlc3Npb24iLCJ1c2VySWQiLCJkZXNjcmlwdGlvbiIsInN0YXR1cyIsIk1BSUxJTkdfTElTVFMiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsImdldE1haWxpbmdMaXN0cyIsImFsbCIsImFkZFVzZXJUb01haWxpbmdMaXN0Iiwic291cmNlIiwidXNlcktleSIsImxpc3RLZXkiLCJIQVNfTUFJTElOR19MSVNUIiwiVVNFUlMiLCJhZGRlZEJ5VXNlcklkIiwicmVtb3ZlVXNlckZyb21NYWlsaW5nTGlzdCIsInVwZGF0ZSIsInJlbW92ZWRBdCIsIkJvb2xlYW4iLCJnZXRNYWlsaW5nTGlzdFVzZXJzIiwibGlzdElkIiwiZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QiLCJwcm9kdWN0SWQiLCJwcm9kdWN0S2V5IiwiU0hPUElGWV9QUk9EVUNUUyIsIkhBU19QVVJDSEFTRURfUFJPRFVDVCIsIkhBU19DVVNUT01FUl9PUkRFUiIsImdldEVsaWdpYmxlTWFpbGluZ1VzZXJzIiwib3B0aW9ucyIsImV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMiLCJIQVNfU1VQUE9SVF9USUNLRVQiLCJpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciIsInNob3BpZnlDdXN0b21lcklkIiwic2hvcGlmeU9yZGVySWQiLCJjdXN0b21lciIsImVtYWlsIiwidG9Mb3dlckNhc2UiLCJwcm9kdWN0SWRzIiwiQXJyYXkiLCJTZXQiLCJwcm9kdWN0cyIsIm1hcCIsInByb2R1Y3QiLCJmaWx0ZXIiLCJFcnJvciIsInVzZXJJbnNlcnQiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsIm1hcmtldGluZ0NvbnNlbnRTb3VyY2UiLCJtYXJrZXRpbmdPcHRJbiIsIm1hcmtldGluZ09wdEluQXQiLCJ1bmRlZmluZWQiLCJ1c2VyVXBkYXRlIiwibGFzdFB1cmNoYXNlZEF0IiwicHVyY2hhc2VkQXQiLCJ1c2VyUXVlcnkiLCJ1c2VyIiwicmVzb2x2ZWRVc2VyS2V5Iiwib3JkZXJLZXkiLCJvcmRlciIsImN1cnJlbmN5IiwidG9VcHBlckNhc2UiLCJjdXN0b21lck9yZGVySWQiLCJ0b3RhbFByaWNlIiwiTnVtYmVyIiwib3JkZXJRdWVyeSIsIkNVU1RPTUVSX09SREVSUyIsInNhdmVkT3JkZXIiLCJQcm9taXNlIiwiZmluZCIsIml0ZW0iLCJwcm9kdWN0RG9jIiwidGl0bGUiLCJ2YXJpYW50SWQiLCJwcm9kdWN0UXVlcnkiLCJnZXRDdXN0b21lck9yZGVyc0J5VXNlciIsImNyZWF0ZVN1cHBvcnRUaWNrZXQiLCJ0aWNrZXRLZXkiLCJzdXBwb3J0VGlja2V0SWQiLCJ0aWNrZXQiLCJhc3NpZ25lZFRvVXNlcklkIiwicHJpb3JpdHkiLCJzdWJqZWN0IiwidHlwZSIsIlNVUFBPUlRfVElDS0VUUyIsInNhdmVkVGlja2V0IiwiYWRkU3VwcG9ydFRpY2tldEV2ZW50IiwiYWN0b3JVc2VySWQiLCJldmVudFR5cGUiLCJ0b1ZhbHVlIiwiZ2V0U3VwcG9ydFRpY2tldHMiLCJmaWx0ZXJzIiwidXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyIsInJlc29sdXRpb25TdW1tYXJ5IiwicHJldmlvdXMiLCJyZXNvbHZlZEF0IiwiY2xvc2VkQXQiLCJmcm9tVmFsdWUiLCJjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbiIsImJvZHkiLCJhZGRTdXBwb3J0VGlja2V0TWVzc2FnZSIsIm1lc3NhZ2VLZXkiLCJzdXBwb3J0VGlja2V0TWVzc2FnZUlkIiwibWVzc2FnZSIsImF1dGhvclVzZXJJZCIsInZpc2liaWxpdHkiLCJTVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyIsInNhdmVkTWVzc2FnZSIsIkhBU19TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFIiwiZ2V0U3VwcG9ydFRpY2tldE1lc3NhZ2VzIiwiZXZlbnRLZXkiLCJzdXBwb3J0VGlja2V0RXZlbnRJZCIsImV2ZW50IiwibWV0YWRhdGEiLCJTVVBQT1JUX1RJQ0tFVF9FVkVOVFMiLCJzYXZlZEV2ZW50IiwiSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UIiwiZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyIsIm5vdGlmaWNhdGlvbktleSIsImN1c3RvbWVyTm90aWZpY2F0aW9uSWQiLCJub3RpZmljYXRpb24iLCJzZW50QXQiLCJDVVNUT01FUl9OT1RJRklDQVRJT05TIiwic2F2ZWROb3RpZmljYXRpb24iLCJIQVNfQ1VTVE9NRVJfTk9USUZJQ0FUSU9OIiwiZ2V0Q3VzdG9tZXJOb3RpZmljYXRpb25zQnlVc2VyIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxVQUFVLEVBQUVDLE9BQU8sRUFBRUMsV0FBVyxRQUFPLCtCQUErQjtBQUM5RSxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUVyQyxTQUFRQyxXQUFXLEVBQUVDLEtBQUssUUFBTyw4QkFBOEI7QUFDL0QsU0FBUUMsS0FBSyxRQUFPLDRCQUE0QjtBQWdCaEQsTUFBTUMsTUFBTSxJQUFjQyxLQUFLRCxHQUFHO0FBQ2xDLE1BQU1FLGFBQWEsQ0FBQ0Ms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
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+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7bm90aWZpY2F0aW9uS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TLCBub3RpZmljYXRpb25LZXkpLFxuICAgIHtcbiAgICAgIHN0YXR1czogbm90aWZpY2F0aW9uLnN0YXR1cyxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogbm90aWZpY2F0aW9uLnN1cHBvcnRUaWNrZXRJZCxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBzYXZlZE5vdGlmaWNhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBub3RpZmljYXRpb24gSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTil9XG4gICAgICBTT1JUIG5vdGlmaWNhdGlvbi5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbm90aWZpY2F0aW9uXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlUGhvbmUiLCJwYXJzZVN0cmluZyIsImFxbCIsImxpdGVyYWwiLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwidXNlRGIiLCJpc0FkbWluVXNlciIsInNlc1NlbmQiLCJub3ciLCJEYXRlIiwiY29sbGVjdGlvbiIsIm5hbWUiLCJkb2NLZXkiLCJ2YWx1ZSIsIlN0cmluZyIsImRvY0lkIiwiY29sbGVjdGlvbk5hbWUiLCJrZXkiLCJleHRlcm5hbEtleSIsInByZWZpeCIsImlkIiwiY2xlYW5TdHJpbmciLCJsZW5ndGgiLCJjbGVhbkV4dGVybmFsSWQiLCJ0cmltIiwic2xpY2UiLCJyZXF1aXJlQ3JtQWRtaW4iLCJjb250ZXh0Iiwic2Vzc2lvbiIsIkVycm9yIiwiYWxsb3dlZENvbnRhY3RGaWVsZHMiLCJTZXQiLCJzYW5pdGl6ZUh0bWwiLCJyZXBsYWNlIiwic2FuaXRpemVDc3MiLCJodG1sVG9UZXh0IiwiY2h1bmsiLCJpdGVtcyIsInNpemUiLCJncm91cHMiLCJpbmRleCIsInB1c2giLCJzdWJtaXRDcm1Gb3JtIiwiaW5wdXQiLCJtYXJrZXRpbmdPcHRJbiIsImVtYWlsIiwidG9Mb3dlckNhc2UiLCJyYXdQaG9uZSIsInBob25lIiwiZGF0YWJhc2UiLCJkYXRhYmFzZU5hbWUiLCJ0aW1lc3RhbXAiLCJzb3VyY2UiLCJmb3JtSWQiLCJ2YWx1ZXMiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsImdlbmVyYXRlZFVzZXJLZXkiLCJjb25zZW50IiwibWFya2V0aW5nT3B0SW5BdCIsIm1hcmtldGluZ09wdE91dEF0IiwidXNlckluc2VydCIsIl9rZXkiLCJhY3RpdmUiLCJhZGRlZCIsIm1haWxpbmdMaXN0IiwibWFya2V0aW5nQ29uc2VudFNvdXJjZSIsIm1vZGlmaWVkIiwidHlwZSIsInVzZXJBY2Nlc3MiLCJ1c2VySWQiLCJ2ZXJpZmllZEVtYWlsIiwidmVyaWZpZWRQaG9uZSIsInVzZXJVcGRhdGUiLCJ1c2VyIiwicXVlcnkiLCJVU0VSUyIsInRoZW4iLCJjdXJzb3IiLCJuZXh0Iiwic3VibWlzc2lvbklkIiwic3VibWlzc2lvbiIsInNhdmVkIiwiQ1JNX0ZPUk1fU1VCTUlTU0lPTlMiLCJnZXRDcm1Gb3JtU3VibWlzc2lvbnMiLCJhbGwiLCJnZXRDcm1Db250YWN0cyIsImZpbHRlciIsInNlYXJjaCIsImZpZWxkIiwiaGFzIiwib3B0ZWRJbk9ubHkiLCJvcGVyYXRvciIsImluY2x1ZGVzIiwic2VuZENybUNhbXBhaWduIiwic3ViamVjdCIsImJvZHlIdG1sIiwiaHRtbCIsImNzcyIsImNhbmRpZGF0ZXMiLCJzZWxlY3RlZElkcyIsInVzZXJJZHMiLCJtYXAiLCJyZWNpcGllbnRzIiwiQm9vbGVhbiIsImNhbXBhaWduSWQiLCJjYW1wYWlnbiIsImZhaWxlZENvdW50IiwicmVjaXBpZW50Q291bnQiLCJzZW50Q291bnQiLCJzdGF0dXMiLCJDUk1fQ0FNUEFJR05TIiwicmVjaXBpZW50c0JhdGNoIiwiRGVzdGluYXRpb24iLCJCY2NBZGRyZXNzZXMiLCJyZWNpcGllbnQiLCJNZXNzYWdlIiwiQm9keSIsIkh0bWwiLCJEYXRhIiwiVGV4dCIsIlN1YmplY3QiLCJTb3VyY2UiLCJjb25maWciLCJkZXRhaWxzIiwic3VwcG9ydE5hbWUiLCJzdXBwb3J0RW1haWwiLCJfZXJyb3IiLCJyZXN1bHQiLCJzZW50QXQiLCJzYXZlRWRnZSIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUtleSIsImZyb20iLCJ0byIsImRhdGEiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJjcmVhdGVNYWlsaW5nTGlzdCIsIm1haWxpbmdMaXN0SWQiLCJjcmVhdGVkQnlVc2VySWQiLCJkZXNjcmlwdGlvbiIsIk1BSUxJTkdfTElTVFMiLCJnZXRNYWlsaW5nTGlzdHMiLCJhZGRVc2VyVG9NYWlsaW5nTGlzdCIsInVzZXJLZXkiLCJsaXN0S2V5IiwiSEFTX01BSUxJTkdfTElTVCIsImFkZGVkQnlVc2VySWQiLCJyZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0IiwidXBkYXRlIiwicmVtb3ZlZEF0IiwiZ2V0TWFpbGluZ0xpc3RVc2VycyIsImxpc3RJZCIsImdldFVzZXJzQnlQdXJjaGFzZWRQcm9kdWN0IiwicHJvZHVjdElkIiwicHJvZHVjdEtleSIsIlNIT1BJRllfUFJPRFVDVFMiLCJIQVNfUFVSQ0hBU0VEX1BST0RVQ1QiLCJIQVNfQ1VTVE9NRVJfT1JERVIiLCJnZXRFbGlnaWJsZU1haWxpbmdVc2VycyIsIm9wdGlvbnMiLCJleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzIiwiSEFTX1NVUFBPUlRfVElDS0VUIiwiaW5nZXN0U2hvcGlmeUN1c3RvbWVyT3JkZXIiLCJzaG9waWZ5Q3VzdG9tZXJJZCIsInNob3BpZnlPcmRlcklkIiwiY3VzdG9tZXIiLCJwcm9kdWN0SWRzIiwiQXJyYXkiLCJwcm9kdWN0cyIsInByb2R1Y3QiLCJ1bmRlZmluZWQiLCJsYXN0UHVyY2hhc2VkQXQiLCJwdXJjaGFzZWRBdCIsInVzZXJRdWVyeSIsInJlc29sdmVkVXNlcktleSIsIm9yZGVyS2V5Iiwib3JkZXIiLCJjdXJyZW5jeSIsInRvVXBwZXJDYXNlIiwiY3VzdG9tZXJPcmRlcklkIiwidG90YWxQcmljZSIsIk51bWJlciIsIm9yZGVyUXVlcnkiLCJDVVNUT01FUl9PUkRFUlMiLCJzYXZlZE9yZGVyIiwiUHJvbWlzZSIsImZpbmQiLCJpdGVtIiwicHJvZHVjdERvYyIsInRpdGxlIiwidmFyaWFudElkIiwicHJvZHVjdFF1ZXJ5IiwiZ2V0Q3VzdG9tZXJPcmRlcnNCeVVzZXIiLCJjcmVhdGVTdXBwb3J0VGlja2V0IiwidGlja2V0S2V5Iiwic3VwcG9ydFRpY2tldElkIiwidGlja2V0IiwiYXNzaWduZWRUb1VzZXJJZCIsInByaW9yaXR5IiwiU1VQUE9SVF9USUNLRVRTIiwic2F2ZWRUaWNrZXQiLCJhZGRTdXBwb3J0VGlja2V0RXZlbnQiLCJhY3RvclVzZXJJZCIsImV2ZW50VHlwZSIsInRvVmFsdWUiLCJnZXRTdXBwb3J0VGlja2V0cyIsImZpbHRlcnMiLCJ1cGRhdGVTdXBwb3J0VGlja2V0U3RhdHVzIiwicmVzb2x1dGlvblN1bW1hcnkiLCJwcmV2aW91cyIsInJlc29sdmVkQXQiLCJjbG9zZWRBdCIsImZyb21WYWx1ZSIsImNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uIiwiYm9keSIsImFkZFN1cHBvcnRUaWNrZXRNZXNzYWdlIiwibWVzc2FnZUtleSIsInN1cHBvcnRUaWNrZXRNZXNzYWdlSWQiLCJtZXNzYWdlIiwiYXV0aG9yVXNlcklkIiwidmlzaWJpbGl0eSIsIlNVUFBPUlRfVElDS0VUX01FU1NBR0VTIiwic2F2ZWRNZXNzYWdlIiwiSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UiLCJnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMiLCJldmVudEtleSIsInN1cHBvcnRUaWNrZXRFdmVudElkIiwiZXZlbnQiLCJtZXRhZGF0YSIsIlNVUFBPUlRfVElDS0VUX0VWRU5UUyIsInNhdmVkRXZlbnQiLCJIQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQiLCJnZXRTdXBwb3J0VGlja2V0RXZlbnRzIiwibm90aWZpY2F0aW9uS2V5IiwiY3VzdG9tZXJOb3RpZmljYXRpb25JZCIsIm5vdGlmaWNhdGlvbiIsIkNVU1RPTUVSX05PVElGSUNBVElPTlMiLCJzYXZlZE5vdGlmaWNhdGlvbiIsIkhBU19DVVNUT01FUl9OT1RJRklDQVRJT04iLCJnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDMUYsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBUUMsT0FBTyxRQUFPLGVBQWU7QUFFckMsU0FBUUMsV0FBVyxFQUFFQyxLQUFLLFFBQU8sOEJBQThCO0FBQy9ELFNBQVFDLEtBQUssUUFBTyw0QkFBNEI7QUFDaEQsU0FBUUMsV0FBVyxRQUFPLDJCQUEyQjtBQUNyRCxTQUFRQyxPQUFPLFFBQU8sYUFBYTtBQXFCbkMsTUFBTUMsTUFBTSxJQUFjQyxLQUFLRCxHQUFHO0FBQ2xDLE1BQU1FLGFBQWEsQ0FBQ0MsT0FBaUJULFFBQVFTO0FBQzdDLE1BQU1DLFNBQVMsQ0FBQ0MsUUFBUSxFQUFFLEdBQWFmLFFBQVFnQixPQUFPRDtBQUN0RCxNQUFNRSxRQUFRLENBQUNDLGdCQUF3QkMsTUFBTSxFQUFFLEdBQWEsR0FBR0QsZUFBZSxDQUFDLEVBQUVKLE9BQU9LLE1BQU07QUFDOUYsTUFBTUMsY0FBYyxDQUFDQyxRQUFnQkMsS0FBSyxFQUFFLEdBQWF2QixXQUFXLEdBQUdzQixPQUFPLENBQUMsRUFBRUwsT0FBT00sS0FBSyxFQUFFO0FBQy9GLE1BQU1DLGNBQWMsQ0FBQ1IsT0FBZ0JTLFNBQVMsR0FBRyxHQUFhdEIsWUFBWWMsT0FBT0QsU0FBUyxLQUFLUztBQUMvRixNQUFNQyxrQkFBa0IsQ0FBQ1YsT0FBZ0JTLFNBQVMsR0FBRyxHQUFhUixPQUFPRCxTQUFTLElBQUlXLElBQUksR0FBR0MsS0FBSyxDQUFDLEdBQUdIO0FBRXRHLE1BQU1JLGtCQUFrQixDQUFDQztJQUN2QixJQUFHLENBQUNyQixZQUFZcUIsUUFBUUMsT0FBTyxHQUFVO1FBQ3ZDLE1BQU0sSUFBSUMsTUFBTTtJQUNsQjtBQUNGO0FBRUEsTUFBTUMsdUJBQXVCLElBQUlDLElBQUk7SUFBQztJQUFTO0lBQWE7SUFBWTtJQUFTO0lBQTBCO0NBQVk7QUFDdkgsTUFBTUMsZUFBZSxDQUFDbkIsUUFBMkJDLE9BQU9ELFNBQVMsSUFDOURvQixPQUFPLENBQUMseURBQXlELElBQ2pFQSxPQUFPLENBQUMsK0NBQStDO0FBQzFELE1BQU1DLGNBQWMsQ0FBQ3JCLFFBQTJCQyxPQUFPRCxTQUFTLElBQzdEb0IsT0FBTyxDQUFDLHVCQUF1QixJQUMvQkEsT0FBTyxDQUFDLHVCQUF1QixJQUMvQkEsT0FBTyxDQUFDLDBDQUEwQztBQUNyRCxNQUFNRSxhQUFhLENBQUN0QixRQUEwQkEsTUFBTW9CLE9BQU8sQ0FBQyxZQUFZLEtBQUtBLE9BQU8sQ0FBQyxRQUFRLEtBQUtULElBQUk7QUFDdEcsTUFBTVksUUFBUSxDQUFJQyxPQUFxQkM7SUFDckMsTUFBTUMsU0FBZ0IsRUFBRTtJQUN4QixJQUFJLElBQUlDLFFBQVEsR0FBR0EsUUFBUUgsTUFBTWYsTUFBTSxFQUFFa0IsU0FBU0YsS0FBTUMsT0FBT0UsSUFBSSxDQUFDSixNQUFNWixLQUFLLENBQUNlLE9BQU9BLFFBQVFGO0lBQy9GLE9BQU9DO0FBQ1Q7QUFFQSxPQUFPLE1BQU1HLGdCQUFnQixPQUMzQmYsU0FDQWdCO0lBRUEsSUFBRyxPQUFPQSxPQUFPQyxtQkFBbUIsV0FBVyxNQUFNLElBQUlmLE1BQU07SUFDL0QsTUFBTWdCLFFBQVF4QixZQUFZc0IsTUFBTUUsS0FBSyxFQUFFLEtBQUtDLFdBQVc7SUFDdkQsTUFBTUMsV0FBVzFCLFlBQVlzQixNQUFNSyxLQUFLLEVBQUU7SUFDMUMsTUFBTUEsUUFBUUQsV0FBWWhELFdBQVdnRCxhQUFhQSxXQUFZO0lBQzlELElBQUcsQ0FBQ0YsU0FBUyxDQUFDRyxPQUFPLE1BQU0sSUFBSW5CLE1BQU07SUFFckMsTUFBTW9CLFdBQVc1QyxNQUFNc0IsUUFBUXVCLFlBQVk7SUFDM0MsTUFBTUMsWUFBWTNDO0lBQ2xCLE1BQU00QyxTQUFTL0IsWUFBWXNCLE1BQU1TLE1BQU0sSUFBSVQsTUFBTVUsTUFBTSxJQUFJLFFBQVE7SUFDbkUsTUFBTUMsU0FBU1gsTUFBTVcsTUFBTSxJQUFJLENBQUM7SUFDaEMsTUFBTUMsWUFBWWxDLFlBQVlzQixNQUFNWSxTQUFTLElBQUlELE9BQU9DLFNBQVMsRUFBRTtJQUNuRSxNQUFNQyxXQUFXbkMsWUFBWXNCLE1BQU1hLFFBQVEsSUFBSUYsT0FBT0UsUUFBUSxFQUFFO0lBQ2hFLE1BQU1DLG1CQUFtQjVELFdBQVdnRCxTQUFTRyxPQUFPO0lBQ3BELE1BQU1VLFVBQVVmLE1BQU1DLGNBQWMsR0FDaEM7UUFBQ2Usa0JBQWtCUjtRQUFXUyxtQkFBbUI7SUFBSSxJQUNyRDtRQUFDQSxtQkFBbUJUO0lBQVM7SUFDakMsTUFBTVUsYUFBYTtRQUNqQkMsTUFBTUw7UUFDTk0sUUFBUTtRQUNSQyxPQUFPYjtRQUNQTjtRQUNBVTtRQUNBQztRQUNBUyxhQUFhdEIsTUFBTUMsY0FBYztRQUNqQ3NCLHdCQUF3QmQ7UUFDeEJSLGdCQUFnQkQsTUFBTUMsY0FBYztRQUNwQ3VCLFVBQVVoQjtRQUNWSDtRQUNBb0IsTUFBTTtRQUNOQyxZQUFZO1FBQ1pDLFFBQVFiO1FBQ1JjLGVBQWU7UUFDZkMsZUFBZTtRQUNmLEdBQUdkLE9BQU87SUFDWjtJQUNBLE1BQU1lLGFBQWE7UUFDakIsR0FBSTVCLFFBQVE7WUFBQ0E7UUFBSyxJQUFJLENBQUMsQ0FBQztRQUN4QixHQUFJVSxZQUFZO1lBQUNBO1FBQVMsSUFBSSxDQUFDLENBQUM7UUFDaEMsR0FBSUMsV0FBVztZQUFDQTtRQUFRLElBQUksQ0FBQyxDQUFDO1FBQzlCLEdBQUlSLFFBQVE7WUFBQ0E7UUFBSyxJQUFJLENBQUMsQ0FBQztRQUN4QmlCLGFBQWF0QixNQUFNQyxjQUFjO1FBQ2pDc0Isd0JBQXdCZDtRQUN4QlIsZ0JBQWdCRCxNQUFNQyxjQUFjO1FBQ3BDdUIsVUFBVWhCO1FBQ1YsR0FBR08sT0FBTztJQUNaO0lBQ0EsTUFBTWdCLE9BQU8sTUFBTXpCLFNBQVMwQixLQUFLLENBQUMxRSxHQUFHLENBQUM7O2tCQUV0QixFQUFFUyxXQUFXUCxZQUFZeUUsS0FBSyxFQUFFO2dCQUNsQyxFQUFFL0IsTUFBTSxxQ0FBcUMsRUFBRUEsTUFBTTtjQUN2RCxFQUFFRyxNQUFNLHdCQUF3QixFQUFFQSxNQUFNOzs7OzZDQUlULEVBQUVTLGlCQUFpQjs7aUJBRS9DLEVBQUVJLFdBQVc7V0FDbkIsRUFBRVksV0FBVyxJQUFJLEVBQUUvRCxXQUFXUCxZQUFZeUUsS0FBSyxFQUFFOztFQUUxRCxDQUFDLEVBQUVDLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBQy9CLE1BQU1ULFNBQVMxRCxPQUFPRSxPQUFPNEQsTUFBTVosUUFBUVksTUFBTUosVUFBVWI7SUFFM0QsTUFBTXVCLGVBQWVuRixXQUFXLENBQUMsZUFBZSxFQUFFc0QsVUFBVSxDQUFDLEVBQUVOLE1BQU0sQ0FBQyxFQUFFRyxPQUFPLEVBQUU7SUFDakYsTUFBTWlDLGFBQWE7UUFDakJuQixNQUFNa0I7UUFDTmhCLE9BQU9iO1FBQ1BOO1FBQ0FRLFFBQVFoQyxZQUFZc0IsTUFBTVUsTUFBTSxFQUFFO1FBQ2xDVCxnQkFBZ0JELE1BQU1DLGNBQWM7UUFDcEN1QixVQUFVaEI7UUFDVkg7UUFDQUk7UUFDQTRCO1FBQ0FWO1FBQ0FoQjtJQUNGO0lBQ0EsTUFBTTRCLFFBQVEsTUFBTWpDLFNBQVMwQixLQUFLLENBQUMxRSxHQUFHLENBQUM7V0FDOUIsRUFBRWdGLFdBQVcsSUFBSSxFQUFFdkUsV0FBV1AsWUFBWWdGLG9CQUFvQixFQUFFOztFQUV6RSxDQUFDLEVBQUVOLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBRS9CLE9BQU9HO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTUUsd0JBQXdCLENBQUN6RDtJQUNwQ0QsZ0JBQWdCQztJQUNoQixPQUFPdEIsTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUMxRSxHQUFHLENBQUM7c0JBQ3pCLEVBQUVTLFdBQVdQLFlBQVlnRixvQkFBb0IsRUFBRTs7OztFQUluRSxDQUFDLEVBQUVOLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPTyxHQUFHO0FBQ2hDLEVBQUU7QUFFRixPQUFPLE1BQU1DLGlCQUFpQixDQUFDM0QsU0FBcUI0RCxTQUEyQixDQUFDLENBQUM7SUFDL0U3RCxnQkFBZ0JDO0lBQ2hCLE1BQU02RCxTQUFTbkUsWUFBWWtFLE9BQU9DLE1BQU0sRUFBRSxLQUFLMUMsV0FBVztJQUMxRCxNQUFNMkMsUUFBUTNELHFCQUFxQjRELEdBQUcsQ0FBQ0gsT0FBT0UsS0FBSyxJQUFJLE1BQU0zRSxPQUFPeUUsT0FBT0UsS0FBSyxJQUFJO0lBQ3BGLE1BQU01RSxRQUFRUSxZQUFZa0UsT0FBTzFFLEtBQUssRUFBRSxLQUFLaUMsV0FBVztJQUN4RCxNQUFNNkMsY0FBY0osT0FBT0ksV0FBVyxLQUFLO0lBQzNDLE1BQU1DLFdBQVc7UUFBQztRQUFZO1FBQVU7S0FBUyxDQUFDQyxRQUFRLENBQUNOLE9BQU9LLFFBQVEsSUFBSSxNQUFNTCxPQUFPSyxRQUFRLEdBQUc7SUFDdEcsT0FBT3ZGLE1BQU1zQixRQUFRdUIsWUFBWSxFQUFFeUIsS0FBSyxDQUFDMUUsR0FBRyxDQUFDO2dCQUMvQixFQUFFUyxXQUFXUCxZQUFZeUUsS0FBSyxFQUFFO2FBQ25DLEVBQUUsQ0FBQ2UsWUFBWTthQUNmLEVBQUUsQ0FBQ0gsT0FBTyxrR0FBa0csRUFBRUEsT0FBTzthQUNySCxFQUFFLENBQUNDLE1BQU0sS0FBSyxFQUFFRyxhQUFhLFNBQVM7b0JBQy9CLEVBQUVILE1BQU07V0FDakIsRUFBRUcsYUFBYSxTQUFTLHdCQUF3QixFQUFFSCxNQUFNLE9BQU8sRUFBRTVFLE1BQU0saUNBQWlDLEVBQUU0RSxNQUFNLEtBQUssRUFBRTVFLE1BQU07Ozs7RUFJdEksQ0FBQyxFQUFFZ0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9PLEdBQUc7QUFDaEMsRUFBRTtBQUVGLE9BQU8sTUFBTVMsa0JBQWtCLE9BQzdCbkUsU0FDQWdCO0lBRUFqQixnQkFBZ0JDO0lBQ2hCLE1BQU1vRSxVQUFVMUUsWUFBWXNCLE1BQU1vRCxPQUFPLEVBQUU7SUFDM0MsTUFBTUMsV0FBV2hFLGFBQWFXLE1BQU1zRCxJQUFJO0lBQ3hDLE1BQU1DLE1BQU1oRSxZQUFZUyxNQUFNdUQsR0FBRztJQUNqQyxJQUFHLENBQUNILFdBQVcsQ0FBQ0MsVUFBVSxNQUFNLElBQUluRSxNQUFNO0lBRTFDLE1BQU1zRSxhQUFhLE1BQU1iLGVBQWUzRCxTQUFTO1FBQUMsR0FBR2dCLE1BQU00QyxNQUFNO1FBQUVJLGFBQWE7SUFBSTtJQUNwRixNQUFNUyxjQUFjLElBQUlyRSxJQUFJLEFBQUNZLENBQUFBLE1BQU0wRCxPQUFPLElBQUksRUFBRSxBQUFELEVBQUdDLEdBQUcsQ0FBQyxDQUFDbEYsS0FBT1IsT0FBT1E7SUFDckUsTUFBTW1GLGFBQWFKLFdBQVdaLE1BQU0sQ0FBQyxDQUFDYixPQUNwQzhCLFFBQVE5QixLQUFLN0IsS0FBSyxLQUFNLENBQUEsQ0FBQ3VELFlBQVk5RCxJQUFJLElBQUk4RCxZQUFZVixHQUFHLENBQUM5RSxPQUFPOEQsS0FBS0osTUFBTSxJQUFJSSxLQUFLWixJQUFJLEVBQUM7SUFDL0YsTUFBTVgsWUFBWTNDO0lBQ2xCLE1BQU1pRyxhQUFhNUcsV0FBVyxDQUFDLGFBQWEsRUFBRXNELFVBQVUsQ0FBQyxFQUFFNEMsU0FBUyxFQUFFO0lBQ3RFLE1BQU05QyxXQUFXNUMsTUFBTXNCLFFBQVF1QixZQUFZO0lBQzNDLE1BQU13RCxXQUFXO1FBQ2Y1QyxNQUFNMkM7UUFDTnpDLE9BQU9iO1FBQ1BzRDtRQUNBUDtRQUNBUyxhQUFhO1FBQ2JWLE1BQU1EO1FBQ043QixVQUFVaEI7UUFDVnlELGdCQUFnQkwsV0FBV2pGLE1BQU07UUFDakN1RixXQUFXO1FBQ1hDLFFBQVE7UUFDUmY7SUFDRjtJQUNBLE1BQU05QyxTQUFTMEIsS0FBSyxDQUFDMUUsR0FBRyxDQUFDLE9BQU8sRUFBRXlHLFNBQVMsSUFBSSxFQUFFaEcsV0FBV1AsWUFBWTRHLGFBQWEsRUFBRSxDQUFDO0lBRXhGLElBQUlKLGNBQWM7SUFDbEIsSUFBSUUsWUFBWTtJQUNoQixLQUFJLE1BQU1HLG1CQUFtQjVFLE1BQU1tRSxZQUFZLElBQUs7UUFDbEQsSUFBSTtZQUNGLE1BQU1oRyxRQUFRO2dCQUNaMEcsYUFBYTtvQkFBQ0MsY0FBY0YsZ0JBQWdCVixHQUFHLENBQUMsQ0FBQ2EsWUFBY3JHLE9BQU9xRyxVQUFVdEUsS0FBSztnQkFBRTtnQkFDdkZ1RSxTQUFTO29CQUNQQyxNQUFNO3dCQUFDQyxNQUFNOzRCQUFDQyxNQUFNLENBQUMsT0FBTyxFQUFFckIsSUFBSSxRQUFRLEVBQUVGLFVBQVU7d0JBQUE7d0JBQUd3QixNQUFNOzRCQUFDRCxNQUFNcEYsV0FBVzZEO3dCQUFTO29CQUFDO29CQUMzRnlCLFNBQVM7d0JBQUNGLE1BQU14QjtvQkFBTztnQkFDekI7Z0JBQ0EyQixRQUFRLENBQUMsQ0FBQyxFQUFFL0YsUUFBUWdHLE1BQU0sRUFBRUMsU0FBU0MsZUFBZSxVQUFVLEdBQUcsRUFBRWxHLFFBQVFnRyxNQUFNLEVBQUVDLFNBQVNFLGdCQUFnQixxQkFBcUIsQ0FBQyxDQUFDO1lBQ3JJO1lBQ0FqQixhQUFhRyxnQkFBZ0IxRixNQUFNO1FBQ3JDLEVBQUUsT0FBTXlHLFFBQVE7WUFDZHBCLGVBQWVLLGdCQUFnQjFGLE1BQU07UUFDdkM7SUFDRjtJQUNBLE1BQU0wRyxTQUFTO1FBQUMsR0FBR3RCLFFBQVE7UUFBRUM7UUFBYXNCLFFBQVF6SDtRQUFPcUc7UUFBV0MsUUFBUUgsY0FBZUUsWUFBWSxZQUFZLFdBQVk7SUFBTTtJQUNySSxNQUFNNUQsU0FBUzBCLEtBQUssQ0FBQzFFLEdBQUcsQ0FBQztXQUNoQixFQUFFd0csV0FBVyxNQUFNLEVBQUU7UUFDMUJFLGFBQWFxQixPQUFPckIsV0FBVztRQUMvQnhDLFVBQVU2RCxPQUFPQyxNQUFNO1FBQ3ZCQSxRQUFRRCxPQUFPQyxNQUFNO1FBQ3JCcEIsV0FBV21CLE9BQU9uQixTQUFTO1FBQzNCQyxRQUFRa0IsT0FBT2xCLE1BQU07SUFDdkIsRUFBRSxJQUFJLEVBQUVwRyxXQUFXUCxZQUFZNEcsYUFBYSxFQUFFO0VBQ2hELENBQUM7SUFDRCxPQUFPaUI7QUFDVCxFQUFFO0FBRUYsTUFBTUUsV0FBVyxPQUNmdkcsU0FDQXdHLGdCQUNBQyxTQUNBQyxNQUNBQyxJQUNBQyxPQUFnQyxDQUFDLENBQUM7SUFFbEMsTUFBTXBGLFlBQVkzQztJQUNsQixNQUFNZ0ksT0FBTztRQUNYQyxPQUFPSjtRQUNQdkUsTUFBTXNFO1FBQ05NLEtBQUtKO1FBQ0x0RSxPQUFPYjtRQUNQZ0IsVUFBVWhCO1FBQ1YsR0FBR29GLElBQUk7SUFDVDtJQUNBLE1BQU01RCxRQUFrQjFFLEdBQUcsQ0FBQztrQkFDWixFQUFFbUksUUFBUTtXQUNqQixFQUFFSSxLQUFLO1dBQ1AsRUFBRUQsS0FBSyxJQUFJLEVBQUU3SCxXQUFXeUgsZ0JBQWdCO0VBQ2pELENBQUM7SUFFRCxNQUFNOUgsTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUNBO0FBQzFDO0FBRUEsT0FBTyxNQUFNZ0Usb0JBQW9CLE9BQy9CaEgsU0FDQWdCO0lBRUEsTUFBTVEsWUFBWTNDO0lBQ2xCLE1BQU1vSSxnQkFBZ0JoSSxPQUFPRSxPQUFPNkIsT0FBT2lHLGlCQUFpQi9JLFdBQVcsQ0FBQyxhQUFhLEVBQUU4QyxPQUFPaEMsS0FBSyxDQUFDLEVBQUV3QyxXQUFXO0lBQ2pILE1BQU1jLGNBQWM7UUFDbEJILE1BQU04RTtRQUNONUUsT0FBT2I7UUFDUDBGLGlCQUFpQmpJLE9BQU9FLE9BQU9hLFNBQVNDLFNBQVMwQyxVQUFVO1FBQzNEd0UsYUFBYXpILFlBQVlzQixPQUFPbUcsYUFBYTtRQUM3Q0Y7UUFDQXpFLFVBQVVoQjtRQUNWeEMsTUFBTVUsWUFBWXNCLE9BQU9oQyxNQUFNO1FBQy9CbUcsUUFBUW5FLE9BQU9tRSxVQUFVO0lBQzNCO0lBQ0EsTUFBTW5DLFFBQVExRSxHQUFHLENBQUM7a0JBQ0YsRUFBRTJJLGNBQWM7V0FDdkIsRUFBRTNFLFlBQVk7V0FDZCxFQUFFO1FBQ1A2RSxhQUFhN0UsWUFBWTZFLFdBQVc7UUFDcEMzRSxVQUFVaEI7UUFDVnhDLE1BQU1zRCxZQUFZdEQsSUFBSTtRQUN0Qm1HLFFBQVE3QyxZQUFZNkMsTUFBTTtJQUM1QixFQUFFLElBQUksRUFBRXBHLFdBQVdQLFlBQVk0SSxhQUFhLEVBQUU7O0VBRWhELENBQUM7SUFFRCxPQUFPMUksTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0FBQzlFLEVBQUU7QUFFRixPQUFPLE1BQU1pRSxrQkFBa0IsQ0FBQ3JIO0lBQzlCLE1BQU1nRCxRQUFRMUUsR0FBRyxDQUFDO2dCQUNKLEVBQUVTLFdBQVdQLFlBQVk0SSxhQUFhLEVBQUU7Ozs7RUFJdEQsQ0FBQztJQUVELE9BQU8xSSxNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9PLEdBQUc7QUFDN0UsRUFBRTtBQUVGLE9BQU8sTUFBTTRELHVCQUF1QixPQUNsQ3RILFNBQ0EyQyxRQUNBc0UsZUFDQXhGLFNBQVMsUUFBUTtJQUVqQixNQUFNOEYsVUFBVXRJLE9BQU8wRDtJQUN2QixNQUFNNkUsVUFBVXZJLE9BQU9nSTtJQUN2QixNQUFNUixVQUFVdkksV0FBVyxDQUFDLGVBQWUsRUFBRXFKLFFBQVEsQ0FBQyxFQUFFQyxTQUFTO0lBRWpFLE1BQU1qQixTQUNKdkcsU0FDQXZCLE1BQU1nSixnQkFBZ0IsRUFDdEJoQixTQUNBckgsTUFBTVosWUFBWXlFLEtBQUssRUFBRXNFLFVBQ3pCbkksTUFBTVosWUFBWTRJLGFBQWEsRUFBRUksVUFDakM7UUFDRUUsZUFBZXpJLE9BQU9FLE9BQU9hLFNBQVNDLFNBQVMwQyxVQUFVO1FBQ3pEbEIsUUFBUS9CLFlBQVkrQixRQUFRO1FBQzVCMEQsUUFBUTtJQUNWO0lBR0YsT0FBT3pHLE1BQU1zQixRQUFRdUIsWUFBWSxFQUM5QnlCLEtBQUssQ0FBQzFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRWMsTUFBTVosWUFBWTRJLGFBQWEsRUFBRUksU0FBUyxDQUFDLENBQUMsRUFDeEV0RSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSTtBQUNqQyxFQUFFO0FBRUYsT0FBTyxNQUFNdUUsNEJBQTRCLE9BQ3ZDM0gsU0FDQTJDLFFBQ0FzRTtJQUVBLE1BQU1NLFVBQVV0SSxPQUFPMEQ7SUFDdkIsTUFBTTZFLFVBQVV2SSxPQUFPZ0k7SUFDdkIsTUFBTVIsVUFBVXZJLFdBQVcsQ0FBQyxlQUFlLEVBQUVxSixRQUFRLENBQUMsRUFBRUMsU0FBUztJQUNqRSxNQUFNSSxTQUFTO1FBQ2JwRixVQUFVM0Q7UUFDVmdKLFdBQVdoSjtRQUNYc0csUUFBUTtJQUNWO0lBQ0EsTUFBTW5DLFFBQVExRSxHQUFHLENBQUM7V0FDVCxFQUFFbUksUUFBUSxNQUFNLEVBQUVtQixPQUFPLElBQUksRUFBRTdJLFdBQVdOLE1BQU1nSixnQkFBZ0IsRUFBRTs7RUFFM0UsQ0FBQztJQUVELE9BQU8vSSxNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUksSUFBSUYsSUFBSSxDQUFDMkI7QUFDdkYsRUFBRTtBQUVGLE9BQU8sTUFBTWlELHNCQUFzQixDQUNqQzlILFNBQ0FpSDtJQUVBLE1BQU1jLFNBQVMzSSxNQUFNWixZQUFZNEksYUFBYSxFQUFFSDtJQUNoRCxNQUFNakUsUUFBUTFFLEdBQUcsQ0FBQzttQ0FDZSxFQUFFeUosT0FBTyxDQUFDLEVBQUVoSixXQUFXTixNQUFNZ0osZ0JBQWdCLEVBQUU7Ozs7RUFJaEYsQ0FBQztJQUVELE9BQU8vSSxNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9PLEdBQUc7QUFDN0UsRUFBRTtBQUVGLE9BQU8sTUFBTXNFLDZCQUE2QixDQUN4Q2hJLFNBQ0FpSTtJQUVBLE1BQU1DLGFBQWEzSSxZQUFZLG1CQUFtQjBJO0lBQ2xELE1BQU1qRixRQUFRMUUsR0FBRyxDQUFDOzhCQUNVLEVBQUVjLE1BQU1aLFlBQVkySixnQkFBZ0IsRUFBRUQsWUFBWSxDQUFDLEVBQUVuSixXQUFXTixNQUFNMkoscUJBQXFCLEVBQUU7eUNBQ2xGLEVBQUVySixXQUFXTixNQUFNNEosa0JBQWtCLEVBQUU7OztFQUc5RSxDQUFDO0lBRUQsT0FBTzNKLE1BQU1zQixRQUFRdUIsWUFBWSxFQUFFeUIsS0FBSyxDQUFDQSxPQUFPRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT08sR0FBRztBQUM3RSxFQUFFO0FBRUYsT0FBTyxNQUFNNEUsMEJBQTBCLENBQ3JDdEksU0FDQXVJLFVBQXdILENBQUMsQ0FBQztJQUUxSCxNQUFNQyw0QkFBNEJELFFBQVFDLHlCQUF5QixLQUFLO0lBQ3hFLE1BQU14RixRQUFRMUUsR0FBRyxDQUFDOztrQkFFRixFQUFFUyxXQUFXUCxZQUFZeUUsS0FBSyxFQUFFOzs7O1FBSTFDLEVBQUVzRixRQUFRdEIsYUFBYSxHQUFHM0ksR0FBRyxDQUFDOzsrQ0FFUyxFQUFFUyxXQUFXTixNQUFNZ0osZ0JBQWdCLEVBQUU7a0NBQ2xELEVBQUV4SSxPQUFPc0osUUFBUXRCLGFBQWEsRUFBRTs7O1FBRzFELENBQUMsR0FBRzNJLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDVixFQUFFaUssUUFBUU4sU0FBUyxHQUFHM0osR0FBRyxDQUFDOztnREFFYyxFQUFFUyxXQUFXTixNQUFNNEosa0JBQWtCLEVBQUU7cURBQ2xDLEVBQUV0SixXQUFXTixNQUFNMkoscUJBQXFCLEVBQUU7NENBQ25ELEVBQUVqSixPQUFPb0osUUFBUU4sU0FBUyxFQUFFOzs7UUFHaEUsQ0FBQyxHQUFHM0osR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNWLEVBQUVrSyw0QkFBNEJsSyxHQUFHLENBQUM7O2lEQUVPLEVBQUVTLFdBQVdOLE1BQU1nSyxrQkFBa0IsRUFBRTs7Ozs7UUFLaEYsQ0FBQyxHQUFHbkssR0FBRyxDQUFDLENBQUMsQ0FBQzs7Ozs7O0VBTWhCLENBQUM7SUFFRCxPQUFPSSxNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9PLEdBQUc7QUFDN0UsRUFBRTtBQUVGLE9BQU8sTUFBTWdGLDZCQUE2QixPQUN4QzFJLFNBQ0FnQjtJQUVBLE1BQU1RLFlBQVkzQztJQUNsQixNQUFNOEosb0JBQW9CL0ksZ0JBQWdCb0IsTUFBTTJILGlCQUFpQixFQUFFO0lBQ25FLE1BQU1DLGlCQUFpQmhKLGdCQUFnQm9CLE1BQU00SCxjQUFjLEVBQUU7SUFDN0QsTUFBTUMsV0FBVzdILE1BQU02SCxRQUFRLElBQUksQ0FBQztJQUNwQyxNQUFNM0gsUUFBUXhCLFlBQVltSixTQUFTM0gsS0FBSyxFQUFFLEtBQUtDLFdBQVc7SUFDMUQsTUFBTTJILGFBQWFDLE1BQU1yQyxJQUFJLENBQUMsSUFBSXRHLElBQUk7V0FBS1ksTUFBTThILFVBQVUsSUFBSSxFQUFFO1dBQU0sQUFBQzlILENBQUFBLE1BQU1nSSxRQUFRLElBQUksRUFBRSxBQUFELEVBQUdyRSxHQUFHLENBQUMsQ0FBQ3NFLFVBQVlBLFFBQVFoQixTQUFTO0tBQUUsQ0FDL0h0RCxHQUFHLENBQUMsQ0FBQ3NELFlBQWNySSxnQkFBZ0JxSSxXQUFXLE1BQzlDckUsTUFBTSxDQUFDaUI7SUFFVixJQUFHLENBQUM4RCxtQkFBbUI7UUFDckIsTUFBTSxJQUFJekksTUFBTTtJQUNsQjtJQUNBLElBQUcsQ0FBQzBJLGdCQUFnQjtRQUNsQixNQUFNLElBQUkxSSxNQUFNO0lBQ2xCO0lBQ0EsSUFBRyxDQUFDZ0IsT0FBTztRQUNULE1BQU0sSUFBSWhCLE1BQU07SUFDbEI7SUFFQSxNQUFNcUgsVUFBVWhJLFlBQVksZ0JBQWdCb0o7SUFDNUMsTUFBTXpHLGFBQWE7UUFDakJDLE1BQU1vRjtRQUNObEYsT0FBT2I7UUFDUE47UUFDQVUsV0FBV2xDLFlBQVltSixTQUFTakgsU0FBUyxFQUFFO1FBQzNDQyxVQUFVbkMsWUFBWW1KLFNBQVNoSCxRQUFRLEVBQUU7UUFDekNVLHdCQUF3QjtRQUN4QnRCLGdCQUFnQjRILFNBQVM1SCxjQUFjLEtBQUs7UUFDNUNlLGtCQUFrQjZHLFNBQVM1SCxjQUFjLEtBQUssT0FBT08sWUFBWTBIO1FBQ2pFMUcsVUFBVWhCO1FBQ1ZtSDtRQUNBbEcsTUFBTTtRQUNORSxRQUFRNEU7SUFDVjtJQUNBLE1BQU16RSxhQUFhO1FBQ2pCNUI7UUFDQVUsV0FBV2xDLFlBQVltSixTQUFTakgsU0FBUyxFQUFFO1FBQzNDQyxVQUFVbkMsWUFBWW1KLFNBQVNoSCxRQUFRLEVBQUU7UUFDekNzSCxpQkFBaUJuSSxNQUFNb0ksV0FBVyxJQUFJNUg7UUFDdENlLHdCQUF3QjtRQUN4QnRCLGdCQUFnQjRILFNBQVM1SCxjQUFjLEtBQUs7UUFDNUN1QixVQUFVaEI7UUFDVm1IO0lBQ0Y7SUFDQSxNQUFNVSxZQUFZL0ssR0FBRyxDQUFDOztrQkFFTixFQUFFUyxXQUFXUCxZQUFZeUUsS0FBSyxFQUFFO3lDQUNULEVBQUUwRixrQkFBa0Isa0JBQWtCLEVBQUV6SCxNQUFNOzs7OzZDQUkxQyxFQUFFcUcsUUFBUTs7aUJBRXRDLEVBQUVyRixXQUFXO1dBQ25CLEVBQUVZLFdBQVcsSUFBSSxFQUFFL0QsV0FBV1AsWUFBWXlFLEtBQUssRUFBRTs7RUFFMUQsQ0FBQztJQUNELE1BQU1GLE9BQU8sTUFBTXJFLE1BQU1zQixRQUFRdUIsWUFBWSxFQUFFeUIsS0FBSyxDQUFDcUcsV0FBV25HLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBQzVGLE1BQU1rRyxrQkFBa0JySyxPQUFPRSxPQUFPNEQsTUFBTVosUUFBUVksTUFBTUosVUFBVTRFO0lBQ3BFLE1BQU1nQyxXQUFXaEssWUFBWSxpQkFBaUJxSjtJQUM5QyxNQUFNWSxRQUFRO1FBQ1pySCxNQUFNb0g7UUFDTmxILE9BQU9iO1FBQ1BpSSxVQUFVL0osWUFBWXNCLE1BQU15SSxRQUFRLEVBQUUsR0FBR0MsV0FBVztRQUNwREMsaUJBQWlCSjtRQUNqQi9HLFVBQVVoQjtRQUNWc0g7UUFDQU0sYUFBYXBJLE1BQU1vSSxXQUFXLElBQUk1SDtRQUNsQ21IO1FBQ0FDO1FBQ0FnQixZQUFZQyxPQUFPN0ksTUFBTTRJLFVBQVUsSUFBSTtRQUN2Q2pILFFBQVEyRztJQUNWO0lBQ0EsTUFBTVEsYUFBYXhMLEdBQUcsQ0FBQztrQkFDUCxFQUFFaUwsU0FBUztXQUNsQixFQUFFQyxNQUFNO1dBQ1IsRUFBRTtRQUNQQyxVQUFVRCxNQUFNQyxRQUFRO1FBQ3hCakgsVUFBVWhCO1FBQ1ZzSDtRQUNBTSxhQUFhSSxNQUFNSixXQUFXO1FBQzlCUSxZQUFZSixNQUFNSSxVQUFVO1FBQzVCakgsUUFBUTJHO0lBQ1YsRUFBRSxJQUFJLEVBQUV2SyxXQUFXUCxZQUFZdUwsZUFBZSxFQUFFOztFQUVsRCxDQUFDO0lBQ0QsTUFBTUMsYUFBYSxNQUFNdEwsTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUM4RyxZQUFZNUcsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUk7SUFFbkcsTUFBTW1ELFNBQ0p2RyxTQUNBdkIsTUFBTTRKLGtCQUFrQixFQUN4Qm5LLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRW9MLGdCQUFnQixDQUFDLEVBQUVDLFVBQVUsR0FDNURuSyxNQUFNWixZQUFZeUUsS0FBSyxFQUFFcUcsa0JBQ3pCbEssTUFBTVosWUFBWXVMLGVBQWUsRUFBRVIsV0FDbkM7UUFBQ0gsYUFBYUksTUFBTUosV0FBVztRQUFFVDtRQUFtQkM7SUFBYztJQUdwRSxNQUFNcUIsUUFBUXZHLEdBQUcsQ0FBQ29GLFdBQVduRSxHQUFHLENBQUMsT0FBT3NEO1FBQ3RDLE1BQU1nQixVQUFVLEFBQUNqSSxDQUFBQSxNQUFNZ0ksUUFBUSxJQUFJLEVBQUUsQUFBRCxFQUFHa0IsSUFBSSxDQUFDLENBQUNDLE9BQVNBLEtBQUtsQyxTQUFTLEtBQUtBLGNBQWM7WUFBQ0E7UUFBUztRQUNqRyxNQUFNQyxhQUFhM0ksWUFBWSxtQkFBbUIwSTtRQUNsRCxNQUFNbUMsYUFBYTtZQUNqQmpJLE1BQU0rRjtZQUNON0YsT0FBT2I7WUFDUGdCLFVBQVVoQjtZQUNWeUc7WUFDQW9DLE9BQU8zSyxZQUFZdUosUUFBUW9CLEtBQUssRUFBRTtZQUNsQ0MsV0FBVzFLLGdCQUFnQnFKLFFBQVFxQixTQUFTLEVBQUU7UUFDaEQ7UUFDQSxNQUFNQyxlQUFlak0sR0FBRyxDQUFDO29CQUNULEVBQUU0SixXQUFXO2FBQ3BCLEVBQUVrQyxXQUFXO2FBQ2IsRUFBRTtZQUNQNUgsVUFBVWhCO1lBQ1Y2SSxPQUFPRCxXQUFXQyxLQUFLO1lBQ3ZCQyxXQUFXRixXQUFXRSxTQUFTO1FBQ2pDLEVBQUUsSUFBSSxFQUFFdkwsV0FBV1AsWUFBWTJKLGdCQUFnQixFQUFFO0lBQ25ELENBQUM7UUFDRCxNQUFNekosTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUN1SDtRQUN4QyxNQUFNaEUsU0FDSnZHLFNBQ0F2QixNQUFNMkoscUJBQXFCLEVBQzNCbEssV0FBVyxDQUFDLG9CQUFvQixFQUFFcUwsU0FBUyxDQUFDLEVBQUVyQixZQUFZLEdBQzFEOUksTUFBTVosWUFBWXVMLGVBQWUsRUFBRVIsV0FDbkNuSyxNQUFNWixZQUFZMkosZ0JBQWdCLEVBQUVELGFBQ3BDO1lBQUNEO1lBQVdtQixhQUFhSSxNQUFNSixXQUFXO1FBQUE7SUFFOUM7SUFFQSxNQUFNMUssTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUMxRSxHQUFHLENBQUM7V0FDbkMsRUFBRWdMLGdCQUFnQjs7dUJBRU4sRUFBRUUsTUFBTUosV0FBVyxDQUFDOzttQ0FFUixFQUFFaEssTUFBTVosWUFBWXlFLEtBQUssRUFBRXFHLGlCQUFpQixDQUFDLEVBQUV2SyxXQUFXTixNQUFNNEosa0JBQWtCLEVBQUU7Ozs7bUNBSXBGLEVBQUVqSixNQUFNWixZQUFZeUUsS0FBSyxFQUFFcUcsaUJBQWlCLENBQUMsRUFBRXZLLFdBQVdOLE1BQU00SixrQkFBa0IsRUFBRTs7O1NBRzlHLEVBQUV0SixXQUFXUCxZQUFZeUUsS0FBSyxFQUFFO0VBQ3ZDLENBQUM7SUFFRCxPQUFPK0c7QUFDVCxFQUFFO0FBRUYsT0FBTyxNQUFNUSwwQkFBMEIsQ0FDckN4SyxTQUNBMkM7SUFFQSxNQUFNSyxRQUFRMUUsR0FBRyxDQUFDOytCQUNXLEVBQUVjLE1BQU1aLFlBQVl5RSxLQUFLLEVBQUVOLFFBQVEsQ0FBQyxFQUFFNUQsV0FBV04sTUFBTTRKLGtCQUFrQixFQUFFOzs7RUFHeEcsQ0FBQztJQUVELE9BQU8zSixNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9PLEdBQUc7QUFDN0UsRUFBRTtBQUVGLE9BQU8sTUFBTStHLHNCQUFzQixPQUNqQ3pLLFNBQ0FnQjtJQUVBLE1BQU1RLFlBQVkzQztJQUNsQixNQUFNMEksVUFBVXRJLE9BQU9FLE9BQU82QixNQUFNMkIsTUFBTSxJQUFJO0lBQzlDLE1BQU0rSCxZQUFZekwsT0FBT0UsT0FBTzZCLE1BQU0ySixlQUFlLElBQUl6TSxXQUFXLENBQUMsZUFBZSxFQUFFcUosUUFBUSxDQUFDLEVBQUUvRixXQUFXO0lBQzVHLE1BQU1vSixTQUFTO1FBQ2J6SSxNQUFNdUk7UUFDTnJJLE9BQU9iO1FBQ1BxSixrQkFBa0I1TCxPQUFPRSxPQUFPNkIsTUFBTTZKLGdCQUFnQixJQUFJO1FBQzFEMUQsYUFBYXpILFlBQVlzQixNQUFNbUcsV0FBVyxFQUFFO1FBQzVDM0UsVUFBVWhCO1FBQ1ZzSixVQUFVOUosTUFBTThKLFFBQVEsSUFBSTtRQUM1QjdDLFdBQVdySSxnQkFBZ0JvQixNQUFNaUgsU0FBUyxFQUFFO1FBQzVDVyxnQkFBZ0JsSixZQUFZc0IsTUFBTTRILGNBQWMsRUFBRTtRQUNsRHpELFFBQVE7UUFDUmYsU0FBUzFFLFlBQVlzQixNQUFNb0QsT0FBTyxFQUFFO1FBQ3BDdUcsaUJBQWlCRDtRQUNqQmpJLE1BQU16QixNQUFNeUIsSUFBSSxJQUFJO1FBQ3BCRSxRQUFRNEU7SUFDVjtJQUNBLE1BQU12RSxRQUFRMUUsR0FBRyxDQUFDO1dBQ1QsRUFBRXNNLE9BQU8sSUFBSSxFQUFFN0wsV0FBV1AsWUFBWXVNLGVBQWUsRUFBRTs7RUFFaEUsQ0FBQztJQUNELE1BQU1DLGNBQWMsTUFBTXRNLE1BQU1zQixRQUFRdUIsWUFBWSxFQUFFeUIsS0FBSyxDQUFDQSxPQUFPRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSTtJQUUvRixNQUFNbUQsU0FDSnZHLFNBQ0F2QixNQUFNZ0ssa0JBQWtCLEVBQ3hCdkssV0FBVyxDQUFDLGlCQUFpQixFQUFFcUosUUFBUSxDQUFDLEVBQUVtRCxXQUFXLEdBQ3JEdEwsTUFBTVosWUFBWXlFLEtBQUssRUFBRXNFLFVBQ3pCbkksTUFBTVosWUFBWXVNLGVBQWUsRUFBRUwsWUFDbkM7UUFBQ0ksVUFBVUYsT0FBT0UsUUFBUTtRQUFFM0YsUUFBUXlGLE9BQU96RixNQUFNO1FBQUUxQyxNQUFNbUksT0FBT25JLElBQUk7SUFBQTtJQUV0RSxNQUFNd0ksc0JBQXNCakwsU0FBUztRQUNuQ2tMLGFBQWFqTSxPQUFPRSxPQUFPYSxTQUFTQyxTQUFTMEMsVUFBVTRFO1FBQ3ZENEQsV0FBVztRQUNYUixpQkFBaUJEO1FBQ2pCVSxTQUFTUixPQUFPekYsTUFBTTtJQUN4QjtJQUVBLE9BQU82RjtBQUNULEVBQUU7QUFFRixPQUFPLE1BQU1LLG9CQUFvQixDQUMvQnJMLFNBQ0FzTCxVQUFnRSxDQUFDLENBQUM7SUFFbEUsTUFBTXRJLFFBQVExRSxHQUFHLENBQUM7a0JBQ0YsRUFBRVMsV0FBV1AsWUFBWXVNLGVBQWUsRUFBRTtNQUN0RCxFQUFFTyxRQUFRbkcsTUFBTSxHQUFHN0csR0FBRyxDQUFDLHdCQUF3QixFQUFFZ04sUUFBUW5HLE1BQU0sQ0FBQyxDQUFDLEdBQUc3RyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQzFFLEVBQUVnTixRQUFRM0ksTUFBTSxHQUFHckUsR0FBRyxDQUFDLHdCQUF3QixFQUFFVyxPQUFPcU0sUUFBUTNJLE1BQU0sRUFBRSxDQUFDLEdBQUdyRSxHQUFHLENBQUMsQ0FBQyxDQUFDOzBCQUM5RCxFQUFFRSxZQUFZeUUsS0FBSyxDQUFDOzs7RUFHNUMsQ0FBQztJQUVELE9BQU92RSxNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9PLEdBQUc7QUFDN0UsRUFBRTtBQUVGLE9BQU8sTUFBTTZILDRCQUE0QixPQUN2Q3ZMLFNBQ0EySyxpQkFDQXhGLFFBQ0FxRyxvQkFBb0IsRUFBRTtJQUV0QixNQUFNZCxZQUFZekwsT0FBTzBMO0lBQ3pCLE1BQU1uSixZQUFZM0M7SUFDbEIsTUFBTTRNLFdBQVcsTUFBTS9NLE1BQU1zQixRQUFRdUIsWUFBWSxFQUM5Q3lCLEtBQUssQ0FBQzFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRWMsTUFBTVosWUFBWXVNLGVBQWUsRUFBRUwsV0FBVyxDQUFDLENBQUMsRUFDNUV4SCxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSTtJQUMvQixNQUFNd0UsU0FBUztRQUNiLEdBQUl6QyxXQUFXLGNBQWM7WUFBQ3VHLFlBQVlsSztZQUFXZ0ssbUJBQW1COUwsWUFBWThMLG1CQUFtQjtRQUFLLENBQUM7UUFDN0csR0FBSXJHLFdBQVcsWUFBWTtZQUFDd0csVUFBVW5LO1FBQVMsQ0FBQztRQUNoRGdCLFVBQVVoQjtRQUNWMkQ7SUFDRjtJQUNBLE1BQU1uQyxRQUFRMUUsR0FBRyxDQUFDO1dBQ1QsRUFBRW9NLFVBQVUsTUFBTSxFQUFFOUMsT0FBTyxJQUFJLEVBQUU3SSxXQUFXUCxZQUFZdU0sZUFBZSxFQUFFOztFQUVsRixDQUFDO0lBQ0QsTUFBTUgsU0FBUyxNQUFNbE0sTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBRTFGLE1BQU0xRSxNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQzFFLEdBQUcsQ0FBQztnQkFDOUIsRUFBRVMsV0FBV04sTUFBTWdLLGtCQUFrQixFQUFFO3lCQUM5QixFQUFFckosTUFBTVosWUFBWXVNLGVBQWUsRUFBRUwsV0FBVzt1QkFDbEQsRUFBRTtRQUNqQmxJLFVBQVVoQjtRQUNWa0ssWUFBWXZHLFdBQVcsYUFBYTNELFlBQVkwSDtRQUNoRC9EO0lBQ0YsRUFBRSxJQUFJLEVBQUVwRyxXQUFXTixNQUFNZ0ssa0JBQWtCLEVBQUU7RUFDakQsQ0FBQztJQUNELE1BQU13QyxzQkFBc0JqTCxTQUFTO1FBQ25Da0wsYUFBYWpNLE9BQU9FLE9BQU9hLFNBQVNDLFNBQVMwQyxVQUFVO1FBQ3ZEd0ksV0FBVztRQUNYUyxXQUFXSCxVQUFVdEc7UUFDckJ3RixpQkFBaUJEO1FBQ2pCVSxTQUFTakc7SUFDWDtJQUVBLElBQUdBLFdBQVcsWUFBWTtRQUN4QixNQUFNMEcsMkJBQTJCN0wsU0FBUztZQUN4QzhMLE1BQU1wTSxZQUFZOEwscUJBQXFCLDBDQUEwQztZQUNqRnJHLFFBQVE7WUFDUmYsU0FBUyxDQUFDLFVBQVUsRUFBRXdHLE9BQU94RyxPQUFPLElBQUksa0JBQWtCO1lBQzFEdUcsaUJBQWlCRDtZQUNqQmpJLE1BQU07WUFDTkUsUUFBUWlJLE9BQU9qSSxNQUFNO1FBQ3ZCO0lBQ0Y7SUFFQSxPQUFPaUk7QUFDVCxFQUFFO0FBRUYsT0FBTyxNQUFNbUIsMEJBQTBCLE9BQ3JDL0wsU0FDQWdCO0lBRUEsTUFBTVEsWUFBWTNDO0lBQ2xCLE1BQU02TCxZQUFZekwsT0FBT0UsT0FBTzZCLE1BQU0ySixlQUFlLElBQUk7SUFDekQsTUFBTXFCLGFBQWEvTSxPQUFPRSxPQUFPNkIsTUFBTWlMLHNCQUFzQixJQUFJL04sV0FBVyxDQUFDLHVCQUF1QixFQUFFd00sVUFBVSxDQUFDLEVBQUVsSixXQUFXO0lBQzlILE1BQU0wSyxVQUFVO1FBQ2QvSixNQUFNNko7UUFDTjNKLE9BQU9iO1FBQ1AySyxjQUFjbE4sT0FBT0UsT0FBTzZCLE1BQU1tTCxZQUFZLElBQUluTSxTQUFTQyxTQUFTMEMsVUFBVTtRQUM5RW1KLE1BQU1wTSxZQUFZc0IsTUFBTThLLElBQUksRUFBRTtRQUM5QnRKLFVBQVVoQjtRQUNWbUosaUJBQWlCRDtRQUNqQnVCLHdCQUF3QkQ7UUFDeEJJLFlBQVlwTCxNQUFNb0wsVUFBVSxJQUFJO0lBQ2xDO0lBQ0EsTUFBTXBKLFFBQVExRSxHQUFHLENBQUM7V0FDVCxFQUFFNE4sUUFBUSxJQUFJLEVBQUVuTixXQUFXUCxZQUFZNk4sdUJBQXVCLEVBQUU7O0VBRXpFLENBQUM7SUFDRCxNQUFNQyxlQUFlLE1BQU01TixNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUk7SUFFaEcsTUFBTW1ELFNBQ0p2RyxTQUNBdkIsTUFBTThOLDBCQUEwQixFQUNoQ3JPLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRXdNLFVBQVUsQ0FBQyxFQUFFc0IsWUFBWSxHQUMvRDVNLE1BQU1aLFlBQVl1TSxlQUFlLEVBQUVMLFlBQ25DdEwsTUFBTVosWUFBWTZOLHVCQUF1QixFQUFFTCxhQUMzQztRQUFDRyxjQUFjRCxRQUFRQyxZQUFZO1FBQUVDLFlBQVlGLFFBQVFFLFVBQVU7SUFBQTtJQUdyRSxPQUFPRTtBQUNULEVBQUU7QUFFRixPQUFPLE1BQU1FLDJCQUEyQixDQUN0Q3hNLFNBQ0EySztJQUVBLE1BQU0zSCxRQUFRMUUsR0FBRyxDQUFDO2lDQUNhLEVBQUVjLE1BQU1aLFlBQVl1TSxlQUFlLEVBQUVKLGlCQUFpQixDQUFDLEVBQUU1TCxXQUFXTixNQUFNOE4sMEJBQTBCLEVBQUU7OztFQUdySSxDQUFDO0lBRUQsT0FBTzdOLE1BQU1zQixRQUFRdUIsWUFBWSxFQUFFeUIsS0FBSyxDQUFDQSxPQUFPRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT08sR0FBRztBQUM3RSxFQUFFO0FBRUYsT0FBTyxNQUFNdUgsd0JBQXdCLE9BQ25DakwsU0FDQWdCO0lBRUEsTUFBTVEsWUFBWTNDO0lBQ2xCLE1BQU02TCxZQUFZekwsT0FBT0UsT0FBTzZCLE1BQU0ySixlQUFlLElBQUk7SUFDekQsTUFBTThCLFdBQVd4TixPQUFPRSxPQUFPNkIsTUFBTTBMLG9CQUFvQixJQUFJeE8sV0FBVyxDQUFDLHFCQUFxQixFQUFFd00sVUFBVSxDQUFDLEVBQUVsSixVQUFVLENBQUMsRUFBRVIsTUFBTW1LLFNBQVMsRUFBRTtJQUMzSSxNQUFNd0IsUUFBUTtRQUNaeEssTUFBTXNLO1FBQ05wSyxPQUFPYjtRQUNQMEosYUFBYWpNLE9BQU9FLE9BQU82QixNQUFNa0ssV0FBVyxJQUFJO1FBQ2hEQyxXQUFXekwsWUFBWXNCLE1BQU1tSyxTQUFTLEVBQUU7UUFDeENTLFdBQVdsTSxZQUFZc0IsTUFBTTRLLFNBQVMsRUFBRTtRQUN4Q2dCLFVBQVU1TCxNQUFNNEwsUUFBUSxJQUFJLENBQUM7UUFDN0JwSyxVQUFVaEI7UUFDVmtMLHNCQUFzQkQ7UUFDdEI5QixpQkFBaUJEO1FBQ2pCVSxTQUFTMUwsWUFBWXNCLE1BQU1vSyxPQUFPLEVBQUU7SUFDdEM7SUFDQSxNQUFNcEksUUFBUTFFLEdBQUcsQ0FBQztXQUNULEVBQUVxTyxNQUFNLElBQUksRUFBRTVOLFdBQVdQLFlBQVlxTyxxQkFBcUIsRUFBRTs7RUFFckUsQ0FBQztJQUNELE1BQU1DLGFBQWEsTUFBTXBPLE1BQU1zQixRQUFRdUIsWUFBWSxFQUFFeUIsS0FBSyxDQUFDQSxPQUFPRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSTtJQUU5RixNQUFNbUQsU0FDSnZHLFNBQ0F2QixNQUFNc08sd0JBQXdCLEVBQzlCN08sV0FBVyxDQUFDLHNCQUFzQixFQUFFd00sVUFBVSxDQUFDLEVBQUUrQixVQUFVLEdBQzNEck4sTUFBTVosWUFBWXVNLGVBQWUsRUFBRUwsWUFDbkN0TCxNQUFNWixZQUFZcU8scUJBQXFCLEVBQUVKLFdBQ3pDO1FBQUN2QixhQUFheUIsTUFBTXpCLFdBQVc7UUFBRUMsV0FBV3dCLE1BQU14QixTQUFTO0lBQUE7SUFHN0QsT0FBTzJCO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTUUseUJBQXlCLENBQ3BDaE4sU0FDQTJLO0lBRUEsTUFBTTNILFFBQVExRSxHQUFHLENBQUM7K0JBQ1csRUFBRWMsTUFBTVosWUFBWXVNLGVBQWUsRUFBRUosaUJBQWlCLENBQUMsRUFBRTVMLFdBQVdOLE1BQU1zTyx3QkFBd0IsRUFBRTs7O0VBR2pJLENBQUM7SUFFRCxPQUFPck8sTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPTyxHQUFHO0FBQzdFLEVBQUU7QUFFRixPQUFPLE1BQU1tSSw2QkFBNkIsT0FDeEM3TCxTQUNBZ0I7SUFFQSxNQUFNUSxZQUFZM0M7SUFDbEIsTUFBTTBJLFVBQVV0SSxPQUFPRSxPQUFPNkIsTUFBTTJCLE1BQU0sSUFBSTtJQUM5QyxNQUFNc0ssa0JBQWtCaE8sT0FBT0UsT0FBTzZCLE1BQU1rTSxzQkFBc0IsSUFBSWhQLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRXFKLFFBQVEsQ0FBQyxFQUFFL0YsV0FBVztJQUNoSSxNQUFNMkwsZUFBZTtRQUNuQmhMLE1BQU04SztRQUNONUssT0FBT2I7UUFDUHNLLE1BQU1wTSxZQUFZc0IsTUFBTThLLElBQUksRUFBRTtRQUM5Qm9CLHdCQUF3QkQ7UUFDeEJ6SyxVQUFVaEI7UUFDVjhFLFFBQVF0RixNQUFNc0YsTUFBTTtRQUNwQm5CLFFBQVFuRSxNQUFNbUUsTUFBTSxJQUFJO1FBQ3hCZixTQUFTMUUsWUFBWXNCLE1BQU1vRCxPQUFPLEVBQUU7UUFDcEN1RyxpQkFBaUIxTCxPQUFPRSxPQUFPNkIsTUFBTTJKLGVBQWUsSUFBSTtRQUN4RGxJLE1BQU0vQyxZQUFZc0IsTUFBTXlCLElBQUksRUFBRTtRQUM5QkUsUUFBUTRFO0lBQ1Y7SUFDQSxNQUFNdkUsUUFBUTFFLEdBQUcsQ0FBQztXQUNULEVBQUU2TyxhQUFhLElBQUksRUFBRXBPLFdBQVdQLFlBQVk0TyxzQkFBc0IsRUFBRTs7RUFFN0UsQ0FBQztJQUNELE1BQU1DLG9CQUFvQixNQUFNM08sTUFBTXNCLFFBQVF1QixZQUFZLEVBQUV5QixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBRXJHLE1BQU1tRCxTQUNKdkcsU0FDQXZCLE1BQU02Tyx5QkFBeUIsRUFDL0JwUCxXQUFXLENBQUMsd0JBQXdCLEVBQUVxSixRQUFRLENBQUMsRUFBRTBGLGlCQUFpQixHQUNsRTdOLE1BQU1aLFlBQVl5RSxLQUFLLEVBQUVzRSxVQUN6Qm5JLE1BQU1aLFlBQVk0TyxzQkFBc0IsRUFBRUgsa0JBQzFDO1FBQ0U5SCxRQUFRZ0ksYUFBYWhJLE1BQU07UUFDM0J3RixpQkFBaUJ3QyxhQUFheEMsZUFBZTtRQUM3Q2xJLE1BQU0wSyxhQUFhMUssSUFBSTtJQUN6QjtJQUdGLE9BQU80SztBQUNULEVBQUU7QUFFRixPQUFPLE1BQU1FLGlDQUFpQyxDQUM1Q3ZOLFNBQ0EyQztJQUVBLE1BQU1LLFFBQVExRSxHQUFHLENBQUM7c0NBQ2tCLEVBQUVjLE1BQU1aLFlBQVl5RSxLQUFLLEVBQUVOLFFBQVEsQ0FBQyxFQUFFNUQsV0FBV04sTUFBTTZPLHlCQUF5QixFQUFFOzs7RUFHdEgsQ0FBQztJQUVELE9BQU81TyxNQUFNc0IsUUFBUXVCLFlBQVksRUFBRXlCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9PLEdBQUc7QUFDN0UsRUFBRSJ9