-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathomp_core.module-definition.json
More file actions
487 lines (487 loc) · 223 KB
/
Copy pathomp_core.module-definition.json
File metadata and controls
487 lines (487 loc) · 223 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
{
"formatVersion": 1,
"definitionType": "platform-core",
"moduleKey": "omp_core",
"definitionVersion": "0.3.78",
"module": {
"displayName": "OpenModulePlatform Core",
"moduleType": "PlatformCore",
"schemaName": "omp",
"description": "Core OMP schema, bootstrap data, and host-local infrastructure metadata.",
"sortOrder": 0,
"isEnabled": true
},
"apps": [
{
"appKey": "omp_hostagent",
"displayName": "OMP HostAgent",
"appType": "HostAgent",
"description": "Host-local OMP deployment agent that can prepare versioned self-upgrades.",
"sortOrder": 10,
"isEnabled": true
},
{
"appKey": "omp_workermanager",
"displayName": "OMP WorkerManager",
"appType": "ServiceApp",
"description": "Host-local Windows service that starts and supervises OMP worker plugin processes.",
"sortOrder": 20,
"isEnabled": true
},
{
"appKey": "omp_workerprocesshost",
"displayName": "OMP Worker Process Host",
"appType": "WorkerHost",
"description": "Host-local executable used by WorkerManager to run worker plugin artifacts.",
"sortOrder": 30,
"isEnabled": true
}
],
"compatibleArtifacts": [
{
"appKey": "omp_hostagent",
"packageType": "host-agent",
"targetName": "omp-hostagent",
"relativePathTemplate": "omp-hostagent/hostagent/{version}",
"minVersion": "0.3.10",
"maxVersion": null
},
{
"appKey": "omp_workermanager",
"packageType": "service-app",
"targetName": "omp-workermanager",
"relativePathTemplate": "omp-workermanager/service/{version}",
"minVersion": "0.3.3",
"maxVersion": null
},
{
"appKey": "omp_workerprocesshost",
"packageType": "worker-host",
"targetName": "omp-workerprocesshost",
"relativePathTemplate": "omp-workerprocesshost/host/{version}",
"minVersion": "0.3.3",
"maxVersion": null
}
],
"sqlScripts": [
{
"key": "validate-core-schema",
"phase": "validate",
"scope": "omp",
"order": 5,
"path": "sql/0-validate-openmoduleplatform.sql",
"execution": "validation",
"inlineSql": null,
"contentEncoding": "base64-utf8",
"content": "U0VUIE5PQ09VTlQgT047CgpERUNMQVJFIEBNaXNzaW5nIGludCA9IDA7CgpJRiBTQ0hFTUFfSUQoTidvbXAnKSBJUyBOVUxMCkJFR0lOCiAgICBTRVQgQE1pc3NpbmcgPSBATWlzc2luZyArIDE7CkVORDsKCjtXSVRIIFJlcXVpcmVkVGFibGVzKFNjaGVtYU5hbWUsIFRhYmxlTmFtZSkgQVMKKAogICAgU0VMRUNUIHYuU2NoZW1hTmFtZSwgdi5UYWJsZU5hbWUKICAgIEZST00gKFZBTFVFUwogICAgICAgIChOJ29tcCcsIE4nUGVybWlzc2lvbnMnKSwKICAgICAgICAoTidvbXAnLCBOJ1JvbGVzJyksCiAgICAgICAgKE4nb21wJywgTidSb2xlUGVybWlzc2lvbnMnKSwKICAgICAgICAoTidvbXAnLCBOJ1JvbGVQcmluY2lwYWxzJyksCiAgICAgICAgKE4nb21wJywgTidBdWRpdExvZycpLAogICAgICAgIChOJ29tcCcsIE4nSW5zdGFuY2VUZW1wbGF0ZXMnKSwKICAgICAgICAoTidvbXAnLCBOJ0hvc3RUZW1wbGF0ZXMnKSwKICAgICAgICAoTidvbXAnLCBOJ0luc3RhbmNlcycpLAogICAgICAgIChOJ29tcCcsIE4nTW9kdWxlcycpLAogICAgICAgIChOJ29tcCcsIE4nTW9kdWxlSW5zdGFuY2VzJyksCiAgICAgICAgKE4nb21wJywgTidBcHBzJyksCiAgICAgICAgKE4nb21wJywgTidBcHBQZXJtaXNzaW9ucycpLAogICAgICAgIChOJ29tcCcsIE4nTW9kdWxlRGVmaW5pdGlvbkRvY3VtZW50cycpLAogICAgICAgIChOJ29tcCcsIE4nTW9kdWxlRGVmaW5pdGlvbkFydGlmYWN0Q29tcGF0aWJpbGl0eScpLAogICAgICAgIChOJ29tcCcsIE4nTW9kdWxlRGVmaW5pdGlvblNxbEV4ZWN1dGlvbnMnKSwKICAgICAgICAoTidvbXAnLCBOJ0FydGlmYWN0cycpLAogICAgICAgIChOJ29tcCcsIE4nQXJ0aWZhY3RDb25maWd1cmF0aW9uRmlsZXMnKSwKICAgICAgICAoTidvbXAnLCBOJ0hvc3RDb25maWd1cmF0aW9uRG9jdW1lbnRzJyksCiAgICAgICAgKE4nb21wJywgTidDb25maWdPdmVybGF5RG9jdW1lbnRzJyksCiAgICAgICAgKE4nb21wJywgTidDb25maWdPdmVybGF5Q29uZmlndXJhdGlvbkZpbGVzJyksCiAgICAgICAgKE4nb21wJywgTidIb3N0cycpLAogICAgICAgIChOJ29tcCcsIE4nQXBwSW5zdGFuY2VzJyksCiAgICAgICAgKE4nb21wJywgTidBcHBXb3JrZXJEZWZpbml0aW9ucycpLAogICAgICAgIChOJ29tcCcsIE4nQXBwSW5zdGFuY2VSdW50aW1lU3RhdGVzJyksCiAgICAgICAgKE4nb21wJywgTidIb3N0QXJ0aWZhY3RSZXF1aXJlbWVudHMnKSwKICAgICAgICAoTidvbXAnLCBOJ0hvc3RBcnRpZmFjdFN0YXRlcycpLAogICAgICAgIChOJ29tcCcsIE4nSG9zdEFwcERlcGxveW1lbnRTdGF0ZXMnKSwKICAgICAgICAoTidvbXAnLCBOJ1dlYkFwcEhlYWx0aFN0YXRlcycpLAogICAgICAgIChOJ29tcCcsIE4nSG9zdEFnZW50RGVzaXJlZFN0YXRlcycpLAogICAgICAgIChOJ29tcCcsIE4nSG9zdEFnZW50UnVudGltZVN0YXRlcycpLAogICAgICAgIChOJ29tcCcsIE4nSG9zdEFnZW50TGVhc2VzJyksCiAgICAgICAgKE4nb21wJywgTidIb3N0QWdlbnRKb2JzJyksCiAgICAgICAgKE4nb21wJywgTidNYWludGVuYW5jZUZpbmRpbmdzJyksCiAgICAgICAgKE4nb21wJywgTidXb3JrZXJJbnN0YW5jZXMnKSwKICAgICAgICAoTidvbXAnLCBOJ1dvcmtlckluc3RhbmNlUnVudGltZVN0YXRlcycpLAogICAgICAgIChOJ29tcCcsIE4nSW5zdGFuY2VUZW1wbGF0ZUhvc3RzJyksCiAgICAgICAgKE4nb21wJywgTidJbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VzJyksCiAgICAgICAgKE4nb21wJywgTidJbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzJyksCiAgICAgICAgKE4nb21wJywgTidIb3N0RGVwbG95bWVudEFzc2lnbm1lbnRzJyksCiAgICAgICAgKE4nb21wJywgTidIb3N0RGVwbG95bWVudHMnKSwKICAgICAgICAoTidvbXAnLCBOJ3VzZXJzJyksCiAgICAgICAgKE4nb21wJywgTidub3RpZmljYXRpb25zJyksCiAgICAgICAgKE4nb21wJywgTidiYW5uZXJzJyksCiAgICAgICAgKE4nb21wJywgTidiYW5uZXJfdGFyZ2V0cycpLAogICAgICAgIChOJ29tcCcsIE4nY29udmVyc2F0aW9ucycpLAogICAgICAgIChOJ29tcCcsIE4nbWVzc2FnZXMnKSwKICAgICAgICAoTidvbXAnLCBOJ2NvbnZlcnNhdGlvbl9wYXJ0aWNpcGFudHMnKSwKICAgICAgICAoTidvbXAnLCBOJ21lc3NhZ2VfYXR0YWNobWVudHMnKSwKICAgICAgICAoTidvbXAnLCBOJ2RpcmVjdF9jb252ZXJzYXRpb25zJyksCiAgICAgICAgKE4nb21wJywgTidhdXRoX3Byb3ZpZGVycycpLAogICAgICAgIChOJ29tcCcsIE4ndXNlcl9hdXRoJyksCiAgICAgICAgKE4nb21wJywgTidhdXRoX3Byb3ZpZGVyX2xwd2QnKSwKICAgICAgICAoTidvbXAnLCBOJ2NvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zJyksCiAgICAgICAgKE4nb21wJywgTidjb25maWdfc2V0dGluZ3MnKQogICAgKSBBUyB2KFNjaGVtYU5hbWUsIFRhYmxlTmFtZSkKKQpTRUxFQ1QgQE1pc3NpbmcgPSBATWlzc2luZyArIENPVU5UKDEpCkZST00gUmVxdWlyZWRUYWJsZXMgcmVxdWlyZWQKV0hFUkUgT0JKRUNUX0lEKHJlcXVpcmVkLlNjaGVtYU5hbWUgKyBOJy4nICsgcmVxdWlyZWQuVGFibGVOYW1lLCBOJ1UnKSBJUyBOVUxMOwoKO1dJVEggUmVxdWlyZWRDb2x1bW5zKFNjaGVtYU5hbWUsIFRhYmxlTmFtZSwgQ29sdW1uTmFtZSkgQVMKKAogICAgU0VMRUNUIHYuU2NoZW1hTmFtZSwgdi5UYWJsZU5hbWUsIHYuQ29sdW1uTmFtZQogICAgRlJPTSAoVkFMVUVTCiAgICAgICAgKE4nb21wJywgTidJbnN0YW5jZVRlbXBsYXRlcycsIE4nU29ydE9yZGVyJyksCiAgICAgICAgKE4nb21wJywgTidIb3N0VGVtcGxhdGVzJywgTidTb3J0T3JkZXInKSwKICAgICAgICAoTidvbXAnLCBOJ0FwcHMnLCBOJ0FsbG93TXVsdGlwbGVBY3RpdmVJbnN0YW5jZXMnKSwKICAgICAgICAoTidvbXAnLCBOJ01vZHVsZURlZmluaXRpb25BcnRpZmFjdENvbXBhdGliaWxpdHknLCBOJ1JlbGF0aXZlUGF0aFRlbXBsYXRlJyksCiAgICAgICAgKE4nb21wJywgTidBcHBJbnN0YW5jZXMnLCBOJ1RhcmdldEhvc3RUZW1wbGF0ZUlkJyksCiAgICAgICAgKE4nb21wJywgTidIb3N0QXBwRGVwbG95bWVudFN0YXRlcycsIE4nQ3JlZGVudGlhbEF1dG9tYXRpb25Nb2RlJyksCiAgICAgICAgKE4nb21wJywgTidIb3N0QXBwRGVwbG95bWVudFN0YXRlcycsIE4nRGVzaXJlZFJ1bnRpbWVJZGVudGl0eScpLAogICAgICAgIChOJ29tcCcsIE4nSG9zdEFwcERlcGxveW1lbnRTdGF0ZXMnLCBOJ0FjdHVhbFJ1bnRpbWVJZGVudGl0eScpLAogICAgICAgIChOJ29tcCcsIE4nSG9zdEFwcERlcGxveW1lbnRTdGF0ZXMnLCBOJ0lkZW50aXR5Q2hlY2tTdGF0dXMnKSwKICAgICAgICAoTidvbXAnLCBOJ0hvc3RBcHBEZXBsb3ltZW50U3RhdGVzJywgTidJZGVudGl0eVJlcGFpclJlcXVlc3RlZFV0YycpLAogICAgICAgIChOJ29tcCcsIE4nSG9zdEFwcERlcGxveW1lbnRTdGF0ZXMnLCBOJ0lkZW50aXR5UmVwYWlyUmVxdWVzdGVkQnknKSwKICAgICAgICAoTidvbXAnLCBOJ0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMnLCBOJ1RhcmdldEhvc3RUZW1wbGF0ZUlkJyksCiAgICAgICAgKE4nb21wJywgTidJbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzJywgTidJc0FsbG93ZWQnKSwKICAgICAgICAoTidvbXAnLCBOJ3VzZXJzJywgTidwcm9maWxlX2ltYWdlX2ZpbGVfbmFtZScpLAogICAgICAgIChOJ29tcCcsIE4ndXNlcnMnLCBOJ3Byb2ZpbGVfaW1hZ2Vfc3RvcmFnZV9rZXknKSwKICAgICAgICAoTidvbXAnLCBOJ3VzZXJfYXV0aCcsIE4nYXV0aF9zdGF0dXMnKSwKICAgICAgICAoTidvbXAnLCBOJ2NvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zJywgTidEZXNjcmlwdGlvbicpLAogICAgICAgIChOJ29tcCcsIE4nY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMnLCBOJ1NvcnRPcmRlcicpLAogICAgICAgIChOJ29tcCcsIE4nY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMnLCBOJ0lzRW5hYmxlZCcpLAogICAgICAgIChOJ29tcCcsIE4nY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMnLCBOJ0NyZWF0ZWRVdGMnKSwKICAgICAgICAoTidvbXAnLCBOJ2NvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zJywgTidVcGRhdGVkVXRjJyksCiAgICAgICAgKE4nb21wJywgTidjb25maWdfc2V0dGluZ3MnLCBOJ0NvbmZpZ1NldHRpbmdJZCcpLAogICAgICAgIChOJ29tcCcsIE4nY29uZmlnX3NldHRpbmdzJywgTidDb25maWdWYWx1ZScpLAogICAgICAgIChOJ29tcCcsIE4nY29uZmlnX3NldHRpbmdzJywgTidDb25maWdQcmlvcml0eScpLAogICAgICAgIChOJ29tcCcsIE4nY29uZmlnX3NldHRpbmdzJywgTidDb25maWdQZXJtaXNzaW9uJyksCiAgICAgICAgKE4nb21wJywgTidjb25maWdfc2V0dGluZ3MnLCBOJ0NvbmZpZ1Njb3BlUmFuaycpCiAgICApIEFTIHYoU2NoZW1hTmFtZSwgVGFibGVOYW1lLCBDb2x1bW5OYW1lKQopClNFTEVDVCBATWlzc2luZyA9IEBNaXNzaW5nICsgQ09VTlQoMSkKRlJPTSBSZXF1aXJlZENvbHVtbnMgcmVxdWlyZWQKV0hFUkUgQ09MX0xFTkdUSChyZXF1aXJlZC5TY2hlbWFOYW1lICsgTicuJyArIHJlcXVpcmVkLlRhYmxlTmFtZSwgcmVxdWlyZWQuQ29sdW1uTmFtZSkgSVMgTlVMTDsKClNFTEVDVAogICAgQ0FTVChDQVNFIFdIRU4gQE1pc3NpbmcgPSAwIFRIRU4gMSBFTFNFIDAgRU5EIEFTIGJpdCkgQVMgSXNIZWFsdGh5LAogICAgQ0FTRQogICAgICAgIFdIRU4gQE1pc3NpbmcgPSAwIFRIRU4gTidDb3JlIE9NUCBzdG9yYWdlIGlzIGhlYWx0aHkuJwogICAgICAgIEVMU0UgQ09OQ0FUKE4nQ29yZSBPTVAgc3RvcmFnZSBpcyBtaXNzaW5nICcsIEBNaXNzaW5nLCBOJyByZXF1aXJlZCBvYmplY3QocykuIFJ1biBTUUwgcmVwYWlyIGZvciB0aGUgb21wX2NvcmUgbW9kdWxlLicpCiAgICBFTkQgQVMgTWVzc2FnZTsK",
"sha256": "9e5945e8dc9db7704898521b3c1ee8c367d40ef661161834692d9a3dd0c60fc6"
},
{
"key": "setup-core-schema",
"phase": "setup",
"scope": "omp",
"order": 10,
"path": "sql/1-setup-openmoduleplatform.sql",
"execution": "idempotent",
"inlineSql": null,
"contentEncoding": "base64-utf8",
"content": "LS0gRmlsZTogc3FsLzEtc2V0dXAtb3Blbm1vZHVsZXBsYXRmb3JtLnNxbAovKgpPcGVuTW9kdWxlUGxhdGZvcm0gY29yZSBzZXR1cCBzY3JpcHQuCgpDcmVhdGVzIHRoZSBuZXV0cmFsIE9NUCBjb3JlIHNjaGVtYSwgdGFibGVzLCBjb25zdHJhaW50cywgYW5kIGFjY291bnQgbW9kZWwgdGhhdAphcmUgcmVxdWlyZWQgZm9yIHRoZSBwbGF0Zm9ybSBpdHNlbGYgdG8gZnVuY3Rpb24uIFRoaXMgc2NyaXB0IGNyZWF0ZXMgb25seQpvYmplY3RzIHVuZGVyIHRoZSBvbXAgc2NoZW1hLgoKUnVuIDItaW5pdGlhbGl6ZS1vcGVubW9kdWxlcGxhdGZvcm0uc3FsIGFmdGVyIHRoaXMgc2NyaXB0IHRvIHNlZWQgdGhlIGRlZmF1bHQKT01QIGluc3RhbmNlLCBib290c3RyYXAgUkJBQyBwbGFjZWhvbGRlcnMsIGFuZCBiYXNlbGluZSBzdHJ1Y3R1cmFsIHJvd3MuClBvcnRhbCwgY29udGVudCwgaWZyYW1lLCBhbmQgZXhhbXBsZSBtb2R1bGVzIGFyZSBpbnN0YWxsZWQgc2VwYXJhdGVseSBmcm9tIHRoZWlyCm93biBtb2R1bGUgc3FsIGZvbGRlcnMuCiovClNFVCBBTlNJX05VTExTIE9OOwpHTwpTRVQgUVVPVEVEX0lERU5USUZJRVIgT047CkdPClNFVCBBTlNJX1BBRERJTkcgT047CkdPClNFVCBBTlNJX1dBUk5JTkdTIE9OOwpHTwpTRVQgQ09OQ0FUX05VTExfWUlFTERTX05VTEwgT047CkdPClNFVCBBUklUSEFCT1JUIE9OOwpHTwpTRVQgTlVNRVJJQ19ST1VOREFCT1JUIE9GRjsKR08KCklGIE5PVCBFWElTVFMgKFNFTEVDVCAxIEZST00gc3lzLnNjaGVtYXMgV0hFUkUgbmFtZSA9IE4nb21wJykKICAgIEVYRUMoJ0NSRUFURSBTQ0hFTUEgW29tcF0nKTsKR08KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gUkJBQwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCklGIE9CSkVDVF9JRChOJ29tcC5QZXJtaXNzaW9ucycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuUGVybWlzc2lvbnMKICAgICgKICAgICAgICBQZXJtaXNzaW9uSWQgaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwgUFJJTUFSWSBLRVksCiAgICAgICAgTmFtZSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIERlc2NyaXB0aW9uIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9QZXJtaXNzaW9uc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9QZXJtaXNzaW9uc19OYW1lIFVOSVFVRShOYW1lKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuUm9sZXMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLlJvbGVzCiAgICAoCiAgICAgICAgUm9sZUlkIGludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAogICAgICAgIE5hbWUgbnZhcmNoYXIoMjAwKSBOT1QgTlVMTCwKICAgICAgICBEZXNjcmlwdGlvbiBudmFyY2hhcig1MDApIE5VTEwsCiAgICAgICAgQ3JlYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfUm9sZXNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfUm9sZXNfTmFtZSBVTklRVUUoTmFtZSkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLlJvbGVQZXJtaXNzaW9ucycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuUm9sZVBlcm1pc3Npb25zCiAgICAoCiAgICAgICAgUm9sZUlkIGludCBOT1QgTlVMTCwKICAgICAgICBQZXJtaXNzaW9uSWQgaW50IE5PVCBOVUxMLAogICAgICAgIENPTlNUUkFJTlQgUEtfb21wX1JvbGVQZXJtaXNzaW9ucyBQUklNQVJZIEtFWShSb2xlSWQsIFBlcm1pc3Npb25JZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfUm9sZVBlcm1pc3Npb25zX1JvbGUgRk9SRUlHTiBLRVkoUm9sZUlkKSBSRUZFUkVOQ0VTIG9tcC5Sb2xlcyhSb2xlSWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX1JvbGVQZXJtaXNzaW9uc19QZXJtaXNzaW9uIEZPUkVJR04gS0VZKFBlcm1pc3Npb25JZCkgUkVGRVJFTkNFUyBvbXAuUGVybWlzc2lvbnMoUGVybWlzc2lvbklkKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuUm9sZVByaW5jaXBhbHMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLlJvbGVQcmluY2lwYWxzCiAgICAoCiAgICAgICAgUm9sZUlkIGludCBOT1QgTlVMTCwKICAgICAgICBQcmluY2lwYWxUeXBlIG52YXJjaGFyKDUwKSBOT1QgTlVMTCwKICAgICAgICBQcmluY2lwYWwgbnZhcmNoYXIoMjU2KSBOT1QgTlVMTCwKICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9Sb2xlUHJpbmNpcGFscyBQUklNQVJZIEtFWShSb2xlSWQsIFByaW5jaXBhbFR5cGUsIFByaW5jaXBhbCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfUm9sZVByaW5jaXBhbHNfUm9sZSBGT1JFSUdOIEtFWShSb2xlSWQpIFJFRkVSRU5DRVMgb21wLlJvbGVzKFJvbGVJZCkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLlJvbGVQcmluY2lwYWxzJywgTidVJykgSVMgTk9UIE5VTEwKQkVHSU4KICAgIC0tIFNjaGVtYSBzZXR1cCBvd25zIHN0b3JlZCBkYXRhIG1pZ3JhdGlvbnMuIFRoZSBpbml0aWFsaXplIHNjcmlwdCByZXBlYXRzCiAgICAtLSB0aGlzIHNtYWxsIGxlZ2FjeSBjbGVhbnVwIGZvciBzdGFuZGFsb25lIGluaXRpYWxpemF0aW9uIHJlcnVucy4KICAgIERFTEVURSBsZWdhY3kKICAgIEZST00gb21wLlJvbGVQcmluY2lwYWxzIGxlZ2FjeQogICAgV0hFUkUgbGVnYWN5LlByaW5jaXBhbFR5cGUgPSBOJ1VzZXInCiAgICAgIEFORCBFWElTVFMKICAgICAgKAogICAgICAgICAgU0VMRUNUIDEKICAgICAgICAgIEZST00gb21wLlJvbGVQcmluY2lwYWxzIGN1cnJlbnRQcmluY2lwYWwKICAgICAgICAgIFdIRVJFIGN1cnJlbnRQcmluY2lwYWwuUm9sZUlkID0gbGVnYWN5LlJvbGVJZAogICAgICAgICAgICBBTkQgY3VycmVudFByaW5jaXBhbC5QcmluY2lwYWxUeXBlID0gTidBRFVzZXInCiAgICAgICAgICAgIEFORCBjdXJyZW50UHJpbmNpcGFsLlByaW5jaXBhbCA9IGxlZ2FjeS5QcmluY2lwYWwKICAgICAgKTsKCiAgICBVUERBVEUgb21wLlJvbGVQcmluY2lwYWxzCiAgICBTRVQgUHJpbmNpcGFsVHlwZSA9IE4nQURVc2VyJwogICAgV0hFUkUgUHJpbmNpcGFsVHlwZSA9IE4nVXNlcic7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLlJvbGVQcmluY2lwYWxzJywgTidVJykgSVMgTk9UIE5VTEwKICAgQU5EIE5PVCBFWElTVFMKICAgKAogICAgICAgU0VMRUNUIDEKICAgICAgIEZST00gc3lzLmNoZWNrX2NvbnN0cmFpbnRzCiAgICAgICBXSEVSRSBuYW1lID0gTidDS19vbXBfUm9sZVByaW5jaXBhbHNfTm9Cb290c3RyYXBQbGFjZWhvbGRlcnMnCiAgICAgICAgIEFORCBwYXJlbnRfb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLlJvbGVQcmluY2lwYWxzJykKICAgKQpCRUdJTgogICAgLS0gRGVmZW5zZSBpbiBkZXB0aCBmb3IgZGVwbG95bWVudCBtaXN0YWtlcy4gVGhlIGJvb3RzdHJhcCBzY3JpcHRzIHNob3VsZAogICAgLS0gcmVwbGFjZSB0aGVzZSBzb3VyY2UtY29udHJvbGxlZCBwbGFjZWhvbGRlcnMgYmVmb3JlIGV4ZWN1dGlvbiwgYW5kIHRoaXMKICAgIC0tIGNvbnN0cmFpbnQgcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nIHBlcnNpc3RlZCBpZiBhbm90aGVyIHBhdGggYnlwYXNzZXMKICAgIC0tIHNjcmlwdCB2YWxpZGF0aW9uLgogICAgQUxURVIgVEFCTEUgb21wLlJvbGVQcmluY2lwYWxzIFdJVEggQ0hFQ0sKICAgIEFERCBDT05TVFJBSU5UIENLX29tcF9Sb2xlUHJpbmNpcGFsc19Ob0Jvb3RzdHJhcFBsYWNlaG9sZGVycwogICAgQ0hFQ0sKICAgICgKICAgICAgICBQcmluY2lwYWwgTk9UIElOCiAgICAgICAgKAogICAgICAgICAgICBOJ19fQk9PVFNUUkFQX1BPUlRBTF9BRE1JTl9QUklOQ0lQQUxfXycsCiAgICAgICAgICAgIE4nUkVQTEFDRV9NRVxVc2VyT3JHcm91cCcKICAgICAgICApCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5BdWRpdExvZycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuQXVkaXRMb2cKICAgICgKICAgICAgICBBdWRpdExvZ0lkIGJpZ2ludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAogICAgICAgIEFjdG9yIG52YXJjaGFyKDI1NikgTk9UIE5VTEwsCiAgICAgICAgQWN0aW9uIG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgVGFyZ2V0VHlwZSBudmFyY2hhcigxMDApIE5PVCBOVUxMLAogICAgICAgIFRhcmdldElkIG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgQmVmb3JlSnNvbiBudmFyY2hhcihtYXgpIE5VTEwsCiAgICAgICAgQWZ0ZXJKc29uIG52YXJjaGFyKG1heCkgTlVMTCwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BdWRpdExvZ19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKQogICAgKTsKRU5ECkdPCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIE9wZXJhdGlvbmFsIHRlbXBsYXRlIG1vZGVsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSUYgT0JKRUNUX0lEKE4nb21wLkluc3RhbmNlVGVtcGxhdGVzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5JbnN0YW5jZVRlbXBsYXRlcwogICAgKAogICAgICAgIEluc3RhbmNlVGVtcGxhdGVJZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCBQUklNQVJZIEtFWSwKICAgICAgICBUZW1wbGF0ZUtleSBudmFyY2hhcigxMDApIE5PVCBOVUxMLAogICAgICAgIERpc3BsYXlOYW1lIG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgRGVzY3JpcHRpb24gbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIFNvcnRPcmRlciBpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSW5zdGFuY2VUZW1wbGF0ZXNfU29ydE9yZGVyIERFRkFVTFQoMCksCiAgICAgICAgSXNFbmFibGVkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZVRlbXBsYXRlc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZVRlbXBsYXRlc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZVRlbXBsYXRlc19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9JbnN0YW5jZVRlbXBsYXRlc19UZW1wbGF0ZUtleSBVTklRVUUoVGVtcGxhdGVLZXkpCiAgICApOwpFTkQKR08KCklGIENPTF9MRU5HVEgoTidvbXAuSW5zdGFuY2VUZW1wbGF0ZXMnLCBOJ1NvcnRPcmRlcicpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5JbnN0YW5jZVRlbXBsYXRlcwogICAgICAgIEFERCBTb3J0T3JkZXIgaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0luc3RhbmNlVGVtcGxhdGVzX1NvcnRPcmRlciBERUZBVUxUKDApIFdJVEggVkFMVUVTOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5Ib3N0VGVtcGxhdGVzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5Ib3N0VGVtcGxhdGVzCiAgICAoCiAgICAgICAgSG9zdFRlbXBsYXRlSWQgaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwgUFJJTUFSWSBLRVksCiAgICAgICAgVGVtcGxhdGVLZXkgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgICAgICBEaXNwbGF5TmFtZSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIERlc2NyaXB0aW9uIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBTb3J0T3JkZXIgaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RUZW1wbGF0ZXNfU29ydE9yZGVyIERFRkFVTFQoMCksCiAgICAgICAgSXNFbmFibGVkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0VGVtcGxhdGVzX0lzRW5hYmxlZCBERUZBVUxUKDEpLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RUZW1wbGF0ZXNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdFRlbXBsYXRlc19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9Ib3N0VGVtcGxhdGVzX1RlbXBsYXRlS2V5IFVOSVFVRShUZW1wbGF0ZUtleSkKICAgICk7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5Ib3N0VGVtcGxhdGVzJywgTidTb3J0T3JkZXInKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuSG9zdFRlbXBsYXRlcwogICAgICAgIEFERCBTb3J0T3JkZXIgaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RUZW1wbGF0ZXNfU29ydE9yZGVyIERFRkFVTFQoMCkgV0lUSCBWQUxVRVM7CkVORApHTwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBTdHJ1Y3R1cmFsIG1vZGVsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSUYgT0JKRUNUX0lEKE4nb21wLkluc3RhbmNlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuSW5zdGFuY2VzCiAgICAoCiAgICAgICAgSW5zdGFuY2VJZCB1bmlxdWVpZGVudGlmaWVyIE5PVCBOVUxMIENPTlNUUkFJTlQgUEtfb21wX0luc3RhbmNlcyBQUklNQVJZIEtFWSwKICAgICAgICBJbnN0YW5jZUtleSBudmFyY2hhcigxMDApIE5PVCBOVUxMLAogICAgICAgIERpc3BsYXlOYW1lIG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgRGVzY3JpcHRpb24gbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIEluc3RhbmNlVGVtcGxhdGVJZCBpbnQgTlVMTCwKICAgICAgICBJc0VuYWJsZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0luc3RhbmNlc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZXNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSW5zdGFuY2VzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgVVFfb21wX0luc3RhbmNlc19JbnN0YW5jZUtleSBVTklRVUUoSW5zdGFuY2VLZXkpCiAgICApOwpFTkQKR08KCklGIE5PVCBFWElTVFMgKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmZvcmVpZ25fa2V5cwogICAgV0hFUkUgbmFtZSA9IE4nRktfb21wX0luc3RhbmNlc19JbnN0YW5jZVRlbXBsYXRlJwopCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuSW5zdGFuY2VzCiAgICBBREQgQ09OU1RSQUlOVCBGS19vbXBfSW5zdGFuY2VzX0luc3RhbmNlVGVtcGxhdGUKICAgICAgICBGT1JFSUdOIEtFWShJbnN0YW5jZVRlbXBsYXRlSWQpIFJFRkVSRU5DRVMgb21wLkluc3RhbmNlVGVtcGxhdGVzKEluc3RhbmNlVGVtcGxhdGVJZCk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLk1vZHVsZXMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLk1vZHVsZXMKICAgICgKICAgICAgICBNb2R1bGVJZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCBQUklNQVJZIEtFWSwKICAgICAgICBNb2R1bGVLZXkgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgICAgICBEaXNwbGF5TmFtZSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIE1vZHVsZVR5cGUgbnZhcmNoYXIoNTApIE5PVCBOVUxMLAogICAgICAgIFNjaGVtYU5hbWUgbnZhcmNoYXIoMTI4KSBOT1QgTlVMTCwKICAgICAgICBEZXNjcmlwdGlvbiBudmFyY2hhcig1MDApIE5VTEwsCiAgICAgICAgSXNFbmFibGVkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Nb2R1bGVzX0lzRW5hYmxlZCBERUZBVUxUKDEpLAogICAgICAgIFNvcnRPcmRlciBpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfTW9kdWxlc19Tb3J0T3JkZXIgREVGQVVMVCgwKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Nb2R1bGVzX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX01vZHVsZXNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfTW9kdWxlc19Nb2R1bGVLZXkgVU5JUVVFKE1vZHVsZUtleSkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLk1vZHVsZUluc3RhbmNlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuTW9kdWxlSW5zdGFuY2VzCiAgICAoCiAgICAgICAgTW9kdWxlSW5zdGFuY2VJZCB1bmlxdWVpZGVudGlmaWVyIE5PVCBOVUxMIENPTlNUUkFJTlQgUEtfb21wX01vZHVsZUluc3RhbmNlcyBQUklNQVJZIEtFWSwKICAgICAgICBJbnN0YW5jZUlkIHVuaXF1ZWlkZW50aWZpZXIgTk9UIE5VTEwsCiAgICAgICAgTW9kdWxlSWQgaW50IE5PVCBOVUxMLAogICAgICAgIE1vZHVsZUluc3RhbmNlS2V5IG52YXJjaGFyKDEwMCkgTk9UIE5VTEwsCiAgICAgICAgRGlzcGxheU5hbWUgbnZhcmNoYXIoMjAwKSBOT1QgTlVMTCwKICAgICAgICBEZXNjcmlwdGlvbiBudmFyY2hhcig1MDApIE5VTEwsCiAgICAgICAgSXNFbmFibGVkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Nb2R1bGVJbnN0YW5jZXNfSXNFbmFibGVkIERFRkFVTFQoMSksCiAgICAgICAgU29ydE9yZGVyIGludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Nb2R1bGVJbnN0YW5jZXNfU29ydE9yZGVyIERFRkFVTFQoMCksCiAgICAgICAgQ3JlYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfTW9kdWxlSW5zdGFuY2VzX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX01vZHVsZUluc3RhbmNlc19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9Nb2R1bGVJbnN0YW5jZXNfSW5zdGFuY2UgRk9SRUlHTiBLRVkoSW5zdGFuY2VJZCkgUkVGRVJFTkNFUyBvbXAuSW5zdGFuY2VzKEluc3RhbmNlSWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX01vZHVsZUluc3RhbmNlc19Nb2R1bGUgRk9SRUlHTiBLRVkoTW9kdWxlSWQpIFJFRkVSRU5DRVMgb21wLk1vZHVsZXMoTW9kdWxlSWQpLAogICAgICAgIENPTlNUUkFJTlQgVVFfb21wX01vZHVsZUluc3RhbmNlc19JbnN0YW5jZV9Nb2R1bGVJbnN0YW5jZUtleSBVTklRVUUoSW5zdGFuY2VJZCwgTW9kdWxlSW5zdGFuY2VLZXkpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5BcHBzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5BcHBzCiAgICAoCiAgICAgICAgQXBwSWQgaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwgUFJJTUFSWSBLRVksCiAgICAgICAgTW9kdWxlSWQgaW50IE5PVCBOVUxMLAogICAgICAgIEFwcEtleSBudmFyY2hhcigxMDApIE5PVCBOVUxMLAogICAgICAgIERpc3BsYXlOYW1lIG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgQXBwVHlwZSBudmFyY2hhcig1MCkgTk9UIE5VTEwsCiAgICAgICAgQWxsb3dNdWx0aXBsZUFjdGl2ZUluc3RhbmNlcyBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfQXBwc19BbGxvd011bHRpcGxlQWN0aXZlSW5zdGFuY2VzIERFRkFVTFQoMCksCiAgICAgICAgRGVzY3JpcHRpb24gbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIElzRW5hYmxlZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfQXBwc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBTb3J0T3JkZXIgaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FwcHNfU29ydE9yZGVyIERFRkFVTFQoMCksCiAgICAgICAgQ3JlYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfQXBwc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcHBzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0FwcHNfTW9kdWxlIEZPUkVJR04gS0VZKE1vZHVsZUlkKSBSRUZFUkVOQ0VTIG9tcC5Nb2R1bGVzKE1vZHVsZUlkKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9BcHBzX01vZHVsZV9BcHBLZXkgVU5JUVVFKE1vZHVsZUlkLCBBcHBLZXkpCiAgICApOwpFTkQKR08KCklGIENPTF9MRU5HVEgoTidvbXAuQXBwcycsIE4nQWxsb3dNdWx0aXBsZUFjdGl2ZUluc3RhbmNlcycpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5BcHBzCiAgICAgICAgQUREIEFsbG93TXVsdGlwbGVBY3RpdmVJbnN0YW5jZXMgYml0IE5PVCBOVUxMCiAgICAgICAgICAgIENPTlNUUkFJTlQgREZfb21wX0FwcHNfQWxsb3dNdWx0aXBsZUFjdGl2ZUluc3RhbmNlcyBERUZBVUxUKDApIFdJVEggVkFMVUVTOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5BcHBQZXJtaXNzaW9ucycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuQXBwUGVybWlzc2lvbnMKICAgICgKICAgICAgICBBcHBJZCBpbnQgTk9UIE5VTEwsCiAgICAgICAgUGVybWlzc2lvbklkIGludCBOT1QgTlVMTCwKICAgICAgICBSZXF1aXJlQWxsIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcHBQZXJtaXNzaW9uc19SZXF1aXJlQWxsIERFRkFVTFQoMCksCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfQXBwUGVybWlzc2lvbnMgUFJJTUFSWSBLRVkoQXBwSWQsIFBlcm1pc3Npb25JZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfQXBwUGVybWlzc2lvbnNfQXBwIEZPUkVJR04gS0VZKEFwcElkKSBSRUZFUkVOQ0VTIG9tcC5BcHBzKEFwcElkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9BcHBQZXJtaXNzaW9uc19QZXJtaXNzaW9uIEZPUkVJR04gS0VZKFBlcm1pc3Npb25JZCkgUkVGRVJFTkNFUyBvbXAuUGVybWlzc2lvbnMoUGVybWlzc2lvbklkKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuTW9kdWxlRGVmaW5pdGlvbkRvY3VtZW50cycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuTW9kdWxlRGVmaW5pdGlvbkRvY3VtZW50cwogICAgKAogICAgICAgIE1vZHVsZURlZmluaXRpb25Eb2N1bWVudElkIGludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMCiAgICAgICAgICAgIENPTlNUUkFJTlQgUEtfb21wX01vZHVsZURlZmluaXRpb25Eb2N1bWVudHMgUFJJTUFSWSBLRVksCiAgICAgICAgTW9kdWxlS2V5IG52YXJjaGFyKDEwMCkgTk9UIE5VTEwsCiAgICAgICAgRGVmaW5pdGlvblZlcnNpb24gbnZhcmNoYXIoNTApIE5PVCBOVUxMLAogICAgICAgIEZvcm1hdFZlcnNpb24gaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX01vZHVsZURlZmluaXRpb25Eb2N1bWVudHNfRm9ybWF0VmVyc2lvbiBERUZBVUxUKDEpLAogICAgICAgIERlZmluaXRpb25Kc29uIG52YXJjaGFyKG1heCkgTk9UIE5VTEwsCiAgICAgICAgRGVmaW5pdGlvblNoYTI1NiBudmFyY2hhcigxMjgpIE5PVCBOVUxMLAogICAgICAgIFNvdXJjZU5hbWUgbnZhcmNoYXIoNDAwKSBOVUxMLAogICAgICAgIElzQXBwbGllZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfTW9kdWxlRGVmaW5pdGlvbkRvY3VtZW50c19Jc0FwcGxpZWQgREVGQVVMVCgwKSwKICAgICAgICBBcHBsaWVkVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX01vZHVsZURlZmluaXRpb25Eb2N1bWVudHNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfTW9kdWxlRGVmaW5pdGlvbkRvY3VtZW50c19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9Nb2R1bGVEZWZpbml0aW9uRG9jdW1lbnRzX01vZHVsZV9WZXJzaW9uIFVOSVFVRShNb2R1bGVLZXksIERlZmluaXRpb25WZXJzaW9uKSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9Nb2R1bGVEZWZpbml0aW9uRG9jdW1lbnRzX0RlZmluaXRpb25Kc29uIENIRUNLKElTSlNPTihEZWZpbml0aW9uSnNvbikgPSAxKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuTW9kdWxlRGVmaW5pdGlvbkFydGlmYWN0Q29tcGF0aWJpbGl0eScsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuTW9kdWxlRGVmaW5pdGlvbkFydGlmYWN0Q29tcGF0aWJpbGl0eQogICAgKAogICAgICAgIE1vZHVsZURlZmluaXRpb25BcnRpZmFjdENvbXBhdGliaWxpdHlJZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTAogICAgICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9Nb2R1bGVEZWZpbml0aW9uQXJ0aWZhY3RDb21wYXRpYmlsaXR5IFBSSU1BUlkgS0VZLAogICAgICAgIE1vZHVsZURlZmluaXRpb25Eb2N1bWVudElkIGludCBOT1QgTlVMTCwKICAgICAgICBBcHBLZXkgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgICAgICBQYWNrYWdlVHlwZSBudmFyY2hhcig1MCkgTk9UIE5VTEwsCiAgICAgICAgVGFyZ2V0TmFtZSBudmFyY2hhcigxMDApIE5VTEwsCiAgICAgICAgUmVsYXRpdmVQYXRoVGVtcGxhdGUgbnZhcmNoYXIoNDAwKSBOVUxMLAogICAgICAgIE1pbkFydGlmYWN0VmVyc2lvbiBudmFyY2hhcig1MCkgTlVMTCwKICAgICAgICBNYXhBcnRpZmFjdFZlcnNpb24gbnZhcmNoYXIoNTApIE5VTEwsCiAgICAgICAgQ3JlYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfTW9kdWxlRGVmaW5pdGlvbkFydGlmYWN0Q29tcGF0aWJpbGl0eV9DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9Nb2R1bGVEZWZpbml0aW9uQXJ0aWZhY3RDb21wYXRpYmlsaXR5X0RvY3VtZW50CiAgICAgICAgICAgIEZPUkVJR04gS0VZKE1vZHVsZURlZmluaXRpb25Eb2N1bWVudElkKQogICAgICAgICAgICBSRUZFUkVOQ0VTIG9tcC5Nb2R1bGVEZWZpbml0aW9uRG9jdW1lbnRzKE1vZHVsZURlZmluaXRpb25Eb2N1bWVudElkKQogICAgICAgICAgICBPTiBERUxFVEUgQ0FTQ0FERSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9Nb2R1bGVEZWZpbml0aW9uQXJ0aWZhY3RDb21wYXRpYmlsaXR5X1RhcmdldAogICAgICAgICAgICBVTklRVUUoTW9kdWxlRGVmaW5pdGlvbkRvY3VtZW50SWQsIEFwcEtleSwgUGFja2FnZVR5cGUsIFRhcmdldE5hbWUpCiAgICApOwpFTkQKR08KCklGIENPTF9MRU5HVEgoTidvbXAuTW9kdWxlRGVmaW5pdGlvbkFydGlmYWN0Q29tcGF0aWJpbGl0eScsIE4nUmVsYXRpdmVQYXRoVGVtcGxhdGUnKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuTW9kdWxlRGVmaW5pdGlvbkFydGlmYWN0Q29tcGF0aWJpbGl0eQogICAgICAgIEFERCBSZWxhdGl2ZVBhdGhUZW1wbGF0ZSBudmFyY2hhcig0MDApIE5VTEw7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLk1vZHVsZURlZmluaXRpb25TcWxFeGVjdXRpb25zJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5Nb2R1bGVEZWZpbml0aW9uU3FsRXhlY3V0aW9ucwogICAgKAogICAgICAgIE1vZHVsZURlZmluaXRpb25TcWxFeGVjdXRpb25JZCBiaWdpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTAogICAgICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9Nb2R1bGVEZWZpbml0aW9uU3FsRXhlY3V0aW9ucyBQUklNQVJZIEtFWSwKICAgICAgICBNb2R1bGVEZWZpbml0aW9uRG9jdW1lbnRJZCBpbnQgTk9UIE5VTEwsCiAgICAgICAgU2NyaXB0S2V5IG52YXJjaGFyKDEwMCkgTk9UIE5VTEwsCiAgICAgICAgU2NyaXB0UGhhc2UgbnZhcmNoYXIoNTApIE5PVCBOVUxMLAogICAgICAgIFNjcmlwdE9yZGVyIGludCBOT1QgTlVMTCwKICAgICAgICBTY3JpcHRTaGEyNTYgbnZhcmNoYXIoMTI4KSBOT1QgTlVMTCwKICAgICAgICBFeGVjdXRpb25TdGF0dXMgbnZhcmNoYXIoMzApIE5PVCBOVUxMLAogICAgICAgIFN0YXJ0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX01vZHVsZURlZmluaXRpb25TcWxFeGVjdXRpb25zX1N0YXJ0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENvbXBsZXRlZFV0YyBkYXRldGltZTIoMykgTlVMTCwKICAgICAgICBFcnJvck1lc3NhZ2UgbnZhcmNoYXIobWF4KSBOVUxMLAogICAgICAgIEV4ZWN1dGVkQnkgbnZhcmNoYXIoMjU2KSBOVUxMIENPTlNUUkFJTlQgREZfb21wX01vZHVsZURlZmluaXRpb25TcWxFeGVjdXRpb25zX0V4ZWN1dGVkQnkgREVGQVVMVCBTVVNFUl9TTkFNRSgpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX01vZHVsZURlZmluaXRpb25TcWxFeGVjdXRpb25zX0RvY3VtZW50CiAgICAgICAgICAgIEZPUkVJR04gS0VZKE1vZHVsZURlZmluaXRpb25Eb2N1bWVudElkKQogICAgICAgICAgICBSRUZFUkVOQ0VTIG9tcC5Nb2R1bGVEZWZpbml0aW9uRG9jdW1lbnRzKE1vZHVsZURlZmluaXRpb25Eb2N1bWVudElkKQogICAgICAgICAgICBPTiBERUxFVEUgQ0FTQ0FERSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9Nb2R1bGVEZWZpbml0aW9uU3FsRXhlY3V0aW9uc19TdGF0dXMKICAgICAgICAgICAgQ0hFQ0soRXhlY3V0aW9uU3RhdHVzIElOIChOJ1J1bm5pbmcnLCBOJ1N1Y2NlZWRlZCcsIE4nRmFpbGVkJykpCiAgICApOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5Nb2R1bGVEZWZpbml0aW9uU3FsRXhlY3V0aW9ucycpCiAgICAgIEFORCBuYW1lID0gTidJWF9vbXBfTW9kdWxlRGVmaW5pdGlvblNxbEV4ZWN1dGlvbnNfTGF0ZXN0JwopCkJFR0lOCiAgICBDUkVBVEUgSU5ERVggSVhfb21wX01vZHVsZURlZmluaXRpb25TcWxFeGVjdXRpb25zX0xhdGVzdAogICAgICAgIE9OIG9tcC5Nb2R1bGVEZWZpbml0aW9uU3FsRXhlY3V0aW9ucyhNb2R1bGVEZWZpbml0aW9uRG9jdW1lbnRJZCwgU2NyaXB0S2V5LCBTY3JpcHRTaGEyNTYsIFN0YXJ0ZWRVdGMgREVTQykKICAgICAgICBJTkNMVURFKEV4ZWN1dGlvblN0YXR1cywgQ29tcGxldGVkVXRjKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuQXJ0aWZhY3RzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5BcnRpZmFjdHMKICAgICgKICAgICAgICBBcnRpZmFjdElkIGludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAogICAgICAgIEFwcElkIGludCBOT1QgTlVMTCwKICAgICAgICBWZXJzaW9uIG52YXJjaGFyKDUwKSBOT1QgTlVMTCwKICAgICAgICBQYWNrYWdlVHlwZSBudmFyY2hhcig1MCkgTk9UIE5VTEwsCiAgICAgICAgVGFyZ2V0TmFtZSBudmFyY2hhcigxMDApIE5VTEwsCiAgICAgICAgUmVsYXRpdmVQYXRoIG52YXJjaGFyKDQwMCkgTlVMTCwKICAgICAgICBTaGEyNTYgbnZhcmNoYXIoMTI4KSBOVUxMLAogICAgICAgIElzRW5hYmxlZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfQXJ0aWZhY3RzX0lzRW5hYmxlZCBERUZBVUxUKDEpLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FydGlmYWN0c19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcnRpZmFjdHNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfQXJ0aWZhY3RzX0FwcCBGT1JFSUdOIEtFWShBcHBJZCkgUkVGRVJFTkNFUyBvbXAuQXBwcyhBcHBJZCkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLkFydGlmYWN0Q29uZmlndXJhdGlvbkZpbGVzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5BcnRpZmFjdENvbmZpZ3VyYXRpb25GaWxlcwogICAgKAogICAgICAgIEFydGlmYWN0Q29uZmlndXJhdGlvbkZpbGVJZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTAogICAgICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9BcnRpZmFjdENvbmZpZ3VyYXRpb25GaWxlcyBQUklNQVJZIEtFWSwKICAgICAgICBBcnRpZmFjdElkIGludCBOT1QgTlVMTCwKICAgICAgICBSZWxhdGl2ZVBhdGggbnZhcmNoYXIoNDAwKSBOT1QgTlVMTCwKICAgICAgICBGaWxlQ29udGVudCBudmFyY2hhcihtYXgpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FydGlmYWN0Q29uZmlndXJhdGlvbkZpbGVzX0ZpbGVDb250ZW50IERFRkFVTFQoTicnKSwKICAgICAgICBJc0VuYWJsZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FydGlmYWN0Q29uZmlndXJhdGlvbkZpbGVzX0lzRW5hYmxlZCBERUZBVUxUKDEpLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FydGlmYWN0Q29uZmlndXJhdGlvbkZpbGVzX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FydGlmYWN0Q29uZmlndXJhdGlvbkZpbGVzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0FydGlmYWN0Q29uZmlndXJhdGlvbkZpbGVzX0FydGlmYWN0CiAgICAgICAgICAgIEZPUkVJR04gS0VZKEFydGlmYWN0SWQpIFJFRkVSRU5DRVMgb21wLkFydGlmYWN0cyhBcnRpZmFjdElkKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9BcnRpZmFjdENvbmZpZ3VyYXRpb25GaWxlc19BcnRpZmFjdF9QYXRoCiAgICAgICAgICAgIFVOSVFVRShBcnRpZmFjdElkLCBSZWxhdGl2ZVBhdGgpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5Ib3N0Q29uZmlndXJhdGlvbkRvY3VtZW50cycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuSG9zdENvbmZpZ3VyYXRpb25Eb2N1bWVudHMKICAgICgKICAgICAgICBIb3N0Q29uZmlndXJhdGlvbkRvY3VtZW50SWQgaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwKICAgICAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfSG9zdENvbmZpZ3VyYXRpb25Eb2N1bWVudHMgUFJJTUFSWSBLRVksCiAgICAgICAgSG9zdEtleSBudmFyY2hhcigxMjgpIE5PVCBOVUxMLAogICAgICAgIENvbmZpZ3VyYXRpb25WZXJzaW9uIG52YXJjaGFyKDUwKSBOT1QgTlVMTCwKICAgICAgICBGb3JtYXRWZXJzaW9uIGludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0Q29uZmlndXJhdGlvbkRvY3VtZW50c19Gb3JtYXRWZXJzaW9uIERFRkFVTFQoMSksCiAgICAgICAgQ29uZmlndXJhdGlvbkpzb24gbnZhcmNoYXIobWF4KSBOT1QgTlVMTCwKICAgICAgICBDb25maWd1cmF0aW9uU2hhMjU2IG52YXJjaGFyKDEyOCkgTk9UIE5VTEwsCiAgICAgICAgRGlzcGxheU5hbWUgbnZhcmNoYXIoMjAwKSBOVUxMLAogICAgICAgIERlc2NyaXB0aW9uIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBTb3VyY2VOYW1lIG52YXJjaGFyKDQwMCkgTlVMTCwKICAgICAgICBJc0FjdGl2ZSBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdENvbmZpZ3VyYXRpb25Eb2N1bWVudHNfSXNBY3RpdmUgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0Q29uZmlndXJhdGlvbkRvY3VtZW50c19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0Q29uZmlndXJhdGlvbkRvY3VtZW50c19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9Ib3N0Q29uZmlndXJhdGlvbkRvY3VtZW50c19Ib3N0X1ZlcnNpb24KICAgICAgICAgICAgVU5JUVVFKEhvc3RLZXksIENvbmZpZ3VyYXRpb25WZXJzaW9uKSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9Ib3N0Q29uZmlndXJhdGlvbkRvY3VtZW50c19Kc29uCiAgICAgICAgICAgIENIRUNLKElTSlNPTihDb25maWd1cmF0aW9uSnNvbikgPSAxKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuQ29uZmlnT3ZlcmxheURvY3VtZW50cycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuQ29uZmlnT3ZlcmxheURvY3VtZW50cwogICAgKAogICAgICAgIENvbmZpZ092ZXJsYXlEb2N1bWVudElkIGludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMCiAgICAgICAgICAgIENPTlNUUkFJTlQgUEtfb21wX0NvbmZpZ092ZXJsYXlEb2N1bWVudHMgUFJJTUFSWSBLRVksCiAgICAgICAgT3ZlcmxheUtleSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIE92ZXJsYXlWZXJzaW9uIG52YXJjaGFyKDUwKSBOT1QgTlVMTCwKICAgICAgICBIb3N0S2V5IG52YXJjaGFyKDEyOCkgTk9UIE5VTEwsCiAgICAgICAgTW9kdWxlS2V5IG52YXJjaGFyKDEwMCkgTlVMTCwKICAgICAgICBNb2R1bGVEZWZpbml0aW9uVmVyc2lvbiBudmFyY2hhcig1MCkgTlVMTCwKICAgICAgICBBcHBLZXkgbnZhcmNoYXIoMTAwKSBOVUxMLAogICAgICAgIFBhY2thZ2VUeXBlIG52YXJjaGFyKDUwKSBOVUxMLAogICAgICAgIFRhcmdldE5hbWUgbnZhcmNoYXIoMTAwKSBOVUxMLAogICAgICAgIEFydGlmYWN0VmVyc2lvbiBudmFyY2hhcig1MCkgTlVMTCwKICAgICAgICBGb3JtYXRWZXJzaW9uIGludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Db25maWdPdmVybGF5RG9jdW1lbnRzX0Zvcm1hdFZlcnNpb24gREVGQVVMVCgxKSwKICAgICAgICBPdmVybGF5SnNvbiBudmFyY2hhcihtYXgpIE5PVCBOVUxMLAogICAgICAgIE92ZXJsYXlTaGEyNTYgbnZhcmNoYXIoMTI4KSBOT1QgTlVMTCwKICAgICAgICBTb3VyY2VOYW1lIG52YXJjaGFyKDQwMCkgTlVMTCwKICAgICAgICBJc0VuYWJsZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0NvbmZpZ092ZXJsYXlEb2N1bWVudHNfSXNFbmFibGVkIERFRkFVTFQoMSksCiAgICAgICAgQ3JlYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfQ29uZmlnT3ZlcmxheURvY3VtZW50c19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Db25maWdPdmVybGF5RG9jdW1lbnRzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgVVFfb21wX0NvbmZpZ092ZXJsYXlEb2N1bWVudHNfS2V5X0hvc3RfVmVyc2lvbgogICAgICAgICAgICBVTklRVUUoT3ZlcmxheUtleSwgSG9zdEtleSwgT3ZlcmxheVZlcnNpb24pLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX0NvbmZpZ092ZXJsYXlEb2N1bWVudHNfSnNvbgogICAgICAgICAgICBDSEVDSyhJU0pTT04oT3ZlcmxheUpzb24pID0gMSkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLkNvbmZpZ092ZXJsYXlDb25maWd1cmF0aW9uRmlsZXMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLkNvbmZpZ092ZXJsYXlDb25maWd1cmF0aW9uRmlsZXMKICAgICgKICAgICAgICBDb25maWdPdmVybGF5Q29uZmlndXJhdGlvbkZpbGVJZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTAogICAgICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9Db25maWdPdmVybGF5Q29uZmlndXJhdGlvbkZpbGVzIFBSSU1BUlkgS0VZLAogICAgICAgIENvbmZpZ092ZXJsYXlEb2N1bWVudElkIGludCBOT1QgTlVMTCwKICAgICAgICBSZWxhdGl2ZVBhdGggbnZhcmNoYXIoNDAwKSBOT1QgTlVMTCwKICAgICAgICBGaWxlQ29udGVudCBudmFyY2hhcihtYXgpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0NvbmZpZ092ZXJsYXlDb25maWd1cmF0aW9uRmlsZXNfRmlsZUNvbnRlbnQgREVGQVVMVChOJycpLAogICAgICAgIElzRW5hYmxlZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfQ29uZmlnT3ZlcmxheUNvbmZpZ3VyYXRpb25GaWxlc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Db25maWdPdmVybGF5Q29uZmlndXJhdGlvbkZpbGVzX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0NvbmZpZ092ZXJsYXlDb25maWd1cmF0aW9uRmlsZXNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfQ29uZmlnT3ZlcmxheUNvbmZpZ3VyYXRpb25GaWxlc19Eb2N1bWVudAogICAgICAgICAgICBGT1JFSUdOIEtFWShDb25maWdPdmVybGF5RG9jdW1lbnRJZCkKICAgICAgICAgICAgUkVGRVJFTkNFUyBvbXAuQ29uZmlnT3ZlcmxheURvY3VtZW50cyhDb25maWdPdmVybGF5RG9jdW1lbnRJZCkKICAgICAgICAgICAgT04gREVMRVRFIENBU0NBREUsCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfQ29uZmlnT3ZlcmxheUNvbmZpZ3VyYXRpb25GaWxlc19Eb2N1bWVudF9QYXRoCiAgICAgICAgICAgIFVOSVFVRShDb25maWdPdmVybGF5RG9jdW1lbnRJZCwgUmVsYXRpdmVQYXRoKQogICAgKTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuQ29uZmlnT3ZlcmxheURvY3VtZW50cycpCiAgICAgIEFORCBuYW1lID0gTidJWF9vbXBfQ29uZmlnT3ZlcmxheURvY3VtZW50c19NYXRjaCcKKQpCRUdJTgogICAgQ1JFQVRFIElOREVYIElYX29tcF9Db25maWdPdmVybGF5RG9jdW1lbnRzX01hdGNoCiAgICAgICAgT04gb21wLkNvbmZpZ092ZXJsYXlEb2N1bWVudHMoSG9zdEtleSwgTW9kdWxlS2V5LCBBcHBLZXksIFBhY2thZ2VUeXBlLCBUYXJnZXROYW1lLCBBcnRpZmFjdFZlcnNpb24sIElzRW5hYmxlZCkKICAgICAgICBJTkNMVURFKE92ZXJsYXlWZXJzaW9uLCBNb2R1bGVEZWZpbml0aW9uVmVyc2lvbiwgVXBkYXRlZFV0Yyk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLkhvc3RzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5Ib3N0cwogICAgKAogICAgICAgIEhvc3RJZCB1bmlxdWVpZGVudGlmaWVyIE5PVCBOVUxMIENPTlNUUkFJTlQgUEtfb21wX0hvc3RzIFBSSU1BUlkgS0VZLAogICAgICAgIEluc3RhbmNlSWQgdW5pcXVlaWRlbnRpZmllciBOT1QgTlVMTCwKICAgICAgICBIb3N0S2V5IG52YXJjaGFyKDEyOCkgTk9UIE5VTEwsCiAgICAgICAgRGlzcGxheU5hbWUgbnZhcmNoYXIoMjAwKSBOVUxMLAogICAgICAgIEJhc2VVcmwgbnZhcmNoYXIoMzAwKSBOVUxMLAogICAgICAgIEVudmlyb25tZW50IG52YXJjaGFyKDEwMCkgTlVMTCwKICAgICAgICBPc0ZhbWlseSBudmFyY2hhcig1MCkgTlVMTCwKICAgICAgICBPc1ZlcnNpb24gbnZhcmNoYXIoMTAwKSBOVUxMLAogICAgICAgIEFyY2hpdGVjdHVyZSBudmFyY2hhcig1MCkgTlVMTCwKICAgICAgICBJc0VuYWJsZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RzX0lzRW5hYmxlZCBERUZBVUxUKDEpLAogICAgICAgIExhc3RTZWVuVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RzX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0hvc3RzX0luc3RhbmNlIEZPUkVJR04gS0VZKEluc3RhbmNlSWQpIFJFRkVSRU5DRVMgb21wLkluc3RhbmNlcyhJbnN0YW5jZUlkKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9Ib3N0c19JbnN0YW5jZV9Ib3N0S2V5IFVOSVFVRShJbnN0YW5jZUlkLCBIb3N0S2V5KQogICAgKTsKRU5ECkdPCgoKSUYgT0JKRUNUX0lEKE4nb21wLkFwcEluc3RhbmNlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuQXBwSW5zdGFuY2VzCiAgICAoCiAgICAgICAgQXBwSW5zdGFuY2VJZCB1bmlxdWVpZGVudGlmaWVyIE5PVCBOVUxMIENPTlNUUkFJTlQgUEtfb21wX0FwcEluc3RhbmNlcyBQUklNQVJZIEtFWSwKICAgICAgICBNb2R1bGVJbnN0YW5jZUlkIHVuaXF1ZWlkZW50aWZpZXIgTk9UIE5VTEwsCiAgICAgICAgSG9zdElkIHVuaXF1ZWlkZW50aWZpZXIgTlVMTCwKICAgICAgICBUYXJnZXRIb3N0VGVtcGxhdGVJZCBpbnQgTlVMTCwKICAgICAgICBBcHBJZCBpbnQgTk9UIE5VTEwsCiAgICAgICAgQXBwSW5zdGFuY2VLZXkgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgICAgICBEaXNwbGF5TmFtZSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIERlc2NyaXB0aW9uIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBSb3V0ZVBhdGggbnZhcmNoYXIoMjU2KSBOVUxMLAogICAgICAgIFB1YmxpY1VybCBudmFyY2hhcig1MDApIE5VTEwsCiAgICAgICAgSW5zdGFsbFBhdGggbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIEluc3RhbGxhdGlvbk5hbWUgbnZhcmNoYXIoMTUwKSBOVUxMLAogICAgICAgIEFydGlmYWN0SWQgaW50IE5VTEwsCiAgICAgICAgQ29uZmlnSWQgaW50IE5VTEwsCiAgICAgICAgRXhwZWN0ZWRMb2dpbiBudmFyY2hhcigyNTYpIE5VTEwsCiAgICAgICAgRXhwZWN0ZWRDbGllbnRIb3N0TmFtZSBudmFyY2hhcigxMjgpIE5VTEwsCiAgICAgICAgRXhwZWN0ZWRDbGllbnRJcCBudmFyY2hhcig2NCkgTlVMTCwKICAgICAgICBJc0VuYWJsZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FwcEluc3RhbmNlc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBJc0FsbG93ZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FwcEluc3RhbmNlc19Jc0FsbG93ZWQgREVGQVVMVCgxKSwKICAgICAgICBEZXNpcmVkU3RhdGUgdGlueWludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcHBJbnN0YW5jZXNfRGVzaXJlZFN0YXRlIERFRkFVTFQoMSksCiAgICAgICAgVmVyaWZpY2F0aW9uU3RhdHVzIHRpbnlpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfQXBwSW5zdGFuY2VzX1ZlcmlmaWNhdGlvblN0YXR1cyBERUZBVUxUKDApLAogICAgICAgIExhc3RTZWVuVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RMb2dpbiBudmFyY2hhcigyNTYpIE5VTEwsCiAgICAgICAgTGFzdENsaWVudEhvc3ROYW1lIG52YXJjaGFyKDEyOCkgTlVMTCwKICAgICAgICBMYXN0Q2xpZW50SXAgbnZhcmNoYXIoNjQpIE5VTEwsCiAgICAgICAgTGFzdFZlcmlmaWVkVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIFNvcnRPcmRlciBpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfQXBwSW5zdGFuY2VzX1NvcnRPcmRlciBERUZBVUxUKDApLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FwcEluc3RhbmNlc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcHBJbnN0YW5jZXNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfQXBwSW5zdGFuY2VzX01vZHVsZUluc3RhbmNlIEZPUkVJR04gS0VZKE1vZHVsZUluc3RhbmNlSWQpIFJFRkVSRU5DRVMgb21wLk1vZHVsZUluc3RhbmNlcyhNb2R1bGVJbnN0YW5jZUlkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9BcHBJbnN0YW5jZXNfSG9zdCBGT1JFSUdOIEtFWShIb3N0SWQpIFJFRkVSRU5DRVMgb21wLkhvc3RzKEhvc3RJZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfQXBwSW5zdGFuY2VzX0FwcCBGT1JFSUdOIEtFWShBcHBJZCkgUkVGRVJFTkNFUyBvbXAuQXBwcyhBcHBJZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfQXBwSW5zdGFuY2VzX0FydGlmYWN0IEZPUkVJR04gS0VZKEFydGlmYWN0SWQpIFJFRkVSRU5DRVMgb21wLkFydGlmYWN0cyhBcnRpZmFjdElkKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9BcHBJbnN0YW5jZXNfTW9kdWxlSW5zdGFuY2VfQXBwSW5zdGFuY2VLZXkgVU5JUVVFKE1vZHVsZUluc3RhbmNlSWQsIEFwcEluc3RhbmNlS2V5KQogICAgKTsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLkFwcEluc3RhbmNlcycsIE4nVGFyZ2V0SG9zdFRlbXBsYXRlSWQnKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuQXBwSW5zdGFuY2VzCiAgICAgICAgQUREIFRhcmdldEhvc3RUZW1wbGF0ZUlkIGludCBOVUxMOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5BcHBXb3JrZXJEZWZpbml0aW9ucycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuQXBwV29ya2VyRGVmaW5pdGlvbnMKICAgICgKICAgICAgICBBcHBJZCBpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBQS19vbXBfQXBwV29ya2VyRGVmaW5pdGlvbnMgUFJJTUFSWSBLRVksCiAgICAgICAgUnVudGltZUtpbmQgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgICAgICBXb3JrZXJUeXBlS2V5IG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgUGx1Z2luUmVsYXRpdmVQYXRoIG52YXJjaGFyKDQwMCkgTk9UIE5VTEwsCiAgICAgICAgSXNFbmFibGVkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcHBXb3JrZXJEZWZpbml0aW9uc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcHBXb3JrZXJEZWZpbml0aW9uc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcHBXb3JrZXJEZWZpbml0aW9uc19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9BcHBXb3JrZXJEZWZpbml0aW9uc19BcHAgRk9SRUlHTiBLRVkoQXBwSWQpIFJFRkVSRU5DRVMgb21wLkFwcHMoQXBwSWQpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5BcHBJbnN0YW5jZVJ1bnRpbWVTdGF0ZXMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLkFwcEluc3RhbmNlUnVudGltZVN0YXRlcwogICAgKAogICAgICAgIEFwcEluc3RhbmNlSWQgdW5pcXVlaWRlbnRpZmllciBOT1QgTlVMTCBDT05TVFJBSU5UIFBLX29tcF9BcHBJbnN0YW5jZVJ1bnRpbWVTdGF0ZXMgUFJJTUFSWSBLRVksCiAgICAgICAgUnVudGltZUtpbmQgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgICAgICBXb3JrZXJUeXBlS2V5IG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgT2JzZXJ2ZWRTdGF0ZSB0aW55aW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FwcEluc3RhbmNlUnVudGltZVN0YXRlc19PYnNlcnZlZFN0YXRlIERFRkFVTFQoMCksCiAgICAgICAgUHJvY2Vzc0lkIGludCBOVUxMLAogICAgICAgIFN0YXJ0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgTGFzdFNlZW5VdGMgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgTGFzdEV4aXRVdGMgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgTGFzdEV4aXRDb2RlIGludCBOVUxMLAogICAgICAgIFN0YXR1c01lc3NhZ2UgbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0FwcEluc3RhbmNlUnVudGltZVN0YXRlc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9BcHBJbnN0YW5jZVJ1bnRpbWVTdGF0ZXNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfQXBwSW5zdGFuY2VSdW50aW1lU3RhdGVzX0FwcEluc3RhbmNlIEZPUkVJR04gS0VZKEFwcEluc3RhbmNlSWQpIFJFRkVSRU5DRVMgb21wLkFwcEluc3RhbmNlcyhBcHBJbnN0YW5jZUlkKQogICAgKTsKRU5ECkdPCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEhvc3QtbG9jYWwgYXJ0aWZhY3QgcHJvdmlzaW9uaW5nIGFuZCB3b3JrZXIgcHJvY2VzcyBpbnN0YW5jZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpJRiBPQkpFQ1RfSUQoTidvbXAuSG9zdEFydGlmYWN0UmVxdWlyZW1lbnRzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5Ib3N0QXJ0aWZhY3RSZXF1aXJlbWVudHMKICAgICgKICAgICAgICBIb3N0QXJ0aWZhY3RSZXF1aXJlbWVudElkIGJpZ2ludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMIENPTlNUUkFJTlQgUEtfb21wX0hvc3RBcnRpZmFjdFJlcXVpcmVtZW50cyBQUklNQVJZIEtFWSwKICAgICAgICBIb3N0SWQgdW5pcXVlaWRlbnRpZmllciBOT1QgTlVMTCwKICAgICAgICBBcnRpZmFjdElkIGludCBOT1QgTlVMTCwKICAgICAgICBSZXF1aXJlbWVudEtleSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIERlc2lyZWRMb2NhbFBhdGggbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIElzRW5hYmxlZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdEFydGlmYWN0UmVxdWlyZW1lbnRzX0lzRW5hYmxlZCBERUZBVUxUKDEpLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBcnRpZmFjdFJlcXVpcmVtZW50c19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0QXJ0aWZhY3RSZXF1aXJlbWVudHNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSG9zdEFydGlmYWN0UmVxdWlyZW1lbnRzX0hvc3QgRk9SRUlHTiBLRVkoSG9zdElkKSBSRUZFUkVOQ0VTIG9tcC5Ib3N0cyhIb3N0SWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0hvc3RBcnRpZmFjdFJlcXVpcmVtZW50c19BcnRpZmFjdCBGT1JFSUdOIEtFWShBcnRpZmFjdElkKSBSRUZFUkVOQ0VTIG9tcC5BcnRpZmFjdHMoQXJ0aWZhY3RJZCksCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfSG9zdEFydGlmYWN0UmVxdWlyZW1lbnRzX0hvc3RfUmVxdWlyZW1lbnQgVU5JUVVFKEhvc3RJZCwgUmVxdWlyZW1lbnRLZXkpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5Ib3N0QXJ0aWZhY3RTdGF0ZXMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLkhvc3RBcnRpZmFjdFN0YXRlcwogICAgKAogICAgICAgIEhvc3RJZCB1bmlxdWVpZGVudGlmaWVyIE5PVCBOVUxMLAogICAgICAgIEFydGlmYWN0SWQgaW50IE5PVCBOVUxMLAogICAgICAgIFByb3Zpc2lvbmluZ1N0YXRlIHRpbnlpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdEFydGlmYWN0U3RhdGVzX1Byb3Zpc2lvbmluZ1N0YXRlIERFRkFVTFQoMCksCiAgICAgICAgTG9jYWxQYXRoIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBDb250ZW50U2hhMjU2IG52YXJjaGFyKDEyOCkgTlVMTCwKICAgICAgICBMYXN0Q2hlY2tlZFV0YyBkYXRldGltZTIoMykgTlVMTCwKICAgICAgICBMYXN0UHJvdmlzaW9uZWRVdGMgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgTGFzdEVycm9yIG52YXJjaGFyKG1heCkgTlVMTCwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0QXJ0aWZhY3RTdGF0ZXNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdEFydGlmYWN0U3RhdGVzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgUEtfb21wX0hvc3RBcnRpZmFjdFN0YXRlcyBQUklNQVJZIEtFWShIb3N0SWQsIEFydGlmYWN0SWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0hvc3RBcnRpZmFjdFN0YXRlc19Ib3N0IEZPUkVJR04gS0VZKEhvc3RJZCkgUkVGRVJFTkNFUyBvbXAuSG9zdHMoSG9zdElkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9Ib3N0QXJ0aWZhY3RTdGF0ZXNfQXJ0aWZhY3QgRk9SRUlHTiBLRVkoQXJ0aWZhY3RJZCkgUkVGRVJFTkNFUyBvbXAuQXJ0aWZhY3RzKEFydGlmYWN0SWQpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5Ib3N0QXBwRGVwbG95bWVudFN0YXRlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuSG9zdEFwcERlcGxveW1lbnRTdGF0ZXMKICAgICgKICAgICAgICBIb3N0SWQgdW5pcXVlaWRlbnRpZmllciBOT1QgTlVMTCwKICAgICAgICBBcHBJbnN0YW5jZUlkIHVuaXF1ZWlkZW50aWZpZXIgTk9UIE5VTEwsCiAgICAgICAgQXJ0aWZhY3RJZCBpbnQgTlVMTCwKICAgICAgICBEZXBsb3ltZW50U3RhdGUgdGlueWludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0QXBwRGVwbG95bWVudFN0YXRlc19EZXBsb3ltZW50U3RhdGUgREVGQVVMVCgwKSwKICAgICAgICBTb3VyY2VMb2NhbFBhdGggbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIFRhcmdldFBhdGggbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIFJ1bnRpbWVOYW1lIG52YXJjaGFyKDIwMCkgTlVMTCwKICAgICAgICBDb250ZW50U2hhMjU2IG52YXJjaGFyKDEyOCkgTlVMTCwKICAgICAgICBDcmVkZW50aWFsQXV0b21hdGlvbk1vZGUgbnZhcmNoYXIoNDApIE5VTEwsCiAgICAgICAgRGVzaXJlZFJ1bnRpbWVJZGVudGl0eSBudmFyY2hhcigyNTYpIE5VTEwsCiAgICAgICAgQWN0dWFsUnVudGltZUlkZW50aXR5IG52YXJjaGFyKDI1NikgTlVMTCwKICAgICAgICBJZGVudGl0eUNoZWNrU3RhdHVzIG52YXJjaGFyKDQwKSBOVUxMLAogICAgICAgIElkZW50aXR5UmVwYWlyUmVxdWVzdGVkVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIElkZW50aXR5UmVwYWlyUmVxdWVzdGVkQnkgbnZhcmNoYXIoMjU2KSBOVUxMLAogICAgICAgIExhc3RDaGVja2VkVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RBcHBsaWVkVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RFcnJvciBudmFyY2hhcig0MDAwKSBOVUxMLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBcHBEZXBsb3ltZW50U3RhdGVzX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBcHBEZXBsb3ltZW50U3RhdGVzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgUEtfb21wX0hvc3RBcHBEZXBsb3ltZW50U3RhdGVzIFBSSU1BUlkgS0VZKEhvc3RJZCwgQXBwSW5zdGFuY2VJZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSG9zdEFwcERlcGxveW1lbnRTdGF0ZXNfSG9zdCBGT1JFSUdOIEtFWShIb3N0SWQpIFJFRkVSRU5DRVMgb21wLkhvc3RzKEhvc3RJZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSG9zdEFwcERlcGxveW1lbnRTdGF0ZXNfQXBwSW5zdGFuY2UgRk9SRUlHTiBLRVkoQXBwSW5zdGFuY2VJZCkgUkVGRVJFTkNFUyBvbXAuQXBwSW5zdGFuY2VzKEFwcEluc3RhbmNlSWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0hvc3RBcHBEZXBsb3ltZW50U3RhdGVzX0FydGlmYWN0IEZPUkVJR04gS0VZKEFydGlmYWN0SWQpIFJFRkVSRU5DRVMgb21wLkFydGlmYWN0cyhBcnRpZmFjdElkKQogICAgKTsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLkhvc3RBcHBEZXBsb3ltZW50U3RhdGVzJywgTidDcmVkZW50aWFsQXV0b21hdGlvbk1vZGUnKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuSG9zdEFwcERlcGxveW1lbnRTdGF0ZXMgQUREIENyZWRlbnRpYWxBdXRvbWF0aW9uTW9kZSBudmFyY2hhcig0MCkgTlVMTDsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLkhvc3RBcHBEZXBsb3ltZW50U3RhdGVzJywgTidEZXNpcmVkUnVudGltZUlkZW50aXR5JykgSVMgTlVMTApCRUdJTgogICAgQUxURVIgVEFCTEUgb21wLkhvc3RBcHBEZXBsb3ltZW50U3RhdGVzIEFERCBEZXNpcmVkUnVudGltZUlkZW50aXR5IG52YXJjaGFyKDI1NikgTlVMTDsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLkhvc3RBcHBEZXBsb3ltZW50U3RhdGVzJywgTidBY3R1YWxSdW50aW1lSWRlbnRpdHknKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuSG9zdEFwcERlcGxveW1lbnRTdGF0ZXMgQUREIEFjdHVhbFJ1bnRpbWVJZGVudGl0eSBudmFyY2hhcigyNTYpIE5VTEw7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5Ib3N0QXBwRGVwbG95bWVudFN0YXRlcycsIE4nSWRlbnRpdHlDaGVja1N0YXR1cycpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5Ib3N0QXBwRGVwbG95bWVudFN0YXRlcyBBREQgSWRlbnRpdHlDaGVja1N0YXR1cyBudmFyY2hhcig0MCkgTlVMTDsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLkhvc3RBcHBEZXBsb3ltZW50U3RhdGVzJywgTidJZGVudGl0eVJlcGFpclJlcXVlc3RlZFV0YycpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5Ib3N0QXBwRGVwbG95bWVudFN0YXRlcyBBREQgSWRlbnRpdHlSZXBhaXJSZXF1ZXN0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5VTEw7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5Ib3N0QXBwRGVwbG95bWVudFN0YXRlcycsIE4nSWRlbnRpdHlSZXBhaXJSZXF1ZXN0ZWRCeScpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5Ib3N0QXBwRGVwbG95bWVudFN0YXRlcyBBREQgSWRlbnRpdHlSZXBhaXJSZXF1ZXN0ZWRCeSBudmFyY2hhcigyNTYpIE5VTEw7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLldlYkFwcEhlYWx0aFN0YXRlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuV2ViQXBwSGVhbHRoU3RhdGVzCiAgICAoCiAgICAgICAgSG9zdElkIHVuaXF1ZWlkZW50aWZpZXIgTk9UIE5VTEwsCiAgICAgICAgSGVhbHRoS2V5IG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgQXBwSW5zdGFuY2VJZCB1bmlxdWVpZGVudGlmaWVyIE5VTEwsCiAgICAgICAgQXBwS2V5IG52YXJjaGFyKDIwMCkgTlVMTCwKICAgICAgICBEaXNwbGF5TmFtZSBudmFyY2hhcigyMDApIE5VTEwsCiAgICAgICAgUHJvYmVVcmwgbnZhcmNoYXIoMTAwMCkgTlVMTCwKICAgICAgICBBcHBQb29sTmFtZSBudmFyY2hhcigyMDApIE5VTEwsCiAgICAgICAgU3RhdHVzIHRpbnlpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfV2ViQXBwSGVhbHRoU3RhdGVzX1N0YXR1cyBERUZBVUxUKDApLAogICAgICAgIEh0dHBTdGF0dXNDb2RlIGludCBOVUxMLAogICAgICAgIENvbnNlY3V0aXZlRmFpbHVyZXMgaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX1dlYkFwcEhlYWx0aFN0YXRlc19Db25zZWN1dGl2ZUZhaWx1cmVzIERFRkFVTFQoMCksCiAgICAgICAgTGFzdFByb2JlVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RTdWNjZXNzVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RGYWlsdXJlVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RBY3Rpb25VdGMgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgTGFzdEFjdGlvbk1lc3NhZ2UgbnZhcmNoYXIoMTAwMCkgTlVMTCwKICAgICAgICBSZXNwb25zZVN1bW1hcnkgbnZhcmNoYXIoMTAwMCkgTlVMTCwKICAgICAgICBMYXN0RXJyb3IgbnZhcmNoYXIoNDAwMCkgTlVMTCwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9XZWJBcHBIZWFsdGhTdGF0ZXNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfV2ViQXBwSGVhbHRoU3RhdGVzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgUEtfb21wX1dlYkFwcEhlYWx0aFN0YXRlcyBQUklNQVJZIEtFWShIb3N0SWQsIEhlYWx0aEtleSksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfV2ViQXBwSGVhbHRoU3RhdGVzX0hvc3QgRk9SRUlHTiBLRVkoSG9zdElkKSBSRUZFUkVOQ0VTIG9tcC5Ib3N0cyhIb3N0SWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX1dlYkFwcEhlYWx0aFN0YXRlc19BcHBJbnN0YW5jZSBGT1JFSUdOIEtFWShBcHBJbnN0YW5jZUlkKSBSRUZFUkVOQ0VTIG9tcC5BcHBJbnN0YW5jZXMoQXBwSW5zdGFuY2VJZCksCiAgICAgICAgQ09OU1RSQUlOVCBDS19vbXBfV2ViQXBwSGVhbHRoU3RhdGVzX1N0YXR1cyBDSEVDSyhTdGF0dXMgSU4gKDAsIDEsIDIsIDMpKQogICAgKTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuV2ViQXBwSGVhbHRoU3RhdGVzJykKICAgICAgQU5EIG5hbWUgPSBOJ0lYX29tcF9XZWJBcHBIZWFsdGhTdGF0ZXNfU3RhdHVzJwopCkJFR0lOCiAgICBDUkVBVEUgSU5ERVggSVhfb21wX1dlYkFwcEhlYWx0aFN0YXRlc19TdGF0dXMKICAgICAgICBPTiBvbXAuV2ViQXBwSGVhbHRoU3RhdGVzKFN0YXR1cywgTGFzdFByb2JlVXRjIERFU0MpCiAgICAgICAgSU5DTFVERShIb3N0SWQsIEhlYWx0aEtleSwgQXBwS2V5LCBEaXNwbGF5TmFtZSwgQXBwUG9vbE5hbWUsIENvbnNlY3V0aXZlRmFpbHVyZXMpOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5Ib3N0QWdlbnREZXNpcmVkU3RhdGVzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5Ib3N0QWdlbnREZXNpcmVkU3RhdGVzCiAgICAoCiAgICAgICAgSG9zdElkIHVuaXF1ZWlkZW50aWZpZXIgTk9UIE5VTEwKICAgICAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfSG9zdEFnZW50RGVzaXJlZFN0YXRlcyBQUklNQVJZIEtFWSwKICAgICAgICBBcnRpZmFjdElkIGludCBOT1QgTlVMTCwKICAgICAgICBTZXJ2aWNlTmFtZVByZWZpeCBudmFyY2hhcigxNjApIE5VTEwsCiAgICAgICAgSW5zdGFsbFJvb3QgbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIElzRW5hYmxlZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdEFnZW50RGVzaXJlZFN0YXRlc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0QWdlbnREZXNpcmVkU3RhdGVzX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBZ2VudERlc2lyZWRTdGF0ZXNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSG9zdEFnZW50RGVzaXJlZFN0YXRlc19Ib3N0IEZPUkVJR04gS0VZKEhvc3RJZCkgUkVGRVJFTkNFUyBvbXAuSG9zdHMoSG9zdElkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9Ib3N0QWdlbnREZXNpcmVkU3RhdGVzX0FydGlmYWN0IEZPUkVJR04gS0VZKEFydGlmYWN0SWQpIFJFRkVSRU5DRVMgb21wLkFydGlmYWN0cyhBcnRpZmFjdElkKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuSG9zdEFnZW50UnVudGltZVN0YXRlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuSG9zdEFnZW50UnVudGltZVN0YXRlcwogICAgKAogICAgICAgIEhvc3RJZCB1bmlxdWVpZGVudGlmaWVyIE5PVCBOVUxMLAogICAgICAgIFNlcnZpY2VOYW1lIG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgVmVyc2lvbiBudmFyY2hhcig1MCkgTlVMTCwKICAgICAgICBBcnRpZmFjdElkIGludCBOVUxMLAogICAgICAgIEluc3RhbGxQYXRoIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBQcm9jZXNzSWQgaW50IE5VTEwsCiAgICAgICAgUnVudGltZU1vZGUgbnZhcmNoYXIoNDApIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBZ2VudFJ1bnRpbWVTdGF0ZXNfUnVudGltZU1vZGUgREVGQVVMVChOJ05vcm1hbCcpLAogICAgICAgIElzQWN0aXZlIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0QWdlbnRSdW50aW1lU3RhdGVzX0lzQWN0aXZlIERFRkFVTFQoMCksCiAgICAgICAgVGFrZW92ZXJGcm9tU2VydmljZU5hbWUgbnZhcmNoYXIoMjAwKSBOVUxMLAogICAgICAgIExhc3RTZWVuVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIFF1aWVzY2VSZXF1ZXN0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgUXVpZXNjZWRVdGMgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgU3RhdHVzTWVzc2FnZSBudmFyY2hhcigxMDAwKSBOVUxMLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBZ2VudFJ1bnRpbWVTdGF0ZXNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdEFnZW50UnVudGltZVN0YXRlc19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9Ib3N0QWdlbnRSdW50aW1lU3RhdGVzIFBSSU1BUlkgS0VZKEhvc3RJZCwgU2VydmljZU5hbWUpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0hvc3RBZ2VudFJ1bnRpbWVTdGF0ZXNfSG9zdCBGT1JFSUdOIEtFWShIb3N0SWQpIFJFRkVSRU5DRVMgb21wLkhvc3RzKEhvc3RJZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSG9zdEFnZW50UnVudGltZVN0YXRlc19BcnRpZmFjdCBGT1JFSUdOIEtFWShBcnRpZmFjdElkKSBSRUZFUkVOQ0VTIG9tcC5BcnRpZmFjdHMoQXJ0aWZhY3RJZCksCiAgICAgICAgQ09OU1RSQUlOVCBDS19vbXBfSG9zdEFnZW50UnVudGltZVN0YXRlc19Nb2RlIENIRUNLKFJ1bnRpbWVNb2RlIElOIChOJ05vcm1hbCcsIE4nVGFrZW92ZXInLCBOJ1F1aWVzY2luZycsIE4nUXVpZXNjZWQnLCBOJ0ZhaWxlZCcpKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuSG9zdEFnZW50TGVhc2VzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5Ib3N0QWdlbnRMZWFzZXMKICAgICgKICAgICAgICBIb3N0SWQgdW5pcXVlaWRlbnRpZmllciBOT1QgTlVMTAogICAgICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9Ib3N0QWdlbnRMZWFzZXMgUFJJTUFSWSBLRVksCiAgICAgICAgU2VydmljZU5hbWUgbnZhcmNoYXIoMjAwKSBOT1QgTlVMTCwKICAgICAgICBMZWFzZVRva2VuIHVuaXF1ZWlkZW50aWZpZXIgTk9UIE5VTEwsCiAgICAgICAgUnVudGltZU1vZGUgbnZhcmNoYXIoNDApIE5PVCBOVUxMLAogICAgICAgIExlYXNlVW50aWxVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBZ2VudExlYXNlc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0QWdlbnRMZWFzZXNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSG9zdEFnZW50TGVhc2VzX0hvc3QgRk9SRUlHTiBLRVkoSG9zdElkKSBSRUZFUkVOQ0VTIG9tcC5Ib3N0cyhIb3N0SWQpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5Ib3N0QWdlbnRKb2JzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5Ib3N0QWdlbnRKb2JzCiAgICAoCiAgICAgICAgSG9zdEFnZW50Sm9iSWQgYmlnaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwKICAgICAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfSG9zdEFnZW50Sm9icyBQUklNQVJZIEtFWSwKICAgICAgICBIb3N0SWQgdW5pcXVlaWRlbnRpZmllciBOVUxMLAogICAgICAgIEpvYlR5cGUgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgICAgICBQYXlsb2FkSnNvbiBudmFyY2hhcihtYXgpIE5VTEwsCiAgICAgICAgU3RhdHVzIHRpbnlpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdEFnZW50Sm9ic19TdGF0dXMgREVGQVVMVCgwKSwKICAgICAgICBSZXF1ZXN0ZWRCeSBudmFyY2hhcigyNTYpIE5VTEwsCiAgICAgICAgUmVxdWVzdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0QWdlbnRKb2JzX1JlcXVlc3RlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ2xhaW1lZEJ5U2VydmljZU5hbWUgbnZhcmNoYXIoMjAwKSBOVUxMLAogICAgICAgIENsYWltZWRVdGMgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgTGVhc2VVbnRpbFV0YyBkYXRldGltZTIoMykgTlVMTCwKICAgICAgICBTdGFydGVkVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIENvbXBsZXRlZFV0YyBkYXRldGltZTIoMykgTlVMTCwKICAgICAgICBBdHRlbXB0Q291bnQgaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBZ2VudEpvYnNfQXR0ZW1wdENvdW50IERFRkFVTFQoMCksCiAgICAgICAgTWF4QXR0ZW1wdHMgaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBZ2VudEpvYnNfTWF4QXR0ZW1wdHMgREVGQVVMVCgzKSwKICAgICAgICBSZXN1bHRKc29uIG52YXJjaGFyKG1heCkgTlVMTCwKICAgICAgICBMYXN0RXJyb3IgbnZhcmNoYXIobWF4KSBOVUxMLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3RBZ2VudEpvYnNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSG9zdEFnZW50Sm9ic19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9Ib3N0QWdlbnRKb2JzX0hvc3QgRk9SRUlHTiBLRVkoSG9zdElkKSBSRUZFUkVOQ0VTIG9tcC5Ib3N0cyhIb3N0SWQpLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX0hvc3RBZ2VudEpvYnNfU3RhdHVzIENIRUNLKFN0YXR1cyBJTiAoMCwgMSwgMiwgMywgNCwgNSkpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5Ib3N0QWdlbnRKb2JzJywgTidVJykgSVMgTk9UIE5VTEwKICAgQU5EIEVYSVNUUwogICAoCiAgICAgICBTRUxFQ1QgMQogICAgICAgRlJPTSBzeXMuY29sdW1ucwogICAgICAgV0hFUkUgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLkhvc3RBZ2VudEpvYnMnKQogICAgICAgICBBTkQgbmFtZSA9IE4nSG9zdElkJwogICAgICAgICBBTkQgaXNfbnVsbGFibGUgPSAwCiAgICkKQkVHSU4KICAgIElGIEVYSVNUUwogICAgKAogICAgICAgIFNFTEVDVCAxCiAgICAgICAgRlJPTSBzeXMuaW5kZXhlcwogICAgICAgIFdIRVJFIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5Ib3N0QWdlbnRKb2JzJykKICAgICAgICAgIEFORCBuYW1lID0gTidJWF9vbXBfSG9zdEFnZW50Sm9ic19Ib3N0X1N0YXR1cycKICAgICkKICAgIEJFR0lOCiAgICAgICAgRFJPUCBJTkRFWCBJWF9vbXBfSG9zdEFnZW50Sm9ic19Ib3N0X1N0YXR1cyBPTiBvbXAuSG9zdEFnZW50Sm9iczsKICAgIEVORDsKCiAgICBJRiBFWElTVFMKICAgICgKICAgICAgICBTRUxFQ1QgMQogICAgICAgIEZST00gc3lzLmZvcmVpZ25fa2V5cwogICAgICAgIFdIRVJFIHBhcmVudF9vYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuSG9zdEFnZW50Sm9icycpCiAgICAgICAgICBBTkQgbmFtZSA9IE4nRktfb21wX0hvc3RBZ2VudEpvYnNfSG9zdCcKICAgICkKICAgIEJFR0lOCiAgICAgICAgQUxURVIgVEFCTEUgb21wLkhvc3RBZ2VudEpvYnMgRFJPUCBDT05TVFJBSU5UIEZLX29tcF9Ib3N0QWdlbnRKb2JzX0hvc3Q7CiAgICBFTkQ7CgogICAgQUxURVIgVEFCTEUgb21wLkhvc3RBZ2VudEpvYnMgQUxURVIgQ09MVU1OIEhvc3RJZCB1bmlxdWVpZGVudGlmaWVyIE5VTEw7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLkhvc3RBZ2VudEpvYnMnLCBOJ1UnKSBJUyBOT1QgTlVMTAogICBBTkQgTk9UIEVYSVNUUwogICAoCiAgICAgICBTRUxFQ1QgMQogICAgICAgRlJPTSBzeXMuZm9yZWlnbl9rZXlzCiAgICAgICBXSEVSRSBwYXJlbnRfb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLkhvc3RBZ2VudEpvYnMnKQogICAgICAgICBBTkQgbmFtZSA9IE4nRktfb21wX0hvc3RBZ2VudEpvYnNfSG9zdCcKICAgKQpCRUdJTgogICAgQUxURVIgVEFCTEUgb21wLkhvc3RBZ2VudEpvYnMgV0lUSCBDSEVDSwogICAgQUREIENPTlNUUkFJTlQgRktfb21wX0hvc3RBZ2VudEpvYnNfSG9zdCBGT1JFSUdOIEtFWShIb3N0SWQpIFJFRkVSRU5DRVMgb21wLkhvc3RzKEhvc3RJZCk7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLkhvc3RBZ2VudEpvYnMnKQogICAgICBBTkQgbmFtZSA9IE4nSVhfb21wX0hvc3RBZ2VudEpvYnNfSG9zdF9TdGF0dXMnCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfSG9zdEFnZW50Sm9ic19Ib3N0X1N0YXR1cwogICAgICAgIE9OIG9tcC5Ib3N0QWdlbnRKb2JzKEhvc3RJZCwgU3RhdHVzLCBSZXF1ZXN0ZWRVdGMsIEhvc3RBZ2VudEpvYklkKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuTWFpbnRlbmFuY2VGaW5kaW5ncycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuTWFpbnRlbmFuY2VGaW5kaW5ncwogICAgKAogICAgICAgIE1haW50ZW5hbmNlRmluZGluZ0lkIGJpZ2ludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMCiAgICAgICAgICAgIENPTlNUUkFJTlQgUEtfb21wX01haW50ZW5hbmNlRmluZGluZ3MgUFJJTUFSWSBLRVksCiAgICAgICAgRmluZGluZ0tleSBudmFyY2hhcig0NTApIE5PVCBOVUxMLAogICAgICAgIFNjb3BlIG52YXJjaGFyKDIwKSBOT1QgTlVMTCwKICAgICAgICBIb3N0SWQgdW5pcXVlaWRlbnRpZmllciBOVUxMLAogICAgICAgIENhdGVnb3J5IG52YXJjaGFyKDEwMCkgTk9UIE5VTEwsCiAgICAgICAgVGFyZ2V0S2luZCBudmFyY2hhcig4MCkgTk9UIE5VTEwsCiAgICAgICAgVGFyZ2V0SWRlbnRpZmllciBudmFyY2hhcigxMDAwKSBOT1QgTlVMTCwKICAgICAgICBUaXRsZSBudmFyY2hhcigzMDApIE5PVCBOVUxMLAogICAgICAgIERldGFpbCBudmFyY2hhcihtYXgpIE5VTEwsCiAgICAgICAgUmVjb21tZW5kZWRBY3Rpb24gbnZhcmNoYXIoMzAwKSBOVUxMLAogICAgICAgIFNhZmV0eU5vdGVzIG52YXJjaGFyKG1heCkgTlVMTCwKICAgICAgICBBY3Rpb25Kc29uIG52YXJjaGFyKG1heCkgTlVMTCwKICAgICAgICBTdGF0dXMgdGlueWludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX1N0YXR1cyBERUZBVUxUKDApLAogICAgICAgIFNldmVyaXR5IHRpbnlpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfTWFpbnRlbmFuY2VGaW5kaW5nc19TZXZlcml0eSBERUZBVUxUKDEpLAogICAgICAgIENvbmZpZGVuY2UgdGlueWludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX0NvbmZpZGVuY2UgREVGQVVMVCg4MCksCiAgICAgICAgRGV0ZWN0ZWRCeUhvc3RBZ2VudEpvYklkIGJpZ2ludCBOVUxMLAogICAgICAgIENsZWFudXBIb3N0QWdlbnRKb2JJZCBiaWdpbnQgTlVMTCwKICAgICAgICBSZXN1bHRNZXNzYWdlIG52YXJjaGFyKG1heCkgTlVMTCwKICAgICAgICBSZXF1ZXN0ZWRCeSBudmFyY2hhcigyNTYpIE5VTEwsCiAgICAgICAgSWdub3JlZEJ5IG52YXJjaGFyKDI1NikgTlVMTCwKICAgICAgICBEZXRlY3RlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfTWFpbnRlbmFuY2VGaW5kaW5nc19EZXRlY3RlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgTGFzdFNlZW5VdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX01haW50ZW5hbmNlRmluZGluZ3NfTGFzdFNlZW5VdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX01haW50ZW5hbmNlRmluZGluZ3NfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfTWFpbnRlbmFuY2VGaW5kaW5nc19GaW5kaW5nS2V5IFVOSVFVRShGaW5kaW5nS2V5KSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX0hvc3QgRk9SRUlHTiBLRVkoSG9zdElkKSBSRUZFUkVOQ0VTIG9tcC5Ib3N0cyhIb3N0SWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX01haW50ZW5hbmNlRmluZGluZ3NfRGV0ZWN0ZWRKb2IgRk9SRUlHTiBLRVkoRGV0ZWN0ZWRCeUhvc3RBZ2VudEpvYklkKSBSRUZFUkVOQ0VTIG9tcC5Ib3N0QWdlbnRKb2JzKEhvc3RBZ2VudEpvYklkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX0NsZWFudXBKb2IgRk9SRUlHTiBLRVkoQ2xlYW51cEhvc3RBZ2VudEpvYklkKSBSRUZFUkVOQ0VTIG9tcC5Ib3N0QWdlbnRKb2JzKEhvc3RBZ2VudEpvYklkKSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX1Njb3BlIENIRUNLKFNjb3BlIElOIChOJ0dsb2JhbCcsIE4nSG9zdCcpKSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX1RhcmdldEtpbmQgQ0hFQ0soVGFyZ2V0S2luZCBJTiAoTidEYXRhYmFzZVJvdycsIE4nRGlyZWN0b3J5JywgTidGaWxlJywgTidXaW5kb3dzU2VydmljZScsIE4nSWlzQXBwbGljYXRpb24nLCBOJ0lpc0FwcFBvb2wnKSksCiAgICAgICAgQ09OU1RSQUlOVCBDS19vbXBfTWFpbnRlbmFuY2VGaW5kaW5nc19TdGF0dXMgQ0hFQ0soU3RhdHVzIElOICgwLCAxLCAyLCAzLCA0LCA1KSksCiAgICAgICAgQ09OU1RSQUlOVCBDS19vbXBfTWFpbnRlbmFuY2VGaW5kaW5nc19TZXZlcml0eSBDSEVDSyhTZXZlcml0eSBCRVRXRUVOIDAgQU5EIDQpLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX01haW50ZW5hbmNlRmluZGluZ3NfQ29uZmlkZW5jZSBDSEVDSyhDb25maWRlbmNlIEJFVFdFRU4gMCBBTkQgMTAwKSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX0FjdGlvbkpzb24gQ0hFQ0soQWN0aW9uSnNvbiBJUyBOVUxMIE9SIElTSlNPTihBY3Rpb25Kc29uKSA9IDEpCiAgICApOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5NYWludGVuYW5jZUZpbmRpbmdzJykKICAgICAgQU5EIG5hbWUgPSBOJ0lYX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX1N0YXR1cycKKQpCRUdJTgogICAgQ1JFQVRFIElOREVYIElYX29tcF9NYWludGVuYW5jZUZpbmRpbmdzX1N0YXR1cwogICAgICAgIE9OIG9tcC5NYWludGVuYW5jZUZpbmRpbmdzKFN0YXR1cywgTGFzdFNlZW5VdGMgREVTQywgTWFpbnRlbmFuY2VGaW5kaW5nSWQgREVTQykKICAgICAgICBJTkNMVURFKEhvc3RJZCwgQ2F0ZWdvcnksIFRhcmdldEtpbmQsIFRhcmdldElkZW50aWZpZXIsIFRpdGxlLCBTZXZlcml0eSwgQ29uZmlkZW5jZSk7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLk1haW50ZW5hbmNlRmluZGluZ3MnKQogICAgICBBTkQgbmFtZSA9IE4nSVhfb21wX01haW50ZW5hbmNlRmluZGluZ3NfSG9zdF9TdGF0dXMnCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfTWFpbnRlbmFuY2VGaW5kaW5nc19Ib3N0X1N0YXR1cwogICAgICAgIE9OIG9tcC5NYWludGVuYW5jZUZpbmRpbmdzKEhvc3RJZCwgU3RhdHVzLCBMYXN0U2VlblV0YyBERVNDLCBNYWludGVuYW5jZUZpbmRpbmdJZCBERVNDKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuV29ya2VySW5zdGFuY2VzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5Xb3JrZXJJbnN0YW5jZXMKICAgICgKICAgICAgICBXb3JrZXJJbnN0YW5jZUlkIHVuaXF1ZWlkZW50aWZpZXIgTk9UIE5VTEwgQ09OU1RSQUlOVCBQS19vbXBfV29ya2VySW5zdGFuY2VzIFBSSU1BUlkgS0VZLAogICAgICAgIEFwcEluc3RhbmNlSWQgdW5pcXVlaWRlbnRpZmllciBOT1QgTlVMTCwKICAgICAgICBIb3N0SWQgdW5pcXVlaWRlbnRpZmllciBOVUxMLAogICAgICAgIEFydGlmYWN0SWQgaW50IE5VTEwsCiAgICAgICAgV29ya2VySW5zdGFuY2VLZXkgbnZhcmNoYXIoMTUwKSBOT1QgTlVMTCwKICAgICAgICBEaXNwbGF5TmFtZSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIERlc2NyaXB0aW9uIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBDb25maWd1cmF0aW9uSnNvbiBudmFyY2hhcihtYXgpIE5VTEwsCiAgICAgICAgSXNFbmFibGVkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Xb3JrZXJJbnN0YW5jZXNfSXNFbmFibGVkIERFRkFVTFQoMSksCiAgICAgICAgSXNBbGxvd2VkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Xb3JrZXJJbnN0YW5jZXNfSXNBbGxvd2VkIERFRkFVTFQoMSksCiAgICAgICAgRGVzaXJlZFN0YXRlIHRpbnlpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfV29ya2VySW5zdGFuY2VzX0Rlc2lyZWRTdGF0ZSBERUZBVUxUKDEpLAogICAgICAgIFNvcnRPcmRlciBpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfV29ya2VySW5zdGFuY2VzX1NvcnRPcmRlciBERUZBVUxUKDApLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX1dvcmtlckluc3RhbmNlc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Xb3JrZXJJbnN0YW5jZXNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfV29ya2VySW5zdGFuY2VzX0FwcEluc3RhbmNlIEZPUkVJR04gS0VZKEFwcEluc3RhbmNlSWQpIFJFRkVSRU5DRVMgb21wLkFwcEluc3RhbmNlcyhBcHBJbnN0YW5jZUlkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9Xb3JrZXJJbnN0YW5jZXNfSG9zdCBGT1JFSUdOIEtFWShIb3N0SWQpIFJFRkVSRU5DRVMgb21wLkhvc3RzKEhvc3RJZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfV29ya2VySW5zdGFuY2VzX0FydGlmYWN0IEZPUkVJR04gS0VZKEFydGlmYWN0SWQpIFJFRkVSRU5DRVMgb21wLkFydGlmYWN0cyhBcnRpZmFjdElkKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9Xb3JrZXJJbnN0YW5jZXNfQXBwSW5zdGFuY2VfS2V5IFVOSVFVRShBcHBJbnN0YW5jZUlkLCBXb3JrZXJJbnN0YW5jZUtleSkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLldvcmtlckluc3RhbmNlUnVudGltZVN0YXRlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuV29ya2VySW5zdGFuY2VSdW50aW1lU3RhdGVzCiAgICAoCiAgICAgICAgV29ya2VySW5zdGFuY2VJZCB1bmlxdWVpZGVudGlmaWVyIE5PVCBOVUxMIENPTlNUUkFJTlQgUEtfb21wX1dvcmtlckluc3RhbmNlUnVudGltZVN0YXRlcyBQUklNQVJZIEtFWSwKICAgICAgICBBcHBJbnN0YW5jZUlkIHVuaXF1ZWlkZW50aWZpZXIgTk9UIE5VTEwsCiAgICAgICAgV29ya2VySW5zdGFuY2VLZXkgbnZhcmNoYXIoMTUwKSBOVUxMLAogICAgICAgIFJ1bnRpbWVLaW5kIG52YXJjaGFyKDEwMCkgTk9UIE5VTEwsCiAgICAgICAgV29ya2VyVHlwZUtleSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIE9ic2VydmVkU3RhdGUgdGlueWludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Xb3JrZXJJbnN0YW5jZVJ1bnRpbWVTdGF0ZXNfT2JzZXJ2ZWRTdGF0ZSBERUZBVUxUKDApLAogICAgICAgIFByb2Nlc3NJZCBpbnQgTlVMTCwKICAgICAgICBTdGFydGVkVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RTZWVuVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RFeGl0VXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIExhc3RFeGl0Q29kZSBpbnQgTlVMTCwKICAgICAgICBTdGF0dXNNZXNzYWdlIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Xb3JrZXJJbnN0YW5jZVJ1bnRpbWVTdGF0ZXNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfV29ya2VySW5zdGFuY2VSdW50aW1lU3RhdGVzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX1dvcmtlckluc3RhbmNlUnVudGltZVN0YXRlc19Xb3JrZXJJbnN0YW5jZSBGT1JFSUdOIEtFWShXb3JrZXJJbnN0YW5jZUlkKSBSRUZFUkVOQ0VTIG9tcC5Xb3JrZXJJbnN0YW5jZXMoV29ya2VySW5zdGFuY2VJZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfV29ya2VySW5zdGFuY2VSdW50aW1lU3RhdGVzX0FwcEluc3RhbmNlIEZPUkVJR04gS0VZKEFwcEluc3RhbmNlSWQpIFJFRkVSRU5DRVMgb21wLkFwcEluc3RhbmNlcyhBcHBJbnN0YW5jZUlkKQogICAgKTsKRU5ECkdPCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIFRlbXBsYXRlIHRvcG9sb2d5IG1vZGVsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSUYgT0JKRUNUX0lEKE4nb21wLkluc3RhbmNlVGVtcGxhdGVIb3N0cycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuSW5zdGFuY2VUZW1wbGF0ZUhvc3RzCiAgICAoCiAgICAgICAgSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCBQUklNQVJZIEtFWSwKICAgICAgICBJbnN0YW5jZVRlbXBsYXRlSWQgaW50IE5PVCBOVUxMLAogICAgICAgIEhvc3RUZW1wbGF0ZUlkIGludCBOT1QgTlVMTCwKICAgICAgICBIb3N0S2V5IG52YXJjaGFyKDEyOCkgTk9UIE5VTEwsCiAgICAgICAgRGlzcGxheU5hbWUgbnZhcmNoYXIoMjAwKSBOVUxMLAogICAgICAgIEVudmlyb25tZW50IG52YXJjaGFyKDEwMCkgTlVMTCwKICAgICAgICBTb3J0T3JkZXIgaW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0luc3RhbmNlVGVtcGxhdGVIb3N0c19Tb3J0T3JkZXIgREVGQVVMVCgwKSwKICAgICAgICBJc0VuYWJsZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0luc3RhbmNlVGVtcGxhdGVIb3N0c19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZVRlbXBsYXRlSG9zdHNfQ3JlYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSW5zdGFuY2VUZW1wbGF0ZUhvc3RzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0luc3RhbmNlVGVtcGxhdGVIb3N0c19JbnN0YW5jZVRlbXBsYXRlCiAgICAgICAgICAgIEZPUkVJR04gS0VZKEluc3RhbmNlVGVtcGxhdGVJZCkKICAgICAgICAgICAgUkVGRVJFTkNFUyBvbXAuSW5zdGFuY2VUZW1wbGF0ZXMoSW5zdGFuY2VUZW1wbGF0ZUlkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9JbnN0YW5jZVRlbXBsYXRlSG9zdHNfSG9zdFRlbXBsYXRlCiAgICAgICAgICAgIEZPUkVJR04gS0VZKEhvc3RUZW1wbGF0ZUlkKQogICAgICAgICAgICBSRUZFUkVOQ0VTIG9tcC5Ib3N0VGVtcGxhdGVzKEhvc3RUZW1wbGF0ZUlkKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9JbnN0YW5jZVRlbXBsYXRlSG9zdHNfVGVtcGxhdGVfSG9zdEtleSBVTklRVUUoSW5zdGFuY2VUZW1wbGF0ZUlkLCBIb3N0S2V5KQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlcwogICAgKAogICAgICAgIEluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkIGludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAogICAgICAgIEluc3RhbmNlVGVtcGxhdGVJZCBpbnQgTk9UIE5VTEwsCiAgICAgICAgTW9kdWxlSWQgaW50IE5PVCBOVUxMLAogICAgICAgIE1vZHVsZUluc3RhbmNlS2V5IG52YXJjaGFyKDEwMCkgTk9UIE5VTEwsCiAgICAgICAgRGlzcGxheU5hbWUgbnZhcmNoYXIoMjAwKSBOT1QgTlVMTCwKICAgICAgICBEZXNjcmlwdGlvbiBudmFyY2hhcig1MDApIE5VTEwsCiAgICAgICAgU29ydE9yZGVyIGludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VzX1NvcnRPcmRlciBERUZBVUxUKDApLAogICAgICAgIElzRW5hYmxlZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VzX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIFVwZGF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0luc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZXNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlc19JbnN0YW5jZVRlbXBsYXRlCiAgICAgICAgICAgIEZPUkVJR04gS0VZKEluc3RhbmNlVGVtcGxhdGVJZCkKICAgICAgICAgICAgUkVGRVJFTkNFUyBvbXAuSW5zdGFuY2VUZW1wbGF0ZXMoSW5zdGFuY2VUZW1wbGF0ZUlkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9JbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VzX01vZHVsZQogICAgICAgICAgICBGT1JFSUdOIEtFWShNb2R1bGVJZCkKICAgICAgICAgICAgUkVGRVJFTkNFUyBvbXAuTW9kdWxlcyhNb2R1bGVJZCksCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlc19UZW1wbGF0ZV9Nb2R1bGVJbnN0YW5jZUtleSBVTklRVUUoSW5zdGFuY2VUZW1wbGF0ZUlkLCBNb2R1bGVJbnN0YW5jZUtleSkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMKICAgICgKICAgICAgICBJbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VJZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCBQUklNQVJZIEtFWSwKICAgICAgICBJbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VJZCBpbnQgTk9UIE5VTEwsCiAgICAgICAgSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCBpbnQgTlVMTCwKICAgICAgICBUYXJnZXRIb3N0VGVtcGxhdGVJZCBpbnQgTlVMTCwKICAgICAgICBBcHBJZCBpbnQgTk9UIE5VTEwsCiAgICAgICAgQXBwSW5zdGFuY2VLZXkgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgICAgICBEaXNwbGF5TmFtZSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIERlc2NyaXB0aW9uIG52YXJjaGFyKDUwMCkgTlVMTCwKICAgICAgICBSb3V0ZVBhdGggbnZhcmNoYXIoMjU2KSBOVUxMLAogICAgICAgIFB1YmxpY1VybCBudmFyY2hhcig1MDApIE5VTEwsCiAgICAgICAgSW5zdGFsbFBhdGggbnZhcmNoYXIoNTAwKSBOVUxMLAogICAgICAgIEluc3RhbGxhdGlvbk5hbWUgbnZhcmNoYXIoMTUwKSBOVUxMLAogICAgICAgIERlc2lyZWRBcnRpZmFjdElkIGludCBOVUxMLAogICAgICAgIERlc2lyZWRDb25maWdJZCBpbnQgTlVMTCwKICAgICAgICBFeHBlY3RlZExvZ2luIG52YXJjaGFyKDI1NikgTlVMTCwKICAgICAgICBFeHBlY3RlZENsaWVudEhvc3ROYW1lIG52YXJjaGFyKDEyOCkgTlVMTCwKICAgICAgICBFeHBlY3RlZENsaWVudElwIG52YXJjaGFyKDY0KSBOVUxMLAogICAgICAgIERlc2lyZWRTdGF0ZSB0aW55aW50IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfRGVzaXJlZFN0YXRlIERFRkFVTFQoMSksCiAgICAgICAgU29ydE9yZGVyIGludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzX1NvcnRPcmRlciBERUZBVUxUKDApLAogICAgICAgIElzRW5hYmxlZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBJc0FsbG93ZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfSXNBbGxvd2VkIERFRkFVTFQoMSksCiAgICAgICAgQ3JlYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzX1VwZGF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfTW9kdWxlSW5zdGFuY2UKICAgICAgICAgICAgRk9SRUlHTiBLRVkoSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQpCiAgICAgICAgICAgIFJFRkVSRU5DRVMgb21wLkluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZXMoSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfSG9zdAogICAgICAgICAgICBGT1JFSUdOIEtFWShJbnN0YW5jZVRlbXBsYXRlSG9zdElkKQogICAgICAgICAgICBSRUZFUkVOQ0VTIG9tcC5JbnN0YW5jZVRlbXBsYXRlSG9zdHMoSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19UYXJnZXRIb3N0VGVtcGxhdGUKICAgICAgICAgICAgRk9SRUlHTiBLRVkoVGFyZ2V0SG9zdFRlbXBsYXRlSWQpCiAgICAgICAgICAgIFJFRkVSRU5DRVMgb21wLkhvc3RUZW1wbGF0ZXMoSG9zdFRlbXBsYXRlSWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfQXBwCiAgICAgICAgICAgIEZPUkVJR04gS0VZKEFwcElkKQogICAgICAgICAgICBSRUZFUkVOQ0VTIG9tcC5BcHBzKEFwcElkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzX0FydGlmYWN0CiAgICAgICAgICAgIEZPUkVJR04gS0VZKERlc2lyZWRBcnRpZmFjdElkKQogICAgICAgICAgICBSRUZFUkVOQ0VTIG9tcC5BcnRpZmFjdHMoQXJ0aWZhY3RJZCksCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19Nb2R1bGVJbnN0YW5jZV9BcHBJbnN0YW5jZUtleQogICAgICAgICAgICBVTklRVUUoSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQsIEFwcEluc3RhbmNlS2V5KQogICAgKTsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMnLCBOJ1RhcmdldEhvc3RUZW1wbGF0ZUlkJykgSVMgTlVMTApCRUdJTgogICAgQUxURVIgVEFCTEUgb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMKICAgICAgICBBREQgVGFyZ2V0SG9zdFRlbXBsYXRlSWQgaW50IE5VTEw7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzJywgTidJc0FsbG93ZWQnKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcwogICAgICAgIEFERCBJc0FsbG93ZWQgYml0IE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfSXNBbGxvd2VkIERFRkFVTFQoMSkgV0lUSCBWQUxVRVM7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuZm9yZWlnbl9rZXlzCiAgICBXSEVSRSBuYW1lID0gTidGS19vbXBfQXBwSW5zdGFuY2VzX1RhcmdldEhvc3RUZW1wbGF0ZScKICAgICAgQU5EIHBhcmVudF9vYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuQXBwSW5zdGFuY2VzJykKKQpCRUdJTgogICAgQUxURVIgVEFCTEUgb21wLkFwcEluc3RhbmNlcwogICAgICAgIEFERCBDT05TVFJBSU5UIEZLX29tcF9BcHBJbnN0YW5jZXNfVGFyZ2V0SG9zdFRlbXBsYXRlCiAgICAgICAgICAgIEZPUkVJR04gS0VZKFRhcmdldEhvc3RUZW1wbGF0ZUlkKQogICAgICAgICAgICBSRUZFUkVOQ0VTIG9tcC5Ib3N0VGVtcGxhdGVzKEhvc3RUZW1wbGF0ZUlkKTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5mb3JlaWduX2tleXMKICAgIFdIRVJFIG5hbWUgPSBOJ0ZLX29tcF9JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzX1RhcmdldEhvc3RUZW1wbGF0ZScKICAgICAgQU5EIHBhcmVudF9vYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcycpCikKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzCiAgICAgICAgQUREIENPTlNUUkFJTlQgRktfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfVGFyZ2V0SG9zdFRlbXBsYXRlCiAgICAgICAgICAgIEZPUkVJR04gS0VZKFRhcmdldEhvc3RUZW1wbGF0ZUlkKQogICAgICAgICAgICBSRUZFUkVOQ0VTIG9tcC5Ib3N0VGVtcGxhdGVzKEhvc3RUZW1wbGF0ZUlkKTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5jaGVja19jb25zdHJhaW50cwogICAgV0hFUkUgbmFtZSA9IE4nQ0tfb21wX0FwcEluc3RhbmNlc19PbmVIb3N0UGxhY2VtZW50JwogICAgICBBTkQgcGFyZW50X29iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5BcHBJbnN0YW5jZXMnKQopCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuQXBwSW5zdGFuY2VzCiAgICAgICAgQUREIENPTlNUUkFJTlQgQ0tfb21wX0FwcEluc3RhbmNlc19PbmVIb3N0UGxhY2VtZW50CiAgICAgICAgICAgIENIRUNLIChIb3N0SWQgSVMgTlVMTCBPUiBUYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOVUxMKTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5jaGVja19jb25zdHJhaW50cwogICAgV0hFUkUgbmFtZSA9IE4nQ0tfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfT25lSG9zdFBsYWNlbWVudCcKICAgICAgQU5EIHBhcmVudF9vYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcycpCikKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzCiAgICAgICAgQUREIENPTlNUUkFJTlQgQ0tfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfT25lSG9zdFBsYWNlbWVudAogICAgICAgICAgICBDSEVDSyAoSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCBJUyBOVUxMIE9SIFRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwpOwpFTkQKR08KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gQXBwIHBsYWNlbWVudCBpbnZhcmlhbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSUYgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIG9tcC5BcHBJbnN0YW5jZXMgYWkKICAgIElOTkVSIEpPSU4gb21wLkFwcHMgYSBPTiBhLkFwcElkID0gYWkuQXBwSWQKICAgIFdIRVJFIGFpLkhvc3RJZCBJUyBOT1QgTlVMTAogICAgICBBTkQgYWkuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTlVMTAogICAgICBBTkQgYWkuSXNFbmFibGVkID0gMQogICAgICBBTkQgYWkuSXNBbGxvd2VkID0gMQogICAgICBBTkQgYWkuRGVzaXJlZFN0YXRlID0gMQogICAgICBBTkQgYS5BcHBUeXBlIElOIChOJ1BvcnRhbCcsIE4nV2ViQXBwJykKICAgICAgQU5EIGEuQWxsb3dNdWx0aXBsZUFjdGl2ZUluc3RhbmNlcyA9IDAKICAgIEdST1VQIEJZIGFpLk1vZHVsZUluc3RhbmNlSWQsIGFpLkhvc3RJZCwgYWkuQXBwSWQKICAgIEhBVklORyBDT1VOVCgxKSA+IDEKKQpCRUdJTgogICAgVEhST1cgNTEwNTAsICdEdXBsaWNhdGUgYWN0aXZlIGhvc3Qtc3BlY2lmaWMgd2ViIGFwcCBpbnN0YW5jZXMgZXhpc3QuIEtlZXAgb25seSBvbmUgYWN0aXZlIGRlc2lyZWQgcm93IHBlciBtb2R1bGUgaW5zdGFuY2UsIHdlYiBhcHAgZGVmaW5pdGlvbiBhbmQgaG9zdC4nLCAxOwpFTkQKR08KCklGIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBvbXAuQXBwSW5zdGFuY2VzIGFpCiAgICBJTk5FUiBKT0lOIG9tcC5BcHBzIGEgT04gYS5BcHBJZCA9IGFpLkFwcElkCiAgICBXSEVSRSBhaS5Ib3N0SWQgSVMgTlVMTAogICAgICBBTkQgYWkuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTlVMTAogICAgICBBTkQgYWkuSXNFbmFibGVkID0gMQogICAgICBBTkQgYWkuSXNBbGxvd2VkID0gMQogICAgICBBTkQgYWkuRGVzaXJlZFN0YXRlID0gMQogICAgICBBTkQgYS5BcHBUeXBlIElOIChOJ1BvcnRhbCcsIE4nV2ViQXBwJykKICAgICAgQU5EIGEuQWxsb3dNdWx0aXBsZUFjdGl2ZUluc3RhbmNlcyA9IDAKICAgIEdST1VQIEJZIGFpLk1vZHVsZUluc3RhbmNlSWQsIGFpLkFwcElkCiAgICBIQVZJTkcgQ09VTlQoMSkgPiAxCikKQkVHSU4KICAgIFRIUk9XIDUxMDUxLCAnRHVwbGljYXRlIGFjdGl2ZSBob3N0LW5ldXRyYWwgd2ViIGFwcCBpbnN0YW5jZXMgZXhpc3QuIEtlZXAgb25seSBvbmUgYWN0aXZlIGRlc2lyZWQgaG9zdC1uZXV0cmFsIHJvdyBwZXIgbW9kdWxlIGluc3RhbmNlIGFuZCB3ZWIgYXBwIGRlZmluaXRpb24uJywgMTsKRU5ECkdPCgpJRiBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gb21wLkFwcEluc3RhbmNlcyBhaQogICAgSU5ORVIgSk9JTiBvbXAuQXBwcyBhIE9OIGEuQXBwSWQgPSBhaS5BcHBJZAogICAgV0hFUkUgYWkuSG9zdElkIElTIE5VTEwKICAgICAgQU5EIGFpLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5PVCBOVUxMCiAgICAgIEFORCBhaS5Jc0VuYWJsZWQgPSAxCiAgICAgIEFORCBhaS5Jc0FsbG93ZWQgPSAxCiAgICAgIEFORCBhaS5EZXNpcmVkU3RhdGUgPSAxCiAgICAgIEFORCBhLkFwcFR5cGUgSU4gKE4nUG9ydGFsJywgTidXZWJBcHAnKQogICAgICBBTkQgYS5BbGxvd011bHRpcGxlQWN0aXZlSW5zdGFuY2VzID0gMAogICAgR1JPVVAgQlkgYWkuTW9kdWxlSW5zdGFuY2VJZCwgYWkuVGFyZ2V0SG9zdFRlbXBsYXRlSWQsIGFpLkFwcElkCiAgICBIQVZJTkcgQ09VTlQoMSkgPiAxCikKQkVHSU4KICAgIFRIUk9XIDUxMDU4LCAnRHVwbGljYXRlIGFjdGl2ZSBob3N0LXJvbGUgd2ViIGFwcCBpbnN0YW5jZXMgZXhpc3QuIEtlZXAgb25seSBvbmUgYWN0aXZlIGRlc2lyZWQgcm93IHBlciBtb2R1bGUgaW5zdGFuY2UsIHdlYiBhcHAgZGVmaW5pdGlvbiBhbmQgaG9zdCByb2xlLicsIDE7CkVORApHTwoKSUYgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuQXBwSW5zdGFuY2VzJykKICAgICAgQU5EIG5hbWUgPSBOJ1VYX29tcF9BcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0X0FwcCcKKQpCRUdJTgogICAgRFJPUCBJTkRFWCBVWF9vbXBfQXBwSW5zdGFuY2VzX0FjdGl2ZV9Nb2R1bGVfSG9zdF9BcHAgT04gb21wLkFwcEluc3RhbmNlczsKRU5ECkdPCgpJRiBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5BcHBJbnN0YW5jZXMnKQogICAgICBBTkQgbmFtZSA9IE4nVVhfb21wX0FwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3ROZXV0cmFsX0FwcCcKKQpCRUdJTgogICAgRFJPUCBJTkRFWCBVWF9vbXBfQXBwSW5zdGFuY2VzX0FjdGl2ZV9Nb2R1bGVfSG9zdE5ldXRyYWxfQXBwIE9OIG9tcC5BcHBJbnN0YW5jZXM7CkVORApHTwoKSUYgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuQXBwSW5zdGFuY2VzJykKICAgICAgQU5EIG5hbWUgPSBOJ0lYX29tcF9BcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0X0FwcCcKICAgICAgQU5EIElTTlVMTChmaWx0ZXJfZGVmaW5pdGlvbiwgTicnKSBOT1QgTElLRSBOJyVUYXJnZXRIb3N0VGVtcGxhdGVJZCUnCikKQkVHSU4KICAgIERST1AgSU5ERVggSVhfb21wX0FwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3RfQXBwIE9OIG9tcC5BcHBJbnN0YW5jZXM7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLkFwcEluc3RhbmNlcycpCiAgICAgIEFORCBuYW1lID0gTidJWF9vbXBfQXBwSW5zdGFuY2VzX0FjdGl2ZV9Nb2R1bGVfSG9zdF9BcHAnCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfQXBwSW5zdGFuY2VzX0FjdGl2ZV9Nb2R1bGVfSG9zdF9BcHAKICAgICAgICBPTiBvbXAuQXBwSW5zdGFuY2VzKE1vZHVsZUluc3RhbmNlSWQsIEhvc3RJZCwgQXBwSWQsIEFwcEluc3RhbmNlS2V5KQogICAgICAgIFdIRVJFIEhvc3RJZCBJUyBOT1QgTlVMTAogICAgICAgICAgQU5EIFRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwKICAgICAgICAgIEFORCBJc0VuYWJsZWQgPSAxCiAgICAgICAgICBBTkQgSXNBbGxvd2VkID0gMQogICAgICAgICAgQU5EIERlc2lyZWRTdGF0ZSA9IDE7CkVORApHTwoKSUYgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuQXBwSW5zdGFuY2VzJykKICAgICAgQU5EIG5hbWUgPSBOJ0lYX29tcF9BcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0TmV1dHJhbF9BcHAnCiAgICAgIEFORCBJU05VTEwoZmlsdGVyX2RlZmluaXRpb24sIE4nJykgTk9UIExJS0UgTiclVGFyZ2V0SG9zdFRlbXBsYXRlSWQlJwopCkJFR0lOCiAgICBEUk9QIElOREVYIElYX29tcF9BcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0TmV1dHJhbF9BcHAgT04gb21wLkFwcEluc3RhbmNlczsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuQXBwSW5zdGFuY2VzJykKICAgICAgQU5EIG5hbWUgPSBOJ0lYX29tcF9BcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0TmV1dHJhbF9BcHAnCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfQXBwSW5zdGFuY2VzX0FjdGl2ZV9Nb2R1bGVfSG9zdE5ldXRyYWxfQXBwCiAgICAgICAgT04gb21wLkFwcEluc3RhbmNlcyhNb2R1bGVJbnN0YW5jZUlkLCBBcHBJZCwgQXBwSW5zdGFuY2VLZXkpCiAgICAgICAgV0hFUkUgSG9zdElkIElTIE5VTEwKICAgICAgICAgIEFORCBUYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOVUxMCiAgICAgICAgICBBTkQgSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIElzQWxsb3dlZCA9IDEKICAgICAgICAgIEFORCBEZXNpcmVkU3RhdGUgPSAxOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5BcHBJbnN0YW5jZXMnKQogICAgICBBTkQgbmFtZSA9IE4nSVhfb21wX0FwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3RSb2xlX0FwcCcKKQpCRUdJTgogICAgQ1JFQVRFIElOREVYIElYX29tcF9BcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0Um9sZV9BcHAKICAgICAgICBPTiBvbXAuQXBwSW5zdGFuY2VzKE1vZHVsZUluc3RhbmNlSWQsIFRhcmdldEhvc3RUZW1wbGF0ZUlkLCBBcHBJZCwgQXBwSW5zdGFuY2VLZXkpCiAgICAgICAgV0hFUkUgVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTk9UIE5VTEwKICAgICAgICAgIEFORCBJc0VuYWJsZWQgPSAxCiAgICAgICAgICBBTkQgSXNBbGxvd2VkID0gMQogICAgICAgICAgQU5EIERlc2lyZWRTdGF0ZSA9IDE7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLkhvc3REZXBsb3ltZW50QXNzaWdubWVudHMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLkhvc3REZXBsb3ltZW50QXNzaWdubWVudHMKICAgICgKICAgICAgICBIb3N0RGVwbG95bWVudEFzc2lnbm1lbnRJZCBiaWdpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCBQUklNQVJZIEtFWSwKICAgICAgICBIb3N0SWQgdW5pcXVlaWRlbnRpZmllciBOT1QgTlVMTCwKICAgICAgICBIb3N0VGVtcGxhdGVJZCBpbnQgTk9UIE5VTEwsCiAgICAgICAgQXNzaWduZWRCeSBudmFyY2hhcigyNTYpIE5VTEwsCiAgICAgICAgQXNzaWduZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3REZXBsb3ltZW50QXNzaWdubWVudHNfQXNzaWduZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIElzQWN0aXZlIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0RGVwbG95bWVudEFzc2lnbm1lbnRzX0lzQWN0aXZlIERFRkFVTFQoMSksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSG9zdERlcGxveW1lbnRBc3NpZ25tZW50c19Ib3N0IEZPUkVJR04gS0VZKEhvc3RJZCkgUkVGRVJFTkNFUyBvbXAuSG9zdHMoSG9zdElkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9Ib3N0RGVwbG95bWVudEFzc2lnbm1lbnRzX0hvc3RUZW1wbGF0ZSBGT1JFSUdOIEtFWShIb3N0VGVtcGxhdGVJZCkgUkVGRVJFTkNFUyBvbXAuSG9zdFRlbXBsYXRlcyhIb3N0VGVtcGxhdGVJZCkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLlRSX0FwcEluc3RhbmNlc19WYWxpZGF0ZUFjdGl2ZVBsYWNlbWVudCcsIE4nVFInKSBJUyBOVUxMCiAgICBFWEVDKE4nQ1JFQVRFIFRSSUdHRVIgb21wLlRSX0FwcEluc3RhbmNlc19WYWxpZGF0ZUFjdGl2ZVBsYWNlbWVudCBPTiBvbXAuQXBwSW5zdGFuY2VzIEFGVEVSIElOU0VSVCwgVVBEQVRFIEFTIEJFR0lOIFNFVCBOT0NPVU5UIE9OOyBFTkQnKTsKR08KCkFMVEVSIFRSSUdHRVIgb21wLlRSX0FwcEluc3RhbmNlc19WYWxpZGF0ZUFjdGl2ZVBsYWNlbWVudApPTiBvbXAuQXBwSW5zdGFuY2VzCkFGVEVSIElOU0VSVCwgVVBEQVRFCkFTCkJFR0lOCiAgICBTRVQgTk9DT1VOVCBPTjsKCiAgICBJRiBOT1QKICAgICgKICAgICAgICBVUERBVEUoTW9kdWxlSW5zdGFuY2VJZCkKICAgICAgICBPUiBVUERBVEUoQXBwSWQpCiAgICAgICAgT1IgVVBEQVRFKEhvc3RJZCkKICAgICAgICBPUiBVUERBVEUoVGFyZ2V0SG9zdFRlbXBsYXRlSWQpCiAgICAgICAgT1IgVVBEQVRFKElzRW5hYmxlZCkKICAgICAgICBPUiBVUERBVEUoSXNBbGxvd2VkKQogICAgICAgIE9SIFVQREFURShEZXNpcmVkU3RhdGUpCiAgICApCiAgICBCRUdJTgogICAgICAgIFJFVFVSTjsKICAgIEVORDsKCiAgICBJRiBFWElTVFMKICAgICgKICAgICAgICBTRUxFQ1QgMQogICAgICAgIEZST00gaW5zZXJ0ZWQgaQogICAgICAgIElOTkVSIEpPSU4gb21wLkFwcHMgYQogICAgICAgICAgICBPTiBhLkFwcElkID0gaS5BcHBJZAogICAgICAgICAgIEFORCBhLkFwcFR5cGUgSU4gKE4nUG9ydGFsJywgTidXZWJBcHAnKQogICAgICAgICAgIEFORCBhLkFsbG93TXVsdGlwbGVBY3RpdmVJbnN0YW5jZXMgPSAwCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuQXBwSW5zdGFuY2VzIGV4aXN0aW5nCiAgICAgICAgICAgIE9OIGV4aXN0aW5nLk1vZHVsZUluc3RhbmNlSWQgPSBpLk1vZHVsZUluc3RhbmNlSWQKICAgICAgICAgICBBTkQgZXhpc3RpbmcuQXBwSWQgPSBpLkFwcElkCiAgICAgICAgICAgQU5EIGV4aXN0aW5nLkFwcEluc3RhbmNlSWQgPD4gaS5BcHBJbnN0YW5jZUlkCiAgICAgICAgICAgQU5ECiAgICAgICAgICAgKAogICAgICAgICAgICAgICAoaS5Ib3N0SWQgSVMgTlVMTCBBTkQgaS5UYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOVUxMIEFORCBleGlzdGluZy5Ib3N0SWQgSVMgTlVMTCBBTkQgZXhpc3RpbmcuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTlVMTCkKICAgICAgICAgICAgICAgT1IgKGkuSG9zdElkIElTIE5PVCBOVUxMIEFORCBleGlzdGluZy5Ib3N0SWQgPSBpLkhvc3RJZCkKICAgICAgICAgICAgICAgT1IgKGkuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTk9UIE5VTEwgQU5EIGV4aXN0aW5nLlRhcmdldEhvc3RUZW1wbGF0ZUlkID0gaS5UYXJnZXRIb3N0VGVtcGxhdGVJZCkKICAgICAgICAgICApCiAgICAgICAgV0hFUkUgaS5Jc0VuYWJsZWQgPSAxCiAgICAgICAgICBBTkQgaS5Jc0FsbG93ZWQgPSAxCiAgICAgICAgICBBTkQgaS5EZXNpcmVkU3RhdGUgPSAxCiAgICAgICAgICBBTkQgZXhpc3RpbmcuSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIGV4aXN0aW5nLklzQWxsb3dlZCA9IDEKICAgICAgICAgIEFORCBleGlzdGluZy5EZXNpcmVkU3RhdGUgPSAxCiAgICApCiAgICBCRUdJTgogICAgICAgIFRIUk9XIDUxMDUyLCAnT25seSBvbmUgYWN0aXZlIGRlc2lyZWQgd2ViIGFwcCBpbnN0YW5jZSBpcyBhbGxvd2VkIHBlciBtb2R1bGUgaW5zdGFuY2UsIHdlYiBhcHAgZGVmaW5pdGlvbiBhbmQgaG9zdCBwbGFjZW1lbnQuJywgMTsKICAgIEVORDsKCiAgICBJRiBFWElTVFMKICAgICgKICAgICAgICBTRUxFQ1QgMQogICAgICAgIEZST00gaW5zZXJ0ZWQgaQogICAgICAgIElOTkVSIEpPSU4gb21wLkFwcHMgYQogICAgICAgICAgICBPTiBhLkFwcElkID0gaS5BcHBJZAogICAgICAgICAgIEFORCBhLkFwcFR5cGUgSU4gKE4nUG9ydGFsJywgTidXZWJBcHAnKQogICAgICAgICAgIEFORCBhLkFsbG93TXVsdGlwbGVBY3RpdmVJbnN0YW5jZXMgPSAwCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuQXBwSW5zdGFuY2VzIGV4aXN0aW5nCiAgICAgICAgICAgIE9OIGV4aXN0aW5nLk1vZHVsZUluc3RhbmNlSWQgPSBpLk1vZHVsZUluc3RhbmNlSWQKICAgICAgICAgICBBTkQgZXhpc3RpbmcuQXBwSWQgPSBpLkFwcElkCiAgICAgICAgICAgQU5EIGV4aXN0aW5nLkFwcEluc3RhbmNlSWQgPD4gaS5BcHBJbnN0YW5jZUlkCiAgICAgICAgICAgQU5ECiAgICAgICAgICAgKAogICAgICAgICAgICAgICAoaS5Ib3N0SWQgSVMgTlVMTCBBTkQgaS5UYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOVUxMIEFORCAoZXhpc3RpbmcuSG9zdElkIElTIE5PVCBOVUxMIE9SIGV4aXN0aW5nLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5PVCBOVUxMKSkKICAgICAgICAgICAgICAgT1IgKChpLkhvc3RJZCBJUyBOT1QgTlVMTCBPUiBpLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5PVCBOVUxMKSBBTkQgZXhpc3RpbmcuSG9zdElkIElTIE5VTEwgQU5EIGV4aXN0aW5nLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwpCiAgICAgICAgICAgKQogICAgICAgIFdIRVJFIGkuSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIGkuSXNBbGxvd2VkID0gMQogICAgICAgICAgQU5EIGkuRGVzaXJlZFN0YXRlID0gMQogICAgICAgICAgQU5EIGV4aXN0aW5nLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBleGlzdGluZy5Jc0FsbG93ZWQgPSAxCiAgICAgICAgICBBTkQgZXhpc3RpbmcuRGVzaXJlZFN0YXRlID0gMQogICAgKQogICAgQkVHSU4KICAgICAgICBUSFJPVyA1MTA1MywgJ0RvIG5vdCBtaXggYWN0aXZlIGhvc3QtbmV1dHJhbCBhbmQgdGFyZ2V0ZWQgd2ViIGFwcCBpbnN0YW5jZXMgZm9yIHRoZSBzYW1lIG1vZHVsZSBpbnN0YW5jZSBhbmQgd2ViIGFwcCBkZWZpbml0aW9uLicsIDE7CiAgICBFTkQ7CgogICAgSUYgRVhJU1RTCiAgICAoCiAgICAgICAgU0VMRUNUIDEKICAgICAgICBGUk9NIGluc2VydGVkIGkKICAgICAgICBJTk5FUiBKT0lOIG9tcC5BcHBzIGEKICAgICAgICAgICAgT04gYS5BcHBJZCA9IGkuQXBwSWQKICAgICAgICAgICBBTkQgYS5BcHBUeXBlIElOIChOJ1BvcnRhbCcsIE4nV2ViQXBwJykKICAgICAgICAgICBBTkQgYS5BbGxvd011bHRpcGxlQWN0aXZlSW5zdGFuY2VzID0gMAogICAgICAgIElOTkVSIEpPSU4gb21wLkFwcEluc3RhbmNlcyBleGlzdGluZwogICAgICAgICAgICBPTiBleGlzdGluZy5Nb2R1bGVJbnN0YW5jZUlkID0gaS5Nb2R1bGVJbnN0YW5jZUlkCiAgICAgICAgICAgQU5EIGV4aXN0aW5nLkFwcElkID0gaS5BcHBJZAogICAgICAgICAgIEFORCBleGlzdGluZy5BcHBJbnN0YW5jZUlkIDw+IGkuQXBwSW5zdGFuY2VJZAogICAgICAgIFdIRVJFIGkuSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIGkuSXNBbGxvd2VkID0gMQogICAgICAgICAgQU5EIGkuRGVzaXJlZFN0YXRlID0gMQogICAgICAgICAgQU5EIGV4aXN0aW5nLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBleGlzdGluZy5Jc0FsbG93ZWQgPSAxCiAgICAgICAgICBBTkQgZXhpc3RpbmcuRGVzaXJlZFN0YXRlID0gMQogICAgICAgICAgQU5ECiAgICAgICAgICAoCiAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICBpLkhvc3RJZCBJUyBOT1QgTlVMTAogICAgICAgICAgICAgICAgICBBTkQgZXhpc3RpbmcuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTk9UIE5VTEwKICAgICAgICAgICAgICAgICAgQU5EIEVYSVNUUwogICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgMQogICAgICAgICAgICAgICAgICAgICAgRlJPTSBvbXAuSG9zdERlcGxveW1lbnRBc3NpZ25tZW50cyBoZGEKICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGhkYS5Ib3N0SWQgPSBpLkhvc3RJZAogICAgICAgICAgICAgICAgICAgICAgICBBTkQgaGRhLkhvc3RUZW1wbGF0ZUlkID0gZXhpc3RpbmcuVGFyZ2V0SG9zdFRlbXBsYXRlSWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGhkYS5Jc0FjdGl2ZSA9IDEKICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICkKICAgICAgICAgICAgICBPUgogICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgaS5UYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOT1QgTlVMTAogICAgICAgICAgICAgICAgICBBTkQgZXhpc3RpbmcuSG9zdElkIElTIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgIEFORCBFWElTVFMKICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIDEKICAgICAgICAgICAgICAgICAgICAgIEZST00gb21wLkhvc3REZXBsb3ltZW50QXNzaWdubWVudHMgaGRhCiAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBoZGEuSG9zdElkID0gZXhpc3RpbmcuSG9zdElkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBoZGEuSG9zdFRlbXBsYXRlSWQgPSBpLlRhcmdldEhvc3RUZW1wbGF0ZUlkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBoZGEuSXNBY3RpdmUgPSAxCiAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICApCiAgICAgICAgICApCiAgICApCiAgICBCRUdJTgogICAgICAgIFRIUk9XIDUxMDU5LCAnRG8gbm90IG1peCBhY3RpdmUgaG9zdC1yb2xlIGFuZCBvdmVybGFwcGluZyBob3N0LXNwZWNpZmljIHdlYiBhcHAgaW5zdGFuY2VzIGZvciB0aGUgc2FtZSBtb2R1bGUgaW5zdGFuY2UgYW5kIHdlYiBhcHAgZGVmaW5pdGlvbi4nLCAxOwogICAgRU5EOwpFTkQKR08KCklGIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcyB0YWkKICAgIElOTkVSIEpPSU4gb21wLkFwcHMgYSBPTiBhLkFwcElkID0gdGFpLkFwcElkCiAgICBXSEVSRSB0YWkuSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCBJUyBOT1QgTlVMTAogICAgICBBTkQgdGFpLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwKICAgICAgQU5EIHRhaS5Jc0VuYWJsZWQgPSAxCiAgICAgIEFORCB0YWkuSXNBbGxvd2VkID0gMQogICAgICBBTkQgdGFpLkRlc2lyZWRTdGF0ZSA9IDEKICAgICAgQU5EIGEuQXBwVHlwZSBJTiAoTidQb3J0YWwnLCBOJ1dlYkFwcCcpCiAgICAgIEFORCBhLkFsbG93TXVsdGlwbGVBY3RpdmVJbnN0YW5jZXMgPSAwCiAgICBHUk9VUCBCWSB0YWkuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQsIHRhaS5JbnN0YW5jZVRlbXBsYXRlSG9zdElkLCB0YWkuQXBwSWQKICAgIEhBVklORyBDT1VOVCgxKSA+IDEKKQpCRUdJTgogICAgVEhST1cgNTEwNTQsICdEdXBsaWNhdGUgYWN0aXZlIGhvc3Qtc3BlY2lmaWMgdGVtcGxhdGUgd2ViIGFwcCByb3dzIGV4aXN0LiBLZWVwIG9ubHkgb25lIGFjdGl2ZSBkZXNpcmVkIHJvdyBwZXIgdGVtcGxhdGUgbW9kdWxlLCB3ZWIgYXBwIGRlZmluaXRpb24gYW5kIHRlbXBsYXRlIGhvc3QuJywgMTsKRU5ECkdPCgpJRiBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMgdGFpCiAgICBJTk5FUiBKT0lOIG9tcC5BcHBzIGEgT04gYS5BcHBJZCA9IHRhaS5BcHBJZAogICAgV0hFUkUgdGFpLkluc3RhbmNlVGVtcGxhdGVIb3N0SWQgSVMgTlVMTAogICAgICBBTkQgdGFpLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwKICAgICAgQU5EIHRhaS5Jc0VuYWJsZWQgPSAxCiAgICAgIEFORCB0YWkuSXNBbGxvd2VkID0gMQogICAgICBBTkQgdGFpLkRlc2lyZWRTdGF0ZSA9IDEKICAgICAgQU5EIGEuQXBwVHlwZSBJTiAoTidQb3J0YWwnLCBOJ1dlYkFwcCcpCiAgICAgIEFORCBhLkFsbG93TXVsdGlwbGVBY3RpdmVJbnN0YW5jZXMgPSAwCiAgICBHUk9VUCBCWSB0YWkuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQsIHRhaS5BcHBJZAogICAgSEFWSU5HIENPVU5UKDEpID4gMQopCkJFR0lOCiAgICBUSFJPVyA1MTA1NSwgJ0R1cGxpY2F0ZSBhY3RpdmUgaG9zdC1uZXV0cmFsIHRlbXBsYXRlIHdlYiBhcHAgcm93cyBleGlzdC4gS2VlcCBvbmx5IG9uZSBhY3RpdmUgZGVzaXJlZCBob3N0LW5ldXRyYWwgcm93IHBlciB0ZW1wbGF0ZSBtb2R1bGUgYW5kIHdlYiBhcHAgZGVmaW5pdGlvbi4nLCAxOwpFTkQKR08KCklGIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcyB0YWkKICAgIElOTkVSIEpPSU4gb21wLkFwcHMgYSBPTiBhLkFwcElkID0gdGFpLkFwcElkCiAgICBXSEVSRSB0YWkuSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCBJUyBOVUxMCiAgICAgIEFORCB0YWkuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTk9UIE5VTEwKICAgICAgQU5EIHRhaS5Jc0VuYWJsZWQgPSAxCiAgICAgIEFORCB0YWkuSXNBbGxvd2VkID0gMQogICAgICBBTkQgdGFpLkRlc2lyZWRTdGF0ZSA9IDEKICAgICAgQU5EIGEuQXBwVHlwZSBJTiAoTidQb3J0YWwnLCBOJ1dlYkFwcCcpCiAgICAgIEFORCBhLkFsbG93TXVsdGlwbGVBY3RpdmVJbnN0YW5jZXMgPSAwCiAgICBHUk9VUCBCWSB0YWkuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQsIHRhaS5UYXJnZXRIb3N0VGVtcGxhdGVJZCwgdGFpLkFwcElkCiAgICBIQVZJTkcgQ09VTlQoMSkgPiAxCikKQkVHSU4KICAgIFRIUk9XIDUxMDYwLCAnRHVwbGljYXRlIGFjdGl2ZSBob3N0LXJvbGUgdGVtcGxhdGUgd2ViIGFwcCByb3dzIGV4aXN0LiBLZWVwIG9ubHkgb25lIGFjdGl2ZSBkZXNpcmVkIHJvdyBwZXIgdGVtcGxhdGUgbW9kdWxlLCB3ZWIgYXBwIGRlZmluaXRpb24gYW5kIGhvc3Qgcm9sZS4nLCAxOwpFTkQKR08KCklGIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMnKQogICAgICBBTkQgbmFtZSA9IE4nVVhfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0X0FwcCcKKQpCRUdJTgogICAgRFJPUCBJTkRFWCBVWF9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3RfQXBwIE9OIG9tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzOwpFTkQKR08KCklGIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMnKQogICAgICBBTkQgbmFtZSA9IE4nVVhfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0TmV1dHJhbF9BcHAnCikKQkVHSU4KICAgIERST1AgSU5ERVggVVhfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0TmV1dHJhbF9BcHAgT04gb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXM7CkVORApHTwoKSUYgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcycpCiAgICAgIEFORCBuYW1lID0gTidJWF9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3RfQXBwJwogICAgICBBTkQgSVNOVUxMKGZpbHRlcl9kZWZpbml0aW9uLCBOJycpIE5PVCBMSUtFIE4nJVRhcmdldEhvc3RUZW1wbGF0ZUlkJScKKQpCRUdJTgogICAgRFJPUCBJTkRFWCBJWF9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3RfQXBwIE9OIG9tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzJykKICAgICAgQU5EIG5hbWUgPSBOJ0lYX29tcF9JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzX0FjdGl2ZV9Nb2R1bGVfSG9zdF9BcHAnCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3RfQXBwCiAgICAgICAgT04gb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMoSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQsIEluc3RhbmNlVGVtcGxhdGVIb3N0SWQsIEFwcElkLCBBcHBJbnN0YW5jZUtleSkKICAgICAgICBXSEVSRSBJbnN0YW5jZVRlbXBsYXRlSG9zdElkIElTIE5PVCBOVUxMCiAgICAgICAgICBBTkQgVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTlVMTAogICAgICAgICAgQU5EIElzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBJc0FsbG93ZWQgPSAxCiAgICAgICAgICBBTkQgRGVzaXJlZFN0YXRlID0gMTsKRU5ECkdPCgpJRiBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzJykKICAgICAgQU5EIG5hbWUgPSBOJ0lYX29tcF9JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzX0FjdGl2ZV9Nb2R1bGVfSG9zdE5ldXRyYWxfQXBwJwogICAgICBBTkQgSVNOVUxMKGZpbHRlcl9kZWZpbml0aW9uLCBOJycpIE5PVCBMSUtFIE4nJVRhcmdldEhvc3RUZW1wbGF0ZUlkJScKKQpCRUdJTgogICAgRFJPUCBJTkRFWCBJWF9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3ROZXV0cmFsX0FwcCBPTiBvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlczsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcycpCiAgICAgIEFORCBuYW1lID0gTidJWF9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3RSb2xlX0FwcCcKKQpCRUdJTgogICAgQ1JFQVRFIElOREVYIElYX29tcF9JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzX0FjdGl2ZV9Nb2R1bGVfSG9zdFJvbGVfQXBwCiAgICAgICAgT04gb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMoSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQsIFRhcmdldEhvc3RUZW1wbGF0ZUlkLCBBcHBJZCwgQXBwSW5zdGFuY2VLZXkpCiAgICAgICAgV0hFUkUgVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTk9UIE5VTEwKICAgICAgICAgIEFORCBJc0VuYWJsZWQgPSAxCiAgICAgICAgICBBTkQgSXNBbGxvd2VkID0gMQogICAgICAgICAgQU5EIERlc2lyZWRTdGF0ZSA9IDE7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMnKQogICAgICBBTkQgbmFtZSA9IE4nSVhfb21wX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfQWN0aXZlX01vZHVsZV9Ib3N0TmV1dHJhbF9BcHAnCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19BY3RpdmVfTW9kdWxlX0hvc3ROZXV0cmFsX0FwcAogICAgICAgIE9OIG9tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzKEluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkLCBBcHBJZCwgQXBwSW5zdGFuY2VLZXkpCiAgICAgICAgV0hFUkUgSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCBJUyBOVUxMCiAgICAgICAgICBBTkQgVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTlVMTAogICAgICAgICAgQU5EIElzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBJc0FsbG93ZWQgPSAxCiAgICAgICAgICBBTkQgRGVzaXJlZFN0YXRlID0gMTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuVFJfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19WYWxpZGF0ZUFjdGl2ZVBsYWNlbWVudCcsIE4nVFInKSBJUyBOVUxMCiAgICBFWEVDKE4nQ1JFQVRFIFRSSUdHRVIgb21wLlRSX0luc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXNfVmFsaWRhdGVBY3RpdmVQbGFjZW1lbnQgT04gb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMgQUZURVIgSU5TRVJULCBVUERBVEUgQVMgQkVHSU4gU0VUIE5PQ09VTlQgT047IEVORCcpOwpHTwoKQUxURVIgVFJJR0dFUiBvbXAuVFJfSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlc19WYWxpZGF0ZUFjdGl2ZVBsYWNlbWVudApPTiBvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcwpBRlRFUiBJTlNFUlQsIFVQREFURQpBUwpCRUdJTgogICAgU0VUIE5PQ09VTlQgT047CgogICAgSUYgRVhJU1RTCiAgICAoCiAgICAgICAgU0VMRUNUIDEKICAgICAgICBGUk9NIGluc2VydGVkIGkKICAgICAgICBJTk5FUiBKT0lOIG9tcC5BcHBzIGEKICAgICAgICAgICAgT04gYS5BcHBJZCA9IGkuQXBwSWQKICAgICAgICAgICBBTkQgYS5BcHBUeXBlIElOIChOJ1BvcnRhbCcsIE4nV2ViQXBwJykKICAgICAgICAgICBBTkQgYS5BbGxvd011bHRpcGxlQWN0aXZlSW5zdGFuY2VzID0gMAogICAgICAgIElOTkVSIEpPSU4gb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMgZXhpc3RpbmcKICAgICAgICAgICAgT04gZXhpc3RpbmcuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQgPSBpLkluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkCiAgICAgICAgICAgQU5EIGV4aXN0aW5nLkFwcElkID0gaS5BcHBJZAogICAgICAgICAgIEFORCBleGlzdGluZy5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VJZCA8PiBpLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZUlkCiAgICAgICAgICAgQU5ECiAgICAgICAgICAgKAogICAgICAgICAgICAgICAoaS5JbnN0YW5jZVRlbXBsYXRlSG9zdElkIElTIE5VTEwgQU5EIGkuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTlVMTCBBTkQgZXhpc3RpbmcuSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCBJUyBOVUxMIEFORCBleGlzdGluZy5UYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOVUxMKQogICAgICAgICAgICAgICBPUiAoaS5JbnN0YW5jZVRlbXBsYXRlSG9zdElkIElTIE5PVCBOVUxMIEFORCBleGlzdGluZy5JbnN0YW5jZVRlbXBsYXRlSG9zdElkID0gaS5JbnN0YW5jZVRlbXBsYXRlSG9zdElkKQogICAgICAgICAgICAgICBPUiAoaS5UYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOT1QgTlVMTCBBTkQgZXhpc3RpbmcuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgPSBpLlRhcmdldEhvc3RUZW1wbGF0ZUlkKQogICAgICAgICAgICkKICAgICAgICBXSEVSRSBpLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBpLklzQWxsb3dlZCA9IDEKICAgICAgICAgIEFORCBpLkRlc2lyZWRTdGF0ZSA9IDEKICAgICAgICAgIEFORCBleGlzdGluZy5Jc0VuYWJsZWQgPSAxCiAgICAgICAgICBBTkQgZXhpc3RpbmcuSXNBbGxvd2VkID0gMQogICAgICAgICAgQU5EIGV4aXN0aW5nLkRlc2lyZWRTdGF0ZSA9IDEKICAgICkKICAgIEJFR0lOCiAgICAgICAgVEhST1cgNTEwNTYsICdPbmx5IG9uZSBhY3RpdmUgZGVzaXJlZCB0ZW1wbGF0ZSB3ZWIgYXBwIHJvdyBpcyBhbGxvd2VkIHBlciB0ZW1wbGF0ZSBtb2R1bGUsIHdlYiBhcHAgZGVmaW5pdGlvbiBhbmQgaG9zdCBwbGFjZW1lbnQuJywgMTsKICAgIEVORDsKCiAgICBJRiBFWElTVFMKICAgICgKICAgICAgICBTRUxFQ1QgMQogICAgICAgIEZST00gaW5zZXJ0ZWQgaQogICAgICAgIElOTkVSIEpPSU4gb21wLkFwcHMgYQogICAgICAgICAgICBPTiBhLkFwcElkID0gaS5BcHBJZAogICAgICAgICAgIEFORCBhLkFwcFR5cGUgSU4gKE4nUG9ydGFsJywgTidXZWJBcHAnKQogICAgICAgICAgIEFORCBhLkFsbG93TXVsdGlwbGVBY3RpdmVJbnN0YW5jZXMgPSAwCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlcyBleGlzdGluZwogICAgICAgICAgICBPTiBleGlzdGluZy5JbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VJZCA9IGkuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQKICAgICAgICAgICBBTkQgZXhpc3RpbmcuQXBwSWQgPSBpLkFwcElkCiAgICAgICAgICAgQU5EIGV4aXN0aW5nLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZUlkIDw+IGkuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlSWQKICAgICAgICAgICBBTkQKICAgICAgICAgICAoCiAgICAgICAgICAgICAgIChpLkluc3RhbmNlVGVtcGxhdGVIb3N0SWQgSVMgTlVMTCBBTkQgaS5UYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOVUxMIEFORCAoZXhpc3RpbmcuSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCBJUyBOT1QgTlVMTCBPUiBleGlzdGluZy5UYXJnZXRIb3N0VGVtcGxhdGVJZCBJUyBOT1QgTlVMTCkpCiAgICAgICAgICAgICAgIE9SICgoaS5JbnN0YW5jZVRlbXBsYXRlSG9zdElkIElTIE5PVCBOVUxMIE9SIGkuVGFyZ2V0SG9zdFRlbXBsYXRlSWQgSVMgTk9UIE5VTEwpIEFORCBleGlzdGluZy5JbnN0YW5jZVRlbXBsYXRlSG9zdElkIElTIE5VTEwgQU5EIGV4aXN0aW5nLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwpCiAgICAgICAgICAgKQogICAgICAgIFdIRVJFIGkuSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIGkuSXNBbGxvd2VkID0gMQogICAgICAgICAgQU5EIGkuRGVzaXJlZFN0YXRlID0gMQogICAgICAgICAgQU5EIGV4aXN0aW5nLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBleGlzdGluZy5Jc0FsbG93ZWQgPSAxCiAgICAgICAgICBBTkQgZXhpc3RpbmcuRGVzaXJlZFN0YXRlID0gMQogICAgKQogICAgQkVHSU4KICAgICAgICBUSFJPVyA1MTA1NywgJ0RvIG5vdCBtaXggYWN0aXZlIGhvc3QtbmV1dHJhbCBhbmQgdGFyZ2V0ZWQgdGVtcGxhdGUgd2ViIGFwcCByb3dzIGZvciB0aGUgc2FtZSB0ZW1wbGF0ZSBtb2R1bGUgYW5kIHdlYiBhcHAgZGVmaW5pdGlvbi4nLCAxOwogICAgRU5EOwoKICAgIElGIEVYSVNUUwogICAgKAogICAgICAgIFNFTEVDVCAxCiAgICAgICAgRlJPTSBpbnNlcnRlZCBpCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuQXBwcyBhCiAgICAgICAgICAgIE9OIGEuQXBwSWQgPSBpLkFwcElkCiAgICAgICAgICAgQU5EIGEuQXBwVHlwZSBJTiAoTidQb3J0YWwnLCBOJ1dlYkFwcCcpCiAgICAgICAgICAgQU5EIGEuQWxsb3dNdWx0aXBsZUFjdGl2ZUluc3RhbmNlcyA9IDAKICAgICAgICBJTk5FUiBKT0lOIG9tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzIGV4aXN0aW5nCiAgICAgICAgICAgIE9OIGV4aXN0aW5nLkluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkID0gaS5JbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VJZAogICAgICAgICAgIEFORCBleGlzdGluZy5BcHBJZCA9IGkuQXBwSWQKICAgICAgICAgICBBTkQgZXhpc3RpbmcuSW5zdGFuY2VUZW1wbGF0ZUFwcEluc3RhbmNlSWQgPD4gaS5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VJZAogICAgICAgIFdIRVJFIGkuSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIGkuSXNBbGxvd2VkID0gMQogICAgICAgICAgQU5EIGkuRGVzaXJlZFN0YXRlID0gMQogICAgICAgICAgQU5EIGV4aXN0aW5nLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBleGlzdGluZy5Jc0FsbG93ZWQgPSAxCiAgICAgICAgICBBTkQgZXhpc3RpbmcuRGVzaXJlZFN0YXRlID0gMQogICAgICAgICAgQU5ECiAgICAgICAgICAoCiAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICBpLkluc3RhbmNlVGVtcGxhdGVIb3N0SWQgSVMgTk9UIE5VTEwKICAgICAgICAgICAgICAgICAgQU5EIGV4aXN0aW5nLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgIEFORCBFWElTVFMKICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIDEKICAgICAgICAgICAgICAgICAgICAgIEZST00gb21wLkluc3RhbmNlVGVtcGxhdGVIb3N0cyBpdGgKICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGl0aC5JbnN0YW5jZVRlbXBsYXRlSG9zdElkID0gaS5JbnN0YW5jZVRlbXBsYXRlSG9zdElkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBpdGguSG9zdFRlbXBsYXRlSWQgPSBleGlzdGluZy5UYXJnZXRIb3N0VGVtcGxhdGVJZAogICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgKQogICAgICAgICAgICAgIE9SCiAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICBpLlRhcmdldEhvc3RUZW1wbGF0ZUlkIElTIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgIEFORCBleGlzdGluZy5JbnN0YW5jZVRlbXBsYXRlSG9zdElkIElTIE5PVCBOVUxMCiAgICAgICAgICAgICAgICAgIEFORCBFWElTVFMKICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIDEKICAgICAgICAgICAgICAgICAgICAgIEZST00gb21wLkluc3RhbmNlVGVtcGxhdGVIb3N0cyBpdGgKICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGl0aC5JbnN0YW5jZVRlbXBsYXRlSG9zdElkID0gZXhpc3RpbmcuSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZAogICAgICAgICAgICAgICAgICAgICAgICBBTkQgaXRoLkhvc3RUZW1wbGF0ZUlkID0gaS5UYXJnZXRIb3N0VGVtcGxhdGVJZAogICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgKQogICAgICAgICAgKQogICAgKQogICAgQkVHSU4KICAgICAgICBUSFJPVyA1MTA2MSwgJ0RvIG5vdCBtaXggYWN0aXZlIGhvc3Qtcm9sZSBhbmQgb3ZlcmxhcHBpbmcgaG9zdC1zcGVjaWZpYyB0ZW1wbGF0ZSB3ZWIgYXBwIHJvd3MgZm9yIHRoZSBzYW1lIHRlbXBsYXRlIG1vZHVsZSBhbmQgd2ViIGFwcCBkZWZpbml0aW9uLicsIDE7CiAgICBFTkQ7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLkhvc3REZXBsb3ltZW50cycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuSG9zdERlcGxveW1lbnRzCiAgICAoCiAgICAgICAgSG9zdERlcGxveW1lbnRJZCBiaWdpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCBQUklNQVJZIEtFWSwKICAgICAgICBIb3N0SWQgdW5pcXVlaWRlbnRpZmllciBOT1QgTlVMTCwKICAgICAgICBIb3N0VGVtcGxhdGVJZCBpbnQgTlVMTCwKICAgICAgICBSZXF1ZXN0ZWRCeSBudmFyY2hhcigyNTYpIE5VTEwsCiAgICAgICAgUmVxdWVzdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0RGVwbG95bWVudHNfUmVxdWVzdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBTdGFydGVkVXRjIGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIENvbXBsZXRlZFV0YyBkYXRldGltZTIoMykgTlVMTCwKICAgICAgICBTdGF0dXMgdGlueWludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0RGVwbG95bWVudHNfU3RhdHVzIERFRkFVTFQoMCksCiAgICAgICAgT3V0Y29tZU1lc3NhZ2UgbnZhcmNoYXIobWF4KSBOVUxMLAogICAgICAgIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX0hvc3REZXBsb3ltZW50c19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9Ib3N0RGVwbG95bWVudHNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfSG9zdERlcGxveW1lbnRzX0hvc3QgRk9SRUlHTiBLRVkoSG9zdElkKSBSRUZFUkVOQ0VTIG9tcC5Ib3N0cyhIb3N0SWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX0hvc3REZXBsb3ltZW50c19Ib3N0VGVtcGxhdGUgRk9SRUlHTiBLRVkoSG9zdFRlbXBsYXRlSWQpIFJFRkVSRU5DRVMgb21wLkhvc3RUZW1wbGF0ZXMoSG9zdFRlbXBsYXRlSWQpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5NYXRlcmlhbGl6ZUluc3RhbmNlVGVtcGxhdGUnLCBOJ1AnKSBJUyBOVUxMCiAgICBFWEVDKE4nQ1JFQVRFIFBST0NFRFVSRSBvbXAuTWF0ZXJpYWxpemVJbnN0YW5jZVRlbXBsYXRlIEFTIEJFR0lOIFNFVCBOT0NPVU5UIE9OOyBFTkQnKTsKR08KCkFMVEVSIFBST0NFRFVSRSBvbXAuTWF0ZXJpYWxpemVJbnN0YW5jZVRlbXBsYXRlCiAgICBASW5zdGFuY2VLZXkgbnZhcmNoYXIoMTAwKSA9IE5VTEwsCiAgICBASG9zdEtleSBudmFyY2hhcigxMjgpID0gTlVMTCwKICAgIEBIb3N0VGVtcGxhdGVJZCBpbnQgPSBOVUxMLAogICAgQFJlcXVlc3RlZEJ5IG52YXJjaGFyKDI1NikgPSBOVUxMCkFTCkJFR0lOCiAgICBTRVQgTk9DT1VOVCBPTjsKICAgIFNFVCBYQUNUX0FCT1JUIE9OOwoKICAgIFNFVCBASW5zdGFuY2VLZXkgPSBOVUxMSUYoTFRSSU0oUlRSSU0oQEluc3RhbmNlS2V5KSksIE4nJyk7CiAgICBTRVQgQEhvc3RLZXkgPSBOVUxMSUYoTFRSSU0oUlRSSU0oQEhvc3RLZXkpKSwgTicnKTsKICAgIFNFVCBAUmVxdWVzdGVkQnkgPSBOVUxMSUYoTFRSSU0oUlRSSU0oQFJlcXVlc3RlZEJ5KSksIE4nJyk7CgogICAgREVDTEFSRSBATW9kdWxlQWN0aW9ucyBUQUJMRShBY3Rpb25OYW1lIG52YXJjaGFyKDEwKSBOT1QgTlVMTCk7CiAgICBERUNMQVJFIEBBcHBBY3Rpb25zIFRBQkxFKEFjdGlvbk5hbWUgbnZhcmNoYXIoMTApIE5PVCBOVUxMKTsKCiAgICBJRiBASG9zdEtleSBJUyBOT1QgTlVMTAogICAgICAgQU5EIE5PVCBFWElTVFMKICAgICAgICgKICAgICAgICAgICBTRUxFQ1QgMQogICAgICAgICAgIEZST00gb21wLkhvc3RzIGgKICAgICAgICAgICBJTk5FUiBKT0lOIG9tcC5JbnN0YW5jZXMgaSBPTiBpLkluc3RhbmNlSWQgPSBoLkluc3RhbmNlSWQKICAgICAgICAgICBXSEVSRSBoLkhvc3RLZXkgPSBASG9zdEtleQogICAgICAgICAgICAgQU5EIGguSXNFbmFibGVkID0gMQogICAgICAgICAgICAgQU5EIGkuSXNFbmFibGVkID0gMQogICAgICAgICAgICAgQU5EIChASW5zdGFuY2VLZXkgSVMgTlVMTCBPUiBpLkluc3RhbmNlS2V5ID0gQEluc3RhbmNlS2V5KQogICAgICAgKQogICAgQkVHSU4KICAgICAgICBUSFJPVyA1MTAzMCwgJ1RlbXBsYXRlIG1hdGVyaWFsaXphdGlvbiBob3N0IHdhcyBub3QgZm91bmQgb3IgaXMgZGlzYWJsZWQuJywgMTsKICAgIEVORDsKCiAgICBJRiBASG9zdEtleSBJUyBOT1QgTlVMTAogICAgICAgQU5EIEBIb3N0VGVtcGxhdGVJZCBJUyBOT1QgTlVMTAogICAgICAgQU5EIE5PVCBFWElTVFMKICAgICAgICgKICAgICAgICAgICBTRUxFQ1QgMQogICAgICAgICAgIEZST00gb21wLkhvc3RzIGgKICAgICAgICAgICBJTk5FUiBKT0lOIG9tcC5Ib3N0RGVwbG95bWVudEFzc2lnbm1lbnRzIGhkYQogICAgICAgICAgICAgICBPTiBoZGEuSG9zdElkID0gaC5Ib3N0SWQKICAgICAgICAgICAgICBBTkQgaGRhLkhvc3RUZW1wbGF0ZUlkID0gQEhvc3RUZW1wbGF0ZUlkCiAgICAgICAgICAgICAgQU5EIGhkYS5Jc0FjdGl2ZSA9IDEKICAgICAgICAgICBXSEVSRSBoLkhvc3RLZXkgPSBASG9zdEtleQogICAgICAgICAgICAgQU5EIGguSXNFbmFibGVkID0gMQogICAgICAgKQogICAgQkVHSU4KICAgICAgICBUSFJPVyA1MTAzMSwgJ1RlbXBsYXRlIG1hdGVyaWFsaXphdGlvbiBob3N0IGRvZXMgbm90IGhhdmUgdGhlIHJlcXVlc3RlZCBhY3RpdmUgaG9zdCB0ZW1wbGF0ZSBhc3NpZ25tZW50LicsIDE7CiAgICBFTkQ7CgogICAgO1dJVEggU291cmNlTW9kdWxlcyBBUwogICAgKAogICAgICAgIFNFTEVDVAogICAgICAgICAgICBpLkluc3RhbmNlSWQsCiAgICAgICAgICAgIHRtaS5Nb2R1bGVJZCwKICAgICAgICAgICAgdG1pLk1vZHVsZUluc3RhbmNlS2V5LAogICAgICAgICAgICB0bWkuRGlzcGxheU5hbWUsCiAgICAgICAgICAgIHRtaS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgdG1pLlNvcnRPcmRlcgogICAgICAgIEZST00gb21wLkluc3RhbmNlcyBpCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuSW5zdGFuY2VUZW1wbGF0ZXMgaXQgT04gaXQuSW5zdGFuY2VUZW1wbGF0ZUlkID0gaS5JbnN0YW5jZVRlbXBsYXRlSWQKICAgICAgICBJTk5FUiBKT0lOIG9tcC5JbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VzIHRtaSBPTiB0bWkuSW5zdGFuY2VUZW1wbGF0ZUlkID0gaXQuSW5zdGFuY2VUZW1wbGF0ZUlkCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuTW9kdWxlcyBtIE9OIG0uTW9kdWxlSWQgPSB0bWkuTW9kdWxlSWQKICAgICAgICBXSEVSRSBpLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBpdC5Jc0VuYWJsZWQgPSAxCiAgICAgICAgICBBTkQgdG1pLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBtLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCAoQEluc3RhbmNlS2V5IElTIE5VTEwgT1IgaS5JbnN0YW5jZUtleSA9IEBJbnN0YW5jZUtleSkKICAgICAgICAgIEFORAogICAgICAgICAgKAogICAgICAgICAgICAgIEBIb3N0S2V5IElTIE5VTEwKICAgICAgICAgICAgICBPUiBFWElTVFMKICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgIFNFTEVDVCAxCiAgICAgICAgICAgICAgICAgIEZST00gb21wLkhvc3RzIGgKICAgICAgICAgICAgICAgICAgV0hFUkUgaC5JbnN0YW5jZUlkID0gaS5JbnN0YW5jZUlkCiAgICAgICAgICAgICAgICAgICAgQU5EIGguSG9zdEtleSA9IEBIb3N0S2V5CiAgICAgICAgICAgICAgICAgICAgQU5EIGguSXNFbmFibGVkID0gMQogICAgICAgICAgICAgICkKICAgICAgICAgICkKICAgICkKICAgIE1FUkdFIG9tcC5Nb2R1bGVJbnN0YW5jZXMgQVMgdGFyZ2V0CiAgICBVU0lORyBTb3VyY2VNb2R1bGVzIEFTIHNvdXJjZQogICAgT04gdGFyZ2V0Lkluc3RhbmNlSWQgPSBzb3VyY2UuSW5zdGFuY2VJZAogICAgQU5EIHRhcmdldC5Nb2R1bGVJbnN0YW5jZUtleSA9IHNvdXJjZS5Nb2R1bGVJbnN0YW5jZUtleQogICAgV0hFTiBNQVRDSEVEIEFORAogICAgKAogICAgICAgIHRhcmdldC5Nb2R1bGVJZCA8PiBzb3VyY2UuTW9kdWxlSWQKICAgICAgICBPUiB0YXJnZXQuRGlzcGxheU5hbWUgPD4gc291cmNlLkRpc3BsYXlOYW1lCiAgICAgICAgT1IgSVNOVUxMKHRhcmdldC5EZXNjcmlwdGlvbiwgTicnKSA8PiBJU05VTEwoc291cmNlLkRlc2NyaXB0aW9uLCBOJycpCiAgICAgICAgT1IgdGFyZ2V0LklzRW5hYmxlZCA8PiBDT05WRVJUKGJpdCwgMSkKICAgICAgICBPUiB0YXJnZXQuU29ydE9yZGVyIDw+IHNvdXJjZS5Tb3J0T3JkZXIKICAgICkgVEhFTgogICAgICAgIFVQREFURSBTRVQgTW9kdWxlSWQgPSBzb3VyY2UuTW9kdWxlSWQsCiAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9IHNvdXJjZS5EaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0gc291cmNlLkRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgSXNFbmFibGVkID0gMSwKICAgICAgICAgICAgICAgICAgIFNvcnRPcmRlciA9IHNvdXJjZS5Tb3J0T3JkZXIsCiAgICAgICAgICAgICAgICAgICBVcGRhdGVkVXRjID0gU1lTVVRDREFURVRJTUUoKQogICAgV0hFTiBOT1QgTUFUQ0hFRCBUSEVOCiAgICAgICAgSU5TRVJUKE1vZHVsZUluc3RhbmNlSWQsIEluc3RhbmNlSWQsIE1vZHVsZUlkLCBNb2R1bGVJbnN0YW5jZUtleSwgRGlzcGxheU5hbWUsIERlc2NyaXB0aW9uLCBJc0VuYWJsZWQsIFNvcnRPcmRlcikKICAgICAgICBWQUxVRVMoTkVXSUQoKSwgc291cmNlLkluc3RhbmNlSWQsIHNvdXJjZS5Nb2R1bGVJZCwgc291cmNlLk1vZHVsZUluc3RhbmNlS2V5LCBzb3VyY2UuRGlzcGxheU5hbWUsIHNvdXJjZS5EZXNjcmlwdGlvbiwgMSwgc291cmNlLlNvcnRPcmRlcikKICAgIE9VVFBVVCAkYWN0aW9uIElOVE8gQE1vZHVsZUFjdGlvbnMoQWN0aW9uTmFtZSk7CgogICAgO1dJVEggQ29uY3JldGVNb2R1bGVzIEFTCiAgICAoCiAgICAgICAgU0VMRUNUCiAgICAgICAgICAgIGkuSW5zdGFuY2VJZCwKICAgICAgICAgICAgdG1pLkluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkLAogICAgICAgICAgICBtaS5Nb2R1bGVJbnN0YW5jZUlkCiAgICAgICAgRlJPTSBvbXAuSW5zdGFuY2VzIGkKICAgICAgICBJTk5FUiBKT0lOIG9tcC5JbnN0YW5jZVRlbXBsYXRlcyBpdCBPTiBpdC5JbnN0YW5jZVRlbXBsYXRlSWQgPSBpLkluc3RhbmNlVGVtcGxhdGVJZAogICAgICAgIElOTkVSIEpPSU4gb21wLkluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZXMgdG1pIE9OIHRtaS5JbnN0YW5jZVRlbXBsYXRlSWQgPSBpdC5JbnN0YW5jZVRlbXBsYXRlSWQKICAgICAgICBJTk5FUiBKT0lOIG9tcC5Nb2R1bGVJbnN0YW5jZXMgbWkKICAgICAgICAgICAgT04gbWkuSW5zdGFuY2VJZCA9IGkuSW5zdGFuY2VJZAogICAgICAgICAgIEFORCBtaS5Nb2R1bGVJbnN0YW5jZUtleSA9IHRtaS5Nb2R1bGVJbnN0YW5jZUtleQogICAgICAgIFdIRVJFIGkuSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIGl0LklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCB0bWkuSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIG1pLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCAoQEluc3RhbmNlS2V5IElTIE5VTEwgT1IgaS5JbnN0YW5jZUtleSA9IEBJbnN0YW5jZUtleSkKICAgICksCiAgICBIb3N0TWFwIEFTCiAgICAoCiAgICAgICAgU0VMRUNUCiAgICAgICAgICAgIGkuSW5zdGFuY2VJZCwKICAgICAgICAgICAgaXRoLkluc3RhbmNlVGVtcGxhdGVIb3N0SWQsCiAgICAgICAgICAgIGl0aC5Ib3N0VGVtcGxhdGVJZCwKICAgICAgICAgICAgaC5Ib3N0SWQKICAgICAgICBGUk9NIG9tcC5JbnN0YW5jZXMgaQogICAgICAgIElOTkVSIEpPSU4gb21wLkluc3RhbmNlVGVtcGxhdGVzIGl0IE9OIGl0Lkluc3RhbmNlVGVtcGxhdGVJZCA9IGkuSW5zdGFuY2VUZW1wbGF0ZUlkCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuSW5zdGFuY2VUZW1wbGF0ZUhvc3RzIGl0aCBPTiBpdGguSW5zdGFuY2VUZW1wbGF0ZUlkID0gaXQuSW5zdGFuY2VUZW1wbGF0ZUlkCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuSG9zdHMgaAogICAgICAgICAgICBPTiBoLkluc3RhbmNlSWQgPSBpLkluc3RhbmNlSWQKICAgICAgICAgICBBTkQgaC5Ib3N0S2V5ID0gaXRoLkhvc3RLZXkKICAgICAgICBJTk5FUiBKT0lOIG9tcC5Ib3N0RGVwbG95bWVudEFzc2lnbm1lbnRzIGhkYQogICAgICAgICAgICBPTiBoZGEuSG9zdElkID0gaC5Ib3N0SWQKICAgICAgICAgICBBTkQgaGRhLkhvc3RUZW1wbGF0ZUlkID0gaXRoLkhvc3RUZW1wbGF0ZUlkCiAgICAgICAgICAgQU5EIGhkYS5Jc0FjdGl2ZSA9IDEKICAgICAgICBXSEVSRSBpLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBpdC5Jc0VuYWJsZWQgPSAxCiAgICAgICAgICBBTkQgaXRoLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCBoLklzRW5hYmxlZCA9IDEKICAgICAgICAgIEFORCAoQEluc3RhbmNlS2V5IElTIE5VTEwgT1IgaS5JbnN0YW5jZUtleSA9IEBJbnN0YW5jZUtleSkKICAgICAgICAgIEFORCAoQEhvc3RLZXkgSVMgTlVMTCBPUiBoLkhvc3RLZXkgPSBASG9zdEtleSkKICAgICAgICAgIEFORCAoQEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwgT1IgaXRoLkhvc3RUZW1wbGF0ZUlkID0gQEhvc3RUZW1wbGF0ZUlkKQogICAgKSwKICAgIFNvdXJjZUFwcHMgQVMKICAgICgKICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgY20uTW9kdWxlSW5zdGFuY2VJZCwKICAgICAgICAgICAgaG0uSG9zdElkLAogICAgICAgICAgICB0YWkuVGFyZ2V0SG9zdFRlbXBsYXRlSWQsCiAgICAgICAgICAgIHRhaS5BcHBJZCwKICAgICAgICAgICAgdGFpLkFwcEluc3RhbmNlS2V5LAogICAgICAgICAgICB0YWkuRGlzcGxheU5hbWUsCiAgICAgICAgICAgIHRhaS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgdGFpLlJvdXRlUGF0aCwKICAgICAgICAgICAgdGFpLlB1YmxpY1VybCwKICAgICAgICAgICAgdGFpLkluc3RhbGxQYXRoLAogICAgICAgICAgICB0YWkuSW5zdGFsbGF0aW9uTmFtZSwKICAgICAgICAgICAgdGFpLkRlc2lyZWRBcnRpZmFjdElkIEFTIEFydGlmYWN0SWQsCiAgICAgICAgICAgIHRhaS5EZXNpcmVkQ29uZmlnSWQgQVMgQ29uZmlnSWQsCiAgICAgICAgICAgIHRhaS5FeHBlY3RlZExvZ2luLAogICAgICAgICAgICB0YWkuRXhwZWN0ZWRDbGllbnRIb3N0TmFtZSwKICAgICAgICAgICAgdGFpLkV4cGVjdGVkQ2xpZW50SXAsCiAgICAgICAgICAgIHRhaS5EZXNpcmVkU3RhdGUsCiAgICAgICAgICAgIHRhaS5Tb3J0T3JkZXIsCiAgICAgICAgICAgIHRhaS5Jc0VuYWJsZWQsCiAgICAgICAgICAgIHRhaS5Jc0FsbG93ZWQKICAgICAgICBGUk9NIG9tcC5JbnN0YW5jZVRlbXBsYXRlQXBwSW5zdGFuY2VzIHRhaQogICAgICAgIElOTkVSIEpPSU4gQ29uY3JldGVNb2R1bGVzIGNtCiAgICAgICAgICAgIE9OIGNtLkluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkID0gdGFpLkluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkCiAgICAgICAgSU5ORVIgSk9JTiBvbXAuQXBwcyBhIE9OIGEuQXBwSWQgPSB0YWkuQXBwSWQKICAgICAgICBMRUZUIEpPSU4gSG9zdE1hcCBobQogICAgICAgICAgICBPTiBobS5JbnN0YW5jZUlkID0gY20uSW5zdGFuY2VJZAogICAgICAgICAgIEFORCBobS5JbnN0YW5jZVRlbXBsYXRlSG9zdElkID0gdGFpLkluc3RhbmNlVGVtcGxhdGVIb3N0SWQKICAgICAgICBXSEVSRSB0YWkuSXNFbmFibGVkID0gMQogICAgICAgICAgQU5EIGEuSXNFbmFibGVkID0gMQogICAgICAgICAgLS0gSG9zdC1uZXV0cmFsIGFuZCBob3N0LXJvbGUgdGVtcGxhdGUgYXBwcyBhcmUgbG9naWNhbCBkZXNpcmVkIGFwcCByb3dzLgogICAgICAgICAgLS0gVGhleSBtdXN0IG1hdGVyaWFsaXplIGV2ZW4gd2hlbiBhIEhvc3RBZ2VudCByZXF1ZXN0cyBvbmx5IHRoZQogICAgICAgICAgLS0gY29uY3JldGUgaG9zdCBpdCBpcyBjdXJyZW50bHkgbWFuYWdpbmcuIEhvc3RBZ2VudCBsYXRlciBjaGVja3MgdGhlCiAgICAgICAgICAtLSBjdXJyZW50IGhvc3QncyBhY3RpdmUgcm9sZSBhc3NpZ25tZW50IGJlZm9yZSBkZXBsb3ltZW50LgogICAgICAgICAgQU5ECiAgICAgICAgICAoCiAgICAgICAgICAgICAgdGFpLkluc3RhbmNlVGVtcGxhdGVIb3N0SWQgSVMgTlVMTAogICAgICAgICAgICAgIE9SIGhtLkhvc3RJZCBJUyBOT1QgTlVMTAogICAgICAgICAgKQogICAgKQogICAgTUVSR0Ugb21wLkFwcEluc3RhbmNlcyBBUyB0YXJnZXQKICAgIFVTSU5HIFNvdXJjZUFwcHMgQVMgc291cmNlCiAgICBPTiB0YXJnZXQuTW9kdWxlSW5zdGFuY2VJZCA9IHNvdXJjZS5Nb2R1bGVJbnN0YW5jZUlkCiAgICBBTkQgdGFyZ2V0LkFwcEluc3RhbmNlS2V5ID0gc291cmNlLkFwcEluc3RhbmNlS2V5CiAgICBXSEVOIE1BVENIRUQgQU5ECiAgICAoCiAgICAgICAgSVNOVUxMKHRhcmdldC5Ib3N0SWQsICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnKSA8PiBJU05VTEwoc291cmNlLkhvc3RJZCwgJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcpCiAgICAgICAgT1IgSVNOVUxMKHRhcmdldC5UYXJnZXRIb3N0VGVtcGxhdGVJZCwgLTEpIDw+IElTTlVMTChzb3VyY2UuVGFyZ2V0SG9zdFRlbXBsYXRlSWQsIC0xKQogICAgICAgIE9SIHRhcmdldC5BcHBJZCA8PiBzb3VyY2UuQXBwSWQKICAgICAgICBPUiB0YXJnZXQuRGlzcGxheU5hbWUgPD4gc291cmNlLkRpc3BsYXlOYW1lCiAgICAgICAgT1IgSVNOVUxMKHRhcmdldC5EZXNjcmlwdGlvbiwgTicnKSA8PiBJU05VTEwoc291cmNlLkRlc2NyaXB0aW9uLCBOJycpCiAgICAgICAgT1IgSVNOVUxMKHRhcmdldC5Sb3V0ZVBhdGgsIE4nJykgPD4gSVNOVUxMKHNvdXJjZS5Sb3V0ZVBhdGgsIE4nJykKICAgICAgICBPUiBJU05VTEwodGFyZ2V0LlB1YmxpY1VybCwgTicnKSA8PiBJU05VTEwoc291cmNlLlB1YmxpY1VybCwgTicnKQogICAgICAgIE9SIElTTlVMTCh0YXJnZXQuSW5zdGFsbFBhdGgsIE4nJykgPD4gSVNOVUxMKHNvdXJjZS5JbnN0YWxsUGF0aCwgTicnKQogICAgICAgIE9SIElTTlVMTCh0YXJnZXQuSW5zdGFsbGF0aW9uTmFtZSwgTicnKSA8PiBJU05VTEwoc291cmNlLkluc3RhbGxhdGlvbk5hbWUsIE4nJykKICAgICAgICBPUiBJU05VTEwodGFyZ2V0LkFydGlmYWN0SWQsIC0xKSA8PiBJU05VTEwoc291cmNlLkFydGlmYWN0SWQsIC0xKQogICAgICAgIE9SIElTTlVMTCh0YXJnZXQuQ29uZmlnSWQsIC0xKSA8PiBJU05VTEwoc291cmNlLkNvbmZpZ0lkLCAtMSkKICAgICAgICBPUiBJU05VTEwodGFyZ2V0LkV4cGVjdGVkTG9naW4sIE4nJykgPD4gSVNOVUxMKHNvdXJjZS5FeHBlY3RlZExvZ2luLCBOJycpCiAgICAgICAgT1IgSVNOVUxMKHRhcmdldC5FeHBlY3RlZENsaWVudEhvc3ROYW1lLCBOJycpIDw+IElTTlVMTChzb3VyY2UuRXhwZWN0ZWRDbGllbnRIb3N0TmFtZSwgTicnKQogICAgICAgIE9SIElTTlVMTCh0YXJnZXQuRXhwZWN0ZWRDbGllbnRJcCwgTicnKSA8PiBJU05VTEwoc291cmNlLkV4cGVjdGVkQ2xpZW50SXAsIE4nJykKICAgICAgICBPUiB0YXJnZXQuSXNFbmFibGVkIDw+IHNvdXJjZS5Jc0VuYWJsZWQKICAgICAgICBPUiB0YXJnZXQuSXNBbGxvd2VkIDw+IHNvdXJjZS5Jc0FsbG93ZWQKICAgICAgICBPUiB0YXJnZXQuRGVzaXJlZFN0YXRlIDw+IHNvdXJjZS5EZXNpcmVkU3RhdGUKICAgICAgICBPUiB0YXJnZXQuU29ydE9yZGVyIDw+IHNvdXJjZS5Tb3J0T3JkZXIKICAgICkgVEhFTgogICAgICAgIFVQREFURSBTRVQgSG9zdElkID0gc291cmNlLkhvc3RJZCwKICAgICAgICAgICAgICAgICAgIFRhcmdldEhvc3RUZW1wbGF0ZUlkID0gc291cmNlLlRhcmdldEhvc3RUZW1wbGF0ZUlkLAogICAgICAgICAgICAgICAgICAgQXBwSWQgPSBzb3VyY2UuQXBwSWQsCiAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9IHNvdXJjZS5EaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0gc291cmNlLkRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgUm91dGVQYXRoID0gc291cmNlLlJvdXRlUGF0aCwKICAgICAgICAgICAgICAgICAgIFB1YmxpY1VybCA9IHNvdXJjZS5QdWJsaWNVcmwsCiAgICAgICAgICAgICAgICAgICBJbnN0YWxsUGF0aCA9IHNvdXJjZS5JbnN0YWxsUGF0aCwKICAgICAgICAgICAgICAgICAgIEluc3RhbGxhdGlvbk5hbWUgPSBzb3VyY2UuSW5zdGFsbGF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgIEFydGlmYWN0SWQgPSBzb3VyY2UuQXJ0aWZhY3RJZCwKICAgICAgICAgICAgICAgICAgIENvbmZpZ0lkID0gc291cmNlLkNvbmZpZ0lkLAogICAgICAgICAgICAgICAgICAgRXhwZWN0ZWRMb2dpbiA9IHNvdXJjZS5FeHBlY3RlZExvZ2luLAogICAgICAgICAgICAgICAgICAgRXhwZWN0ZWRDbGllbnRIb3N0TmFtZSA9IHNvdXJjZS5FeHBlY3RlZENsaWVudEhvc3ROYW1lLAogICAgICAgICAgICAgICAgICAgRXhwZWN0ZWRDbGllbnRJcCA9IHNvdXJjZS5FeHBlY3RlZENsaWVudElwLAogICAgICAgICAgICAgICAgICAgSXNFbmFibGVkID0gc291cmNlLklzRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgIElzQWxsb3dlZCA9IHNvdXJjZS5Jc0FsbG93ZWQsCiAgICAgICAgICAgICAgICAgICBEZXNpcmVkU3RhdGUgPSBzb3VyY2UuRGVzaXJlZFN0YXRlLAogICAgICAgICAgICAgICAgICAgU29ydE9yZGVyID0gc291cmNlLlNvcnRPcmRlciwKICAgICAgICAgICAgICAgICAgIFVwZGF0ZWRVdGMgPSBTWVNVVENEQVRFVElNRSgpCiAgICBXSEVOIE5PVCBNQVRDSEVEIFRIRU4KICAgICAgICBJTlNFUlQoCiAgICAgICAgICAgIEFwcEluc3RhbmNlSWQsCiAgICAgICAgICAgIE1vZHVsZUluc3RhbmNlSWQsCiAgICAgICAgICAgIEhvc3RJZCwKICAgICAgICAgICAgVGFyZ2V0SG9zdFRlbXBsYXRlSWQsCiAgICAgICAgICAgIEFwcElkLAogICAgICAgICAgICBBcHBJbnN0YW5jZUtleSwKICAgICAgICAgICAgRGlzcGxheU5hbWUsCiAgICAgICAgICAgIERlc2NyaXB0aW9uLAogICAgICAgICAgICBSb3V0ZVBhdGgsCiAgICAgICAgICAgIFB1YmxpY1VybCwKICAgICAgICAgICAgSW5zdGFsbFBhdGgsCiAgICAgICAgICAgIEluc3RhbGxhdGlvbk5hbWUsCiAgICAgICAgICAgIEFydGlmYWN0SWQsCiAgICAgICAgICAgIENvbmZpZ0lkLAogICAgICAgICAgICBFeHBlY3RlZExvZ2luLAogICAgICAgICAgICBFeHBlY3RlZENsaWVudEhvc3ROYW1lLAogICAgICAgICAgICBFeHBlY3RlZENsaWVudElwLAogICAgICAgICAgICBJc0VuYWJsZWQsCiAgICAgICAgICAgIElzQWxsb3dlZCwKICAgICAgICAgICAgRGVzaXJlZFN0YXRlLAogICAgICAgICAgICBTb3J0T3JkZXIpCiAgICAgICAgVkFMVUVTKAogICAgICAgICAgICBORVdJRCgpLAogICAgICAgICAgICBzb3VyY2UuTW9kdWxlSW5zdGFuY2VJZCwKICAgICAgICAgICAgc291cmNlLkhvc3RJZCwKICAgICAgICAgICAgc291cmNlLlRhcmdldEhvc3RUZW1wbGF0ZUlkLAogICAgICAgICAgICBzb3VyY2UuQXBwSWQsCiAgICAgICAgICAgIHNvdXJjZS5BcHBJbnN0YW5jZUtleSwKICAgICAgICAgICAgc291cmNlLkRpc3BsYXlOYW1lLAogICAgICAgICAgICBzb3VyY2UuRGVzY3JpcHRpb24sCiAgICAgICAgICAgIHNvdXJjZS5Sb3V0ZVBhdGgsCiAgICAgICAgICAgIHNvdXJjZS5QdWJsaWNVcmwsCiAgICAgICAgICAgIHNvdXJjZS5JbnN0YWxsUGF0aCwKICAgICAgICAgICAgc291cmNlLkluc3RhbGxhdGlvbk5hbWUsCiAgICAgICAgICAgIHNvdXJjZS5BcnRpZmFjdElkLAogICAgICAgICAgICBzb3VyY2UuQ29uZmlnSWQsCiAgICAgICAgICAgIHNvdXJjZS5FeHBlY3RlZExvZ2luLAogICAgICAgICAgICBzb3VyY2UuRXhwZWN0ZWRDbGllbnRIb3N0TmFtZSwKICAgICAgICAgICAgc291cmNlLkV4cGVjdGVkQ2xpZW50SXAsCiAgICAgICAgICAgIHNvdXJjZS5Jc0VuYWJsZWQsCiAgICAgICAgICAgIHNvdXJjZS5Jc0FsbG93ZWQsCiAgICAgICAgICAgIHNvdXJjZS5EZXNpcmVkU3RhdGUsCiAgICAgICAgICAgIHNvdXJjZS5Tb3J0T3JkZXIpCiAgICBPVVRQVVQgJGFjdGlvbiBJTlRPIEBBcHBBY3Rpb25zKEFjdGlvbk5hbWUpOwoKICAgIFNFTEVDVAogICAgICAgIENBU1QoKFNFTEVDVCBDT1VOVCgxKSBGUk9NIEBNb2R1bGVBY3Rpb25zKSBBUyBpbnQpIEFTIE1vZHVsZUluc3RhbmNlQ2hhbmdlcywKICAgICAgICBDQVNUKChTRUxFQ1QgQ09VTlQoMSkgRlJPTSBAQXBwQWN0aW9ucykgQVMgaW50KSBBUyBBcHBJbnN0YW5jZUNoYW5nZXMsCiAgICAgICAgQEluc3RhbmNlS2V5IEFTIEluc3RhbmNlS2V5LAogICAgICAgIEBIb3N0S2V5IEFTIEhvc3RLZXksCiAgICAgICAgQFJlcXVlc3RlZEJ5IEFTIFJlcXVlc3RlZEJ5OwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5SZXF1ZXN0SG9zdERlcGxveW1lbnQnLCBOJ1AnKSBJUyBOVUxMCiAgICBFWEVDKE4nQ1JFQVRFIFBST0NFRFVSRSBvbXAuUmVxdWVzdEhvc3REZXBsb3ltZW50IEFTIEJFR0lOIFNFVCBOT0NPVU5UIE9OOyBFTkQnKTsKR08KCkFMVEVSIFBST0NFRFVSRSBvbXAuUmVxdWVzdEhvc3REZXBsb3ltZW50CiAgICBASG9zdEtleSBudmFyY2hhcigxMjgpLAogICAgQEhvc3RUZW1wbGF0ZUtleSBudmFyY2hhcigxMDApID0gTlVMTCwKICAgIEBSZXF1ZXN0ZWRCeSBudmFyY2hhcigyNTYpID0gTlVMTApBUwpCRUdJTgogICAgU0VUIE5PQ09VTlQgT047CiAgICBTRVQgWEFDVF9BQk9SVCBPTjsKCiAgICBTRVQgQEhvc3RLZXkgPSBOVUxMSUYoTFRSSU0oUlRSSU0oQEhvc3RLZXkpKSwgTicnKTsKICAgIFNFVCBASG9zdFRlbXBsYXRlS2V5ID0gTlVMTElGKExUUklNKFJUUklNKEBIb3N0VGVtcGxhdGVLZXkpKSwgTicnKTsKICAgIFNFVCBAUmVxdWVzdGVkQnkgPSBOVUxMSUYoTFRSSU0oUlRSSU0oQFJlcXVlc3RlZEJ5KSksIE4nJyk7CgogICAgREVDTEFSRSBASG9zdElkIHVuaXF1ZWlkZW50aWZpZXI7CiAgICBERUNMQVJFIEBIb3N0VGVtcGxhdGVJZCBpbnQ7CgogICAgSUYgQEhvc3RLZXkgSVMgTlVMTAogICAgICAgIFRIUk9XIDUxMDQwLCAnSG9zdCBkZXBsb3ltZW50IHJlcXVlc3QgcmVxdWlyZXMgSG9zdEtleS4nLCAxOwoKICAgIFNFTEVDVCBASG9zdElkID0gSG9zdElkCiAgICBGUk9NIG9tcC5Ib3N0cwogICAgV0hFUkUgSG9zdEtleSA9IEBIb3N0S2V5CiAgICAgIEFORCBJc0VuYWJsZWQgPSAxOwoKICAgIElGIEBIb3N0SWQgSVMgTlVMTAogICAgICAgIFRIUk9XIDUxMDQxLCAnSG9zdCBkZXBsb3ltZW50IHJlcXVlc3QgaG9zdCB3YXMgbm90IGZvdW5kIG9yIGlzIGRpc2FibGVkLicsIDE7CgogICAgSUYgQEhvc3RUZW1wbGF0ZUtleSBJUyBOT1QgTlVMTAogICAgQkVHSU4KICAgICAgICBTRUxFQ1QgQEhvc3RUZW1wbGF0ZUlkID0gSG9zdFRlbXBsYXRlSWQKICAgICAgICBGUk9NIG9tcC5Ib3N0VGVtcGxhdGVzCiAgICAgICAgV0hFUkUgVGVtcGxhdGVLZXkgPSBASG9zdFRlbXBsYXRlS2V5CiAgICAgICAgICBBTkQgSXNFbmFibGVkID0gMTsKCiAgICAgICAgSUYgQEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwKICAgICAgICAgICAgVEhST1cgNTEwNDIsICdIb3N0IGRlcGxveW1lbnQgcmVxdWVzdCBob3N0IHRlbXBsYXRlIHdhcyBub3QgZm91bmQgb3IgaXMgZGlzYWJsZWQuJywgMTsKCiAgICAgICAgSUYgTk9UIEVYSVNUUwogICAgICAgICgKICAgICAgICAgICAgU0VMRUNUIDEKICAgICAgICAgICAgRlJPTSBvbXAuSG9zdERlcGxveW1lbnRBc3NpZ25tZW50cwogICAgICAgICAgICBXSEVSRSBIb3N0SWQgPSBASG9zdElkCiAgICAgICAgICAgICAgQU5EIEhvc3RUZW1wbGF0ZUlkID0gQEhvc3RUZW1wbGF0ZUlkCiAgICAgICAgICAgICAgQU5EIElzQWN0aXZlID0gMQogICAgICAgICkKICAgICAgICBCRUdJTgogICAgICAgICAgICBUSFJPVyA1MTA0MywgJ0hvc3QgZGVwbG95bWVudCByZXF1ZXN0IGhvc3QgdGVtcGxhdGUgaXMgbm90IGFjdGl2ZWx5IGFzc2lnbmVkIHRvIHRoZSBob3N0LicsIDE7CiAgICAgICAgRU5EOwogICAgRU5EOwoKICAgIElOU0VSVCBJTlRPIG9tcC5Ib3N0RGVwbG95bWVudHMoSG9zdElkLCBIb3N0VGVtcGxhdGVJZCwgUmVxdWVzdGVkQnksIFN0YXR1cykKICAgIFZBTFVFUyhASG9zdElkLCBASG9zdFRlbXBsYXRlSWQsIEBSZXF1ZXN0ZWRCeSwgMCk7CgogICAgU0VMRUNUCiAgICAgICAgQ09OVkVSVChiaWdpbnQsIFNDT1BFX0lERU5USVRZKCkpIEFTIEhvc3REZXBsb3ltZW50SWQsCiAgICAgICAgQEhvc3RJZCBBUyBIb3N0SWQsCiAgICAgICAgQEhvc3RUZW1wbGF0ZUlkIEFTIEhvc3RUZW1wbGF0ZUlkOwpFTkQKR08KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gQWNjb3VudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpJRiBPQkpFQ1RfSUQoTidvbXAudXNlcnMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLnVzZXJzCiAgICAoCiAgICAgICAgdXNlcl9pZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwKCiAgICAgICAgLS0gVXNlci1mYWNpbmcgbmFtZS4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IG5vdCB1bmlxdWUgYW5kIHNob3VsZCBiZSB1c2VkCiAgICAgICAgLS0gdG9nZXRoZXIgd2l0aCB1c2VyX2lkIGluIGFkbWluaXN0cmF0aXZlIHNjcmVlbnMgd2hlbiB1c2VycyBuZWVkIHRvIGJlCiAgICAgICAgLS0gZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIuCiAgICAgICAgZGlzcGxheV9uYW1lIG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCgogICAgICAgIC0tIE9wdGlvbmFsIHVzZXItbWFuYWdlZCBwcm9maWxlIGltYWdlIG1ldGFkYXRhLiBUaGUgcGh5c2ljYWwgZmlsZSBpcwogICAgICAgIC0tIGtlcHQgaW4gY29udHJvbGxlZCBzZXJ2ZXIgc3RvcmFnZSBhbmQgaXMgc2VydmVkIHRocm91Z2ggYW4KICAgICAgICAtLSBhdXRoZW50aWNhdGVkIGVuZHBvaW50LgogICAgICAgIHByb2ZpbGVfaW1hZ2VfZmlsZV9uYW1lIG52YXJjaGFyKDI2MCkgTlVMTCwKICAgICAgICBwcm9maWxlX2ltYWdlX3N0b3JhZ2Vfa2V5IG52YXJjaGFyKDI2MCkgTlVMTCwKCiAgICAgICAgLS0gSW50ZWdlciBzdGF0dXMgaW5zdGVhZCBvZiBwaHlzaWNhbCBkZWxldGlvbi4gU3VnZ2VzdGVkIGluaXRpYWwgdmFsdWVzOgogICAgICAgIC0tIDEgPSBhY3RpdmUsIDIgPSBkaXNhYmxlZCwgMyA9IGRlbGV0ZWQvcmVzZXJ2ZWQuIFRoZSBhcHBsaWNhdGlvbiBvd25zCiAgICAgICAgLS0gdGhlIGZpbmFsIGVudW0gbWFwcGluZy4KICAgICAgICBhY2NvdW50X3N0YXR1cyBpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfdXNlcnNfYWNjb3VudF9zdGF0dXMgREVGQVVMVCgxKSwKCiAgICAgICAgLS0gTGFzdCBzdWNjZXNzZnVsIGxvZ2luL2F1dGhlbnRpY2F0aW9uIHJlc29sdmUgZm9yIHRoaXMgT01QIHVzZXIuIFRoaXMKICAgICAgICAtLSBpcyBpbnRlbmRlZCBmb3Igc3VwcG9ydC9hZG1pbiB0cm91Ymxlc2hvb3RpbmcsIG5vdCBvbmxpbmUgcHJlc2VuY2UuCiAgICAgICAgbGFzdF9sb2dpbl9hdCBkYXRldGltZTIoMykgTlVMTCwKCiAgICAgICAgY3JlYXRlZF9hdCBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfdXNlcnNfY3JlYXRlZF9hdCBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgdXBkYXRlZF9hdCBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfdXNlcnNfdXBkYXRlZF9hdCBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCgogICAgICAgIENPTlNUUkFJTlQgUEtfb21wX3VzZXJzIFBSSU1BUlkgS0VZKHVzZXJfaWQpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC51c2VycycsIE4nVScpIElTIE5PVCBOVUxMCiAgIEFORCBDT0xfTEVOR1RIKE4nb21wLnVzZXJzJywgTidwcm9maWxlX2ltYWdlX2ZpbGVfbmFtZScpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC51c2VycwogICAgQUREIHByb2ZpbGVfaW1hZ2VfZmlsZV9uYW1lIG52YXJjaGFyKDI2MCkgTlVMTDsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAudXNlcnMnLCBOJ1UnKSBJUyBOT1QgTlVMTAogICBBTkQgQ09MX0xFTkdUSChOJ29tcC51c2VycycsIE4ncHJvZmlsZV9pbWFnZV9zdG9yYWdlX2tleScpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC51c2VycwogICAgQUREIHByb2ZpbGVfaW1hZ2Vfc3RvcmFnZV9rZXkgbnZhcmNoYXIoMjYwKSBOVUxMOwpFTkQKR08KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gTm90aWZpY2F0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCklGIE9CSkVDVF9JRChOJ29tcC5ub3RpZmljYXRpb25zJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5ub3RpZmljYXRpb25zCiAgICAoCiAgICAgICAgbm90aWZpY2F0aW9uX2lkIGJpZ2ludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMLAoKICAgICAgICAtLSB1c2VyX2lkID4gMCB0YXJnZXRzIGEgcGVyc29uYWwgT01QIHVzZXIuIHVzZXJfaWQgPSAwIGlzIHJlc2VydmVkIGZvcgogICAgICAgIC0tIGZ1dHVyZSBzeXN0ZW0td2lkZSBub3RpZmljYXRpb24gc2VtYW50aWNzIGFuZCBpcyBpbnRlbnRpb25hbGx5CiAgICAgICAgLS0gdmFsaWRhdGVkIGluIGFwcGxpY2F0aW9uIHNlcnZpY2VzIGJlZm9yZSBwZXJzb25hbCBub3RpZmljYXRpb25zIGFyZSBjcmVhdGVkLgogICAgICAgIHVzZXJfaWQgaW50IE5PVCBOVUxMLAoKICAgICAgICB0aXRsZSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAogICAgICAgIGNvbnRlbnQgbnZhcmNoYXIoMTAwMCkgTk9UIE5VTEwsCiAgICAgICAgZGVzdGluYXRpb25fdXJsIG52YXJjaGFyKDYwMCkgTlVMTCwKICAgICAgICBsZXZlbCBudmFyY2hhcig0MCkgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfbm90aWZpY2F0aW9uc19sZXZlbCBERUZBVUxUKE4naW5mbycpLAogICAgICAgIGNhbGxlcl9rZXkgbnZhcmNoYXIoMjAwKSBOVUxMLAogICAgICAgIGNhbGxlcl9kaXNwbGF5X25hbWUgbnZhcmNoYXIoMjAwKSBOVUxMLAogICAgICAgIGNhbGxlcl9pY29uIG52YXJjaGFyKDYwMCkgTlVMTCwKICAgICAgICBzdGF0dXMgbnZhcmNoYXIoNDApIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX25vdGlmaWNhdGlvbnNfc3RhdHVzIERFRkFVTFQoTid1bnJlYWQnKSwKICAgICAgICBjcmVhdGVkX2F0IGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9ub3RpZmljYXRpb25zX2NyZWF0ZWRfYXQgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAogICAgICAgIGV4cGlyZXNfYXQgZGF0ZXRpbWUyKDMpIE5VTEwsCiAgICAgICAgcmVhZF9hdCBkYXRldGltZTIoMykgTlVMTCwKCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfbm90aWZpY2F0aW9ucyBQUklNQVJZIEtFWShub3RpZmljYXRpb25faWQpLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX25vdGlmaWNhdGlvbnNfdXNlcl9pZCBDSEVDSyh1c2VyX2lkID49IDApLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX25vdGlmaWNhdGlvbnNfbGV2ZWwgQ0hFQ0sobGV2ZWwgSU4gKE4naW5mbycsIE4nc3VjY2VzcycsIE4nd2FybmluZycsIE4nZXJyb3InKSksCiAgICAgICAgQ09OU1RSQUlOVCBDS19vbXBfbm90aWZpY2F0aW9uc19zdGF0dXMgQ0hFQ0soc3RhdHVzIElOIChOJ3VucmVhZCcsIE4ncmVhZCcpKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAubm90aWZpY2F0aW9ucycsIE4nVScpIElTIE5PVCBOVUxMCkJFR0lOCiAgICBVUERBVEUgb21wLm5vdGlmaWNhdGlvbnMKICAgIFNFVCBsZXZlbCA9IE4naW5mbycsCiAgICAgICAgc3RhdHVzID0gTidyZWFkJywKICAgICAgICByZWFkX2F0ID0gQ09BTEVTQ0UocmVhZF9hdCwgU1lTVVRDREFURVRJTUUoKSksCiAgICAgICAgZXhwaXJlc19hdCA9IENPQUxFU0NFKGV4cGlyZXNfYXQsIFNZU1VUQ0RBVEVUSU1FKCkpCiAgICBXSEVSRSBsZXZlbCA9IE4nYmFubmVyJzsKCiAgICBJRiBFWElTVFMKICAgICgKICAgICAgICBTRUxFQ1QgMQogICAgICAgIEZST00gc3lzLmNoZWNrX2NvbnN0cmFpbnRzCiAgICAgICAgV0hFUkUgbmFtZSA9IE4nQ0tfb21wX25vdGlmaWNhdGlvbnNfbGV2ZWwnCiAgICAgICAgICBBTkQgcGFyZW50X29iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5ub3RpZmljYXRpb25zJykKICAgICkKICAgIEJFR0lOCiAgICAgICAgQUxURVIgVEFCTEUgb21wLm5vdGlmaWNhdGlvbnMgRFJPUCBDT05TVFJBSU5UIENLX29tcF9ub3RpZmljYXRpb25zX2xldmVsOwogICAgRU5EOwoKICAgIEFMVEVSIFRBQkxFIG9tcC5ub3RpZmljYXRpb25zIFdJVEggQ0hFQ0sKICAgICAgICBBREQgQ09OU1RSQUlOVCBDS19vbXBfbm90aWZpY2F0aW9uc19sZXZlbAogICAgICAgICAgICBDSEVDSyhsZXZlbCBJTiAoTidpbmZvJywgTidzdWNjZXNzJywgTid3YXJuaW5nJywgTidlcnJvcicpKTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBuYW1lID0gTidJWF9vbXBfbm90aWZpY2F0aW9uc191c2VyX3N0YXR1c19jcmVhdGVkJwogICAgICBBTkQgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLm5vdGlmaWNhdGlvbnMnKQopCkJFR0lOCiAgICBDUkVBVEUgSU5ERVggSVhfb21wX25vdGlmaWNhdGlvbnNfdXNlcl9zdGF0dXNfY3JlYXRlZAogICAgICAgIE9OIG9tcC5ub3RpZmljYXRpb25zKHVzZXJfaWQsIHN0YXR1cywgcmVhZF9hdCwgY3JlYXRlZF9hdCBERVNDKQogICAgICAgIElOQ0xVREUodGl0bGUsIGNvbnRlbnQsIGRlc3RpbmF0aW9uX3VybCwgbGV2ZWwsIGNhbGxlcl9rZXksIGNhbGxlcl9kaXNwbGF5X25hbWUsIGNhbGxlcl9pY29uLCBleHBpcmVzX2F0KTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBuYW1lID0gTidJWF9vbXBfbm90aWZpY2F0aW9uc191c2VyX2NyZWF0ZWQnCiAgICAgIEFORCBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAubm90aWZpY2F0aW9ucycpCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfbm90aWZpY2F0aW9uc191c2VyX2NyZWF0ZWQKICAgICAgICBPTiBvbXAubm90aWZpY2F0aW9ucyh1c2VyX2lkLCBjcmVhdGVkX2F0IERFU0MsIG5vdGlmaWNhdGlvbl9pZCBERVNDKQogICAgICAgIElOQ0xVREUodGl0bGUsIGNvbnRlbnQsIGRlc3RpbmF0aW9uX3VybCwgbGV2ZWwsIGNhbGxlcl9rZXksIGNhbGxlcl9kaXNwbGF5X25hbWUsIGNhbGxlcl9pY29uLCBzdGF0dXMsIHJlYWRfYXQsIGV4cGlyZXNfYXQpOwpFTkQKR08KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gQmFubmVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCklGIE9CSkVDVF9JRChOJ29tcC5iYW5uZXJzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5iYW5uZXJzCiAgICAoCiAgICAgICAgYmFubmVyX2lkIGJpZ2ludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMLAogICAgICAgIHRpdGxlIG52YXJjaGFyKDIwMCkgTk9UIE5VTEwsCiAgICAgICAgY29udGVudCBudmFyY2hhcigxMDAwKSBOT1QgTlVMTCwKICAgICAgICBzdGF0dXMgbnZhcmNoYXIoNDApIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX2Jhbm5lcnNfc3RhdHVzIERFRkFVTFQoTidhY3RpdmUnKSwKICAgICAgICBsZXZlbCBpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfYmFubmVyc19sZXZlbCBERUZBVUxUKDEpLAogICAgICAgIHN0YXJ0c19hdCBkYXRldGltZTIoMykgTlVMTCwKICAgICAgICBleHBpcmVzX2F0IGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIGNyZWF0ZWRfYXQgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX2Jhbm5lcnNfY3JlYXRlZF9hdCBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgdXBkYXRlZF9hdCBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfYmFubmVyc191cGRhdGVkX2F0IERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfYmFubmVycyBQUklNQVJZIEtFWShiYW5uZXJfaWQpLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX2Jhbm5lcnNfc3RhdHVzIENIRUNLKHN0YXR1cyBJTiAoTidhY3RpdmUnLCBOJ2Rpc2FibGVkJykpLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX2Jhbm5lcnNfbGV2ZWwgQ0hFQ0sobGV2ZWwgSU4gKDEsIDIsIDMpKSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9iYW5uZXJzX3dpbmRvdyBDSEVDSyhleHBpcmVzX2F0IElTIE5VTEwgT1Igc3RhcnRzX2F0IElTIE5VTEwgT1IgZXhwaXJlc19hdCA+IHN0YXJ0c19hdCkKICAgICk7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLmJhbm5lcl90YXJnZXRzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5iYW5uZXJfdGFyZ2V0cwogICAgKAogICAgICAgIGJhbm5lcl90YXJnZXRfaWQgYmlnaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwsCiAgICAgICAgYmFubmVyX2lkIGJpZ2ludCBOT1QgTlVMTCwKICAgICAgICB0YXJnZXRfdHlwZSBudmFyY2hhcig0MCkgTk9UIE5VTEwsCiAgICAgICAgcm9sZV9pZCBpbnQgTlVMTCwKCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfYmFubmVyX3RhcmdldHMgUFJJTUFSWSBLRVkoYmFubmVyX3RhcmdldF9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfYmFubmVyX3RhcmdldHNfYmFubmVyIEZPUkVJR04gS0VZKGJhbm5lcl9pZCkgUkVGRVJFTkNFUyBvbXAuYmFubmVycyhiYW5uZXJfaWQpIE9OIERFTEVURSBDQVNDQURFLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX2Jhbm5lcl90YXJnZXRzX3JvbGUgRk9SRUlHTiBLRVkocm9sZV9pZCkgUkVGRVJFTkNFUyBvbXAuUm9sZXMoUm9sZUlkKSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9iYW5uZXJfdGFyZ2V0c190eXBlIENIRUNLKHRhcmdldF90eXBlIElOIChOJ2dsb2JhbCcsIE4ncm9sZScpKSwKICAgICAgICBDT05TVFJBSU5UIENLX29tcF9iYW5uZXJfdGFyZ2V0c19yb2xlIENIRUNLCiAgICAgICAgKAogICAgICAgICAgICAodGFyZ2V0X3R5cGUgPSBOJ2dsb2JhbCcgQU5EIHJvbGVfaWQgSVMgTlVMTCkKICAgICAgICAgICAgT1IgKHRhcmdldF90eXBlID0gTidyb2xlJyBBTkQgcm9sZV9pZCBJUyBOT1QgTlVMTCkKICAgICAgICApLAogICAgICAgIENPTlNUUkFJTlQgVVFfb21wX2Jhbm5lcl90YXJnZXRzX3VuaXF1ZSBVTklRVUUoYmFubmVyX2lkLCB0YXJnZXRfdHlwZSwgcm9sZV9pZCkKICAgICk7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgbmFtZSA9IE4nSVhfb21wX2Jhbm5lcnNfc3RhdHVzX3dpbmRvdycKICAgICAgQU5EIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5iYW5uZXJzJykKKQpCRUdJTgogICAgQ1JFQVRFIElOREVYIElYX29tcF9iYW5uZXJzX3N0YXR1c193aW5kb3cKICAgICAgICBPTiBvbXAuYmFubmVycyhzdGF0dXMsIHN0YXJ0c19hdCwgZXhwaXJlc19hdCwgbGV2ZWwgREVTQywgY3JlYXRlZF9hdCBERVNDKQogICAgICAgIElOQ0xVREUodGl0bGUsIGNvbnRlbnQpOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG5hbWUgPSBOJ0lYX29tcF9iYW5uZXJfdGFyZ2V0c19sb29rdXAnCiAgICAgIEFORCBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuYmFubmVyX3RhcmdldHMnKQopCkJFR0lOCiAgICBDUkVBVEUgSU5ERVggSVhfb21wX2Jhbm5lcl90YXJnZXRzX2xvb2t1cAogICAgICAgIE9OIG9tcC5iYW5uZXJfdGFyZ2V0cyh0YXJnZXRfdHlwZSwgcm9sZV9pZCwgYmFubmVyX2lkKTsKRU5ECkdPCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIE1lc3NhZ2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSUYgT0JKRUNUX0lEKE4nb21wLmNvbnZlcnNhdGlvbnMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLmNvbnZlcnNhdGlvbnMKICAgICgKICAgICAgICBjb252ZXJzYXRpb25faWQgYmlnaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwsCiAgICAgICAgY29udmVyc2F0aW9uX3R5cGUgbnZhcmNoYXIoNDApIE5PVCBOVUxMLAogICAgICAgIHRpdGxlIG52YXJjaGFyKDIwMCkgTlVMTCwKICAgICAgICBjcmVhdGVkX2J5X3VzZXJfaWQgaW50IE5PVCBOVUxMLAogICAgICAgIGNyZWF0ZWRfYXQgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX2NvbnZlcnNhdGlvbnNfY3JlYXRlZF9hdCBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgdXBkYXRlZF9hdCBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfY29udmVyc2F0aW9uc191cGRhdGVkX2F0IERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBsYXN0X21lc3NhZ2VfYXQgZGF0ZXRpbWUyKDMpIE5VTEwsCgogICAgICAgIENPTlNUUkFJTlQgUEtfb21wX2NvbnZlcnNhdGlvbnMgUFJJTUFSWSBLRVkoY29udmVyc2F0aW9uX2lkKSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9jb252ZXJzYXRpb25zX2NyZWF0ZWRfYnlfdXNlciBGT1JFSUdOIEtFWShjcmVhdGVkX2J5X3VzZXJfaWQpIFJFRkVSRU5DRVMgb21wLnVzZXJzKHVzZXJfaWQpLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX2NvbnZlcnNhdGlvbnNfdHlwZSBDSEVDSyhjb252ZXJzYXRpb25fdHlwZSBJTiAoTidkaXJlY3QnLCBOJ2dyb3VwJykpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5tZXNzYWdlcycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAubWVzc2FnZXMKICAgICgKICAgICAgICBtZXNzYWdlX2lkIGJpZ2ludCBJREVOVElUWSgxLDEpIE5PVCBOVUxMLAogICAgICAgIGNvbnZlcnNhdGlvbl9pZCBiaWdpbnQgTk9UIE5VTEwsCiAgICAgICAgc2VuZGVyX3VzZXJfaWQgaW50IE5PVCBOVUxMLAogICAgICAgIGNvbnRlbnQgbnZhcmNoYXIobWF4KSBOVUxMLAogICAgICAgIG1lc3NhZ2VfdHlwZSBudmFyY2hhcig0MCkgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfbWVzc2FnZXNfbWVzc2FnZV90eXBlIERFRkFVTFQoTid0ZXh0JyksCiAgICAgICAgY3JlYXRlZF9hdCBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfbWVzc2FnZXNfY3JlYXRlZF9hdCBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCksCiAgICAgICAgZWRpdGVkX2F0IGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIGRlbGV0ZWRfYXQgZGF0ZXRpbWUyKDMpIE5VTEwsCgogICAgICAgIENPTlNUUkFJTlQgUEtfb21wX21lc3NhZ2VzIFBSSU1BUlkgS0VZKG1lc3NhZ2VfaWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX21lc3NhZ2VzX2NvbnZlcnNhdGlvbiBGT1JFSUdOIEtFWShjb252ZXJzYXRpb25faWQpIFJFRkVSRU5DRVMgb21wLmNvbnZlcnNhdGlvbnMoY29udmVyc2F0aW9uX2lkKSBPTiBERUxFVEUgQ0FTQ0FERSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9tZXNzYWdlc19zZW5kZXJfdXNlciBGT1JFSUdOIEtFWShzZW5kZXJfdXNlcl9pZCkgUkVGRVJFTkNFUyBvbXAudXNlcnModXNlcl9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBDS19vbXBfbWVzc2FnZXNfdHlwZSBDSEVDSyhtZXNzYWdlX3R5cGUgSU4gKE4ndGV4dCcsIE4nc3lzdGVtJykpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5jb252ZXJzYXRpb25fcGFydGljaXBhbnRzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5jb252ZXJzYXRpb25fcGFydGljaXBhbnRzCiAgICAoCiAgICAgICAgY29udmVyc2F0aW9uX2lkIGJpZ2ludCBOT1QgTlVMTCwKICAgICAgICB1c2VyX2lkIGludCBOT1QgTlVMTCwKICAgICAgICBqb2luZWRfYXQgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX2NvbnZlcnNhdGlvbl9wYXJ0aWNpcGFudHNfam9pbmVkX2F0IERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBsZWZ0X2F0IGRhdGV0aW1lMigzKSBOVUxMLAogICAgICAgIGxhc3RfcmVhZF9tZXNzYWdlX2lkIGJpZ2ludCBOVUxMLAoKICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9jb252ZXJzYXRpb25fcGFydGljaXBhbnRzIFBSSU1BUlkgS0VZKGNvbnZlcnNhdGlvbl9pZCwgdXNlcl9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfY29udmVyc2F0aW9uX3BhcnRpY2lwYW50c19jb252ZXJzYXRpb24gRk9SRUlHTiBLRVkoY29udmVyc2F0aW9uX2lkKSBSRUZFUkVOQ0VTIG9tcC5jb252ZXJzYXRpb25zKGNvbnZlcnNhdGlvbl9pZCkgT04gREVMRVRFIENBU0NBREUsCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfY29udmVyc2F0aW9uX3BhcnRpY2lwYW50c191c2VyIEZPUkVJR04gS0VZKHVzZXJfaWQpIFJFRkVSRU5DRVMgb21wLnVzZXJzKHVzZXJfaWQpCiAgICApOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5tZXNzYWdlX2F0dGFjaG1lbnRzJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5tZXNzYWdlX2F0dGFjaG1lbnRzCiAgICAoCiAgICAgICAgYXR0YWNobWVudF9pZCBiaWdpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwKICAgICAgICBtZXNzYWdlX2lkIGJpZ2ludCBOT1QgTlVMTCwKICAgICAgICBmaWxlX25hbWUgbnZhcmNoYXIoMjYwKSBOT1QgTlVMTCwKICAgICAgICBjb250ZW50X3R5cGUgbnZhcmNoYXIoMTI4KSBOT1QgTlVMTCwKICAgICAgICBmaWxlX3NpemUgYmlnaW50IE5PVCBOVUxMLAogICAgICAgIHN0b3JhZ2Vfa2V5IG52YXJjaGFyKDEyMCkgTk9UIE5VTEwsCiAgICAgICAgZGF0YV92YWx1ZSB2YXJiaW5hcnkobWF4KSBOT1QgTlVMTCwKICAgICAgICB1cGxvYWRlZF9ieV91c2VyX2lkIGludCBOT1QgTlVMTCwKICAgICAgICBjcmVhdGVkX2F0IGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9tZXNzYWdlX2F0dGFjaG1lbnRzX2NyZWF0ZWRfYXQgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpLAoKICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9tZXNzYWdlX2F0dGFjaG1lbnRzIFBSSU1BUlkgS0VZKGF0dGFjaG1lbnRfaWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX21lc3NhZ2VfYXR0YWNobWVudHNfbWVzc2FnZSBGT1JFSUdOIEtFWShtZXNzYWdlX2lkKSBSRUZFUkVOQ0VTIG9tcC5tZXNzYWdlcyhtZXNzYWdlX2lkKSBPTiBERUxFVEUgQ0FTQ0FERSwKICAgICAgICBDT05TVFJBSU5UIEZLX29tcF9tZXNzYWdlX2F0dGFjaG1lbnRzX3VwbG9hZGVkX2J5X3VzZXIgRk9SRUlHTiBLRVkodXBsb2FkZWRfYnlfdXNlcl9pZCkgUkVGRVJFTkNFUyBvbXAudXNlcnModXNlcl9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfbWVzc2FnZV9hdHRhY2htZW50c19zdG9yYWdlX2tleSBVTklRVUUoc3RvcmFnZV9rZXkpLAogICAgICAgIENPTlNUUkFJTlQgQ0tfb21wX21lc3NhZ2VfYXR0YWNobWVudHNfZmlsZV9zaXplIENIRUNLKGZpbGVfc2l6ZSA+PSAwKQogICAgKTsKRU5ECkdPCgpJRiBPQkpFQ1RfSUQoTidvbXAuZGlyZWN0X2NvbnZlcnNhdGlvbnMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLmRpcmVjdF9jb252ZXJzYXRpb25zCiAgICAoCiAgICAgICAgdXNlcl9sb3dfaWQgaW50IE5PVCBOVUxMLAogICAgICAgIHVzZXJfaGlnaF9pZCBpbnQgTk9UIE5VTEwsCiAgICAgICAgY29udmVyc2F0aW9uX2lkIGJpZ2ludCBOT1QgTlVMTCwKCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfZGlyZWN0X2NvbnZlcnNhdGlvbnMgUFJJTUFSWSBLRVkodXNlcl9sb3dfaWQsIHVzZXJfaGlnaF9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfZGlyZWN0X2NvbnZlcnNhdGlvbnNfbG93X3VzZXIgRk9SRUlHTiBLRVkodXNlcl9sb3dfaWQpIFJFRkVSRU5DRVMgb21wLnVzZXJzKHVzZXJfaWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX2RpcmVjdF9jb252ZXJzYXRpb25zX2hpZ2hfdXNlciBGT1JFSUdOIEtFWSh1c2VyX2hpZ2hfaWQpIFJFRkVSRU5DRVMgb21wLnVzZXJzKHVzZXJfaWQpLAogICAgICAgIENPTlNUUkFJTlQgRktfb21wX2RpcmVjdF9jb252ZXJzYXRpb25zX2NvbnZlcnNhdGlvbiBGT1JFSUdOIEtFWShjb252ZXJzYXRpb25faWQpIFJFRkVSRU5DRVMgb21wLmNvbnZlcnNhdGlvbnMoY29udmVyc2F0aW9uX2lkKSBPTiBERUxFVEUgQ0FTQ0FERSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9kaXJlY3RfY29udmVyc2F0aW9uc19jb252ZXJzYXRpb24gVU5JUVVFKGNvbnZlcnNhdGlvbl9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBDS19vbXBfZGlyZWN0X2NvbnZlcnNhdGlvbnNfb3JkZXIgQ0hFQ0sodXNlcl9sb3dfaWQgPCB1c2VyX2hpZ2hfaWQpCiAgICApOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG5hbWUgPSBOJ0lYX29tcF9jb252ZXJzYXRpb25fcGFydGljaXBhbnRzX3VzZXInCiAgICAgIEFORCBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuY29udmVyc2F0aW9uX3BhcnRpY2lwYW50cycpCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfY29udmVyc2F0aW9uX3BhcnRpY2lwYW50c191c2VyCiAgICAgICAgT04gb21wLmNvbnZlcnNhdGlvbl9wYXJ0aWNpcGFudHModXNlcl9pZCwgbGVmdF9hdCwgY29udmVyc2F0aW9uX2lkKQogICAgICAgIElOQ0xVREUobGFzdF9yZWFkX21lc3NhZ2VfaWQpOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmluZGV4ZXMKICAgIFdIRVJFIG5hbWUgPSBOJ0lYX29tcF9tZXNzYWdlc19jb252ZXJzYXRpb25fbWVzc2FnZScKICAgICAgQU5EIG9iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5tZXNzYWdlcycpCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfbWVzc2FnZXNfY29udmVyc2F0aW9uX21lc3NhZ2UKICAgICAgICBPTiBvbXAubWVzc2FnZXMoY29udmVyc2F0aW9uX2lkLCBtZXNzYWdlX2lkIERFU0MpCiAgICAgICAgSU5DTFVERShzZW5kZXJfdXNlcl9pZCwgbWVzc2FnZV90eXBlLCBjcmVhdGVkX2F0LCBkZWxldGVkX2F0KTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBuYW1lID0gTidJWF9vbXBfY29udmVyc2F0aW9uc19sYXN0X21lc3NhZ2UnCiAgICAgIEFORCBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuY29udmVyc2F0aW9ucycpCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfY29udmVyc2F0aW9uc19sYXN0X21lc3NhZ2UKICAgICAgICBPTiBvbXAuY29udmVyc2F0aW9ucyhsYXN0X21lc3NhZ2VfYXQgREVTQywgdXBkYXRlZF9hdCBERVNDKQogICAgICAgIElOQ0xVREUoY29udmVyc2F0aW9uX3R5cGUsIHRpdGxlKTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5pbmRleGVzCiAgICBXSEVSRSBuYW1lID0gTidJWF9vbXBfbWVzc2FnZV9hdHRhY2htZW50c19tZXNzYWdlJwogICAgICBBTkQgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLm1lc3NhZ2VfYXR0YWNobWVudHMnKQopCkJFR0lOCiAgICBDUkVBVEUgSU5ERVggSVhfb21wX21lc3NhZ2VfYXR0YWNobWVudHNfbWVzc2FnZQogICAgICAgIE9OIG9tcC5tZXNzYWdlX2F0dGFjaG1lbnRzKG1lc3NhZ2VfaWQpCiAgICAgICAgSU5DTFVERShmaWxlX25hbWUsIGNvbnRlbnRfdHlwZSwgZmlsZV9zaXplLCBzdG9yYWdlX2tleSwgdXBsb2FkZWRfYnlfdXNlcl9pZCwgY3JlYXRlZF9hdCk7CkVORApHTwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBBdXRoZW50aWNhdGlvbiBwcm92aWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpJRiBPQkpFQ1RfSUQoTidvbXAuYXV0aF9wcm92aWRlcnMnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLmF1dGhfcHJvdmlkZXJzCiAgICAoCiAgICAgICAgcHJvdmlkZXJfaWQgaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwsCgogICAgICAgIC0tIEh1bWFuLXJlYWRhYmxlIHByb3ZpZGVyIG5hbWUgc2hvd24gaW4gYWRtaW5pc3RyYXRpb24gYW5kIGRpYWdub3N0aWNzLgogICAgICAgIC0tIFByb3ZpZGVyLXNwZWNpZmljIGNvZGUgZGVjaWRlcyBob3cgZWFjaCBwcm92aWRlciBpcyBoYW5kbGVkLgogICAgICAgIGRpc3BsYXlfbmFtZSBudmFyY2hhcigyMDApIE5PVCBOVUxMLAoKICAgICAgICAtLSBBbGxvd3MgYW4gYXV0aGVudGljYXRpb24gcHJvdmlkZXIgdG8gYmUgZGlzYWJsZWQgZnJvbSB0aGUgZGF0YWJhc2UKICAgICAgICAtLSB3aXRob3V0IGRlbGV0aW5nIHByb3ZpZGVyIG1ldGFkYXRhIG9yIGV4aXN0aW5nIGFjY291bnQgbGlua3MuCiAgICAgICAgaXNfZW5hYmxlZCBiaXQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfYXV0aF9wcm92aWRlcnNfaXNfZW5hYmxlZCBERUZBVUxUKDEpLAoKICAgICAgICB1cGRhdGVkX2F0IGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9hdXRoX3Byb3ZpZGVyc191cGRhdGVkX2F0IERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfYXV0aF9wcm92aWRlcnMgUFJJTUFSWSBLRVkocHJvdmlkZXJfaWQpLAogICAgICAgIENPTlNUUkFJTlQgVVFfb21wX2F1dGhfcHJvdmlkZXJzX2Rpc3BsYXlfbmFtZSBVTklRVUUoZGlzcGxheV9uYW1lKQogICAgKTsKRU5ECkdPCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIFVzZXItdG8tYXV0aGVudGljYXRpb24gbWFwcGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCklGIE9CSkVDVF9JRChOJ29tcC51c2VyX2F1dGgnLCBOJ1UnKSBJUyBOVUxMCkJFR0lOCiAgICBDUkVBVEUgVEFCTEUgb21wLnVzZXJfYXV0aAogICAgKAogICAgICAgIHVzZXJfYXV0aF9pZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwKICAgICAgICB1c2VyX2lkIGludCBOT1QgTlVMTCwKICAgICAgICBwcm92aWRlcl9pZCBpbnQgTk9UIE5VTEwsCgogICAgICAgIC0tIFByb3ZpZGVyLXNwZWNpZmljIHN0YWJsZSBzdWJqZWN0L3VzZXIga2V5LiBUaGlzIGlzIGludGVuZGVkIGZvcgogICAgICAgIC0tIGlkZW50aWZpZXJzIHN1Y2ggYXMgRE9NQUlOXHVzZXIsIEVudHJhIG9iamVjdCBpZCwgT0lEQyBzdWIsIG9yIGxvY2FsCiAgICAgICAgLS0gbG9naW4gbmFtZS4gRG8gbm90IHN0b3JlIE9BdXRoIGFjY2VzcyB0b2tlbnMgb3IgcmVmcmVzaCB0b2tlbnMgaGVyZS4KICAgICAgICAtLSBUaGUgd2lkZSBjb2x1bW4gYWxsb3dzIGZlZGVyYXRlZCBpZGVudGl0eSBrZXlzIGxvbmdlciB0aGFuIGEgV2luZG93cwogICAgICAgIC0tIGxvZ2luIHdoaWxlIGxvb2t1cHMgdXNlIHByb3ZpZGVyX3VzZXJfaGFzaCBmb3IgaW5kZXggZWZmaWNpZW5jeS4KICAgICAgICBwcm92aWRlcl91c2VyX2tleSBudmFyY2hhcigxMDAwKSBOT1QgTlVMTCwKICAgICAgICBwcm92aWRlcl91c2VyX2hhc2ggQVMgQ09OVkVSVChiaW5hcnkoMzIpLCBIQVNIQllURVMoJ1NIQTJfMjU2JywgQ09OVkVSVCh2YXJiaW5hcnkobWF4KSwgcHJvdmlkZXJfdXNlcl9rZXkpKSkgUEVSU0lTVEVELAoKICAgICAgICAtLSBMYXN0IHRpbWUgdGhpcyBsaW5rZWQgcHJvdmlkZXIgaWRlbnRpdHkgd2FzIHN1Y2Nlc3NmdWxseSB1c2VkLgogICAgICAgIGxhc3RfdXNlZF9hdCBkYXRldGltZTIoMykgTlVMTCwKICAgICAgICAtLSBMaW5rIHN0YXR1cyBpcyBpbnRlbnRpb25hbGx5IG9wZW4tZW5kZWQuIEJ1aWx0LWluIHZhbHVlcyBjdXJyZW50bHkKICAgICAgICAtLSB1c2VkIGJ5IE9NUCBhcmUgZW5hYmxlZCwgZGlzYWJsZWQgYW5kIGRlbGV0ZWQuCiAgICAgICAgYXV0aF9zdGF0dXMgbnZhcmNoYXIoNTApIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX3VzZXJfYXV0aF9hdXRoX3N0YXR1cyBERUZBVUxUKE4nZW5hYmxlZCcpLAogICAgICAgIGNyZWF0ZWRfYXQgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX3VzZXJfYXV0aF9jcmVhdGVkX2F0IERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfdXNlcl9hdXRoIFBSSU1BUlkgS0VZKHVzZXJfYXV0aF9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfdXNlcl9hdXRoX3VzZXIgRk9SRUlHTiBLRVkodXNlcl9pZCkgUkVGRVJFTkNFUyBvbXAudXNlcnModXNlcl9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBGS19vbXBfdXNlcl9hdXRoX3Byb3ZpZGVyIEZPUkVJR04gS0VZKHByb3ZpZGVyX2lkKSBSRUZFUkVOQ0VTIG9tcC5hdXRoX3Byb3ZpZGVycyhwcm92aWRlcl9pZCksCiAgICAgICAgQ09OU1RSQUlOVCBVUV9vbXBfdXNlcl9hdXRoX3Byb3ZpZGVyX2tleSBVTklRVUUocHJvdmlkZXJfaWQsIHByb3ZpZGVyX3VzZXJfaGFzaCkKICAgICk7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC51c2VyX2F1dGgnLCBOJ2F1dGhfc3RhdHVzJykgSVMgTlVMTApCRUdJTgogICAgQUxURVIgVEFCTEUgb21wLnVzZXJfYXV0aAogICAgICAgIEFERCBhdXRoX3N0YXR1cyBudmFyY2hhcig1MCkgTk9UIE5VTEwKICAgICAgICAgICAgQ09OU1RSQUlOVCBERl9vbXBfdXNlcl9hdXRoX2F1dGhfc3RhdHVzIERFRkFVTFQoTidlbmFibGVkJykgV0lUSCBWQUxVRVM7CkVORApHTwoKSUYgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5rZXlfY29uc3RyYWludHMKICAgIFdIRVJFIG5hbWUgPSBOJ1VRX29tcF91c2VyX2F1dGhfdXNlcl9wcm92aWRlcl9rZXknCiAgICAgIEFORCBwYXJlbnRfb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLnVzZXJfYXV0aCcpCikKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC51c2VyX2F1dGggRFJPUCBDT05TVFJBSU5UIFVRX29tcF91c2VyX2F1dGhfdXNlcl9wcm92aWRlcl9rZXk7CkVORApHTwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBMb2NhbCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBkYXRhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSUYgT0JKRUNUX0lEKE4nb21wLmF1dGhfcHJvdmlkZXJfbHB3ZCcsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuYXV0aF9wcm92aWRlcl9scHdkCiAgICAoCiAgICAgICAgLS0gTG9naW4gbmFtZSBmb3IgdGhlIGxvY2FsIHBhc3N3b3JkIHByb3ZpZGVyLiBUaGlzIGlzIHByb3ZpZGVyLXNwZWNpZmljCiAgICAgICAgLS0gYXV0aCBkYXRhLCBub3QgdGhlIGludGVybmFsIE9NUCB1c2VyIGlkZW50aXR5LgogICAgICAgIHVzZXJfbmFtZSBudmFyY2hhcigyNTYpIE5PVCBOVUxMLAoKICAgICAgICAtLSBTdG9yZXMgb25seSBhIHBhc3N3b3JkIGhhc2guIFJhdyBwYXNzd29yZHMgbXVzdCBuZXZlciBiZSBzdG9yZWQgaGVyZS4KICAgICAgICBwYXNzd29yZF9oYXNoIG52YXJjaGFyKDEwMDApIE5PVCBOVUxMLAoKICAgICAgICBDT05TVFJBSU5UIFBLX29tcF9hdXRoX3Byb3ZpZGVyX2xwd2QgUFJJTUFSWSBLRVkodXNlcl9uYW1lKQogICAgKTsKRU5ECkdPCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIE9NUCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSUYgT0JKRUNUX0lEKE4nb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zJywgTidVJykgSVMgTlVMTApCRUdJTgogICAgQ1JFQVRFIFRBQkxFIG9tcC5jb25maWdfc2V0dGluZ19kZWZpbml0aW9ucwogICAgKAogICAgICAgIENvbmZpZ1NldHRpbmdJZCBpbnQgSURFTlRJVFkoMSwxKSBOT1QgTlVMTCwKICAgICAgICBDb25maWdDYXRlZ29yeSBudmFyY2hhcigxMDApIE5PVCBOVUxMLAogICAgICAgIENvbmZpZ1NldHRpbmcgbnZhcmNoYXIoMjAwKSBOT1QgTlVMTCwKICAgICAgICBEZXNjcmlwdGlvbiBudmFyY2hhcigxMDAwKSBOVUxMLAogICAgICAgIFNvcnRPcmRlciBpbnQgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnNfU29ydE9yZGVyIERFRkFVTFQoMCksCiAgICAgICAgSXNFbmFibGVkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9jb25maWdfc2V0dGluZ19kZWZpbml0aW9uc19Jc0VuYWJsZWQgREVGQVVMVCgxKSwKICAgICAgICBDcmVhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9jb25maWdfc2V0dGluZ19kZWZpbml0aW9uc19DcmVhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKICAgICAgICBVcGRhdGVkVXRjIGRhdGV0aW1lMigzKSBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9jb25maWdfc2V0dGluZ19kZWZpbml0aW9uc19VcGRhdGVkVXRjIERFRkFVTFQgU1lTVVRDREFURVRJTUUoKSwKCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMgUFJJTUFSWSBLRVkoQ29uZmlnU2V0dGluZ0lkKSwKICAgICAgICBDT05TVFJBSU5UIFVRX29tcF9jb25maWdfc2V0dGluZ19kZWZpbml0aW9uc19rZXkgVU5JUVVFKENvbmZpZ0NhdGVnb3J5LCBDb25maWdTZXR0aW5nKQogICAgKTsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zJywgTidEZXNjcmlwdGlvbicpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5jb25maWdfc2V0dGluZ19kZWZpbml0aW9ucyBBREQgRGVzY3JpcHRpb24gbnZhcmNoYXIoMTAwMCkgTlVMTDsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zJywgTidTb3J0T3JkZXInKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMKICAgICAgICBBREQgU29ydE9yZGVyIGludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9jb25maWdfc2V0dGluZ19kZWZpbml0aW9uc19Tb3J0T3JkZXIgREVGQVVMVCgwKSBXSVRIIFZBTFVFUzsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zJywgTidJc0VuYWJsZWQnKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMKICAgICAgICBBREQgSXNFbmFibGVkIGJpdCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9jb25maWdfc2V0dGluZ19kZWZpbml0aW9uc19Jc0VuYWJsZWQgREVGQVVMVCgxKSBXSVRIIFZBTFVFUzsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zJywgTidDcmVhdGVkVXRjJykgSVMgTlVMTApCRUdJTgogICAgQUxURVIgVEFCTEUgb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zCiAgICAgICAgQUREIENyZWF0ZWRVdGMgZGF0ZXRpbWUyKDMpIE5PVCBOVUxMIENPTlNUUkFJTlQgREZfb21wX2NvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zX0NyZWF0ZWRVdGMgREVGQVVMVCBTWVNVVENEQVRFVElNRSgpIFdJVEggVkFMVUVTOwpFTkQKR08KCklGIENPTF9MRU5HVEgoTidvbXAuY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMnLCBOJ1VwZGF0ZWRVdGMnKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMKICAgICAgICBBREQgVXBkYXRlZFV0YyBkYXRldGltZTIoMykgTk9UIE5VTEwgQ09OU1RSQUlOVCBERl9vbXBfY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnNfVXBkYXRlZFV0YyBERUZBVUxUIFNZU1VUQ0RBVEVUSU1FKCkgV0lUSCBWQUxVRVM7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMua2V5X2NvbnN0cmFpbnRzCiAgICBXSEVSRSBbdHlwZV0gPSBOJ1BLJwogICAgICBBTkQgcGFyZW50X29iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5jb25maWdfc2V0dGluZ19kZWZpbml0aW9ucycpCikKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5jb25maWdfc2V0dGluZ19kZWZpbml0aW9ucwogICAgICAgIEFERCBDT05TVFJBSU5UIFBLX29tcF9jb25maWdfc2V0dGluZ19kZWZpbml0aW9ucyBQUklNQVJZIEtFWShDb25maWdTZXR0aW5nSWQpOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmtleV9jb25zdHJhaW50cwogICAgV0hFUkUgbmFtZSA9IE4nVVFfb21wX2NvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zX2tleScKICAgICAgQU5EIHBhcmVudF9vYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMnKQopCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMKICAgICAgICBBREQgQ09OU1RSQUlOVCBVUV9vbXBfY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnNfa2V5IFVOSVFVRShDb25maWdDYXRlZ29yeSwgQ29uZmlnU2V0dGluZyk7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5jb25maWdfc2V0dGluZ3MnLCBOJ2NvbmZpZ19zZXR0aW5nX2lkJykgSVMgTk9UIE5VTEwKICAgQU5EIENPTF9MRU5HVEgoTidvbXAuY29uZmlnX3NldHRpbmdzJywgTidDb25maWdJZCcpIElTIE5VTEwKQkVHSU4KICAgIEVYRUMgc3BfcmVuYW1lIE4nb21wLmNvbmZpZ19zZXR0aW5ncy5jb25maWdfc2V0dGluZ19pZCcsIE4nQ29uZmlnSWQnLCBOJ0NPTFVNTic7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5jb25maWdfc2V0dGluZ3MnLCBOJ2NhdGVnb3J5JykgSVMgTk9UIE5VTEwKICAgQU5EIENPTF9MRU5HVEgoTidvbXAuY29uZmlnX3NldHRpbmdzJywgTidDb25maWdDYXRlZ29yeScpIElTIE5VTEwKQkVHSU4KICAgIEVYRUMgc3BfcmVuYW1lIE4nb21wLmNvbmZpZ19zZXR0aW5ncy5jYXRlZ29yeScsIE4nQ29uZmlnQ2F0ZWdvcnknLCBOJ0NPTFVNTic7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5jb25maWdfc2V0dGluZ3MnLCBOJ3NldHRpbmcnKSBJUyBOT1QgTlVMTAogICBBTkQgQ09MX0xFTkdUSChOJ29tcC5jb25maWdfc2V0dGluZ3MnLCBOJ0NvbmZpZ1NldHRpbmcnKSBJUyBOVUxMCkJFR0lOCiAgICBFWEVDIHNwX3JlbmFtZSBOJ29tcC5jb25maWdfc2V0dGluZ3Muc2V0dGluZycsIE4nQ29uZmlnU2V0dGluZycsIE4nQ09MVU1OJzsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4ndmFsdWUnKSBJUyBOT1QgTlVMTAogICBBTkQgQ09MX0xFTkdUSChOJ29tcC5jb25maWdfc2V0dGluZ3MnLCBOJ0NvbmZpZ1ZhbHVlJykgSVMgTlVMTApCRUdJTgogICAgRVhFQyBzcF9yZW5hbWUgTidvbXAuY29uZmlnX3NldHRpbmdzLnZhbHVlJywgTidDb25maWdWYWx1ZScsIE4nQ09MVU1OJzsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4ndXNlcl9pZCcpIElTIE5PVCBOVUxMCiAgIEFORCBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4nQ29uZmlnVXNyJykgSVMgTlVMTApCRUdJTgogICAgRVhFQyBzcF9yZW5hbWUgTidvbXAuY29uZmlnX3NldHRpbmdzLnVzZXJfaWQnLCBOJ0NvbmZpZ1VzcicsIE4nQ09MVU1OJzsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4ncm9sZV9pZCcpIElTIE5PVCBOVUxMCiAgIEFORCBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4nQ29uZmlnUm9sZScpIElTIE5VTEwKQkVHSU4KICAgIEVYRUMgc3BfcmVuYW1lIE4nb21wLmNvbmZpZ19zZXR0aW5ncy5yb2xlX2lkJywgTidDb25maWdSb2xlJywgTidDT0xVTU4nOwpFTkQKR08KCklGIE9CSkVDVF9JRChOJ29tcC5jb25maWdfc2V0dGluZ3MnLCBOJ1UnKSBJUyBOT1QgTlVMTApCRUdJTgogICAgSUYgRVhJU1RTCiAgICAoCiAgICAgICAgU0VMRUNUIDEKICAgICAgICBGUk9NIHN5cy5rZXlfY29uc3RyYWludHMKICAgICAgICBXSEVSRSBuYW1lID0gTidVUV9vbXBfY29uZmlnX3NldHRpbmdzX3Njb3BlJwogICAgICAgICAgQU5EIHBhcmVudF9vYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuY29uZmlnX3NldHRpbmdzJykKICAgICkKICAgIEJFR0lOCiAgICAgICAgQUxURVIgVEFCTEUgb21wLmNvbmZpZ19zZXR0aW5ncyBEUk9QIENPTlNUUkFJTlQgVVFfb21wX2NvbmZpZ19zZXR0aW5nc19zY29wZTsKICAgIEVORApFTkQKR08KCklGIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgbmFtZSA9IE4nSVhfb21wX2NvbmZpZ19zZXR0aW5nc19yZXNvbHZlJwogICAgICBBTkQgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLmNvbmZpZ19zZXR0aW5ncycpCikKQkVHSU4KICAgIERST1AgSU5ERVggSVhfb21wX2NvbmZpZ19zZXR0aW5nc19yZXNvbHZlIE9OIG9tcC5jb25maWdfc2V0dGluZ3M7CkVORApHTwoKSUYgT0JKRUNUX0lEKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4nVScpIElTIE5VTEwKQkVHSU4KICAgIENSRUFURSBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdzCiAgICAoCiAgICAgICAgQ29uZmlnSWQgaW50IElERU5USVRZKDEsMSkgTk9UIE5VTEwsCiAgICAgICAgQ29uZmlnU2V0dGluZ0lkIGludCBOT1QgTlVMTCwKCiAgICAgICAgLS0gU3RvcmVkIGFzIHRleHQgdG8gYWxsb3cgc2ltcGxlIHNjYWxhciB2YWx1ZXMgc3VjaCBhcyB0cnVlL2ZhbHNlLAogICAgICAgIC0tIG51bWJlcnMsIG5hbWVzLCBKU09OLCBYTUwsIG9yIHNlcmlhbGl6ZWQgdmFsdWVzIHdoZW4gcmVxdWlyZWQgYnkKICAgICAgICAtLSBmdXR1cmUgc2V0dGluZ3MuCiAgICAgICAgQ29uZmlnVmFsdWUgbnZhcmNoYXIobWF4KSBOVUxMLAoKICAgICAgICAtLSBPcHRpb25hbCBzY29wZS4gTlVMTCBtZWFucyBpbnN0YW5jZS13aWRlL2RlZmF1bHQgc2V0dGluZy4gTWF0Y2hpbmcKICAgICAgICAtLSBjb25zdW1lcnMgc2hvdWxkIHJlc29sdmUgYnkgc2NvcGUgcmFuaywgdGhlbiBwcmlvcml0eToKICAgICAgICAtLSB1c2VyID4gcGVybWlzc2lvbiA+IHJvbGUgPiBnbG9iYWw7IGhpZ2hlciBDb25maWdQcmlvcml0eSB3aW5zIHdpdGhpbgogICAgICAgIC0tIHRoZSBzYW1lIHNjb3BlIGNsYXNzLCBhbmQgQ29uZmlnSWQgaXMgdGhlIGRldGVybWluaXN0aWMgZmluYWwgdGllCiAgICAgICAgLS0gYnJlYWtlci4KICAgICAgICBDb25maWdVc3IgaW50IE5VTEwsCiAgICAgICAgQ29uZmlnUGVybWlzc2lvbiBpbnQgTlVMTCwKICAgICAgICBDb25maWdSb2xlIGludCBOVUxMLAogICAgICAgIENvbmZpZ1ByaW9yaXR5IGludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9jb25maWdfc2V0dGluZ3NfQ29uZmlnUHJpb3JpdHkgREVGQVVMVCgwKSwKICAgICAgICBDb25maWdTY29wZVJhbmsgQVMgQ09OVkVSVCh0aW55aW50LAogICAgICAgICAgICBDQVNFCiAgICAgICAgICAgICAgICBXSEVOIENvbmZpZ1VzciBJUyBOT1QgTlVMTCBUSEVOIDMKICAgICAgICAgICAgICAgIFdIRU4gQ29uZmlnUGVybWlzc2lvbiBJUyBOT1QgTlVMTCBUSEVOIDIKICAgICAgICAgICAgICAgIFdIRU4gQ29uZmlnUm9sZSBJUyBOT1QgTlVMTCBUSEVOIDEKICAgICAgICAgICAgICAgIEVMU0UgMAogICAgICAgICAgICBFTkQpIFBFUlNJU1RFRCwKCiAgICAgICAgQ09OU1RSQUlOVCBQS19vbXBfY29uZmlnX3NldHRpbmdzIFBSSU1BUlkgS0VZKENvbmZpZ0lkKQogICAgKTsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4nQ29uZmlnU2V0dGluZ0lkJykgSVMgTlVMTApCRUdJTgogICAgQUxURVIgVEFCTEUgb21wLmNvbmZpZ19zZXR0aW5ncyBBREQgQ29uZmlnU2V0dGluZ0lkIGludCBOVUxMOwpFTkQKR08KCklGIENPTF9MRU5HVEgoTidvbXAuY29uZmlnX3NldHRpbmdzJywgTidDb25maWdDYXRlZ29yeScpIElTIE5PVCBOVUxMCiAgIEFORCBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4nQ29uZmlnU2V0dGluZycpIElTIE5PVCBOVUxMCkJFR0lOCiAgICBFWEVDIHNwX2V4ZWN1dGVzcWwgTicKSU5TRVJUIElOVE8gb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zKENvbmZpZ0NhdGVnb3J5LCBDb25maWdTZXR0aW5nLCBEZXNjcmlwdGlvbiwgU29ydE9yZGVyLCBJc0VuYWJsZWQpClNFTEVDVCBESVNUSU5DVCBjcy5Db25maWdDYXRlZ29yeSwKICAgICAgIGNzLkNvbmZpZ1NldHRpbmcsCiAgICAgICBOVUxMLAogICAgICAgMTAwMCwKICAgICAgIDEKRlJPTSBvbXAuY29uZmlnX3NldHRpbmdzIGNzCldIRVJFIGNzLkNvbmZpZ1NldHRpbmdJZCBJUyBOVUxMCiAgQU5EIExUUklNKFJUUklNKGNzLkNvbmZpZ0NhdGVnb3J5KSkgPD4gTicnJycKICBBTkQgTFRSSU0oUlRSSU0oY3MuQ29uZmlnU2V0dGluZykpIDw+IE4nJycnCiAgQU5EIE5PVCBFWElTVFMKICAoCiAgICAgIFNFTEVDVCAxCiAgICAgIEZST00gb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zIGV4aXN0aW5nCiAgICAgIFdIRVJFIGV4aXN0aW5nLkNvbmZpZ0NhdGVnb3J5ID0gY3MuQ29uZmlnQ2F0ZWdvcnkKICAgICAgICBBTkQgZXhpc3RpbmcuQ29uZmlnU2V0dGluZyA9IGNzLkNvbmZpZ1NldHRpbmcKICApOyc7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5jb25maWdfc2V0dGluZ3MnLCBOJ0NvbmZpZ0NhdGVnb3J5JykgSVMgTk9UIE5VTEwKICAgQU5EIENPTF9MRU5HVEgoTidvbXAuY29uZmlnX3NldHRpbmdzJywgTidDb25maWdTZXR0aW5nJykgSVMgTk9UIE5VTEwKQkVHSU4KICAgIEVYRUMgc3BfZXhlY3V0ZXNxbCBOJwpVUERBVEUgY3MKICAgU0VUIENvbmZpZ1NldHRpbmdJZCA9IGRlZi5Db25maWdTZXR0aW5nSWQKRlJPTSBvbXAuY29uZmlnX3NldHRpbmdzIGNzCklOTkVSIEpPSU4gb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zIGRlZgogICAgT04gZGVmLkNvbmZpZ0NhdGVnb3J5ID0gY3MuQ29uZmlnQ2F0ZWdvcnkKICAgQU5EIGRlZi5Db25maWdTZXR0aW5nID0gY3MuQ29uZmlnU2V0dGluZwpXSEVSRSBjcy5Db25maWdTZXR0aW5nSWQgSVMgTlVMTDsnOwpFTkQKR08KCklGIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBvbXAuY29uZmlnX3NldHRpbmdzCiAgICBXSEVSRSBDb25maWdTZXR0aW5nSWQgSVMgTlVMTAopCkJFR0lOCiAgICBUSFJPVyA1MTAyMCwgJ29tcC5jb25maWdfc2V0dGluZ3MgY29udGFpbnMgcm93cyB0aGF0IGNvdWxkIG5vdCBiZSBtYXBwZWQgdG8gb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zLicsIDE7CkVORApHTwoKSUYgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5jb2x1bW5zCiAgICBXSEVSRSBvYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuY29uZmlnX3NldHRpbmdzJykKICAgICAgQU5EIG5hbWUgPSBOJ0NvbmZpZ1NldHRpbmdJZCcKICAgICAgQU5EIGlzX251bGxhYmxlID0gMQopCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdzIEFMVEVSIENPTFVNTiBDb25maWdTZXR0aW5nSWQgaW50IE5PVCBOVUxMOwpFTkQKR08KCklGIENPTF9MRU5HVEgoTidvbXAuY29uZmlnX3NldHRpbmdzJywgTidDb25maWdDYXRlZ29yeScpIElTIE5PVCBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdzIERST1AgQ09MVU1OIENvbmZpZ0NhdGVnb3J5OwpFTkQKR08KCklGIENPTF9MRU5HVEgoTidvbXAuY29uZmlnX3NldHRpbmdzJywgTidDb25maWdTZXR0aW5nJykgSVMgTk9UIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5jb25maWdfc2V0dGluZ3MgRFJPUCBDT0xVTU4gQ29uZmlnU2V0dGluZzsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4nQ29uZmlnUHJpb3JpdHknKSBJUyBOVUxMCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdzCiAgICAgICAgQUREIENvbmZpZ1ByaW9yaXR5IGludCBOT1QgTlVMTCBDT05TVFJBSU5UIERGX29tcF9jb25maWdfc2V0dGluZ3NfQ29uZmlnUHJpb3JpdHkgREVGQVVMVCgwKSBXSVRIIFZBTFVFUzsKRU5ECkdPCgpJRiBDT0xfTEVOR1RIKE4nb21wLmNvbmZpZ19zZXR0aW5ncycsIE4nQ29uZmlnUGVybWlzc2lvbicpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5jb25maWdfc2V0dGluZ3MgQUREIENvbmZpZ1Blcm1pc3Npb24gaW50IE5VTEw7CkVORApHTwoKSUYgQ09MX0xFTkdUSChOJ29tcC5jb25maWdfc2V0dGluZ3MnLCBOJ0NvbmZpZ1Njb3BlUmFuaycpIElTIE5VTEwKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5jb25maWdfc2V0dGluZ3MKICAgICAgICBBREQgQ29uZmlnU2NvcGVSYW5rIEFTIENPTlZFUlQodGlueWludCwKICAgICAgICAgICAgQ0FTRQogICAgICAgICAgICAgICAgV0hFTiBDb25maWdVc3IgSVMgTk9UIE5VTEwgVEhFTiAzCiAgICAgICAgICAgICAgICBXSEVOIENvbmZpZ1Blcm1pc3Npb24gSVMgTk9UIE5VTEwgVEhFTiAyCiAgICAgICAgICAgICAgICBXSEVOIENvbmZpZ1JvbGUgSVMgTk9UIE5VTEwgVEhFTiAxCiAgICAgICAgICAgICAgICBFTFNFIDAKICAgICAgICAgICAgRU5EKSBQRVJTSVNURUQ7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuZm9yZWlnbl9rZXlzCiAgICBXSEVSRSBuYW1lID0gTidGS19vbXBfY29uZmlnX3NldHRpbmdzX2RlZmluaXRpb24nCiAgICAgIEFORCBwYXJlbnRfb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLmNvbmZpZ19zZXR0aW5ncycpCikKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5jb25maWdfc2V0dGluZ3MKICAgICAgICBBREQgQ09OU1RSQUlOVCBGS19vbXBfY29uZmlnX3NldHRpbmdzX2RlZmluaXRpb24KICAgICAgICBGT1JFSUdOIEtFWShDb25maWdTZXR0aW5nSWQpIFJFRkVSRU5DRVMgb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zKENvbmZpZ1NldHRpbmdJZCk7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMua2V5X2NvbnN0cmFpbnRzCiAgICBXSEVSRSBbdHlwZV0gPSBOJ1BLJwogICAgICBBTkQgcGFyZW50X29iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5jb25maWdfc2V0dGluZ3MnKQopCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdzCiAgICAgICAgQUREIENPTlNUUkFJTlQgUEtfb21wX2NvbmZpZ19zZXR0aW5ncyBQUklNQVJZIEtFWShDb25maWdJZCk7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuZm9yZWlnbl9rZXlzCiAgICBXSEVSRSBuYW1lID0gTidGS19vbXBfY29uZmlnX3NldHRpbmdzX3VzZXInCiAgICAgIEFORCBwYXJlbnRfb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLmNvbmZpZ19zZXR0aW5ncycpCikKQkVHSU4KICAgIEFMVEVSIFRBQkxFIG9tcC5jb25maWdfc2V0dGluZ3MKICAgICAgICBBREQgQ09OU1RSQUlOVCBGS19vbXBfY29uZmlnX3NldHRpbmdzX3VzZXIKICAgICAgICBGT1JFSUdOIEtFWShDb25maWdVc3IpIFJFRkVSRU5DRVMgb21wLnVzZXJzKHVzZXJfaWQpOwpFTkQKR08KCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gc3lzLmZvcmVpZ25fa2V5cwogICAgV0hFUkUgbmFtZSA9IE4nRktfb21wX2NvbmZpZ19zZXR0aW5nc19wZXJtaXNzaW9uJwogICAgICBBTkQgcGFyZW50X29iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5jb25maWdfc2V0dGluZ3MnKQopCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdzCiAgICAgICAgQUREIENPTlNUUkFJTlQgRktfb21wX2NvbmZpZ19zZXR0aW5nc19wZXJtaXNzaW9uCiAgICAgICAgRk9SRUlHTiBLRVkoQ29uZmlnUGVybWlzc2lvbikgUkVGRVJFTkNFUyBvbXAuUGVybWlzc2lvbnMoUGVybWlzc2lvbklkKTsKRU5ECkdPCgpJRiBOT1QgRVhJU1RTCigKICAgIFNFTEVDVCAxCiAgICBGUk9NIHN5cy5mb3JlaWduX2tleXMKICAgIFdIRVJFIG5hbWUgPSBOJ0ZLX29tcF9jb25maWdfc2V0dGluZ3Nfcm9sZScKICAgICAgQU5EIHBhcmVudF9vYmplY3RfaWQgPSBPQkpFQ1RfSUQoTidvbXAuY29uZmlnX3NldHRpbmdzJykKKQpCRUdJTgogICAgQUxURVIgVEFCTEUgb21wLmNvbmZpZ19zZXR0aW5ncwogICAgICAgIEFERCBDT05TVFJBSU5UIEZLX29tcF9jb25maWdfc2V0dGluZ3Nfcm9sZQogICAgICAgIEZPUkVJR04gS0VZKENvbmZpZ1JvbGUpIFJFRkVSRU5DRVMgb21wLlJvbGVzKFJvbGVJZCk7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMua2V5X2NvbnN0cmFpbnRzCiAgICBXSEVSRSBuYW1lID0gTidVUV9vbXBfY29uZmlnX3NldHRpbmdzX3Njb3BlJwogICAgICBBTkQgcGFyZW50X29iamVjdF9pZCA9IE9CSkVDVF9JRChOJ29tcC5jb25maWdfc2V0dGluZ3MnKQopCkJFR0lOCiAgICBBTFRFUiBUQUJMRSBvbXAuY29uZmlnX3NldHRpbmdzCiAgICAgICAgQUREIENPTlNUUkFJTlQgVVFfb21wX2NvbmZpZ19zZXR0aW5nc19zY29wZQogICAgICAgIFVOSVFVRShDb25maWdTZXR0aW5nSWQsIENvbmZpZ1VzciwgQ29uZmlnUGVybWlzc2lvbiwgQ29uZmlnUm9sZSk7CkVORApHTwoKSUYgTk9UIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBzeXMuaW5kZXhlcwogICAgV0hFUkUgbmFtZSA9IE4nSVhfb21wX2NvbmZpZ19zZXR0aW5nc19yZXNvbHZlJwogICAgICBBTkQgb2JqZWN0X2lkID0gT0JKRUNUX0lEKE4nb21wLmNvbmZpZ19zZXR0aW5ncycpCikKQkVHSU4KICAgIENSRUFURSBJTkRFWCBJWF9vbXBfY29uZmlnX3NldHRpbmdzX3Jlc29sdmUKICAgICAgICBPTiBvbXAuY29uZmlnX3NldHRpbmdzKENvbmZpZ1NldHRpbmdJZCwgQ29uZmlnU2NvcGVSYW5rIERFU0MsIENvbmZpZ1ByaW9yaXR5IERFU0MsIENvbmZpZ0lkIERFU0MpCiAgICAgICAgSU5DTFVERShDb25maWdVc3IsIENvbmZpZ1Blcm1pc3Npb24sIENvbmZpZ1JvbGUpOwpFTkQKR08K",
"sha256": "cd9e1851f0789fb14641c438fe292bcb3cdca3d1909d1f0b7f659678b3350e34"
},
{
"key": "initialize-core-baseline",
"phase": "initialize",
"scope": "omp",
"order": 20,
"path": "sql/2-initialize-openmoduleplatform.sql",
"execution": "idempotent",
"inlineSql": null,
"contentEncoding": "base64-utf8",
"content": "LS0gRmlsZTogc3FsLzItaW5pdGlhbGl6ZS1vcGVubW9kdWxlcGxhdGZvcm0uc3FsCi0tIElNUE9SVEFOVDogdXNlIHRoZSBIb3N0QWdlbnQtZmlyc3QgaW5zdGFsbGVyIGZvciBhdXRvbWF0ZWQgbG9jYWwgaW5zdGFsbHMsIG9yCi0tIHJlcGxhY2UgdGhlIGJvb3RzdHJhcCBsaXRlcmFscyBiZWxvdyBtYW51YWxseSB3aXRoIGEgc2luZ2xlLXF1b3RlLWVzY2FwZWQKLS0gV2luZG93cyBwcmluY2lwYWwgYW5kIHRoZSBtYXRjaGluZyBwcmluY2lwYWwgdHlwZS4KLyoKT3Blbk1vZHVsZVBsYXRmb3JtIGNvcmUgaW5pdGlhbGl6YXRpb24gc2NyaXB0LgoKU2VlZHMgdGhlIGRlZmF1bHQgT01QIGluc3RhbmNlLCBib290c3RyYXAgUkJBQyBwbGFjZWhvbGRlcnMsIGJhc2VsaW5lIGhvc3QKcm93cywgYW5kIHNoYXJlZCBzdHJ1Y3R1cmFsIHZhbHVlcyB0aGF0IGxpdmUgaW4gdGhlIG9tcCBzY2hlbWEuCgpQcmVyZXF1aXNpdGVzOgotIFJ1biAxLXNldHVwLW9wZW5tb2R1bGVwbGF0Zm9ybS5zcWwgZmlyc3QuCi0gU2V0IEBCb290c3RyYXBQb3J0YWxBZG1pblByaW5jaXBhbCB0byB0aGUgV2luZG93cyB1c2VyIG9yIGdyb3VwIHRoYXQgc2hvdWxkCiAgcmVjZWl2ZSB0aGUgaW5pdGlhbCBQb3J0YWxBZG1pbnMgcm9sZS4KLSBTZXQgQEJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsVHlwZSB0byBOJ0FEVXNlcicgZm9yIGEgV2luZG93cyB1c2VyIG9yCiAgTidBREdyb3VwJyBmb3IgYSBXaW5kb3dzIGdyb3VwLiBMZWdhY3kgTidVc2VyJyB2YWx1ZXMgYXJlIG5vcm1hbGl6ZWQgdG8KICBOJ0FEVXNlcicuIFRoZSBzb3VyY2UgZGVmYXVsdCBpcyBOJ0FEVXNlcicgYmVjYXVzZSBsb2NhbCBib290c3RyYXAgaW5zdGFsbHMKICBub3JtYWxseSBncmFudCB0aGUgY3VycmVudCBXaW5kb3dzIHVzZXIuIFByZWZlciB0aGUgSG9zdEFnZW50LWZpcnN0IGluc3RhbGxlcgogIGZvciBsb2NhbCB1c2VyIGluc3RhbGxzIGJlY2F1c2UgaXQgZXNjYXBlcyB0aGUgdmFsdWUgYmVmb3JlIHJ1bm5pbmcgU1FMLgoKUG9ydGFsLCBjb250ZW50LCBpZnJhbWUsIGFuZCBleGFtcGxlIG1vZHVsZXMgYXJlIGluaXRpYWxpemVkIHNlcGFyYXRlbHkgZnJvbQp0aGVpciBvd24gbW9kdWxlIHNxbCBmb2xkZXJzLgoqLwpTRVQgQU5TSV9OVUxMUyBPTjsKU0VUIFFVT1RFRF9JREVOVElGSUVSIE9OOwpTRVQgQU5TSV9QQURESU5HIE9OOwpTRVQgQU5TSV9XQVJOSU5HUyBPTjsKU0VUIENPTkNBVF9OVUxMX1lJRUxEU19OVUxMIE9OOwpTRVQgQVJJVEhBQk9SVCBPTjsKU0VUIE5VTUVSSUNfUk9VTkRBQk9SVCBPRkY7CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIFNlZWQgYmFzZWxpbmUgaW5zdGFuY2UsIHRlbXBsYXRlcywgaG9zdCwgYW5kIHN0cnVjdHVyYWwgcGxhY2Vob2xkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KREVDTEFSRSBARGVmYXVsdEluc3RhbmNlSWQgdW5pcXVlaWRlbnRpZmllcjsKREVDTEFSRSBARGVmYXVsdEhvc3RJZCB1bmlxdWVpZGVudGlmaWVyOwotLSBUaGUgc2VlZGVkIGhvc3QgaXMgYSBkZXZlbG9wbWVudC90ZW1wbGF0ZSBwbGFjZWhvbGRlciBmb3IgY3VycmVudCBXaW5kb3dzIElJUwotLSBkZXBsb3ltZW50cy4gUmVhbCBob3N0cyBjYW4gb3ZlcnJpZGUgQXJjaGl0ZWN0dXJlIGR1cmluZyBlbnZpcm9ubWVudCBzZXR1cC4KREVDTEFSRSBARGVmYXVsdEhvc3RBcmNoaXRlY3R1cmUgbnZhcmNoYXIoMjApID0gTid4NjQnOwpERUNMQVJFIEBEZWZhdWx0SW5zdGFuY2VUZW1wbGF0ZUlkIGludDsKREVDTEFSRSBARGVmYXVsdEhvc3RUZW1wbGF0ZUlkIGludDsKREVDTEFSRSBASWlzSG9zdFRlbXBsYXRlSWQgaW50OwpERUNMQVJFIEBTZXJ2aWNlSG9zdFRlbXBsYXRlSWQgaW50OwpERUNMQVJFIEBQb3J0YWxBZG1pbnNSb2xlSWQgaW50OwpERUNMQVJFIEBFdmVyeW9uZVJvbGVJZCBpbnQ7CkRFQ0xBUkUgQEF1dGhlbnRpY2F0ZWRVc2Vyc1JvbGVJZCBpbnQ7Ci0tIFRoZXNlIHZlcnNpb25zIHNlZWQgdGhlIG1pbmltdW0gYXJ0aWZhY3Qgcm93cyBidW5kbGVkIHdpdGggdGhlIGJhc2VsaW5lIFNRTAotLSBzY3JpcHQuIFRoZXkgYXJlIG5vdCBkZXNpcmVkIHJ1bnRpbWUgdGFyZ2V0czsgYWZ0ZXIgcG9ydGFibGUgcGFja2FnZXMgaGF2ZQotLSBiZWVuIGltcG9ydGVkLCB0aGUgdGVtcGxhdGUgc3RhdGUgYmVsb3cgcmVzb2x2ZXMgdGhlIGxhdGVzdCBjb21wYXRpYmxlCi0tIHJlZ2lzdGVyZWQgYXJ0aWZhY3QgdmVyc2lvbnMgZnJvbSBvbXAuQXJ0aWZhY3RzLgpERUNMQVJFIEBCYXNlbGluZUhvc3RBZ2VudEFydGlmYWN0VmVyc2lvbiBudmFyY2hhcig1MCkgPSBOJzAuMy41NSc7IC0tIE1pbmltdW0gYnVuZGxlZCBob3N0LWFnZW50IGFydGlmYWN0IG9ubHkuCkRFQ0xBUkUgQEJhc2VsaW5lV29ya2VyTWFuYWdlckFydGlmYWN0VmVyc2lvbiBudmFyY2hhcig1MCkgPSBOJzAuMy44JzsgLS0gTWluaW11bSBidW5kbGVkIHNlcnZpY2UtYXBwIGFydGlmYWN0IG9ubHkuCkRFQ0xBUkUgQEJhc2VsaW5lV29ya2VyUHJvY2Vzc0hvc3RBcnRpZmFjdFZlcnNpb24gbnZhcmNoYXIoNTApID0gTicwLjMuMyc7IC0tIE1pbmltdW0gYnVuZGxlZCB3b3JrZXItaG9zdCBhcnRpZmFjdCBvbmx5LgpERUNMQVJFIEBEZWZhdWx0SG9zdEtleSBudmFyY2hhcigxMjgpID0gTidzYW1wbGUtaG9zdCc7CkRFQ0xBUkUgQERlZmF1bHRIb3N0RGlzcGxheU5hbWUgbnZhcmNoYXIoMjAwKSA9IE4nU2FtcGxlIEhvc3QnOwpERUNMQVJFIEBEZWZhdWx0SG9zdEVudmlyb25tZW50IG52YXJjaGFyKDUwKSA9IE4nRGV2ZWxvcG1lbnQnOwpERUNMQVJFIEBTZWVkRGVmYXVsdEhvc3QgYml0ID0gMTsKREVDTEFSRSBAU3VwcHJlc3NlZERlZmF1bHRIb3N0SWQgdW5pcXVlaWRlbnRpZmllcjsKLS0gU0VDVVJJVFk6IFRoaXMgc2VudGluZWwgcGxhY2Vob2xkZXIgaXMgb25seSBmb3Igc291cmNlLWNvbnRyb2xsZWQgYm9vdHN0cmFwCi0tIHNjcmlwdHMuIEl0IG11c3QgbmV2ZXIgYmUgZXhlY3V0ZWQgaW4gcHJvZHVjdGlvbiB1bmNoYW5nZWQuIERlcGxveW1lbnQKLS0gYXV0b21hdGlvbiBzaG91bGQgcGF0Y2ggaXQgZnJvbSBhIHByb3RlY3RlZCBlbnZpcm9ubWVudC1zcGVjaWZpYyB2YWx1ZTsgdGhlCi0tIFRIUk9XIGNoZWNrIGJlbG93IGlzIGEgZmFpbC1zYWZlLCBub3QgdGhlIHByaW1hcnkgY29udHJvbC4KLS0gVGhlIGJvb3RzdHJhcCBzdGF5cyBhcyBhIGxpdGVyYWwgcmVwbGFjZW1lbnQgaW5zdGVhZCBvZiBhIHN0b3JlZCBwcm9jZWR1cmUKLS0gcGFyYW1ldGVyIHNvIHRoZSBzYW1lIHNjcmlwdCBjYW4gaW5pdGlhbGl6ZSBhIGNsZWFuIGRhdGFiYXNlIHdpdGggc3FsY21kIG9yCi0tIHRoZSBsb2NhbCBpbnN0YWxsZXIgYmVmb3JlIGFueSBhcHBsaWNhdGlvbi1zaWRlIGRlcGxveW1lbnQgaGVscGVycyBleGlzdC4KREVDTEFSRSBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwgbnZhcmNoYXIoMjU2KSA9IE4nX19CT09UU1RSQVBfUE9SVEFMX0FETUlOX1BSSU5DSVBBTF9fJzsKREVDTEFSRSBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWxUeXBlIG52YXJjaGFyKDUwKSA9IE4nQURVc2VyJzsKREVDTEFSRSBASW5zZXJ0ZWRJbnN0YW5jZVRlbXBsYXRlSWRzIFRBQkxFIChJbnN0YW5jZVRlbXBsYXRlSWQgaW50IE5PVCBOVUxMKTsKREVDTEFSRSBASW5zZXJ0ZWRIb3N0VGVtcGxhdGVJZHMgVEFCTEUgKEhvc3RUZW1wbGF0ZUlkIGludCBOT1QgTlVMTCk7CgpJRiBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwgPSBOJ19fQk9PVFNUUkFQX1BPUlRBTF9BRE1JTl9QUklOQ0lQQUxfXycKQkVHSU4KICAgIC0tIFNldCBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwgbWFudWFsbHkgb3IgdXNlIHRoZSBIb3N0QWdlbnQtZmlyc3QKICAgIC0tIGluc3RhbGxlciBwcm9maWxlIGJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsIHNldHRpbmcuCiAgICAtLSBUaGlzIHNjcmlwdCBpbnNlcnRzIG9uZSBib290c3RyYXAgcHJpbmNpcGFsIHBlciBleGVjdXRpb24uCiAgICBUSFJPVyA1MTAwMCwgJ0Jvb3RzdHJhcCBwb3J0YWwgYWRtaW4gcHJpbmNpcGFsIHdhcyBub3QgcmVwbGFjZWQuIFNldCBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwgdG8gYSB2YWxpZCBXaW5kb3dzIHVzZXIgb3IgZ3JvdXAgKERPTUFJTlxOYW1lIG9yIHVzZXJAZG9tYWluKSBiZWZvcmUgcnVubmluZyB0aGlzIHNjcmlwdCwgb3IgdXNlIHRoZSBIb3N0QWdlbnQtZmlyc3QgaW5zdGFsbGVyIHByb2ZpbGUgYm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwgc2V0dGluZy4nLCAxOwpFTkQKCi0tIFRoZSBzZXR1cCBzY3JpcHQgYWxzbyBhZGRzIGRhdGFiYXNlIGNvbnN0cmFpbnQKLS0gQ0tfb21wX1JvbGVQcmluY2lwYWxzX05vQm9vdHN0cmFwUGxhY2Vob2xkZXJzIHNvIHRoaXMgc2VudGluZWwgY2Fubm90IGJlCi0tIHBlcnNpc3RlZCBpZiBhIGRpZmZlcmVudCBkZXBsb3ltZW50IHBhdGggYnlwYXNzZXMgdGhlIGluaXRpYWxpemF0aW9uIGd1YXJkLgoKLS0gS2VlcCBib290c3RyYXAgcHJpbmNpcGFsIHR5cGUgbm9ybWFsaXphdGlvbiBoZXJlIGV2ZW4gdGhvdWdoIHRoZSBzZXR1cCBzY3JpcHQKLS0gYWxzbyBtaWdyYXRlcyBzdG9yZWQgbGVnYWN5IHZhbHVlcy4gVGhpcyBzY3JpcHQgaXMgb2Z0ZW4gcGF0Y2hlZCBhbmQgZXhlY3V0ZWQKLS0gaW5kZXBlbmRlbnRseSBieSBpbnN0YWxsZXJzLCBzbyBpdCBtdXN0IHZhbGlkYXRlIGl0cyBvd24gaW5wdXQuClNFVCBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWxUeXBlID0KICAgIENBU0UgVVBQRVIoTFRSSU0oUlRSSU0oQEJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsVHlwZSkpKQogICAgICAgIFdIRU4gTidVU0VSJyBUSEVOIE4nQURVc2VyJwogICAgICAgIFdIRU4gTidBRFVTRVInIFRIRU4gTidBRFVzZXInCiAgICAgICAgV0hFTiBOJ0FER1JPVVAnIFRIRU4gTidBREdyb3VwJwogICAgICAgIEVMU0UgQEJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsVHlwZQogICAgRU5EOwoKSUYgQEJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsVHlwZSBOT1QgSU4gKE4nQURVc2VyJywgTidBREdyb3VwJykKQkVHSU4KICAgIFRIUk9XIDUxMDAzLCAnU2V0IEBCb290c3RyYXBQb3J0YWxBZG1pblByaW5jaXBhbFR5cGUgdG8gTicnQURVc2VyJycgZm9yIGEgV2luZG93cyB1c2VyIG9yIE4nJ0FER3JvdXAnJyBmb3IgYSBXaW5kb3dzIGdyb3VwLicsIDE7CkVORAoKLS0gS2VlcCB0aGlzIHZhbGlkYXRpb24gaW50ZW50aW9uYWxseSBXaW5kb3dzLXByaW5jaXBhbCBvcmllbnRlZC4gVGhlIGJvb3RzdHJhcAotLSBwcmluY2lwYWwgaXMgc2VlZGVkIGludG8gQUQtYmFja2VkIFJCQUMgYW5kIHNob3VsZCBiZSBlaXRoZXIgRE9NQUlOXE5hbWUgb3IKLS0gVVBOIGZvcm07IGN1c3RvbWVyLXNwZWNpZmljIGluc3RhbGxlcnMgcGF0Y2ggdGhpcyBsaXRlcmFsIGJlZm9yZSBleGVjdXRpb24uCklGIEBCb290c3RyYXBQb3J0YWxBZG1pblByaW5jaXBhbCA8PiBMVFJJTShSVFJJTShAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwpKQpCRUdJTgogICAgVEhST1cgNTEwMDQsICdCb290c3RyYXAgcHJpbmNpcGFsIG11c3Qgbm90IGNvbnRhaW4gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlLicsIDE7CkVORAoKLS0gRGlzYWxsb3cgY2hhcmFjdGVycyB0aGF0IGFyZSBpbnZhbGlkIGluIFdpbmRvd3MvQUQgYWNjb3VudCBuYW1lcyBvciByaXNreSBpbgotLSBkZXBsb3ltZW50IGxvZ3Mvc2NyaXB0cy4gTmV3bGluZXMgYXJlIGhhbmRsZWQgaGVyZSBpbnN0ZWFkIG9mIHRoZSB0cmltIGNoZWNrCi0tIGFib3ZlIGJlY2F1c2UgTFRSSU0vUlRSSU0gYXJlIGtlcHQgZm9yIGNvbXBhdGliaWxpdHktc3R5bGUgZWRnZSB0cmltbWluZy4KLS0gQm9vdHN0cmFwIGFjY2VwdHMgb25seSBET01BSU5cTmFtZSBvciB1c2VyQGRvbWFpbi4KREVDTEFSRSBAQm9vdHN0cmFwUHJpbmNpcGFsSW52YWxpZENoYXJhY3RlcnMgVEFCTEUgKFZhbHVlIG52YXJjaGFyKDEpIE5PVCBOVUxMKTsKSU5TRVJUIElOVE8gQEJvb3RzdHJhcFByaW5jaXBhbEludmFsaWRDaGFyYWN0ZXJzKFZhbHVlKQpWQUxVRVMoTicnJycpLCAoTiciJyksIChOJzwnKSwgKE4nPicpLCAoTid8JyksIChOJz8nKSwgKE4nKicpLCAoTic7JyksIChOQ0hBUigxMCkpLCAoTkNIQVIoMTMpKTsKCklGIEVYSVNUUwooCiAgICBTRUxFQ1QgMQogICAgRlJPTSBAQm9vdHN0cmFwUHJpbmNpcGFsSW52YWxpZENoYXJhY3RlcnMgaW52YWxpZAogICAgV0hFUkUgQ0hBUklOREVYKGludmFsaWQuVmFsdWUsIEBCb290c3RyYXBQb3J0YWxBZG1pblByaW5jaXBhbCkgPiAwCikKQkVHSU4KICAgIFRIUk9XIDUxMDA1LCAnQm9vdHN0cmFwIHByaW5jaXBhbCBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCB2YWxpZCBmb3IgQUQgYm9vdHN0cmFwIHZhbHVlcy4nLCAxOwpFTkQKCkRFQ0xBUkUgQEJvb3RzdHJhcFByaW5jaXBhbFNsYXNoUG9zaXRpb24gaW50ID0gQ0hBUklOREVYKE4nXCcsIEBCb290c3RyYXBQb3J0YWxBZG1pblByaW5jaXBhbCk7CkRFQ0xBUkUgQEJvb3RzdHJhcFByaW5jaXBhbEF0UG9zaXRpb24gaW50ID0gQ0hBUklOREVYKE4nQCcsIEBCb290c3RyYXBQb3J0YWxBZG1pblByaW5jaXBhbCk7CkRFQ0xBUkUgQEJvb3RzdHJhcFByaW5jaXBhbFNlY29uZFNsYXNoUG9zaXRpb24gaW50ID0gMDsKREVDTEFSRSBAQm9vdHN0cmFwUHJpbmNpcGFsU2Vjb25kQXRQb3NpdGlvbiBpbnQgPSAwOwoKSUYgQEJvb3RzdHJhcFByaW5jaXBhbFNsYXNoUG9zaXRpb24gPiAwCkJFR0lOCiAgICBTRVQgQEJvb3RzdHJhcFByaW5jaXBhbFNlY29uZFNsYXNoUG9zaXRpb24gPSBDSEFSSU5ERVgoTidcJywgQEJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsLCBAQm9vdHN0cmFwUHJpbmNpcGFsU2xhc2hQb3NpdGlvbiArIDEpOwpFTkQKCklGIEBCb290c3RyYXBQcmluY2lwYWxBdFBvc2l0aW9uID4gMApCRUdJTgogICAgU0VUIEBCb290c3RyYXBQcmluY2lwYWxTZWNvbmRBdFBvc2l0aW9uID0gQ0hBUklOREVYKE4nQCcsIEBCb290c3RyYXBQb3J0YWxBZG1pblByaW5jaXBhbCwgQEJvb3RzdHJhcFByaW5jaXBhbEF0UG9zaXRpb24gKyAxKTsKRU5ECgpJRiBAQm9vdHN0cmFwUHJpbmNpcGFsU2xhc2hQb3NpdGlvbiA+IDAgQU5EIEBCb290c3RyYXBQcmluY2lwYWxBdFBvc2l0aW9uID4gMApCRUdJTgogICAgVEhST1cgNTEwMDksICdCb290c3RyYXAgcHJpbmNpcGFsIG11c3QgdXNlIGVpdGhlciBET01BSU5cTmFtZSBvciB1c2VyQGRvbWFpbiBmb3JtLCBub3QgYm90aC4nLCAxOwpFTkQKCklGIEBCb290c3RyYXBQcmluY2lwYWxTZWNvbmRTbGFzaFBvc2l0aW9uID4gMApCRUdJTgogICAgVEhST1cgNTEwMTAsICdCb290c3RyYXAgcHJpbmNpcGFsIERPTUFJTlxOYW1lIGZvcm0gbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGJhY2tzbGFzaC4nLCAxOwpFTkQKCklGIEBCb290c3RyYXBQcmluY2lwYWxTZWNvbmRBdFBvc2l0aW9uID4gMApCRUdJTgogICAgVEhST1cgNTEwMTEsICdCb290c3RyYXAgcHJpbmNpcGFsIFVQTiBmb3JtIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBhdCBzaWduLicsIDE7CkVORAoKSUYgQEJvb3RzdHJhcFByaW5jaXBhbFNsYXNoUG9zaXRpb24gPSAwIEFORCBAQm9vdHN0cmFwUHJpbmNpcGFsQXRQb3NpdGlvbiA9IDAKQkVHSU4KICAgIFRIUk9XIDUxMDA2LCAnQm9vdHN0cmFwIHByaW5jaXBhbCBtdXN0IHVzZSBET01BSU5cTmFtZSBvciB1c2VyQGRvbWFpbiBmb3JtLicsIDE7CkVORAoKSUYgQEJvb3RzdHJhcFByaW5jaXBhbFNsYXNoUG9zaXRpb24gPiAwCiAgICBBTkQgKEBCb290c3RyYXBQcmluY2lwYWxTbGFzaFBvc2l0aW9uID0gMSBPUiBAQm9vdHN0cmFwUHJpbmNpcGFsU2xhc2hQb3NpdGlvbiA9IExFTihAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwpKQpCRUdJTgogICAgVEhST1cgNTEwMDcsICdCb290c3RyYXAgcHJpbmNpcGFsIERPTUFJTlxOYW1lIGZvcm0gaXMgaW5jb21wbGV0ZS4nLCAxOwpFTkQKCklGIEBCb290c3RyYXBQcmluY2lwYWxBdFBvc2l0aW9uID4gMAogICAgQU5EIChAQm9vdHN0cmFwUHJpbmNpcGFsQXRQb3NpdGlvbiA9IDEgT1IgQEJvb3RzdHJhcFByaW5jaXBhbEF0UG9zaXRpb24gPSBMRU4oQEJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsKSkKQkVHSU4KICAgIFRIUk9XIDUxMDA4LCAnQm9vdHN0cmFwIHByaW5jaXBhbCBVUE4gZm9ybSBpcyBpbmNvbXBsZXRlLicsIDE7CkVORAoKCklGIE5PVCBFWElTVFMgKFNFTEVDVCAxIEZST00gb21wLkluc3RhbmNlVGVtcGxhdGVzIFdIRVJFIFRlbXBsYXRlS2V5ID0gTidkZWZhdWx0JykKQkVHSU4KICAgIElOU0VSVCBJTlRPIG9tcC5JbnN0YW5jZVRlbXBsYXRlcyhUZW1wbGF0ZUtleSwgRGlzcGxheU5hbWUsIERlc2NyaXB0aW9uKQogICAgT1VUUFVUIGluc2VydGVkLkluc3RhbmNlVGVtcGxhdGVJZCBJTlRPIEBJbnNlcnRlZEluc3RhbmNlVGVtcGxhdGVJZHMoSW5zdGFuY2VUZW1wbGF0ZUlkKQogICAgVkFMVUVTKE4nZGVmYXVsdCcsIE4nRGVmYXVsdCBJbnN0YW5jZSBUZW1wbGF0ZScsIE4nTWluaW1hbCBiYXNlbGluZSB0ZW1wbGF0ZSBmb3IgYW4gT01QIGluc3RhbmNlJyk7CkVORAoKSUYgTk9UIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBvbXAuSG9zdFRlbXBsYXRlcyBXSEVSRSBUZW1wbGF0ZUtleSA9IE4nZGVmYXVsdC1ob3N0JykKQkVHSU4KICAgIElOU0VSVCBJTlRPIG9tcC5Ib3N0VGVtcGxhdGVzKFRlbXBsYXRlS2V5LCBEaXNwbGF5TmFtZSwgRGVzY3JpcHRpb24pCiAgICBPVVRQVVQgaW5zZXJ0ZWQuSG9zdFRlbXBsYXRlSWQgSU5UTyBASW5zZXJ0ZWRIb3N0VGVtcGxhdGVJZHMoSG9zdFRlbXBsYXRlSWQpCiAgICBWQUxVRVMoTidkZWZhdWx0LWhvc3QnLCBOJ0RlZmF1bHQgSG9zdCBUZW1wbGF0ZScsIE4nTWluaW1hbCBiYXNlbGluZSBob3N0IHRlbXBsYXRlIGZvciBkZXZlbG9wbWVudCBhbmQgZXhhbXBsZXMnKTsKRU5ECgpNRVJHRSBvbXAuSG9zdFRlbXBsYXRlcyBBUyB0YXJnZXQKVVNJTkcKKAogICAgVkFMVUVTCiAgICAgICAgKE4nSUlTSG9zdCcsIE4nSUlTIEhvc3QnLCBOJ0hvc3RzIHRoYXQgcnVuIElJUyB3ZWIgYXBwbGljYXRpb25zIGZvciB0aGlzIE9NUCBpbnN0YWxsYXRpb24uJywgMTAwLCBDT05WRVJUKGJpdCwgMSkpLAogICAgICAgIChOJ1NlcnZpY2VIb3N0JywgTidTZXJ2aWNlIEhvc3QnLCBOJ0hvc3RzIHRoYXQgcnVuIFdpbmRvd3Mgc2VydmljZXMgYW5kIHdvcmtlciBydW50aW1lcyBmb3IgdGhpcyBPTVAgaW5zdGFsbGF0aW9uLicsIDIwMCwgQ09OVkVSVChiaXQsIDEpKQopIEFTIHNvdXJjZShUZW1wbGF0ZUtleSwgRGlzcGxheU5hbWUsIERlc2NyaXB0aW9uLCBTb3J0T3JkZXIsIElzRW5hYmxlZCkKT04gdGFyZ2V0LlRlbXBsYXRlS2V5ID0gc291cmNlLlRlbXBsYXRlS2V5CldIRU4gTUFUQ0hFRCBUSEVOCiAgICBVUERBVEUgU0VUIERpc3BsYXlOYW1lID0gc291cmNlLkRpc3BsYXlOYW1lLAogICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9IHNvdXJjZS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgU29ydE9yZGVyID0gc291cmNlLlNvcnRPcmRlciwKICAgICAgICAgICAgICAgSXNFbmFibGVkID0gc291cmNlLklzRW5hYmxlZCwKICAgICAgICAgICAgICAgVXBkYXRlZFV0YyA9IFNZU1VUQ0RBVEVUSU1FKCkKV0hFTiBOT1QgTUFUQ0hFRCBUSEVOCiAgICBJTlNFUlQoVGVtcGxhdGVLZXksIERpc3BsYXlOYW1lLCBEZXNjcmlwdGlvbiwgU29ydE9yZGVyLCBJc0VuYWJsZWQpCiAgICBWQUxVRVMoc291cmNlLlRlbXBsYXRlS2V5LCBzb3VyY2UuRGlzcGxheU5hbWUsIHNvdXJjZS5EZXNjcmlwdGlvbiwgc291cmNlLlNvcnRPcmRlciwgc291cmNlLklzRW5hYmxlZCk7CgpTRUxFQ1QgVE9QICgxKSBARGVmYXVsdEluc3RhbmNlVGVtcGxhdGVJZCA9IEluc3RhbmNlVGVtcGxhdGVJZApGUk9NIEBJbnNlcnRlZEluc3RhbmNlVGVtcGxhdGVJZHM7CgpJRiBARGVmYXVsdEluc3RhbmNlVGVtcGxhdGVJZCBJUyBOVUxMCkJFR0lOCiAgICBTRUxFQ1QgVE9QICgxKSBARGVmYXVsdEluc3RhbmNlVGVtcGxhdGVJZCA9IEluc3RhbmNlVGVtcGxhdGVJZAogICAgRlJPTSBvbXAuSW5zdGFuY2VUZW1wbGF0ZXMKICAgIFdIRVJFIFRlbXBsYXRlS2V5ID0gTidkZWZhdWx0JwogICAgT1JERVIgQlkgSW5zdGFuY2VUZW1wbGF0ZUlkOwpFTkQKCklGIEBEZWZhdWx0SW5zdGFuY2VUZW1wbGF0ZUlkIElTIE5VTEwKQkVHSU4KICAgIFRIUk9XIDUxMDAxLCAnVW5hYmxlIHRvIHJlc29sdmUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdGVtcGxhdGUgaWQgYWZ0ZXIgc2VlZGluZyBvbXAuSW5zdGFuY2VUZW1wbGF0ZXMuIFZlcmlmeSB0aGF0IG9tcC5JbnN0YW5jZVRlbXBsYXRlcyBjYW4gYmUgd3JpdHRlbiB0byBhbmQgdGhhdCBubyBjb25zdHJhaW50cyBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgdGVtcGxhdGUgcm93IGZyb20gYmVpbmcgaW5zZXJ0ZWQuJywgMTsKRU5ECgpTRUxFQ1QgVE9QICgxKSBARGVmYXVsdEhvc3RUZW1wbGF0ZUlkID0gSG9zdFRlbXBsYXRlSWQKRlJPTSBASW5zZXJ0ZWRIb3N0VGVtcGxhdGVJZHM7CgpJRiBARGVmYXVsdEhvc3RUZW1wbGF0ZUlkIElTIE5VTEwKQkVHSU4KICAgIFNFTEVDVCBUT1AgKDEpIEBEZWZhdWx0SG9zdFRlbXBsYXRlSWQgPSBIb3N0VGVtcGxhdGVJZAogICAgRlJPTSBvbXAuSG9zdFRlbXBsYXRlcwogICAgV0hFUkUgVGVtcGxhdGVLZXkgPSBOJ2RlZmF1bHQtaG9zdCcKICAgIE9SREVSIEJZIEhvc3RUZW1wbGF0ZUlkOwpFTkQKCklGIEBEZWZhdWx0SG9zdFRlbXBsYXRlSWQgSVMgTlVMTApCRUdJTgogICAgVEhST1cgNTEwMDIsICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgZGVmYXVsdCBob3N0IHRlbXBsYXRlIGlkIGFmdGVyIHNlZWRpbmcgb21wLkhvc3RUZW1wbGF0ZXMuIFZlcmlmeSB0aGF0IG9tcC5Ib3N0VGVtcGxhdGVzIGNhbiBiZSB3cml0dGVuIHRvIGFuZCB0aGF0IHRoZSB0ZW1wbGF0ZSB3aXRoIFRlbXBsYXRlS2V5PScnZGVmYXVsdC1ob3N0Jycgd2FzIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZC4nLCAxOwpFTkQKClNFTEVDVCBASWlzSG9zdFRlbXBsYXRlSWQgPQogICAgICAgICAgIE1JTihDQVNFIFdIRU4gVGVtcGxhdGVLZXkgPSBOJ0lJU0hvc3QnIFRIRU4gSG9zdFRlbXBsYXRlSWQgRU5EKSwKICAgICAgIEBTZXJ2aWNlSG9zdFRlbXBsYXRlSWQgPQogICAgICAgICAgIE1JTihDQVNFIFdIRU4gVGVtcGxhdGVLZXkgPSBOJ1NlcnZpY2VIb3N0JyBUSEVOIEhvc3RUZW1wbGF0ZUlkIEVORCkKRlJPTSBvbXAuSG9zdFRlbXBsYXRlcwpXSEVSRSBUZW1wbGF0ZUtleSBJTiAoTidJSVNIb3N0JywgTidTZXJ2aWNlSG9zdCcpOwoKSUYgQElpc0hvc3RUZW1wbGF0ZUlkIElTIE5VTEwgT1IgQFNlcnZpY2VIb3N0VGVtcGxhdGVJZCBJUyBOVUxMCkJFR0lOCiAgICBUSFJPVyA1MTAxMiwgJ1VuYWJsZSB0byByZXNvbHZlIHRoZSBzdGFuZGFyZCBJSVNIb3N0IGFuZCBTZXJ2aWNlSG9zdCBob3N0IHRlbXBsYXRlIGlkcyBhZnRlciBzZWVkaW5nIG9tcC5Ib3N0VGVtcGxhdGVzLiBFeHBlY3RlZCBUZW1wbGF0ZUtleXM6IElJU0hvc3QgYW5kIFNlcnZpY2VIb3N0LiBWZXJpZnkgdGhhdCB0aGUgTUVSR0Ugb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIHRoYXQgbm8gY29uc3RyYWludHMgcHJldmVudGVkIHRoZXNlIHRlbXBsYXRlcyBmcm9tIGJlaW5nIGluc2VydGVkLicsIDE7CkVORAoKU0VMRUNUIEBEZWZhdWx0SW5zdGFuY2VJZCA9IEluc3RhbmNlSWQKRlJPTSBvbXAuSW5zdGFuY2VzCldIRVJFIEluc3RhbmNlS2V5ID0gTidkZWZhdWx0JzsKCklGIEBEZWZhdWx0SW5zdGFuY2VJZCBJUyBOVUxMCkJFR0lOCiAgICBTRVQgQERlZmF1bHRJbnN0YW5jZUlkID0gTkVXSUQoKTsKCiAgICBJTlNFUlQgSU5UTyBvbXAuSW5zdGFuY2VzKAogICAgICAgIEluc3RhbmNlSWQsCiAgICAgICAgSW5zdGFuY2VLZXksCiAgICAgICAgRGlzcGxheU5hbWUsCiAgICAgICAgRGVzY3JpcHRpb24sCiAgICAgICAgSW5zdGFuY2VUZW1wbGF0ZUlkKQogICAgVkFMVUVTKAogICAgICAgIEBEZWZhdWx0SW5zdGFuY2VJZCwKICAgICAgICBOJ2RlZmF1bHQnLAogICAgICAgIE4nRGVmYXVsdCBJbnN0YW5jZScsCiAgICAgICAgTidEZWZhdWx0IE9NUCBpbnN0YW5jZSBzZWVkZWQgYnkgdGhlIGluc3RhbGwgc2NyaXB0JywKICAgICAgICBARGVmYXVsdEluc3RhbmNlVGVtcGxhdGVJZCk7CkVORApFTFNFCkJFR0lOCiAgICBVUERBVEUgb21wLkluc3RhbmNlcwogICAgU0VUIEluc3RhbmNlS2V5ID0gTidkZWZhdWx0JywKICAgICAgICBEaXNwbGF5TmFtZSA9IE4nRGVmYXVsdCBJbnN0YW5jZScsCiAgICAgICAgRGVzY3JpcHRpb24gPSBOJ0RlZmF1bHQgT01QIGluc3RhbmNlIHNlZWRlZCBieSB0aGUgaW5zdGFsbCBzY3JpcHQnLAogICAgICAgIEluc3RhbmNlVGVtcGxhdGVJZCA9IEBEZWZhdWx0SW5zdGFuY2VUZW1wbGF0ZUlkLAogICAgICAgIElzRW5hYmxlZCA9IDEsCiAgICAgICAgVXBkYXRlZFV0YyA9IFNZU1VUQ0RBVEVUSU1FKCkKICAgIFdIRVJFIEluc3RhbmNlSWQgPSBARGVmYXVsdEluc3RhbmNlSWQ7CkVORAoKU0VMRUNUIEBEZWZhdWx0SG9zdElkID0gSG9zdElkCkZST00gb21wLkhvc3RzCldIRVJFIEluc3RhbmNlSWQgPSBARGVmYXVsdEluc3RhbmNlSWQKICBBTkQgSG9zdEtleSA9IEBEZWZhdWx0SG9zdEtleTsKCklGIEBEZWZhdWx0SG9zdEtleSA9IE4nc2FtcGxlLWhvc3QnCiAgIEFORCBFWElTVFMKICAgKAogICAgICAgU0VMRUNUIDEKICAgICAgIEZST00gb21wLkhvc3RzCiAgICAgICBXSEVSRSBJbnN0YW5jZUlkID0gQERlZmF1bHRJbnN0YW5jZUlkCiAgICAgICAgIEFORCBIb3N0S2V5IDw+IEBEZWZhdWx0SG9zdEtleQogICAgICAgICBBTkQgSXNFbmFibGVkID0gMQogICApCkJFR0lOCiAgICAtLSBzYW1wbGUtaG9zdCBpcyBvbmx5IGEgc291cmNlLWNvbnRyb2xsZWQgYm9vdHN0cmFwIHBsYWNlaG9sZGVyLiBPbmNlIGEKICAgIC0tIHJlYWwgaG9zdCBleGlzdHMgaW4gdGhlIGluc3RhbGxhdGlvbiwgcmVwYWlyIHNjcmlwdHMgbXVzdCBub3QgcmVjcmVhdGUKICAgIC0tIG9yIGtlZXAgdGhlIHBsYWNlaG9sZGVyIGluIGRlc2lyZWQgdG9wb2xvZ3kgb3IgSG9zdEFnZW50IHVwZ3JhZGUgdmlld3MuCiAgICBTRVQgQFNlZWREZWZhdWx0SG9zdCA9IDA7CgogICAgU0VMRUNUIEBTdXBwcmVzc2VkRGVmYXVsdEhvc3RJZCA9IEhvc3RJZAogICAgRlJPTSBvbXAuSG9zdHMKICAgIFdIRVJFIEluc3RhbmNlSWQgPSBARGVmYXVsdEluc3RhbmNlSWQKICAgICAgQU5EIEhvc3RLZXkgPSBARGVmYXVsdEhvc3RLZXk7CgogICAgSUYgQFN1cHByZXNzZWREZWZhdWx0SG9zdElkIElTIE5PVCBOVUxMCiAgICBCRUdJTgogICAgICAgIFVQREFURSBvbXAuSG9zdHMKICAgICAgICBTRVQgSXNFbmFibGVkID0gMCwKICAgICAgICAgICAgVXBkYXRlZFV0YyA9IFNZU1VUQ0RBVEVUSU1FKCkKICAgICAgICBXSEVSRSBIb3N0SWQgPSBAU3VwcHJlc3NlZERlZmF1bHRIb3N0SWQ7CgogICAgICAgIFVQREFURSBvbXAuSG9zdERlcGxveW1lbnRBc3NpZ25tZW50cwogICAgICAgIFNFVCBJc0FjdGl2ZSA9IDAKICAgICAgICBXSEVSRSBIb3N0SWQgPSBAU3VwcHJlc3NlZERlZmF1bHRIb3N0SWQ7CgogICAgICAgIFVQREFURSBvbXAuSG9zdEFnZW50RGVzaXJlZFN0YXRlcwogICAgICAgIFNFVCBJc0VuYWJsZWQgPSAwLAogICAgICAgICAgICBVcGRhdGVkVXRjID0gU1lTVVRDREFURVRJTUUoKQogICAgICAgIFdIRVJFIEhvc3RJZCA9IEBTdXBwcmVzc2VkRGVmYXVsdEhvc3RJZDsKICAgIEVORAoKICAgIFVQREFURSBvbXAuSW5zdGFuY2VUZW1wbGF0ZUhvc3RzCiAgICBTRVQgSXNFbmFibGVkID0gMCwKICAgICAgICBVcGRhdGVkVXRjID0gU1lTVVRDREFURVRJTUUoKQogICAgV0hFUkUgSW5zdGFuY2VUZW1wbGF0ZUlkID0gQERlZmF1bHRJbnN0YW5jZVRlbXBsYXRlSWQKICAgICAgQU5EIEhvc3RLZXkgPSBARGVmYXVsdEhvc3RLZXk7CgogICAgU0VUIEBEZWZhdWx0SG9zdElkID0gTlVMTDsKRU5ECgpJRiBAU2VlZERlZmF1bHRIb3N0ID0gMSBBTkQgQERlZmF1bHRIb3N0SWQgSVMgTlVMTApCRUdJTgogICAgU0VUIEBEZWZhdWx0SG9zdElkID0gTkVXSUQoKTsKCiAgICBJTlNFUlQgSU5UTyBvbXAuSG9zdHMoSG9zdElkLCBJbnN0YW5jZUlkLCBIb3N0S2V5LCBEaXNwbGF5TmFtZSwgQmFzZVVybCwgRW52aXJvbm1lbnQsIE9zRmFtaWx5LCBBcmNoaXRlY3R1cmUpCiAgICBWQUxVRVMoQERlZmF1bHRIb3N0SWQsIEBEZWZhdWx0SW5zdGFuY2VJZCwgQERlZmF1bHRIb3N0S2V5LCBARGVmYXVsdEhvc3REaXNwbGF5TmFtZSwgTlVMTCwgQERlZmF1bHRIb3N0RW52aXJvbm1lbnQsIE4nV2luZG93cycsIEBEZWZhdWx0SG9zdEFyY2hpdGVjdHVyZSk7CkVORApFTFNFIElGIEBTZWVkRGVmYXVsdEhvc3QgPSAxCkJFR0lOCiAgICBVUERBVEUgb21wLkhvc3RzCiAgICBTRVQgSW5zdGFuY2VJZCA9IEBEZWZhdWx0SW5zdGFuY2VJZCwKICAgICAgICBIb3N0S2V5ID0gQERlZmF1bHRIb3N0S2V5LAogICAgICAgIERpc3BsYXlOYW1lID0gQERlZmF1bHRIb3N0RGlzcGxheU5hbWUsCiAgICAgICAgQmFzZVVybCA9IE5VTEwsCiAgICAgICAgRW52aXJvbm1lbnQgPSBARGVmYXVsdEhvc3RFbnZpcm9ubWVudCwKICAgICAgICBPc0ZhbWlseSA9IE4nV2luZG93cycsCiAgICAgICAgQXJjaGl0ZWN0dXJlID0gQERlZmF1bHRIb3N0QXJjaGl0ZWN0dXJlLAogICAgICAgIElzRW5hYmxlZCA9IDEsCiAgICAgICAgVXBkYXRlZFV0YyA9IFNZU1VUQ0RBVEVUSU1FKCkKICAgIFdIRVJFIEhvc3RJZCA9IEBEZWZhdWx0SG9zdElkOwpFTkQKCklGIEBTZWVkRGVmYXVsdEhvc3QgPSAxCiAgIEFORCBOT1QgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIG9tcC5JbnN0YW5jZVRlbXBsYXRlSG9zdHMgV0hFUkUgSW5zdGFuY2VUZW1wbGF0ZUlkID0gQERlZmF1bHRJbnN0YW5jZVRlbXBsYXRlSWQgQU5EIEhvc3RLZXkgPSBARGVmYXVsdEhvc3RLZXkpCkJFR0lOCiAgICBJTlNFUlQgSU5UTyBvbXAuSW5zdGFuY2VUZW1wbGF0ZUhvc3RzKEluc3RhbmNlVGVtcGxhdGVJZCwgSG9zdFRlbXBsYXRlSWQsIEhvc3RLZXksIERpc3BsYXlOYW1lLCBFbnZpcm9ubWVudCwgU29ydE9yZGVyKQogICAgVkFMVUVTKEBEZWZhdWx0SW5zdGFuY2VUZW1wbGF0ZUlkLCBARGVmYXVsdEhvc3RUZW1wbGF0ZUlkLCBARGVmYXVsdEhvc3RLZXksIEBEZWZhdWx0SG9zdERpc3BsYXlOYW1lLCBARGVmYXVsdEhvc3RFbnZpcm9ubWVudCwgMTAwKTsKRU5ECgpJRiBAU2VlZERlZmF1bHRIb3N0ID0gMSBBTkQgQERlZmF1bHRIb3N0SWQgSVMgTk9UIE5VTEwKQkVHSU4KICAgIE1FUkdFIG9tcC5Ib3N0RGVwbG95bWVudEFzc2lnbm1lbnRzIEFTIHRhcmdldAogICAgVVNJTkcKICAgICgKICAgICAgICBWQUxVRVMKICAgICAgICAgICAgKEBEZWZhdWx0SG9zdElkLCBARGVmYXVsdEhvc3RUZW1wbGF0ZUlkLCBOJ2luc3RhbGwtc2NyaXB0JywgQ09OVkVSVChiaXQsIDEpKSwKICAgICAgICAgICAgKEBEZWZhdWx0SG9zdElkLCBASWlzSG9zdFRlbXBsYXRlSWQsIE4naW5zdGFsbC1zY3JpcHQnLCBDT05WRVJUKGJpdCwgMSkpLAogICAgICAgICAgICAoQERlZmF1bHRIb3N0SWQsIEBTZXJ2aWNlSG9zdFRlbXBsYXRlSWQsIE4naW5zdGFsbC1zY3JpcHQnLCBDT05WRVJUKGJpdCwgMSkpCiAgICApIEFTIHNvdXJjZShIb3N0SWQsIEhvc3RUZW1wbGF0ZUlkLCBBc3NpZ25lZEJ5LCBJc0FjdGl2ZSkKICAgIE9OIHRhcmdldC5Ib3N0SWQgPSBzb3VyY2UuSG9zdElkCiAgICBBTkQgdGFyZ2V0Lkhvc3RUZW1wbGF0ZUlkID0gc291cmNlLkhvc3RUZW1wbGF0ZUlkCiAgICBXSEVOIE1BVENIRUQgVEhFTgogICAgICAgIFVQREFURSBTRVQgQXNzaWduZWRCeSA9IHNvdXJjZS5Bc3NpZ25lZEJ5LAogICAgICAgICAgICAgICAgICAgSXNBY3RpdmUgPSBzb3VyY2UuSXNBY3RpdmUKICAgIFdIRU4gTk9UIE1BVENIRUQgVEhFTgogICAgICAgIElOU0VSVChIb3N0SWQsIEhvc3RUZW1wbGF0ZUlkLCBBc3NpZ25lZEJ5LCBJc0FjdGl2ZSkKICAgICAgICBWQUxVRVMoc291cmNlLkhvc3RJZCwgc291cmNlLkhvc3RUZW1wbGF0ZUlkLCBzb3VyY2UuQXNzaWduZWRCeSwgc291cmNlLklzQWN0aXZlKTsKRU5ECgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIFNlZWQgY29yZSBtb2R1bGUgbWV0YWRhdGEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpERUNMQVJFIEBDb3JlTW9kdWxlSWQgaW50OwpERUNMQVJFIEBIb3N0QWdlbnRBcHBJZCBpbnQ7CkRFQ0xBUkUgQFdvcmtlck1hbmFnZXJBcHBJZCBpbnQ7CkRFQ0xBUkUgQFdvcmtlclByb2Nlc3NIb3N0QXBwSWQgaW50OwpERUNMQVJFIEBIb3N0QWdlbnRBcnRpZmFjdElkIGludDsKREVDTEFSRSBAV29ya2VyTWFuYWdlckFydGlmYWN0SWQgaW50OwpERUNMQVJFIEBXb3JrZXJQcm9jZXNzSG9zdEFydGlmYWN0SWQgaW50OwpERUNMQVJFIEBDb3JlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkIGludDsKREVDTEFSRSBARGVmYXVsdEluc3RhbmNlVGVtcGxhdGVIb3N0SWQgaW50OwpERUNMQVJFIEBMYXRlc3RFbmFibGVkQXJ0aWZhY3RzIFRBQkxFCigKICAgIEFwcElkIGludCBOT1QgTlVMTCwKICAgIFBhY2thZ2VUeXBlIG52YXJjaGFyKDUwKSBOT1QgTlVMTCwKICAgIFRhcmdldE5hbWUgbnZhcmNoYXIoMTAwKSBOT1QgTlVMTCwKICAgIEFydGlmYWN0SWQgaW50IE5PVCBOVUxMLAogICAgVmVyc2lvblJhbmsgaW50IE5PVCBOVUxMLAogICAgUFJJTUFSWSBLRVkoQXBwSWQsIFBhY2thZ2VUeXBlLCBUYXJnZXROYW1lLCBWZXJzaW9uUmFuaykKKTsKCklGIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBvbXAuTW9kdWxlcyBXSEVSRSBNb2R1bGVLZXkgPSBOJ29tcF9jb3JlJykKQkVHSU4KICAgIFVQREFURSBvbXAuTW9kdWxlcwogICAgU0VUIERpc3BsYXlOYW1lID0gTidPcGVuTW9kdWxlUGxhdGZvcm0gQ29yZScsCiAgICAgICAgTW9kdWxlVHlwZSA9IE4nUGxhdGZvcm1Db3JlJywKICAgICAgICBTY2hlbWFOYW1lID0gTidvbXAnLAogICAgICAgIERlc2NyaXB0aW9uID0gTidDb3JlIE9NUCBzY2hlbWEsIGJvb3RzdHJhcCBkYXRhLCBhbmQgaG9zdC1sb2NhbCBpbmZyYXN0cnVjdHVyZSBtZXRhZGF0YS4nLAogICAgICAgIElzRW5hYmxlZCA9IDEsCiAgICAgICAgU29ydE9yZGVyID0gMCwKICAgICAgICBVcGRhdGVkVXRjID0gU1lTVVRDREFURVRJTUUoKQogICAgV0hFUkUgTW9kdWxlS2V5ID0gTidvbXBfY29yZSc7CkVORApFTFNFCkJFR0lOCiAgICBJTlNFUlQgSU5UTyBvbXAuTW9kdWxlcygKICAgICAgICBNb2R1bGVLZXksCiAgICAgICAgRGlzcGxheU5hbWUsCiAgICAgICAgTW9kdWxlVHlwZSwKICAgICAgICBTY2hlbWFOYW1lLAogICAgICAgIERlc2NyaXB0aW9uLAogICAgICAgIElzRW5hYmxlZCwKICAgICAgICBTb3J0T3JkZXIpCiAgICBWQUxVRVMoCiAgICAgICAgTidvbXBfY29yZScsCiAgICAgICAgTidPcGVuTW9kdWxlUGxhdGZvcm0gQ29yZScsCiAgICAgICAgTidQbGF0Zm9ybUNvcmUnLAogICAgICAgIE4nb21wJywKICAgICAgICBOJ0NvcmUgT01QIHNjaGVtYSwgYm9vdHN0cmFwIGRhdGEsIGFuZCBob3N0LWxvY2FsIGluZnJhc3RydWN0dXJlIG1ldGFkYXRhLicsCiAgICAgICAgMSwKICAgICAgICAwKTsKRU5ECgpTRUxFQ1QgQENvcmVNb2R1bGVJZCA9IE1vZHVsZUlkCkZST00gb21wLk1vZHVsZXMKV0hFUkUgTW9kdWxlS2V5ID0gTidvbXBfY29yZSc7CgpNRVJHRSBvbXAuQXBwcyBBUyB0YXJnZXQKVVNJTkcKKAogICAgVkFMVUVTCiAgICAgICAgKEBDb3JlTW9kdWxlSWQsIE4nb21wX2hvc3RhZ2VudCcsIE4nT01QIEhvc3RBZ2VudCcsIE4nSG9zdEFnZW50JywgTidIb3N0LWxvY2FsIE9NUCBkZXBsb3ltZW50IGFnZW50IHRoYXQgY2FuIHByZXBhcmUgdmVyc2lvbmVkIHNlbGYtdXBncmFkZXMuJywgMTAsIENPTlZFUlQoYml0LCAxKSksCiAgICAgICAgKEBDb3JlTW9kdWxlSWQsIE4nb21wX3dvcmtlcm1hbmFnZXInLCBOJ09NUCBXb3JrZXJNYW5hZ2VyJywgTidTZXJ2aWNlQXBwJywgTidIb3N0LWxvY2FsIFdpbmRvd3Mgc2VydmljZSB0aGF0IHN0YXJ0cyBhbmQgc3VwZXJ2aXNlcyBPTVAgd29ya2VyIHBsdWdpbiBwcm9jZXNzZXMuJywgMjAsIENPTlZFUlQoYml0LCAxKSksCiAgICAgICAgKEBDb3JlTW9kdWxlSWQsIE4nb21wX3dvcmtlcnByb2Nlc3Nob3N0JywgTidPTVAgV29ya2VyIFByb2Nlc3MgSG9zdCcsIE4nV29ya2VySG9zdCcsIE4nSG9zdC1sb2NhbCBleGVjdXRhYmxlIHVzZWQgYnkgV29ya2VyTWFuYWdlciB0byBydW4gd29ya2VyIHBsdWdpbiBhcnRpZmFjdHMuJywgMzAsIENPTlZFUlQoYml0LCAxKSkKKSBBUyBzb3VyY2UoTW9kdWxlSWQsIEFwcEtleSwgRGlzcGxheU5hbWUsIEFwcFR5cGUsIERlc2NyaXB0aW9uLCBTb3J0T3JkZXIsIElzRW5hYmxlZCkKT04gdGFyZ2V0Lk1vZHVsZUlkID0gc291cmNlLk1vZHVsZUlkCkFORCB0YXJnZXQuQXBwS2V5ID0gc291cmNlLkFwcEtleQpXSEVOIE1BVENIRUQgVEhFTgogICAgVVBEQVRFIFNFVCBEaXNwbGF5TmFtZSA9IHNvdXJjZS5EaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgQXBwVHlwZSA9IHNvdXJjZS5BcHBUeXBlLAogICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9IHNvdXJjZS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgU29ydE9yZGVyID0gc291cmNlLlNvcnRPcmRlciwKICAgICAgICAgICAgICAgSXNFbmFibGVkID0gc291cmNlLklzRW5hYmxlZCwKICAgICAgICAgICAgICAgVXBkYXRlZFV0YyA9IFNZU1VUQ0RBVEVUSU1FKCkKV0hFTiBOT1QgTUFUQ0hFRCBUSEVOCiAgICBJTlNFUlQoTW9kdWxlSWQsIEFwcEtleSwgRGlzcGxheU5hbWUsIEFwcFR5cGUsIERlc2NyaXB0aW9uLCBTb3J0T3JkZXIsIElzRW5hYmxlZCkKICAgIFZBTFVFUyhzb3VyY2UuTW9kdWxlSWQsIHNvdXJjZS5BcHBLZXksIHNvdXJjZS5EaXNwbGF5TmFtZSwgc291cmNlLkFwcFR5cGUsIHNvdXJjZS5EZXNjcmlwdGlvbiwgc291cmNlLlNvcnRPcmRlciwgc291cmNlLklzRW5hYmxlZCk7CgpTRUxFQ1QgQEhvc3RBZ2VudEFwcElkID0KICAgICAgICAgICBNSU4oQ0FTRSBXSEVOIEFwcEtleSA9IE4nb21wX2hvc3RhZ2VudCcgVEhFTiBBcHBJZCBFTkQpLAogICAgICAgQFdvcmtlck1hbmFnZXJBcHBJZCA9CiAgICAgICAgICAgTUlOKENBU0UgV0hFTiBBcHBLZXkgPSBOJ29tcF93b3JrZXJtYW5hZ2VyJyBUSEVOIEFwcElkIEVORCksCiAgICAgICBAV29ya2VyUHJvY2Vzc0hvc3RBcHBJZCA9CiAgICAgICAgICAgTUlOKENBU0UgV0hFTiBBcHBLZXkgPSBOJ29tcF93b3JrZXJwcm9jZXNzaG9zdCcgVEhFTiBBcHBJZCBFTkQpCkZST00gb21wLkFwcHMKV0hFUkUgTW9kdWxlSWQgPSBAQ29yZU1vZHVsZUlkCiAgQU5EIEFwcEtleSBJTiAoTidvbXBfaG9zdGFnZW50JywgTidvbXBfd29ya2VybWFuYWdlcicsIE4nb21wX3dvcmtlcnByb2Nlc3Nob3N0Jyk7CgpNRVJHRSBvbXAuQXJ0aWZhY3RzIEFTIHRhcmdldApVU0lORwooCiAgICBTRUxFQ1QgQEhvc3RBZ2VudEFwcElkIEFTIEFwcElkLAogICAgICAgICAgIEBCYXNlbGluZUhvc3RBZ2VudEFydGlmYWN0VmVyc2lvbiBBUyBWZXJzaW9uLAogICAgICAgICAgIE4naG9zdC1hZ2VudCcgQVMgUGFja2FnZVR5cGUsCiAgICAgICAgICAgTidvbXAtaG9zdGFnZW50JyBBUyBUYXJnZXROYW1lLAogICAgICAgICAgIE4nb21wLWhvc3RhZ2VudC9ob3N0YWdlbnQvJyArIEBCYXNlbGluZUhvc3RBZ2VudEFydGlmYWN0VmVyc2lvbiBBUyBSZWxhdGl2ZVBhdGgsCiAgICAgICAgICAgQ0FTVCgxIEFTIGJpdCkgQVMgSXNFbmFibGVkCiAgICBVTklPTiBBTEwKICAgIFNFTEVDVCBAV29ya2VyTWFuYWdlckFwcElkIEFTIEFwcElkLAogICAgICAgICAgIEBCYXNlbGluZVdvcmtlck1hbmFnZXJBcnRpZmFjdFZlcnNpb24gQVMgVmVyc2lvbiwKICAgICAgICAgICBOJ3NlcnZpY2UtYXBwJyBBUyBQYWNrYWdlVHlwZSwKICAgICAgICAgICBOJ29tcC13b3JrZXJtYW5hZ2VyJyBBUyBUYXJnZXROYW1lLAogICAgICAgICAgIE4nb21wLXdvcmtlcm1hbmFnZXIvc2VydmljZS8nICsgQEJhc2VsaW5lV29ya2VyTWFuYWdlckFydGlmYWN0VmVyc2lvbiBBUyBSZWxhdGl2ZVBhdGgsCiAgICAgICAgICAgQ0FTVCgxIEFTIGJpdCkgQVMgSXNFbmFibGVkCiAgICBVTklPTiBBTEwKICAgIFNFTEVDVCBAV29ya2VyUHJvY2Vzc0hvc3RBcHBJZCBBUyBBcHBJZCwKICAgICAgICAgICBAQmFzZWxpbmVXb3JrZXJQcm9jZXNzSG9zdEFydGlmYWN0VmVyc2lvbiBBUyBWZXJzaW9uLAogICAgICAgICAgIE4nd29ya2VyLWhvc3QnIEFTIFBhY2thZ2VUeXBlLAogICAgICAgICAgIE4nb21wLXdvcmtlcnByb2Nlc3Nob3N0JyBBUyBUYXJnZXROYW1lLAogICAgICAgICAgIE4nb21wLXdvcmtlcnByb2Nlc3Nob3N0L2hvc3QvJyArIEBCYXNlbGluZVdvcmtlclByb2Nlc3NIb3N0QXJ0aWZhY3RWZXJzaW9uIEFTIFJlbGF0aXZlUGF0aCwKICAgICAgICAgICBDQVNUKDEgQVMgYml0KSBBUyBJc0VuYWJsZWQKKSBBUyBzb3VyY2UKT04gdGFyZ2V0LkFwcElkID0gc291cmNlLkFwcElkCkFORCB0YXJnZXQuVmVyc2lvbiA9IHNvdXJjZS5WZXJzaW9uCkFORCB0YXJnZXQuUGFja2FnZVR5cGUgPSBzb3VyY2UuUGFja2FnZVR5cGUKQU5EIHRhcmdldC5UYXJnZXROYW1lID0gc291cmNlLlRhcmdldE5hbWUKV0hFTiBNQVRDSEVEIFRIRU4KICAgIFVQREFURSBTRVQgUmVsYXRpdmVQYXRoID0gc291cmNlLlJlbGF0aXZlUGF0aCwKICAgICAgICAgICAgICAgSXNFbmFibGVkID0gc291cmNlLklzRW5hYmxlZCwKICAgICAgICAgICAgICAgVXBkYXRlZFV0YyA9IFNZU1VUQ0RBVEVUSU1FKCkKV0hFTiBOT1QgTUFUQ0hFRCBUSEVOCiAgICBJTlNFUlQgKEFwcElkLCBWZXJzaW9uLCBQYWNrYWdlVHlwZSwgVGFyZ2V0TmFtZSwgUmVsYXRpdmVQYXRoLCBJc0VuYWJsZWQpCiAgICBWQUxVRVMoc291cmNlLkFwcElkLCBzb3VyY2UuVmVyc2lvbiwgc291cmNlLlBhY2thZ2VUeXBlLCBzb3VyY2UuVGFyZ2V0TmFtZSwgc291cmNlLlJlbGF0aXZlUGF0aCwgc291cmNlLklzRW5hYmxlZCk7CgotLSBSZXBhaXIgcnVucyBzZWVkIHRoZSBwYWNrYWdlZCBiYXNlbGluZSBhcnRpZmFjdCByb3dzIGJ1dCBzaG91bGQgbmV2ZXIKLS0gZG93bmdyYWRlIGRlc2lyZWQgc3RhdGUgYWZ0ZXIgbmV3ZXIgY29tcGF0aWJsZSBjb3JlIGFydGlmYWN0cyBoYXZlIGJlZW4KLS0gaW1wb3J0ZWQuIFVzZSB0aGUgbGF0ZXN0IHJlZ2lzdGVyZWQgYXJ0aWZhY3RzIGZvciB0ZW1wbGF0ZSBzdGF0ZS4KSU5TRVJUIElOVE8gQExhdGVzdEVuYWJsZWRBcnRpZmFjdHMoQXBwSWQsIFBhY2thZ2VUeXBlLCBUYXJnZXROYW1lLCBBcnRpZmFjdElkLCBWZXJzaW9uUmFuaykKU0VMRUNUIHJhbmtlZC5BcHBJZCwKICAgICAgIHJhbmtlZC5QYWNrYWdlVHlwZSwKICAgICAgIHJhbmtlZC5UYXJnZXROYW1lLAogICAgICAgcmFua2VkLkFydGlmYWN0SWQsCiAgICAgICByYW5rZWQuVmVyc2lvblJhbmsKRlJPTQooCiAgICBTRUxFQ1QgQXJ0aWZhY3RJZCwKICAgICAgICAgICBBcHBJZCwKICAgICAgICAgICBQYWNrYWdlVHlwZSwKICAgICAgICAgICBUYXJnZXROYW1lLAogICAgICAgICAgIFJPV19OVU1CRVIoKSBPVkVSCiAgICAgICAgICAgKAogICAgICAgICAgICAgICBQQVJUSVRJT04gQlkgQXBwSWQsIFBhY2thZ2VUeXBlLCBUYXJnZXROYW1lCiAgICAgICAgICAgICAgIE9SREVSIEJZCiAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShUUllfQ09OVkVSVChpbnQsIFBBUlNFTkFNRShWZXJzaW9uLCA0KSksIDApIERFU0MsCiAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShUUllfQ09OVkVSVChpbnQsIFBBUlNFTkFNRShWZXJzaW9uLCAzKSksIDApIERFU0MsCiAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShUUllfQ09OVkVSVChpbnQsIFBBUlNFTkFNRShWZXJzaW9uLCAyKSksIDApIERFU0MsCiAgICAgICAgICAgICAgICAgICBDT0FMRVNDRShUUllfQ09OVkVSVChpbnQsIFBBUlNFTkFNRShWZXJzaW9uLCAxKSksIDApIERFU0MsCiAgICAgICAgICAgICAgICAgICBWZXJzaW9uIERFU0MsCiAgICAgICAgICAgICAgICAgICBBcnRpZmFjdElkIERFU0MKICAgICAgICAgICApIEFTIFZlcnNpb25SYW5rCiAgICBGUk9NIG9tcC5BcnRpZmFjdHMKICAgIFdIRVJFIElzRW5hYmxlZCA9IDEKICAgICAgQU5EIFRhcmdldE5hbWUgSVMgTk9UIE5VTEwKICAgICAgQU5EIEFwcElkIElOIChASG9zdEFnZW50QXBwSWQsIEBXb3JrZXJNYW5hZ2VyQXBwSWQsIEBXb3JrZXJQcm9jZXNzSG9zdEFwcElkKQogICAgICBBTkQgVGFyZ2V0TmFtZSBJTiAoTidvbXAtaG9zdGFnZW50JywgTidvbXAtd29ya2VybWFuYWdlcicsIE4nb21wLXdvcmtlcnByb2Nlc3Nob3N0JykKKSByYW5rZWQKV0hFUkUgcmFua2VkLlZlcnNpb25SYW5rID0gMTsKClNFTEVDVCBASG9zdEFnZW50QXJ0aWZhY3RJZCA9CiAgICAgICAgICAgTUFYKENBU0UKICAgICAgICAgICAgICAgICAgIFdIRU4gQXBwSWQgPSBASG9zdEFnZW50QXBwSWQKICAgICAgICAgICAgICAgICAgICBBTkQgUGFja2FnZVR5cGUgPSBOJ2hvc3QtYWdlbnQnCiAgICAgICAgICAgICAgICAgICAgQU5EIFRhcmdldE5hbWUgPSBOJ29tcC1ob3N0YWdlbnQnCiAgICAgICAgICAgICAgICAgICAgQU5EIFZlcnNpb25SYW5rID0gMQogICAgICAgICAgICAgICAgICAgVEhFTiBBcnRpZmFjdElkCiAgICAgICAgICAgICAgIEVORCksCiAgICAgICBAV29ya2VyTWFuYWdlckFydGlmYWN0SWQgPQogICAgICAgICAgIE1BWChDQVNFCiAgICAgICAgICAgICAgICAgICBXSEVOIEFwcElkID0gQFdvcmtlck1hbmFnZXJBcHBJZAogICAgICAgICAgICAgICAgICAgIEFORCBQYWNrYWdlVHlwZSA9IE4nc2VydmljZS1hcHAnCiAgICAgICAgICAgICAgICAgICAgQU5EIFRhcmdldE5hbWUgPSBOJ29tcC13b3JrZXJtYW5hZ2VyJwogICAgICAgICAgICAgICAgICAgIEFORCBWZXJzaW9uUmFuayA9IDEKICAgICAgICAgICAgICAgICAgIFRIRU4gQXJ0aWZhY3RJZAogICAgICAgICAgICAgICBFTkQpLAogICAgICAgQFdvcmtlclByb2Nlc3NIb3N0QXJ0aWZhY3RJZCA9CiAgICAgICAgICAgTUFYKENBU0UKICAgICAgICAgICAgICAgICAgIFdIRU4gQXBwSWQgPSBAV29ya2VyUHJvY2Vzc0hvc3RBcHBJZAogICAgICAgICAgICAgICAgICAgIEFORCBQYWNrYWdlVHlwZSA9IE4nd29ya2VyLWhvc3QnCiAgICAgICAgICAgICAgICAgICAgQU5EIFRhcmdldE5hbWUgPSBOJ29tcC13b3JrZXJwcm9jZXNzaG9zdCcKICAgICAgICAgICAgICAgICAgICBBTkQgVmVyc2lvblJhbmsgPSAxCiAgICAgICAgICAgICAgICAgICBUSEVOIEFydGlmYWN0SWQKICAgICAgICAgICAgICAgRU5EKQpGUk9NIEBMYXRlc3RFbmFibGVkQXJ0aWZhY3RzCldIRVJFIFZlcnNpb25SYW5rID0gMTsKCk1FUkdFIG9tcC5JbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VzIEFTIHRhcmdldApVU0lORwooCiAgICBTRUxFQ1QgQERlZmF1bHRJbnN0YW5jZVRlbXBsYXRlSWQgQVMgSW5zdGFuY2VUZW1wbGF0ZUlkLAogICAgICAgICAgIEBDb3JlTW9kdWxlSWQgQVMgTW9kdWxlSWQsCiAgICAgICAgICAgTidvbXBfY29yZScgQVMgTW9kdWxlSW5zdGFuY2VLZXksCiAgICAgICAgICAgTidPcGVuTW9kdWxlUGxhdGZvcm0gQ29yZScgQVMgRGlzcGxheU5hbWUsCiAgICAgICAgICAgTidDb3JlIHJ1bnRpbWUgc2VydmljZXMgYW5kIGhvc3QtbG9jYWwgaW5mcmFzdHJ1Y3R1cmUuJyBBUyBEZXNjcmlwdGlvbiwKICAgICAgICAgICAwIEFTIFNvcnRPcmRlciwKICAgICAgICAgICBDQVNUKDEgQVMgYml0KSBBUyBJc0VuYWJsZWQKKSBBUyBzb3VyY2UKT04gdGFyZ2V0Lkluc3RhbmNlVGVtcGxhdGVJZCA9IHNvdXJjZS5JbnN0YW5jZVRlbXBsYXRlSWQKQU5EIHRhcmdldC5Nb2R1bGVJbnN0YW5jZUtleSA9IHNvdXJjZS5Nb2R1bGVJbnN0YW5jZUtleQpXSEVOIE1BVENIRUQgVEhFTgogICAgVVBEQVRFIFNFVCBNb2R1bGVJZCA9IHNvdXJjZS5Nb2R1bGVJZCwKICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPSBzb3VyY2UuRGlzcGxheU5hbWUsCiAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0gc291cmNlLkRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICBTb3J0T3JkZXIgPSBzb3VyY2UuU29ydE9yZGVyLAogICAgICAgICAgICAgICBJc0VuYWJsZWQgPSBzb3VyY2UuSXNFbmFibGVkLAogICAgICAgICAgICAgICBVcGRhdGVkVXRjID0gU1lTVVRDREFURVRJTUUoKQpXSEVOIE5PVCBNQVRDSEVEIFRIRU4KICAgIElOU0VSVChJbnN0YW5jZVRlbXBsYXRlSWQsIE1vZHVsZUlkLCBNb2R1bGVJbnN0YW5jZUtleSwgRGlzcGxheU5hbWUsIERlc2NyaXB0aW9uLCBTb3J0T3JkZXIsIElzRW5hYmxlZCkKICAgIFZBTFVFUyhzb3VyY2UuSW5zdGFuY2VUZW1wbGF0ZUlkLCBzb3VyY2UuTW9kdWxlSWQsIHNvdXJjZS5Nb2R1bGVJbnN0YW5jZUtleSwgc291cmNlLkRpc3BsYXlOYW1lLCBzb3VyY2UuRGVzY3JpcHRpb24sIHNvdXJjZS5Tb3J0T3JkZXIsIHNvdXJjZS5Jc0VuYWJsZWQpOwoKU0VMRUNUIFRPUCAoMSkgQENvcmVUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQgPSBJbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VJZApGUk9NIG9tcC5JbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VzCldIRVJFIEluc3RhbmNlVGVtcGxhdGVJZCA9IEBEZWZhdWx0SW5zdGFuY2VUZW1wbGF0ZUlkCiAgQU5EIE1vZHVsZUluc3RhbmNlS2V5ID0gTidvbXBfY29yZScKT1JERVIgQlkgSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQ7CgpTRUxFQ1QgVE9QICgxKSBARGVmYXVsdEluc3RhbmNlVGVtcGxhdGVIb3N0SWQgPSBJbnN0YW5jZVRlbXBsYXRlSG9zdElkCkZST00gb21wLkluc3RhbmNlVGVtcGxhdGVIb3N0cwpXSEVSRSBJbnN0YW5jZVRlbXBsYXRlSWQgPSBARGVmYXVsdEluc3RhbmNlVGVtcGxhdGVJZAogIEFORCBIb3N0S2V5ID0gQERlZmF1bHRIb3N0S2V5Ck9SREVSIEJZIEluc3RhbmNlVGVtcGxhdGVIb3N0SWQ7CgpJRiBAQ29yZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VJZCBJUyBOT1QgTlVMTAogICBBTkQgQFNlcnZpY2VIb3N0VGVtcGxhdGVJZCBJUyBOT1QgTlVMTApCRUdJTgogICAgTUVSR0Ugb21wLkluc3RhbmNlVGVtcGxhdGVBcHBJbnN0YW5jZXMgQVMgdGFyZ2V0CiAgICBVU0lORwogICAgKAogICAgICAgIFZBTFVFUwogICAgICAgICAgICAoQENvcmVUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQsIE5VTEwsIEBTZXJ2aWNlSG9zdFRlbXBsYXRlSWQsIEBXb3JrZXJQcm9jZXNzSG9zdEFwcElkLCBOJ29tcF93b3JrZXJwcm9jZXNzaG9zdCcsIE4nT01QIFdvcmtlciBQcm9jZXNzIEhvc3QnLCBOJ0hvc3QtbG9jYWwgZXhlY3V0YWJsZSB1c2VkIGJ5IFdvcmtlck1hbmFnZXIgdG8gcnVuIHdvcmtlciBwbHVnaW4gYXJ0aWZhY3RzLicsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIEBXb3JrZXJQcm9jZXNzSG9zdEFydGlmYWN0SWQsIDEsIDIwLCBDT05WRVJUKGJpdCwgMSksIENPTlZFUlQoYml0LCAxKSksCiAgICAgICAgICAgIChAQ29yZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VJZCwgTlVMTCwgQFNlcnZpY2VIb3N0VGVtcGxhdGVJZCwgQFdvcmtlck1hbmFnZXJBcHBJZCwgTidvbXBfd29ya2VybWFuYWdlcicsIE4nT01QIFdvcmtlck1hbmFnZXInLCBOJ0hvc3QtbG9jYWwgV2luZG93cyBzZXJ2aWNlIHRoYXQgc3RhcnRzIGFuZCBzdXBlcnZpc2VzIE9NUCB3b3JrZXIgcGx1Z2luIHByb2Nlc3Nlcy4nLCBOVUxMLCBOVUxMLCBOJ1dvcmtlck1hbmFnZXInLCBOJ09NUC5Xb3JrZXJNYW5hZ2VyJywgQFdvcmtlck1hbmFnZXJBcnRpZmFjdElkLCAxLCAzMCwgQ09OVkVSVChiaXQsIDEpLCBDT05WRVJUKGJpdCwgMSkpCiAgICApIEFTIHNvdXJjZShJbnN0YW5jZVRlbXBsYXRlTW9kdWxlSW5zdGFuY2VJZCwgSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCwgVGFyZ2V0SG9zdFRlbXBsYXRlSWQsIEFwcElkLCBBcHBJbnN0YW5jZUtleSwgRGlzcGxheU5hbWUsIERlc2NyaXB0aW9uLCBSb3V0ZVBhdGgsIFB1YmxpY1VybCwgSW5zdGFsbFBhdGgsIEluc3RhbGxhdGlvbk5hbWUsIERlc2lyZWRBcnRpZmFjdElkLCBEZXNpcmVkU3RhdGUsIFNvcnRPcmRlciwgSXNFbmFibGVkLCBJc0FsbG93ZWQpCiAgICBPTiB0YXJnZXQuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQgPSBzb3VyY2UuSW5zdGFuY2VUZW1wbGF0ZU1vZHVsZUluc3RhbmNlSWQKICAgIEFORCB0YXJnZXQuQXBwSW5zdGFuY2VLZXkgPSBzb3VyY2UuQXBwSW5zdGFuY2VLZXkKICAgIFdIRU4gTUFUQ0hFRCBUSEVOCiAgICAgICAgVVBEQVRFIFNFVCBJbnN0YW5jZVRlbXBsYXRlSG9zdElkID0gc291cmNlLkluc3RhbmNlVGVtcGxhdGVIb3N0SWQsCiAgICAgICAgICAgICAgICAgICBUYXJnZXRIb3N0VGVtcGxhdGVJZCA9IHNvdXJjZS5UYXJnZXRIb3N0VGVtcGxhdGVJZCwKICAgICAgICAgICAgICAgICAgIEFwcElkID0gc291cmNlLkFwcElkLAogICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPSBzb3VyY2UuRGlzcGxheU5hbWUsCiAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9IHNvdXJjZS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgIFJvdXRlUGF0aCA9IHNvdXJjZS5Sb3V0ZVBhdGgsCiAgICAgICAgICAgICAgICAgICBQdWJsaWNVcmwgPSBzb3VyY2UuUHVibGljVXJsLAogICAgICAgICAgICAgICAgICAgSW5zdGFsbFBhdGggPSBzb3VyY2UuSW5zdGFsbFBhdGgsCiAgICAgICAgICAgICAgICAgICBJbnN0YWxsYXRpb25OYW1lID0gc291cmNlLkluc3RhbGxhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICBEZXNpcmVkQXJ0aWZhY3RJZCA9IHNvdXJjZS5EZXNpcmVkQXJ0aWZhY3RJZCwKICAgICAgICAgICAgICAgICAgIERlc2lyZWRTdGF0ZSA9IHNvdXJjZS5EZXNpcmVkU3RhdGUsCiAgICAgICAgICAgICAgICAgICBTb3J0T3JkZXIgPSBzb3VyY2UuU29ydE9yZGVyLAogICAgICAgICAgICAgICAgICAgSXNFbmFibGVkID0gc291cmNlLklzRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgIElzQWxsb3dlZCA9IHNvdXJjZS5Jc0FsbG93ZWQsCiAgICAgICAgICAgICAgICAgICBVcGRhdGVkVXRjID0gU1lTVVRDREFURVRJTUUoKQogICAgV0hFTiBOT1QgTUFUQ0hFRCBUSEVOCiAgICAgICAgSU5TRVJUKEluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkLCBJbnN0YW5jZVRlbXBsYXRlSG9zdElkLCBUYXJnZXRIb3N0VGVtcGxhdGVJZCwgQXBwSWQsIEFwcEluc3RhbmNlS2V5LCBEaXNwbGF5TmFtZSwgRGVzY3JpcHRpb24sIFJvdXRlUGF0aCwgUHVibGljVXJsLCBJbnN0YWxsUGF0aCwgSW5zdGFsbGF0aW9uTmFtZSwgRGVzaXJlZEFydGlmYWN0SWQsIERlc2lyZWRTdGF0ZSwgU29ydE9yZGVyLCBJc0VuYWJsZWQsIElzQWxsb3dlZCkKICAgICAgICBWQUxVRVMoc291cmNlLkluc3RhbmNlVGVtcGxhdGVNb2R1bGVJbnN0YW5jZUlkLCBzb3VyY2UuSW5zdGFuY2VUZW1wbGF0ZUhvc3RJZCwgc291cmNlLlRhcmdldEhvc3RUZW1wbGF0ZUlkLCBzb3VyY2UuQXBwSWQsIHNvdXJjZS5BcHBJbnN0YW5jZUtleSwgc291cmNlLkRpc3BsYXlOYW1lLCBzb3VyY2UuRGVzY3JpcHRpb24sIHNvdXJjZS5Sb3V0ZVBhdGgsIHNvdXJjZS5QdWJsaWNVcmwsIHNvdXJjZS5JbnN0YWxsUGF0aCwgc291cmNlLkluc3RhbGxhdGlvbk5hbWUsIHNvdXJjZS5EZXNpcmVkQXJ0aWZhY3RJZCwgc291cmNlLkRlc2lyZWRTdGF0ZSwgc291cmNlLlNvcnRPcmRlciwgc291cmNlLklzRW5hYmxlZCwgc291cmNlLklzQWxsb3dlZCk7CkVORAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBTZWVkIGJhc2VsaW5lIGFkbWluaXN0cmF0aXZlIHBsYWNlaG9sZGVyIHJvbGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpJRiBOT1QgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIG9tcC5Sb2xlcyBXSEVSRSBOYW1lID0gTidQb3J0YWxBZG1pbnMnKQpCRUdJTgogICAgSU5TRVJUIElOVE8gb21wLlJvbGVzKE5hbWUsIERlc2NyaXB0aW9uKSBWQUxVRVMoTidQb3J0YWxBZG1pbnMnLCBOJ0FkbWluaXN0cmF0aXZlIGJvb3RzdHJhcCByb2xlIGZvciBPTVAgbW9kdWxlcyBhbmQgcG9ydGFsJyk7CkVORAoKSUYgTk9UIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBvbXAuUm9sZXMgV0hFUkUgTmFtZSA9IE4nRXZlcnlvbmUnKQpCRUdJTgogICAgSU5TRVJUIElOVE8gb21wLlJvbGVzKE5hbWUsIERlc2NyaXB0aW9uKQogICAgVkFMVUVTKE4nRXZlcnlvbmUnLCBOJ0J1aWx0LWluIGJhc2VsaW5lIHJvbGUgZm9yIHBlcm1pc3Npb25zIGF2YWlsYWJsZSB0byBldmVyeSBzaWduZWQtaW4gT01QIHByaW5jaXBhbC4nKTsKRU5ECkVMU0UKQkVHSU4KICAgIFVQREFURSBvbXAuUm9sZXMKICAgIFNFVCBEZXNjcmlwdGlvbiA9IE4nQnVpbHQtaW4gYmFzZWxpbmUgcm9sZSBmb3IgcGVybWlzc2lvbnMgYXZhaWxhYmxlIHRvIGV2ZXJ5IHNpZ25lZC1pbiBPTVAgcHJpbmNpcGFsLicKICAgIFdIRVJFIE5hbWUgPSBOJ0V2ZXJ5b25lJwogICAgICBBTkQgSVNOVUxMKERlc2NyaXB0aW9uLCBOJycpID0gTicnOwpFTkQKCklGIE5PVCBFWElTVFMgKFNFTEVDVCAxIEZST00gb21wLlJvbGVzIFdIRVJFIE5hbWUgPSBOJ0F1dGhlbnRpY2F0ZWRVc2VycycpCkJFR0lOCiAgICBJTlNFUlQgSU5UTyBvbXAuUm9sZXMoTmFtZSwgRGVzY3JpcHRpb24pCiAgICBWQUxVRVMoTidBdXRoZW50aWNhdGVkVXNlcnMnLCBOJ0J1aWx0LWluIGJhc2VsaW5lIHJvbGUgZm9yIHBlcm1pc3Npb25zIGF2YWlsYWJsZSB0byBhdXRoZW50aWNhdGVkIE9NUCB1c2Vycy4nKTsKRU5ECkVMU0UKQkVHSU4KICAgIFVQREFURSBvbXAuUm9sZXMKICAgIFNFVCBEZXNjcmlwdGlvbiA9IE4nQnVpbHQtaW4gYmFzZWxpbmUgcm9sZSBmb3IgcGVybWlzc2lvbnMgYXZhaWxhYmxlIHRvIGF1dGhlbnRpY2F0ZWQgT01QIHVzZXJzLicKICAgIFdIRVJFIE5hbWUgPSBOJ0F1dGhlbnRpY2F0ZWRVc2VycycKICAgICAgQU5EIElTTlVMTChEZXNjcmlwdGlvbiwgTicnKSA9IE4nJzsKRU5ECgpTRUxFQ1QgQFBvcnRhbEFkbWluc1JvbGVJZCA9IE1BWChDQVNFIFdIRU4gTmFtZSA9IE4nUG9ydGFsQWRtaW5zJyBUSEVOIFJvbGVJZCBFTkQpLAogICAgICAgQEV2ZXJ5b25lUm9sZUlkID0gTUFYKENBU0UgV0hFTiBOYW1lID0gTidFdmVyeW9uZScgVEhFTiBSb2xlSWQgRU5EKSwKICAgICAgIEBBdXRoZW50aWNhdGVkVXNlcnNSb2xlSWQgPSBNQVgoQ0FTRSBXSEVOIE5hbWUgPSBOJ0F1dGhlbnRpY2F0ZWRVc2VycycgVEhFTiBSb2xlSWQgRU5EKQpGUk9NIG9tcC5Sb2xlcwpXSEVSRSBOYW1lIElOIChOJ1BvcnRhbEFkbWlucycsIE4nRXZlcnlvbmUnLCBOJ0F1dGhlbnRpY2F0ZWRVc2VycycpOwoKSUYgQEV2ZXJ5b25lUm9sZUlkIElTIE5PVCBOVUxMCiAgIEFORCBOT1QgRVhJU1RTCiAgICgKICAgICAgIFNFTEVDVCAxCiAgICAgICBGUk9NIG9tcC5Sb2xlUHJpbmNpcGFscwogICAgICAgV0hFUkUgUm9sZUlkID0gQEV2ZXJ5b25lUm9sZUlkCiAgICAgICAgIEFORCBQcmluY2lwYWxUeXBlID0gTidPTVBTeXN0ZW0nCiAgICAgICAgIEFORCBQcmluY2lwYWwgPSBOJ0V2ZXJ5b25lJwogICApCkJFR0lOCiAgICBJTlNFUlQgSU5UTyBvbXAuUm9sZVByaW5jaXBhbHMoUm9sZUlkLCBQcmluY2lwYWxUeXBlLCBQcmluY2lwYWwpCiAgICBWQUxVRVMoQEV2ZXJ5b25lUm9sZUlkLCBOJ09NUFN5c3RlbScsIE4nRXZlcnlvbmUnKTsKRU5ECgpJRiBAQXV0aGVudGljYXRlZFVzZXJzUm9sZUlkIElTIE5PVCBOVUxMCiAgIEFORCBOT1QgRVhJU1RTCiAgICgKICAgICAgIFNFTEVDVCAxCiAgICAgICBGUk9NIG9tcC5Sb2xlUHJpbmNpcGFscwogICAgICAgV0hFUkUgUm9sZUlkID0gQEF1dGhlbnRpY2F0ZWRVc2Vyc1JvbGVJZAogICAgICAgICBBTkQgUHJpbmNpcGFsVHlwZSA9IE4nT01QU3lzdGVtJwogICAgICAgICBBTkQgUHJpbmNpcGFsID0gTidBdXRoZW50aWNhdGVkVXNlcnMnCiAgICkKQkVHSU4KICAgIElOU0VSVCBJTlRPIG9tcC5Sb2xlUHJpbmNpcGFscyhSb2xlSWQsIFByaW5jaXBhbFR5cGUsIFByaW5jaXBhbCkKICAgIFZBTFVFUyhAQXV0aGVudGljYXRlZFVzZXJzUm9sZUlkLCBOJ09NUFN5c3RlbScsIE4nQXV0aGVudGljYXRlZFVzZXJzJyk7CkVORAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBTZWVkIGJ1aWx0LWluIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCklGIE5PVCBFWElTVFMgKFNFTEVDVCAxIEZST00gb21wLmF1dGhfcHJvdmlkZXJzIFdIRVJFIGRpc3BsYXlfbmFtZSA9IE4nQUQnKQpCRUdJTgogICAgSU5TRVJUIElOVE8gb21wLmF1dGhfcHJvdmlkZXJzKGRpc3BsYXlfbmFtZSwgaXNfZW5hYmxlZCkKICAgIFZBTFVFUyhOJ0FEJywgMSk7CkVORAoKSUYgTk9UIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBvbXAuYXV0aF9wcm92aWRlcnMgV0hFUkUgZGlzcGxheV9uYW1lID0gTidscHdkJykKQkVHSU4KICAgIElOU0VSVCBJTlRPIG9tcC5hdXRoX3Byb3ZpZGVycyhkaXNwbGF5X25hbWUsIGlzX2VuYWJsZWQpCiAgICBWQUxVRVMoTidscHdkJywgMSk7CkVORAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBTZWVkIGJhc2VsaW5lIGluc3RhbmNlIGJyYW5kaW5nIHNldHRpbmdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTUVSR0Ugb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zIEFTIHRhcmdldApVU0lORwooCiAgICBWQUxVRVMKICAgICAgICAoTidicmFuZGluZycsIE4ncGxhdGZvcm1OYW1lJywgTidEaXNwbGF5IG5hbWUgZm9yIHRoZSBpbnN0YWxsZWQgT3Blbk1vZHVsZVBsYXRmb3JtIGluc3RhbmNlLicsIDEwLCBDT05WRVJUKGJpdCwgMSkpLAogICAgICAgIChOJ2JyYW5kaW5nJywgTidwb3J0YWxOYW1lJywgTidEaXNwbGF5IG5hbWUgZm9yIHRoZSBwb3J0YWwgY29uY2VwdCBpbiB0aGlzIGluc3RhbGxhdGlvbi4nLCAyMCwgQ09OVkVSVChiaXQsIDEpKSwKICAgICAgICAoTidhdXRoJywgTidleHRlcm5hbFVzZXJQcm92aXNpb25pbmdNb2RlJywgTidDb250cm9scyB3aGV0aGVyIGV4dGVybmFsL0FEIHNpZ24taW5zIG1heSBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhbmQgbGluayBhbiBPTVAgdXNlci4gU3VwcG9ydGVkIHZhbHVlczogTWFudWFsLCBBdXRvSWZSb2xlLCBBdXRvSWZBdXRoZW50aWNhdGVkLicsIDEwMCwgQ09OVkVSVChiaXQsIDEpKSwKICAgICAgICAoTidyYmFjJywgTidhdXRoZW50aWNhdGVkVXNlcnNXaW5kb3dzRG9tYWlucycsIE4nQ29tbWEtLCBzZW1pY29sb24tLCBvciBuZXdsaW5lLXNlcGFyYXRlZCBXaW5kb3dzIGFjY291bnQgZG9tYWluL3dvcmtncm91cC9jb21wdXRlciBwcmVmaXhlcyB0aGF0IG1heSByZWNlaXZlIHRoZSBidWlsdC1pbiBBdXRoZW50aWNhdGVkVXNlcnMgcHJpbmNpcGFsLiBFbXB0eSBvciAqIGFjY2VwdHMgYW55IGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsLicsIDEwMCwgQ09OVkVSVChiaXQsIDEpKQopIEFTIHNvdXJjZShDb25maWdDYXRlZ29yeSwgQ29uZmlnU2V0dGluZywgRGVzY3JpcHRpb24sIFNvcnRPcmRlciwgSXNFbmFibGVkKQpPTiB0YXJnZXQuQ29uZmlnQ2F0ZWdvcnkgPSBzb3VyY2UuQ29uZmlnQ2F0ZWdvcnkKICAgQU5EIHRhcmdldC5Db25maWdTZXR0aW5nID0gc291cmNlLkNvbmZpZ1NldHRpbmcKV0hFTiBNQVRDSEVEIFRIRU4KICAgIFVQREFURSBTRVQgRGVzY3JpcHRpb24gPSBzb3VyY2UuRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgIFNvcnRPcmRlciA9IHNvdXJjZS5Tb3J0T3JkZXIsCiAgICAgICAgICAgICAgIElzRW5hYmxlZCA9IHNvdXJjZS5Jc0VuYWJsZWQsCiAgICAgICAgICAgICAgIFVwZGF0ZWRVdGMgPSBTWVNVVENEQVRFVElNRSgpCldIRU4gTk9UIE1BVENIRUQgVEhFTgogICAgSU5TRVJUKENvbmZpZ0NhdGVnb3J5LCBDb25maWdTZXR0aW5nLCBEZXNjcmlwdGlvbiwgU29ydE9yZGVyLCBJc0VuYWJsZWQpCiAgICBWQUxVRVMoc291cmNlLkNvbmZpZ0NhdGVnb3J5LCBzb3VyY2UuQ29uZmlnU2V0dGluZywgc291cmNlLkRlc2NyaXB0aW9uLCBzb3VyY2UuU29ydE9yZGVyLCBzb3VyY2UuSXNFbmFibGVkKTsKCi0tIEluc2VydCBkZWZhdWx0cyBvbmx5LiBFbnZpcm9ubWVudC9jdXN0b21lciBpbnN0YWxsZXJzIG1heSBpbnRlbnRpb25hbGx5Ci0tIG92ZXJyaWRlIHRoZXNlIHJvd3MgKGZvciBleGFtcGxlIFZHUiB1c2VzIEVNUCksIHNvIHJlcnVubmluZyB0aGUgZ2VuZXJpYyBjb3JlCi0tIGluaXRpYWxpemF0aW9uIG11c3Qgbm90IHJlc2V0IGFuIGV4aXN0aW5nIGJyYW5kaW5nIGNob2ljZS4KTUVSR0Ugb21wLmNvbmZpZ19zZXR0aW5ncyBBUyB0YXJnZXQKVVNJTkcKKAogICAgU0VMRUNUIGRlZi5Db25maWdTZXR0aW5nSWQsCiAgICAgICAgICAgc2VlZC5Db25maWdWYWx1ZSwKICAgICAgICAgICBzZWVkLkNvbmZpZ1ByaW9yaXR5CiAgICBGUk9NCiAgICAoCiAgICAgICAgVkFMVUVTCiAgICAgICAgICAgIChOJ2JyYW5kaW5nJywgTidwbGF0Zm9ybU5hbWUnLCBOJ09NUCcsIDApLAogICAgICAgICAgICAoTidicmFuZGluZycsIE4ncG9ydGFsTmFtZScsIE4nUG9ydGFsJywgMCksCiAgICAgICAgICAgIChOJ2F1dGgnLCBOJ2V4dGVybmFsVXNlclByb3Zpc2lvbmluZ01vZGUnLCBOJ01hbnVhbCcsIDApLAogICAgICAgICAgICAoTidyYmFjJywgTidhdXRoZW50aWNhdGVkVXNlcnNXaW5kb3dzRG9tYWlucycsIE4nJywgMCkKICAgICkgQVMgc2VlZChDb25maWdDYXRlZ29yeSwgQ29uZmlnU2V0dGluZywgQ29uZmlnVmFsdWUsIENvbmZpZ1ByaW9yaXR5KQogICAgSU5ORVIgSk9JTiBvbXAuY29uZmlnX3NldHRpbmdfZGVmaW5pdGlvbnMgZGVmCiAgICAgICAgT04gZGVmLkNvbmZpZ0NhdGVnb3J5ID0gc2VlZC5Db25maWdDYXRlZ29yeQogICAgICAgQU5EIGRlZi5Db25maWdTZXR0aW5nID0gc2VlZC5Db25maWdTZXR0aW5nCikgQVMgc291cmNlKENvbmZpZ1NldHRpbmdJZCwgQ29uZmlnVmFsdWUsIENvbmZpZ1ByaW9yaXR5KQpPTiB0YXJnZXQuQ29uZmlnU2V0dGluZ0lkID0gc291cmNlLkNvbmZpZ1NldHRpbmdJZAogICBBTkQgdGFyZ2V0LkNvbmZpZ1VzciBJUyBOVUxMCiAgIEFORCB0YXJnZXQuQ29uZmlnUGVybWlzc2lvbiBJUyBOVUxMCiAgIEFORCB0YXJnZXQuQ29uZmlnUm9sZSBJUyBOVUxMCldIRU4gTk9UIE1BVENIRUQgVEhFTgogICAgSU5TRVJUKENvbmZpZ1NldHRpbmdJZCwgQ29uZmlnVmFsdWUsIENvbmZpZ1ByaW9yaXR5KQogICAgVkFMVUVTKHNvdXJjZS5Db25maWdTZXR0aW5nSWQsIHNvdXJjZS5Db25maWdWYWx1ZSwgc291cmNlLkNvbmZpZ1ByaW9yaXR5KTsKCi0tIExlZ2FjeSBjb25maWd1cmF0aW9uIHZhbHVlIGZyb20gZWFybHkgZXh0ZXJuYWwtdXNlciBib290c3RyYXAgYnVpbGRzLgotLSBBdXRvSWZSb2xlIGlzIHRoZSBjdXJyZW50IGVxdWl2YWxlbnQgbmFtZSB1c2VkIGJ5IFBvcnRhbCBzZXR0aW5ncy4KVVBEQVRFIGNzClNFVCBDb25maWdWYWx1ZSA9IE4nQXV0b0lmUm9sZScKRlJPTSBvbXAuY29uZmlnX3NldHRpbmdzIGNzCklOTkVSIEpPSU4gb21wLmNvbmZpZ19zZXR0aW5nX2RlZmluaXRpb25zIGRlZgogICAgT04gZGVmLkNvbmZpZ1NldHRpbmdJZCA9IGNzLkNvbmZpZ1NldHRpbmdJZApXSEVSRSBkZWYuQ29uZmlnQ2F0ZWdvcnkgPSBOJ2F1dGgnCiAgQU5EIGRlZi5Db25maWdTZXR0aW5nID0gTidleHRlcm5hbFVzZXJQcm92aXNpb25pbmdNb2RlJwogIEFORCBjcy5Db25maWdWYWx1ZSA9IE4nQXV0b21hdGljRm9yQXV0aG9yaXplZFVzZXJzJzsKCi8qCkJvb3RzdHJhcCBhZG1pbmlzdHJhdGl2ZSBwcmluY2lwYWwgcm93cy4KClNldCBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwgYmVmb3JlIHlvdSB0cnkgdG8gc2lnbiBpbiB0byBPTVAgUG9ydGFsIG9yCm90aGVyIE9NUCBtb2R1bGVzIHRoYXQgcmVseSBvbiB0aGUgc2hhcmVkIFBvcnRhbEFkbWlucyBib290c3RyYXAgcm9sZS4KRXhhbXBsZXM6Ci0gUHJpbmNpcGFsVHlwZSBOJ0FEVXNlcicgd2l0aCBwcmluY2lwYWwgRE9NQUlOXHlvdXIudXNlcgotIFByaW5jaXBhbFR5cGUgTidBREdyb3VwJyB3aXRoIHByaW5jaXBhbCBET01BSU5cT01QIFBvcnRhbCBBZG1pbnMKClRoZSBsb2NhbCBpbnN0YWxsZXIgY2FuIGFkZCBtb3JlIHByaW5jaXBhbHMgYWZ0ZXIgdGhpcyBzY3JpcHQgcnVucy4gVGhpcyBzY3JpcHQKaW5zZXJ0cyB0aGUgY29uZmlndXJlZCBwcmluY2lwYWwgaWYgaXQgaXMgbWlzc2luZyBhbmQgaW50ZW50aW9uYWxseSBkb2VzIG5vdApvdmVyd3JpdGUgZXhpc3RpbmcgYm9vdHN0cmFwIHByaW5jaXBhbHMuCgpEbyBub3QgcGFzcyB0aGUgcHJpbmNpcGFsIHRocm91Z2ggc3FsY21kIC12LiBTUUxDTUQgdmFyaWFibGVzIGFyZSB0ZXh0dWFsCnN1YnN0aXR1dGlvbiBiZWZvcmUgVC1TUUwgcGFyc2luZywgc28gdmFsdWVzIGNvbnRhaW5pbmcgU1FMIG1ldGFjaGFyYWN0ZXJzIGNhbm5vdApiZSBzYWZlbHkgdmFsaWRhdGVkIGluc2lkZSB0aGlzIHNjcmlwdCBhZnRlciBzdWJzdGl0dXRpb24uIFVzZSB0aGUgUG93ZXJTaGVsbAppbnN0YWxsZXIgZm9yIGF1dG9tYXRlZCBsb2NhbCBydW5zLCBvciBtYW51YWxseSBlc2NhcGUgc2luZ2xlIHF1b3RlcyBpbiB0aGUKbGl0ZXJhbCBhYm92ZS4KKi8KLS0gUmVwZWF0IHRoZSBsZWdhY3kgVXNlciAtPiBBRFVzZXIgbWlncmF0aW9uIGhlcmUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGEgc2hhcmVkCi0tIHN0b3JlZCBwcm9jZWR1cmUuIFRoZSBzZXR1cCBzY3JpcHQgbWF5IGJlIHJ1biBiZWZvcmUgcHJvZ3JhbW1hYmxlIG9iamVjdHMKLS0gZXhpc3QsIGFuZCBpbnN0YWxsZXJzIHNvbWV0aW1lcyByZXJ1biBvbmx5IHRoaXMgaW5pdGlhbGl6YXRpb24gc2NyaXB0IGFmdGVyIGFuCi0tIG9sZGVyIGRlcGxveW1lbnQuCkRFTEVURSBsZWdhY3kKRlJPTSBvbXAuUm9sZVByaW5jaXBhbHMgbGVnYWN5CldIRVJFIGxlZ2FjeS5QcmluY2lwYWxUeXBlID0gTidVc2VyJwogIEFORCBFWElTVFMKICAoCiAgICAgIFNFTEVDVCAxCiAgICAgIEZST00gb21wLlJvbGVQcmluY2lwYWxzIGN1cnJlbnRQcmluY2lwYWwKICAgICAgV0hFUkUgY3VycmVudFByaW5jaXBhbC5Sb2xlSWQgPSBsZWdhY3kuUm9sZUlkCiAgICAgICAgQU5EIGN1cnJlbnRQcmluY2lwYWwuUHJpbmNpcGFsVHlwZSA9IE4nQURVc2VyJwogICAgICAgIEFORCBjdXJyZW50UHJpbmNpcGFsLlByaW5jaXBhbCA9IGxlZ2FjeS5QcmluY2lwYWwKICApOwoKVVBEQVRFIG9tcC5Sb2xlUHJpbmNpcGFscwpTRVQgUHJpbmNpcGFsVHlwZSA9IE4nQURVc2VyJwpXSEVSRSBQcmluY2lwYWxUeXBlID0gTidVc2VyJzsKCklGIE5PVCBFWElTVFMKKAogICAgU0VMRUNUIDEKICAgIEZST00gb21wLlJvbGVQcmluY2lwYWxzCiAgICBXSEVSRSBSb2xlSWQgPSBAUG9ydGFsQWRtaW5zUm9sZUlkCiAgICAgIEFORCBQcmluY2lwYWxUeXBlID0gQEJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsVHlwZQogICAgICBBTkQgUHJpbmNpcGFsID0gQEJvb3RzdHJhcFBvcnRhbEFkbWluUHJpbmNpcGFsCikKQkVHSU4KICAgIElOU0VSVCBJTlRPIG9tcC5Sb2xlUHJpbmNpcGFscyhSb2xlSWQsIFByaW5jaXBhbFR5cGUsIFByaW5jaXBhbCkKICAgIFZBTFVFUyhAUG9ydGFsQWRtaW5zUm9sZUlkLCBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWxUeXBlLCBAQm9vdHN0cmFwUG9ydGFsQWRtaW5QcmluY2lwYWwpOwpFTkQKR08K",
"sha256": "a2bb9ae07d18a7993b62ee867fb9ebd7761a45e8f91018148830bec559c58a01"
}
],
"integrity": {
"source": "Derived from sql/0-validate-openmoduleplatform.sql, sql/1-setup-openmoduleplatform.sql, and sql/2-initialize-openmoduleplatform.sql.",
"requiredSchemas": [
"omp"
],
"requiredTables": [
{
"schema": "omp",
"name": "Permissions",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "RBAC permission definitions."
},
{
"schema": "omp",
"name": "Roles",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "RBAC role definitions."
},
{
"schema": "omp",
"name": "RolePermissions",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Role-to-permission grants."
},
{
"schema": "omp",
"name": "RolePrincipals",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Role-to-principal bindings."
},
{
"schema": "omp",
"name": "AuditLog",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Administrative audit history."
},
{
"schema": "omp",
"name": "InstanceTemplates",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Desired-state template roots."
},
{
"schema": "omp",
"name": "HostTemplates",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Reusable host template definitions."
},
{
"schema": "omp",
"name": "Instances",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "OMP installation instances."
},
{
"schema": "omp",
"name": "Hosts",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Runtime host records."
},
{
"schema": "omp",
"name": "Modules",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Installed module definitions."
},
{
"schema": "omp",
"name": "ModuleInstances",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Module instances inside an OMP instance."
},
{
"schema": "omp",
"name": "Apps",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Application definitions owned by modules."
},
{
"schema": "omp",
"name": "AppPermissions",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Permissions required by apps."
},
{
"schema": "omp",
"name": "Artifacts",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Immutable deployable artifact records."
},
{
"schema": "omp",
"name": "ArtifactConfigurationFiles",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Mutable config files generated beside artifacts."
},
{
"schema": "omp",
"name": "HostConfigurationDocuments",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Imported host-level configuration inputs used to generate host-specific overlays."
},
{
"schema": "omp",
"name": "ConfigOverlayDocuments",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Host-specific configuration overlay documents."
},
{
"schema": "omp",
"name": "ConfigOverlayConfigurationFiles",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Configuration files applied by matching host-specific overlays."
},
{
"schema": "omp",
"name": "AppInstances",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Actual deployed app instances."
},
{
"schema": "omp",
"name": "AppWorkerDefinitions",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Worker plugin runtime metadata."
},
{
"schema": "omp",
"name": "WorkerInstances",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Desired worker runtime rows."
},
{
"schema": "omp",
"name": "InstanceTemplateHosts",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Desired template hosts."
},
{
"schema": "omp",
"name": "InstanceTemplateModuleInstances",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Desired template module instances."
},
{
"schema": "omp",
"name": "InstanceTemplateAppInstances",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Desired template app instances."
},
{
"schema": "omp",
"name": "HostDeploymentAssignments",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Host-to-template assignments."
},
{
"schema": "omp",
"name": "HostDeployments",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "HostAgent deployment history."
},
{
"schema": "omp",
"name": "HostArtifactRequirements",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Additional host artifact requirements."
},
{
"schema": "omp",
"name": "HostArtifactStates",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Host-local artifact state."
},
{
"schema": "omp",
"name": "HostAppDeploymentStates",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Host-local app deployment state."
},
{
"schema": "omp",
"name": "HostAgentDesiredStates",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Desired HostAgent artifact per host."
},
{
"schema": "omp",
"name": "HostAgentRuntimeStates",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Observed HostAgent services and takeover state per host."
},
{
"schema": "omp",
"name": "HostAgentLeases",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Short active HostAgent lease per host."
},
{
"schema": "omp",
"name": "HostAgentJobs",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Host-specific job queue processed by HostAgent."
},
{
"schema": "omp",
"name": "MaintenanceFindings",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Portal-visible maintenance scan findings and cleanup state."
},
{
"schema": "omp",
"name": "AppInstanceRuntimeStates",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Runtime heartbeat/state for app instances."
},
{
"schema": "omp",
"name": "WorkerInstanceRuntimeStates",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Runtime heartbeat/state for worker instances."
},
{
"schema": "omp",
"name": "users",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "OMP user identities."
},
{
"schema": "omp",
"name": "notifications",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Personal OMP user notifications shown in shared navigation."
},
{
"schema": "omp",
"name": "banners",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "System-controlled banners shown in shared navigation."
},
{
"schema": "omp",
"name": "banner_targets",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Global and role targets for system-controlled banners."
},
{
"schema": "omp",
"name": "auth_providers",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Authentication provider catalog."
},
{
"schema": "omp",
"name": "user_auth",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "User-to-auth-provider links."
},
{
"schema": "omp",
"name": "auth_provider_lpwd",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Local password credentials."
},
{
"schema": "omp",
"name": "config_setting_definitions",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Allowed OMP configuration keys."
},
{
"schema": "omp",
"name": "config_settings",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Scoped OMP configuration values."
},
{
"schema": "omp",
"name": "ModuleDefinitionDocuments",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Versioned module definition documents."
},
{
"schema": "omp",
"name": "ModuleDefinitionArtifactCompatibility",
"source": "sql/1-setup-openmoduleplatform.sql",
"purpose": "Queryable module-definition artifact compatibility."
}
],
"requiredOmpRows": {
"roles": [
{
"name": "PortalAdmins",
"description": "Administrative bootstrap role for OMP modules and portal."
},
{
"name": "Everyone",
"description": "Built-in baseline role available to every signed-in OMP principal."
},
{
"name": "AuthenticatedUsers",
"description": "Built-in baseline role for authenticated OMP users."
}
],
"rolePrincipals": [
{
"roleName": "Everyone",
"principalType": "OMPSystem",
"principal": "Everyone"
},
{
"roleName": "AuthenticatedUsers",
"principalType": "OMPSystem",
"principal": "AuthenticatedUsers"
}
],
"authProviders": [
{
"displayName": "AD",
"isEnabled": true
},
{
"displayName": "lpwd",
"isEnabled": true
}
],
"configSettingDefinitions": [
{
"configCategory": "branding",
"configSetting": "platformName"
},
{
"configCategory": "branding",
"configSetting": "portalName"
},
{
"configCategory": "auth",
"configSetting": "externalUserProvisioningMode"
},
{
"configCategory": "rbac",
"configSetting": "authenticatedUsersWindowsDomains"
}
],
"instanceTemplates": [
{
"templateKey": "default",
"source": "sql/2-initialize-openmoduleplatform.sql"
}
],
"hostTemplates": [
{
"templateKey": "default-host",
"source": "sql/2-initialize-openmoduleplatform.sql"
}
],
"instances": [
{
"instanceKey": "default",
"source": "sql/2-initialize-openmoduleplatform.sql"
}
],
"bootstrapRequirements": [
{
"name": "PortalAdmins principal",
"description": "At least one environment-specific ADUser or ADGroup principal must be bound to PortalAdmins during bootstrap."
}
]
},
"requiredModuleRows": {},
"excludedSeedData": [
{
"key": "sample-host",
"source": "sql/2-initialize-openmoduleplatform.sql",
"reason": "The seeded sample host is a local bootstrap placeholder. Production/test installations should replace it with real host rows instead of treating sample-host as an integrity requirement."
},
{
"key": "default branding values",
"source": "sql/2-initialize-openmoduleplatform.sql",
"reason": "Default branding values are only inserted when no installation-specific value exists and must not overwrite customer configuration during repair."
}
]
}
}