@hanzo/browser-extension 1.9.31 → 1.9.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/package.json +2 -1
  2. package/src/answer/AnswerEngine.tsx +553 -0
  3. package/src/manifest-firefox.json +10 -2
  4. package/src/manifest.json +17 -2
  5. package/src/newtab.css +277 -0
  6. package/src/newtab.html +13 -0
  7. package/src/popup.html +28 -0
  8. package/dist/browser-extension/README.md +0 -43
  9. package/dist/browser-extension/background-firefox.js +0 -4556
  10. package/dist/browser-extension/background.js +0 -7245
  11. package/dist/browser-extension/browser-control.js +0 -1317
  12. package/dist/browser-extension/chrome/ai-worker.js +0 -571
  13. package/dist/browser-extension/chrome/background.js +0 -7245
  14. package/dist/browser-extension/chrome/callback.html +0 -17
  15. package/dist/browser-extension/chrome/content-script.js +0 -2789
  16. package/dist/browser-extension/chrome/icon128.png +0 -0
  17. package/dist/browser-extension/chrome/icon16.png +0 -0
  18. package/dist/browser-extension/chrome/icon48.png +0 -0
  19. package/dist/browser-extension/chrome/manifest.json +0 -66
  20. package/dist/browser-extension/chrome/popup.css +0 -761
  21. package/dist/browser-extension/chrome/popup.html +0 -353
  22. package/dist/browser-extension/chrome/popup.js +0 -1650
  23. package/dist/browser-extension/chrome/sidebar.css +0 -1792
  24. package/dist/browser-extension/chrome/sidebar.html +0 -463
  25. package/dist/browser-extension/chrome/sidebar.js +0 -26541
  26. package/dist/browser-extension/cli.js +0 -233
  27. package/dist/browser-extension/firefox/ai-worker.js +0 -571
  28. package/dist/browser-extension/firefox/background.js +0 -4556
  29. package/dist/browser-extension/firefox/callback.html +0 -17
  30. package/dist/browser-extension/firefox/content-script.js +0 -2789
  31. package/dist/browser-extension/firefox/icon128.png +0 -0
  32. package/dist/browser-extension/firefox/icon16.png +0 -0
  33. package/dist/browser-extension/firefox/icon48.png +0 -0
  34. package/dist/browser-extension/firefox/manifest.json +0 -77
  35. package/dist/browser-extension/firefox/popup.css +0 -761
  36. package/dist/browser-extension/firefox/popup.html +0 -353
  37. package/dist/browser-extension/firefox/popup.js +0 -1650
  38. package/dist/browser-extension/firefox/sidebar.css +0 -1792
  39. package/dist/browser-extension/firefox/sidebar.html +0 -463
  40. package/dist/browser-extension/firefox/sidebar.js +0 -26541
  41. package/dist/browser-extension/icon128.png +0 -0
  42. package/dist/browser-extension/icon16.png +0 -0
  43. package/dist/browser-extension/icon48.png +0 -0
  44. package/dist/browser-extension/manifest.json +0 -66
  45. package/dist/browser-extension/package.json +0 -41
  46. package/dist/browser-extension/popup.js +0 -1650
  47. package/dist/browser-extension/safari/Info.plist +0 -21
  48. package/dist/browser-extension/safari/ai-worker.js +0 -571
  49. package/dist/browser-extension/safari/background.js +0 -7245
  50. package/dist/browser-extension/safari/callback.html +0 -17
  51. package/dist/browser-extension/safari/content-script.js +0 -2789
  52. package/dist/browser-extension/safari/icon128.png +0 -0
  53. package/dist/browser-extension/safari/icon16.png +0 -0
  54. package/dist/browser-extension/safari/icon48.png +0 -0
  55. package/dist/browser-extension/safari/popup.css +0 -761
  56. package/dist/browser-extension/safari/popup.html +0 -353
  57. package/dist/browser-extension/safari/popup.js +0 -1650
  58. package/dist/browser-extension/safari/sidebar.css +0 -1792
  59. package/dist/browser-extension/safari/sidebar.html +0 -463
  60. package/dist/browser-extension/safari/sidebar.js +0 -26541
  61. package/dist/browser-extension/sidebar.js +0 -26541
  62. package/dist/browser-extension/webgpu-ai.js +0 -568
@@ -1,2789 +0,0 @@
1
- "use strict";
2
- (() => {
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __commonJS = (cb, mod) => function __require() {
10
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
-
29
- // ../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js
30
- var require_browser_polyfill = __commonJS({
31
- "../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js"(exports, module) {
32
- (function(global, factory) {
33
- if (typeof define === "function" && define.amd) {
34
- define("webextension-polyfill", ["module"], factory);
35
- } else if (typeof exports !== "undefined") {
36
- factory(module);
37
- } else {
38
- var mod = {
39
- exports: {}
40
- };
41
- factory(mod);
42
- global.browser = mod.exports;
43
- }
44
- })(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : exports, function(module2) {
45
- "use strict";
46
- if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {
47
- throw new Error("This script should only be loaded in a browser extension.");
48
- }
49
- if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {
50
- const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.";
51
- const wrapAPIs = (extensionAPIs) => {
52
- const apiMetadata = {
53
- "alarms": {
54
- "clear": {
55
- "minArgs": 0,
56
- "maxArgs": 1
57
- },
58
- "clearAll": {
59
- "minArgs": 0,
60
- "maxArgs": 0
61
- },
62
- "get": {
63
- "minArgs": 0,
64
- "maxArgs": 1
65
- },
66
- "getAll": {
67
- "minArgs": 0,
68
- "maxArgs": 0
69
- }
70
- },
71
- "bookmarks": {
72
- "create": {
73
- "minArgs": 1,
74
- "maxArgs": 1
75
- },
76
- "get": {
77
- "minArgs": 1,
78
- "maxArgs": 1
79
- },
80
- "getChildren": {
81
- "minArgs": 1,
82
- "maxArgs": 1
83
- },
84
- "getRecent": {
85
- "minArgs": 1,
86
- "maxArgs": 1
87
- },
88
- "getSubTree": {
89
- "minArgs": 1,
90
- "maxArgs": 1
91
- },
92
- "getTree": {
93
- "minArgs": 0,
94
- "maxArgs": 0
95
- },
96
- "move": {
97
- "minArgs": 2,
98
- "maxArgs": 2
99
- },
100
- "remove": {
101
- "minArgs": 1,
102
- "maxArgs": 1
103
- },
104
- "removeTree": {
105
- "minArgs": 1,
106
- "maxArgs": 1
107
- },
108
- "search": {
109
- "minArgs": 1,
110
- "maxArgs": 1
111
- },
112
- "update": {
113
- "minArgs": 2,
114
- "maxArgs": 2
115
- }
116
- },
117
- "browserAction": {
118
- "disable": {
119
- "minArgs": 0,
120
- "maxArgs": 1,
121
- "fallbackToNoCallback": true
122
- },
123
- "enable": {
124
- "minArgs": 0,
125
- "maxArgs": 1,
126
- "fallbackToNoCallback": true
127
- },
128
- "getBadgeBackgroundColor": {
129
- "minArgs": 1,
130
- "maxArgs": 1
131
- },
132
- "getBadgeText": {
133
- "minArgs": 1,
134
- "maxArgs": 1
135
- },
136
- "getPopup": {
137
- "minArgs": 1,
138
- "maxArgs": 1
139
- },
140
- "getTitle": {
141
- "minArgs": 1,
142
- "maxArgs": 1
143
- },
144
- "openPopup": {
145
- "minArgs": 0,
146
- "maxArgs": 0
147
- },
148
- "setBadgeBackgroundColor": {
149
- "minArgs": 1,
150
- "maxArgs": 1,
151
- "fallbackToNoCallback": true
152
- },
153
- "setBadgeText": {
154
- "minArgs": 1,
155
- "maxArgs": 1,
156
- "fallbackToNoCallback": true
157
- },
158
- "setIcon": {
159
- "minArgs": 1,
160
- "maxArgs": 1
161
- },
162
- "setPopup": {
163
- "minArgs": 1,
164
- "maxArgs": 1,
165
- "fallbackToNoCallback": true
166
- },
167
- "setTitle": {
168
- "minArgs": 1,
169
- "maxArgs": 1,
170
- "fallbackToNoCallback": true
171
- }
172
- },
173
- "browsingData": {
174
- "remove": {
175
- "minArgs": 2,
176
- "maxArgs": 2
177
- },
178
- "removeCache": {
179
- "minArgs": 1,
180
- "maxArgs": 1
181
- },
182
- "removeCookies": {
183
- "minArgs": 1,
184
- "maxArgs": 1
185
- },
186
- "removeDownloads": {
187
- "minArgs": 1,
188
- "maxArgs": 1
189
- },
190
- "removeFormData": {
191
- "minArgs": 1,
192
- "maxArgs": 1
193
- },
194
- "removeHistory": {
195
- "minArgs": 1,
196
- "maxArgs": 1
197
- },
198
- "removeLocalStorage": {
199
- "minArgs": 1,
200
- "maxArgs": 1
201
- },
202
- "removePasswords": {
203
- "minArgs": 1,
204
- "maxArgs": 1
205
- },
206
- "removePluginData": {
207
- "minArgs": 1,
208
- "maxArgs": 1
209
- },
210
- "settings": {
211
- "minArgs": 0,
212
- "maxArgs": 0
213
- }
214
- },
215
- "commands": {
216
- "getAll": {
217
- "minArgs": 0,
218
- "maxArgs": 0
219
- }
220
- },
221
- "contextMenus": {
222
- "remove": {
223
- "minArgs": 1,
224
- "maxArgs": 1
225
- },
226
- "removeAll": {
227
- "minArgs": 0,
228
- "maxArgs": 0
229
- },
230
- "update": {
231
- "minArgs": 2,
232
- "maxArgs": 2
233
- }
234
- },
235
- "cookies": {
236
- "get": {
237
- "minArgs": 1,
238
- "maxArgs": 1
239
- },
240
- "getAll": {
241
- "minArgs": 1,
242
- "maxArgs": 1
243
- },
244
- "getAllCookieStores": {
245
- "minArgs": 0,
246
- "maxArgs": 0
247
- },
248
- "remove": {
249
- "minArgs": 1,
250
- "maxArgs": 1
251
- },
252
- "set": {
253
- "minArgs": 1,
254
- "maxArgs": 1
255
- }
256
- },
257
- "devtools": {
258
- "inspectedWindow": {
259
- "eval": {
260
- "minArgs": 1,
261
- "maxArgs": 2,
262
- "singleCallbackArg": false
263
- }
264
- },
265
- "panels": {
266
- "create": {
267
- "minArgs": 3,
268
- "maxArgs": 3,
269
- "singleCallbackArg": true
270
- },
271
- "elements": {
272
- "createSidebarPane": {
273
- "minArgs": 1,
274
- "maxArgs": 1
275
- }
276
- }
277
- }
278
- },
279
- "downloads": {
280
- "cancel": {
281
- "minArgs": 1,
282
- "maxArgs": 1
283
- },
284
- "download": {
285
- "minArgs": 1,
286
- "maxArgs": 1
287
- },
288
- "erase": {
289
- "minArgs": 1,
290
- "maxArgs": 1
291
- },
292
- "getFileIcon": {
293
- "minArgs": 1,
294
- "maxArgs": 2
295
- },
296
- "open": {
297
- "minArgs": 1,
298
- "maxArgs": 1,
299
- "fallbackToNoCallback": true
300
- },
301
- "pause": {
302
- "minArgs": 1,
303
- "maxArgs": 1
304
- },
305
- "removeFile": {
306
- "minArgs": 1,
307
- "maxArgs": 1
308
- },
309
- "resume": {
310
- "minArgs": 1,
311
- "maxArgs": 1
312
- },
313
- "search": {
314
- "minArgs": 1,
315
- "maxArgs": 1
316
- },
317
- "show": {
318
- "minArgs": 1,
319
- "maxArgs": 1,
320
- "fallbackToNoCallback": true
321
- }
322
- },
323
- "extension": {
324
- "isAllowedFileSchemeAccess": {
325
- "minArgs": 0,
326
- "maxArgs": 0
327
- },
328
- "isAllowedIncognitoAccess": {
329
- "minArgs": 0,
330
- "maxArgs": 0
331
- }
332
- },
333
- "history": {
334
- "addUrl": {
335
- "minArgs": 1,
336
- "maxArgs": 1
337
- },
338
- "deleteAll": {
339
- "minArgs": 0,
340
- "maxArgs": 0
341
- },
342
- "deleteRange": {
343
- "minArgs": 1,
344
- "maxArgs": 1
345
- },
346
- "deleteUrl": {
347
- "minArgs": 1,
348
- "maxArgs": 1
349
- },
350
- "getVisits": {
351
- "minArgs": 1,
352
- "maxArgs": 1
353
- },
354
- "search": {
355
- "minArgs": 1,
356
- "maxArgs": 1
357
- }
358
- },
359
- "i18n": {
360
- "detectLanguage": {
361
- "minArgs": 1,
362
- "maxArgs": 1
363
- },
364
- "getAcceptLanguages": {
365
- "minArgs": 0,
366
- "maxArgs": 0
367
- }
368
- },
369
- "identity": {
370
- "launchWebAuthFlow": {
371
- "minArgs": 1,
372
- "maxArgs": 1
373
- }
374
- },
375
- "idle": {
376
- "queryState": {
377
- "minArgs": 1,
378
- "maxArgs": 1
379
- }
380
- },
381
- "management": {
382
- "get": {
383
- "minArgs": 1,
384
- "maxArgs": 1
385
- },
386
- "getAll": {
387
- "minArgs": 0,
388
- "maxArgs": 0
389
- },
390
- "getSelf": {
391
- "minArgs": 0,
392
- "maxArgs": 0
393
- },
394
- "setEnabled": {
395
- "minArgs": 2,
396
- "maxArgs": 2
397
- },
398
- "uninstallSelf": {
399
- "minArgs": 0,
400
- "maxArgs": 1
401
- }
402
- },
403
- "notifications": {
404
- "clear": {
405
- "minArgs": 1,
406
- "maxArgs": 1
407
- },
408
- "create": {
409
- "minArgs": 1,
410
- "maxArgs": 2
411
- },
412
- "getAll": {
413
- "minArgs": 0,
414
- "maxArgs": 0
415
- },
416
- "getPermissionLevel": {
417
- "minArgs": 0,
418
- "maxArgs": 0
419
- },
420
- "update": {
421
- "minArgs": 2,
422
- "maxArgs": 2
423
- }
424
- },
425
- "pageAction": {
426
- "getPopup": {
427
- "minArgs": 1,
428
- "maxArgs": 1
429
- },
430
- "getTitle": {
431
- "minArgs": 1,
432
- "maxArgs": 1
433
- },
434
- "hide": {
435
- "minArgs": 1,
436
- "maxArgs": 1,
437
- "fallbackToNoCallback": true
438
- },
439
- "setIcon": {
440
- "minArgs": 1,
441
- "maxArgs": 1
442
- },
443
- "setPopup": {
444
- "minArgs": 1,
445
- "maxArgs": 1,
446
- "fallbackToNoCallback": true
447
- },
448
- "setTitle": {
449
- "minArgs": 1,
450
- "maxArgs": 1,
451
- "fallbackToNoCallback": true
452
- },
453
- "show": {
454
- "minArgs": 1,
455
- "maxArgs": 1,
456
- "fallbackToNoCallback": true
457
- }
458
- },
459
- "permissions": {
460
- "contains": {
461
- "minArgs": 1,
462
- "maxArgs": 1
463
- },
464
- "getAll": {
465
- "minArgs": 0,
466
- "maxArgs": 0
467
- },
468
- "remove": {
469
- "minArgs": 1,
470
- "maxArgs": 1
471
- },
472
- "request": {
473
- "minArgs": 1,
474
- "maxArgs": 1
475
- }
476
- },
477
- "runtime": {
478
- "getBackgroundPage": {
479
- "minArgs": 0,
480
- "maxArgs": 0
481
- },
482
- "getPlatformInfo": {
483
- "minArgs": 0,
484
- "maxArgs": 0
485
- },
486
- "openOptionsPage": {
487
- "minArgs": 0,
488
- "maxArgs": 0
489
- },
490
- "requestUpdateCheck": {
491
- "minArgs": 0,
492
- "maxArgs": 0
493
- },
494
- "sendMessage": {
495
- "minArgs": 1,
496
- "maxArgs": 3
497
- },
498
- "sendNativeMessage": {
499
- "minArgs": 2,
500
- "maxArgs": 2
501
- },
502
- "setUninstallURL": {
503
- "minArgs": 1,
504
- "maxArgs": 1
505
- }
506
- },
507
- "sessions": {
508
- "getDevices": {
509
- "minArgs": 0,
510
- "maxArgs": 1
511
- },
512
- "getRecentlyClosed": {
513
- "minArgs": 0,
514
- "maxArgs": 1
515
- },
516
- "restore": {
517
- "minArgs": 0,
518
- "maxArgs": 1
519
- }
520
- },
521
- "storage": {
522
- "local": {
523
- "clear": {
524
- "minArgs": 0,
525
- "maxArgs": 0
526
- },
527
- "get": {
528
- "minArgs": 0,
529
- "maxArgs": 1
530
- },
531
- "getBytesInUse": {
532
- "minArgs": 0,
533
- "maxArgs": 1
534
- },
535
- "remove": {
536
- "minArgs": 1,
537
- "maxArgs": 1
538
- },
539
- "set": {
540
- "minArgs": 1,
541
- "maxArgs": 1
542
- }
543
- },
544
- "managed": {
545
- "get": {
546
- "minArgs": 0,
547
- "maxArgs": 1
548
- },
549
- "getBytesInUse": {
550
- "minArgs": 0,
551
- "maxArgs": 1
552
- }
553
- },
554
- "sync": {
555
- "clear": {
556
- "minArgs": 0,
557
- "maxArgs": 0
558
- },
559
- "get": {
560
- "minArgs": 0,
561
- "maxArgs": 1
562
- },
563
- "getBytesInUse": {
564
- "minArgs": 0,
565
- "maxArgs": 1
566
- },
567
- "remove": {
568
- "minArgs": 1,
569
- "maxArgs": 1
570
- },
571
- "set": {
572
- "minArgs": 1,
573
- "maxArgs": 1
574
- }
575
- }
576
- },
577
- "tabs": {
578
- "captureVisibleTab": {
579
- "minArgs": 0,
580
- "maxArgs": 2
581
- },
582
- "create": {
583
- "minArgs": 1,
584
- "maxArgs": 1
585
- },
586
- "detectLanguage": {
587
- "minArgs": 0,
588
- "maxArgs": 1
589
- },
590
- "discard": {
591
- "minArgs": 0,
592
- "maxArgs": 1
593
- },
594
- "duplicate": {
595
- "minArgs": 1,
596
- "maxArgs": 1
597
- },
598
- "executeScript": {
599
- "minArgs": 1,
600
- "maxArgs": 2
601
- },
602
- "get": {
603
- "minArgs": 1,
604
- "maxArgs": 1
605
- },
606
- "getCurrent": {
607
- "minArgs": 0,
608
- "maxArgs": 0
609
- },
610
- "getZoom": {
611
- "minArgs": 0,
612
- "maxArgs": 1
613
- },
614
- "getZoomSettings": {
615
- "minArgs": 0,
616
- "maxArgs": 1
617
- },
618
- "goBack": {
619
- "minArgs": 0,
620
- "maxArgs": 1
621
- },
622
- "goForward": {
623
- "minArgs": 0,
624
- "maxArgs": 1
625
- },
626
- "highlight": {
627
- "minArgs": 1,
628
- "maxArgs": 1
629
- },
630
- "insertCSS": {
631
- "minArgs": 1,
632
- "maxArgs": 2
633
- },
634
- "move": {
635
- "minArgs": 2,
636
- "maxArgs": 2
637
- },
638
- "query": {
639
- "minArgs": 1,
640
- "maxArgs": 1
641
- },
642
- "reload": {
643
- "minArgs": 0,
644
- "maxArgs": 2
645
- },
646
- "remove": {
647
- "minArgs": 1,
648
- "maxArgs": 1
649
- },
650
- "removeCSS": {
651
- "minArgs": 1,
652
- "maxArgs": 2
653
- },
654
- "sendMessage": {
655
- "minArgs": 2,
656
- "maxArgs": 3
657
- },
658
- "setZoom": {
659
- "minArgs": 1,
660
- "maxArgs": 2
661
- },
662
- "setZoomSettings": {
663
- "minArgs": 1,
664
- "maxArgs": 2
665
- },
666
- "update": {
667
- "minArgs": 1,
668
- "maxArgs": 2
669
- }
670
- },
671
- "topSites": {
672
- "get": {
673
- "minArgs": 0,
674
- "maxArgs": 0
675
- }
676
- },
677
- "webNavigation": {
678
- "getAllFrames": {
679
- "minArgs": 1,
680
- "maxArgs": 1
681
- },
682
- "getFrame": {
683
- "minArgs": 1,
684
- "maxArgs": 1
685
- }
686
- },
687
- "webRequest": {
688
- "handlerBehaviorChanged": {
689
- "minArgs": 0,
690
- "maxArgs": 0
691
- }
692
- },
693
- "windows": {
694
- "create": {
695
- "minArgs": 0,
696
- "maxArgs": 1
697
- },
698
- "get": {
699
- "minArgs": 1,
700
- "maxArgs": 2
701
- },
702
- "getAll": {
703
- "minArgs": 0,
704
- "maxArgs": 1
705
- },
706
- "getCurrent": {
707
- "minArgs": 0,
708
- "maxArgs": 1
709
- },
710
- "getLastFocused": {
711
- "minArgs": 0,
712
- "maxArgs": 1
713
- },
714
- "remove": {
715
- "minArgs": 1,
716
- "maxArgs": 1
717
- },
718
- "update": {
719
- "minArgs": 2,
720
- "maxArgs": 2
721
- }
722
- }
723
- };
724
- if (Object.keys(apiMetadata).length === 0) {
725
- throw new Error("api-metadata.json has not been included in browser-polyfill");
726
- }
727
- class DefaultWeakMap extends WeakMap {
728
- constructor(createItem, items = void 0) {
729
- super(items);
730
- this.createItem = createItem;
731
- }
732
- get(key) {
733
- if (!this.has(key)) {
734
- this.set(key, this.createItem(key));
735
- }
736
- return super.get(key);
737
- }
738
- }
739
- const isThenable = (value) => {
740
- return value && typeof value === "object" && typeof value.then === "function";
741
- };
742
- const makeCallback = (promise, metadata) => {
743
- return (...callbackArgs) => {
744
- if (extensionAPIs.runtime.lastError) {
745
- promise.reject(new Error(extensionAPIs.runtime.lastError.message));
746
- } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
747
- promise.resolve(callbackArgs[0]);
748
- } else {
749
- promise.resolve(callbackArgs);
750
- }
751
- };
752
- };
753
- const pluralizeArguments = (numArgs) => numArgs == 1 ? "argument" : "arguments";
754
- const wrapAsyncFunction = (name, metadata) => {
755
- return function asyncFunctionWrapper(target, ...args) {
756
- if (args.length < metadata.minArgs) {
757
- throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
758
- }
759
- if (args.length > metadata.maxArgs) {
760
- throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
761
- }
762
- return new Promise((resolve, reject) => {
763
- if (metadata.fallbackToNoCallback) {
764
- try {
765
- target[name](...args, makeCallback({
766
- resolve,
767
- reject
768
- }, metadata));
769
- } catch (cbError) {
770
- console.warn(`${name} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `, cbError);
771
- target[name](...args);
772
- metadata.fallbackToNoCallback = false;
773
- metadata.noCallback = true;
774
- resolve();
775
- }
776
- } else if (metadata.noCallback) {
777
- target[name](...args);
778
- resolve();
779
- } else {
780
- target[name](...args, makeCallback({
781
- resolve,
782
- reject
783
- }, metadata));
784
- }
785
- });
786
- };
787
- };
788
- const wrapMethod = (target, method, wrapper) => {
789
- return new Proxy(method, {
790
- apply(targetMethod, thisObj, args) {
791
- return wrapper.call(thisObj, target, ...args);
792
- }
793
- });
794
- };
795
- let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
796
- const wrapObject = (target, wrappers = {}, metadata = {}) => {
797
- let cache = /* @__PURE__ */ Object.create(null);
798
- let handlers = {
799
- has(proxyTarget2, prop) {
800
- return prop in target || prop in cache;
801
- },
802
- get(proxyTarget2, prop, receiver) {
803
- if (prop in cache) {
804
- return cache[prop];
805
- }
806
- if (!(prop in target)) {
807
- return void 0;
808
- }
809
- let value = target[prop];
810
- if (typeof value === "function") {
811
- if (typeof wrappers[prop] === "function") {
812
- value = wrapMethod(target, target[prop], wrappers[prop]);
813
- } else if (hasOwnProperty(metadata, prop)) {
814
- let wrapper = wrapAsyncFunction(prop, metadata[prop]);
815
- value = wrapMethod(target, target[prop], wrapper);
816
- } else {
817
- value = value.bind(target);
818
- }
819
- } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {
820
- value = wrapObject(value, wrappers[prop], metadata[prop]);
821
- } else if (hasOwnProperty(metadata, "*")) {
822
- value = wrapObject(value, wrappers[prop], metadata["*"]);
823
- } else {
824
- Object.defineProperty(cache, prop, {
825
- configurable: true,
826
- enumerable: true,
827
- get() {
828
- return target[prop];
829
- },
830
- set(value2) {
831
- target[prop] = value2;
832
- }
833
- });
834
- return value;
835
- }
836
- cache[prop] = value;
837
- return value;
838
- },
839
- set(proxyTarget2, prop, value, receiver) {
840
- if (prop in cache) {
841
- cache[prop] = value;
842
- } else {
843
- target[prop] = value;
844
- }
845
- return true;
846
- },
847
- defineProperty(proxyTarget2, prop, desc) {
848
- return Reflect.defineProperty(cache, prop, desc);
849
- },
850
- deleteProperty(proxyTarget2, prop) {
851
- return Reflect.deleteProperty(cache, prop);
852
- }
853
- };
854
- let proxyTarget = Object.create(target);
855
- return new Proxy(proxyTarget, handlers);
856
- };
857
- const wrapEvent = (wrapperMap) => ({
858
- addListener(target, listener, ...args) {
859
- target.addListener(wrapperMap.get(listener), ...args);
860
- },
861
- hasListener(target, listener) {
862
- return target.hasListener(wrapperMap.get(listener));
863
- },
864
- removeListener(target, listener) {
865
- target.removeListener(wrapperMap.get(listener));
866
- }
867
- });
868
- const onRequestFinishedWrappers = new DefaultWeakMap((listener) => {
869
- if (typeof listener !== "function") {
870
- return listener;
871
- }
872
- return function onRequestFinished(req) {
873
- const wrappedReq = wrapObject(req, {}, {
874
- getContent: {
875
- minArgs: 0,
876
- maxArgs: 0
877
- }
878
- });
879
- listener(wrappedReq);
880
- };
881
- });
882
- const onMessageWrappers = new DefaultWeakMap((listener) => {
883
- if (typeof listener !== "function") {
884
- return listener;
885
- }
886
- return function onMessage(message, sender, sendResponse) {
887
- let didCallSendResponse = false;
888
- let wrappedSendResponse;
889
- let sendResponsePromise = new Promise((resolve) => {
890
- wrappedSendResponse = function(response) {
891
- didCallSendResponse = true;
892
- resolve(response);
893
- };
894
- });
895
- let result;
896
- try {
897
- result = listener(message, sender, wrappedSendResponse);
898
- } catch (err) {
899
- result = Promise.reject(err);
900
- }
901
- const isResultThenable = result !== true && isThenable(result);
902
- if (result !== true && !isResultThenable && !didCallSendResponse) {
903
- return false;
904
- }
905
- const sendPromisedResult = (promise) => {
906
- promise.then((msg) => {
907
- sendResponse(msg);
908
- }, (error) => {
909
- let message2;
910
- if (error && (error instanceof Error || typeof error.message === "string")) {
911
- message2 = error.message;
912
- } else {
913
- message2 = "An unexpected error occurred";
914
- }
915
- sendResponse({
916
- __mozWebExtensionPolyfillReject__: true,
917
- message: message2
918
- });
919
- }).catch((err) => {
920
- console.error("Failed to send onMessage rejected reply", err);
921
- });
922
- };
923
- if (isResultThenable) {
924
- sendPromisedResult(result);
925
- } else {
926
- sendPromisedResult(sendResponsePromise);
927
- }
928
- return true;
929
- };
930
- });
931
- const wrappedSendMessageCallback = ({
932
- reject,
933
- resolve
934
- }, reply) => {
935
- if (extensionAPIs.runtime.lastError) {
936
- if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
937
- resolve();
938
- } else {
939
- reject(new Error(extensionAPIs.runtime.lastError.message));
940
- }
941
- } else if (reply && reply.__mozWebExtensionPolyfillReject__) {
942
- reject(new Error(reply.message));
943
- } else {
944
- resolve(reply);
945
- }
946
- };
947
- const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
948
- if (args.length < metadata.minArgs) {
949
- throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
950
- }
951
- if (args.length > metadata.maxArgs) {
952
- throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
953
- }
954
- return new Promise((resolve, reject) => {
955
- const wrappedCb = wrappedSendMessageCallback.bind(null, {
956
- resolve,
957
- reject
958
- });
959
- args.push(wrappedCb);
960
- apiNamespaceObj.sendMessage(...args);
961
- });
962
- };
963
- const staticWrappers = {
964
- devtools: {
965
- network: {
966
- onRequestFinished: wrapEvent(onRequestFinishedWrappers)
967
- }
968
- },
969
- runtime: {
970
- onMessage: wrapEvent(onMessageWrappers),
971
- onMessageExternal: wrapEvent(onMessageWrappers),
972
- sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
973
- minArgs: 1,
974
- maxArgs: 3
975
- })
976
- },
977
- tabs: {
978
- sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
979
- minArgs: 2,
980
- maxArgs: 3
981
- })
982
- }
983
- };
984
- const settingMetadata = {
985
- clear: {
986
- minArgs: 1,
987
- maxArgs: 1
988
- },
989
- get: {
990
- minArgs: 1,
991
- maxArgs: 1
992
- },
993
- set: {
994
- minArgs: 1,
995
- maxArgs: 1
996
- }
997
- };
998
- apiMetadata.privacy = {
999
- network: {
1000
- "*": settingMetadata
1001
- },
1002
- services: {
1003
- "*": settingMetadata
1004
- },
1005
- websites: {
1006
- "*": settingMetadata
1007
- }
1008
- };
1009
- return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
1010
- };
1011
- module2.exports = wrapAPIs(chrome);
1012
- } else {
1013
- module2.exports = globalThis.browser;
1014
- }
1015
- });
1016
- }
1017
- });
1018
-
1019
- // src/content-script.ts
1020
- var import_webextension_polyfill = __toESM(require_browser_polyfill());
1021
-
1022
- // src/shared/shortcut.ts
1023
- var STORAGE_KEY_INSPECT = "hanzo_shortcut_inspect";
1024
- var DEFAULT_INSPECT_SHORTCUT = {
1025
- ctrl: true,
1026
- meta: false,
1027
- alt: false,
1028
- shift: false,
1029
- key: ""
1030
- };
1031
- function matchesShortcut(e, s) {
1032
- if (s.ctrl && !e.ctrlKey) return false;
1033
- if (s.meta && !e.metaKey) return false;
1034
- if (s.alt && !e.altKey) return false;
1035
- if (s.shift && !e.shiftKey) return false;
1036
- if (!s.ctrl && e.ctrlKey) return false;
1037
- if (!s.meta && e.metaKey) return false;
1038
- if (!s.alt && e.altKey) return false;
1039
- if (!s.shift && e.shiftKey) return false;
1040
- if (s.key && (e.key || "").toLowerCase() !== s.key.toLowerCase()) return false;
1041
- return true;
1042
- }
1043
- async function loadInspectShortcut(storage) {
1044
- try {
1045
- const raw = await storage.get([STORAGE_KEY_INSPECT]);
1046
- const v = raw[STORAGE_KEY_INSPECT];
1047
- if (v && typeof v === "object" && typeof v.ctrl === "boolean" && typeof v.alt === "boolean" && typeof v.shift === "boolean" && typeof v.meta === "boolean" && typeof v.key === "string") {
1048
- return v;
1049
- }
1050
- } catch {
1051
- }
1052
- return { ...DEFAULT_INSPECT_SHORTCUT };
1053
- }
1054
-
1055
- // src/content-script.ts
1056
- var HanzoContentScript = class {
1057
- constructor() {
1058
- // Cache the configured shortcut so every click/mousemove doesn't hit
1059
- // chrome.storage. Reloaded eagerly on storage change so the popup's
1060
- // recorder updates take effect immediately (no page reload required).
1061
- this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
1062
- this.loadShortcut();
1063
- this.watchShortcut();
1064
- this.setupClickHandler();
1065
- this.injectHelpers();
1066
- this.setupMessageHandlers();
1067
- }
1068
- async loadShortcut() {
1069
- try {
1070
- this.inspectShortcut = await loadInspectShortcut(chrome.storage.local);
1071
- } catch {
1072
- this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
1073
- }
1074
- }
1075
- watchShortcut() {
1076
- try {
1077
- chrome.storage.onChanged.addListener((changes, area) => {
1078
- if (area !== "local") return;
1079
- const c = changes[STORAGE_KEY_INSPECT];
1080
- if (!c) return;
1081
- if (c.newValue && typeof c.newValue === "object") {
1082
- this.inspectShortcut = c.newValue;
1083
- } else {
1084
- this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
1085
- }
1086
- });
1087
- } catch {
1088
- }
1089
- }
1090
- setupClickHandler() {
1091
- document.addEventListener("click", (e) => {
1092
- if (!matchesShortcut(e, this.inspectShortcut)) return;
1093
- e.preventDefault();
1094
- e.stopPropagation();
1095
- const element = e.target;
1096
- const source = this.extractSourceLocation(element);
1097
- const domPath = this.getDOMPath(element);
1098
- const event = {
1099
- event: "elementSelected",
1100
- framework: this.detectFramework(),
1101
- domPath,
1102
- source,
1103
- fallbackId: element.getAttribute("data-hanzo-id") || void 0
1104
- };
1105
- chrome.runtime.sendMessage({ action: "elementSelected", data: event });
1106
- });
1107
- }
1108
- setupMessageHandlers() {
1109
- chrome.runtime.onMessage.addListener((request, _sender, sendResponse) => {
1110
- var _a2;
1111
- switch (request.action) {
1112
- case "ai.control.start":
1113
- aiOverlay.show(request.task || "AI is controlling this page");
1114
- sendResponse({ success: true });
1115
- return true;
1116
- case "ai.control.stop":
1117
- aiOverlay.hide();
1118
- sendResponse({ success: true });
1119
- return true;
1120
- case "ai.control.cursor":
1121
- aiOverlay.moveCursor(request.x, request.y);
1122
- sendResponse({ success: true });
1123
- return true;
1124
- case "ai.control.highlight":
1125
- aiOverlay.highlight(request.selector);
1126
- sendResponse({ success: true });
1127
- return true;
1128
- case "ai.control.status":
1129
- aiOverlay.updateStatus(request.text);
1130
- sendResponse({ success: true });
1131
- return true;
1132
- case "page.overlay.toggle":
1133
- if (request.side === "left" || request.side === "right") pageOverlay.setSide(request.side);
1134
- if (request.mode === "push" || request.mode === "overlay") pageOverlay.setMode(request.mode);
1135
- if (request.width === "compact" || request.width === "default" || request.width === "wide") {
1136
- pageOverlay.setWidth(request.width);
1137
- }
1138
- sendResponse({
1139
- success: true,
1140
- open: pageOverlay.toggle()
1141
- });
1142
- return true;
1143
- case "page.overlay.show":
1144
- if (request.side === "left" || request.side === "right") pageOverlay.setSide(request.side);
1145
- if (request.mode === "push" || request.mode === "overlay") pageOverlay.setMode(request.mode);
1146
- if (request.width === "compact" || request.width === "default" || request.width === "wide") {
1147
- pageOverlay.setWidth(request.width);
1148
- }
1149
- pageOverlay.show();
1150
- sendResponse({ success: true, open: true });
1151
- return true;
1152
- case "page.overlay.hide":
1153
- pageOverlay.hide();
1154
- sendResponse({ success: true, open: false });
1155
- return true;
1156
- case "page.overlay.status":
1157
- sendResponse({
1158
- success: true,
1159
- open: pageOverlay.isOpen(),
1160
- side: pageOverlay.getSide(),
1161
- mode: pageOverlay.getMode()
1162
- });
1163
- return true;
1164
- case "page.overlay.setSide":
1165
- if (request.side === "left" || request.side === "right") {
1166
- pageOverlay.setSide(request.side);
1167
- sendResponse({ success: true, side: request.side });
1168
- } else {
1169
- sendResponse({ success: false, error: 'side must be "left" or "right"' });
1170
- }
1171
- return true;
1172
- case "page.overlay.setMode":
1173
- if (request.mode === "push" || request.mode === "overlay") {
1174
- pageOverlay.setMode(request.mode);
1175
- sendResponse({ success: true, mode: request.mode });
1176
- } else {
1177
- sendResponse({ success: false, error: 'mode must be "push" or "overlay"' });
1178
- }
1179
- return true;
1180
- case "page.overlay.setWidth":
1181
- if (request.width === "compact" || request.width === "default" || request.width === "wide") {
1182
- pageOverlay.setWidth(request.width);
1183
- sendResponse({ success: true, width: request.width });
1184
- } else {
1185
- sendResponse({ success: false, error: "width must be compact|default|wide" });
1186
- }
1187
- return true;
1188
- case "page.overlay.setEnabled":
1189
- if (typeof request.enabled === "boolean") {
1190
- pageOverlay.setEnabled(request.enabled);
1191
- sendResponse({ success: true, enabled: request.enabled });
1192
- } else {
1193
- sendResponse({ success: false, error: "enabled must be boolean" });
1194
- }
1195
- return true;
1196
- // --- Popup Tool Actions ---
1197
- case "tool.picker.start":
1198
- elementPicker.start();
1199
- sendResponse({ success: true });
1200
- return true;
1201
- case "tool.picker.stop":
1202
- elementPicker.stop();
1203
- sendResponse({ success: true });
1204
- return true;
1205
- case "tool.pageinfo":
1206
- sendResponse({ success: true, info: gatherPageInfo() });
1207
- return true;
1208
- case "tool.console.start":
1209
- inlineConsole.show();
1210
- sendResponse({ success: true });
1211
- return true;
1212
- case "tool.console.hide":
1213
- inlineConsole.hide();
1214
- sendResponse({ success: true });
1215
- return true;
1216
- }
1217
- if (request.action === "getContent") {
1218
- sendResponse({ content: ((_a2 = document.documentElement) == null ? void 0 : _a2.outerHTML) || "" });
1219
- return true;
1220
- }
1221
- if (request.action === "setContent") {
1222
- if (typeof request.content === "string") {
1223
- document.open();
1224
- document.write(request.content);
1225
- document.close();
1226
- }
1227
- sendResponse({ success: true });
1228
- return true;
1229
- }
1230
- return false;
1231
- });
1232
- }
1233
- extractSourceLocation(element) {
1234
- const framework = this.detectFramework();
1235
- switch (framework) {
1236
- case "react":
1237
- return this.extractReactSource(element);
1238
- case "vue":
1239
- return this.extractVueSource(element);
1240
- case "svelte":
1241
- return this.extractSvelteSource(element);
1242
- default:
1243
- return void 0;
1244
- }
1245
- }
1246
- extractReactSource(element) {
1247
- var _a2, _b2;
1248
- const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;
1249
- if (!hook) return void 0;
1250
- const fiber = this.findReactFiber(element);
1251
- if (!fiber) return void 0;
1252
- const source = fiber._debugSource || ((_a2 = fiber.pendingProps) == null ? void 0 : _a2.__source) || ((_b2 = fiber.memoizedProps) == null ? void 0 : _b2.__source);
1253
- if (source && source.fileName) {
1254
- return {
1255
- file: source.fileName,
1256
- line: source.lineNumber,
1257
- column: source.columnNumber
1258
- };
1259
- }
1260
- return void 0;
1261
- }
1262
- findReactFiber(element) {
1263
- const key = Object.keys(element).find(
1264
- (candidate) => candidate.startsWith("__reactInternalInstance$") || candidate.startsWith("__reactFiber$")
1265
- );
1266
- return key ? element[key] : null;
1267
- }
1268
- extractVueSource(element) {
1269
- var _a2, _b2;
1270
- const hook = window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
1271
- if (!hook) return void 0;
1272
- let instance = element.__vueParentComponent;
1273
- if (!instance) {
1274
- instance = element.__vue__;
1275
- }
1276
- if ((_a2 = instance == null ? void 0 : instance.type) == null ? void 0 : _a2.__file) {
1277
- const location2 = {
1278
- file: instance.type.__file,
1279
- line: 1
1280
- };
1281
- if ((_b2 = instance.vnode) == null ? void 0 : _b2.loc) {
1282
- location2.line = instance.vnode.loc.start.line;
1283
- location2.column = instance.vnode.loc.start.column;
1284
- }
1285
- return location2;
1286
- }
1287
- return void 0;
1288
- }
1289
- extractSvelteSource(element) {
1290
- var _a2, _b2;
1291
- const component = element.__svelte_component;
1292
- if ((_b2 = (_a2 = component == null ? void 0 : component.$$) == null ? void 0 : _a2.ctx) == null ? void 0 : _b2.$$_location) {
1293
- return component.$$.ctx.$$_location;
1294
- }
1295
- return void 0;
1296
- }
1297
- detectFramework() {
1298
- if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) return "react";
1299
- if (window.__VUE_DEVTOOLS_GLOBAL_HOOK__) return "vue";
1300
- if (window.__svelte) return "svelte";
1301
- return null;
1302
- }
1303
- getDOMPath(element) {
1304
- const path = [];
1305
- let current = element;
1306
- while (current && current !== document.body) {
1307
- let selector = current.tagName.toLowerCase();
1308
- if (current.id) {
1309
- selector += `#${current.id}`;
1310
- } else if (current.className) {
1311
- selector += `.${current.className.split(" ").join(".")}`;
1312
- }
1313
- path.unshift(selector);
1314
- current = current.parentElement;
1315
- }
1316
- return path.join(" > ");
1317
- }
1318
- injectHelpers() {
1319
- const style = document.createElement("style");
1320
- style.textContent = `
1321
- [data-hanzo-hover] {
1322
- outline: 2px dashed #ff6b6b !important;
1323
- outline-offset: 2px !important;
1324
- }
1325
- `;
1326
- document.head.appendChild(style);
1327
- document.addEventListener("mousemove", (e) => {
1328
- document.querySelectorAll("[data-hanzo-hover]").forEach((el) => {
1329
- el.removeAttribute("data-hanzo-hover");
1330
- });
1331
- if (matchesShortcut(e, this.inspectShortcut) && e.target instanceof HTMLElement) {
1332
- e.target.setAttribute("data-hanzo-hover", "true");
1333
- }
1334
- });
1335
- }
1336
- };
1337
- var aiOverlay = /* @__PURE__ */ (() => {
1338
- let overlay = null;
1339
- let cursor = null;
1340
- let statusEl = null;
1341
- let cancelBtn = null;
1342
- let highlightEl = null;
1343
- let trailNodes = [];
1344
- let interactionBlockActive = false;
1345
- const OVERLAY_ID = "hanzo-ai-overlay";
1346
- const STYLES_ID = "hanzo-ai-overlay-styles";
1347
- const BLOCKED_EVENTS = [
1348
- "click",
1349
- "dblclick",
1350
- "mousedown",
1351
- "mouseup",
1352
- "contextmenu",
1353
- "pointerdown",
1354
- "pointerup",
1355
- "touchstart",
1356
- "touchmove",
1357
- "touchend",
1358
- "wheel",
1359
- "keydown",
1360
- "keyup",
1361
- "keypress"
1362
- ];
1363
- function injectStyles() {
1364
- if (document.getElementById(STYLES_ID)) return;
1365
- const style = document.createElement("style");
1366
- style.id = STYLES_ID;
1367
- style.textContent = `
1368
- /* ---- Overlay backdrop ---- */
1369
- #${OVERLAY_ID} {
1370
- position: fixed;
1371
- inset: 0;
1372
- z-index: 2147483646;
1373
- pointer-events: all;
1374
- background:
1375
- radial-gradient(90vw 90vh at 15% 8%, rgba(56, 189, 248, 0.10), transparent 55%),
1376
- radial-gradient(65vw 65vh at 84% 82%, rgba(99, 102, 241, 0.10), transparent 60%),
1377
- rgba(2, 4, 10, 0.42);
1378
- backdrop-filter: blur(1.5px);
1379
- opacity: 0;
1380
- transition: opacity 300ms ease;
1381
- }
1382
- #${OVERLAY_ID}.hanzo-visible {
1383
- opacity: 1;
1384
- }
1385
-
1386
- /* ---- Pulsing cyan glow cursor ---- */
1387
- .hanzo-ai-cursor {
1388
- position: fixed;
1389
- width: 24px;
1390
- height: 24px;
1391
- z-index: 2147483647;
1392
- pointer-events: none;
1393
- border-radius: 50%;
1394
- border: 2px solid rgba(6, 182, 212, 0.95);
1395
- box-shadow:
1396
- 0 0 8px 2px rgba(6, 182, 212, 0.45),
1397
- 0 0 24px 6px rgba(6, 182, 212, 0.18);
1398
- transform: translate(-50%, -50%);
1399
- transition: left 0.18s ease-out, top 0.18s ease-out;
1400
- animation: hanzo-cursor-pulse 1.6s ease-in-out infinite;
1401
- opacity: 0;
1402
- }
1403
- .hanzo-ai-cursor.hanzo-visible {
1404
- opacity: 1;
1405
- transition: left 0.18s ease-out, top 0.18s ease-out, opacity 300ms ease;
1406
- }
1407
- @keyframes hanzo-cursor-pulse {
1408
- 0%, 100% {
1409
- box-shadow:
1410
- 0 0 8px 2px rgba(6, 182, 212, 0.45),
1411
- 0 0 24px 6px rgba(6, 182, 212, 0.18);
1412
- }
1413
- 50% {
1414
- box-shadow:
1415
- 0 0 14px 4px rgba(6, 182, 212, 0.65),
1416
- 0 0 36px 10px rgba(6, 182, 212, 0.28);
1417
- }
1418
- }
1419
-
1420
- /* ---- Cursor trail ---- */
1421
- .hanzo-cursor-trail {
1422
- position: fixed;
1423
- width: 6px;
1424
- height: 6px;
1425
- border-radius: 50%;
1426
- background: rgba(6, 182, 212, 0.7);
1427
- z-index: 2147483646;
1428
- pointer-events: none;
1429
- transform: translate(-50%, -50%);
1430
- animation: hanzo-trail-fade 0.4s ease-out forwards;
1431
- }
1432
- @keyframes hanzo-trail-fade {
1433
- from { opacity: 0.7; transform: translate(-50%, -50%) scale(1); }
1434
- to { opacity: 0; transform: translate(-50%, -50%) scale(0.15); }
1435
- }
1436
-
1437
- /* ---- Status banner (top center pill) ---- */
1438
- .hanzo-ai-status {
1439
- position: fixed;
1440
- top: 16px;
1441
- left: 50%;
1442
- transform: translateX(-50%);
1443
- z-index: 2147483647;
1444
- display: flex;
1445
- align-items: center;
1446
- gap: 10px;
1447
- max-width: 90vw;
1448
- padding: 10px 14px;
1449
- border-radius: 16px;
1450
- background: linear-gradient(135deg, rgba(8, 12, 20, 0.94), rgba(10, 16, 24, 0.96));
1451
- border: 1px solid rgba(56, 189, 248, 0.26);
1452
- color: #f3f4f6;
1453
- font: 13px/1.4 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
1454
- box-shadow:
1455
- 0 10px 36px rgba(0, 0, 0, 0.46),
1456
- inset 0 1px 0 rgba(255, 255, 255, 0.08);
1457
- opacity: 0;
1458
- transition: opacity 300ms ease;
1459
- overflow: hidden;
1460
- }
1461
- .hanzo-ai-status::before {
1462
- content: '';
1463
- position: absolute;
1464
- inset: -2px auto -2px -20%;
1465
- width: 40%;
1466
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.16), transparent);
1467
- transform: skewX(-18deg);
1468
- animation: hanzo-status-sheen 3.6s ease-in-out infinite;
1469
- pointer-events: none;
1470
- }
1471
- @keyframes hanzo-status-sheen {
1472
- 0%, 68% { left: -30%; opacity: 0; }
1473
- 72% { opacity: 0.4; }
1474
- 100% { left: 130%; opacity: 0; }
1475
- }
1476
- .hanzo-ai-status > * {
1477
- position: relative;
1478
- }
1479
- .hanzo-ai-status.hanzo-visible {
1480
- opacity: 1;
1481
- }
1482
-
1483
- .hanzo-ai-status .hanzo-brand-bubble {
1484
- display: inline-flex;
1485
- align-items: center;
1486
- justify-content: center;
1487
- height: 20px;
1488
- min-width: 30px;
1489
- padding: 0 8px;
1490
- border-radius: 9999px;
1491
- font-size: 10px;
1492
- letter-spacing: 0.25px;
1493
- font-weight: 700;
1494
- text-transform: uppercase;
1495
- color: #e0f2fe;
1496
- background: linear-gradient(180deg, rgba(14, 116, 144, 0.95), rgba(15, 23, 42, 0.95));
1497
- border: 1px solid rgba(56, 189, 248, 0.35);
1498
- }
1499
-
1500
- .hanzo-ai-status .hanzo-pulse-dot {
1501
- width: 8px;
1502
- height: 8px;
1503
- border-radius: 9999px;
1504
- background: #06b6d4;
1505
- animation: hanzo-dot-pulse 1.4s ease-in-out infinite;
1506
- }
1507
- @keyframes hanzo-dot-pulse {
1508
- 0%, 100% { opacity: 1; }
1509
- 50% { opacity: 0.4; }
1510
- }
1511
-
1512
- .hanzo-ai-status .hanzo-label {
1513
- max-width: 46vw;
1514
- overflow: hidden;
1515
- text-overflow: ellipsis;
1516
- white-space: nowrap;
1517
- }
1518
-
1519
- .hanzo-ai-status .hanzo-dots::after {
1520
- content: '';
1521
- animation: hanzo-animated-dots 1.5s steps(4) infinite;
1522
- }
1523
- @keyframes hanzo-animated-dots {
1524
- 0% { content: ''; }
1525
- 25% { content: '.'; }
1526
- 50% { content: '..'; }
1527
- 75% { content: '...'; }
1528
- }
1529
-
1530
- .hanzo-ai-status .hanzo-stop-btn {
1531
- border: 1px solid rgba(255, 255, 255, 0.24);
1532
- background: rgba(0, 0, 0, 0.18);
1533
- color: #f8fafc;
1534
- border-radius: 10px;
1535
- padding: 4px 12px;
1536
- font-size: 12px;
1537
- cursor: pointer;
1538
- transition: background 0.15s, border-color 0.15s;
1539
- }
1540
- .hanzo-ai-status .hanzo-stop-btn:hover {
1541
- background: rgba(220, 38, 38, 0.28);
1542
- border-color: rgba(248, 113, 113, 0.6);
1543
- }
1544
-
1545
- /* ---- "Take Back Control" button (bottom-right) ---- */
1546
- .hanzo-ai-cancel {
1547
- position: fixed;
1548
- bottom: 24px;
1549
- right: 24px;
1550
- z-index: 2147483647;
1551
- padding: 12px 24px;
1552
- border-radius: 10px;
1553
- border: 1px solid rgba(255, 255, 255, 0.2);
1554
- background: rgba(15, 18, 24, 0.95);
1555
- color: #f3f4f6;
1556
- font: 600 14px/1.4 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
1557
- cursor: pointer;
1558
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
1559
- pointer-events: auto;
1560
- opacity: 0;
1561
- transition: opacity 300ms ease, background 0.15s;
1562
- }
1563
- .hanzo-ai-cancel.hanzo-visible {
1564
- opacity: 1;
1565
- }
1566
- .hanzo-ai-cancel:hover {
1567
- background: rgba(220, 38, 38, 0.35);
1568
- border-color: rgba(220, 38, 38, 0.5);
1569
- }
1570
-
1571
- /* ---- Element highlight ---- */
1572
- .hanzo-ai-highlight {
1573
- position: fixed;
1574
- z-index: 2147483647;
1575
- pointer-events: none;
1576
- border: 2px solid rgba(6, 182, 212, 0.85);
1577
- border-radius: 6px;
1578
- box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.15);
1579
- transition: left 0.15s, top 0.15s, width 0.15s, height 0.15s;
1580
- }
1581
- `;
1582
- document.head.appendChild(style);
1583
- }
1584
- function isOverlayElement(target) {
1585
- if (!(target instanceof Node)) return false;
1586
- return !!((overlay == null ? void 0 : overlay.contains(target)) || (statusEl == null ? void 0 : statusEl.contains(target)) || (cancelBtn == null ? void 0 : cancelBtn.contains(target)) || (cursor == null ? void 0 : cursor.contains(target)) || (highlightEl == null ? void 0 : highlightEl.contains(target)));
1587
- }
1588
- function blockInteraction(event) {
1589
- if (!interactionBlockActive) return;
1590
- if (event instanceof KeyboardEvent && event.key === "Escape") {
1591
- chrome.runtime.sendMessage({ action: "ai.control.cancel" });
1592
- hide();
1593
- return;
1594
- }
1595
- if (isOverlayElement(event.target)) return;
1596
- event.preventDefault();
1597
- event.stopPropagation();
1598
- event.stopImmediatePropagation();
1599
- }
1600
- function setInteractionBlock(active) {
1601
- if (interactionBlockActive === active) return;
1602
- interactionBlockActive = active;
1603
- for (const eventName of BLOCKED_EVENTS) {
1604
- if (active) {
1605
- document.addEventListener(eventName, blockInteraction, true);
1606
- } else {
1607
- document.removeEventListener(eventName, blockInteraction, true);
1608
- }
1609
- }
1610
- }
1611
- function show(task) {
1612
- var _a2;
1613
- if (overlay) hide();
1614
- injectStyles();
1615
- setInteractionBlock(true);
1616
- overlay = document.createElement("div");
1617
- overlay.id = OVERLAY_ID;
1618
- document.body.appendChild(overlay);
1619
- cursor = document.createElement("div");
1620
- cursor.className = "hanzo-ai-cursor";
1621
- cursor.style.left = `${window.innerWidth / 2}px`;
1622
- cursor.style.top = `${window.innerHeight / 2}px`;
1623
- document.body.appendChild(cursor);
1624
- statusEl = document.createElement("div");
1625
- statusEl.className = "hanzo-ai-status";
1626
- statusEl.innerHTML = `
1627
- <span class="hanzo-brand-bubble">AI</span>
1628
- <div class="hanzo-pulse-dot"></div>
1629
- <span class="hanzo-label">${escapeHtml(task || "Hanzo AI is controlling this tab")}</span><span class="hanzo-dots"></span>
1630
- <button class="hanzo-stop-btn">Stop</button>
1631
- `;
1632
- document.body.appendChild(statusEl);
1633
- (_a2 = statusEl.querySelector(".hanzo-stop-btn")) == null ? void 0 : _a2.addEventListener("click", () => {
1634
- chrome.runtime.sendMessage({ action: "ai.control.cancel" });
1635
- hide();
1636
- });
1637
- cancelBtn = document.createElement("button");
1638
- cancelBtn.className = "hanzo-ai-cancel";
1639
- cancelBtn.textContent = "Take Back Control";
1640
- cancelBtn.addEventListener("click", () => {
1641
- chrome.runtime.sendMessage({ action: "ai.control.cancel" });
1642
- hide();
1643
- });
1644
- document.body.appendChild(cancelBtn);
1645
- requestAnimationFrame(() => {
1646
- overlay == null ? void 0 : overlay.classList.add("hanzo-visible");
1647
- cursor == null ? void 0 : cursor.classList.add("hanzo-visible");
1648
- statusEl == null ? void 0 : statusEl.classList.add("hanzo-visible");
1649
- cancelBtn == null ? void 0 : cancelBtn.classList.add("hanzo-visible");
1650
- });
1651
- }
1652
- function hide() {
1653
- overlay == null ? void 0 : overlay.classList.remove("hanzo-visible");
1654
- cursor == null ? void 0 : cursor.classList.remove("hanzo-visible");
1655
- statusEl == null ? void 0 : statusEl.classList.remove("hanzo-visible");
1656
- cancelBtn == null ? void 0 : cancelBtn.classList.remove("hanzo-visible");
1657
- const refs = { overlay, cursor, statusEl, cancelBtn, highlightEl };
1658
- const trails = [...trailNodes];
1659
- setTimeout(() => {
1660
- var _a2, _b2, _c2, _d2, _e2;
1661
- (_a2 = refs.overlay) == null ? void 0 : _a2.remove();
1662
- (_b2 = refs.cursor) == null ? void 0 : _b2.remove();
1663
- (_c2 = refs.statusEl) == null ? void 0 : _c2.remove();
1664
- (_d2 = refs.cancelBtn) == null ? void 0 : _d2.remove();
1665
- (_e2 = refs.highlightEl) == null ? void 0 : _e2.remove();
1666
- for (const node of trails) {
1667
- node.remove();
1668
- }
1669
- }, 320);
1670
- setInteractionBlock(false);
1671
- overlay = null;
1672
- cursor = null;
1673
- statusEl = null;
1674
- cancelBtn = null;
1675
- highlightEl = null;
1676
- trailNodes = [];
1677
- }
1678
- function moveCursor(x, y) {
1679
- var _a2;
1680
- if (!cursor) return;
1681
- const clampedX = Math.max(0, Math.min(window.innerWidth, Number.isFinite(x) ? x : 0));
1682
- const clampedY = Math.max(0, Math.min(window.innerHeight, Number.isFinite(y) ? y : 0));
1683
- const trail = document.createElement("div");
1684
- trail.className = "hanzo-cursor-trail";
1685
- trail.style.left = `${clampedX}px`;
1686
- trail.style.top = `${clampedY}px`;
1687
- document.body.appendChild(trail);
1688
- trailNodes.push(trail);
1689
- setTimeout(() => {
1690
- trail.remove();
1691
- trailNodes = trailNodes.filter((node) => node !== trail);
1692
- }, 400);
1693
- while (trailNodes.length > 10) {
1694
- (_a2 = trailNodes.shift()) == null ? void 0 : _a2.remove();
1695
- }
1696
- cursor.style.left = `${clampedX}px`;
1697
- cursor.style.top = `${clampedY}px`;
1698
- }
1699
- function highlight(selector) {
1700
- highlightEl == null ? void 0 : highlightEl.remove();
1701
- highlightEl = null;
1702
- if (!selector || typeof selector !== "string") return;
1703
- try {
1704
- const target = document.querySelector(selector);
1705
- if (!target) return;
1706
- const rect = target.getBoundingClientRect();
1707
- if (rect.width === 0 && rect.height === 0) return;
1708
- highlightEl = document.createElement("div");
1709
- highlightEl.className = "hanzo-ai-highlight";
1710
- highlightEl.style.left = `${Math.max(0, rect.left - 4)}px`;
1711
- highlightEl.style.top = `${Math.max(0, rect.top - 4)}px`;
1712
- highlightEl.style.width = `${rect.width + 8}px`;
1713
- highlightEl.style.height = `${rect.height + 8}px`;
1714
- document.body.appendChild(highlightEl);
1715
- } catch {
1716
- }
1717
- }
1718
- function updateStatus(text) {
1719
- if (!statusEl) return;
1720
- const label = statusEl.querySelector(".hanzo-label");
1721
- if (label) {
1722
- label.textContent = text || "Hanzo AI is controlling this tab";
1723
- }
1724
- }
1725
- function escapeHtml(text) {
1726
- const div = document.createElement("div");
1727
- div.textContent = text;
1728
- return div.innerHTML;
1729
- }
1730
- return { show, hide, moveCursor, highlight, updateStatus };
1731
- })();
1732
- var OVERLAY_WIDTH_PX = {
1733
- compact: 320,
1734
- default: 420,
1735
- wide: 560
1736
- };
1737
- var HanzoPageOverlay = class {
1738
- constructor() {
1739
- this.mounted = false;
1740
- this.enabled = false;
1741
- this.open = false;
1742
- this.side = "right";
1743
- this.mode = "overlay";
1744
- this.width = "default";
1745
- this.sending = false;
1746
- this.watchMode = false;
1747
- this.editMode = false;
1748
- this.modelsLoaded = false;
1749
- this.messages = [];
1750
- this.selectedContext = null;
1751
- this.hoveredElement = null;
1752
- this.editingElement = null;
1753
- this.root = null;
1754
- this.launcher = null;
1755
- this.panel = null;
1756
- this.messagesEl = null;
1757
- this.inputEl = null;
1758
- this.sendBtn = null;
1759
- this.modelEl = null;
1760
- this.contextEl = null;
1761
- this.watchBtn = null;
1762
- this.editBtn = null;
1763
- this.statusEl = null;
1764
- this.highlightBox = null;
1765
- this.injectStyles();
1766
- this.mount();
1767
- this.bindGlobalEvents();
1768
- this.restorePrefs();
1769
- }
1770
- restorePrefs() {
1771
- var _a2, _b2;
1772
- try {
1773
- const ss = (_b2 = (_a2 = typeof browser !== "undefined" ? browser : chrome) == null ? void 0 : _a2.storage) == null ? void 0 : _b2.sync;
1774
- if (!(ss == null ? void 0 : ss.get)) return;
1775
- const promised = ss.get(["overlaySide", "overlayMode", "overlayWidth"]);
1776
- const apply = (v) => {
1777
- var _a3, _b3;
1778
- if ((v == null ? void 0 : v.overlaySide) === "left" || (v == null ? void 0 : v.overlaySide) === "right") {
1779
- this.side = v.overlaySide;
1780
- (_a3 = this.root) == null ? void 0 : _a3.setAttribute("data-side", this.side);
1781
- }
1782
- if ((v == null ? void 0 : v.overlayMode) === "push" || (v == null ? void 0 : v.overlayMode) === "overlay") {
1783
- this.mode = v.overlayMode;
1784
- (_b3 = this.root) == null ? void 0 : _b3.setAttribute("data-mode", this.mode);
1785
- }
1786
- if ((v == null ? void 0 : v.overlayWidth) === "compact" || (v == null ? void 0 : v.overlayWidth) === "default" || (v == null ? void 0 : v.overlayWidth) === "wide") {
1787
- this.width = v.overlayWidth;
1788
- this.applyWidth();
1789
- }
1790
- this.applyPushIfOpen();
1791
- };
1792
- if (promised && typeof promised.then === "function") {
1793
- promised.then(apply).catch(() => {
1794
- });
1795
- } else {
1796
- ss.get(["overlaySide", "overlayMode", "overlayWidth"], apply);
1797
- }
1798
- } catch {
1799
- }
1800
- }
1801
- applyWidth() {
1802
- const px = OVERLAY_WIDTH_PX[this.width] ?? OVERLAY_WIDTH_PX.default;
1803
- if (this.root) {
1804
- this.root.style.setProperty("--hanzo-overlay-width", `${px}px`);
1805
- this.root.style.width = `min(${px}px, 100vw)`;
1806
- }
1807
- document.documentElement.style.setProperty("--hanzo-overlay-width", `${px}px`);
1808
- }
1809
- applyPushIfOpen() {
1810
- const html = document.documentElement;
1811
- html.classList.remove("hanzo-overlay-push", "hanzo-overlay-push-left", "hanzo-overlay-push-right");
1812
- if (this.open && this.enabled && this.mode === "push") {
1813
- html.classList.add("hanzo-overlay-push", `hanzo-overlay-push-${this.side}`);
1814
- }
1815
- }
1816
- toggle() {
1817
- if (!this.enabled || !this.open) {
1818
- this.show();
1819
- return true;
1820
- }
1821
- this.hide();
1822
- return false;
1823
- }
1824
- isOpen() {
1825
- return this.open;
1826
- }
1827
- getSide() {
1828
- return this.side;
1829
- }
1830
- getMode() {
1831
- return this.mode;
1832
- }
1833
- setSide(side) {
1834
- var _a2;
1835
- this.side = side;
1836
- (_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-side", side);
1837
- this.applyPushIfOpen();
1838
- this.persist({ overlaySide: side });
1839
- }
1840
- setMode(mode) {
1841
- var _a2;
1842
- this.mode = mode;
1843
- (_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-mode", mode);
1844
- this.applyPushIfOpen();
1845
- this.persist({ overlayMode: mode });
1846
- }
1847
- setWidth(width) {
1848
- this.width = width;
1849
- this.applyWidth();
1850
- this.persist({ overlayWidth: width });
1851
- }
1852
- setEnabled(enabled) {
1853
- var _a2;
1854
- this.enabled = enabled;
1855
- (_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-enabled", enabled ? "true" : "false");
1856
- if (!enabled) this.hide();
1857
- this.persist({ overlayEnabled: enabled });
1858
- }
1859
- persist(values) {
1860
- var _a2, _b2, _c2;
1861
- try {
1862
- const ss = (_b2 = (_a2 = typeof browser !== "undefined" ? browser : chrome) == null ? void 0 : _a2.storage) == null ? void 0 : _b2.sync;
1863
- (_c2 = ss == null ? void 0 : ss.set) == null ? void 0 : _c2.call(ss, values);
1864
- } catch {
1865
- }
1866
- }
1867
- show() {
1868
- var _a2, _b2;
1869
- this.ensureMounted();
1870
- this.enabled = true;
1871
- this.open = true;
1872
- (_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-enabled", "true");
1873
- (_b2 = this.root) == null ? void 0 : _b2.setAttribute("data-open", "true");
1874
- this.applyPushIfOpen();
1875
- this.loadModels();
1876
- this.focusInput();
1877
- }
1878
- hide() {
1879
- var _a2;
1880
- this.open = false;
1881
- (_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-open", "false");
1882
- this.applyPushIfOpen();
1883
- this.updateStatus("");
1884
- this.clearHighlight();
1885
- this.setWatchMode(false);
1886
- this.setEditMode(false);
1887
- }
1888
- ensureMounted() {
1889
- if (this.mounted) return;
1890
- this.mount();
1891
- }
1892
- injectStyles() {
1893
- if (document.getElementById("hanzo-page-overlay-styles")) return;
1894
- const style = document.createElement("style");
1895
- style.id = "hanzo-page-overlay-styles";
1896
- style.textContent = `
1897
- /* Edge-pinned sidebar panel \u2014 no FAB, opened from extension popup.
1898
- Hanzo brand: monochrome (white primary, neutral surfaces). No blue. */
1899
- #hanzo-page-overlay-root {
1900
- position: fixed;
1901
- top: 0;
1902
- bottom: 0;
1903
- right: 0;
1904
- width: min(var(--hanzo-overlay-width, 420px), 100vw);
1905
- z-index: 2147483645;
1906
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
1907
- pointer-events: none;
1908
- }
1909
-
1910
- #hanzo-page-overlay-root[data-side="left"] {
1911
- right: auto;
1912
- left: 0;
1913
- }
1914
-
1915
- #hanzo-page-overlay-root * {
1916
- box-sizing: border-box;
1917
- }
1918
-
1919
- /* Push mode: when the user pins the panel as a dock, html shifts so
1920
- page content reflows beside it instead of being covered. Applied to
1921
- <html> from setMode('push') + open. */
1922
- html.hanzo-overlay-push.hanzo-overlay-push-right {
1923
- margin-right: var(--hanzo-overlay-width, 420px) !important;
1924
- transition: margin-right 0.18s ease;
1925
- }
1926
- html.hanzo-overlay-push.hanzo-overlay-push-left {
1927
- margin-left: var(--hanzo-overlay-width, 420px) !important;
1928
- transition: margin-left 0.18s ease;
1929
- }
1930
-
1931
- .hanzo-page-panel {
1932
- width: 100%;
1933
- height: 100%;
1934
- border-left: 1px solid rgba(255, 255, 255, 0.16);
1935
- background: linear-gradient(180deg, rgba(10, 10, 11, 0.97), rgba(7, 7, 8, 0.97));
1936
- color: #f5f5f5;
1937
- overflow: hidden;
1938
- box-shadow: -22px 0 48px rgba(0, 0, 0, 0.45);
1939
- transform: translateX(100%);
1940
- opacity: 0;
1941
- pointer-events: none;
1942
- display: flex;
1943
- flex-direction: column;
1944
- min-height: 0;
1945
- transition: transform 0.18s ease, opacity 0.18s ease;
1946
- }
1947
-
1948
- #hanzo-page-overlay-root[data-side="left"] .hanzo-page-panel {
1949
- border-left: none;
1950
- border-right: 1px solid rgba(255, 255, 255, 0.16);
1951
- box-shadow: 22px 0 48px rgba(0, 0, 0, 0.45);
1952
- transform: translateX(-100%);
1953
- }
1954
-
1955
- #hanzo-page-overlay-root[data-open="true"] .hanzo-page-panel {
1956
- transform: translateX(0);
1957
- opacity: 1;
1958
- pointer-events: auto;
1959
- }
1960
-
1961
- .hanzo-page-header {
1962
- display: flex;
1963
- align-items: center;
1964
- justify-content: space-between;
1965
- padding: 12px 14px;
1966
- border-bottom: 1px solid rgba(255, 255, 255, 0.10);
1967
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent);
1968
- flex-shrink: 0;
1969
- }
1970
-
1971
- .hanzo-page-brand {
1972
- font-weight: 700;
1973
- letter-spacing: 0.2px;
1974
- font-size: 13px;
1975
- color: #f5f5f5;
1976
- }
1977
-
1978
- .hanzo-page-header-actions {
1979
- display: inline-flex;
1980
- align-items: center;
1981
- gap: 6px;
1982
- }
1983
-
1984
- .hanzo-chip-btn {
1985
- border: 1px solid rgba(255, 255, 255, 0.2);
1986
- border-radius: 9999px;
1987
- padding: 4px 10px;
1988
- background: transparent;
1989
- color: rgba(245, 245, 245, 0.85);
1990
- cursor: pointer;
1991
- font-size: 11px;
1992
- transition: background 0.15s, color 0.15s, border-color 0.15s;
1993
- }
1994
-
1995
- .hanzo-chip-btn:hover {
1996
- background: rgba(255, 255, 255, 0.06);
1997
- color: #fff;
1998
- }
1999
-
2000
- .hanzo-chip-btn[data-active="true"] {
2001
- border-color: rgba(255, 255, 255, 0.7);
2002
- background: rgba(255, 255, 255, 0.10);
2003
- color: #fff;
2004
- }
2005
-
2006
- .hanzo-icon-btn {
2007
- width: 28px;
2008
- height: 28px;
2009
- border-radius: 8px;
2010
- border: 1px solid rgba(255, 255, 255, 0.18);
2011
- background: transparent;
2012
- color: #f5f5f5;
2013
- cursor: pointer;
2014
- font-size: 14px;
2015
- display: inline-flex;
2016
- align-items: center;
2017
- justify-content: center;
2018
- padding: 0;
2019
- transition: background 0.15s, border-color 0.15s;
2020
- }
2021
-
2022
- .hanzo-icon-btn:hover {
2023
- background: rgba(255, 255, 255, 0.06);
2024
- }
2025
-
2026
- .hanzo-icon-btn[data-active="true"] {
2027
- background: rgba(255, 255, 255, 0.12);
2028
- border-color: rgba(255, 255, 255, 0.5);
2029
- }
2030
-
2031
- .hanzo-icon-btn svg {
2032
- width: 14px;
2033
- height: 14px;
2034
- }
2035
-
2036
- .hanzo-page-meta {
2037
- padding: 10px 14px 6px 14px;
2038
- display: grid;
2039
- grid-template-columns: 1fr auto;
2040
- gap: 8px;
2041
- align-items: center;
2042
- flex-shrink: 0;
2043
- }
2044
-
2045
- .hanzo-page-context {
2046
- font-size: 11px;
2047
- color: rgba(245, 245, 245, 0.65);
2048
- overflow: hidden;
2049
- text-overflow: ellipsis;
2050
- white-space: nowrap;
2051
- }
2052
-
2053
- .hanzo-page-status {
2054
- font-size: 11px;
2055
- color: rgba(245, 245, 245, 0.55);
2056
- }
2057
-
2058
- .hanzo-model-row {
2059
- padding: 0 14px 8px 14px;
2060
- flex-shrink: 0;
2061
- }
2062
-
2063
- .hanzo-model-row select {
2064
- width: 100%;
2065
- border-radius: 8px;
2066
- border: 1px solid rgba(255, 255, 255, 0.16);
2067
- background: rgba(255, 255, 255, 0.03);
2068
- color: #f5f5f5;
2069
- padding: 7px 9px;
2070
- font-size: 12px;
2071
- }
2072
-
2073
- /* The chat scroller: takes ALL remaining vertical space so the
2074
- composer below stays sticky against the bottom of the panel. */
2075
- .hanzo-page-messages {
2076
- flex: 1 1 auto;
2077
- min-height: 0;
2078
- overflow-y: auto;
2079
- padding: 8px 14px 12px 14px;
2080
- display: flex;
2081
- flex-direction: column;
2082
- gap: 8px;
2083
- }
2084
-
2085
- .hanzo-page-msg {
2086
- padding: 9px 10px;
2087
- border-radius: 10px;
2088
- font-size: 12px;
2089
- line-height: 1.45;
2090
- word-break: break-word;
2091
- }
2092
-
2093
- .hanzo-page-msg.user {
2094
- align-self: flex-end;
2095
- max-width: 88%;
2096
- background: rgba(255, 255, 255, 0.10);
2097
- border: 1px solid rgba(255, 255, 255, 0.18);
2098
- }
2099
-
2100
- .hanzo-page-msg.assistant {
2101
- align-self: flex-start;
2102
- max-width: 92%;
2103
- background: rgba(255, 255, 255, 0.04);
2104
- border: 1px solid rgba(255, 255, 255, 0.10);
2105
- }
2106
-
2107
- /* Composer pinned to bottom of the panel. flex-shrink: 0 prevents
2108
- it from collapsing when the messages scroller grows. */
2109
- .hanzo-page-composer {
2110
- border-top: 1px solid rgba(255, 255, 255, 0.10);
2111
- padding: 10px 12px;
2112
- display: flex;
2113
- gap: 8px;
2114
- align-items: flex-end;
2115
- background: rgba(0, 0, 0, 0.35);
2116
- flex-shrink: 0;
2117
- }
2118
-
2119
- .hanzo-page-composer textarea {
2120
- flex: 1;
2121
- min-height: 38px;
2122
- max-height: 110px;
2123
- resize: none;
2124
- border-radius: 10px;
2125
- border: 1px solid rgba(255, 255, 255, 0.17);
2126
- background: rgba(255, 255, 255, 0.03);
2127
- color: #f5f5f5;
2128
- padding: 9px 11px;
2129
- font-size: 12px;
2130
- }
2131
-
2132
- /* Primary action: WHITE per @hanzo/brand monochrome guidelines. */
2133
- .hanzo-page-composer button {
2134
- min-width: 68px;
2135
- height: 38px;
2136
- border-radius: 10px;
2137
- border: 1px solid #ffffff;
2138
- background: #ffffff;
2139
- color: #0a0a0b;
2140
- font-weight: 600;
2141
- font-size: 12px;
2142
- cursor: pointer;
2143
- transition: background 0.12s, transform 0.08s;
2144
- }
2145
-
2146
- .hanzo-page-composer button:hover:not(:disabled) {
2147
- background: #f5f5f5;
2148
- }
2149
-
2150
- .hanzo-page-composer button:active:not(:disabled) {
2151
- transform: translateY(1px);
2152
- }
2153
-
2154
- .hanzo-page-composer button:disabled {
2155
- opacity: 0.55;
2156
- cursor: default;
2157
- }
2158
-
2159
- .hanzo-page-highlight {
2160
- position: fixed;
2161
- z-index: 2147483644;
2162
- pointer-events: none;
2163
- border: 2px solid rgba(255, 255, 255, 0.95);
2164
- border-radius: 6px;
2165
- box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
2166
- }
2167
-
2168
- [data-hanzo-inline-editing="true"] {
2169
- outline: 2px solid rgba(255, 255, 255, 0.92) !important;
2170
- outline-offset: 2px !important;
2171
- }
2172
- `;
2173
- document.head.appendChild(style);
2174
- }
2175
- mount() {
2176
- var _a2, _b2, _c2, _d2, _e2, _f2;
2177
- if (this.mounted) return;
2178
- this.root = document.createElement("div");
2179
- this.root.id = "hanzo-page-overlay-root";
2180
- this.root.setAttribute("data-open", "false");
2181
- this.root.setAttribute("data-enabled", "false");
2182
- this.root.setAttribute("data-side", this.side);
2183
- this.root.setAttribute("data-mode", this.mode);
2184
- this.applyWidth();
2185
- this.root.innerHTML = `
2186
- <div class="hanzo-page-panel" role="dialog" aria-label="Hanzo Page Assistant">
2187
- <div class="hanzo-page-header">
2188
- <div class="hanzo-page-brand">Hanzo</div>
2189
- <div class="hanzo-page-header-actions">
2190
- <button class="hanzo-chip-btn" data-role="watch" data-active="false" title="Watch elements on hover">Watch</button>
2191
- <button class="hanzo-chip-btn" data-role="edit" data-active="false" title="Click any element to edit text">Edit</button>
2192
- <button class="hanzo-icon-btn" data-role="pin-mode" title="Toggle: pin (push content) vs overlay (float over page)">
2193
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
2194
- <path d="M9 4v16M3 4h12a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H3z"/>
2195
- </svg>
2196
- </button>
2197
- <button class="hanzo-icon-btn" data-role="close" title="Hide overlay">\xD7</button>
2198
- </div>
2199
- </div>
2200
- <div class="hanzo-page-meta">
2201
- <div class="hanzo-page-context">Use Watch to inspect page elements.</div>
2202
- <span class="hanzo-page-status"></span>
2203
- </div>
2204
- <div class="hanzo-model-row">
2205
- <select data-role="model">
2206
- <option value="claude-sonnet-4-20250514">Claude Sonnet 4</option>
2207
- <option value="claude-opus-4-20250514">Claude Opus 4</option>
2208
- <option value="gpt-4o">GPT-4o</option>
2209
- <option value="zen-coder-flash">Zen Coder Flash</option>
2210
- <option value="zen-max">Zen Max</option>
2211
- </select>
2212
- </div>
2213
- <div class="hanzo-page-messages" data-role="messages">
2214
- <div class="hanzo-page-msg assistant">Ask about this page, inspect any element, or turn on Edit mode to change text in-place.</div>
2215
- </div>
2216
- <div class="hanzo-page-composer">
2217
- <textarea data-role="input" rows="1" placeholder="Ask about this page..."></textarea>
2218
- <button data-role="send" type="button">Ask</button>
2219
- </div>
2220
- </div>
2221
- `;
2222
- this.panel = this.root.querySelector(".hanzo-page-panel");
2223
- this.launcher = null;
2224
- this.messagesEl = this.root.querySelector('[data-role="messages"]');
2225
- this.inputEl = this.root.querySelector('[data-role="input"]');
2226
- this.sendBtn = this.root.querySelector('[data-role="send"]');
2227
- this.modelEl = this.root.querySelector('[data-role="model"]');
2228
- this.contextEl = this.root.querySelector(".hanzo-page-context");
2229
- this.watchBtn = this.root.querySelector('[data-role="watch"]');
2230
- this.editBtn = this.root.querySelector('[data-role="edit"]');
2231
- this.statusEl = this.root.querySelector(".hanzo-page-status");
2232
- (_a2 = this.root.querySelector('[data-role="close"]')) == null ? void 0 : _a2.addEventListener("click", () => this.hide());
2233
- const pinModeBtn = this.root.querySelector('[data-role="pin-mode"]');
2234
- pinModeBtn == null ? void 0 : pinModeBtn.setAttribute("data-active", this.mode === "push" ? "true" : "false");
2235
- pinModeBtn == null ? void 0 : pinModeBtn.addEventListener("click", () => {
2236
- const next = this.mode === "push" ? "overlay" : "push";
2237
- this.setMode(next);
2238
- pinModeBtn.setAttribute("data-active", next === "push" ? "true" : "false");
2239
- });
2240
- (_b2 = this.watchBtn) == null ? void 0 : _b2.addEventListener("click", () => this.setWatchMode(!this.watchMode));
2241
- (_c2 = this.editBtn) == null ? void 0 : _c2.addEventListener("click", () => this.setEditMode(!this.editMode));
2242
- (_d2 = this.sendBtn) == null ? void 0 : _d2.addEventListener("click", () => this.askPageQuestion());
2243
- (_e2 = this.inputEl) == null ? void 0 : _e2.addEventListener("keydown", (event) => {
2244
- if (event.key === "Enter" && !event.shiftKey) {
2245
- event.preventDefault();
2246
- this.askPageQuestion();
2247
- }
2248
- });
2249
- (_f2 = this.inputEl) == null ? void 0 : _f2.addEventListener("input", () => {
2250
- if (!this.inputEl) return;
2251
- this.inputEl.style.height = "auto";
2252
- this.inputEl.style.height = `${Math.min(this.inputEl.scrollHeight, 110)}px`;
2253
- });
2254
- document.documentElement.appendChild(this.root);
2255
- this.mounted = true;
2256
- }
2257
- bindGlobalEvents() {
2258
- document.addEventListener("mousemove", (event) => this.onMouseMove(event), true);
2259
- document.addEventListener("click", (event) => this.onDocumentClick(event), true);
2260
- document.addEventListener("keydown", (event) => this.onKeyDown(event), true);
2261
- }
2262
- onMouseMove(event) {
2263
- if (!this.watchMode) return;
2264
- const target = this.getPageTarget(event.target);
2265
- if (!target) return;
2266
- this.hoveredElement = target;
2267
- this.showHighlight(target);
2268
- if (!this.selectedContext) {
2269
- this.contextEl && (this.contextEl.textContent = this.getElementSummary(target));
2270
- }
2271
- }
2272
- onDocumentClick(event) {
2273
- if (!this.watchMode && !this.editMode) return;
2274
- const target = this.getPageTarget(event.target);
2275
- if (!target) return;
2276
- event.preventDefault();
2277
- event.stopPropagation();
2278
- event.stopImmediatePropagation();
2279
- if (this.watchMode) {
2280
- this.selectedContext = this.captureElementContext(target);
2281
- this.contextEl && (this.contextEl.textContent = this.getElementSummary(target));
2282
- this.updateStatus("Element selected");
2283
- }
2284
- if (this.editMode) {
2285
- this.enableInlineEdit(target);
2286
- this.updateStatus("Editing element");
2287
- }
2288
- }
2289
- onKeyDown(event) {
2290
- if (event.key === "Escape") {
2291
- if (this.editingElement) {
2292
- this.disableInlineEdit(this.editingElement, false);
2293
- this.updateStatus("Edit canceled");
2294
- event.preventDefault();
2295
- return;
2296
- }
2297
- if (this.open) {
2298
- this.hide();
2299
- event.preventDefault();
2300
- }
2301
- }
2302
- }
2303
- getPageTarget(target) {
2304
- var _a2;
2305
- if (!(target instanceof HTMLElement)) return null;
2306
- if ((_a2 = this.root) == null ? void 0 : _a2.contains(target)) return null;
2307
- if (!target.isConnected) return null;
2308
- if (target.tagName.toLowerCase() === "html" || target.tagName.toLowerCase() === "body") return null;
2309
- return target;
2310
- }
2311
- setWatchMode(active) {
2312
- var _a2;
2313
- this.watchMode = active;
2314
- if (active) this.setEditMode(false);
2315
- (_a2 = this.watchBtn) == null ? void 0 : _a2.setAttribute("data-active", active ? "true" : "false");
2316
- if (!active) {
2317
- this.hoveredElement = null;
2318
- this.clearHighlight();
2319
- if (!this.selectedContext && this.contextEl) {
2320
- this.contextEl.textContent = "Use Watch to inspect page elements.";
2321
- }
2322
- } else {
2323
- this.updateStatus("Watch mode on");
2324
- }
2325
- }
2326
- setEditMode(active) {
2327
- var _a2;
2328
- this.editMode = active;
2329
- if (active) this.setWatchMode(false);
2330
- (_a2 = this.editBtn) == null ? void 0 : _a2.setAttribute("data-active", active ? "true" : "false");
2331
- if (!active && this.editingElement) {
2332
- this.disableInlineEdit(this.editingElement, true);
2333
- } else if (active) {
2334
- this.updateStatus("Edit mode on");
2335
- }
2336
- }
2337
- enableInlineEdit(element) {
2338
- if (this.editingElement && this.editingElement !== element) {
2339
- this.disableInlineEdit(this.editingElement, true);
2340
- }
2341
- if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
2342
- element.focus();
2343
- this.editingElement = element;
2344
- return;
2345
- }
2346
- if (!element.hasAttribute("data-hanzo-original-html")) {
2347
- element.setAttribute("data-hanzo-original-html", element.innerHTML);
2348
- }
2349
- element.setAttribute("contenteditable", "true");
2350
- element.setAttribute("spellcheck", "true");
2351
- element.setAttribute("data-hanzo-inline-editing", "true");
2352
- element.focus();
2353
- this.editingElement = element;
2354
- const keydownHandler = (event) => {
2355
- if (event.key === "Escape") {
2356
- this.disableInlineEdit(element, false);
2357
- this.updateStatus("Edit reverted");
2358
- }
2359
- if (event.key === "Enter" && !event.shiftKey) {
2360
- event.preventDefault();
2361
- this.disableInlineEdit(element, true);
2362
- this.updateStatus("Edit applied");
2363
- }
2364
- };
2365
- const blurHandler = () => {
2366
- this.disableInlineEdit(element, true);
2367
- this.updateStatus("Edit applied");
2368
- };
2369
- element.addEventListener("keydown", keydownHandler, { once: true });
2370
- element.addEventListener("blur", blurHandler, { once: true });
2371
- }
2372
- disableInlineEdit(element, keepChanges) {
2373
- if (!keepChanges) {
2374
- const original = element.getAttribute("data-hanzo-original-html");
2375
- if (original !== null) {
2376
- element.innerHTML = original;
2377
- }
2378
- }
2379
- element.removeAttribute("contenteditable");
2380
- element.removeAttribute("spellcheck");
2381
- element.removeAttribute("data-hanzo-inline-editing");
2382
- element.removeAttribute("data-hanzo-original-html");
2383
- if (this.editingElement === element) {
2384
- this.editingElement = null;
2385
- }
2386
- }
2387
- showHighlight(element) {
2388
- const rect = element.getBoundingClientRect();
2389
- if (rect.width === 0 && rect.height === 0) {
2390
- this.clearHighlight();
2391
- return;
2392
- }
2393
- if (!this.highlightBox) {
2394
- this.highlightBox = document.createElement("div");
2395
- this.highlightBox.className = "hanzo-page-highlight";
2396
- document.documentElement.appendChild(this.highlightBox);
2397
- }
2398
- this.highlightBox.style.left = `${Math.max(0, rect.left - 3)}px`;
2399
- this.highlightBox.style.top = `${Math.max(0, rect.top - 3)}px`;
2400
- this.highlightBox.style.width = `${rect.width + 6}px`;
2401
- this.highlightBox.style.height = `${rect.height + 6}px`;
2402
- }
2403
- clearHighlight() {
2404
- var _a2;
2405
- (_a2 = this.highlightBox) == null ? void 0 : _a2.remove();
2406
- this.highlightBox = null;
2407
- }
2408
- captureElementContext(element) {
2409
- const text = this.normalizeText(element.innerText || element.textContent || "");
2410
- return {
2411
- selector: this.buildSelector(element),
2412
- tag: element.tagName.toLowerCase(),
2413
- text: text.slice(0, 800),
2414
- html: element.outerHTML.slice(0, 1200)
2415
- };
2416
- }
2417
- buildSelector(element) {
2418
- if (element.id) return `#${element.id}`;
2419
- const parts = [];
2420
- let current = element;
2421
- let depth = 0;
2422
- while (current && depth < 6) {
2423
- let part = current.tagName.toLowerCase();
2424
- if (current.classList.length > 0) {
2425
- const className = Array.from(current.classList).slice(0, 2).join(".");
2426
- if (className) part += `.${className}`;
2427
- }
2428
- const parent = current.parentElement;
2429
- if (parent) {
2430
- const siblings = Array.from(parent.children).filter((node) => node.tagName === current.tagName);
2431
- if (siblings.length > 1) {
2432
- const index = siblings.indexOf(current) + 1;
2433
- part += `:nth-of-type(${index})`;
2434
- }
2435
- }
2436
- parts.unshift(part);
2437
- current = parent;
2438
- depth += 1;
2439
- }
2440
- return parts.join(" > ");
2441
- }
2442
- normalizeText(value) {
2443
- return value.replace(/\s+/g, " ").trim();
2444
- }
2445
- getElementSummary(element) {
2446
- const ctx = this.captureElementContext(element);
2447
- return `${ctx.tag} \u2022 ${ctx.selector}`;
2448
- }
2449
- async loadModels() {
2450
- if (this.modelsLoaded || !this.modelEl) return;
2451
- try {
2452
- const response = await chrome.runtime.sendMessage({ action: "chat.listModels" });
2453
- if (!(response == null ? void 0 : response.success) || !Array.isArray(response.models) || !response.models.length) {
2454
- return;
2455
- }
2456
- const previous = this.modelEl.value;
2457
- this.modelEl.innerHTML = "";
2458
- for (const model of response.models) {
2459
- if (!(model == null ? void 0 : model.id)) continue;
2460
- const option = document.createElement("option");
2461
- option.value = model.id;
2462
- option.textContent = model.name || model.id;
2463
- this.modelEl.appendChild(option);
2464
- }
2465
- if (previous && Array.from(this.modelEl.options).some((opt) => opt.value === previous)) {
2466
- this.modelEl.value = previous;
2467
- }
2468
- this.modelsLoaded = true;
2469
- } catch {
2470
- }
2471
- }
2472
- focusInput() {
2473
- if (!this.inputEl) return;
2474
- this.inputEl.focus();
2475
- }
2476
- appendMessage(role, content) {
2477
- if (!this.messagesEl) return;
2478
- const div = document.createElement("div");
2479
- div.className = `hanzo-page-msg ${role}`;
2480
- div.textContent = content;
2481
- this.messagesEl.appendChild(div);
2482
- this.messagesEl.scrollTop = this.messagesEl.scrollHeight;
2483
- }
2484
- updateStatus(text) {
2485
- if (!this.statusEl) return;
2486
- this.statusEl.textContent = text;
2487
- }
2488
- buildPageContext() {
2489
- var _a2, _b2;
2490
- const selection = this.normalizeText(((_b2 = (_a2 = window.getSelection) == null ? void 0 : _a2.call(window)) == null ? void 0 : _b2.toString()) || "");
2491
- const contextLines = [
2492
- `URL: ${location.href}`,
2493
- `Title: ${document.title || "Untitled"}`
2494
- ];
2495
- if (selection) {
2496
- contextLines.push(`TextSelection: ${selection.slice(0, 600)}`);
2497
- }
2498
- const elementContext = this.selectedContext || (this.hoveredElement ? this.captureElementContext(this.hoveredElement) : null);
2499
- if (elementContext) {
2500
- contextLines.push(`ElementSelector: ${elementContext.selector}`);
2501
- if (elementContext.text) contextLines.push(`ElementText: ${elementContext.text.slice(0, 600)}`);
2502
- contextLines.push(`ElementHTML: ${elementContext.html.slice(0, 800)}`);
2503
- }
2504
- return contextLines.join("\n");
2505
- }
2506
- async askPageQuestion() {
2507
- var _a2;
2508
- if (this.sending || !this.inputEl) return;
2509
- const prompt = this.normalizeText(this.inputEl.value);
2510
- if (!prompt) return;
2511
- const tokenResp = await chrome.runtime.sendMessage({ action: "auth.getToken" });
2512
- if (!(tokenResp == null ? void 0 : tokenResp.success) || !tokenResp.token) {
2513
- this.appendMessage("assistant", "Please sign in from the Hanzo sidebar/popup before using page chat.");
2514
- return;
2515
- }
2516
- this.sending = true;
2517
- this.updateStatus("Thinking...");
2518
- this.sendBtn && (this.sendBtn.disabled = true);
2519
- this.inputEl.value = "";
2520
- this.inputEl.style.height = "auto";
2521
- this.appendMessage("user", prompt);
2522
- const systemContext = this.buildPageContext();
2523
- const model = ((_a2 = this.modelEl) == null ? void 0 : _a2.value) || "gpt-4o";
2524
- const requestMessages = [
2525
- {
2526
- role: "system",
2527
- content: [
2528
- "You are Hanzo page overlay assistant.",
2529
- "Use provided page context and selected element context when relevant.",
2530
- "Be concise and provide concrete UI or DOM edit suggestions when asked.",
2531
- "",
2532
- systemContext
2533
- ].join("\n")
2534
- },
2535
- ...this.messages.slice(-8),
2536
- { role: "user", content: prompt }
2537
- ];
2538
- try {
2539
- const response = await chrome.runtime.sendMessage({
2540
- action: "chat.complete",
2541
- model,
2542
- messages: requestMessages
2543
- });
2544
- if (!(response == null ? void 0 : response.success) || !response.content) {
2545
- throw new Error((response == null ? void 0 : response.error) || "No response from chat service");
2546
- }
2547
- const answer = String(response.content).trim();
2548
- this.appendMessage("assistant", answer || "No response content.");
2549
- this.messages.push({ role: "user", content: prompt }, { role: "assistant", content: answer });
2550
- this.messages = this.messages.slice(-20);
2551
- this.updateStatus("Ready");
2552
- } catch (error) {
2553
- this.appendMessage("assistant", `Error: ${(error == null ? void 0 : error.message) || "Chat request failed"}`);
2554
- this.updateStatus("Error");
2555
- } finally {
2556
- this.sending = false;
2557
- this.sendBtn && (this.sendBtn.disabled = false);
2558
- this.focusInput();
2559
- }
2560
- }
2561
- };
2562
- var pageOverlay = new HanzoPageOverlay();
2563
- var elementPicker = /* @__PURE__ */ (() => {
2564
- let active = false;
2565
- let overlay = null;
2566
- let label = null;
2567
- let hoveredEl = null;
2568
- function getSelector(el) {
2569
- if (el.id) return `#${el.id}`;
2570
- const tag = el.tagName.toLowerCase();
2571
- const classes = Array.from(el.classList).filter((c) => !c.startsWith("hanzo-")).slice(0, 3);
2572
- let selector = tag;
2573
- if (classes.length) selector += `.${classes.join(".")}`;
2574
- const matches = document.querySelectorAll(selector);
2575
- if (matches.length > 1) {
2576
- const parent = el.parentElement;
2577
- if (parent) {
2578
- const idx = Array.from(parent.children).indexOf(el) + 1;
2579
- selector += `:nth-child(${idx})`;
2580
- }
2581
- }
2582
- return selector;
2583
- }
2584
- function getFullPath(el) {
2585
- const parts = [];
2586
- let cur = el;
2587
- while (cur && cur !== document.documentElement) {
2588
- parts.unshift(getSelector(cur));
2589
- cur = cur.parentElement;
2590
- }
2591
- return parts.join(" > ");
2592
- }
2593
- function ensureOverlay() {
2594
- if (overlay) return;
2595
- overlay = document.createElement("div");
2596
- overlay.id = "hanzo-picker-overlay";
2597
- overlay.style.cssText = "position:fixed;pointer-events:none;z-index:2147483646;border:2px solid #fff;border-radius:3px;background:rgba(255,255,255,0.06);transition:all 0.1s ease;display:none;";
2598
- label = document.createElement("div");
2599
- label.id = "hanzo-picker-label";
2600
- label.style.cssText = "position:fixed;z-index:2147483647;pointer-events:none;background:#000;color:#fff;font:11px/1.4 Geist Mono,Menlo,monospace;padding:3px 8px;border-radius:4px;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:none;box-shadow:0 2px 8px rgba(0,0,0,0.4);";
2601
- document.body.appendChild(overlay);
2602
- document.body.appendChild(label);
2603
- }
2604
- function onMove(e) {
2605
- var _a2;
2606
- if (!active) return;
2607
- const target = e.target;
2608
- if (!target || target === overlay || target === label) return;
2609
- if ((_a2 = target.id) == null ? void 0 : _a2.startsWith("hanzo-picker")) return;
2610
- hoveredEl = target;
2611
- const rect = target.getBoundingClientRect();
2612
- if (overlay) {
2613
- overlay.style.display = "block";
2614
- overlay.style.top = rect.top + "px";
2615
- overlay.style.left = rect.left + "px";
2616
- overlay.style.width = rect.width + "px";
2617
- overlay.style.height = rect.height + "px";
2618
- }
2619
- if (label) {
2620
- label.style.display = "block";
2621
- label.textContent = getSelector(target);
2622
- const labelTop = rect.top - 28;
2623
- label.style.top = (labelTop > 0 ? labelTop : rect.bottom + 4) + "px";
2624
- label.style.left = rect.left + "px";
2625
- }
2626
- }
2627
- function onClick(e) {
2628
- if (!active) return;
2629
- e.preventDefault();
2630
- e.stopPropagation();
2631
- e.stopImmediatePropagation();
2632
- const el = hoveredEl || e.target;
2633
- if (!el) return;
2634
- const selector = getSelector(el);
2635
- const fullPath = getFullPath(el);
2636
- const tag = el.tagName.toLowerCase();
2637
- const text = (el.textContent || "").trim().slice(0, 80);
2638
- const rect = el.getBoundingClientRect();
2639
- const info = [
2640
- `Selector: ${selector}`,
2641
- `Path: ${fullPath}`,
2642
- `Tag: ${tag}`,
2643
- `Size: ${Math.round(rect.width)}x${Math.round(rect.height)}`,
2644
- el.id ? `ID: ${el.id}` : "",
2645
- el.className ? `Classes: ${el.className}` : "",
2646
- text ? `Text: "${text}"` : ""
2647
- ].filter(Boolean).join("\n");
2648
- navigator.clipboard.writeText(info).catch(() => {
2649
- });
2650
- chrome.runtime.sendMessage({ action: "elementSelected", data: { selector, fullPath, tag, text, rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height } } });
2651
- stop();
2652
- }
2653
- function onKey(e) {
2654
- if (e.key === "Escape") {
2655
- e.preventDefault();
2656
- stop();
2657
- }
2658
- }
2659
- function start() {
2660
- if (active) return;
2661
- active = true;
2662
- ensureOverlay();
2663
- document.addEventListener("mousemove", onMove, true);
2664
- document.addEventListener("click", onClick, true);
2665
- document.addEventListener("keydown", onKey, true);
2666
- document.body.style.cursor = "crosshair";
2667
- }
2668
- function stop() {
2669
- active = false;
2670
- document.removeEventListener("mousemove", onMove, true);
2671
- document.removeEventListener("click", onClick, true);
2672
- document.removeEventListener("keydown", onKey, true);
2673
- document.body.style.cursor = "";
2674
- if (overlay) overlay.style.display = "none";
2675
- if (label) label.style.display = "none";
2676
- hoveredEl = null;
2677
- }
2678
- return { start, stop };
2679
- })();
2680
- function gatherPageInfo() {
2681
- const meta = (name) => {
2682
- var _a2;
2683
- return ((_a2 = document.querySelector(`meta[name="${name}"], meta[property="${name}"]`)) == null ? void 0 : _a2.getAttribute("content")) || "";
2684
- };
2685
- const lines = [
2686
- `Title: ${document.title}`,
2687
- `URL: ${location.href}`,
2688
- `Description: ${meta("description") || meta("og:description")}`,
2689
- `Charset: ${document.characterSet}`,
2690
- `Language: ${document.documentElement.lang || "unknown"}`,
2691
- `Viewport: ${meta("viewport")}`
2692
- ];
2693
- const frameworks = [];
2694
- if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) frameworks.push("React");
2695
- if (window.__VUE_DEVTOOLS_GLOBAL_HOOK__) frameworks.push("Vue");
2696
- if (window.__svelte) frameworks.push("Svelte");
2697
- if (window.__NEXT_DATA__) frameworks.push("Next.js");
2698
- if (window.__NUXT__) frameworks.push("Nuxt");
2699
- if (document.querySelector("[ng-version]")) frameworks.push("Angular");
2700
- if (frameworks.length) lines.push(`Frameworks: ${frameworks.join(", ")}`);
2701
- const scripts = document.querySelectorAll("script[src]").length;
2702
- const styles = document.querySelectorAll('link[rel="stylesheet"]').length;
2703
- const images = document.querySelectorAll("img").length;
2704
- const links = document.querySelectorAll("a[href]").length;
2705
- lines.push(`Resources: ${scripts} scripts, ${styles} stylesheets, ${images} images, ${links} links`);
2706
- const perf = performance.getEntriesByType("navigation")[0];
2707
- if (perf) {
2708
- lines.push(`Load: ${Math.round(perf.loadEventEnd - perf.startTime)}ms (DOM: ${Math.round(perf.domContentLoadedEventEnd - perf.startTime)}ms)`);
2709
- }
2710
- return lines.filter((l) => !l.endsWith(": ")).join("\n");
2711
- }
2712
- var inlineConsole = /* @__PURE__ */ (() => {
2713
- let root = null;
2714
- let input = null;
2715
- let output = null;
2716
- let visible = false;
2717
- function ensureMount() {
2718
- if (root) return;
2719
- root = document.createElement("div");
2720
- root.id = "hanzo-console-root";
2721
- root.style.cssText = "position:fixed;bottom:20px;left:20px;right:20px;z-index:2147483646;font-family:Geist Mono,Menlo,Consolas,monospace;font-size:12px;display:none;";
2722
- root.innerHTML = `
2723
- <div style="background:rgba(0,0,0,0.92);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:10px;overflow:hidden;box-shadow:0 8px 32px rgba(0,0,0,0.5);">
2724
- <div id="hanzo-console-output" style="max-height:200px;overflow-y:auto;padding:8px 12px;color:#ccc;white-space:pre-wrap;word-break:break-all;"></div>
2725
- <div style="display:flex;align-items:center;border-top:1px solid rgba(255,255,255,0.1);padding:0 12px;">
2726
- <span style="color:#666;margin-right:6px;">&gt;</span>
2727
- <input id="hanzo-console-input" type="text" placeholder="eval(...)" style="flex:1;background:transparent;border:none;color:#fff;font:inherit;padding:10px 0;outline:none;">
2728
- <span style="color:#444;font-size:10px;margin-left:8px;">Esc to close</span>
2729
- </div>
2730
- </div>
2731
- `;
2732
- document.body.appendChild(root);
2733
- input = root.querySelector("#hanzo-console-input");
2734
- output = root.querySelector("#hanzo-console-output");
2735
- input == null ? void 0 : input.addEventListener("keydown", (e) => {
2736
- if (e.key === "Escape") {
2737
- hide();
2738
- return;
2739
- }
2740
- if (e.key !== "Enter" || !(input == null ? void 0 : input.value.trim())) return;
2741
- const expr = input.value.trim();
2742
- input.value = "";
2743
- appendLine(`> ${expr}`, "#888");
2744
- try {
2745
- const result = (0, eval)(expr);
2746
- appendLine(String(result), "#4CAF50");
2747
- } catch (err) {
2748
- appendLine((err == null ? void 0 : err.message) || String(err), "#F44336");
2749
- }
2750
- });
2751
- }
2752
- function appendLine(text, color) {
2753
- if (!output) return;
2754
- const line = document.createElement("div");
2755
- line.style.color = color;
2756
- line.textContent = text;
2757
- output.appendChild(line);
2758
- output.scrollTop = output.scrollHeight;
2759
- }
2760
- function show() {
2761
- ensureMount();
2762
- if (root) root.style.display = "block";
2763
- visible = true;
2764
- setTimeout(() => input == null ? void 0 : input.focus(), 50);
2765
- }
2766
- function hide() {
2767
- if (root) root.style.display = "none";
2768
- visible = false;
2769
- }
2770
- return { show, hide, isVisible: () => visible };
2771
- })();
2772
- new HanzoContentScript();
2773
- var _a, _b, _c, _d, _e, _f;
2774
- try {
2775
- const port = ((_b = (_a = browser == null ? void 0 : browser.runtime) == null ? void 0 : _a.connect) == null ? void 0 : _b.call(_a, { name: "zap-keepalive" })) || ((_d = (_c = chrome == null ? void 0 : chrome.runtime) == null ? void 0 : _c.connect) == null ? void 0 : _d.call(_c, { name: "zap-keepalive" }));
2776
- if (port) {
2777
- const tick = setInterval(() => {
2778
- try {
2779
- port.postMessage({ type: "ping", t: Date.now() });
2780
- } catch {
2781
- clearInterval(tick);
2782
- }
2783
- }, 1e4);
2784
- (_f = (_e = port.onDisconnect) == null ? void 0 : _e.addListener) == null ? void 0 : _f.call(_e, () => clearInterval(tick));
2785
- }
2786
- } catch {
2787
- }
2788
- })();
2789
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbEAwLjEyLjAvbm9kZV9tb2R1bGVzL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbC9kaXN0L2Jyb3dzZXItcG9seWZpbGwuanMiLCAiLi4vLi4vc3JjL2NvbnRlbnQtc2NyaXB0LnRzIiwgIi4uLy4uL3NyYy9zaGFyZWQvc2hvcnRjdXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIHdlYmV4dGVuc2lvbi1wb2x5ZmlsbCAtIHYwLjEyLjAgLSBUdWUgTWF5IDE0IDIwMjQgMTg6MDE6MjkgKi9cbi8qIC0qLSBNb2RlOiBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGpzLWluZGVudC1sZXZlbDogMiAtKi0gKi9cbi8qIHZpbTogc2V0IHN0cz0yIHN3PTIgZXQgdHc9ODA6ICovXG4vKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLiAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmlmICghKGdsb2JhbFRoaXMuY2hyb21lICYmIGdsb2JhbFRoaXMuY2hyb21lLnJ1bnRpbWUgJiYgZ2xvYmFsVGhpcy5jaHJvbWUucnVudGltZS5pZCkpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzY3JpcHQgc2hvdWxkIG9ubHkgYmUgbG9hZGVkIGluIGEgYnJvd3NlciBleHRlbnNpb24uXCIpO1xufVxuXG5pZiAoIShnbG9iYWxUaGlzLmJyb3dzZXIgJiYgZ2xvYmFsVGhpcy5icm93c2VyLnJ1bnRpbWUgJiYgZ2xvYmFsVGhpcy5icm93c2VyLnJ1bnRpbWUuaWQpKSB7XG4gIGNvbnN0IENIUk9NRV9TRU5EX01FU1NBR0VfQ0FMTEJBQ0tfTk9fUkVTUE9OU0VfTUVTU0FHRSA9IFwiVGhlIG1lc3NhZ2UgcG9ydCBjbG9zZWQgYmVmb3JlIGEgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLlwiO1xuXG4gIC8vIFdyYXBwaW5nIHRoZSBidWxrIG9mIHRoaXMgcG9seWZpbGwgaW4gYSBvbmUtdGltZS11c2UgZnVuY3Rpb24gaXMgYSBtaW5vclxuICAvLyBvcHRpbWl6YXRpb24gZm9yIEZpcmVmb3guIFNpbmNlIFNwaWRlcm1vbmtleSBkb2VzIG5vdCBmdWxseSBwYXJzZSB0aGVcbiAgLy8gY29udGVudHMgb2YgYSBmdW5jdGlvbiB1bnRpbCB0aGUgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHNpbmNlIGl0IHdpbGxcbiAgLy8gbmV2ZXIgYWN0dWFsbHkgbmVlZCB0byBiZSBjYWxsZWQsIHRoaXMgYWxsb3dzIHRoZSBwb2x5ZmlsbCB0byBiZSBpbmNsdWRlZFxuICAvLyBpbiBGaXJlZm94IG5lYXJseSBmb3IgZnJlZS5cbiAgY29uc3Qgd3JhcEFQSXMgPSBleHRlbnNpb25BUElzID0+IHtcbiAgICAvLyBOT1RFOiBhcGlNZXRhZGF0YSBpcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZW50IG9mIHRoZSBhcGktbWV0YWRhdGEuanNvbiBmaWxlXG4gICAgLy8gYXQgYnVpbGQgdGltZSBieSByZXBsYWNpbmcgdGhlIGZvbGxvd2luZyBcImluY2x1ZGVcIiB3aXRoIHRoZSBjb250ZW50IG9mIHRoZVxuICAgIC8vIEpTT04gZmlsZS5cbiAgICBjb25zdCBhcGlNZXRhZGF0YSA9IHtcbiAgICAgIFwiYWxhcm1zXCI6IHtcbiAgICAgICAgXCJjbGVhclwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJjbGVhckFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJib29rbWFya3NcIjoge1xuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0Q2hpbGRyZW5cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0UmVjZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFN1YlRyZWVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VHJlZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVUcmVlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImJyb3dzZXJBY3Rpb25cIjoge1xuICAgICAgICBcImRpc2FibGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVuYWJsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3JcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QmFkZ2VUZXh0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFBvcHVwXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFRpdGxlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW5Qb3B1cFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRCYWRnZUJhY2tncm91bmRDb2xvclwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0QmFkZ2VUZXh0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRJY29uXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNldFBvcHVwXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRUaXRsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImJyb3dzaW5nRGF0YVwiOiB7XG4gICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUNhY2hlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUNvb2tpZXNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlRG93bmxvYWRzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUZvcm1EYXRhXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUhpc3RvcnlcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlTG9jYWxTdG9yYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVBhc3N3b3Jkc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVQbHVnaW5EYXRhXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb21tYW5kc1wiOiB7XG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb250ZXh0TWVudXNcIjoge1xuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb29raWVzXCI6IHtcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEFsbENvb2tpZVN0b3Jlc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJkZXZ0b29sc1wiOiB7XG4gICAgICAgIFwiaW5zcGVjdGVkV2luZG93XCI6IHtcbiAgICAgICAgICBcImV2YWxcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMixcbiAgICAgICAgICAgIFwic2luZ2xlQ2FsbGJhY2tBcmdcIjogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwicGFuZWxzXCI6IHtcbiAgICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMyxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAzLFxuICAgICAgICAgICAgXCJzaW5nbGVDYWxsYmFja0FyZ1wiOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImVsZW1lbnRzXCI6IHtcbiAgICAgICAgICAgIFwiY3JlYXRlU2lkZWJhclBhbmVcIjoge1xuICAgICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImRvd25sb2Fkc1wiOiB7XG4gICAgICAgIFwiY2FuY2VsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRvd25sb2FkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImVyYXNlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEZpbGVJY29uXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW5cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBhdXNlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUZpbGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVzdW1lXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaG93XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZXh0ZW5zaW9uXCI6IHtcbiAgICAgICAgXCJpc0FsbG93ZWRGaWxlU2NoZW1lQWNjZXNzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImlzQWxsb3dlZEluY29nbml0b0FjY2Vzc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiaGlzdG9yeVwiOiB7XG4gICAgICAgIFwiYWRkVXJsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRlbGV0ZUFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxldGVSYW5nZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxldGVVcmxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VmlzaXRzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiaTE4blwiOiB7XG4gICAgICAgIFwiZGV0ZWN0TGFuZ3VhZ2VcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWNjZXB0TGFuZ3VhZ2VzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJpZGVudGl0eVwiOiB7XG4gICAgICAgIFwibGF1bmNoV2ViQXV0aEZsb3dcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImlkbGVcIjoge1xuICAgICAgICBcInF1ZXJ5U3RhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIm1hbmFnZW1lbnRcIjoge1xuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0U2VsZlwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRFbmFibGVkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInVuaW5zdGFsbFNlbGZcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIm5vdGlmaWNhdGlvbnNcIjoge1xuICAgICAgICBcImNsZWFyXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0UGVybWlzc2lvbkxldmVsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwicGFnZUFjdGlvblwiOiB7XG4gICAgICAgIFwiZ2V0UG9wdXBcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VGl0bGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlkZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0SWNvblwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRQb3B1cFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0VGl0bGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNob3dcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJwZXJtaXNzaW9uc1wiOiB7XG4gICAgICAgIFwiY29udGFpbnNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJydW50aW1lXCI6IHtcbiAgICAgICAgXCJnZXRCYWNrZ3JvdW5kUGFnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRQbGF0Zm9ybUluZm9cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwib3Blbk9wdGlvbnNQYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInJlcXVlc3RVcGRhdGVDaGVja1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZW5kTWVzc2FnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDNcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZW5kTmF0aXZlTWVzc2FnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRVbmluc3RhbGxVUkxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInNlc3Npb25zXCI6IHtcbiAgICAgICAgXCJnZXREZXZpY2VzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFJlY2VudGx5Q2xvc2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlc3RvcmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInN0b3JhZ2VcIjoge1xuICAgICAgICBcImxvY2FsXCI6IHtcbiAgICAgICAgICBcImNsZWFyXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1hbmFnZWRcIjoge1xuICAgICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInN5bmNcIjoge1xuICAgICAgICAgIFwiY2xlYXJcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRCeXRlc0luVXNlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInRhYnNcIjoge1xuICAgICAgICBcImNhcHR1cmVWaXNpYmxlVGFiXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRlY3RMYW5ndWFnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXNjYXJkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImR1cGxpY2F0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJleGVjdXRlU2NyaXB0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRDdXJyZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImdldFpvb21cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0Wm9vbVNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdvQmFja1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnb0ZvcndhcmRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlnaGxpZ2h0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImluc2VydENTU1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInF1ZXJ5XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbG9hZFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlQ1NTXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInNlbmRNZXNzYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogM1xuICAgICAgICB9LFxuICAgICAgICBcInNldFpvb21cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0Wm9vbVNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwidG9wU2l0ZXNcIjoge1xuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwid2ViTmF2aWdhdGlvblwiOiB7XG4gICAgICAgIFwiZ2V0QWxsRnJhbWVzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEZyYW1lXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ3ZWJSZXF1ZXN0XCI6IHtcbiAgICAgICAgXCJoYW5kbGVyQmVoYXZpb3JDaGFuZ2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ3aW5kb3dzXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImdldEFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRDdXJyZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldExhc3RGb2N1c2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGFwaU1ldGFkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFwaS1tZXRhZGF0YS5qc29uIGhhcyBub3QgYmVlbiBpbmNsdWRlZCBpbiBicm93c2VyLXBvbHlmaWxsXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgV2Vha01hcCBzdWJjbGFzcyB3aGljaCBjcmVhdGVzIGFuZCBzdG9yZXMgYSB2YWx1ZSBmb3IgYW55IGtleSB3aGljaCBkb2VzXG4gICAgICogbm90IGV4aXN0IHdoZW4gYWNjZXNzZWQsIGJ1dCBiZWhhdmVzIGV4YWN0bHkgYXMgYW4gb3JkaW5hcnkgV2Vha01hcFxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNyZWF0ZUl0ZW1cbiAgICAgKiAgICAgICAgQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHZhbHVlIGZvciBhbnlcbiAgICAgKiAgICAgICAga2V5IHdoaWNoIGRvZXMgbm90IGV4aXN0LCB0aGUgZmlyc3QgdGltZSBpdCBpcyBhY2Nlc3NlZC4gVGhlXG4gICAgICogICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVzLCBhcyBpdHMgb25seSBhcmd1bWVudCwgdGhlIGtleSBiZWluZyBjcmVhdGVkLlxuICAgICAqL1xuICAgIGNsYXNzIERlZmF1bHRXZWFrTWFwIGV4dGVuZHMgV2Vha01hcCB7XG4gICAgICBjb25zdHJ1Y3RvcihjcmVhdGVJdGVtLCBpdGVtcyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcihpdGVtcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlSXRlbSA9IGNyZWF0ZUl0ZW07XG4gICAgICB9XG5cbiAgICAgIGdldChrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zZXQoa2V5LCB0aGlzLmNyZWF0ZUl0ZW0oa2V5KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gb2JqZWN0IHdpdGggYSBgdGhlbmAgbWV0aG9kLCBhbmQgY2FuXG4gICAgICogdGhlcmVmb3JlIGJlIGFzc3VtZWQgdG8gYmVoYXZlIGFzIGEgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHRoZW5hYmxlLlxuICAgICAqL1xuICAgIGNvbnN0IGlzVGhlbmFibGUgPSB2YWx1ZSA9PiB7XG4gICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSBcImZ1bmN0aW9uXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzb2x2ZSBvciByZWplY3RcbiAgICAgKiB0aGUgZ2l2ZW4gcHJvbWlzZSBiYXNlZCBvbiBob3cgaXQgaXMgY2FsbGVkOlxuICAgICAqXG4gICAgICogLSBJZiwgd2hlbiBjYWxsZWQsIGBjaHJvbWUucnVudGltZS5sYXN0RXJyb3JgIGNvbnRhaW5zIGEgbm9uLW51bGwgb2JqZWN0LFxuICAgICAqICAgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCB0aGF0IHZhbHVlLlxuICAgICAqIC0gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGV4YWN0bHkgb25lIGFyZ3VtZW50LCB0aGUgcHJvbWlzZSBpc1xuICAgICAqICAgcmVzb2x2ZWQgdG8gdGhhdCB2YWx1ZS5cbiAgICAgKiAtIE90aGVyd2lzZSwgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlXG4gICAgICogICBmdW5jdGlvbidzIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9taXNlXG4gICAgICogICAgICAgIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXNvbHV0aW9uIGFuZCByZWplY3Rpb24gZnVuY3Rpb25zIG9mIGFcbiAgICAgKiAgICAgICAgcHJvbWlzZS5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBwcm9taXNlLnJlc29sdmVcbiAgICAgKiAgICAgICAgVGhlIHByb21pc2UncyByZXNvbHV0aW9uIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHByb21pc2UucmVqZWN0XG4gICAgICogICAgICAgIFRoZSBwcm9taXNlJ3MgcmVqZWN0aW9uIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhZGF0YVxuICAgICAqICAgICAgICBNZXRhZGF0YSBhYm91dCB0aGUgd3JhcHBlZCBtZXRob2Qgd2hpY2ggaGFzIGNyZWF0ZWQgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmdcbiAgICAgKiAgICAgICAgV2hldGhlciBvciBub3QgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCBvbmx5IHRoZSBmaXJzdFxuICAgICAqICAgICAgICBhcmd1bWVudCBvZiB0aGUgY2FsbGJhY2ssIGFsdGVybmF0aXZlbHkgYW4gYXJyYXkgb2YgYWxsIHRoZVxuICAgICAqICAgICAgICBjYWxsYmFjayBhcmd1bWVudHMgaXMgcmVzb2x2ZWQuIEJ5IGRlZmF1bHQsIGlmIHRoZSBjYWxsYmFja1xuICAgICAqICAgICAgICBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggb25seSBhIHNpbmdsZSBhcmd1bWVudCwgdGhhdCB3aWxsIGJlXG4gICAgICogICAgICAgIHJlc29sdmVkIHRvIHRoZSBwcm9taXNlLCB3aGlsZSBhbGwgYXJndW1lbnRzIHdpbGwgYmUgcmVzb2x2ZWQgYXNcbiAgICAgKiAgICAgICAgYW4gYXJyYXkgaWYgbXVsdGlwbGUgYXJlIGdpdmVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9ufVxuICAgICAqICAgICAgICBUaGUgZ2VuZXJhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0IG1ha2VDYWxsYmFjayA9IChwcm9taXNlLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuICguLi5jYWxsYmFja0FyZ3MpID0+IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IpIHtcbiAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvci5tZXNzYWdlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmcgfHxcbiAgICAgICAgICAgICAgICAgICAoY2FsbGJhY2tBcmdzLmxlbmd0aCA8PSAxICYmIG1ldGFkYXRhLnNpbmdsZUNhbGxiYWNrQXJnICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2tBcmdzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgcGx1cmFsaXplQXJndW1lbnRzID0gKG51bUFyZ3MpID0+IG51bUFyZ3MgPT0gMSA/IFwiYXJndW1lbnRcIiA6IFwiYXJndW1lbnRzXCI7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdoaWNoIGlzIGJlaW5nIHdyYXBwZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhXG4gICAgICogICAgICAgIE1ldGFkYXRhIGFib3V0IHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC5cbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1ldGFkYXRhLm1pbkFyZ3NcbiAgICAgKiAgICAgICAgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCBtdXN0IGJlIHBhc3NlZCB0byB0aGVcbiAgICAgKiAgICAgICAgZnVuY3Rpb24uIElmIGNhbGxlZCB3aXRoIGZld2VyIHRoYW4gdGhpcyBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGVcbiAgICAgKiAgICAgICAgd3JhcHBlciB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi5cbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1ldGFkYXRhLm1heEFyZ3NcbiAgICAgKiAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCBtYXkgYmUgcGFzc2VkIHRvIHRoZVxuICAgICAqICAgICAgICBmdW5jdGlvbi4gSWYgY2FsbGVkIHdpdGggbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlXG4gICAgICogICAgICAgIHdyYXBwZXIgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtZXRhZGF0YS5zaW5nbGVDYWxsYmFja0FyZ1xuICAgICAqICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIG9ubHkgdGhlIGZpcnN0XG4gICAgICogICAgICAgIGFyZ3VtZW50IG9mIHRoZSBjYWxsYmFjaywgYWx0ZXJuYXRpdmVseSBhbiBhcnJheSBvZiBhbGwgdGhlXG4gICAgICogICAgICAgIGNhbGxiYWNrIGFyZ3VtZW50cyBpcyByZXNvbHZlZC4gQnkgZGVmYXVsdCwgaWYgdGhlIGNhbGxiYWNrXG4gICAgICogICAgICAgIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCBvbmx5IGEgc2luZ2xlIGFyZ3VtZW50LCB0aGF0IHdpbGwgYmVcbiAgICAgKiAgICAgICAgcmVzb2x2ZWQgdG8gdGhlIHByb21pc2UsIHdoaWxlIGFsbCBhcmd1bWVudHMgd2lsbCBiZSByZXNvbHZlZCBhc1xuICAgICAqICAgICAgICBhbiBhcnJheSBpZiBtdWx0aXBsZSBhcmUgZ2l2ZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24ob2JqZWN0LCAuLi4qKX1cbiAgICAgKiAgICAgICBUaGUgZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgY29uc3Qgd3JhcEFzeW5jRnVuY3Rpb24gPSAobmFtZSwgbWV0YWRhdGEpID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBhc3luY0Z1bmN0aW9uV3JhcHBlcih0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgbWV0YWRhdGEubWluQXJncykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttZXRhZGF0YS5taW5BcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5taW5BcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiBtZXRhZGF0YS5tYXhBcmdzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0ICR7bWV0YWRhdGEubWF4QXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWF4QXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBpZiAobWV0YWRhdGEuZmFsbGJhY2tUb05vQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIFRoaXMgQVBJIG1ldGhvZCBoYXMgY3VycmVudGx5IG5vIGNhbGxiYWNrIG9uIENocm9tZSwgYnV0IGl0IHJldHVybiBhIHByb21pc2Ugb24gRmlyZWZveCxcbiAgICAgICAgICAgIC8vIGFuZCBzbyB0aGUgcG9seWZpbGwgd2lsbCB0cnkgdG8gY2FsbCBpdCB3aXRoIGEgY2FsbGJhY2sgZmlyc3QsIGFuZCBpdCB3aWxsIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyB0byBub3QgcGFzc2luZyB0aGUgY2FsbGJhY2sgaWYgdGhlIGZpcnN0IGNhbGwgZmFpbHMuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncywgbWFrZUNhbGxiYWNrKHtyZXNvbHZlLCByZWplY3R9LCBtZXRhZGF0YSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoY2JFcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7bmFtZX0gQVBJIG1ldGhvZCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyLCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGNhbGwgaXQgd2l0aG91dCBhIGNhbGxiYWNrOiBcIiwgY2JFcnJvcik7XG5cbiAgICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MpO1xuXG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgQVBJIG1ldGhvZCBtZXRhZGF0YSwgc28gdGhhdCB0aGUgbmV4dCBBUEkgY2FsbHMgd2lsbCBub3QgdHJ5IHRvXG4gICAgICAgICAgICAgIC8vIHVzZSB0aGUgdW5zdXBwb3J0ZWQgY2FsbGJhY2sgYW55bW9yZS5cbiAgICAgICAgICAgICAgbWV0YWRhdGEuZmFsbGJhY2tUb05vQ2FsbGJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbWV0YWRhdGEubm9DYWxsYmFjayA9IHRydWU7XG5cbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEubm9DYWxsYmFjaykge1xuICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncywgbWFrZUNhbGxiYWNrKHtyZXNvbHZlLCByZWplY3R9LCBtZXRhZGF0YSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBXcmFwcyBhbiBleGlzdGluZyBtZXRob2Qgb2YgdGhlIHRhcmdldCBvYmplY3QsIHNvIHRoYXQgY2FsbHMgdG8gaXQgYXJlXG4gICAgICogaW50ZXJjZXB0ZWQgYnkgdGhlIGdpdmVuIHdyYXBwZXIgZnVuY3Rpb24uIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHJlY2VpdmVzLFxuICAgICAqIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgdGhlIG9yaWdpbmFsIGB0YXJnZXRgIG9iamVjdCwgZm9sbG93ZWQgYnkgZWFjaCBvZlxuICAgICAqIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBvcmlnaW5hbCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gICAgICogICAgICAgIFRoZSBvcmlnaW5hbCB0YXJnZXQgb2JqZWN0IHRoYXQgdGhlIHdyYXBwZWQgbWV0aG9kIGJlbG9uZ3MgdG8uXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWV0aG9kXG4gICAgICogICAgICAgIFRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4gVGhpcyBpcyB1c2VkIGFzIHRoZSB0YXJnZXQgb2YgdGhlIFByb3h5XG4gICAgICogICAgICAgIG9iamVjdCB3aGljaCBpcyBjcmVhdGVkIHRvIHdyYXAgdGhlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSB3cmFwcGVyXG4gICAgICogICAgICAgIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBpbiBwbGFjZSBvZiBhIGRpcmVjdCBpbnZvY2F0aW9uXG4gICAgICogICAgICAgIG9mIHRoZSB3cmFwcGVkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm94eTxmdW5jdGlvbj59XG4gICAgICogICAgICAgIEEgUHJveHkgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbWV0aG9kLCB3aGljaCBpbnZva2VzIHRoZSBnaXZlbiB3cmFwcGVyXG4gICAgICogICAgICAgIG1ldGhvZCBpbiBpdHMgcGxhY2UuXG4gICAgICovXG4gICAgY29uc3Qgd3JhcE1ldGhvZCA9ICh0YXJnZXQsIG1ldGhvZCwgd3JhcHBlcikgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eShtZXRob2QsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0TWV0aG9kLCB0aGlzT2JqLCBhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2FsbCh0aGlzT2JqLCB0YXJnZXQsIC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGxldCBoYXNPd25Qcm9wZXJ0eSA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIC8qKlxuICAgICAqIFdyYXBzIGFuIG9iamVjdCBpbiBhIFByb3h5IHdoaWNoIGludGVyY2VwdHMgYW5kIHdyYXBzIGNlcnRhaW4gbWV0aG9kc1xuICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBgd3JhcHBlcnNgIGFuZCBgbWV0YWRhdGFgIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gICAgICogICAgICAgIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHdyYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW3dyYXBwZXJzID0ge31dXG4gICAgICogICAgICAgIEFuIG9iamVjdCB0cmVlIGNvbnRhaW5pbmcgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHNwZWNpYWwgY2FzZXMuIEFueVxuICAgICAqICAgICAgICBmdW5jdGlvbiBwcmVzZW50IGluIHRoaXMgb2JqZWN0IHRyZWUgaXMgY2FsbGVkIGluIHBsYWNlIG9mIHRoZVxuICAgICAqICAgICAgICBtZXRob2QgaW4gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGB0YXJnZXRgIG9iamVjdCB0cmVlLiBUaGVzZVxuICAgICAqICAgICAgICB3cmFwcGVyIG1ldGhvZHMgYXJlIGludm9rZWQgYXMgZGVzY3JpYmVkIGluIHtAc2VlIHdyYXBNZXRob2R9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFttZXRhZGF0YSA9IHt9XVxuICAgICAqICAgICAgICBBbiBvYmplY3QgdHJlZSBjb250YWluaW5nIG1ldGFkYXRhIHVzZWQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZVxuICAgICAqICAgICAgICBQcm9taXNlLWJhc2VkIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMuIEFueSBmdW5jdGlvbiBpblxuICAgICAqICAgICAgICB0aGUgYHRhcmdldGAgb2JqZWN0IHRyZWUgd2hpY2ggaGFzIGEgY29ycmVzcG9uZGluZyBtZXRhZGF0YSBvYmplY3RcbiAgICAgKiAgICAgICAgaW4gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGBtZXRhZGF0YWAgdHJlZSBpcyByZXBsYWNlZCB3aXRoIGFuXG4gICAgICogICAgICAgIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb24sIGFzIGRlc2NyaWJlZCBpblxuICAgICAqICAgICAgICB7QHNlZSB3cmFwQXN5bmNGdW5jdGlvbn1cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm94eTxvYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IHdyYXBPYmplY3QgPSAodGFyZ2V0LCB3cmFwcGVycyA9IHt9LCBtZXRhZGF0YSA9IHt9KSA9PiB7XG4gICAgICBsZXQgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgbGV0IGhhbmRsZXJzID0ge1xuICAgICAgICBoYXMocHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQgfHwgcHJvcCBpbiBjYWNoZTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQocHJveHlUYXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgaWYgKHByb3AgaW4gY2FjaGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtwcm9wXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIShwcm9wIGluIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgbWV0aG9kIG9uIHRoZSB1bmRlcmx5aW5nIG9iamVjdC4gQ2hlY2sgaWYgd2UgbmVlZCB0byBkb1xuICAgICAgICAgICAgLy8gYW55IHdyYXBwaW5nLlxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHdyYXBwZXJzW3Byb3BdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHNwZWNpYWwtY2FzZSB3cmFwcGVyIGZvciB0aGlzIG1ldGhvZC5cbiAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwTWV0aG9kKHRhcmdldCwgdGFyZ2V0W3Byb3BdLCB3cmFwcGVyc1twcm9wXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc093blByb3BlcnR5KG1ldGFkYXRhLCBwcm9wKSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHdlIGhhdmUgbWV0YWRhdGEgZm9yLiBDcmVhdGUgYVxuICAgICAgICAgICAgICAvLyBQcm9taXNlIHdyYXBwZXIgZm9yIGl0LlxuICAgICAgICAgICAgICBsZXQgd3JhcHBlciA9IHdyYXBBc3luY0Z1bmN0aW9uKHByb3AsIG1ldGFkYXRhW3Byb3BdKTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwTWV0aG9kKHRhcmdldCwgdGFyZ2V0W3Byb3BdLCB3cmFwcGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBtZXRob2QgdGhhdCB3ZSBkb24ndCBrbm93IG9yIGNhcmUgYWJvdXQuIFJldHVybiB0aGVcbiAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbWV0aG9kLCBib3VuZCB0byB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuYmluZCh0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAoaGFzT3duUHJvcGVydHkod3JhcHBlcnMsIHByb3ApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIHByb3ApKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBvYmplY3QgdGhhdCB3ZSBuZWVkIHRvIGRvIHNvbWUgd3JhcHBpbmcgZm9yIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgLy8gb2YuIENyZWF0ZSBhIHN1Yi1vYmplY3Qgd3JhcHBlciBmb3IgaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY2hpbGRcbiAgICAgICAgICAgIC8vIG1ldGFkYXRhLlxuICAgICAgICAgICAgdmFsdWUgPSB3cmFwT2JqZWN0KHZhbHVlLCB3cmFwcGVyc1twcm9wXSwgbWV0YWRhdGFbcHJvcF0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIFwiKlwiKSkge1xuICAgICAgICAgICAgLy8gV3JhcCBhbGwgcHJvcGVydGllcyBpbiAqIG5hbWVzcGFjZS5cbiAgICAgICAgICAgIHZhbHVlID0gd3JhcE9iamVjdCh2YWx1ZSwgd3JhcHBlcnNbcHJvcF0sIG1ldGFkYXRhW1wiKlwiXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55IHdyYXBwaW5nIGZvciB0aGlzIHByb3BlcnR5LFxuICAgICAgICAgICAgLy8gc28ganVzdCBmb3J3YXJkIGFsbCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhY2hlLCBwcm9wLCB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWNoZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQocHJveHlUYXJnZXQsIHByb3AsIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICAgIGlmIChwcm9wIGluIGNhY2hlKSB7XG4gICAgICAgICAgICBjYWNoZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVmaW5lUHJvcGVydHkocHJveHlUYXJnZXQsIHByb3AsIGRlc2MpIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShjYWNoZSwgcHJvcCwgZGVzYyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVsZXRlUHJvcGVydHkocHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShjYWNoZSwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBQZXIgY29udHJhY3Qgb2YgdGhlIFByb3h5IEFQSSwgdGhlIFwiZ2V0XCIgcHJveHkgaGFuZGxlciBtdXN0IHJldHVybiB0aGVcbiAgICAgIC8vIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSB0YXJnZXQgaWYgdGhhdCB2YWx1ZSBpcyBkZWNsYXJlZCByZWFkLW9ubHkgYW5kXG4gICAgICAvLyBub24tY29uZmlndXJhYmxlLiBGb3IgdGhpcyByZWFzb24sIHdlIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgIC8vIHByb3RvdHlwZSBzZXQgdG8gYHRhcmdldGAgaW5zdGVhZCBvZiB1c2luZyBgdGFyZ2V0YCBkaXJlY3RseS5cbiAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW5ub3QgcmV0dXJuIGEgY3VzdG9tIG9iamVjdCBmb3IgQVBJcyB0aGF0XG4gICAgICAvLyBhcmUgZGVjbGFyZWQgcmVhZC1vbmx5IGFuZCBub24tY29uZmlndXJhYmxlLCBzdWNoIGFzIGBjaHJvbWUuZGV2dG9vbHNgLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwcm94eSBoYW5kbGVycyB0aGVtc2VsdmVzIHdpbGwgc3RpbGwgdXNlIHRoZSBvcmlnaW5hbCBgdGFyZ2V0YFxuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgYHByb3h5VGFyZ2V0YCwgc28gdGhhdCB0aGUgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcmVcbiAgICAgIC8vIGRlcmVmZXJlbmNlZCB2aWEgdGhlIG9yaWdpbmFsIHRhcmdldHMuXG4gICAgICBsZXQgcHJveHlUYXJnZXQgPSBPYmplY3QuY3JlYXRlKHRhcmdldCk7XG4gICAgICByZXR1cm4gbmV3IFByb3h5KHByb3h5VGFyZ2V0LCBoYW5kbGVycyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2Ygd3JhcHBlciBmdW5jdGlvbnMgZm9yIGFuIGV2ZW50IG9iamVjdCwgd2hpY2ggaGFuZGxlc1xuICAgICAqIHdyYXBwaW5nIG9mIGxpc3RlbmVyIGZ1bmN0aW9ucyB0aGF0IHRob3NlIG1lc3NhZ2VzIGFyZSBwYXNzZWQuXG4gICAgICpcbiAgICAgKiBBIHNpbmdsZSB3cmFwcGVyIGlzIGNyZWF0ZWQgZm9yIGVhY2ggbGlzdGVuZXIgZnVuY3Rpb24sIGFuZCBzdG9yZWQgaW4gYVxuICAgICAqIG1hcC4gU3Vic2VxdWVudCBjYWxscyB0byBgYWRkTGlzdGVuZXJgLCBgaGFzTGlzdGVuZXJgLCBvciBgcmVtb3ZlTGlzdGVuZXJgXG4gICAgICogcmV0cmlldmUgdGhlIG9yaWdpbmFsIHdyYXBwZXIsIHNvIHRoYXQgIGF0dGVtcHRzIHRvIHJlbW92ZSBhXG4gICAgICogcHJldmlvdXNseS1hZGRlZCBsaXN0ZW5lciB3b3JrIGFzIGV4cGVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEZWZhdWx0V2Vha01hcDxmdW5jdGlvbiwgZnVuY3Rpb24+fSB3cmFwcGVyTWFwXG4gICAgICogICAgICAgIEEgRGVmYXVsdFdlYWtNYXAgb2JqZWN0IHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyXG4gICAgICogICAgICAgIGZvciBhIGdpdmVuIGxpc3RlbmVyIGZ1bmN0aW9uIHdoZW4gb25lIGRvZXMgbm90IGV4aXN0LCBhbmQgcmV0cmlldmVcbiAgICAgKiAgICAgICAgYW4gZXhpc3Rpbmcgb25lIHdoZW4gaXQgZG9lcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgY29uc3Qgd3JhcEV2ZW50ID0gd3JhcHBlck1hcCA9PiAoe1xuICAgICAgYWRkTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lciwgLi4uYXJncykge1xuICAgICAgICB0YXJnZXQuYWRkTGlzdGVuZXIod3JhcHBlck1hcC5nZXQobGlzdGVuZXIpLCAuLi5hcmdzKTtcbiAgICAgIH0sXG5cbiAgICAgIGhhc0xpc3RlbmVyKHRhcmdldCwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldC5oYXNMaXN0ZW5lcih3cmFwcGVyTWFwLmdldChsaXN0ZW5lcikpO1xuICAgICAgfSxcblxuICAgICAgcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lcikge1xuICAgICAgICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIod3JhcHBlck1hcC5nZXQobGlzdGVuZXIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBvblJlcXVlc3RGaW5pc2hlZFdyYXBwZXJzID0gbmV3IERlZmF1bHRXZWFrTWFwKGxpc3RlbmVyID0+IHtcbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogV3JhcHMgYW4gb25SZXF1ZXN0RmluaXNoZWQgbGlzdGVuZXIgZnVuY3Rpb24gc28gdGhhdCBpdCB3aWxsIHJldHVybiBhXG4gICAgICAgKiBgZ2V0Q29udGVudCgpYCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgYFByb21pc2VgIHJhdGhlciB0aGFuIHVzaW5nIGFcbiAgICAgICAqIGNhbGxiYWNrIEFQSS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gICAgICAgKiAgICAgICAgVGhlIEhBUiBlbnRyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICAgKi9cbiAgICAgIHJldHVybiBmdW5jdGlvbiBvblJlcXVlc3RGaW5pc2hlZChyZXEpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZFJlcSA9IHdyYXBPYmplY3QocmVxLCB7fSAvKiB3cmFwcGVycyAqLywge1xuICAgICAgICAgIGdldENvbnRlbnQ6IHtcbiAgICAgICAgICAgIG1pbkFyZ3M6IDAsXG4gICAgICAgICAgICBtYXhBcmdzOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBsaXN0ZW5lcih3cmFwcGVkUmVxKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbk1lc3NhZ2VXcmFwcGVycyA9IG5ldyBEZWZhdWx0V2Vha01hcChsaXN0ZW5lciA9PiB7XG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFdyYXBzIGEgbWVzc2FnZSBsaXN0ZW5lciBmdW5jdGlvbiBzbyB0aGF0IGl0IG1heSBzZW5kIHJlc3BvbnNlcyBiYXNlZCBvblxuICAgICAgICogaXRzIHJldHVybiB2YWx1ZSwgcmF0aGVyIHRoYW4gYnkgcmV0dXJuaW5nIGEgc2VudGluZWwgdmFsdWUgYW5kIGNhbGxpbmcgYVxuICAgICAgICogY2FsbGJhY2suIElmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiByZXR1cm5zIGEgUHJvbWlzZSwgdGhlIHJlc3BvbnNlIGlzXG4gICAgICAgKiBzZW50IHdoZW4gdGhlIHByb21pc2UgZWl0aGVyIHJlc29sdmVzIG9yIHJlamVjdHMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHsqfSBtZXNzYWdlXG4gICAgICAgKiAgICAgICAgVGhlIG1lc3NhZ2Ugc2VudCBieSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjaGFubmVsLlxuICAgICAgICogQHBhcmFtIHtvYmplY3R9IHNlbmRlclxuICAgICAgICogICAgICAgIERldGFpbHMgYWJvdXQgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKil9IHNlbmRSZXNwb25zZVxuICAgICAgICogICAgICAgIEEgY2FsbGJhY2sgd2hpY2gsIHdoZW4gY2FsbGVkIHdpdGggYW4gYXJiaXRyYXJ5IGFyZ3VtZW50LCBzZW5kc1xuICAgICAgICogICAgICAgIHRoYXQgdmFsdWUgYXMgYSByZXNwb25zZS5cbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICogICAgICAgIFRydWUgaWYgdGhlIHdyYXBwZWQgbGlzdGVuZXIgcmV0dXJuZWQgYSBQcm9taXNlLCB3aGljaCB3aWxsIGxhdGVyXG4gICAgICAgKiAgICAgICAgeWllbGQgYSByZXNwb25zZS4gRmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAgICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gb25NZXNzYWdlKG1lc3NhZ2UsIHNlbmRlciwgc2VuZFJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkaWRDYWxsU2VuZFJlc3BvbnNlID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IHdyYXBwZWRTZW5kUmVzcG9uc2U7XG4gICAgICAgIGxldCBzZW5kUmVzcG9uc2VQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgd3JhcHBlZFNlbmRSZXNwb25zZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBkaWRDYWxsU2VuZFJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gbGlzdGVuZXIobWVzc2FnZSwgc2VuZGVyLCB3cmFwcGVkU2VuZFJlc3BvbnNlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUmVzdWx0VGhlbmFibGUgPSByZXN1bHQgIT09IHRydWUgJiYgaXNUaGVuYWJsZShyZXN1bHQpO1xuXG4gICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBkaWRuJ3QgcmV0dXJuZWQgdHJ1ZSBvciBhIFByb21pc2UsIG9yIGNhbGxlZFxuICAgICAgICAvLyB3cmFwcGVkU2VuZFJlc3BvbnNlIHN5bmNocm9ub3VzbHksIHdlIGNhbiBleGl0IGVhcmxpZXJcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSB3aWxsIGJlIG5vIHJlc3BvbnNlIHNlbnQgZnJvbSB0aGlzIGxpc3RlbmVyLlxuICAgICAgICBpZiAocmVzdWx0ICE9PSB0cnVlICYmICFpc1Jlc3VsdFRoZW5hYmxlICYmICFkaWRDYWxsU2VuZFJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBzbWFsbCBoZWxwZXIgdG8gc2VuZCB0aGUgbWVzc2FnZSBpZiB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgICAvLyBhbmQgYW4gZXJyb3IgaWYgdGhlIHByb21pc2UgcmVqZWN0cyAoYSB3cmFwcGVkIHNlbmRNZXNzYWdlIGhhc1xuICAgICAgICAvLyB0byB0cmFuc2xhdGUgdGhlIG1lc3NhZ2UgaW50byBhIHJlc29sdmVkIHByb21pc2Ugb3IgYSByZWplY3RlZFxuICAgICAgICAvLyBwcm9taXNlKS5cbiAgICAgICAgY29uc3Qgc2VuZFByb21pc2VkUmVzdWx0ID0gKHByb21pc2UpID0+IHtcbiAgICAgICAgICBwcm9taXNlLnRoZW4obXNnID0+IHtcbiAgICAgICAgICAgIC8vIHNlbmQgdGhlIG1lc3NhZ2UgdmFsdWUuXG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UobXNnKTtcbiAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAvLyBTZW5kIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgaWYgdGhlIHJlamVjdGVkIHZhbHVlXG4gICAgICAgICAgICAvLyBpcyBhbiBpbnN0YW5jZSBvZiBlcnJvciwgb3IgdGhlIG9iamVjdCBpdHNlbGYgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXNzYWdlID0gXCJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7XG4gICAgICAgICAgICAgIF9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXzogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAvLyBQcmludCBhbiBlcnJvciBvbiB0aGUgY29uc29sZSBpZiB1bmFibGUgdG8gc2VuZCB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNlbmQgb25NZXNzYWdlIHJlamVjdGVkIHJlcGx5XCIsIGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSWYgdGhlIGxpc3RlbmVyIHJldHVybmVkIGEgUHJvbWlzZSwgc2VuZCB0aGUgcmVzb2x2ZWQgdmFsdWUgYXMgYVxuICAgICAgICAvLyByZXN1bHQsIG90aGVyd2lzZSB3YWl0IHRoZSBwcm9taXNlIHJlbGF0ZWQgdG8gdGhlIHdyYXBwZWRTZW5kUmVzcG9uc2VcbiAgICAgICAgLy8gY2FsbGJhY2sgdG8gcmVzb2x2ZSBhbmQgc2VuZCBpdCBhcyBhIHJlc3BvbnNlLlxuICAgICAgICBpZiAoaXNSZXN1bHRUaGVuYWJsZSkge1xuICAgICAgICAgIHNlbmRQcm9taXNlZFJlc3VsdChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbmRQcm9taXNlZFJlc3VsdChzZW5kUmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExldCBDaHJvbWUga25vdyB0aGF0IHRoZSBsaXN0ZW5lciBpcyByZXBseWluZy5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgd3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2sgPSAoe3JlamVjdCwgcmVzb2x2ZX0sIHJlcGx5KSA9PiB7XG4gICAgICBpZiAoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAvLyBEZXRlY3Qgd2hlbiBub25lIG9mIHRoZSBsaXN0ZW5lcnMgcmVwbGllZCB0byB0aGUgc2VuZE1lc3NhZ2UgY2FsbCBhbmQgcmVzb2x2ZVxuICAgICAgICAvLyB0aGUgcHJvbWlzZSB0byB1bmRlZmluZWQgYXMgaW4gRmlyZWZveC5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbC9pc3N1ZXMvMTMwXG4gICAgICAgIGlmIChleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yLm1lc3NhZ2UgPT09IENIUk9NRV9TRU5EX01FU1NBR0VfQ0FMTEJBQ0tfTk9fUkVTUE9OU0VfTUVTU0FHRSkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IubWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlcGx5ICYmIHJlcGx5Ll9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXykge1xuICAgICAgICAvLyBDb252ZXJ0IGJhY2sgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGludG9cbiAgICAgICAgLy8gYW4gRXJyb3IgaW5zdGFuY2UuXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IocmVwbHkubWVzc2FnZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShyZXBseSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHdyYXBwZWRTZW5kTWVzc2FnZSA9IChuYW1lLCBtZXRhZGF0YSwgYXBpTmFtZXNwYWNlT2JqLCAuLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPCBtZXRhZGF0YS5taW5BcmdzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttZXRhZGF0YS5taW5BcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5taW5BcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA+IG1ldGFkYXRhLm1heEFyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0ICR7bWV0YWRhdGEubWF4QXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWF4QXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3cmFwcGVkQ2IgPSB3cmFwcGVkU2VuZE1lc3NhZ2VDYWxsYmFjay5iaW5kKG51bGwsIHtyZXNvbHZlLCByZWplY3R9KTtcbiAgICAgICAgYXJncy5wdXNoKHdyYXBwZWRDYik7XG4gICAgICAgIGFwaU5hbWVzcGFjZU9iai5zZW5kTWVzc2FnZSguLi5hcmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBzdGF0aWNXcmFwcGVycyA9IHtcbiAgICAgIGRldnRvb2xzOiB7XG4gICAgICAgIG5ldHdvcms6IHtcbiAgICAgICAgICBvblJlcXVlc3RGaW5pc2hlZDogd3JhcEV2ZW50KG9uUmVxdWVzdEZpbmlzaGVkV3JhcHBlcnMpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJ1bnRpbWU6IHtcbiAgICAgICAgb25NZXNzYWdlOiB3cmFwRXZlbnQob25NZXNzYWdlV3JhcHBlcnMpLFxuICAgICAgICBvbk1lc3NhZ2VFeHRlcm5hbDogd3JhcEV2ZW50KG9uTWVzc2FnZVdyYXBwZXJzKSxcbiAgICAgICAgc2VuZE1lc3NhZ2U6IHdyYXBwZWRTZW5kTWVzc2FnZS5iaW5kKG51bGwsIFwic2VuZE1lc3NhZ2VcIiwge21pbkFyZ3M6IDEsIG1heEFyZ3M6IDN9KSxcbiAgICAgIH0sXG4gICAgICB0YWJzOiB7XG4gICAgICAgIHNlbmRNZXNzYWdlOiB3cmFwcGVkU2VuZE1lc3NhZ2UuYmluZChudWxsLCBcInNlbmRNZXNzYWdlXCIsIHttaW5BcmdzOiAyLCBtYXhBcmdzOiAzfSksXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3Qgc2V0dGluZ01ldGFkYXRhID0ge1xuICAgICAgY2xlYXI6IHttaW5BcmdzOiAxLCBtYXhBcmdzOiAxfSxcbiAgICAgIGdldDoge21pbkFyZ3M6IDEsIG1heEFyZ3M6IDF9LFxuICAgICAgc2V0OiB7bWluQXJnczogMSwgbWF4QXJnczogMX0sXG4gICAgfTtcbiAgICBhcGlNZXRhZGF0YS5wcml2YWN5ID0ge1xuICAgICAgbmV0d29yazoge1wiKlwiOiBzZXR0aW5nTWV0YWRhdGF9LFxuICAgICAgc2VydmljZXM6IHtcIipcIjogc2V0dGluZ01ldGFkYXRhfSxcbiAgICAgIHdlYnNpdGVzOiB7XCIqXCI6IHNldHRpbmdNZXRhZGF0YX0sXG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwT2JqZWN0KGV4dGVuc2lvbkFQSXMsIHN0YXRpY1dyYXBwZXJzLCBhcGlNZXRhZGF0YSk7XG4gIH07XG5cbiAgLy8gVGhlIGJ1aWxkIHByb2Nlc3MgYWRkcyBhIFVNRCB3cmFwcGVyIGFyb3VuZCB0aGlzIGZpbGUsIHdoaWNoIG1ha2VzIHRoZVxuICAvLyBgbW9kdWxlYCB2YXJpYWJsZSBhdmFpbGFibGUuXG4gIG1vZHVsZS5leHBvcnRzID0gd3JhcEFQSXMoY2hyb21lKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsVGhpcy5icm93c2VyO1xufVxuIiwgIi8vIEhhbnpvIEJyb3dzZXIgRXh0ZW5zaW9uIC0gQ29udGVudCBTY3JpcHRcbi8vIENvbm5lY3RzIGNsaWNrZWQgZWxlbWVudHMgdG8gc291cmNlIGNvZGUgdmlhIHNvdXJjZS1tYXBzXG4vL1xuLy8gUG9seWZpbGwgTVVTVCBiZSB0aGUgZmlyc3QgaW1wb3J0IHNvIGFueSBzdWJzZXF1ZW50IGNvZGUgdGhhdCB0b3VjaGVzXG4vLyBgYnJvd3Nlci4qYCAodGhlIGNyb3NzLWJyb3dzZXIgQVBJIHN1cmZhY2UpIHNlZXMgdGhlIHdyYXBwZWQgUHJvbWlzZVxuLy8gQVBJIG9uIENocm9tZSB0b28uIE9uIG5hdGl2ZSBydW50aW1lcyAoRmlyZWZveCAvIFNhZmFyaSkgdGhlIGltcG9ydCBpc1xuLy8gYSBuby1vcC5cbmltcG9ydCAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VULFxuICBsb2FkSW5zcGVjdFNob3J0Y3V0LFxuICBtYXRjaGVzU2hvcnRjdXQsXG4gIFNUT1JBR0VfS0VZX0lOU1BFQ1QsXG4gIHR5cGUgU2hvcnRjdXQsXG59IGZyb20gJy4vc2hhcmVkL3Nob3J0Y3V0LmpzJztcblxuaW50ZXJmYWNlIFNvdXJjZUxvY2F0aW9uIHtcbiAgZmlsZTogc3RyaW5nO1xuICBsaW5lOiBudW1iZXI7XG4gIGNvbHVtbj86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEVsZW1lbnRTZWxlY3RlZEV2ZW50IHtcbiAgZXZlbnQ6ICdlbGVtZW50U2VsZWN0ZWQnO1xuICBmcmFtZXdvcms6IHN0cmluZyB8IG51bGw7XG4gIGRvbVBhdGg6IHN0cmluZztcbiAgc291cmNlPzogU291cmNlTG9jYXRpb247XG4gIGZhbGxiYWNrSWQ/OiBzdHJpbmc7XG59XG5cbmNsYXNzIEhhbnpvQ29udGVudFNjcmlwdCB7XG4gIC8vIENhY2hlIHRoZSBjb25maWd1cmVkIHNob3J0Y3V0IHNvIGV2ZXJ5IGNsaWNrL21vdXNlbW92ZSBkb2Vzbid0IGhpdFxuICAvLyBjaHJvbWUuc3RvcmFnZS4gUmVsb2FkZWQgZWFnZXJseSBvbiBzdG9yYWdlIGNoYW5nZSBzbyB0aGUgcG9wdXAnc1xuICAvLyByZWNvcmRlciB1cGRhdGVzIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5IChubyBwYWdlIHJlbG9hZCByZXF1aXJlZCkuXG4gIHByaXZhdGUgaW5zcGVjdFNob3J0Y3V0OiBTaG9ydGN1dCA9IHsgLi4uREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VUIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2FkU2hvcnRjdXQoKTtcbiAgICB0aGlzLndhdGNoU2hvcnRjdXQoKTtcbiAgICB0aGlzLnNldHVwQ2xpY2tIYW5kbGVyKCk7XG4gICAgdGhpcy5pbmplY3RIZWxwZXJzKCk7XG4gICAgdGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2hvcnRjdXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGNocm9tZS5zdG9yYWdlLmxvY2FsIGluIE1WMyByZXR1cm5zIGEgUHJvbWlzZS5cbiAgICAgIHRoaXMuaW5zcGVjdFNob3J0Y3V0ID0gYXdhaXQgbG9hZEluc3BlY3RTaG9ydGN1dChjaHJvbWUuc3RvcmFnZS5sb2NhbCBhcyBhbnkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5pbnNwZWN0U2hvcnRjdXQgPSB7IC4uLkRFRkFVTFRfSU5TUEVDVF9TSE9SVENVVCB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd2F0Y2hTaG9ydGN1dCgpIHtcbiAgICB0cnkge1xuICAgICAgY2hyb21lLnN0b3JhZ2Uub25DaGFuZ2VkLmFkZExpc3RlbmVyKChjaGFuZ2VzLCBhcmVhKSA9PiB7XG4gICAgICAgIGlmIChhcmVhICE9PSAnbG9jYWwnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGMgPSBjaGFuZ2VzW1NUT1JBR0VfS0VZX0lOU1BFQ1RdO1xuICAgICAgICBpZiAoIWMpIHJldHVybjtcbiAgICAgICAgaWYgKGMubmV3VmFsdWUgJiYgdHlwZW9mIGMubmV3VmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5pbnNwZWN0U2hvcnRjdXQgPSBjLm5ld1ZhbHVlIGFzIFNob3J0Y3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW5zcGVjdFNob3J0Y3V0ID0geyAuLi5ERUZBVUxUX0lOU1BFQ1RfU0hPUlRDVVQgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBhbGwgc3RvcmFnZSBBUElzIGltcGxlbWVudCBvbkNoYW5nZWQgKi8gfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENsaWNrSGFuZGxlcigpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoIW1hdGNoZXNTaG9ydGN1dChlLCB0aGlzLmluc3BlY3RTaG9ydGN1dCkpIHJldHVybjtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5leHRyYWN0U291cmNlTG9jYXRpb24oZWxlbWVudCk7XG4gICAgICBjb25zdCBkb21QYXRoID0gdGhpcy5nZXRET01QYXRoKGVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBldmVudDogRWxlbWVudFNlbGVjdGVkRXZlbnQgPSB7XG4gICAgICAgIGV2ZW50OiAnZWxlbWVudFNlbGVjdGVkJyxcbiAgICAgICAgZnJhbWV3b3JrOiB0aGlzLmRldGVjdEZyYW1ld29yaygpLFxuICAgICAgICBkb21QYXRoLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGZhbGxiYWNrSWQ6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLWlkJykgfHwgdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gUm91dGUgdGhyb3VnaCBiYWNrZ3JvdW5kIHNjcmlwdCAod29ya3Mgd2l0aCBib3RoIFpBUCBhbmQgbGVnYWN5IE1DUClcbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnZWxlbWVudFNlbGVjdGVkJywgZGF0YTogZXZlbnQgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTWVzc2FnZUhhbmRsZXJzKCkge1xuICAgIGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcigocmVxdWVzdCwgX3NlbmRlciwgc2VuZFJlc3BvbnNlKSA9PiB7XG4gICAgICBzd2l0Y2ggKHJlcXVlc3QuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2FpLmNvbnRyb2wuc3RhcnQnOlxuICAgICAgICAgIGFpT3ZlcmxheS5zaG93KHJlcXVlc3QudGFzayB8fCAnQUkgaXMgY29udHJvbGxpbmcgdGhpcyBwYWdlJyk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5zdG9wJzpcbiAgICAgICAgICBhaU92ZXJsYXkuaGlkZSgpO1xuICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2FpLmNvbnRyb2wuY3Vyc29yJzpcbiAgICAgICAgICBhaU92ZXJsYXkubW92ZUN1cnNvcihyZXF1ZXN0LngsIHJlcXVlc3QueSk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5oaWdobGlnaHQnOlxuICAgICAgICAgIGFpT3ZlcmxheS5oaWdobGlnaHQocmVxdWVzdC5zZWxlY3Rvcik7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5zdGF0dXMnOlxuICAgICAgICAgIGFpT3ZlcmxheS51cGRhdGVTdGF0dXMocmVxdWVzdC50ZXh0KTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkudG9nZ2xlJzpcbiAgICAgICAgICBpZiAocmVxdWVzdC5zaWRlID09PSAnbGVmdCcgfHwgcmVxdWVzdC5zaWRlID09PSAncmlnaHQnKSBwYWdlT3ZlcmxheS5zZXRTaWRlKHJlcXVlc3Quc2lkZSk7XG4gICAgICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3B1c2gnIHx8IHJlcXVlc3QubW9kZSA9PT0gJ292ZXJsYXknKSBwYWdlT3ZlcmxheS5zZXRNb2RlKHJlcXVlc3QubW9kZSk7XG4gICAgICAgICAgaWYgKHJlcXVlc3Qud2lkdGggPT09ICdjb21wYWN0JyB8fCByZXF1ZXN0LndpZHRoID09PSAnZGVmYXVsdCcgfHwgcmVxdWVzdC53aWR0aCA9PT0gJ3dpZGUnKSB7XG4gICAgICAgICAgICBwYWdlT3ZlcmxheS5zZXRXaWR0aChyZXF1ZXN0LndpZHRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBvcGVuOiBwYWdlT3ZlcmxheS50b2dnbGUoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnNob3cnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LnNpZGUgPT09ICdsZWZ0JyB8fCByZXF1ZXN0LnNpZGUgPT09ICdyaWdodCcpIHBhZ2VPdmVybGF5LnNldFNpZGUocmVxdWVzdC5zaWRlKTtcbiAgICAgICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAncHVzaCcgfHwgcmVxdWVzdC5tb2RlID09PSAnb3ZlcmxheScpIHBhZ2VPdmVybGF5LnNldE1vZGUocmVxdWVzdC5tb2RlKTtcbiAgICAgICAgICBpZiAocmVxdWVzdC53aWR0aCA9PT0gJ2NvbXBhY3QnIHx8IHJlcXVlc3Qud2lkdGggPT09ICdkZWZhdWx0JyB8fCByZXF1ZXN0LndpZHRoID09PSAnd2lkZScpIHtcbiAgICAgICAgICAgIHBhZ2VPdmVybGF5LnNldFdpZHRoKHJlcXVlc3Qud2lkdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlT3ZlcmxheS5zaG93KCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgb3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LmhpZGUnOlxuICAgICAgICAgIHBhZ2VPdmVybGF5LmhpZGUoKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCBvcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnN0YXR1cyc6XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBvcGVuOiBwYWdlT3ZlcmxheS5pc09wZW4oKSxcbiAgICAgICAgICAgIHNpZGU6IHBhZ2VPdmVybGF5LmdldFNpZGUoKSxcbiAgICAgICAgICAgIG1vZGU6IHBhZ2VPdmVybGF5LmdldE1vZGUoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnNldFNpZGUnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LnNpZGUgPT09ICdsZWZ0JyB8fCByZXF1ZXN0LnNpZGUgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHBhZ2VPdmVybGF5LnNldFNpZGUocmVxdWVzdC5zaWRlKTtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUsIHNpZGU6IHJlcXVlc3Quc2lkZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnc2lkZSBtdXN0IGJlIFwibGVmdFwiIG9yIFwicmlnaHRcIicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0TW9kZSc6XG4gICAgICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3B1c2gnIHx8IHJlcXVlc3QubW9kZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgICAgICBwYWdlT3ZlcmxheS5zZXRNb2RlKHJlcXVlc3QubW9kZSk7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCBtb2RlOiByZXF1ZXN0Lm1vZGUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ21vZGUgbXVzdCBiZSBcInB1c2hcIiBvciBcIm92ZXJsYXlcIicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0V2lkdGgnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LndpZHRoID09PSAnY29tcGFjdCcgfHwgcmVxdWVzdC53aWR0aCA9PT0gJ2RlZmF1bHQnIHx8IHJlcXVlc3Qud2lkdGggPT09ICd3aWRlJykge1xuICAgICAgICAgICAgcGFnZU92ZXJsYXkuc2V0V2lkdGgocmVxdWVzdC53aWR0aCk7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCB3aWR0aDogcmVxdWVzdC53aWR0aCB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnd2lkdGggbXVzdCBiZSBjb21wYWN0fGRlZmF1bHR8d2lkZScgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0RW5hYmxlZCc6XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmVuYWJsZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFnZU92ZXJsYXkuc2V0RW5hYmxlZChyZXF1ZXN0LmVuYWJsZWQpO1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgZW5hYmxlZDogcmVxdWVzdC5lbmFibGVkIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdlbmFibGVkIG11c3QgYmUgYm9vbGVhbicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIC0tLSBQb3B1cCBUb29sIEFjdGlvbnMgLS0tXG4gICAgICAgIGNhc2UgJ3Rvb2wucGlja2VyLnN0YXJ0JzpcbiAgICAgICAgICBlbGVtZW50UGlja2VyLnN0YXJ0KCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5waWNrZXIuc3RvcCc6XG4gICAgICAgICAgZWxlbWVudFBpY2tlci5zdG9wKCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5wYWdlaW5mbyc6XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgaW5mbzogZ2F0aGVyUGFnZUluZm8oKSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5jb25zb2xlLnN0YXJ0JzpcbiAgICAgICAgICBpbmxpbmVDb25zb2xlLnNob3coKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICd0b29sLmNvbnNvbGUuaGlkZSc6XG4gICAgICAgICAgaW5saW5lQ29uc29sZS5oaWRlKCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGFiIGZpbGVzeXN0ZW0gc3VwcG9ydFxuICAgICAgaWYgKHJlcXVlc3QuYWN0aW9uID09PSAnZ2V0Q29udGVudCcpIHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKHsgY29udGVudDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Py5vdXRlckhUTUwgfHwgJycgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdC5hY3Rpb24gPT09ICdzZXRDb250ZW50Jykge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3QuY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgZG9jdW1lbnQud3JpdGUocmVxdWVzdC5jb250ZW50KTtcbiAgICAgICAgICBkb2N1bWVudC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTb3VyY2VMb2NhdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCk6IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmcmFtZXdvcmsgPSB0aGlzLmRldGVjdEZyYW1ld29yaygpO1xuXG4gICAgc3dpdGNoIChmcmFtZXdvcmspIHtcbiAgICAgIGNhc2UgJ3JlYWN0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFJlYWN0U291cmNlKGVsZW1lbnQpO1xuICAgICAgY2FzZSAndnVlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFZ1ZVNvdXJjZShlbGVtZW50KTtcbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RTdmVsdGVTb3VyY2UoZWxlbWVudCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFJlYWN0U291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhvb2sgPSAod2luZG93IGFzIGFueSkuX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICAgIGlmICghaG9vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGZpYmVyID0gdGhpcy5maW5kUmVhY3RGaWJlcihlbGVtZW50KTtcbiAgICBpZiAoIWZpYmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc291cmNlID0gZmliZXIuX2RlYnVnU291cmNlIHx8IGZpYmVyLnBlbmRpbmdQcm9wcz8uX19zb3VyY2UgfHwgZmliZXIubWVtb2l6ZWRQcm9wcz8uX19zb3VyY2U7XG5cbiAgICBpZiAoc291cmNlICYmIHNvdXJjZS5maWxlTmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZTogc291cmNlLmZpbGVOYW1lLFxuICAgICAgICBsaW5lOiBzb3VyY2UubGluZU51bWJlcixcbiAgICAgICAgY29sdW1uOiBzb3VyY2UuY29sdW1uTnVtYmVyLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUmVhY3RGaWJlcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSB7XG4gICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZWxlbWVudCkuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5zdGFydHNXaXRoKCdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnKSB8fCBjYW5kaWRhdGUuc3RhcnRzV2l0aCgnX19yZWFjdEZpYmVyJCcpLFxuICAgICk7XG4gICAgcmV0dXJuIGtleSA/IChlbGVtZW50IGFzIGFueSlba2V5XSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RWdWVTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBTb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaG9vayA9ICh3aW5kb3cgYXMgYW55KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICAgIGlmICghaG9vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGxldCBpbnN0YW5jZSA9IChlbGVtZW50IGFzIGFueSkuX192dWVQYXJlbnRDb21wb25lbnQ7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSAoZWxlbWVudCBhcyBhbnkpLl9fdnVlX187XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlPy50eXBlPy5fX2ZpbGUpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uOiBTb3VyY2VMb2NhdGlvbiA9IHtcbiAgICAgICAgZmlsZTogaW5zdGFuY2UudHlwZS5fX2ZpbGUsXG4gICAgICAgIGxpbmU6IDEsXG4gICAgICB9O1xuXG4gICAgICBpZiAoaW5zdGFuY2Uudm5vZGU/LmxvYykge1xuICAgICAgICBsb2NhdGlvbi5saW5lID0gaW5zdGFuY2Uudm5vZGUubG9jLnN0YXJ0LmxpbmU7XG4gICAgICAgIGxvY2F0aW9uLmNvbHVtbiA9IGluc3RhbmNlLnZub2RlLmxvYy5zdGFydC5jb2x1bW47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0U3ZlbHRlU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IChlbGVtZW50IGFzIGFueSkuX19zdmVsdGVfY29tcG9uZW50O1xuICAgIGlmIChjb21wb25lbnQ/LiQkPy5jdHg/LiQkX2xvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50LiQkLmN0eC4kJF9sb2NhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0RnJhbWV3b3JrKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICgod2luZG93IGFzIGFueSkuX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fKSByZXR1cm4gJ3JlYWN0JztcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIHJldHVybiAndnVlJztcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fc3ZlbHRlKSByZXR1cm4gJ3N2ZWx0ZSc7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldERPTVBhdGgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cnJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQ7XG5cbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICBsZXQgc2VsZWN0b3IgPSBjdXJyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGN1cnJlbnQuaWQpIHtcbiAgICAgICAgc2VsZWN0b3IgKz0gYCMke2N1cnJlbnQuaWR9YDtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5jbGFzc05hbWUpIHtcbiAgICAgICAgc2VsZWN0b3IgKz0gYC4ke2N1cnJlbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykuam9pbignLicpfWA7XG4gICAgICB9XG5cbiAgICAgIHBhdGgudW5zaGlmdChzZWxlY3Rvcik7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoLmpvaW4oJyA+ICcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3RIZWxwZXJzKCkge1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIFtkYXRhLWhhbnpvLWhvdmVyXSB7XG4gICAgICAgIG91dGxpbmU6IDJweCBkYXNoZWQgI2ZmNmI2YiAhaW1wb3J0YW50O1xuICAgICAgICBvdXRsaW5lLW9mZnNldDogMnB4ICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgYDtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIChlKSA9PiB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1oYW56by1ob3Zlcl0nKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaGFuem8taG92ZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBtb3VzZW1vdmUgZ2l2ZXMgdGhlIHNhbWUgbW9kaWZpZXIgZmxhZ3MgYXMgY2xpY2ssIHNvIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCBpbnNwZWN0IHNob3J0Y3V0IGdvdmVybnMgdGhlIGhvdmVyIG91dGxpbmUgdG9vLlxuICAgICAgaWYgKG1hdGNoZXNTaG9ydGN1dChlLCB0aGlzLmluc3BlY3RTaG9ydGN1dCkgJiYgZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBlLnRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuem8taG92ZXInLCAndHJ1ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBSSBDb250cm9sIE92ZXJsYXkgXHUyMDE0IHRha2VvdmVyIHZpc3VhbCBmZWVkYmFjayArIHVzZXIgaW50ZXJhY3Rpb24gbG9ja1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgYWlPdmVybGF5ID0gKCgpID0+IHtcbiAgbGV0IG92ZXJsYXk6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBjdXJzb3I6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdGF0dXNFbDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGNhbmNlbEJ0bjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGhpZ2hsaWdodEVsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgdHJhaWxOb2RlczogSFRNTERpdkVsZW1lbnRbXSA9IFtdO1xuICBsZXQgaW50ZXJhY3Rpb25CbG9ja0FjdGl2ZSA9IGZhbHNlO1xuXG4gIGNvbnN0IE9WRVJMQVlfSUQgPSAnaGFuem8tYWktb3ZlcmxheSc7XG4gIGNvbnN0IFNUWUxFU19JRCA9ICdoYW56by1haS1vdmVybGF5LXN0eWxlcyc7XG4gIGNvbnN0IEJMT0NLRURfRVZFTlRTID0gW1xuICAgICdjbGljaycsICdkYmxjbGljaycsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdjb250ZXh0bWVudScsXG4gICAgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJ1cCcsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcsICd3aGVlbCcsXG4gICAgJ2tleWRvd24nLCAna2V5dXAnLCAna2V5cHJlc3MnLFxuICBdO1xuXG4gIGZ1bmN0aW9uIGluamVjdFN0eWxlcygpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU1RZTEVTX0lEKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLmlkID0gU1RZTEVTX0lEO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgICAgLyogLS0tLSBPdmVybGF5IGJhY2tkcm9wIC0tLS0gKi9cbiAgICAgICMke09WRVJMQVlfSUR9IHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoOTB2dyA5MHZoIGF0IDE1JSA4JSwgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMTApLCB0cmFuc3BhcmVudCA1NSUpLFxuICAgICAgICAgIHJhZGlhbC1ncmFkaWVudCg2NXZ3IDY1dmggYXQgODQlIDgyJSwgcmdiYSg5OSwgMTAyLCAyNDEsIDAuMTApLCB0cmFuc3BhcmVudCA2MCUpLFxuICAgICAgICAgIHJnYmEoMiwgNCwgMTAsIDAuNDIpO1xuICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMS41cHgpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICB9XG4gICAgICAjJHtPVkVSTEFZX0lEfS5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgLyogLS0tLSBQdWxzaW5nIGN5YW4gZ2xvdyBjdXJzb3IgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLWN1cnNvciB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYm9yZGVyOiAycHggc29saWQgcmdiYSg2LCAxODIsIDIxMiwgMC45NSk7XG4gICAgICAgIGJveC1zaGFkb3c6XG4gICAgICAgICAgMCAwIDhweCAycHggcmdiYSg2LCAxODIsIDIxMiwgMC40NSksXG4gICAgICAgICAgMCAwIDI0cHggNnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuMTgpO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlLW91dCwgdG9wIDAuMThzIGVhc2Utb3V0O1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLWN1cnNvci1wdWxzZSAxLjZzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLWN1cnNvci5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlLW91dCwgdG9wIDAuMThzIGVhc2Utb3V0LCBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIGhhbnpvLWN1cnNvci1wdWxzZSB7XG4gICAgICAgIDAlLCAxMDAlIHtcbiAgICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgICAgMCAwIDhweCAycHggcmdiYSg2LCAxODIsIDIxMiwgMC40NSksXG4gICAgICAgICAgICAwIDAgMjRweCA2cHggcmdiYSg2LCAxODIsIDIxMiwgMC4xOCk7XG4gICAgICAgIH1cbiAgICAgICAgNTAlIHtcbiAgICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgICAgMCAwIDE0cHggNHB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuNjUpLFxuICAgICAgICAgICAgMCAwIDM2cHggMTBweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjI4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIEN1cnNvciB0cmFpbCAtLS0tICovXG4gICAgICAuaGFuem8tY3Vyc29yLXRyYWlsIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB3aWR0aDogNnB4O1xuICAgICAgICBoZWlnaHQ6IDZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDYsIDE4MiwgMjEyLCAwLjcpO1xuICAgICAgICB6LWluZGV4OiAyMTQ3NDgzNjQ2O1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIGFuaW1hdGlvbjogaGFuem8tdHJhaWwtZmFkZSAwLjRzIGVhc2Utb3V0IGZvcndhcmRzO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by10cmFpbC1mYWRlIHtcbiAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDAuNzsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMSk7IH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgwLjE1KTsgfVxuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIFN0YXR1cyBiYW5uZXIgKHRvcCBjZW50ZXIgcGlsbCkgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLXN0YXR1cyB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgdG9wOiAxNnB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBtYXgtd2lkdGg6IDkwdnc7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg4LCAxMiwgMjAsIDAuOTQpLCByZ2JhKDEwLCAxNiwgMjQsIDAuOTYpKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMjYpO1xuICAgICAgICBjb2xvcjogI2YzZjRmNjtcbiAgICAgICAgZm9udDogMTNweC8xLjQgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmO1xuICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgIDAgMTBweCAzNnB4IHJnYmEoMCwgMCwgMCwgMC40NiksXG4gICAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG4gICAgICAuaGFuem8tYWktc3RhdHVzOjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBpbnNldDogLTJweCBhdXRvIC0ycHggLTIwJTtcbiAgICAgICAgd2lkdGg6IDQwJTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKC0xOGRlZyk7XG4gICAgICAgIGFuaW1hdGlvbjogaGFuem8tc3RhdHVzLXNoZWVuIDMuNnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1zdGF0dXMtc2hlZW4ge1xuICAgICAgICAwJSwgNjglIHsgbGVmdDogLTMwJTsgb3BhY2l0eTogMDsgfVxuICAgICAgICA3MiUgeyBvcGFjaXR5OiAwLjQ7IH1cbiAgICAgICAgMTAwJSB7IGxlZnQ6IDEzMCU7IG9wYWNpdHk6IDA7IH1cbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1zdGF0dXMgPiAqIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLXN0YXR1cy5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tYnJhbmQtYnViYmxlIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIG1pbi13aWR0aDogMzBweDtcbiAgICAgICAgcGFkZGluZzogMCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4yNXB4O1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBjb2xvcjogI2UwZjJmZTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxNCwgMTE2LCAxNDQsIDAuOTUpLCByZ2JhKDE1LCAyMywgNDIsIDAuOTUpKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMzUpO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tYWktc3RhdHVzIC5oYW56by1wdWxzZS1kb3Qge1xuICAgICAgICB3aWR0aDogOHB4O1xuICAgICAgICBoZWlnaHQ6IDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjMDZiNmQ0O1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLWRvdC1wdWxzZSAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1kb3QtcHVsc2Uge1xuICAgICAgICAwJSwgMTAwJSB7IG9wYWNpdHk6IDE7IH1cbiAgICAgICAgNTAlIHsgb3BhY2l0eTogMC40OyB9XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLWxhYmVsIHtcbiAgICAgICAgbWF4LXdpZHRoOiA0NnZ3O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tZG90czo6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgYW5pbWF0aW9uOiBoYW56by1hbmltYXRlZC1kb3RzIDEuNXMgc3RlcHMoNCkgaW5maW5pdGU7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIGhhbnpvLWFuaW1hdGVkLWRvdHMge1xuICAgICAgICAwJSB7IGNvbnRlbnQ6ICcnOyB9XG4gICAgICAgIDI1JSB7IGNvbnRlbnQ6ICcuJzsgfVxuICAgICAgICA1MCUgeyBjb250ZW50OiAnLi4nOyB9XG4gICAgICAgIDc1JSB7IGNvbnRlbnQ6ICcuLi4nOyB9XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLXN0b3AtYnRuIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTtcbiAgICAgICAgY29sb3I6ICNmOGZhZmM7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIHBhZGRpbmc6IDRweCAxMnB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cywgYm9yZGVyLWNvbG9yIDAuMTVzO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tc3RvcC1idG46aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgMzgsIDM4LCAwLjI4KTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuNik7XG4gICAgICB9XG5cbiAgICAgIC8qIC0tLS0gXCJUYWtlIEJhY2sgQ29udHJvbFwiIGJ1dHRvbiAoYm90dG9tLXJpZ2h0KSAtLS0tICovXG4gICAgICAuaGFuem8tYWktY2FuY2VsIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDI0cHg7XG4gICAgICAgIHJpZ2h0OiAyNHB4O1xuICAgICAgICB6LWluZGV4OiAyMTQ3NDgzNjQ3O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDI0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMTgsIDI0LCAwLjk1KTtcbiAgICAgICAgY29sb3I6ICNmM2Y0ZjY7XG4gICAgICAgIGZvbnQ6IDYwMCAxNHB4LzEuNCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2UsIGJhY2tncm91bmQgMC4xNXM7XG4gICAgICB9XG4gICAgICAuaGFuem8tYWktY2FuY2VsLmhhbnpvLXZpc2libGUge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLWNhbmNlbDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjIwLCAzOCwgMzgsIDAuMzUpO1xuICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAzOCwgMzgsIDAuNSk7XG4gICAgICB9XG5cbiAgICAgIC8qIC0tLS0gRWxlbWVudCBoaWdobGlnaHQgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLWhpZ2hsaWdodCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoNiwgMTgyLCAyMTIsIDAuODUpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjE1KTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE1cywgdG9wIDAuMTVzLCB3aWR0aCAwLjE1cywgaGVpZ2h0IDAuMTVzO1xuICAgICAgfVxuICAgIGA7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc092ZXJsYXlFbGVtZW50KHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gISEoXG4gICAgICBvdmVybGF5Py5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICBzdGF0dXNFbD8uY29udGFpbnModGFyZ2V0KSB8fFxuICAgICAgY2FuY2VsQnRuPy5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICBjdXJzb3I/LmNvbnRhaW5zKHRhcmdldCkgfHxcbiAgICAgIGhpZ2hsaWdodEVsPy5jb250YWlucyh0YXJnZXQpXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJsb2NrSW50ZXJhY3Rpb24oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFpbnRlcmFjdGlvbkJsb2NrQWN0aXZlKSByZXR1cm47XG5cbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnYWkuY29udHJvbC5jYW5jZWwnIH0pO1xuICAgICAgaGlkZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc092ZXJsYXlFbGVtZW50KGV2ZW50LnRhcmdldCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRJbnRlcmFjdGlvbkJsb2NrKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpbnRlcmFjdGlvbkJsb2NrQWN0aXZlID09PSBhY3RpdmUpIHJldHVybjtcblxuICAgIGludGVyYWN0aW9uQmxvY2tBY3RpdmUgPSBhY3RpdmU7XG4gICAgZm9yIChjb25zdCBldmVudE5hbWUgb2YgQkxPQ0tFRF9FVkVOVFMpIHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGJsb2NrSW50ZXJhY3Rpb24sIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGJsb2NrSW50ZXJhY3Rpb24sIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3codGFzazogc3RyaW5nKSB7XG4gICAgaWYgKG92ZXJsYXkpIGhpZGUoKTtcblxuICAgIGluamVjdFN0eWxlcygpO1xuICAgIHNldEludGVyYWN0aW9uQmxvY2sodHJ1ZSk7XG5cbiAgICAvLyBCYWNrZHJvcFxuICAgIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBvdmVybGF5LmlkID0gT1ZFUkxBWV9JRDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuXG4gICAgLy8gQ3Vyc29yXG4gICAgY3Vyc29yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY3Vyc29yLmNsYXNzTmFtZSA9ICdoYW56by1haS1jdXJzb3InO1xuICAgIGN1cnNvci5zdHlsZS5sZWZ0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLyAyfXB4YDtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC8gMn1weGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjdXJzb3IpO1xuXG4gICAgLy8gU3RhdHVzIGJhbm5lclxuICAgIHN0YXR1c0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ2hhbnpvLWFpLXN0YXR1cyc7XG4gICAgc3RhdHVzRWwuaW5uZXJIVE1MID0gYFxuICAgICAgPHNwYW4gY2xhc3M9XCJoYW56by1icmFuZC1idWJibGVcIj5BSTwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wdWxzZS1kb3RcIj48L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaGFuem8tbGFiZWxcIj4ke2VzY2FwZUh0bWwodGFzayB8fCAnSGFuem8gQUkgaXMgY29udHJvbGxpbmcgdGhpcyB0YWInKX08L3NwYW4+PHNwYW4gY2xhc3M9XCJoYW56by1kb3RzXCI+PC9zcGFuPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLXN0b3AtYnRuXCI+U3RvcDwvYnV0dG9uPlxuICAgIGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdGF0dXNFbCk7XG5cbiAgICBzdGF0dXNFbC5xdWVyeVNlbGVjdG9yKCcuaGFuem8tc3RvcC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2FpLmNvbnRyb2wuY2FuY2VsJyB9KTtcbiAgICAgIGhpZGUoKTtcbiAgICB9KTtcblxuICAgIC8vIFwiVGFrZSBCYWNrIENvbnRyb2xcIiBidXR0b25cbiAgICBjYW5jZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBjYW5jZWxCdG4uY2xhc3NOYW1lID0gJ2hhbnpvLWFpLWNhbmNlbCc7XG4gICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ1Rha2UgQmFjayBDb250cm9sJztcbiAgICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2FpLmNvbnRyb2wuY2FuY2VsJyB9KTtcbiAgICAgIGhpZGUoKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7XG5cbiAgICAvLyBGYWRlIGluIChuZXh0IGZyYW1lIHNvIHRoZSB0cmFuc2l0aW9uIHRyaWdnZXJzKVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBvdmVybGF5Py5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgICBjdXJzb3I/LmNsYXNzTGlzdC5hZGQoJ2hhbnpvLXZpc2libGUnKTtcbiAgICAgIHN0YXR1c0VsPy5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgICBjYW5jZWxCdG4/LmNsYXNzTGlzdC5hZGQoJ2hhbnpvLXZpc2libGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgLy8gRmFkZSBvdXRcbiAgICBvdmVybGF5Py5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG4gICAgY3Vyc29yPy5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG4gICAgc3RhdHVzRWw/LmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLXZpc2libGUnKTtcbiAgICBjYW5jZWxCdG4/LmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLXZpc2libGUnKTtcblxuICAgIC8vIFJlbW92ZSBhZnRlciB0cmFuc2l0aW9uXG4gICAgY29uc3QgcmVmcyA9IHsgb3ZlcmxheSwgY3Vyc29yLCBzdGF0dXNFbCwgY2FuY2VsQnRuLCBoaWdobGlnaHRFbCB9O1xuICAgIGNvbnN0IHRyYWlscyA9IFsuLi50cmFpbE5vZGVzXTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVmcy5vdmVybGF5Py5yZW1vdmUoKTtcbiAgICAgIHJlZnMuY3Vyc29yPy5yZW1vdmUoKTtcbiAgICAgIHJlZnMuc3RhdHVzRWw/LnJlbW92ZSgpO1xuICAgICAgcmVmcy5jYW5jZWxCdG4/LnJlbW92ZSgpO1xuICAgICAgcmVmcy5oaWdobGlnaHRFbD8ucmVtb3ZlKCk7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdHJhaWxzKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSwgMzIwKTtcblxuICAgIHNldEludGVyYWN0aW9uQmxvY2soZmFsc2UpO1xuXG4gICAgb3ZlcmxheSA9IG51bGw7XG4gICAgY3Vyc29yID0gbnVsbDtcbiAgICBzdGF0dXNFbCA9IG51bGw7XG4gICAgY2FuY2VsQnRuID0gbnVsbDtcbiAgICBoaWdobGlnaHRFbCA9IG51bGw7XG4gICAgdHJhaWxOb2RlcyA9IFtdO1xuICB9XG5cbiAgZnVuY3Rpb24gbW92ZUN1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGlmICghY3Vyc29yKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGFtcGVkWCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCBOdW1iZXIuaXNGaW5pdGUoeCkgPyB4IDogMCkpO1xuICAgIGNvbnN0IGNsYW1wZWRZID0gTWF0aC5tYXgoMCwgTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogMCkpO1xuXG4gICAgLy8gVHJhaWwgZG90XG4gICAgY29uc3QgdHJhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0cmFpbC5jbGFzc05hbWUgPSAnaGFuem8tY3Vyc29yLXRyYWlsJztcbiAgICB0cmFpbC5zdHlsZS5sZWZ0ID0gYCR7Y2xhbXBlZFh9cHhgO1xuICAgIHRyYWlsLnN0eWxlLnRvcCA9IGAke2NsYW1wZWRZfXB4YDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRyYWlsKTtcbiAgICB0cmFpbE5vZGVzLnB1c2godHJhaWwpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0cmFpbC5yZW1vdmUoKTtcbiAgICAgIHRyYWlsTm9kZXMgPSB0cmFpbE5vZGVzLmZpbHRlcigobm9kZSkgPT4gbm9kZSAhPT0gdHJhaWwpO1xuICAgIH0sIDQwMCk7XG5cbiAgICB3aGlsZSAodHJhaWxOb2Rlcy5sZW5ndGggPiAxMCkge1xuICAgICAgdHJhaWxOb2Rlcy5zaGlmdCgpPy5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBjdXJzb3Iuc3R5bGUubGVmdCA9IGAke2NsYW1wZWRYfXB4YDtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gYCR7Y2xhbXBlZFl9cHhgO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0KHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICBoaWdobGlnaHRFbD8ucmVtb3ZlKCk7XG4gICAgaGlnaGxpZ2h0RWwgPSBudWxsO1xuXG4gICAgaWYgKCFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHJlY3Qud2lkdGggPT09IDAgJiYgcmVjdC5oZWlnaHQgPT09IDApIHJldHVybjtcblxuICAgICAgaGlnaGxpZ2h0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhpZ2hsaWdodEVsLmNsYXNzTmFtZSA9ICdoYW56by1haS1oaWdobGlnaHQnO1xuICAgICAgaGlnaGxpZ2h0RWwuc3R5bGUubGVmdCA9IGAke01hdGgubWF4KDAsIHJlY3QubGVmdCAtIDQpfXB4YDtcbiAgICAgIGhpZ2hsaWdodEVsLnN0eWxlLnRvcCA9IGAke01hdGgubWF4KDAsIHJlY3QudG9wIC0gNCl9cHhgO1xuICAgICAgaGlnaGxpZ2h0RWwuc3R5bGUud2lkdGggPSBgJHtyZWN0LndpZHRoICsgOH1weGA7XG4gICAgICBoaWdobGlnaHRFbC5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodCArIDh9cHhgO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoaWdobGlnaHRFbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKHRleHQ6IHN0cmluZykge1xuICAgIGlmICghc3RhdHVzRWwpIHJldHVybjtcblxuICAgIGNvbnN0IGxhYmVsID0gc3RhdHVzRWwucXVlcnlTZWxlY3RvcignLmhhbnpvLWxhYmVsJyk7XG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHRleHQgfHwgJ0hhbnpvIEFJIGlzIGNvbnRyb2xsaW5nIHRoaXMgdGFiJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIHJldHVybiB7IHNob3csIGhpZGUsIG1vdmVDdXJzb3IsIGhpZ2hsaWdodCwgdXBkYXRlU3RhdHVzIH07XG59KSgpO1xuXG50eXBlIE92ZXJsYXlDaGF0Um9sZSA9ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ3N5c3RlbSc7XG5cbmludGVyZmFjZSBPdmVybGF5Q2hhdE1lc3NhZ2Uge1xuICByb2xlOiBPdmVybGF5Q2hhdFJvbGU7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE92ZXJsYXlFbGVtZW50Q29udGV4dCB7XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIHRhZzogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGh0bWw6IHN0cmluZztcbn1cblxudHlwZSBPdmVybGF5TW9kZSA9ICdvdmVybGF5JyB8ICdwdXNoJztcbnR5cGUgT3ZlcmxheVdpZHRoID0gJ2NvbXBhY3QnIHwgJ2RlZmF1bHQnIHwgJ3dpZGUnO1xuXG5jb25zdCBPVkVSTEFZX1dJRFRIX1BYOiBSZWNvcmQ8T3ZlcmxheVdpZHRoLCBudW1iZXI+ID0ge1xuICBjb21wYWN0OiAzMjAsXG4gIGRlZmF1bHQ6IDQyMCxcbiAgd2lkZTogNTYwLFxufTtcblxuY2xhc3MgSGFuem9QYWdlT3ZlcmxheSB7XG4gIHByaXZhdGUgbW91bnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgc2lkZTogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdyaWdodCc7XG4gIHByaXZhdGUgbW9kZTogT3ZlcmxheU1vZGUgPSAnb3ZlcmxheSc7XG4gIHByaXZhdGUgd2lkdGg6IE92ZXJsYXlXaWR0aCA9ICdkZWZhdWx0JztcbiAgcHJpdmF0ZSBzZW5kaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgd2F0Y2hNb2RlID0gZmFsc2U7XG4gIHByaXZhdGUgZWRpdE1vZGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb2RlbHNMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtZXNzYWdlczogT3ZlcmxheUNoYXRNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZENvbnRleHQ6IE92ZXJsYXlFbGVtZW50Q29udGV4dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVkaXRpbmdFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcm9vdDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXVuY2hlcjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwYW5lbDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlc0VsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlucHV0RWw6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZW5kQnRuOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1vZGVsRWw6IEhUTUxTZWxlY3RFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29udGV4dEVsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdhdGNoQnRuOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVkaXRCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzRWw6IEhUTUxTcGFuRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhpZ2hsaWdodEJveDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmluamVjdFN0eWxlcygpO1xuICAgIHRoaXMubW91bnQoKTtcbiAgICB0aGlzLmJpbmRHbG9iYWxFdmVudHMoKTtcbiAgICB0aGlzLnJlc3RvcmVQcmVmcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUHJlZnMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNzID0gKHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyA/IGJyb3dzZXIgOiAoY2hyb21lIGFzIGFueSkpPy5zdG9yYWdlPy5zeW5jO1xuICAgICAgaWYgKCFzcz8uZ2V0KSByZXR1cm47XG4gICAgICBjb25zdCBwcm9taXNlZCA9IHNzLmdldChbJ292ZXJsYXlTaWRlJywgJ292ZXJsYXlNb2RlJywgJ292ZXJsYXlXaWR0aCddKTtcbiAgICAgIGNvbnN0IGFwcGx5ID0gKHY6IGFueSkgPT4ge1xuICAgICAgICBpZiAodj8ub3ZlcmxheVNpZGUgPT09ICdsZWZ0JyB8fCB2Py5vdmVybGF5U2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRoaXMuc2lkZSA9IHYub3ZlcmxheVNpZGU7XG4gICAgICAgICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2lkZScsIHRoaXMuc2lkZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHY/Lm92ZXJsYXlNb2RlID09PSAncHVzaCcgfHwgdj8ub3ZlcmxheU1vZGUgPT09ICdvdmVybGF5Jykge1xuICAgICAgICAgIHRoaXMubW9kZSA9IHYub3ZlcmxheU1vZGU7XG4gICAgICAgICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZScsIHRoaXMubW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ2NvbXBhY3QnIHx8IHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ2RlZmF1bHQnIHx8IHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ3dpZGUnKSB7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHYub3ZlcmxheVdpZHRoO1xuICAgICAgICAgIHRoaXMuYXBwbHlXaWR0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgICB9O1xuICAgICAgaWYgKHByb21pc2VkICYmIHR5cGVvZiBwcm9taXNlZC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb21pc2VkLnRoZW4oYXBwbHkpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNzLmdldChbJ292ZXJsYXlTaWRlJywgJ292ZXJsYXlNb2RlJywgJ292ZXJsYXlXaWR0aCddLCBhcHBseSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7IC8qIHN0b3JhZ2UgbWF5IGJlIHVuYXZhaWxhYmxlICovIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlXaWR0aCgpOiB2b2lkIHtcbiAgICBjb25zdCBweCA9IE9WRVJMQVlfV0lEVEhfUFhbdGhpcy53aWR0aF0gPz8gT1ZFUkxBWV9XSURUSF9QWC5kZWZhdWx0O1xuICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgIHRoaXMucm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1oYW56by1vdmVybGF5LXdpZHRoJywgYCR7cHh9cHhgKTtcbiAgICAgIHRoaXMucm9vdC5zdHlsZS53aWR0aCA9IGBtaW4oJHtweH1weCwgMTAwdncpYDtcbiAgICB9XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWhhbnpvLW92ZXJsYXktd2lkdGgnLCBgJHtweH1weGApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVB1c2hJZk9wZW4oKTogdm9pZCB7XG4gICAgY29uc3QgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAvLyBBbHdheXMgc3RyaXAgZmlyc3Qgc28gd2UgbmV2ZXIgc3RhY2sgbWFyZ2lucy5cbiAgICBodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLW92ZXJsYXktcHVzaCcsICdoYW56by1vdmVybGF5LXB1c2gtbGVmdCcsICdoYW56by1vdmVybGF5LXB1c2gtcmlnaHQnKTtcbiAgICBpZiAodGhpcy5vcGVuICYmIHRoaXMuZW5hYmxlZCAmJiB0aGlzLm1vZGUgPT09ICdwdXNoJykge1xuICAgICAgaHRtbC5jbGFzc0xpc3QuYWRkKCdoYW56by1vdmVybGF5LXB1c2gnLCBgaGFuem8tb3ZlcmxheS1wdXNoLSR7dGhpcy5zaWRlfWApO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCAhdGhpcy5vcGVuKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmhpZGUoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgfVxuXG4gIGdldFNpZGUoKTogJ2xlZnQnIHwgJ3JpZ2h0JyB7XG4gICAgcmV0dXJuIHRoaXMuc2lkZTtcbiAgfVxuXG4gIGdldE1vZGUoKTogT3ZlcmxheU1vZGUge1xuICAgIHJldHVybiB0aGlzLm1vZGU7XG4gIH1cblxuICBzZXRTaWRlKHNpZGU6ICdsZWZ0JyB8ICdyaWdodCcpOiB2b2lkIHtcbiAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLXNpZGUnLCBzaWRlKTtcbiAgICB0aGlzLmFwcGx5UHVzaElmT3BlbigpO1xuICAgIHRoaXMucGVyc2lzdCh7IG92ZXJsYXlTaWRlOiBzaWRlIH0pO1xuICB9XG5cbiAgc2V0TW9kZShtb2RlOiBPdmVybGF5TW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZScsIG1vZGUpO1xuICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgdGhpcy5wZXJzaXN0KHsgb3ZlcmxheU1vZGU6IG1vZGUgfSk7XG4gIH1cblxuICBzZXRXaWR0aCh3aWR0aDogT3ZlcmxheVdpZHRoKTogdm9pZCB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuYXBwbHlXaWR0aCgpO1xuICAgIHRoaXMucGVyc2lzdCh7IG92ZXJsYXlXaWR0aDogd2lkdGggfSk7XG4gIH1cblxuICBzZXRFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLWVuYWJsZWQnLCBlbmFibGVkID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgaWYgKCFlbmFibGVkKSB0aGlzLmhpZGUoKTtcbiAgICB0aGlzLnBlcnNpc3QoeyBvdmVybGF5RW5hYmxlZDogZW5hYmxlZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdCh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNzID0gKHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyA/IGJyb3dzZXIgOiAoY2hyb21lIGFzIGFueSkpPy5zdG9yYWdlPy5zeW5jO1xuICAgICAgc3M/LnNldD8uKHZhbHVlcyk7XG4gICAgfSBjYXRjaCB7IC8qIHN0b3JhZ2UgbWF5IGJlIHVuYXZhaWxhYmxlICovIH1cbiAgfVxuXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVNb3VudGVkKCk7XG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLWVuYWJsZWQnLCAndHJ1ZScpO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgdGhpcy5sb2FkTW9kZWxzKCk7XG4gICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gIH1cblxuICBoaWRlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCAnZmFsc2UnKTtcbiAgICB0aGlzLmFwcGx5UHVzaElmT3BlbigpO1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKCcnKTtcbiAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgdGhpcy5zZXRXYXRjaE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuc2V0RWRpdE1vZGUoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVNb3VudGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICB0aGlzLm1vdW50KCk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFN0eWxlcygpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhbnpvLXBhZ2Utb3ZlcmxheS1zdHlsZXMnKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLmlkID0gJ2hhbnpvLXBhZ2Utb3ZlcmxheS1zdHlsZXMnO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgICAgLyogRWRnZS1waW5uZWQgc2lkZWJhciBwYW5lbCBcdTIwMTQgbm8gRkFCLCBvcGVuZWQgZnJvbSBleHRlbnNpb24gcG9wdXAuXG4gICAgICAgICBIYW56byBicmFuZDogbW9ub2Nocm9tZSAod2hpdGUgcHJpbWFyeSwgbmV1dHJhbCBzdXJmYWNlcykuIE5vIGJsdWUuICovXG4gICAgICAjaGFuem8tcGFnZS1vdmVybGF5LXJvb3Qge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgd2lkdGg6IG1pbih2YXIoLS1oYW56by1vdmVybGF5LXdpZHRoLCA0MjBweCksIDEwMHZ3KTtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NTtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdFtkYXRhLXNpZGU9XCJsZWZ0XCJdIHtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdCAqIHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIH1cblxuICAgICAgLyogUHVzaCBtb2RlOiB3aGVuIHRoZSB1c2VyIHBpbnMgdGhlIHBhbmVsIGFzIGEgZG9jaywgaHRtbCBzaGlmdHMgc29cbiAgICAgICAgIHBhZ2UgY29udGVudCByZWZsb3dzIGJlc2lkZSBpdCBpbnN0ZWFkIG9mIGJlaW5nIGNvdmVyZWQuIEFwcGxpZWQgdG9cbiAgICAgICAgIDxodG1sPiBmcm9tIHNldE1vZGUoJ3B1c2gnKSArIG9wZW4uICovXG4gICAgICBodG1sLmhhbnpvLW92ZXJsYXktcHVzaC5oYW56by1vdmVybGF5LXB1c2gtcmlnaHQge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLWhhbnpvLW92ZXJsYXktd2lkdGgsIDQyMHB4KSAhaW1wb3J0YW50O1xuICAgICAgICB0cmFuc2l0aW9uOiBtYXJnaW4tcmlnaHQgMC4xOHMgZWFzZTtcbiAgICAgIH1cbiAgICAgIGh0bWwuaGFuem8tb3ZlcmxheS1wdXNoLmhhbnpvLW92ZXJsYXktcHVzaC1sZWZ0IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IHZhcigtLWhhbnpvLW92ZXJsYXktd2lkdGgsIDQyMHB4KSAhaW1wb3J0YW50O1xuICAgICAgICB0cmFuc2l0aW9uOiBtYXJnaW4tbGVmdCAwLjE4cyBlYXNlO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1wYW5lbCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMCwgMTAsIDExLCAwLjk3KSwgcmdiYSg3LCA3LCA4LCAwLjk3KSk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBib3gtc2hhZG93OiAtMjJweCAwIDQ4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMThzIGVhc2UsIG9wYWNpdHkgMC4xOHMgZWFzZTtcbiAgICAgIH1cblxuICAgICAgI2hhbnpvLXBhZ2Utb3ZlcmxheS1yb290W2RhdGEtc2lkZT1cImxlZnRcIl0gLmhhbnpvLXBhZ2UtcGFuZWwge1xuICAgICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTtcbiAgICAgICAgYm94LXNoYWRvdzogMjJweCAwIDQ4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcbiAgICAgIH1cblxuICAgICAgI2hhbnpvLXBhZ2Utb3ZlcmxheS1yb290W2RhdGEtb3Blbj1cInRydWVcIl0gLmhhbnpvLXBhZ2UtcGFuZWwge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oZWFkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTRweDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHRyYW5zcGFyZW50KTtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWJyYW5kIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4O1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oZWFkZXItYWN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWNoaXAtYnRuIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICAgIHBhZGRpbmc6IDRweCAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgY29sb3I6IHJnYmEoMjQ1LCAyNDUsIDI0NSwgMC44NSk7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzLCBjb2xvciAwLjE1cywgYm9yZGVyLWNvbG9yIDAuMTVzO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tY2hpcC1idG46aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWNoaXAtYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuIHtcbiAgICAgICAgd2lkdGg6IDI4cHg7XG4gICAgICAgIGhlaWdodDogMjhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgY29sb3I6ICNmNWY1ZjU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMsIGJvcmRlci1jb2xvciAwLjE1cztcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8taWNvbi1idG4gc3ZnIHtcbiAgICAgICAgd2lkdGg6IDE0cHg7XG4gICAgICAgIGhlaWdodDogMTRweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbWV0YSB7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweCA2cHggMTRweDtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgYXV0bztcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1jb250ZXh0IHtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBjb2xvcjogcmdiYSgyNDUsIDI0NSwgMjQ1LCAwLjY1KTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLXN0YXR1cyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgY29sb3I6IHJnYmEoMjQ1LCAyNDUsIDI0NSwgMC41NSk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1tb2RlbC1yb3cge1xuICAgICAgICBwYWRkaW5nOiAwIDE0cHggOHB4IDE0cHg7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tbW9kZWwtcm93IHNlbGVjdCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBwYWRkaW5nOiA3cHggOXB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC8qIFRoZSBjaGF0IHNjcm9sbGVyOiB0YWtlcyBBTEwgcmVtYWluaW5nIHZlcnRpY2FsIHNwYWNlIHNvIHRoZVxuICAgICAgICAgY29tcG9zZXIgYmVsb3cgc3RheXMgc3RpY2t5IGFnYWluc3QgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZWwuICovXG4gICAgICAuaGFuem8tcGFnZS1tZXNzYWdlcyB7XG4gICAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgICBwYWRkaW5nOiA4cHggMTRweCAxMnB4IDE0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1tc2cge1xuICAgICAgICBwYWRkaW5nOiA5cHggMTBweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40NTtcbiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbXNnLnVzZXIge1xuICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgICAgICAgbWF4LXdpZHRoOiA4OCU7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLW1zZy5hc3Npc3RhbnQge1xuICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgICAgICBtYXgtd2lkdGg6IDkyJTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEwKTtcbiAgICAgIH1cblxuICAgICAgLyogQ29tcG9zZXIgcGlubmVkIHRvIGJvdHRvbSBvZiB0aGUgcGFuZWwuIGZsZXgtc2hyaW5rOiAwIHByZXZlbnRzXG4gICAgICAgICBpdCBmcm9tIGNvbGxhcHNpbmcgd2hlbiB0aGUgbWVzc2FnZXMgc2Nyb2xsZXIgZ3Jvd3MuICovXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApO1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciB0ZXh0YXJlYSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDM4cHg7XG4gICAgICAgIG1heC1oZWlnaHQ6IDExMHB4O1xuICAgICAgICByZXNpemU6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNyk7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBwYWRkaW5nOiA5cHggMTFweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgfVxuXG4gICAgICAvKiBQcmltYXJ5IGFjdGlvbjogV0hJVEUgcGVyIEBoYW56by9icmFuZCBtb25vY2hyb21lIGd1aWRlbGluZXMuICovXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciBidXR0b24ge1xuICAgICAgICBtaW4td2lkdGg6IDY4cHg7XG4gICAgICAgIGhlaWdodDogMzhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZmZmZjtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgICAgY29sb3I6ICMwYTBhMGI7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzLCB0cmFuc2Zvcm0gMC4wOHM7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIGJ1dHRvbjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIGJ1dHRvbjphY3RpdmU6bm90KDpkaXNhYmxlZCkge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtY29tcG9zZXIgYnV0dG9uOmRpc2FibGVkIHtcbiAgICAgICAgb3BhY2l0eTogMC41NTtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oaWdobGlnaHQge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDQ7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gICAgICB9XG5cbiAgICAgIFtkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nPVwidHJ1ZVwiXSB7XG4gICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpICFpbXBvcnRhbnQ7XG4gICAgICAgIG91dGxpbmUtb2Zmc2V0OiAycHggIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICBgO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3VudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3VudGVkKSByZXR1cm47XG5cbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJvb3QuaWQgPSAnaGFuem8tcGFnZS1vdmVybGF5LXJvb3QnO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3BlbicsICdmYWxzZScpO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZW5hYmxlZCcsICdmYWxzZScpO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2lkZScsIHRoaXMuc2lkZSk7XG4gICAgdGhpcy5yb290LnNldEF0dHJpYnV0ZSgnZGF0YS1tb2RlJywgdGhpcy5tb2RlKTtcbiAgICB0aGlzLmFwcGx5V2lkdGgoKTtcbiAgICB0aGlzLnJvb3QuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtcGFuZWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbD1cIkhhbnpvIFBhZ2UgQXNzaXN0YW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWhlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWJyYW5kXCI+SGFuem88L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1oZWFkZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWNoaXAtYnRuXCIgZGF0YS1yb2xlPVwid2F0Y2hcIiBkYXRhLWFjdGl2ZT1cImZhbHNlXCIgdGl0bGU9XCJXYXRjaCBlbGVtZW50cyBvbiBob3ZlclwiPldhdGNoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGFuem8tY2hpcC1idG5cIiBkYXRhLXJvbGU9XCJlZGl0XCIgZGF0YS1hY3RpdmU9XCJmYWxzZVwiIHRpdGxlPVwiQ2xpY2sgYW55IGVsZW1lbnQgdG8gZWRpdCB0ZXh0XCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWljb24tYnRuXCIgZGF0YS1yb2xlPVwicGluLW1vZGVcIiB0aXRsZT1cIlRvZ2dsZTogcGluIChwdXNoIGNvbnRlbnQpIHZzIG92ZXJsYXkgKGZsb2F0IG92ZXIgcGFnZSlcIj5cbiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDR2MTZNMyA0aDEyYTQgNCAwIDAgMSA0IDR2OGE0IDQgMCAwIDEtNCA0SDN6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWljb24tYnRuXCIgZGF0YS1yb2xlPVwiY2xvc2VcIiB0aXRsZT1cIkhpZGUgb3ZlcmxheVwiPlx1MDBENzwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtbWV0YVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWNvbnRleHRcIj5Vc2UgV2F0Y2ggdG8gaW5zcGVjdCBwYWdlIGVsZW1lbnRzLjwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGFuem8tcGFnZS1zdGF0dXNcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tbW9kZWwtcm93XCI+XG4gICAgICAgICAgPHNlbGVjdCBkYXRhLXJvbGU9XCJtb2RlbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNFwiPkNsYXVkZSBTb25uZXQgNDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYXVkZS1vcHVzLTQtMjAyNTA1MTRcIj5DbGF1ZGUgT3B1cyA0PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZ3B0LTRvXCI+R1BULTRvPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiemVuLWNvZGVyLWZsYXNoXCI+WmVuIENvZGVyIEZsYXNoPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiemVuLW1heFwiPlplbiBNYXg8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLW1lc3NhZ2VzXCIgZGF0YS1yb2xlPVwibWVzc2FnZXNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1tc2cgYXNzaXN0YW50XCI+QXNrIGFib3V0IHRoaXMgcGFnZSwgaW5zcGVjdCBhbnkgZWxlbWVudCwgb3IgdHVybiBvbiBFZGl0IG1vZGUgdG8gY2hhbmdlIHRleHQgaW4tcGxhY2UuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1jb21wb3NlclwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBkYXRhLXJvbGU9XCJpbnB1dFwiIHJvd3M9XCIxXCIgcGxhY2Vob2xkZXI9XCJBc2sgYWJvdXQgdGhpcyBwYWdlLi4uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8YnV0dG9uIGRhdGEtcm9sZT1cInNlbmRcIiB0eXBlPVwiYnV0dG9uXCI+QXNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIHRoaXMucGFuZWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignLmhhbnpvLXBhZ2UtcGFuZWwnKTtcbiAgICB0aGlzLmxhdW5jaGVyID0gbnVsbDtcbiAgICB0aGlzLm1lc3NhZ2VzRWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cIm1lc3NhZ2VzXCJdJyk7XG4gICAgdGhpcy5pbnB1dEVsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJpbnB1dFwiXScpO1xuICAgIHRoaXMuc2VuZEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwic2VuZFwiXScpO1xuICAgIHRoaXMubW9kZWxFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwibW9kZWxcIl0nKTtcbiAgICB0aGlzLmNvbnRleHRFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuaGFuem8tcGFnZS1jb250ZXh0Jyk7XG4gICAgdGhpcy53YXRjaEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwid2F0Y2hcIl0nKTtcbiAgICB0aGlzLmVkaXRCdG4gPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cImVkaXRcIl0nKTtcbiAgICB0aGlzLnN0YXR1c0VsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1wYWdlLXN0YXR1cycpO1xuXG4gICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJjbG9zZVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICBjb25zdCBwaW5Nb2RlQnRuID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJwaW4tbW9kZVwiXScpO1xuICAgIHBpbk1vZGVCdG4/LnNldEF0dHJpYnV0ZSgnZGF0YS1hY3RpdmUnLCB0aGlzLm1vZGUgPT09ICdwdXNoJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIHBpbk1vZGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgbmV4dDogT3ZlcmxheU1vZGUgPSB0aGlzLm1vZGUgPT09ICdwdXNoJyA/ICdvdmVybGF5JyA6ICdwdXNoJztcbiAgICAgIHRoaXMuc2V0TW9kZShuZXh0KTtcbiAgICAgIHBpbk1vZGVCdG4uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZScsIG5leHQgPT09ICdwdXNoJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIH0pO1xuICAgIHRoaXMud2F0Y2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zZXRXYXRjaE1vZGUoIXRoaXMud2F0Y2hNb2RlKSk7XG4gICAgdGhpcy5lZGl0QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2V0RWRpdE1vZGUoIXRoaXMuZWRpdE1vZGUpKTtcbiAgICB0aGlzLnNlbmRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5hc2tQYWdlUXVlc3Rpb24oKSk7XG4gICAgdGhpcy5pbnB1dEVsPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmFza1BhZ2VRdWVzdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaW5wdXRFbD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaW5wdXRFbCkgcmV0dXJuO1xuICAgICAgdGhpcy5pbnB1dEVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRoaXMuaW5wdXRFbC5zdHlsZS5oZWlnaHQgPSBgJHtNYXRoLm1pbih0aGlzLmlucHV0RWwuc2Nyb2xsSGVpZ2h0LCAxMTApfXB4YDtcbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnJvb3QpO1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGJpbmRHbG9iYWxFdmVudHMoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB0aGlzLm9uTW91c2VNb3ZlKGV2ZW50KSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHRoaXMub25Eb2N1bWVudENsaWNrKGV2ZW50KSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5vbktleURvd24oZXZlbnQpLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2F0Y2hNb2RlKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRQYWdlVGFyZ2V0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICB0aGlzLmhvdmVyZWRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2hvd0hpZ2hsaWdodCh0YXJnZXQpO1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbnRleHQpIHtcbiAgICAgIHRoaXMuY29udGV4dEVsICYmICh0aGlzLmNvbnRleHRFbC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0RWxlbWVudFN1bW1hcnkodGFyZ2V0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2F0Y2hNb2RlICYmICF0aGlzLmVkaXRNb2RlKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRQYWdlVGFyZ2V0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy53YXRjaE1vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb250ZXh0ID0gdGhpcy5jYXB0dXJlRWxlbWVudENvbnRleHQodGFyZ2V0KTtcbiAgICAgIHRoaXMuY29udGV4dEVsICYmICh0aGlzLmNvbnRleHRFbC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0RWxlbWVudFN1bW1hcnkodGFyZ2V0KSk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWxlbWVudCBzZWxlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICB0aGlzLmVuYWJsZUlubGluZUVkaXQodGFyZ2V0KTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0aW5nIGVsZW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBpZiAodGhpcy5lZGl0aW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRpc2FibGVJbmxpbmVFZGl0KHRoaXMuZWRpdGluZ0VsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VkaXQgY2FuY2VsZWQnKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFBhZ2VUYXJnZXQodGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMucm9vdD8uY29udGFpbnModGFyZ2V0KSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0YXJnZXQuaXNDb25uZWN0ZWQpIHJldHVybiBudWxsO1xuICAgIGlmICh0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaHRtbCcgfHwgdGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2JvZHknKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRXYXRjaE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy53YXRjaE1vZGUgPSBhY3RpdmU7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5zZXRFZGl0TW9kZShmYWxzZSk7XG4gICAgdGhpcy53YXRjaEJ0bj8uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZScsIGFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmhvdmVyZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbnRleHQgJiYgdGhpcy5jb250ZXh0RWwpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0RWwudGV4dENvbnRlbnQgPSAnVXNlIFdhdGNoIHRvIGluc3BlY3QgcGFnZSBlbGVtZW50cy4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnV2F0Y2ggbW9kZSBvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RWRpdE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZSA9IGFjdGl2ZTtcbiAgICBpZiAoYWN0aXZlKSB0aGlzLnNldFdhdGNoTW9kZShmYWxzZSk7XG4gICAgdGhpcy5lZGl0QnRuPy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWN0aXZlJywgYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgaWYgKCFhY3RpdmUgJiYgdGhpcy5lZGl0aW5nRWxlbWVudCkge1xuICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdCh0aGlzLmVkaXRpbmdFbGVtZW50LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VkaXQgbW9kZSBvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5saW5lRWRpdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRpbmdFbGVtZW50ICYmIHRoaXMuZWRpdGluZ0VsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQodGhpcy5lZGl0aW5nRWxlbWVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLmVkaXRpbmdFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuem8tb3JpZ2luYWwtaHRtbCcsIGVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICd0cnVlJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snLCAndHJ1ZScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nJywgJ3RydWUnKTtcbiAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5lZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICBjb25zdCBrZXlkb3duSGFuZGxlciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdChlbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IHJldmVydGVkJyk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRpc2FibGVJbmxpbmVFZGl0KGVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdCBhcHBsaWVkJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGJsdXJIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdChlbGVtZW50LCB0cnVlKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IGFwcGxpZWQnKTtcbiAgICB9O1xuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkhhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBibHVySGFuZGxlciwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlSW5saW5lRWRpdChlbGVtZW50OiBIVE1MRWxlbWVudCwga2VlcENoYW5nZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIWtlZXBDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnKTtcbiAgICAgIGlmIChvcmlnaW5hbCAhPT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IG9yaWdpbmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKTtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3BlbGxjaGVjaycpO1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nJyk7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaGFuem8tb3JpZ2luYWwtaHRtbCcpO1xuXG4gICAgaWYgKHRoaXMuZWRpdGluZ0VsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWRpdGluZ0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvd0hpZ2hsaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwICYmIHJlY3QuaGVpZ2h0ID09PSAwKSB7XG4gICAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhpZ2hsaWdodEJveCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0Qm94LmNsYXNzTmFtZSA9ICdoYW56by1wYWdlLWhpZ2hsaWdodCc7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oaWdobGlnaHRCb3gpO1xuICAgIH1cblxuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCgwLCByZWN0LmxlZnQgLSAzKX1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUudG9wID0gYCR7TWF0aC5tYXgoMCwgcmVjdC50b3AgLSAzKX1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUud2lkdGggPSBgJHtyZWN0LndpZHRoICsgNn1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHQgKyA2fXB4YDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJIaWdobGlnaHQoKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRCb3g/LnJlbW92ZSgpO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2FwdHVyZUVsZW1lbnRDb250ZXh0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogT3ZlcmxheUVsZW1lbnRDb250ZXh0IHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5ub3JtYWxpemVUZXh0KGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQgfHwgJycpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcjogdGhpcy5idWlsZFNlbGVjdG9yKGVsZW1lbnQpLFxuICAgICAgdGFnOiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgIHRleHQ6IHRleHQuc2xpY2UoMCwgODAwKSxcbiAgICAgIGh0bWw6IGVsZW1lbnQub3V0ZXJIVE1MLnNsaWNlKDAsIDEyMDApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VsZWN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGlmIChlbGVtZW50LmlkKSByZXR1cm4gYCMke2VsZW1lbnQuaWR9YDtcblxuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xuICAgIGxldCBkZXB0aCA9IDA7XG5cbiAgICB3aGlsZSAoY3VycmVudCAmJiBkZXB0aCA8IDYpIHtcbiAgICAgIGxldCBwYXJ0ID0gY3VycmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY3VycmVudC5jbGFzc0xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBBcnJheS5mcm9tKGN1cnJlbnQuY2xhc3NMaXN0KS5zbGljZSgwLCAyKS5qb2luKCcuJyk7XG4gICAgICAgIGlmIChjbGFzc05hbWUpIHBhcnQgKz0gYC4ke2NsYXNzTmFtZX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBjb25zdCBzaWJsaW5ncyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5maWx0ZXIoKG5vZGUpID0+IG5vZGUudGFnTmFtZSA9PT0gY3VycmVudCEudGFnTmFtZSk7XG4gICAgICAgIGlmIChzaWJsaW5ncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzaWJsaW5ncy5pbmRleE9mKGN1cnJlbnQpICsgMTtcbiAgICAgICAgICBwYXJ0ICs9IGA6bnRoLW9mLXR5cGUoJHtpbmRleH0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFydHMudW5zaGlmdChwYXJ0KTtcbiAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gICAgICBkZXB0aCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgPiAnKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWxlbWVudFN1bW1hcnkoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FwdHVyZUVsZW1lbnRDb250ZXh0KGVsZW1lbnQpO1xuICAgIHJldHVybiBgJHtjdHgudGFnfSBcdTIwMjIgJHtjdHguc2VsZWN0b3J9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb2RlbHNMb2FkZWQgfHwgIXRoaXMubW9kZWxFbCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdjaGF0Lmxpc3RNb2RlbHMnIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZT8uc3VjY2VzcyB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5tb2RlbHMpIHx8ICFyZXNwb25zZS5tb2RlbHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLm1vZGVsRWwudmFsdWU7XG4gICAgICB0aGlzLm1vZGVsRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJlc3BvbnNlLm1vZGVscykge1xuICAgICAgICBpZiAoIW1vZGVsPy5pZCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBtb2RlbC5pZDtcbiAgICAgICAgb3B0aW9uLnRleHRDb250ZW50ID0gbW9kZWwubmFtZSB8fCBtb2RlbC5pZDtcbiAgICAgICAgdGhpcy5tb2RlbEVsLmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAocHJldmlvdXMgJiYgQXJyYXkuZnJvbSh0aGlzLm1vZGVsRWwub3B0aW9ucykuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHByZXZpb3VzKSkge1xuICAgICAgICB0aGlzLm1vZGVsRWwudmFsdWUgPSBwcmV2aW91cztcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZWxzTG9hZGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEtlZXAgbG9jYWwgZGVmYXVsdHMgaWYgbW9kZWwgZmV0Y2ggZmFpbHMuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0lucHV0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnB1dEVsKSByZXR1cm47XG4gICAgdGhpcy5pbnB1dEVsLmZvY3VzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZE1lc3NhZ2Uocm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZXNzYWdlc0VsKSByZXR1cm47XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9IGBoYW56by1wYWdlLW1zZyAke3JvbGV9YDtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgIHRoaXMubWVzc2FnZXNFbC5hcHBlbmRDaGlsZChkaXYpO1xuICAgIHRoaXMubWVzc2FnZXNFbC5zY3JvbGxUb3AgPSB0aGlzLm1lc3NhZ2VzRWwuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXModGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YXR1c0VsKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGFnZUNvbnRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLm5vcm1hbGl6ZVRleHQod2luZG93LmdldFNlbGVjdGlvbj8uKCk/LnRvU3RyaW5nKCkgfHwgJycpO1xuICAgIGNvbnN0IGNvbnRleHRMaW5lcyA9IFtcbiAgICAgIGBVUkw6ICR7bG9jYXRpb24uaHJlZn1gLFxuICAgICAgYFRpdGxlOiAke2RvY3VtZW50LnRpdGxlIHx8ICdVbnRpdGxlZCd9YCxcbiAgICBdO1xuXG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgY29udGV4dExpbmVzLnB1c2goYFRleHRTZWxlY3Rpb246ICR7c2VsZWN0aW9uLnNsaWNlKDAsIDYwMCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudENvbnRleHQgPSB0aGlzLnNlbGVjdGVkQ29udGV4dCB8fCAodGhpcy5ob3ZlcmVkRWxlbWVudCA/IHRoaXMuY2FwdHVyZUVsZW1lbnRDb250ZXh0KHRoaXMuaG92ZXJlZEVsZW1lbnQpIDogbnVsbCk7XG4gICAgaWYgKGVsZW1lbnRDb250ZXh0KSB7XG4gICAgICBjb250ZXh0TGluZXMucHVzaChgRWxlbWVudFNlbGVjdG9yOiAke2VsZW1lbnRDb250ZXh0LnNlbGVjdG9yfWApO1xuICAgICAgaWYgKGVsZW1lbnRDb250ZXh0LnRleHQpIGNvbnRleHRMaW5lcy5wdXNoKGBFbGVtZW50VGV4dDogJHtlbGVtZW50Q29udGV4dC50ZXh0LnNsaWNlKDAsIDYwMCl9YCk7XG4gICAgICBjb250ZXh0TGluZXMucHVzaChgRWxlbWVudEhUTUw6ICR7ZWxlbWVudENvbnRleHQuaHRtbC5zbGljZSgwLCA4MDApfWApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0TGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFza1BhZ2VRdWVzdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zZW5kaW5nIHx8ICF0aGlzLmlucHV0RWwpIHJldHVybjtcblxuICAgIGNvbnN0IHByb21wdCA9IHRoaXMubm9ybWFsaXplVGV4dCh0aGlzLmlucHV0RWwudmFsdWUpO1xuICAgIGlmICghcHJvbXB0KSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlblJlc3AgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGguZ2V0VG9rZW4nIH0pO1xuICAgIGlmICghdG9rZW5SZXNwPy5zdWNjZXNzIHx8ICF0b2tlblJlc3AudG9rZW4pIHtcbiAgICAgIHRoaXMuYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1BsZWFzZSBzaWduIGluIGZyb20gdGhlIEhhbnpvIHNpZGViYXIvcG9wdXAgYmVmb3JlIHVzaW5nIHBhZ2UgY2hhdC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKCdUaGlua2luZy4uLicpO1xuICAgIHRoaXMuc2VuZEJ0biAmJiAodGhpcy5zZW5kQnRuLmRpc2FibGVkID0gdHJ1ZSk7XG5cbiAgICB0aGlzLmlucHV0RWwudmFsdWUgPSAnJztcbiAgICB0aGlzLmlucHV0RWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHRoaXMuYXBwZW5kTWVzc2FnZSgndXNlcicsIHByb21wdCk7XG5cbiAgICBjb25zdCBzeXN0ZW1Db250ZXh0ID0gdGhpcy5idWlsZFBhZ2VDb250ZXh0KCk7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRWw/LnZhbHVlIHx8ICdncHQtNG8nO1xuICAgIGNvbnN0IHJlcXVlc3RNZXNzYWdlczogT3ZlcmxheUNoYXRNZXNzYWdlW10gPSBbXG4gICAgICB7XG4gICAgICAgIHJvbGU6ICdzeXN0ZW0nLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgJ1lvdSBhcmUgSGFuem8gcGFnZSBvdmVybGF5IGFzc2lzdGFudC4nLFxuICAgICAgICAgICdVc2UgcHJvdmlkZWQgcGFnZSBjb250ZXh0IGFuZCBzZWxlY3RlZCBlbGVtZW50IGNvbnRleHQgd2hlbiByZWxldmFudC4nLFxuICAgICAgICAgICdCZSBjb25jaXNlIGFuZCBwcm92aWRlIGNvbmNyZXRlIFVJIG9yIERPTSBlZGl0IHN1Z2dlc3Rpb25zIHdoZW4gYXNrZWQuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBzeXN0ZW1Db250ZXh0LFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMubWVzc2FnZXMuc2xpY2UoLTgpLFxuICAgICAgeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHByb21wdCB9LFxuICAgIF07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7XG4gICAgICAgIGFjdGlvbjogJ2NoYXQuY29tcGxldGUnLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgbWVzc2FnZXM6IHJlcXVlc3RNZXNzYWdlcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlPy5zdWNjZXNzIHx8ICFyZXNwb25zZS5jb250ZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZT8uZXJyb3IgfHwgJ05vIHJlc3BvbnNlIGZyb20gY2hhdCBzZXJ2aWNlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFuc3dlciA9IFN0cmluZyhyZXNwb25zZS5jb250ZW50KS50cmltKCk7XG4gICAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGFuc3dlciB8fCAnTm8gcmVzcG9uc2UgY29udGVudC4nKTtcbiAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7IHJvbGU6ICd1c2VyJywgY29udGVudDogcHJvbXB0IH0sIHsgcm9sZTogJ2Fzc2lzdGFudCcsIGNvbnRlbnQ6IGFuc3dlciB9KTtcbiAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLnNsaWNlKC0yMCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnUmVhZHknKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBFcnJvcjogJHtlcnJvcj8ubWVzc2FnZSB8fCAnQ2hhdCByZXF1ZXN0IGZhaWxlZCd9YCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbmRCdG4gJiYgKHRoaXMuc2VuZEJ0bi5kaXNhYmxlZCA9IGZhbHNlKTtcbiAgICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBwYWdlT3ZlcmxheSA9IG5ldyBIYW56b1BhZ2VPdmVybGF5KCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbGVtZW50IFBpY2tlciBUb29sIFx1MjAxNCBwaWNrIGFueSBlbGVtZW50LCBjb3B5IGl0cyBDU1Mgc2VsZWN0b3Jcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IGVsZW1lbnRQaWNrZXIgPSAoKCkgPT4ge1xuICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gIGxldCBvdmVybGF5OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFiZWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBob3ZlcmVkRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0b3IoZWw6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoZWwuaWQpIHJldHVybiBgIyR7ZWwuaWR9YDtcbiAgICBjb25zdCB0YWcgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY2xhc3NlcyA9IEFycmF5LmZyb20oZWwuY2xhc3NMaXN0KS5maWx0ZXIoYyA9PiAhYy5zdGFydHNXaXRoKCdoYW56by0nKSkuc2xpY2UoMCwgMyk7XG4gICAgbGV0IHNlbGVjdG9yID0gdGFnO1xuICAgIGlmIChjbGFzc2VzLmxlbmd0aCkgc2VsZWN0b3IgKz0gYC4ke2NsYXNzZXMuam9pbignLicpfWA7XG4gICAgLy8gRW5zdXJlIHVuaXF1ZW5lc3NcbiAgICBjb25zdCBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gQXJyYXkuZnJvbShwYXJlbnQuY2hpbGRyZW4pLmluZGV4T2YoZWwpICsgMTtcbiAgICAgICAgc2VsZWN0b3IgKz0gYDpudGgtY2hpbGQoJHtpZHh9KWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZ1bGxQYXRoKGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cjogSFRNTEVsZW1lbnQgfCBudWxsID0gZWw7XG4gICAgd2hpbGUgKGN1ciAmJiBjdXIgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgcGFydHMudW5zaGlmdChnZXRTZWxlY3RvcihjdXIpKTtcbiAgICAgIGN1ciA9IGN1ci5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignID4gJyk7XG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVPdmVybGF5KCkge1xuICAgIGlmIChvdmVybGF5KSByZXR1cm47XG4gICAgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG92ZXJsYXkuaWQgPSAnaGFuem8tcGlja2VyLW92ZXJsYXknO1xuICAgIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6MjE0NzQ4MzY0Njtib3JkZXI6MnB4IHNvbGlkICNmZmY7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuMDYpO3RyYW5zaXRpb246YWxsIDAuMXMgZWFzZTtkaXNwbGF5Om5vbmU7JztcbiAgICBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGxhYmVsLmlkID0gJ2hhbnpvLXBpY2tlci1sYWJlbCc7XG4gICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjIxNDc0ODM2NDc7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6I2ZmZjtmb250OjExcHgvMS40IEdlaXN0IE1vbm8sTWVubG8sbW9ub3NwYWNlO3BhZGRpbmc6M3B4IDhweDtib3JkZXItcmFkaXVzOjRweDttYXgtd2lkdGg6NDAwcHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO2Rpc3BsYXk6bm9uZTtib3gtc2hhZG93OjAgMnB4IDhweCByZ2JhKDAsMCwwLDAuNCk7JztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Nb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghdGFyZ2V0IHx8IHRhcmdldCA9PT0gb3ZlcmxheSB8fCB0YXJnZXQgPT09IGxhYmVsKSByZXR1cm47XG4gICAgaWYgKHRhcmdldC5pZD8uc3RhcnRzV2l0aCgnaGFuem8tcGlja2VyJykpIHJldHVybjtcbiAgICBob3ZlcmVkRWwgPSB0YXJnZXQ7XG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIG92ZXJsYXkuc3R5bGUudG9wID0gcmVjdC50b3AgKyAncHgnO1xuICAgICAgb3ZlcmxheS5zdHlsZS5sZWZ0ID0gcmVjdC5sZWZ0ICsgJ3B4JztcbiAgICAgIG92ZXJsYXkuc3R5bGUud2lkdGggPSByZWN0LndpZHRoICsgJ3B4JztcbiAgICAgIG92ZXJsYXkuc3R5bGUuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKyAncHgnO1xuICAgIH1cbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGxhYmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBnZXRTZWxlY3Rvcih0YXJnZXQpO1xuICAgICAgY29uc3QgbGFiZWxUb3AgPSByZWN0LnRvcCAtIDI4O1xuICAgICAgbGFiZWwuc3R5bGUudG9wID0gKGxhYmVsVG9wID4gMCA/IGxhYmVsVG9wIDogcmVjdC5ib3R0b20gKyA0KSArICdweCc7XG4gICAgICBsYWJlbC5zdHlsZS5sZWZ0ID0gcmVjdC5sZWZ0ICsgJ3B4JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsaWNrKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgZWwgPSBob3ZlcmVkRWwgfHwgZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBnZXRGdWxsUGF0aChlbCk7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHRleHQgPSAoZWwudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKS5zbGljZSgwLCA4MCk7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgaW5mbyA9IFtcbiAgICAgIGBTZWxlY3RvcjogJHtzZWxlY3Rvcn1gLFxuICAgICAgYFBhdGg6ICR7ZnVsbFBhdGh9YCxcbiAgICAgIGBUYWc6ICR7dGFnfWAsXG4gICAgICBgU2l6ZTogJHtNYXRoLnJvdW5kKHJlY3Qud2lkdGgpfXgke01hdGgucm91bmQocmVjdC5oZWlnaHQpfWAsXG4gICAgICBlbC5pZCA/IGBJRDogJHtlbC5pZH1gIDogJycsXG4gICAgICBlbC5jbGFzc05hbWUgPyBgQ2xhc3NlczogJHtlbC5jbGFzc05hbWV9YCA6ICcnLFxuICAgICAgdGV4dCA/IGBUZXh0OiBcIiR7dGV4dH1cImAgOiAnJyxcbiAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcblxuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGluZm8pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAvLyBBbHNvIHNlbmQgdG8gYmFja2dyb3VuZCBmb3IgTUNQIHRvb2xzXG4gICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdlbGVtZW50U2VsZWN0ZWQnLCBkYXRhOiB7IHNlbGVjdG9yLCBmdWxsUGF0aCwgdGFnLCB0ZXh0LCByZWN0OiB7IHg6IHJlY3QueCwgeTogcmVjdC55LCB3OiByZWN0LndpZHRoLCBoOiByZWN0LmhlaWdodCB9IH0gfSk7XG4gICAgc3RvcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25LZXkoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICBpZiAoYWN0aXZlKSByZXR1cm47XG4gICAgYWN0aXZlID0gdHJ1ZTtcbiAgICBlbnN1cmVPdmVybGF5KCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlLCB0cnVlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgYWN0aXZlID0gZmFsc2U7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlLCB0cnVlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJztcbiAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBob3ZlcmVkRWwgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQsIHN0b3AgfTtcbn0pKCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYWdlIEluZm8gR2F0aGVyZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdhdGhlclBhZ2VJbmZvKCk6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGEgPSAobmFtZTogc3RyaW5nKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBtZXRhW25hbWU9XCIke25hbWV9XCJdLCBtZXRhW3Byb3BlcnR5PVwiJHtuYW1lfVwiXWApPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAnJztcbiAgY29uc3QgbGluZXMgPSBbXG4gICAgYFRpdGxlOiAke2RvY3VtZW50LnRpdGxlfWAsXG4gICAgYFVSTDogJHtsb2NhdGlvbi5ocmVmfWAsXG4gICAgYERlc2NyaXB0aW9uOiAke21ldGEoJ2Rlc2NyaXB0aW9uJykgfHwgbWV0YSgnb2c6ZGVzY3JpcHRpb24nKX1gLFxuICAgIGBDaGFyc2V0OiAke2RvY3VtZW50LmNoYXJhY3RlclNldH1gLFxuICAgIGBMYW5ndWFnZTogJHtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyB8fCAndW5rbm93bid9YCxcbiAgICBgVmlld3BvcnQ6ICR7bWV0YSgndmlld3BvcnQnKX1gLFxuICBdO1xuXG4gIC8vIEZyYW1ld29yayBkZXRlY3Rpb25cbiAgY29uc3QgZnJhbWV3b3Jrczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIGZyYW1ld29ya3MucHVzaCgnUmVhY3QnKTtcbiAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fKSBmcmFtZXdvcmtzLnB1c2goJ1Z1ZScpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fc3ZlbHRlKSBmcmFtZXdvcmtzLnB1c2goJ1N2ZWx0ZScpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fTkVYVF9EQVRBX18pIGZyYW1ld29ya3MucHVzaCgnTmV4dC5qcycpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fTlVYVF9fKSBmcmFtZXdvcmtzLnB1c2goJ051eHQnKTtcbiAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuZy12ZXJzaW9uXScpKSBmcmFtZXdvcmtzLnB1c2goJ0FuZ3VsYXInKTtcbiAgaWYgKGZyYW1ld29ya3MubGVuZ3RoKSBsaW5lcy5wdXNoKGBGcmFtZXdvcmtzOiAke2ZyYW1ld29ya3Muam9pbignLCAnKX1gKTtcblxuICAvLyBQYWdlIG1ldHJpY3NcbiAgY29uc3Qgc2NyaXB0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtzcmNdJykubGVuZ3RoO1xuICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl0nKS5sZW5ndGg7XG4gIGNvbnN0IGltYWdlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpLmxlbmd0aDtcbiAgY29uc3QgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykubGVuZ3RoO1xuICBsaW5lcy5wdXNoKGBSZXNvdXJjZXM6ICR7c2NyaXB0c30gc2NyaXB0cywgJHtzdHlsZXN9IHN0eWxlc2hlZXRzLCAke2ltYWdlc30gaW1hZ2VzLCAke2xpbmtzfSBsaW5rc2ApO1xuXG4gIC8vIFBlcmZvcm1hbmNlIHRpbWluZ1xuICBjb25zdCBwZXJmID0gcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgnbmF2aWdhdGlvbicpWzBdIGFzIFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZztcbiAgaWYgKHBlcmYpIHtcbiAgICBsaW5lcy5wdXNoKGBMb2FkOiAke01hdGgucm91bmQocGVyZi5sb2FkRXZlbnRFbmQgLSBwZXJmLnN0YXJ0VGltZSl9bXMgKERPTTogJHtNYXRoLnJvdW5kKHBlcmYuZG9tQ29udGVudExvYWRlZEV2ZW50RW5kIC0gcGVyZi5zdGFydFRpbWUpfW1zKWApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmZpbHRlcihsID0+ICFsLmVuZHNXaXRoKCc6ICcpKS5qb2luKCdcXG4nKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElubGluZSBDb25zb2xlIFRvb2wgXHUyMDE0IHF1aWNrIEpTIGV2YWwgb24gdGhlIHBhZ2Vcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IGlubGluZUNvbnNvbGUgPSAoKCkgPT4ge1xuICBsZXQgcm9vdDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBvdXRwdXQ6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCB2aXNpYmxlID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZW5zdXJlTW91bnQoKSB7XG4gICAgaWYgKHJvb3QpIHJldHVybjtcbiAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcm9vdC5pZCA9ICdoYW56by1jb25zb2xlLXJvb3QnO1xuICAgIHJvb3Quc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtib3R0b206MjBweDtsZWZ0OjIwcHg7cmlnaHQ6MjBweDt6LWluZGV4OjIxNDc0ODM2NDY7Zm9udC1mYW1pbHk6R2Vpc3QgTW9ubyxNZW5sbyxDb25zb2xhcyxtb25vc3BhY2U7Zm9udC1zaXplOjEycHg7ZGlzcGxheTpub25lOyc7XG4gICAgcm9vdC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuOTIpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEycHgpO2JvcmRlcjoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMCwwLDAuNSk7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoYW56by1jb25zb2xlLW91dHB1dFwiIHN0eWxlPVwibWF4LWhlaWdodDoyMDBweDtvdmVyZmxvdy15OmF1dG87cGFkZGluZzo4cHggMTJweDtjb2xvcjojY2NjO3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7cGFkZGluZzowIDEycHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojNjY2O21hcmdpbi1yaWdodDo2cHg7XCI+Jmd0Ozwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJoYW56by1jb25zb2xlLWlucHV0XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImV2YWwoLi4uKVwiIHN0eWxlPVwiZmxleDoxO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Y29sb3I6I2ZmZjtmb250OmluaGVyaXQ7cGFkZGluZzoxMHB4IDA7b3V0bGluZTpub25lO1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzQ0NDtmb250LXNpemU6MTBweDttYXJnaW4tbGVmdDo4cHg7XCI+RXNjIHRvIGNsb3NlPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290KTtcbiAgICBpbnB1dCA9IHJvb3QucXVlcnlTZWxlY3RvcignI2hhbnpvLWNvbnNvbGUtaW5wdXQnKTtcbiAgICBvdXRwdXQgPSByb290LnF1ZXJ5U2VsZWN0b3IoJyNoYW56by1jb25zb2xlLW91dHB1dCcpO1xuXG4gICAgaW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBoaWRlKCk7IHJldHVybjsgfVxuICAgICAgaWYgKGUua2V5ICE9PSAnRW50ZXInIHx8ICFpbnB1dD8udmFsdWUudHJpbSgpKSByZXR1cm47XG4gICAgICBjb25zdCBleHByID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgIGFwcGVuZExpbmUoYD4gJHtleHByfWAsICcjODg4Jyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoMCwgZXZhbCkoZXhwcik7XG4gICAgICAgIGFwcGVuZExpbmUoU3RyaW5nKHJlc3VsdCksICcjNENBRjUwJyk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBhcHBlbmRMaW5lKGVycj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSwgJyNGNDQzMzYnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZExpbmUodGV4dDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKSB7XG4gICAgaWYgKCFvdXRwdXQpIHJldHVybjtcbiAgICBjb25zdCBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbGluZS5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgIGxpbmUudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIG91dHB1dC5hcHBlbmRDaGlsZChsaW5lKTtcbiAgICBvdXRwdXQuc2Nyb2xsVG9wID0gb3V0cHV0LnNjcm9sbEhlaWdodDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3coKSB7XG4gICAgZW5zdXJlTW91bnQoKTtcbiAgICBpZiAocm9vdCkgcm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB2aXNpYmxlID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IGlucHV0Py5mb2N1cygpLCA1MCk7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlKCkge1xuICAgIGlmIChyb290KSByb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHsgc2hvdywgaGlkZSwgaXNWaXNpYmxlOiAoKSA9PiB2aXNpYmxlIH07XG59KSgpO1xuXG4vLyBJbml0aWFsaXplXG5uZXcgSGFuem9Db250ZW50U2NyaXB0KCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCYWNrZ3JvdW5kIGtlZXAtYWxpdmUgcG9ydC5cbi8vXG4vLyBGaXJlZm94IE1WMyB0cmVhdHMgYGJhY2tncm91bmQuc2NyaXB0c2AgYXMgZXZlbnQgcGFnZXM7IENocm9tZSBNVjMgc2VydmljZVxuLy8gd29ya2VycyBpZGxlIG91dCBhZnRlciB+MzBzLiBBbiBvcGVuIGBjaHJvbWUucnVudGltZWAgcG9ydCBmcm9tIGFueVxuLy8gY29udGVudCBzY3JpcHQga2VlcHMgdGhlIGJhY2tncm91bmQgcGFnZSBhbGl2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZVxuLy8gcG9ydCBcdTIwMTQgbm8gcG9sbGluZywgbm8gYWxhcm1zIHJlcXVpcmVkLiBFdmVyeSBsb2FkZWQgaHR0cChzKSB0YWIgaG9sZHNcbi8vIG9uZSBvZiB0aGVzZSwgc28gdGhlIGJhY2tncm91bmQgWkFQIHNvY2tldCBzdXJ2aXZlcyBpbmRlZmluaXRlbHkgYXNcbi8vIGxvbmcgYXMgdGhlIHVzZXIgaGFzIGFueSBub24tcHJpdmlsZWdlZCB0YWIgb3Blbi5cbi8vXG4vLyBIZWFydGJlYXRzIGV2ZXJ5IDEwcyBwcmV2ZW50IEZpcmVmb3gncyA0LW1pbnV0ZSBpZGxlLXBvcnQgZGlzY29ubmVjdC5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG50cnkge1xuICBjb25zdCBwb3J0ID0gKGJyb3dzZXIgYXMgYW55KT8ucnVudGltZT8uY29ubmVjdD8uKHsgbmFtZTogJ3phcC1rZWVwYWxpdmUnIH0pXG4gICAgfHwgKGNocm9tZSBhcyBhbnkpPy5ydW50aW1lPy5jb25uZWN0Py4oeyBuYW1lOiAnemFwLWtlZXBhbGl2ZScgfSk7XG4gIGlmIChwb3J0KSB7XG4gICAgY29uc3QgdGljayA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRyeSB7IHBvcnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAncGluZycsIHQ6IERhdGUubm93KCkgfSk7IH1cbiAgICAgIGNhdGNoIHsgY2xlYXJJbnRlcnZhbCh0aWNrKTsgfVxuICAgIH0sIDEwXzAwMCk7XG4gICAgcG9ydC5vbkRpc2Nvbm5lY3Q/LmFkZExpc3RlbmVyPy4oKCkgPT4gY2xlYXJJbnRlcnZhbCh0aWNrKSk7XG4gIH1cbn0gY2F0Y2ggeyAvKiBub3QgYWxsIHBhZ2VzIGxldCBjb250ZW50IHNjcmlwdHMgb3BlbiBwb3J0cyBcdTIwMTQgYmVzdCBlZmZvcnQgKi8gfVxuIiwgIi8qKlxuICogS2V5Ym9hcmQtc2hvcnRjdXQgY29uZmlndXJhdGlvbiBzaGFyZWQgYmV0d2VlbiBjb250ZW50IHNjcmlwdHMsIHRoZVxuICogcG9wdXAgcmVjb3JkZXIsIGFuZCB0aGUgYmFja2dyb3VuZC4gQSBcInNob3J0Y3V0XCIgaXMgYSBub3JtYWxpc2VkXG4gKiBkZXNjcmlwdGlvbiBvZiBhIGtleWJvYXJkIGNob3JkIChtb2RpZmllcnMgKyBrZXkpIHRoYXQgdGVsbHMgdGhlXG4gKiBjb250ZW50IHNjcmlwdCB3aGljaCBjb21iaW5hdGlvbiB0b2dnbGVzIGluc3BlY3QgLyBjbGljay10by1zb3VyY2VcbiAqIG5hdmlnYXRpb24uIFRoZSBkZWZhdWx0IGlzICoqQ3RybCoqIGFsb25lIChNYWMgdXNlcnMgd291bGQgb3RoZXJ3aXNlXG4gKiBuZWVkIHRvIGhvbGQgT3B0aW9uLCB3aGljaCBpbnRlcmZlcmVzIHdpdGggbmF0aXZlIG1hY09TIGNoYXJhY3RlclxuICogaW5wdXQpLiBBbnkgY29tYmluYXRpb24gaXMgY29uZmlndXJhYmxlIHRocm91Z2ggdGhlIHBvcHVwLlxuICpcbiAqIFN0b3JhZ2Ugc2hhcGU6IGBjaHJvbWUuc3RvcmFnZS5sb2NhbFtcImhhbnpvX3Nob3J0Y3V0X2luc3BlY3RcIl0gPSBTaG9ydGN1dGAuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBTaG9ydGN1dCB7XG4gIC8qKiBXaGV0aGVyIEN0cmwgKG9yIENtZCBvbiBtYWNPUykgaXMgcGFydCBvZiB0aGUgY2hvcmQuICovXG4gIGN0cmw6IGJvb2xlYW47XG4gIC8qKiBDbWQvTWV0YSBrZXkgKG1hY09TKSBcdTIwMTQgYm91bmQgc2VwYXJhdGVseSBmcm9tIEN0cmwuICovXG4gIG1ldGE6IGJvb2xlYW47XG4gIGFsdDogYm9vbGVhbjtcbiAgc2hpZnQ6IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBsZXR0ZXIgb3IgYEtleSpgIHZhbHVlLiBFbXB0eSBzdHJpbmcgbWVhbnMgbW9kaWZpZXItb25seS4gKi9cbiAga2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBTVE9SQUdFX0tFWV9JTlNQRUNUID0gJ2hhbnpvX3Nob3J0Y3V0X2luc3BlY3QnO1xuXG4vKipcbiAqIERlZmF1bHQgaW5zcGVjdC1tb2RpZmllcjogKipDdHJsKiogKG9yIENtZCBvbiBtYWNPUykgYWxvbmUuXG4gKlxuICogV2h5IG5vdCBBbHQvT3B0aW9uPyBPbiBtYWNPUywgT3B0aW9uIGlzIHRoZSBzeXN0ZW0tbGV2ZWwgY2hhcmFjdGVyLVxuICogY29tcG9zZSBtb2RpZmllciAoT3B0aW9uLWMgXHUyMTkyIFx1MDBFNywgT3B0aW9uLTMgXHUyMTkyIFx1MDBBMykuIFVzaW5nIE9wdGlvbiBmb3Igb3VyXG4gKiBpbnNwZWN0b3Igc2lsZW50bHkgc3dhbGxvd3MgcmVhbCB1c2VyIGtleXN0cm9rZXMgYW5kIGNvcnJ1cHRzIHRleHRcbiAqIGlucHV0IG9uIGV2ZXJ5IHBhZ2UgdGhhdCBoYXMgdXMgaW5qZWN0ZWQuIEN0cmwgaXMgdGhlIG5hdHVyYWwgY2hvaWNlXG4gKiBmb3IgYSBkZXZlbG9wZXItdG9vbHMgbW9kaWZpZXIgKGFuZCBtYXRjaGVzIERldlRvb2xzJyBJbnNwZWN0IEVsZW1lbnRcbiAqIGJlaGF2aW91ciBvbiBldmVyeSBicm93c2VyKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5TUEVDVF9TSE9SVENVVDogU2hvcnRjdXQgPSB7XG4gIGN0cmw6IHRydWUsXG4gIG1ldGE6IGZhbHNlLFxuICBhbHQ6IGZhbHNlLFxuICBzaGlmdDogZmFsc2UsXG4gIGtleTogJycsXG59O1xuXG4vKipcbiAqIE1hdGNoIGEga2V5Ym9hcmQgLyBtb3VzZSBldmVudCBhZ2FpbnN0IGEgU2hvcnRjdXQuIFJldHVybnMgdHJ1ZSBpZmZcbiAqIGV2ZXJ5IHJlcXVpcmVkIG1vZGlmaWVyIGlzIGhlbGQgQU5EIGV2ZXJ5IG5vbi1yZXF1aXJlZCBtb2RpZmllciBpc1xuICogTk9UIGhlbGQgQU5EIHRoZSBrZXkgbWF0Y2hlcyAob3IgYGtleSA9PT0gJydgIGZvciBtb2RpZmllci1vbmx5KS5cbiAqXG4gKiBPbiBtYWNPUywgY3RybCBtYXRjaGVzIGBldmVudC5tZXRhS2V5YCBpZiB0aGUgc2F2ZWQgc2hvcnRjdXQgaGFzXG4gKiBtZXRhPXRydWUgT1IgY3RybD10cnVlICh3ZSB0cmVhdCBDdHJsLW9uLU1hYyBhbmQgQ21kIGFzIGVxdWl2YWxlbnRcbiAqIGZvciB0aGUgZGVmYXVsdCBcdTIwMTQgbWFueSBkZXZzIGFzc3VtZSBcIkN0cmxcIiByZWFsbHkgbWVhbnMgXCJ0aGUgcGxhdGZvcm1cbiAqIHByaW1hcnkgbW9kaWZpZXJcIikuIFRvIGFkZHJlc3MgZXhwbGljaXRseSwgc2V0IGN0cmw9ZmFsc2UgbWV0YT10cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1Nob3J0Y3V0KFxuICBlOiB7IGN0cmxLZXk/OiBib29sZWFuOyBtZXRhS2V5PzogYm9vbGVhbjsgYWx0S2V5PzogYm9vbGVhbjsgc2hpZnRLZXk/OiBib29sZWFuOyBrZXk/OiBzdHJpbmcgfSxcbiAgczogU2hvcnRjdXQsXG4pOiBib29sZWFuIHtcbiAgLy8gUmVxdWlyZWQgbW9kaWZpZXJzIFx1MjAxNCBldmVyeSB0cnV0aHkgZmllbGQgb2YgYHNgIG11c3QgYmUgc2V0IG9uIHRoZSBldmVudC5cbiAgaWYgKHMuY3RybCAmJiAhZS5jdHJsS2V5KSByZXR1cm4gZmFsc2U7XG4gIGlmIChzLm1ldGEgJiYgIWUubWV0YUtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocy5hbHQgJiYgIWUuYWx0S2V5KSByZXR1cm4gZmFsc2U7XG4gIGlmIChzLnNoaWZ0ICYmICFlLnNoaWZ0S2V5KSByZXR1cm4gZmFsc2U7XG4gIC8vIEZvcmJpZGRlbiBtb2RpZmllcnMgXHUyMDE0IGV2ZXJ5IGZhbHNlIGZpZWxkIG9mIGBzYCBtdXN0IE5PVCBiZSBzZXQgb25cbiAgLy8gdGhlIGV2ZW50LiBPdGhlcndpc2UgQ3RybC1vbmx5IHdvdWxkIG1hdGNoIEN0cmwtU2hpZnQtWCB0b28sIHdoaWNoXG4gIC8vIHdvdWxkIHN1cnByaXNlIHVzZXJzIHdobyBjb25maWd1cmVkIEN0cmwgYWxvbmUuXG4gIGlmICghcy5jdHJsICYmIGUuY3RybEtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXMubWV0YSAmJiBlLm1ldGFLZXkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFzLmFsdCAmJiBlLmFsdEtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXMuc2hpZnQgJiYgZS5zaGlmdEtleSkgcmV0dXJuIGZhbHNlO1xuICAvLyBLZXkgbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUpLiBFbXB0eSBrZXkgbWVhbnMgdGhlIGNob3JkIGlzXG4gIC8vIG1vZGlmaWVyLW9ubHkgXHUyMDE0IGFueSBzdWJzZXF1ZW50IGtleSBzdGlsbCBzYXRpc2ZpZXMgaXQuXG4gIGlmIChzLmtleSAmJiAoZS5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCkgIT09IHMua2V5LnRvTG93ZXJDYXNlKCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmVuZGVyIGEgU2hvcnRjdXQgYXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgbGlrZSBcIkN0cmwrU2hpZnQrS1wiIG9yXG4gKiBcIlx1MjMxOCtDbGlja1wiLiBVc2VkIGJ5IHRoZSBwb3B1cCBVSSBhbmQgYW55IHBsYWNlIHdlIHN1cmZhY2UgdGhlIGNob3JkXG4gKiB0byB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNob3J0Y3V0KHM6IFNob3J0Y3V0LCBvcHRzPzogeyBtYWM/OiBib29sZWFuOyBjbGljaz86IGJvb2xlYW4gfSk6IHN0cmluZyB7XG4gIGNvbnN0IG1hYyA9IG9wdHM/Lm1hYyA/PyAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgL01hYy9pLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtIHx8ICcnKSk7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocy5jdHJsKSBwYXJ0cy5wdXNoKG1hYyA/ICdcdTIzMDMnIDogJ0N0cmwnKTtcbiAgaWYgKHMubWV0YSkgcGFydHMucHVzaChtYWMgPyAnXHUyMzE4JyA6ICdNZXRhJyk7XG4gIGlmIChzLmFsdCkgcGFydHMucHVzaChtYWMgPyAnXHUyMzI1JyA6ICdBbHQnKTtcbiAgaWYgKHMuc2hpZnQpIHBhcnRzLnB1c2gobWFjID8gJ1x1MjFFNycgOiAnU2hpZnQnKTtcbiAgaWYgKHMua2V5KSBwYXJ0cy5wdXNoKHMua2V5Lmxlbmd0aCA9PT0gMSA/IHMua2V5LnRvVXBwZXJDYXNlKCkgOiBzLmtleSk7XG4gIGlmIChvcHRzPy5jbGljaykgcGFydHMucHVzaCgnQ2xpY2snKTtcbiAgcmV0dXJuIHBhcnRzLmpvaW4oJysnKSB8fCAnKHVuc2V0KSc7XG59XG5cbi8qKlxuICogTm9ybWFsaXNlIGEgZnJlc2gga2V5ZG93biBpbnRvIGEgU2hvcnRjdXQgcGF5bG9hZC4gRHJvcHMgVGFiL0VzYy9ldGMuXG4gKiAodGhlIHJlY29yZGVyIFVJIGludml0ZXMgdGhlIHVzZXIgdG8gcHJlc3MgYSBjaG9yZCwgbm90IHRvIG5hdmlnYXRlXG4gKiB0aGUgcGFnZSkgYW5kIHJlamVjdHMgcHVyZSBtb2RpZmllciBrZXlkb3ducyBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndFxuICogZmlyZSBvbiBldmVyeSBTaGlmdCBwcmVzcyB3aGlsZSB0aGUgdXNlciBpcyByZWFjaGluZyBmb3IgYSBsZXR0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG9ydGN1dEZyb21FdmVudChcbiAgZTogeyBjdHJsS2V5PzogYm9vbGVhbjsgbWV0YUtleT86IGJvb2xlYW47IGFsdEtleT86IGJvb2xlYW47IHNoaWZ0S2V5PzogYm9vbGVhbjsga2V5Pzogc3RyaW5nIH0sXG4pOiBTaG9ydGN1dCB8IG51bGwge1xuICBjb25zdCBrID0gZS5rZXkgfHwgJyc7XG4gIC8vIE1vZGlmaWVyLW9ubHkgaXMgYSB2YWxpZCBzaG9ydGN1dCwgYnV0IHRoZSBrZXlkb3duIGV2ZW50IGZvciBhIHB1cmVcbiAgLy8gbW9kaWZpZXIgKENvbnRyb2wgLyBTaGlmdCAvIEFsdCAvIE1ldGEpIHJlcG9ydHMgYGtleWAgYXMgdGhlXG4gIC8vIG1vZGlmaWVyIG5hbWUgXHUyMDE0IHJlY29yZCB0aG9zZSBhcyBtb2RpZmllci1vbmx5LlxuICBpZiAoWydDb250cm9sJywgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0J10uaW5jbHVkZXMoaykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3RybDogISFlLmN0cmxLZXksXG4gICAgICBtZXRhOiAhIWUubWV0YUtleSxcbiAgICAgIGFsdDogISFlLmFsdEtleSxcbiAgICAgIHNoaWZ0OiAhIWUuc2hpZnRLZXksXG4gICAgICBrZXk6ICcnLFxuICAgIH07XG4gIH1cbiAgLy8gU3lzdGVtIGtleXMgd2UgbmV2ZXIgd2FudCB0byBiaW5kLlxuICBpZiAoWydUYWInLCAnRXNjYXBlJywgJ0VudGVyJywgJyddLmluY2x1ZGVzKGspKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBjdHJsOiAhIWUuY3RybEtleSxcbiAgICBtZXRhOiAhIWUubWV0YUtleSxcbiAgICBhbHQ6ICEhZS5hbHRLZXksXG4gICAgc2hpZnQ6ICEhZS5zaGlmdEtleSxcbiAgICBrZXk6IGssXG4gIH07XG59XG5cbi8qKlxuICogUmVhZCB0aGUgaW5zcGVjdCBzaG9ydGN1dCBmcm9tIGV4dGVuc2lvbiBzdG9yYWdlOyBmYWxsIGJhY2sgdG8gdGhlXG4gKiBkZWZhdWx0IGlmIGFic2VudCBvciBtYWxmb3JtZWQuIEFsd2F5cyByZXR1cm5zIGEgdmFsaWQgU2hvcnRjdXQgc29cbiAqIGNhbGxlcnMgZG9uJ3QgaGF2ZSB0byBkZWZlbnNpdmVseSByZS1kZWZhdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEluc3BlY3RTaG9ydGN1dChcbiAgc3RvcmFnZTogeyBnZXQoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IH0sXG4pOiBQcm9taXNlPFNob3J0Y3V0PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgc3RvcmFnZS5nZXQoW1NUT1JBR0VfS0VZX0lOU1BFQ1RdKTtcbiAgICBjb25zdCB2ID0gcmF3W1NUT1JBR0VfS0VZX0lOU1BFQ1RdO1xuICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAmJiB0eXBlb2Ygdi5jdHJsID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYuYWx0ID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYuc2hpZnQgPT09ICdib29sZWFuJ1xuICAgICAgICAmJiB0eXBlb2Ygdi5tZXRhID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYua2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHYgYXMgU2hvcnRjdXQ7XG4gICAgfVxuICB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH1cbiAgcmV0dXJuIHsgLi4uREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VUIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlSW5zcGVjdFNob3J0Y3V0KFxuICBzdG9yYWdlOiB7IHNldChpdGVtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IH0sXG4gIHM6IFNob3J0Y3V0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgW1NUT1JBR0VfS0VZX0lOU1BFQ1RdOiBzIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQTtBQUVBLFlBQUksRUFBRUEsV0FBV0MsVUFBVUQsV0FBV0MsT0FBT0MsV0FBV0YsV0FBV0MsT0FBT0MsUUFBUUMsS0FBSztBQUNyRixnQkFBTSxJQUFJQyxNQUFNLDJEQUEyRDtRQUM3RTtBQUVBLFlBQUksRUFBRUosV0FBV0ssV0FBV0wsV0FBV0ssUUFBUUgsV0FBV0YsV0FBV0ssUUFBUUgsUUFBUUMsS0FBSztBQUN4RixnQkFBTUcsbURBQW1EO0FBT3pELGdCQUFNQyxXQUFXQyxtQkFBaUI7QUFJaEMsa0JBQU1DLGNBQWM7Y0FDbEIsVUFBVTtnQkFDUixTQUFTO2tCQUNQLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxZQUFZO2tCQUNWLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxPQUFPO2tCQUNMLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtjQUNGO2NBQ0EsYUFBYTtnQkFDWCxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxPQUFPO2tCQUNMLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxlQUFlO2tCQUNiLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxhQUFhO2tCQUNYLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxjQUFjO2tCQUNaLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxXQUFXO2tCQUNULFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxRQUFRO2tCQUNOLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxjQUFjO2tCQUNaLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtjQUNGO2NBQ0EsaUJBQWlCO2dCQUNmLFdBQVc7a0JBQ1QsV0FBVztrQkFDWCxXQUFXO2tCQUNYLHdCQUF3QjtnQkFDMUI7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7a0JBQ1gsd0JBQXdCO2dCQUMxQjtnQkFDQSwyQkFBMkI7a0JBQ3pCLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxnQkFBZ0I7a0JBQ2QsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFlBQVk7a0JBQ1YsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFlBQVk7a0JBQ1YsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLGFBQWE7a0JBQ1gsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLDJCQUEyQjtrQkFDekIsV0FBVztrQkFDWCxXQUFXO2tCQUNYLHdCQUF3QjtnQkFDMUI7Z0JBQ0EsZ0JBQWdCO2tCQUNkLFdBQVc7a0JBQ1gsV0FBVztrQkFDWCx3QkFBd0I7Z0JBQzFCO2dCQUNBLFdBQVc7a0JBQ1QsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFlBQVk7a0JBQ1YsV0FBVztrQkFDWCxXQUFXO2tCQUNYLHdCQUF3QjtnQkFDMUI7Z0JBQ0EsWUFBWTtrQkFDVixXQUFXO2tCQUNYLFdBQVc7a0JBQ1gsd0JBQXdCO2dCQUMxQjtjQUNGO2NBQ0EsZ0JBQWdCO2dCQUNkLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLGVBQWU7a0JBQ2IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLGlCQUFpQjtrQkFDZixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsbUJBQW1CO2tCQUNqQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0Esa0JBQWtCO2tCQUNoQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsaUJBQWlCO2tCQUNmLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxzQkFBc0I7a0JBQ3BCLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxtQkFBbUI7a0JBQ2pCLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxvQkFBb0I7a0JBQ2xCLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxZQUFZO2tCQUNWLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtjQUNGO2NBQ0EsWUFBWTtnQkFDVixVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtjQUNGO2NBQ0EsZ0JBQWdCO2dCQUNkLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLGFBQWE7a0JBQ1gsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2NBQ0Y7Y0FDQSxXQUFXO2dCQUNULE9BQU87a0JBQ0wsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLHNCQUFzQjtrQkFDcEIsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLE9BQU87a0JBQ0wsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2NBQ0Y7Y0FDQSxZQUFZO2dCQUNWLG1CQUFtQjtrQkFDakIsUUFBUTtvQkFDTixXQUFXO29CQUNYLFdBQVc7b0JBQ1gscUJBQXFCO2tCQUN2QjtnQkFDRjtnQkFDQSxVQUFVO2tCQUNSLFVBQVU7b0JBQ1IsV0FBVztvQkFDWCxXQUFXO29CQUNYLHFCQUFxQjtrQkFDdkI7a0JBQ0EsWUFBWTtvQkFDVixxQkFBcUI7c0JBQ25CLFdBQVc7c0JBQ1gsV0FBVztvQkFDYjtrQkFDRjtnQkFDRjtjQUNGO2NBQ0EsYUFBYTtnQkFDWCxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxZQUFZO2tCQUNWLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxTQUFTO2tCQUNQLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxlQUFlO2tCQUNiLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxRQUFRO2tCQUNOLFdBQVc7a0JBQ1gsV0FBVztrQkFDWCx3QkFBd0I7Z0JBQzFCO2dCQUNBLFNBQVM7a0JBQ1AsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLGNBQWM7a0JBQ1osV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFFBQVE7a0JBQ04sV0FBVztrQkFDWCxXQUFXO2tCQUNYLHdCQUF3QjtnQkFDMUI7Y0FDRjtjQUNBLGFBQWE7Z0JBQ1gsNkJBQTZCO2tCQUMzQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsNEJBQTRCO2tCQUMxQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLFdBQVc7Z0JBQ1QsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsYUFBYTtrQkFDWCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsZUFBZTtrQkFDYixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsYUFBYTtrQkFDWCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsYUFBYTtrQkFDWCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLFFBQVE7Z0JBQ04sa0JBQWtCO2tCQUNoQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0Esc0JBQXNCO2tCQUNwQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLFlBQVk7Z0JBQ1YscUJBQXFCO2tCQUNuQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLFFBQVE7Z0JBQ04sY0FBYztrQkFDWixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLGNBQWM7Z0JBQ1osT0FBTztrQkFDTCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsV0FBVztrQkFDVCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsY0FBYztrQkFDWixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsaUJBQWlCO2tCQUNmLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtjQUNGO2NBQ0EsaUJBQWlCO2dCQUNmLFNBQVM7a0JBQ1AsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLHNCQUFzQjtrQkFDcEIsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFVBQVU7a0JBQ1IsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2NBQ0Y7Y0FDQSxjQUFjO2dCQUNaLFlBQVk7a0JBQ1YsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFlBQVk7a0JBQ1YsV0FBVztrQkFDWCxXQUFXO2dCQUNiO2dCQUNBLFFBQVE7a0JBQ04sV0FBVztrQkFDWCxXQUFXO2tCQUNYLHdCQUF3QjtnQkFDMUI7Z0JBQ0EsV0FBVztrQkFDVCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsWUFBWTtrQkFDVixXQUFXO2tCQUNYLFdBQVc7a0JBQ1gsd0JBQXdCO2dCQUMxQjtnQkFDQSxZQUFZO2tCQUNWLFdBQVc7a0JBQ1gsV0FBVztrQkFDWCx3QkFBd0I7Z0JBQzFCO2dCQUNBLFFBQVE7a0JBQ04sV0FBVztrQkFDWCxXQUFXO2tCQUNYLHdCQUF3QjtnQkFDMUI7Y0FDRjtjQUNBLGVBQWU7Z0JBQ2IsWUFBWTtrQkFDVixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsV0FBVztrQkFDVCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLFdBQVc7Z0JBQ1QscUJBQXFCO2tCQUNuQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsbUJBQW1CO2tCQUNqQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsbUJBQW1CO2tCQUNqQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0Esc0JBQXNCO2tCQUNwQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsZUFBZTtrQkFDYixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EscUJBQXFCO2tCQUNuQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsbUJBQW1CO2tCQUNqQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLFlBQVk7Z0JBQ1YsY0FBYztrQkFDWixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EscUJBQXFCO2tCQUNuQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsV0FBVztrQkFDVCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLFdBQVc7Z0JBQ1QsU0FBUztrQkFDUCxTQUFTO29CQUNQLFdBQVc7b0JBQ1gsV0FBVztrQkFDYjtrQkFDQSxPQUFPO29CQUNMLFdBQVc7b0JBQ1gsV0FBVztrQkFDYjtrQkFDQSxpQkFBaUI7b0JBQ2YsV0FBVztvQkFDWCxXQUFXO2tCQUNiO2tCQUNBLFVBQVU7b0JBQ1IsV0FBVztvQkFDWCxXQUFXO2tCQUNiO2tCQUNBLE9BQU87b0JBQ0wsV0FBVztvQkFDWCxXQUFXO2tCQUNiO2dCQUNGO2dCQUNBLFdBQVc7a0JBQ1QsT0FBTztvQkFDTCxXQUFXO29CQUNYLFdBQVc7a0JBQ2I7a0JBQ0EsaUJBQWlCO29CQUNmLFdBQVc7b0JBQ1gsV0FBVztrQkFDYjtnQkFDRjtnQkFDQSxRQUFRO2tCQUNOLFNBQVM7b0JBQ1AsV0FBVztvQkFDWCxXQUFXO2tCQUNiO2tCQUNBLE9BQU87b0JBQ0wsV0FBVztvQkFDWCxXQUFXO2tCQUNiO2tCQUNBLGlCQUFpQjtvQkFDZixXQUFXO29CQUNYLFdBQVc7a0JBQ2I7a0JBQ0EsVUFBVTtvQkFDUixXQUFXO29CQUNYLFdBQVc7a0JBQ2I7a0JBQ0EsT0FBTztvQkFDTCxXQUFXO29CQUNYLFdBQVc7a0JBQ2I7Z0JBQ0Y7Y0FDRjtjQUNBLFFBQVE7Z0JBQ04scUJBQXFCO2tCQUNuQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0Esa0JBQWtCO2tCQUNoQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsV0FBVztrQkFDVCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsYUFBYTtrQkFDWCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsaUJBQWlCO2tCQUNmLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxPQUFPO2tCQUNMLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxjQUFjO2tCQUNaLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxXQUFXO2tCQUNULFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxtQkFBbUI7a0JBQ2pCLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxhQUFhO2tCQUNYLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxhQUFhO2tCQUNYLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxhQUFhO2tCQUNYLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxRQUFRO2tCQUNOLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxTQUFTO2tCQUNQLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxhQUFhO2tCQUNYLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxlQUFlO2tCQUNiLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxXQUFXO2tCQUNULFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxtQkFBbUI7a0JBQ2pCLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtnQkFDQSxVQUFVO2tCQUNSLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtjQUNGO2NBQ0EsWUFBWTtnQkFDVixPQUFPO2tCQUNMLFdBQVc7a0JBQ1gsV0FBVztnQkFDYjtjQUNGO2NBQ0EsaUJBQWlCO2dCQUNmLGdCQUFnQjtrQkFDZCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsWUFBWTtrQkFDVixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLGNBQWM7Z0JBQ1osMEJBQTBCO2tCQUN4QixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtjQUNBLFdBQVc7Z0JBQ1QsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsT0FBTztrQkFDTCxXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsY0FBYztrQkFDWixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0Esa0JBQWtCO2tCQUNoQixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Z0JBQ0EsVUFBVTtrQkFDUixXQUFXO2tCQUNYLFdBQVc7Z0JBQ2I7Y0FDRjtZQUNGO0FBRUEsZ0JBQUlDLE9BQU9DLEtBQUtGLFdBQVcsRUFBRUcsV0FBVyxHQUFHO0FBQ3pDLG9CQUFNLElBQUlSLE1BQU0sNkRBQTZEO1lBQy9FO1lBWUEsTUFBTVMsdUJBQXVCQyxRQUFRO2NBQ25DQyxZQUFZQyxZQUFZQyxRQUFRQyxRQUFXO0FBQ3pDLHNCQUFNRCxLQUFLO0FBQ1gscUJBQUtELGFBQWFBO2NBQ3BCO2NBRUFHLElBQUlDLEtBQUs7QUFDUCxvQkFBSSxDQUFDLEtBQUtDLElBQUlELEdBQUcsR0FBRztBQUNsQix1QkFBS0UsSUFBSUYsS0FBSyxLQUFLSixXQUFXSSxHQUFHLENBQUM7Z0JBQ3BDO0FBRUEsdUJBQU8sTUFBTUQsSUFBSUMsR0FBRztjQUN0QjtZQUNGO0FBU0Esa0JBQU1HLGFBQWFDLFdBQVM7QUFDMUIscUJBQU9BLFNBQVMsT0FBT0EsVUFBVSxZQUFZLE9BQU9BLE1BQU1DLFNBQVM7WUFDckU7QUFpQ0Esa0JBQU1DLGVBQWVBLENBQUNDLFNBQVNDLGFBQWE7QUFDMUMscUJBQU8sSUFBSUMsaUJBQWlCO0FBQzFCLG9CQUFJckIsY0FBY04sUUFBUTRCLFdBQVc7QUFDbkNILDBCQUFRSSxPQUFPLElBQUkzQixNQUFNSSxjQUFjTixRQUFRNEIsVUFBVUUsT0FBTyxDQUFDO2dCQUNuRSxXQUFXSixTQUFTSyxxQkFDUkosYUFBYWpCLFVBQVUsS0FBS2dCLFNBQVNLLHNCQUFzQixPQUFRO0FBQzdFTiwwQkFBUU8sUUFBUUwsYUFBYSxDQUFDLENBQUM7Z0JBQ2pDLE9BQU87QUFDTEYsMEJBQVFPLFFBQVFMLFlBQVk7Z0JBQzlCO2NBQ0Y7WUFDRjtBQUVBLGtCQUFNTSxxQkFBc0JDLGFBQVlBLFdBQVcsSUFBSSxhQUFhO0FBNEJwRSxrQkFBTUMsb0JBQW9CQSxDQUFDQyxNQUFNVixhQUFhO0FBQzVDLHFCQUFPLFNBQVNXLHFCQUFxQkMsV0FBV0MsTUFBTTtBQUNwRCxvQkFBSUEsS0FBSzdCLFNBQVNnQixTQUFTYyxTQUFTO0FBQ2xDLHdCQUFNLElBQUl0QyxNQUFPLHFCQUFvQndCLFNBQVNjLE9BQVEsSUFBR1AsbUJBQW1CUCxTQUFTYyxPQUFPLENBQUUsUUFBT0osSUFBSyxXQUFVRyxLQUFLN0IsTUFBTyxFQUFDO2dCQUNuSTtBQUVBLG9CQUFJNkIsS0FBSzdCLFNBQVNnQixTQUFTZSxTQUFTO0FBQ2xDLHdCQUFNLElBQUl2QyxNQUFPLG9CQUFtQndCLFNBQVNlLE9BQVEsSUFBR1IsbUJBQW1CUCxTQUFTZSxPQUFPLENBQUUsUUFBT0wsSUFBSyxXQUFVRyxLQUFLN0IsTUFBTyxFQUFDO2dCQUNsSTtBQUVBLHVCQUFPLElBQUlnQyxRQUFRLENBQUNWLFNBQVNILFdBQVc7QUFDdEMsc0JBQUlILFNBQVNpQixzQkFBc0I7QUFJakMsd0JBQUk7QUFDRkwsNkJBQU9GLElBQUksRUFBRSxHQUFHRyxNQUFNZixhQUFhO3dCQUFDUTt3QkFBU0g7c0JBQU0sR0FBR0gsUUFBUSxDQUFDO29CQUNqRSxTQUFTa0IsU0FBUztBQUNoQkMsOEJBQVFDLEtBQU0sR0FBRVYsSUFBSyw0R0FDd0NRLE9BQU87QUFFcEVOLDZCQUFPRixJQUFJLEVBQUUsR0FBR0csSUFBSTtBQUlwQmIsK0JBQVNpQix1QkFBdUI7QUFDaENqQiwrQkFBU3FCLGFBQWE7QUFFdEJmLDhCQUFRO29CQUNWO2tCQUNGLFdBQVdOLFNBQVNxQixZQUFZO0FBQzlCVCwyQkFBT0YsSUFBSSxFQUFFLEdBQUdHLElBQUk7QUFDcEJQLDRCQUFRO2tCQUNWLE9BQU87QUFDTE0sMkJBQU9GLElBQUksRUFBRSxHQUFHRyxNQUFNZixhQUFhO3NCQUFDUTtzQkFBU0g7b0JBQU0sR0FBR0gsUUFBUSxDQUFDO2tCQUNqRTtnQkFDRixDQUFDO2NBQ0g7WUFDRjtBQXFCQSxrQkFBTXNCLGFBQWFBLENBQUNWLFFBQVFXLFFBQVFDLFlBQVk7QUFDOUMscUJBQU8sSUFBSUMsTUFBTUYsUUFBUTtnQkFDdkJHLE1BQU1DLGNBQWNDLFNBQVNmLE1BQU07QUFDakMseUJBQU9XLFFBQVFLLEtBQUtELFNBQVNoQixRQUFRLEdBQUdDLElBQUk7Z0JBQzlDO2NBQ0YsQ0FBQztZQUNIO0FBRUEsZ0JBQUlpQixpQkFBaUJDLFNBQVNGLEtBQUtHLEtBQUtsRCxPQUFPbUQsVUFBVUgsY0FBYztBQXlCdkUsa0JBQU1JLGFBQWFBLENBQUN0QixRQUFRdUIsV0FBVyxDQUFDLEdBQUduQyxXQUFXLENBQUMsTUFBTTtBQUMzRCxrQkFBSW9DLFFBQVF0RCx1QkFBT3VELE9BQU8sSUFBSTtBQUM5QixrQkFBSUMsV0FBVztnQkFDYjdDLElBQUk4QyxjQUFhQyxNQUFNO0FBQ3JCLHlCQUFPQSxRQUFRNUIsVUFBVTRCLFFBQVFKO2dCQUNuQztnQkFFQTdDLElBQUlnRCxjQUFhQyxNQUFNQyxVQUFVO0FBQy9CLHNCQUFJRCxRQUFRSixPQUFPO0FBQ2pCLDJCQUFPQSxNQUFNSSxJQUFJO2tCQUNuQjtBQUVBLHNCQUFJLEVBQUVBLFFBQVE1QixTQUFTO0FBQ3JCLDJCQUFPdEI7a0JBQ1Q7QUFFQSxzQkFBSU0sUUFBUWdCLE9BQU80QixJQUFJO0FBRXZCLHNCQUFJLE9BQU81QyxVQUFVLFlBQVk7QUFJL0Isd0JBQUksT0FBT3VDLFNBQVNLLElBQUksTUFBTSxZQUFZO0FBRXhDNUMsOEJBQVEwQixXQUFXVixRQUFRQSxPQUFPNEIsSUFBSSxHQUFHTCxTQUFTSyxJQUFJLENBQUM7b0JBQ3pELFdBQVdWLGVBQWU5QixVQUFVd0MsSUFBSSxHQUFHO0FBR3pDLDBCQUFJaEIsVUFBVWYsa0JBQWtCK0IsTUFBTXhDLFNBQVN3QyxJQUFJLENBQUM7QUFDcEQ1Qyw4QkFBUTBCLFdBQVdWLFFBQVFBLE9BQU80QixJQUFJLEdBQUdoQixPQUFPO29CQUNsRCxPQUFPO0FBR0w1Qiw4QkFBUUEsTUFBTW9DLEtBQUtwQixNQUFNO29CQUMzQjtrQkFDRixXQUFXLE9BQU9oQixVQUFVLFlBQVlBLFVBQVUsU0FDdENrQyxlQUFlSyxVQUFVSyxJQUFJLEtBQzdCVixlQUFlOUIsVUFBVXdDLElBQUksSUFBSTtBQUkzQzVDLDRCQUFRc0MsV0FBV3RDLE9BQU91QyxTQUFTSyxJQUFJLEdBQUd4QyxTQUFTd0MsSUFBSSxDQUFDO2tCQUMxRCxXQUFXVixlQUFlOUIsVUFBVSxHQUFHLEdBQUc7QUFFeENKLDRCQUFRc0MsV0FBV3RDLE9BQU91QyxTQUFTSyxJQUFJLEdBQUd4QyxTQUFTLEdBQUcsQ0FBQztrQkFDekQsT0FBTztBQUdMbEIsMkJBQU80RCxlQUFlTixPQUFPSSxNQUFNO3NCQUNqQ0csY0FBYztzQkFDZEMsWUFBWTtzQkFDWnJELE1BQU07QUFDSiwrQkFBT3FCLE9BQU80QixJQUFJO3NCQUNwQjtzQkFDQTlDLElBQUlFLFFBQU87QUFDVGdCLCtCQUFPNEIsSUFBSSxJQUFJNUM7c0JBQ2pCO29CQUNGLENBQUM7QUFFRCwyQkFBT0E7a0JBQ1Q7QUFFQXdDLHdCQUFNSSxJQUFJLElBQUk1QztBQUNkLHlCQUFPQTtnQkFDVDtnQkFFQUYsSUFBSTZDLGNBQWFDLE1BQU01QyxPQUFPNkMsVUFBVTtBQUN0QyxzQkFBSUQsUUFBUUosT0FBTztBQUNqQkEsMEJBQU1JLElBQUksSUFBSTVDO2tCQUNoQixPQUFPO0FBQ0xnQiwyQkFBTzRCLElBQUksSUFBSTVDO2tCQUNqQjtBQUNBLHlCQUFPO2dCQUNUO2dCQUVBOEMsZUFBZUgsY0FBYUMsTUFBTUssTUFBTTtBQUN0Qyx5QkFBT0MsUUFBUUosZUFBZU4sT0FBT0ksTUFBTUssSUFBSTtnQkFDakQ7Z0JBRUFFLGVBQWVSLGNBQWFDLE1BQU07QUFDaEMseUJBQU9NLFFBQVFDLGVBQWVYLE9BQU9JLElBQUk7Z0JBQzNDO2NBQ0Y7QUFZQSxrQkFBSUQsY0FBY3pELE9BQU91RCxPQUFPekIsTUFBTTtBQUN0QyxxQkFBTyxJQUFJYSxNQUFNYyxhQUFhRCxRQUFRO1lBQ3hDO0FBa0JBLGtCQUFNVSxZQUFZQyxpQkFBZTtjQUMvQkMsWUFBWXRDLFFBQVF1QyxhQUFhdEMsTUFBTTtBQUNyQ0QsdUJBQU9zQyxZQUFZRCxXQUFXMUQsSUFBSTRELFFBQVEsR0FBRyxHQUFHdEMsSUFBSTtjQUN0RDtjQUVBdUMsWUFBWXhDLFFBQVF1QyxVQUFVO0FBQzVCLHVCQUFPdkMsT0FBT3dDLFlBQVlILFdBQVcxRCxJQUFJNEQsUUFBUSxDQUFDO2NBQ3BEO2NBRUFFLGVBQWV6QyxRQUFRdUMsVUFBVTtBQUMvQnZDLHVCQUFPeUMsZUFBZUosV0FBVzFELElBQUk0RCxRQUFRLENBQUM7Y0FDaEQ7WUFDRjtBQUVBLGtCQUFNRyw0QkFBNEIsSUFBSXJFLGVBQWVrRSxjQUFZO0FBQy9ELGtCQUFJLE9BQU9BLGFBQWEsWUFBWTtBQUNsQyx1QkFBT0E7Y0FDVDtBQVVBLHFCQUFPLFNBQVNJLGtCQUFrQkMsS0FBSztBQUNyQyxzQkFBTUMsYUFBYXZCLFdBQVdzQixLQUFLLENBQUMsR0FBa0I7a0JBQ3BERSxZQUFZO29CQUNWNUMsU0FBUztvQkFDVEMsU0FBUztrQkFDWDtnQkFDRixDQUFDO0FBQ0RvQyx5QkFBU00sVUFBVTtjQUNyQjtZQUNGLENBQUM7QUFFRCxrQkFBTUUsb0JBQW9CLElBQUkxRSxlQUFla0UsY0FBWTtBQUN2RCxrQkFBSSxPQUFPQSxhQUFhLFlBQVk7QUFDbEMsdUJBQU9BO2NBQ1Q7QUFtQkEscUJBQU8sU0FBU1MsVUFBVXhELFNBQVN5RCxRQUFRQyxjQUFjO0FBQ3ZELG9CQUFJQyxzQkFBc0I7QUFFMUIsb0JBQUlDO0FBQ0osb0JBQUlDLHNCQUFzQixJQUFJakQsUUFBUVYsYUFBVztBQUMvQzBELHdDQUFzQixTQUFTRSxVQUFVO0FBQ3ZDSCwwQ0FBc0I7QUFDdEJ6RCw0QkFBUTRELFFBQVE7a0JBQ2xCO2dCQUNGLENBQUM7QUFFRCxvQkFBSUM7QUFDSixvQkFBSTtBQUNGQSwyQkFBU2hCLFNBQVMvQyxTQUFTeUQsUUFBUUcsbUJBQW1CO2dCQUN4RCxTQUFTSSxLQUFLO0FBQ1pELDJCQUFTbkQsUUFBUWIsT0FBT2lFLEdBQUc7Z0JBQzdCO0FBRUEsc0JBQU1DLG1CQUFtQkYsV0FBVyxRQUFReEUsV0FBV3dFLE1BQU07QUFLN0Qsb0JBQUlBLFdBQVcsUUFBUSxDQUFDRSxvQkFBb0IsQ0FBQ04scUJBQXFCO0FBQ2hFLHlCQUFPO2dCQUNUO0FBTUEsc0JBQU1PLHFCQUFzQnZFLGFBQVk7QUFDdENBLDBCQUFRRixLQUFLMEUsU0FBTztBQUVsQlQsaUNBQWFTLEdBQUc7a0JBQ2xCLEdBQUdDLFdBQVM7QUFHVix3QkFBSXBFO0FBQ0osd0JBQUlvRSxVQUFVQSxpQkFBaUJoRyxTQUMzQixPQUFPZ0csTUFBTXBFLFlBQVksV0FBVztBQUN0Q0Esc0JBQUFBLFdBQVVvRSxNQUFNcEU7b0JBQ2xCLE9BQU87QUFDTEEsc0JBQUFBLFdBQVU7b0JBQ1o7QUFFQTBELGlDQUFhO3NCQUNYVyxtQ0FBbUM7c0JBQ25DckUsU0FBQUE7b0JBQ0YsQ0FBQztrQkFDSCxDQUFDLEVBQUVzRSxNQUFNTixTQUFPO0FBRWRqRCw0QkFBUXFELE1BQU0sMkNBQTJDSixHQUFHO2tCQUM5RCxDQUFDO2dCQUNIO0FBS0Esb0JBQUlDLGtCQUFrQjtBQUNwQkMscUNBQW1CSCxNQUFNO2dCQUMzQixPQUFPO0FBQ0xHLHFDQUFtQkwsbUJBQW1CO2dCQUN4QztBQUdBLHVCQUFPO2NBQ1Q7WUFDRixDQUFDO0FBRUQsa0JBQU1VLDZCQUE2QkEsQ0FBQztjQUFDeEU7Y0FBUUc7WUFBTyxHQUFHc0UsVUFBVTtBQUMvRCxrQkFBSWhHLGNBQWNOLFFBQVE0QixXQUFXO0FBSW5DLG9CQUFJdEIsY0FBY04sUUFBUTRCLFVBQVVFLFlBQVkxQixrREFBa0Q7QUFDaEc0QiwwQkFBUTtnQkFDVixPQUFPO0FBQ0xILHlCQUFPLElBQUkzQixNQUFNSSxjQUFjTixRQUFRNEIsVUFBVUUsT0FBTyxDQUFDO2dCQUMzRDtjQUNGLFdBQVd3RSxTQUFTQSxNQUFNSCxtQ0FBbUM7QUFHM0R0RSx1QkFBTyxJQUFJM0IsTUFBTW9HLE1BQU14RSxPQUFPLENBQUM7Y0FDakMsT0FBTztBQUNMRSx3QkFBUXNFLEtBQUs7Y0FDZjtZQUNGO0FBRUEsa0JBQU1DLHFCQUFxQkEsQ0FBQ25FLE1BQU1WLFVBQVU4RSxvQkFBb0JqRSxTQUFTO0FBQ3ZFLGtCQUFJQSxLQUFLN0IsU0FBU2dCLFNBQVNjLFNBQVM7QUFDbEMsc0JBQU0sSUFBSXRDLE1BQU8scUJBQW9Cd0IsU0FBU2MsT0FBUSxJQUFHUCxtQkFBbUJQLFNBQVNjLE9BQU8sQ0FBRSxRQUFPSixJQUFLLFdBQVVHLEtBQUs3QixNQUFPLEVBQUM7Y0FDbkk7QUFFQSxrQkFBSTZCLEtBQUs3QixTQUFTZ0IsU0FBU2UsU0FBUztBQUNsQyxzQkFBTSxJQUFJdkMsTUFBTyxvQkFBbUJ3QixTQUFTZSxPQUFRLElBQUdSLG1CQUFtQlAsU0FBU2UsT0FBTyxDQUFFLFFBQU9MLElBQUssV0FBVUcsS0FBSzdCLE1BQU8sRUFBQztjQUNsSTtBQUVBLHFCQUFPLElBQUlnQyxRQUFRLENBQUNWLFNBQVNILFdBQVc7QUFDdEMsc0JBQU00RSxZQUFZSiwyQkFBMkIzQyxLQUFLLE1BQU07a0JBQUMxQjtrQkFBU0g7Z0JBQU0sQ0FBQztBQUN6RVUscUJBQUttRSxLQUFLRCxTQUFTO0FBQ25CRCxnQ0FBZ0JHLFlBQVksR0FBR3BFLElBQUk7Y0FDckMsQ0FBQztZQUNIO0FBRUEsa0JBQU1xRSxpQkFBaUI7Y0FDckJDLFVBQVU7Z0JBQ1JDLFNBQVM7a0JBQ1A3QixtQkFBbUJQLFVBQVVNLHlCQUF5QjtnQkFDeEQ7Y0FDRjtjQUNBaEYsU0FBUztnQkFDUHNGLFdBQVdaLFVBQVVXLGlCQUFpQjtnQkFDdEMwQixtQkFBbUJyQyxVQUFVVyxpQkFBaUI7Z0JBQzlDc0IsYUFBYUosbUJBQW1CN0MsS0FBSyxNQUFNLGVBQWU7a0JBQUNsQixTQUFTO2tCQUFHQyxTQUFTO2dCQUFDLENBQUM7Y0FDcEY7Y0FDQXVFLE1BQU07Z0JBQ0pMLGFBQWFKLG1CQUFtQjdDLEtBQUssTUFBTSxlQUFlO2tCQUFDbEIsU0FBUztrQkFBR0MsU0FBUztnQkFBQyxDQUFDO2NBQ3BGO1lBQ0Y7QUFDQSxrQkFBTXdFLGtCQUFrQjtjQUN0QkMsT0FBTztnQkFBQzFFLFNBQVM7Z0JBQUdDLFNBQVM7Y0FBQztjQUM5QnhCLEtBQUs7Z0JBQUN1QixTQUFTO2dCQUFHQyxTQUFTO2NBQUM7Y0FDNUJyQixLQUFLO2dCQUFDb0IsU0FBUztnQkFBR0MsU0FBUztjQUFDO1lBQzlCO0FBQ0FsQyx3QkFBWTRHLFVBQVU7Y0FDcEJMLFNBQVM7Z0JBQUMsS0FBS0c7Y0FBZTtjQUM5QkcsVUFBVTtnQkFBQyxLQUFLSDtjQUFlO2NBQy9CSSxVQUFVO2dCQUFDLEtBQUtKO2NBQWU7WUFDakM7QUFFQSxtQkFBT3JELFdBQVd0RCxlQUFlc0csZ0JBQWdCckcsV0FBVztVQUM5RDtBQUlBK0csVUFBQUEsUUFBT0MsVUFBVWxILFNBQVNOLE1BQU07UUFDbEMsT0FBTztBQUNMdUgsVUFBQUEsUUFBT0MsVUFBVXpILFdBQVdLO1FBQzlCO01BQUMsQ0FBQTs7Ozs7QUN2ckNELHFDQUFPOzs7QUNnQkEsTUFBTSxzQkFBc0I7QUFZNUIsTUFBTSwyQkFBcUM7QUFBQSxJQUNoRCxNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsSUFDUCxLQUFLO0FBQUEsRUFDUDtBQVlPLFdBQVMsZ0JBQ2QsR0FDQSxHQUNTO0FBRVQsUUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVMsUUFBTztBQUNqQyxRQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUyxRQUFPO0FBQ2pDLFFBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxPQUFRLFFBQU87QUFDL0IsUUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVUsUUFBTztBQUluQyxRQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUyxRQUFPO0FBQ2pDLFFBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFTLFFBQU87QUFDakMsUUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQVEsUUFBTztBQUMvQixRQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBVSxRQUFPO0FBR25DLFFBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxJQUFJLFlBQVksTUFBTSxFQUFFLElBQUksWUFBWSxFQUFHLFFBQU87QUFDekUsV0FBTztBQUFBLEVBQ1Q7QUF5REEsaUJBQXNCLG9CQUNwQixTQUNtQjtBQUNuQixRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sUUFBUSxJQUFJLENBQUMsbUJBQW1CLENBQUM7QUFDbkQsWUFBTSxJQUFJLElBQUksbUJBQW1CO0FBQ2pDLFVBQUksS0FBSyxPQUFPLE1BQU0sWUFDZixPQUFPLEVBQUUsU0FBUyxhQUNsQixPQUFPLEVBQUUsUUFBUSxhQUNqQixPQUFPLEVBQUUsVUFBVSxhQUNuQixPQUFPLEVBQUUsU0FBUyxhQUNsQixPQUFPLEVBQUUsUUFBUSxVQUFVO0FBQ2hDLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRixRQUFRO0FBQUEsSUFBcUI7QUFDN0IsV0FBTyxFQUFFLEdBQUcseUJBQXlCO0FBQUEsRUFDdkM7OztBRG5IQSxNQUFNLHFCQUFOLE1BQXlCO0FBQUEsSUFNdkIsY0FBYztBQUZkO0FBQUE7QUFBQTtBQUFBLFdBQVEsa0JBQTRCLEVBQUUsR0FBRyx5QkFBeUI7QUFHaEUsV0FBSyxhQUFhO0FBQ2xCLFdBQUssY0FBYztBQUNuQixXQUFLLGtCQUFrQjtBQUN2QixXQUFLLGNBQWM7QUFDbkIsV0FBSyxxQkFBcUI7QUFBQSxJQUM1QjtBQUFBLElBRUEsTUFBYyxlQUFlO0FBQzNCLFVBQUk7QUFFRixhQUFLLGtCQUFrQixNQUFNLG9CQUFvQixPQUFPLFFBQVEsS0FBWTtBQUFBLE1BQzlFLFFBQVE7QUFDTixhQUFLLGtCQUFrQixFQUFFLEdBQUcseUJBQXlCO0FBQUEsTUFDdkQ7QUFBQSxJQUNGO0FBQUEsSUFFUSxnQkFBZ0I7QUFDdEIsVUFBSTtBQUNGLGVBQU8sUUFBUSxVQUFVLFlBQVksQ0FBQyxTQUFTLFNBQVM7QUFDdEQsY0FBSSxTQUFTLFFBQVM7QUFDdEIsZ0JBQU0sSUFBSSxRQUFRLG1CQUFtQjtBQUNyQyxjQUFJLENBQUMsRUFBRztBQUNSLGNBQUksRUFBRSxZQUFZLE9BQU8sRUFBRSxhQUFhLFVBQVU7QUFDaEQsaUJBQUssa0JBQWtCLEVBQUU7QUFBQSxVQUMzQixPQUFPO0FBQ0wsaUJBQUssa0JBQWtCLEVBQUUsR0FBRyx5QkFBeUI7QUFBQSxVQUN2RDtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0gsUUFBUTtBQUFBLE1BQWlEO0FBQUEsSUFDM0Q7QUFBQSxJQUVRLG9CQUFvQjtBQUMxQixlQUFTLGlCQUFpQixTQUFTLENBQUMsTUFBTTtBQUN4QyxZQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxlQUFlLEVBQUc7QUFFL0MsVUFBRSxlQUFlO0FBQ2pCLFVBQUUsZ0JBQWdCO0FBRWxCLGNBQU0sVUFBVSxFQUFFO0FBQ2xCLGNBQU0sU0FBUyxLQUFLLHNCQUFzQixPQUFPO0FBQ2pELGNBQU0sVUFBVSxLQUFLLFdBQVcsT0FBTztBQUV2QyxjQUFNLFFBQThCO0FBQUEsVUFDbEMsT0FBTztBQUFBLFVBQ1AsV0FBVyxLQUFLLGdCQUFnQjtBQUFBLFVBQ2hDO0FBQUEsVUFDQTtBQUFBLFVBQ0EsWUFBWSxRQUFRLGFBQWEsZUFBZSxLQUFLO0FBQUEsUUFDdkQ7QUFHQSxlQUFPLFFBQVEsWUFBWSxFQUFFLFFBQVEsbUJBQW1CLE1BQU0sTUFBTSxDQUFDO0FBQUEsTUFDdkUsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVRLHVCQUF1QjtBQUM3QixhQUFPLFFBQVEsVUFBVSxZQUFZLENBQUMsU0FBUyxTQUFTLGlCQUFpQjtBQTlGN0UsWUFBQXFIO0FBK0ZNLGdCQUFRLFFBQVEsUUFBUTtBQUFBLFVBQ3RCLEtBQUs7QUFDSCxzQkFBVSxLQUFLLFFBQVEsUUFBUSw2QkFBNkI7QUFDNUQseUJBQWEsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUM5QixtQkFBTztBQUFBLFVBQ1QsS0FBSztBQUNILHNCQUFVLEtBQUs7QUFDZix5QkFBYSxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQzlCLG1CQUFPO0FBQUEsVUFDVCxLQUFLO0FBQ0gsc0JBQVUsV0FBVyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ3pDLHlCQUFhLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDOUIsbUJBQU87QUFBQSxVQUNULEtBQUs7QUFDSCxzQkFBVSxVQUFVLFFBQVEsUUFBUTtBQUNwQyx5QkFBYSxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQzlCLG1CQUFPO0FBQUEsVUFDVCxLQUFLO0FBQ0gsc0JBQVUsYUFBYSxRQUFRLElBQUk7QUFDbkMseUJBQWEsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUM5QixtQkFBTztBQUFBLFVBQ1QsS0FBSztBQUNILGdCQUFJLFFBQVEsU0FBUyxVQUFVLFFBQVEsU0FBUyxRQUFTLGFBQVksUUFBUSxRQUFRLElBQUk7QUFDekYsZ0JBQUksUUFBUSxTQUFTLFVBQVUsUUFBUSxTQUFTLFVBQVcsYUFBWSxRQUFRLFFBQVEsSUFBSTtBQUMzRixnQkFBSSxRQUFRLFVBQVUsYUFBYSxRQUFRLFVBQVUsYUFBYSxRQUFRLFVBQVUsUUFBUTtBQUMxRiwwQkFBWSxTQUFTLFFBQVEsS0FBSztBQUFBLFlBQ3BDO0FBQ0EseUJBQWE7QUFBQSxjQUNYLFNBQVM7QUFBQSxjQUNULE1BQU0sWUFBWSxPQUFPO0FBQUEsWUFDM0IsQ0FBQztBQUNELG1CQUFPO0FBQUEsVUFDVCxLQUFLO0FBQ0gsZ0JBQUksUUFBUSxTQUFTLFVBQVUsUUFBUSxTQUFTLFFBQVMsYUFBWSxRQUFRLFFBQVEsSUFBSTtBQUN6RixnQkFBSSxRQUFRLFNBQVMsVUFBVSxRQUFRLFNBQVMsVUFBVyxhQUFZLFFBQVEsUUFBUSxJQUFJO0FBQzNGLGdCQUFJLFFBQVEsVUFBVSxhQUFhLFFBQVEsVUFBVSxhQUFhLFFBQVEsVUFBVSxRQUFRO0FBQzFGLDBCQUFZLFNBQVMsUUFBUSxLQUFLO0FBQUEsWUFDcEM7QUFDQSx3QkFBWSxLQUFLO0FBQ2pCLHlCQUFhLEVBQUUsU0FBUyxNQUFNLE1BQU0sS0FBSyxDQUFDO0FBQzFDLG1CQUFPO0FBQUEsVUFDVCxLQUFLO0FBQ0gsd0JBQVksS0FBSztBQUNqQix5QkFBYSxFQUFFLFNBQVMsTUFBTSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxtQkFBTztBQUFBLFVBQ1QsS0FBSztBQUNILHlCQUFhO0FBQUEsY0FDWCxTQUFTO0FBQUEsY0FDVCxNQUFNLFlBQVksT0FBTztBQUFBLGNBQ3pCLE1BQU0sWUFBWSxRQUFRO0FBQUEsY0FDMUIsTUFBTSxZQUFZLFFBQVE7QUFBQSxZQUM1QixDQUFDO0FBQ0QsbUJBQU87QUFBQSxVQUNULEtBQUs7QUFDSCxnQkFBSSxRQUFRLFNBQVMsVUFBVSxRQUFRLFNBQVMsU0FBUztBQUN2RCwwQkFBWSxRQUFRLFFBQVEsSUFBSTtBQUNoQywyQkFBYSxFQUFFLFNBQVMsTUFBTSxNQUFNLFFBQVEsS0FBSyxDQUFDO0FBQUEsWUFDcEQsT0FBTztBQUNMLDJCQUFhLEVBQUUsU0FBUyxPQUFPLE9BQU8saUNBQWlDLENBQUM7QUFBQSxZQUMxRTtBQUNBLG1CQUFPO0FBQUEsVUFDVCxLQUFLO0FBQ0gsZ0JBQUksUUFBUSxTQUFTLFVBQVUsUUFBUSxTQUFTLFdBQVc7QUFDekQsMEJBQVksUUFBUSxRQUFRLElBQUk7QUFDaEMsMkJBQWEsRUFBRSxTQUFTLE1BQU0sTUFBTSxRQUFRLEtBQUssQ0FBQztBQUFBLFlBQ3BELE9BQU87QUFDTCwyQkFBYSxFQUFFLFNBQVMsT0FBTyxPQUFPLG1DQUFtQyxDQUFDO0FBQUEsWUFDNUU7QUFDQSxtQkFBTztBQUFBLFVBQ1QsS0FBSztBQUNILGdCQUFJLFFBQVEsVUFBVSxhQUFhLFFBQVEsVUFBVSxhQUFhLFFBQVEsVUFBVSxRQUFRO0FBQzFGLDBCQUFZLFNBQVMsUUFBUSxLQUFLO0FBQ2xDLDJCQUFhLEVBQUUsU0FBUyxNQUFNLE9BQU8sUUFBUSxNQUFNLENBQUM7QUFBQSxZQUN0RCxPQUFPO0FBQ0wsMkJBQWEsRUFBRSxTQUFTLE9BQU8sT0FBTyxxQ0FBcUMsQ0FBQztBQUFBLFlBQzlFO0FBQ0EsbUJBQU87QUFBQSxVQUNULEtBQUs7QUFDSCxnQkFBSSxPQUFPLFFBQVEsWUFBWSxXQUFXO0FBQ3hDLDBCQUFZLFdBQVcsUUFBUSxPQUFPO0FBQ3RDLDJCQUFhLEVBQUUsU0FBUyxNQUFNLFNBQVMsUUFBUSxRQUFRLENBQUM7QUFBQSxZQUMxRCxPQUFPO0FBQ0wsMkJBQWEsRUFBRSxTQUFTLE9BQU8sT0FBTywwQkFBMEIsQ0FBQztBQUFBLFlBQ25FO0FBQ0EsbUJBQU87QUFBQTtBQUFBLFVBR1QsS0FBSztBQUNILDBCQUFjLE1BQU07QUFDcEIseUJBQWEsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUM5QixtQkFBTztBQUFBLFVBQ1QsS0FBSztBQUNILDBCQUFjLEtBQUs7QUFDbkIseUJBQWEsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUM5QixtQkFBTztBQUFBLFVBQ1QsS0FBSztBQUNILHlCQUFhLEVBQUUsU0FBUyxNQUFNLE1BQU0sZUFBZSxFQUFFLENBQUM7QUFDdEQsbUJBQU87QUFBQSxVQUNULEtBQUs7QUFDSCwwQkFBYyxLQUFLO0FBQ25CLHlCQUFhLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDOUIsbUJBQU87QUFBQSxVQUNULEtBQUs7QUFDSCwwQkFBYyxLQUFLO0FBQ25CLHlCQUFhLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDOUIsbUJBQU87QUFBQSxRQUNYO0FBR0EsWUFBSSxRQUFRLFdBQVcsY0FBYztBQUNuQyx1QkFBYSxFQUFFLFdBQVNBLE1BQUEsU0FBUyxvQkFBVCxnQkFBQUEsSUFBMEIsY0FBYSxHQUFHLENBQUM7QUFDbkUsaUJBQU87QUFBQSxRQUNUO0FBRUEsWUFBSSxRQUFRLFdBQVcsY0FBYztBQUNuQyxjQUFJLE9BQU8sUUFBUSxZQUFZLFVBQVU7QUFDdkMscUJBQVMsS0FBSztBQUNkLHFCQUFTLE1BQU0sUUFBUSxPQUFPO0FBQzlCLHFCQUFTLE1BQU07QUFBQSxVQUNqQjtBQUNBLHVCQUFhLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDOUIsaUJBQU87QUFBQSxRQUNUO0FBRUEsZUFBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVRLHNCQUFzQixTQUFrRDtBQUM5RSxZQUFNLFlBQVksS0FBSyxnQkFBZ0I7QUFFdkMsY0FBUSxXQUFXO0FBQUEsUUFDakIsS0FBSztBQUNILGlCQUFPLEtBQUssbUJBQW1CLE9BQU87QUFBQSxRQUN4QyxLQUFLO0FBQ0gsaUJBQU8sS0FBSyxpQkFBaUIsT0FBTztBQUFBLFFBQ3RDLEtBQUs7QUFDSCxpQkFBTyxLQUFLLG9CQUFvQixPQUFPO0FBQUEsUUFDekM7QUFDRSxpQkFBTztBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsSUFFUSxtQkFBbUIsU0FBa0Q7QUE5Ty9FLFVBQUFBLEtBQUFDO0FBK09JLFlBQU0sT0FBUSxPQUFlO0FBQzdCLFVBQUksQ0FBQyxLQUFNLFFBQU87QUFFbEIsWUFBTSxRQUFRLEtBQUssZUFBZSxPQUFPO0FBQ3pDLFVBQUksQ0FBQyxNQUFPLFFBQU87QUFFbkIsWUFBTSxTQUFTLE1BQU0sa0JBQWdCRCxNQUFBLE1BQU0saUJBQU4sZ0JBQUFBLElBQW9CLGVBQVlDLE1BQUEsTUFBTSxrQkFBTixnQkFBQUEsSUFBcUI7QUFFMUYsVUFBSSxVQUFVLE9BQU8sVUFBVTtBQUM3QixlQUFPO0FBQUEsVUFDTCxNQUFNLE9BQU87QUFBQSxVQUNiLE1BQU0sT0FBTztBQUFBLFVBQ2IsUUFBUSxPQUFPO0FBQUEsUUFDakI7QUFBQSxNQUNGO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVRLGVBQWUsU0FBMkI7QUFDaEQsWUFBTSxNQUFNLE9BQU8sS0FBSyxPQUFPLEVBQUU7QUFBQSxRQUMvQixDQUFDLGNBQWMsVUFBVSxXQUFXLDBCQUEwQixLQUFLLFVBQVUsV0FBVyxlQUFlO0FBQUEsTUFDekc7QUFDQSxhQUFPLE1BQU8sUUFBZ0IsR0FBRyxJQUFJO0FBQUEsSUFDdkM7QUFBQSxJQUVRLGlCQUFpQixTQUFrRDtBQXpRN0UsVUFBQUQsS0FBQUM7QUEwUUksWUFBTSxPQUFRLE9BQWU7QUFDN0IsVUFBSSxDQUFDLEtBQU0sUUFBTztBQUVsQixVQUFJLFdBQVksUUFBZ0I7QUFDaEMsVUFBSSxDQUFDLFVBQVU7QUFDYixtQkFBWSxRQUFnQjtBQUFBLE1BQzlCO0FBRUEsV0FBSUQsTUFBQSxxQ0FBVSxTQUFWLGdCQUFBQSxJQUFnQixRQUFRO0FBQzFCLGNBQU1FLFlBQTJCO0FBQUEsVUFDL0IsTUFBTSxTQUFTLEtBQUs7QUFBQSxVQUNwQixNQUFNO0FBQUEsUUFDUjtBQUVBLGFBQUlELE1BQUEsU0FBUyxVQUFULGdCQUFBQSxJQUFnQixLQUFLO0FBQ3ZCLFVBQUFDLFVBQVMsT0FBTyxTQUFTLE1BQU0sSUFBSSxNQUFNO0FBQ3pDLFVBQUFBLFVBQVMsU0FBUyxTQUFTLE1BQU0sSUFBSSxNQUFNO0FBQUEsUUFDN0M7QUFFQSxlQUFPQTtBQUFBLE1BQ1Q7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUFBLElBRVEsb0JBQW9CLFNBQWtEO0FBblNoRixVQUFBRixLQUFBQztBQW9TSSxZQUFNLFlBQWEsUUFBZ0I7QUFDbkMsV0FBSUEsT0FBQUQsTUFBQSx1Q0FBVyxPQUFYLGdCQUFBQSxJQUFlLFFBQWYsZ0JBQUFDLElBQW9CLGFBQWE7QUFDbkMsZUFBTyxVQUFVLEdBQUcsSUFBSTtBQUFBLE1BQzFCO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVRLGtCQUFpQztBQUN2QyxVQUFLLE9BQWUsK0JBQWdDLFFBQU87QUFDM0QsVUFBSyxPQUFlLDZCQUE4QixRQUFPO0FBQ3pELFVBQUssT0FBZSxTQUFVLFFBQU87QUFDckMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVRLFdBQVcsU0FBOEI7QUFDL0MsWUFBTSxPQUFpQixDQUFDO0FBQ3hCLFVBQUksVUFBOEI7QUFFbEMsYUFBTyxXQUFXLFlBQVksU0FBUyxNQUFNO0FBQzNDLFlBQUksV0FBVyxRQUFRLFFBQVEsWUFBWTtBQUUzQyxZQUFJLFFBQVEsSUFBSTtBQUNkLHNCQUFZLElBQUksUUFBUSxFQUFFO0FBQUEsUUFDNUIsV0FBVyxRQUFRLFdBQVc7QUFDNUIsc0JBQVksSUFBSSxRQUFRLFVBQVUsTUFBTSxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUM7QUFBQSxRQUN4RDtBQUVBLGFBQUssUUFBUSxRQUFRO0FBQ3JCLGtCQUFVLFFBQVE7QUFBQSxNQUNwQjtBQUVBLGFBQU8sS0FBSyxLQUFLLEtBQUs7QUFBQSxJQUN4QjtBQUFBLElBRVEsZ0JBQWdCO0FBQ3RCLFlBQU0sUUFBUSxTQUFTLGNBQWMsT0FBTztBQUM1QyxZQUFNLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTXBCLGVBQVMsS0FBSyxZQUFZLEtBQUs7QUFFL0IsZUFBUyxpQkFBaUIsYUFBYSxDQUFDLE1BQU07QUFDNUMsaUJBQVMsaUJBQWlCLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxPQUFPO0FBQzlELGFBQUcsZ0JBQWdCLGtCQUFrQjtBQUFBLFFBQ3ZDLENBQUM7QUFJRCxZQUFJLGdCQUFnQixHQUFHLEtBQUssZUFBZSxLQUFLLEVBQUUsa0JBQWtCLGFBQWE7QUFDL0UsWUFBRSxPQUFPLGFBQWEsb0JBQW9CLE1BQU07QUFBQSxRQUNsRDtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBTUEsTUFBTSxZQUFhLHVCQUFNO0FBQ3ZCLFFBQUksVUFBaUM7QUFDckMsUUFBSSxTQUFnQztBQUNwQyxRQUFJLFdBQWtDO0FBQ3RDLFFBQUksWUFBc0M7QUFDMUMsUUFBSSxjQUFxQztBQUN6QyxRQUFJLGFBQStCLENBQUM7QUFDcEMsUUFBSSx5QkFBeUI7QUFFN0IsVUFBTSxhQUFhO0FBQ25CLFVBQU0sWUFBWTtBQUNsQixVQUFNLGlCQUFpQjtBQUFBLE1BQ3JCO0FBQUEsTUFBUztBQUFBLE1BQVk7QUFBQSxNQUFhO0FBQUEsTUFBVztBQUFBLE1BQzdDO0FBQUEsTUFBZTtBQUFBLE1BQWE7QUFBQSxNQUFjO0FBQUEsTUFBYTtBQUFBLE1BQVk7QUFBQSxNQUNuRTtBQUFBLE1BQVc7QUFBQSxNQUFTO0FBQUEsSUFDdEI7QUFFQSxhQUFTLGVBQWU7QUFDdEIsVUFBSSxTQUFTLGVBQWUsU0FBUyxFQUFHO0FBRXhDLFlBQU0sUUFBUSxTQUFTLGNBQWMsT0FBTztBQUM1QyxZQUFNLEtBQUs7QUFDWCxZQUFNLGNBQWM7QUFBQTtBQUFBLFNBRWYsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBYVYsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxUnBCLGVBQVMsS0FBSyxZQUFZLEtBQUs7QUFBQSxJQUNqQztBQUFBLElBRVEsUUFBYztBQTV1Q3hCLFVBQUFBLEtBQUFDLEtBQUFFLEtBQUFDLEtBQUFDLEtBQUFDO0FBNnVDSSxVQUFJLEtBQUssUUFBUztBQUVsQixXQUFLLE9B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TUFBTSxNQUFNLFdBQVcsTUFBTSxRQUFRO0FBQUEsRUFDaEQsR0FBRztBQUdILE1BQUksbUJBQW1CO0FBcjVEdkI7QUFtNkRBLE1BQUk7QUFDRixVQUFNLFNBQVEsOENBQWlCLFlBQWpCLG1CQUEwQixZQUExQiw0QkFBb0MsRUFBRSxNQUFNLGdCQUFnQixTQUNwRSw0Q0FBZ0IsWUFBaEIsbUJBQXlCLFlBQXpCLDRCQUFtQyxFQUFFLE1BQU0sZ0JBQWdCO0FBQ2pFLFFBQUksTUFBTTtBQUNSLFlBQU0sT0FBTyxZQUFZLE1BQU07QUFDN0IsWUFBSTtBQUFFLGVBQUssWUFBWSxFQUFFLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFBQSxRQUFHLFFBQ25EO0FBQUUsd0JBQWMsSUFBSTtBQUFBLFFBQUc7QUFBQSxNQUMvQixHQUFHLEdBQU07QUFDVCx1QkFBSyxpQkFBTCxtQkFBbUIsZ0JBQW5CLDRCQUFpQyxNQUFNLGNBQWMsSUFBSTtBQUFBLElBQzNEO0FBQUEsRUFDRixRQUFRO0FBQUEsRUFBbUU7IiwKICAibmFtZXMiOiBbImdsb2JhbFRoaXMiLCAiY2hyb21lIiwgInJ1bnRpbWUiLCAiaWQiLCAiRXJyb3IiLCAiYnJvd3NlciIsICJDSFJPTUVfU0VORF9NRVNTQUdFX0NBTExCQUNLX05PX1JFU1BPTlNFX01FU1NBR0UiLCAid3JhcEFQSXMiLCAiZXh0ZW5zaW9uQVBJcyIsICJhcGlNZXRhZGF0YSIsICJPYmplY3QiLCAia2V5cyIsICJsZW5ndGgiLCAiRGVmYXVsdFdlYWtNYXAiLCAiV2Vha01hcCIsICJjb25zdHJ1Y3RvciIsICJjcmVhdGVJdGVtIiwgIml0ZW1zIiwgInVuZGVmaW5lZCIsICJnZXQiLCAia2V5IiwgImhhcyIsICJzZXQiLCAiaXNUaGVuYWJsZSIsICJ2YWx1ZSIsICJ0aGVuIiwgIm1ha2VDYWxsYmFjayIsICJwcm9taXNlIiwgIm1ldGFkYXRhIiwgImNhbGxiYWNrQXJncyIsICJsYXN0RXJyb3IiLCAicmVqZWN0IiwgIm1lc3NhZ2UiLCAic2luZ2xlQ2FsbGJhY2tBcmciLCAicmVzb2x2ZSIsICJwbHVyYWxpemVBcmd1bWVudHMiLCAibnVtQXJncyIsICJ3cmFwQXN5bmNGdW5jdGlvbiIsICJuYW1lIiwgImFzeW5jRnVuY3Rpb25XcmFwcGVyIiwgInRhcmdldCIsICJhcmdzIiwgIm1pbkFyZ3MiLCAibWF4QXJncyIsICJQcm9taXNlIiwgImZhbGxiYWNrVG9Ob0NhbGxiYWNrIiwgImNiRXJyb3IiLCAiY29uc29sZSIsICJ3YXJuIiwgIm5vQ2FsbGJhY2siLCAid3JhcE1ldGhvZCIsICJtZXRob2QiLCAid3JhcHBlciIsICJQcm94eSIsICJhcHBseSIsICJ0YXJnZXRNZXRob2QiLCAidGhpc09iaiIsICJjYWxsIiwgImhhc093blByb3BlcnR5IiwgIkZ1bmN0aW9uIiwgImJpbmQiLCAicHJvdG90eXBlIiwgIndyYXBPYmplY3QiLCAid3JhcHBlcnMiLCAiY2FjaGUiLCAiY3JlYXRlIiwgImhhbmRsZXJzIiwgInByb3h5VGFyZ2V0IiwgInByb3AiLCAicmVjZWl2ZXIiLCAiZGVmaW5lUHJvcGVydHkiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiZGVzYyIsICJSZWZsZWN0IiwgImRlbGV0ZVByb3BlcnR5IiwgIndyYXBFdmVudCIsICJ3cmFwcGVyTWFwIiwgImFkZExpc3RlbmVyIiwgImxpc3RlbmVyIiwgImhhc0xpc3RlbmVyIiwgInJlbW92ZUxpc3RlbmVyIiwgIm9uUmVxdWVzdEZpbmlzaGVkV3JhcHBlcnMiLCAib25SZXF1ZXN0RmluaXNoZWQiLCAicmVxIiwgIndyYXBwZWRSZXEiLCAiZ2V0Q29udGVudCIsICJvbk1lc3NhZ2VXcmFwcGVycyIsICJvbk1lc3NhZ2UiLCAic2VuZGVyIiwgInNlbmRSZXNwb25zZSIsICJkaWRDYWxsU2VuZFJlc3BvbnNlIiwgIndyYXBwZWRTZW5kUmVzcG9uc2UiLCAic2VuZFJlc3BvbnNlUHJvbWlzZSIsICJyZXNwb25zZSIsICJyZXN1bHQiLCAiZXJyIiwgImlzUmVzdWx0VGhlbmFibGUiLCAic2VuZFByb21pc2VkUmVzdWx0IiwgIm1zZyIsICJlcnJvciIsICJfX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X18iLCAiY2F0Y2giLCAid3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2siLCAicmVwbHkiLCAid3JhcHBlZFNlbmRNZXNzYWdlIiwgImFwaU5hbWVzcGFjZU9iaiIsICJ3cmFwcGVkQ2IiLCAicHVzaCIsICJzZW5kTWVzc2FnZSIsICJzdGF0aWNXcmFwcGVycyIsICJkZXZ0b29scyIsICJuZXR3b3JrIiwgIm9uTWVzc2FnZUV4dGVybmFsIiwgInRhYnMiLCAic2V0dGluZ01ldGFkYXRhIiwgImNsZWFyIiwgInByaXZhY3kiLCAic2VydmljZXMiLCAid2Vic2l0ZXMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiX2EiLCAiX2IiLCAibG9jYXRpb24iLCAiX2MiLCAiX2QiLCAiX2UiLCAiX2YiXQp9Cg==