@hanzo/browser-extension 1.7.5 → 1.9.31

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 (133) hide show
  1. package/LICENSE +9 -18
  2. package/dist/browser-extension/README.md +1 -1
  3. package/dist/browser-extension/background-firefox.js +4184 -491
  4. package/dist/browser-extension/background.js +6938 -2413
  5. package/dist/browser-extension/browser-control.js +652 -18
  6. package/dist/browser-extension/chrome/background.js +6938 -2413
  7. package/dist/browser-extension/chrome/content-script.js +1642 -123
  8. package/dist/browser-extension/chrome/icon128.png +0 -0
  9. package/dist/browser-extension/chrome/icon16.png +0 -0
  10. package/dist/browser-extension/chrome/icon48.png +0 -0
  11. package/dist/browser-extension/chrome/manifest.json +20 -11
  12. package/dist/browser-extension/chrome/popup.css +352 -110
  13. package/dist/browser-extension/chrome/popup.html +159 -48
  14. package/dist/browser-extension/chrome/popup.js +1418 -46
  15. package/dist/browser-extension/chrome/sidebar.css +772 -156
  16. package/dist/browser-extension/chrome/sidebar.html +268 -85
  17. package/dist/browser-extension/chrome/sidebar.js +25846 -84
  18. package/dist/browser-extension/cli.js +2 -2
  19. package/dist/browser-extension/content-script.js +1642 -123
  20. package/dist/browser-extension/firefox/background.js +4184 -491
  21. package/dist/browser-extension/firefox/content-script.js +1642 -123
  22. package/dist/browser-extension/firefox/icon128.png +0 -0
  23. package/dist/browser-extension/firefox/icon16.png +0 -0
  24. package/dist/browser-extension/firefox/icon48.png +0 -0
  25. package/dist/browser-extension/firefox/manifest.json +24 -13
  26. package/dist/browser-extension/firefox/popup.css +352 -110
  27. package/dist/browser-extension/firefox/popup.html +159 -48
  28. package/dist/browser-extension/firefox/popup.js +1418 -46
  29. package/dist/browser-extension/firefox/sidebar.css +772 -156
  30. package/dist/browser-extension/firefox/sidebar.html +268 -85
  31. package/dist/browser-extension/firefox/sidebar.js +25846 -84
  32. package/dist/browser-extension/icon128.png +0 -0
  33. package/dist/browser-extension/icon16.png +0 -0
  34. package/dist/browser-extension/icon48.png +0 -0
  35. package/dist/browser-extension/manifest.json +20 -11
  36. package/dist/browser-extension/package.json +1 -1
  37. package/dist/browser-extension/popup.js +1418 -46
  38. package/dist/browser-extension/safari/Info.plist +3 -3
  39. package/dist/browser-extension/safari/background.js +6938 -2413
  40. package/dist/browser-extension/safari/content-script.js +1642 -123
  41. package/dist/browser-extension/safari/icon128.png +0 -0
  42. package/dist/browser-extension/safari/icon16.png +0 -0
  43. package/dist/browser-extension/safari/icon48.png +0 -0
  44. package/dist/browser-extension/safari/popup.css +352 -110
  45. package/dist/browser-extension/safari/popup.html +159 -48
  46. package/dist/browser-extension/safari/popup.js +1418 -46
  47. package/dist/browser-extension/safari/sidebar.css +772 -156
  48. package/dist/browser-extension/safari/sidebar.html +268 -85
  49. package/dist/browser-extension/safari/sidebar.js +25846 -84
  50. package/dist/browser-extension/sidebar.js +25846 -84
  51. package/dist/browser-extension/webgpu-ai.js +78 -5
  52. package/images/icon128.png +0 -0
  53. package/images/icon16.png +0 -0
  54. package/images/icon48.png +0 -0
  55. package/manifest.json +7 -2
  56. package/package.json +27 -10
  57. package/src/chat-widget.tsx +96 -0
  58. package/src/gui-primitives.tsx +116 -0
  59. package/src/icon128.png +0 -0
  60. package/src/icon16.png +0 -0
  61. package/src/icon32.png +0 -0
  62. package/src/icon48.png +0 -0
  63. package/src/manifest-firefox.json +23 -12
  64. package/src/manifest.json +19 -10
  65. package/src/package.json +1 -1
  66. package/src/popup.css +352 -110
  67. package/src/popup.html +159 -48
  68. package/src/popup.js +196 -0
  69. package/src/sidebar.css +772 -156
  70. package/src/sidebar.html +268 -85
  71. package/src/sidebar.js +885 -0
  72. package/.github/workflows/docs.yml +0 -44
  73. package/.github/workflows/release.yml +0 -55
  74. package/README.md +0 -126
  75. package/dist/browser-extension/ai-worker.js +0 -30
  76. package/dist/browser-extension/cdp-bridge-server.js +0 -444
  77. package/dist/browser-extension/chrome/icon32.png +0 -0
  78. package/dist/browser-extension/firefox/icon32.png +0 -0
  79. package/dist/browser-extension/hanzo-browser-extension-firefox-1.1.0.zip +0 -0
  80. package/dist/browser-extension/icon32.png +0 -0
  81. package/dist/browser-extension/popup.css +0 -468
  82. package/dist/browser-extension/popup.html +0 -191
  83. package/dist/browser-extension/safari/icon32.png +0 -0
  84. package/dist/browser-extension/sidebar.css +0 -718
  85. package/dist/browser-extension/sidebar.html +0 -184
  86. package/dist/cdp-bridge-server.js +0 -411
  87. package/dist/hanzo-ai-chrome-1.7.2.zip +0 -0
  88. package/dist/hanzo-ai-chrome-1.7.3.zip +0 -0
  89. package/dist/hanzo-ai-firefox-1.7.2.zip +0 -0
  90. package/dist/hanzo-ai-firefox-1.7.3.zip +0 -0
  91. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.pbxproj +0 -1047
  92. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  93. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json +0 -11
  94. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  95. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@1x.png +0 -0
  96. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@2x.png +0 -0
  97. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@1x.png +0 -0
  98. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@2x.png +0 -0
  99. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@1x.png +0 -0
  100. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@2x.png +0 -0
  101. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@1x.png +0 -0
  102. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@2x.png +0 -0
  103. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@1x.png +0 -0
  104. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@2x.png +0 -0
  105. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/universal-icon-1024@1x.png +0 -0
  106. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/Contents.json +0 -6
  107. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json +0 -21
  108. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon128.png +0 -0
  109. package/dist/safari/Hanzo AI/Shared (App)/Resources/Base.lproj/Main.html +0 -20
  110. package/dist/safari/Hanzo AI/Shared (App)/Resources/Icon.png +0 -0
  111. package/dist/safari/Hanzo AI/Shared (App)/Resources/Script.js +0 -24
  112. package/dist/safari/Hanzo AI/Shared (App)/Resources/Style.css +0 -61
  113. package/dist/safari/Hanzo AI/Shared (App)/ViewController.swift +0 -81
  114. package/dist/safari/Hanzo AI/Shared (Extension)/SafariWebExtensionHandler.swift +0 -42
  115. package/dist/safari/Hanzo AI/iOS (App)/AppDelegate.swift +0 -24
  116. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/LaunchScreen.storyboard +0 -36
  117. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/Main.storyboard +0 -38
  118. package/dist/safari/Hanzo AI/iOS (App)/Info.plist +0 -27
  119. package/dist/safari/Hanzo AI/iOS (App)/SceneDelegate.swift +0 -18
  120. package/dist/safari/Hanzo AI/iOS (Extension)/Info.plist +0 -13
  121. package/dist/safari/Hanzo AI/macOS (App)/AppDelegate.swift +0 -21
  122. package/dist/safari/Hanzo AI/macOS (App)/Base.lproj/Main.storyboard +0 -124
  123. package/dist/safari/Hanzo AI/macOS (App)/Info.plist +0 -8
  124. package/dist/safari/Hanzo AI/macOS (Extension)/Info.plist +0 -13
  125. package/docs/_config.yml +0 -13
  126. package/docs/_layouts/default.html +0 -435
  127. package/docs/index.md +0 -54
  128. package/install-extension.sh +0 -75
  129. package/test/claude-integration.test.ts +0 -251
  130. package/test/server-frameworks-edge-cases.test.ts +0 -145
  131. package/test/server-frameworks.test.ts +0 -395
  132. package/test-cdp-connection.js +0 -140
  133. package/tsconfig.json +0 -19
@@ -1,15 +1,1095 @@
1
1
  "use strict";
2
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
+
3
1055
  // src/content-script.ts
4
1056
  var HanzoContentScript = class {
5
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();
6
1064
  this.setupClickHandler();
7
1065
  this.injectHelpers();
8
1066
  this.setupMessageHandlers();
9
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
+ }
10
1090
  setupClickHandler() {
11
1091
  document.addEventListener("click", (e) => {
12
- if (!e.altKey) return;
1092
+ if (!matchesShortcut(e, this.inspectShortcut)) return;
13
1093
  e.preventDefault();
14
1094
  e.stopPropagation();
15
1095
  const element = e.target;
@@ -27,7 +1107,7 @@
27
1107
  }
28
1108
  setupMessageHandlers() {
29
1109
  chrome.runtime.onMessage.addListener((request, _sender, sendResponse) => {
30
- var _a;
1110
+ var _a2;
31
1111
  switch (request.action) {
32
1112
  case "ai.control.start":
33
1113
  aiOverlay.show(request.task || "AI is controlling this page");
@@ -50,12 +1130,22 @@
50
1130
  sendResponse({ success: true });
51
1131
  return true;
52
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
+ }
53
1138
  sendResponse({
54
1139
  success: true,
55
1140
  open: pageOverlay.toggle()
56
1141
  });
57
1142
  return true;
58
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
+ }
59
1149
  pageOverlay.show();
60
1150
  sendResponse({ success: true, open: true });
61
1151
  return true;
@@ -64,11 +1154,68 @@
64
1154
  sendResponse({ success: true, open: false });
65
1155
  return true;
66
1156
  case "page.overlay.status":
67
- sendResponse({ success: true, open: pageOverlay.isOpen() });
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 });
68
1215
  return true;
69
1216
  }
70
1217
  if (request.action === "getContent") {
71
- sendResponse({ content: ((_a = document.documentElement) == null ? void 0 : _a.outerHTML) || "" });
1218
+ sendResponse({ content: ((_a2 = document.documentElement) == null ? void 0 : _a2.outerHTML) || "" });
72
1219
  return true;
73
1220
  }
74
1221
  if (request.action === "setContent") {
@@ -97,12 +1244,12 @@
97
1244
  }
98
1245
  }
99
1246
  extractReactSource(element) {
100
- var _a, _b;
1247
+ var _a2, _b2;
101
1248
  const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;
102
1249
  if (!hook) return void 0;
103
1250
  const fiber = this.findReactFiber(element);
104
1251
  if (!fiber) return void 0;
105
- const source = fiber._debugSource || ((_a = fiber.pendingProps) == null ? void 0 : _a.__source) || ((_b = fiber.memoizedProps) == null ? void 0 : _b.__source);
1252
+ const source = fiber._debugSource || ((_a2 = fiber.pendingProps) == null ? void 0 : _a2.__source) || ((_b2 = fiber.memoizedProps) == null ? void 0 : _b2.__source);
106
1253
  if (source && source.fileName) {
107
1254
  return {
108
1255
  file: source.fileName,
@@ -119,19 +1266,19 @@
119
1266
  return key ? element[key] : null;
120
1267
  }
121
1268
  extractVueSource(element) {
122
- var _a, _b;
1269
+ var _a2, _b2;
123
1270
  const hook = window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
124
1271
  if (!hook) return void 0;
125
1272
  let instance = element.__vueParentComponent;
126
1273
  if (!instance) {
127
1274
  instance = element.__vue__;
128
1275
  }
129
- if ((_a = instance == null ? void 0 : instance.type) == null ? void 0 : _a.__file) {
1276
+ if ((_a2 = instance == null ? void 0 : instance.type) == null ? void 0 : _a2.__file) {
130
1277
  const location2 = {
131
1278
  file: instance.type.__file,
132
1279
  line: 1
133
1280
  };
134
- if ((_b = instance.vnode) == null ? void 0 : _b.loc) {
1281
+ if ((_b2 = instance.vnode) == null ? void 0 : _b2.loc) {
135
1282
  location2.line = instance.vnode.loc.start.line;
136
1283
  location2.column = instance.vnode.loc.start.column;
137
1284
  }
@@ -140,9 +1287,9 @@
140
1287
  return void 0;
141
1288
  }
142
1289
  extractSvelteSource(element) {
143
- var _a, _b;
1290
+ var _a2, _b2;
144
1291
  const component = element.__svelte_component;
145
- if ((_b = (_a = component == null ? void 0 : component.$$) == null ? void 0 : _a.ctx) == null ? void 0 : _b.$$_location) {
1292
+ if ((_b2 = (_a2 = component == null ? void 0 : component.$$) == null ? void 0 : _a2.ctx) == null ? void 0 : _b2.$$_location) {
146
1293
  return component.$$.ctx.$$_location;
147
1294
  }
148
1295
  return void 0;
@@ -181,7 +1328,7 @@
181
1328
  document.querySelectorAll("[data-hanzo-hover]").forEach((el) => {
182
1329
  el.removeAttribute("data-hanzo-hover");
183
1330
  });
184
- if (e.altKey && e.target instanceof HTMLElement) {
1331
+ if (matchesShortcut(e, this.inspectShortcut) && e.target instanceof HTMLElement) {
185
1332
  e.target.setAttribute("data-hanzo-hover", "true");
186
1333
  }
187
1334
  });
@@ -462,7 +1609,7 @@
462
1609
  }
463
1610
  }
464
1611
  function show(task) {
465
- var _a;
1612
+ var _a2;
466
1613
  if (overlay) hide();
467
1614
  injectStyles();
468
1615
  setInteractionBlock(true);
@@ -483,7 +1630,7 @@
483
1630
  <button class="hanzo-stop-btn">Stop</button>
484
1631
  `;
485
1632
  document.body.appendChild(statusEl);
486
- (_a = statusEl.querySelector(".hanzo-stop-btn")) == null ? void 0 : _a.addEventListener("click", () => {
1633
+ (_a2 = statusEl.querySelector(".hanzo-stop-btn")) == null ? void 0 : _a2.addEventListener("click", () => {
487
1634
  chrome.runtime.sendMessage({ action: "ai.control.cancel" });
488
1635
  hide();
489
1636
  });
@@ -510,12 +1657,12 @@
510
1657
  const refs = { overlay, cursor, statusEl, cancelBtn, highlightEl };
511
1658
  const trails = [...trailNodes];
512
1659
  setTimeout(() => {
513
- var _a, _b, _c, _d, _e;
514
- (_a = refs.overlay) == null ? void 0 : _a.remove();
515
- (_b = refs.cursor) == null ? void 0 : _b.remove();
516
- (_c = refs.statusEl) == null ? void 0 : _c.remove();
517
- (_d = refs.cancelBtn) == null ? void 0 : _d.remove();
518
- (_e = refs.highlightEl) == null ? void 0 : _e.remove();
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();
519
1666
  for (const node of trails) {
520
1667
  node.remove();
521
1668
  }
@@ -529,7 +1676,7 @@
529
1676
  trailNodes = [];
530
1677
  }
531
1678
  function moveCursor(x, y) {
532
- var _a;
1679
+ var _a2;
533
1680
  if (!cursor) return;
534
1681
  const clampedX = Math.max(0, Math.min(window.innerWidth, Number.isFinite(x) ? x : 0));
535
1682
  const clampedY = Math.max(0, Math.min(window.innerHeight, Number.isFinite(y) ? y : 0));
@@ -544,7 +1691,7 @@
544
1691
  trailNodes = trailNodes.filter((node) => node !== trail);
545
1692
  }, 400);
546
1693
  while (trailNodes.length > 10) {
547
- (_a = trailNodes.shift()) == null ? void 0 : _a.remove();
1694
+ (_a2 = trailNodes.shift()) == null ? void 0 : _a2.remove();
548
1695
  }
549
1696
  cursor.style.left = `${clampedX}px`;
550
1697
  cursor.style.top = `${clampedY}px`;
@@ -582,11 +1729,19 @@
582
1729
  }
583
1730
  return { show, hide, moveCursor, highlight, updateStatus };
584
1731
  })();
1732
+ var OVERLAY_WIDTH_PX = {
1733
+ compact: 320,
1734
+ default: 420,
1735
+ wide: 560
1736
+ };
585
1737
  var HanzoPageOverlay = class {
586
1738
  constructor() {
587
1739
  this.mounted = false;
588
1740
  this.enabled = false;
589
1741
  this.open = false;
1742
+ this.side = "right";
1743
+ this.mode = "overlay";
1744
+ this.width = "default";
590
1745
  this.sending = false;
591
1746
  this.watchMode = false;
592
1747
  this.editMode = false;
@@ -610,6 +1765,53 @@
610
1765
  this.injectStyles();
611
1766
  this.mount();
612
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
+ }
613
1815
  }
614
1816
  toggle() {
615
1817
  if (!this.enabled || !this.open) {
@@ -619,28 +1821,70 @@
619
1821
  this.hide();
620
1822
  return false;
621
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
+ }
622
1867
  show() {
623
- var _a, _b;
1868
+ var _a2, _b2;
624
1869
  this.ensureMounted();
625
1870
  this.enabled = true;
626
1871
  this.open = true;
627
- (_a = this.root) == null ? void 0 : _a.setAttribute("data-enabled", "true");
628
- (_b = this.root) == null ? void 0 : _b.setAttribute("data-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();
629
1875
  this.loadModels();
630
1876
  this.focusInput();
631
1877
  }
632
1878
  hide() {
633
- var _a;
1879
+ var _a2;
634
1880
  this.open = false;
635
- (_a = this.root) == null ? void 0 : _a.setAttribute("data-open", "false");
1881
+ (_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-open", "false");
1882
+ this.applyPushIfOpen();
636
1883
  this.updateStatus("");
637
1884
  this.clearHighlight();
638
1885
  this.setWatchMode(false);
639
1886
  this.setEditMode(false);
640
1887
  }
641
- isOpen() {
642
- return this.open;
643
- }
644
1888
  ensureMounted() {
645
1889
  if (this.mounted) return;
646
1890
  this.mount();
@@ -650,89 +1894,85 @@
650
1894
  const style = document.createElement("style");
651
1895
  style.id = "hanzo-page-overlay-styles";
652
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. */
653
1899
  #hanzo-page-overlay-root {
654
1900
  position: fixed;
655
- right: 20px;
656
- bottom: 20px;
1901
+ top: 0;
1902
+ bottom: 0;
1903
+ right: 0;
1904
+ width: min(var(--hanzo-overlay-width, 420px), 100vw);
657
1905
  z-index: 2147483645;
658
1906
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
659
1907
  pointer-events: none;
660
1908
  }
661
1909
 
662
- #hanzo-page-overlay-root * {
663
- box-sizing: border-box;
1910
+ #hanzo-page-overlay-root[data-side="left"] {
1911
+ right: auto;
1912
+ left: 0;
664
1913
  }
665
1914
 
666
- #hanzo-page-overlay-root[data-enabled="false"] .hanzo-page-launcher {
667
- opacity: 0;
668
- transform: translateY(16px);
669
- pointer-events: none;
1915
+ #hanzo-page-overlay-root * {
1916
+ box-sizing: border-box;
670
1917
  }
671
1918
 
672
- .hanzo-page-launcher {
673
- width: 54px;
674
- height: 54px;
675
- border-radius: 9999px;
676
- border: 1px solid rgba(255, 255, 255, 0.2);
677
- background: linear-gradient(135deg, rgba(22, 24, 31, 0.96), rgba(7, 8, 12, 0.96));
678
- color: #ffffff;
679
- box-shadow: 0 14px 34px rgba(0, 0, 0, 0.35);
680
- display: flex;
681
- align-items: center;
682
- justify-content: center;
683
- cursor: pointer;
684
- pointer-events: auto;
685
- transition: transform 0.2s ease, opacity 0.2s ease;
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;
686
1925
  }
687
-
688
- .hanzo-page-launcher:hover {
689
- transform: translateY(-2px);
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;
690
1929
  }
691
1930
 
692
1931
  .hanzo-page-panel {
693
- width: min(420px, calc(100vw - 24px));
694
- max-height: min(620px, calc(100vh - 28px));
695
- border-radius: 16px;
696
- border: 1px solid rgba(255, 255, 255, 0.16);
697
- background: linear-gradient(180deg, rgba(11, 13, 18, 0.97), rgba(7, 8, 12, 0.97));
698
- color: #eef2ff;
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;
699
1937
  overflow: hidden;
700
- box-shadow: 0 22px 48px rgba(0, 0, 0, 0.45);
701
- transform-origin: bottom right;
702
- transform: translateY(8px) scale(0.98);
1938
+ box-shadow: -22px 0 48px rgba(0, 0, 0, 0.45);
1939
+ transform: translateX(100%);
703
1940
  opacity: 0;
704
1941
  pointer-events: none;
705
1942
  display: flex;
706
1943
  flex-direction: column;
707
- margin-bottom: 10px;
1944
+ min-height: 0;
708
1945
  transition: transform 0.18s ease, opacity 0.18s ease;
709
1946
  }
710
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
+
711
1955
  #hanzo-page-overlay-root[data-open="true"] .hanzo-page-panel {
712
- transform: translateY(0) scale(1);
1956
+ transform: translateX(0);
713
1957
  opacity: 1;
714
1958
  pointer-events: auto;
715
1959
  }
716
1960
 
717
- #hanzo-page-overlay-root[data-open="true"] .hanzo-page-launcher {
718
- opacity: 0;
719
- transform: scale(0.9);
720
- pointer-events: none;
721
- }
722
-
723
1961
  .hanzo-page-header {
724
1962
  display: flex;
725
1963
  align-items: center;
726
1964
  justify-content: space-between;
727
1965
  padding: 12px 14px;
728
- border-bottom: 1px solid rgba(255, 255, 255, 0.12);
1966
+ border-bottom: 1px solid rgba(255, 255, 255, 0.10);
729
1967
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent);
1968
+ flex-shrink: 0;
730
1969
  }
731
1970
 
732
1971
  .hanzo-page-brand {
733
1972
  font-weight: 700;
734
1973
  letter-spacing: 0.2px;
735
1974
  font-size: 13px;
1975
+ color: #f5f5f5;
736
1976
  }
737
1977
 
738
1978
  .hanzo-page-header-actions {
@@ -745,16 +1985,22 @@
745
1985
  border: 1px solid rgba(255, 255, 255, 0.2);
746
1986
  border-radius: 9999px;
747
1987
  padding: 4px 10px;
748
- background: rgba(255, 255, 255, 0.02);
749
- color: #d6deff;
1988
+ background: transparent;
1989
+ color: rgba(245, 245, 245, 0.85);
750
1990
  cursor: pointer;
751
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;
752
1998
  }
753
1999
 
754
2000
  .hanzo-chip-btn[data-active="true"] {
755
- border-color: rgba(56, 189, 248, 0.62);
756
- background: rgba(14, 116, 144, 0.3);
757
- color: #e0f2fe;
2001
+ border-color: rgba(255, 255, 255, 0.7);
2002
+ background: rgba(255, 255, 255, 0.10);
2003
+ color: #fff;
758
2004
  }
759
2005
 
760
2006
  .hanzo-icon-btn {
@@ -763,9 +2009,28 @@
763
2009
  border-radius: 8px;
764
2010
  border: 1px solid rgba(255, 255, 255, 0.18);
765
2011
  background: transparent;
766
- color: #e5e7eb;
2012
+ color: #f5f5f5;
767
2013
  cursor: pointer;
768
- font-size: 16px;
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;
769
2034
  }
770
2035
 
771
2036
  .hanzo-page-meta {
@@ -774,11 +2039,12 @@
774
2039
  grid-template-columns: 1fr auto;
775
2040
  gap: 8px;
776
2041
  align-items: center;
2042
+ flex-shrink: 0;
777
2043
  }
778
2044
 
779
2045
  .hanzo-page-context {
780
2046
  font-size: 11px;
781
- color: #a5b4fc;
2047
+ color: rgba(245, 245, 245, 0.65);
782
2048
  overflow: hidden;
783
2049
  text-overflow: ellipsis;
784
2050
  white-space: nowrap;
@@ -786,11 +2052,12 @@
786
2052
 
787
2053
  .hanzo-page-status {
788
2054
  font-size: 11px;
789
- color: #93c5fd;
2055
+ color: rgba(245, 245, 245, 0.55);
790
2056
  }
791
2057
 
792
2058
  .hanzo-model-row {
793
2059
  padding: 0 14px 8px 14px;
2060
+ flex-shrink: 0;
794
2061
  }
795
2062
 
796
2063
  .hanzo-model-row select {
@@ -798,15 +2065,16 @@
798
2065
  border-radius: 8px;
799
2066
  border: 1px solid rgba(255, 255, 255, 0.16);
800
2067
  background: rgba(255, 255, 255, 0.03);
801
- color: #f1f5f9;
2068
+ color: #f5f5f5;
802
2069
  padding: 7px 9px;
803
2070
  font-size: 12px;
804
2071
  }
805
2072
 
2073
+ /* The chat scroller: takes ALL remaining vertical space so the
2074
+ composer below stays sticky against the bottom of the panel. */
806
2075
  .hanzo-page-messages {
807
- flex: 1;
808
- min-height: 200px;
809
- max-height: 370px;
2076
+ flex: 1 1 auto;
2077
+ min-height: 0;
810
2078
  overflow-y: auto;
811
2079
  padding: 8px 14px 12px 14px;
812
2080
  display: flex;
@@ -825,23 +2093,27 @@
825
2093
  .hanzo-page-msg.user {
826
2094
  align-self: flex-end;
827
2095
  max-width: 88%;
828
- background: rgba(59, 130, 246, 0.2);
829
- border: 1px solid rgba(59, 130, 246, 0.4);
2096
+ background: rgba(255, 255, 255, 0.10);
2097
+ border: 1px solid rgba(255, 255, 255, 0.18);
830
2098
  }
831
2099
 
832
2100
  .hanzo-page-msg.assistant {
833
2101
  align-self: flex-start;
834
2102
  max-width: 92%;
835
- background: rgba(255, 255, 255, 0.05);
836
- border: 1px solid rgba(255, 255, 255, 0.12);
2103
+ background: rgba(255, 255, 255, 0.04);
2104
+ border: 1px solid rgba(255, 255, 255, 0.10);
837
2105
  }
838
2106
 
2107
+ /* Composer pinned to bottom of the panel. flex-shrink: 0 prevents
2108
+ it from collapsing when the messages scroller grows. */
839
2109
  .hanzo-page-composer {
840
- border-top: 1px solid rgba(255, 255, 255, 0.1);
2110
+ border-top: 1px solid rgba(255, 255, 255, 0.10);
841
2111
  padding: 10px 12px;
842
2112
  display: flex;
843
2113
  gap: 8px;
844
2114
  align-items: flex-end;
2115
+ background: rgba(0, 0, 0, 0.35);
2116
+ flex-shrink: 0;
845
2117
  }
846
2118
 
847
2119
  .hanzo-page-composer textarea {
@@ -852,21 +2124,31 @@
852
2124
  border-radius: 10px;
853
2125
  border: 1px solid rgba(255, 255, 255, 0.17);
854
2126
  background: rgba(255, 255, 255, 0.03);
855
- color: #f8fafc;
2127
+ color: #f5f5f5;
856
2128
  padding: 9px 11px;
857
2129
  font-size: 12px;
858
2130
  }
859
2131
 
2132
+ /* Primary action: WHITE per @hanzo/brand monochrome guidelines. */
860
2133
  .hanzo-page-composer button {
861
2134
  min-width: 68px;
862
2135
  height: 38px;
863
2136
  border-radius: 10px;
864
- border: 1px solid rgba(37, 99, 235, 0.65);
865
- background: linear-gradient(180deg, rgba(37, 99, 235, 0.95), rgba(30, 64, 175, 0.95));
866
- color: #eff6ff;
2137
+ border: 1px solid #ffffff;
2138
+ background: #ffffff;
2139
+ color: #0a0a0b;
867
2140
  font-weight: 600;
868
2141
  font-size: 12px;
869
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);
870
2152
  }
871
2153
 
872
2154
  .hanzo-page-composer button:disabled {
@@ -878,33 +2160,41 @@
878
2160
  position: fixed;
879
2161
  z-index: 2147483644;
880
2162
  pointer-events: none;
881
- border: 2px solid rgba(56, 189, 248, 0.95);
2163
+ border: 2px solid rgba(255, 255, 255, 0.95);
882
2164
  border-radius: 6px;
883
- box-shadow: 0 0 0 2px rgba(14, 116, 144, 0.2);
2165
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
884
2166
  }
885
2167
 
886
2168
  [data-hanzo-inline-editing="true"] {
887
- outline: 2px solid rgba(251, 191, 36, 0.92) !important;
2169
+ outline: 2px solid rgba(255, 255, 255, 0.92) !important;
888
2170
  outline-offset: 2px !important;
889
2171
  }
890
2172
  `;
891
2173
  document.head.appendChild(style);
892
2174
  }
893
2175
  mount() {
894
- var _a, _b, _c, _d, _e, _f, _g;
2176
+ var _a2, _b2, _c2, _d2, _e2, _f2;
895
2177
  if (this.mounted) return;
896
2178
  this.root = document.createElement("div");
897
2179
  this.root.id = "hanzo-page-overlay-root";
898
2180
  this.root.setAttribute("data-open", "false");
899
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();
900
2185
  this.root.innerHTML = `
901
2186
  <div class="hanzo-page-panel" role="dialog" aria-label="Hanzo Page Assistant">
902
2187
  <div class="hanzo-page-header">
903
- <div class="hanzo-page-brand">Hanzo Overlay</div>
2188
+ <div class="hanzo-page-brand">Hanzo</div>
904
2189
  <div class="hanzo-page-header-actions">
905
2190
  <button class="hanzo-chip-btn" data-role="watch" data-active="false" title="Watch elements on hover">Watch</button>
906
2191
  <button class="hanzo-chip-btn" data-role="edit" data-active="false" title="Click any element to edit text">Edit</button>
907
- <button class="hanzo-icon-btn" data-role="close" title="Minimize">\xD7</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>
908
2198
  </div>
909
2199
  </div>
910
2200
  <div class="hanzo-page-meta">
@@ -928,10 +2218,9 @@
928
2218
  <button data-role="send" type="button">Ask</button>
929
2219
  </div>
930
2220
  </div>
931
- <button class="hanzo-page-launcher" data-role="launcher" type="button" title="Open Hanzo Overlay">AI</button>
932
2221
  `;
933
2222
  this.panel = this.root.querySelector(".hanzo-page-panel");
934
- this.launcher = this.root.querySelector('[data-role="launcher"]');
2223
+ this.launcher = null;
935
2224
  this.messagesEl = this.root.querySelector('[data-role="messages"]');
936
2225
  this.inputEl = this.root.querySelector('[data-role="input"]');
937
2226
  this.sendBtn = this.root.querySelector('[data-role="send"]');
@@ -940,18 +2229,24 @@
940
2229
  this.watchBtn = this.root.querySelector('[data-role="watch"]');
941
2230
  this.editBtn = this.root.querySelector('[data-role="edit"]');
942
2231
  this.statusEl = this.root.querySelector(".hanzo-page-status");
943
- (_a = this.launcher) == null ? void 0 : _a.addEventListener("click", () => this.show());
944
- (_b = this.root.querySelector('[data-role="close"]')) == null ? void 0 : _b.addEventListener("click", () => this.hide());
945
- (_c = this.watchBtn) == null ? void 0 : _c.addEventListener("click", () => this.setWatchMode(!this.watchMode));
946
- (_d = this.editBtn) == null ? void 0 : _d.addEventListener("click", () => this.setEditMode(!this.editMode));
947
- (_e = this.sendBtn) == null ? void 0 : _e.addEventListener("click", () => this.askPageQuestion());
948
- (_f = this.inputEl) == null ? void 0 : _f.addEventListener("keydown", (event) => {
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) => {
949
2244
  if (event.key === "Enter" && !event.shiftKey) {
950
2245
  event.preventDefault();
951
2246
  this.askPageQuestion();
952
2247
  }
953
2248
  });
954
- (_g = this.inputEl) == null ? void 0 : _g.addEventListener("input", () => {
2249
+ (_f2 = this.inputEl) == null ? void 0 : _f2.addEventListener("input", () => {
955
2250
  if (!this.inputEl) return;
956
2251
  this.inputEl.style.height = "auto";
957
2252
  this.inputEl.style.height = `${Math.min(this.inputEl.scrollHeight, 110)}px`;
@@ -1006,18 +2301,18 @@
1006
2301
  }
1007
2302
  }
1008
2303
  getPageTarget(target) {
1009
- var _a;
2304
+ var _a2;
1010
2305
  if (!(target instanceof HTMLElement)) return null;
1011
- if ((_a = this.root) == null ? void 0 : _a.contains(target)) return null;
2306
+ if ((_a2 = this.root) == null ? void 0 : _a2.contains(target)) return null;
1012
2307
  if (!target.isConnected) return null;
1013
2308
  if (target.tagName.toLowerCase() === "html" || target.tagName.toLowerCase() === "body") return null;
1014
2309
  return target;
1015
2310
  }
1016
2311
  setWatchMode(active) {
1017
- var _a;
2312
+ var _a2;
1018
2313
  this.watchMode = active;
1019
2314
  if (active) this.setEditMode(false);
1020
- (_a = this.watchBtn) == null ? void 0 : _a.setAttribute("data-active", active ? "true" : "false");
2315
+ (_a2 = this.watchBtn) == null ? void 0 : _a2.setAttribute("data-active", active ? "true" : "false");
1021
2316
  if (!active) {
1022
2317
  this.hoveredElement = null;
1023
2318
  this.clearHighlight();
@@ -1029,10 +2324,10 @@
1029
2324
  }
1030
2325
  }
1031
2326
  setEditMode(active) {
1032
- var _a;
2327
+ var _a2;
1033
2328
  this.editMode = active;
1034
2329
  if (active) this.setWatchMode(false);
1035
- (_a = this.editBtn) == null ? void 0 : _a.setAttribute("data-active", active ? "true" : "false");
2330
+ (_a2 = this.editBtn) == null ? void 0 : _a2.setAttribute("data-active", active ? "true" : "false");
1036
2331
  if (!active && this.editingElement) {
1037
2332
  this.disableInlineEdit(this.editingElement, true);
1038
2333
  } else if (active) {
@@ -1106,8 +2401,8 @@
1106
2401
  this.highlightBox.style.height = `${rect.height + 6}px`;
1107
2402
  }
1108
2403
  clearHighlight() {
1109
- var _a;
1110
- (_a = this.highlightBox) == null ? void 0 : _a.remove();
2404
+ var _a2;
2405
+ (_a2 = this.highlightBox) == null ? void 0 : _a2.remove();
1111
2406
  this.highlightBox = null;
1112
2407
  }
1113
2408
  captureElementContext(element) {
@@ -1191,8 +2486,8 @@
1191
2486
  this.statusEl.textContent = text;
1192
2487
  }
1193
2488
  buildPageContext() {
1194
- var _a, _b;
1195
- const selection = this.normalizeText(((_b = (_a = window.getSelection) == null ? void 0 : _a.call(window)) == null ? void 0 : _b.toString()) || "");
2489
+ var _a2, _b2;
2490
+ const selection = this.normalizeText(((_b2 = (_a2 = window.getSelection) == null ? void 0 : _a2.call(window)) == null ? void 0 : _b2.toString()) || "");
1196
2491
  const contextLines = [
1197
2492
  `URL: ${location.href}`,
1198
2493
  `Title: ${document.title || "Untitled"}`
@@ -1209,7 +2504,7 @@
1209
2504
  return contextLines.join("\n");
1210
2505
  }
1211
2506
  async askPageQuestion() {
1212
- var _a;
2507
+ var _a2;
1213
2508
  if (this.sending || !this.inputEl) return;
1214
2509
  const prompt = this.normalizeText(this.inputEl.value);
1215
2510
  if (!prompt) return;
@@ -1225,7 +2520,7 @@
1225
2520
  this.inputEl.style.height = "auto";
1226
2521
  this.appendMessage("user", prompt);
1227
2522
  const systemContext = this.buildPageContext();
1228
- const model = ((_a = this.modelEl) == null ? void 0 : _a.value) || "gpt-4o";
2523
+ const model = ((_a2 = this.modelEl) == null ? void 0 : _a2.value) || "gpt-4o";
1229
2524
  const requestMessages = [
1230
2525
  {
1231
2526
  role: "system",
@@ -1265,6 +2560,230 @@
1265
2560
  }
1266
2561
  };
1267
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
+ })();
1268
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
+ }
1269
2788
  })();
1270
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnRlbnQtc2NyaXB0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBIYW56byBCcm93c2VyIEV4dGVuc2lvbiAtIENvbnRlbnQgU2NyaXB0XG4vLyBDb25uZWN0cyBjbGlja2VkIGVsZW1lbnRzIHRvIHNvdXJjZSBjb2RlIHZpYSBzb3VyY2UtbWFwc1xuXG5pbnRlcmZhY2UgU291cmNlTG9jYXRpb24ge1xuICBmaWxlOiBzdHJpbmc7XG4gIGxpbmU6IG51bWJlcjtcbiAgY29sdW1uPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRWxlbWVudFNlbGVjdGVkRXZlbnQge1xuICBldmVudDogJ2VsZW1lbnRTZWxlY3RlZCc7XG4gIGZyYW1ld29yazogc3RyaW5nIHwgbnVsbDtcbiAgZG9tUGF0aDogc3RyaW5nO1xuICBzb3VyY2U/OiBTb3VyY2VMb2NhdGlvbjtcbiAgZmFsbGJhY2tJZD86IHN0cmluZztcbn1cblxuY2xhc3MgSGFuem9Db250ZW50U2NyaXB0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXR1cENsaWNrSGFuZGxlcigpO1xuICAgIHRoaXMuaW5qZWN0SGVscGVycygpO1xuICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDbGlja0hhbmRsZXIoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgaWYgKCFlLmFsdEtleSkgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmV4dHJhY3RTb3VyY2VMb2NhdGlvbihlbGVtZW50KTtcbiAgICAgIGNvbnN0IGRvbVBhdGggPSB0aGlzLmdldERPTVBhdGgoZWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGV2ZW50OiBFbGVtZW50U2VsZWN0ZWRFdmVudCA9IHtcbiAgICAgICAgZXZlbnQ6ICdlbGVtZW50U2VsZWN0ZWQnLFxuICAgICAgICBmcmFtZXdvcms6IHRoaXMuZGV0ZWN0RnJhbWV3b3JrKCksXG4gICAgICAgIGRvbVBhdGgsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgZmFsbGJhY2tJZDogZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuem8taWQnKSB8fCB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGJhY2tncm91bmQgc2NyaXB0ICh3b3JrcyB3aXRoIGJvdGggWkFQIGFuZCBsZWdhY3kgTUNQKVxuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdlbGVtZW50U2VsZWN0ZWQnLCBkYXRhOiBldmVudCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBNZXNzYWdlSGFuZGxlcnMoKSB7XG4gICAgY2hyb21lLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKChyZXF1ZXN0LCBfc2VuZGVyLCBzZW5kUmVzcG9uc2UpID0+IHtcbiAgICAgIHN3aXRjaCAocmVxdWVzdC5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5zdGFydCc6XG4gICAgICAgICAgYWlPdmVybGF5LnNob3cocmVxdWVzdC50YXNrIHx8ICdBSSBpcyBjb250cm9sbGluZyB0aGlzIHBhZ2UnKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdhaS5jb250cm9sLnN0b3AnOlxuICAgICAgICAgIGFpT3ZlcmxheS5oaWRlKCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5jdXJzb3InOlxuICAgICAgICAgIGFpT3ZlcmxheS5tb3ZlQ3Vyc29yKHJlcXVlc3QueCwgcmVxdWVzdC55KTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdhaS5jb250cm9sLmhpZ2hsaWdodCc6XG4gICAgICAgICAgYWlPdmVybGF5LmhpZ2hsaWdodChyZXF1ZXN0LnNlbGVjdG9yKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdhaS5jb250cm9sLnN0YXR1cyc6XG4gICAgICAgICAgYWlPdmVybGF5LnVwZGF0ZVN0YXR1cyhyZXF1ZXN0LnRleHQpO1xuICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ3BhZ2Uub3ZlcmxheS50b2dnbGUnOlxuICAgICAgICAgIHNlbmRSZXNwb25zZSh7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgb3BlbjogcGFnZU92ZXJsYXkudG9nZ2xlKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ3BhZ2Uub3ZlcmxheS5zaG93JzpcbiAgICAgICAgICBwYWdlT3ZlcmxheS5zaG93KCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgb3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LmhpZGUnOlxuICAgICAgICAgIHBhZ2VPdmVybGF5LmhpZGUoKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCBvcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnN0YXR1cyc6XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgb3BlbjogcGFnZU92ZXJsYXkuaXNPcGVuKCkgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhYiBmaWxlc3lzdGVtIHN1cHBvcnRcbiAgICAgIGlmIChyZXF1ZXN0LmFjdGlvbiA9PT0gJ2dldENvbnRlbnQnKSB7XG4gICAgICAgIHNlbmRSZXNwb25zZSh7IGNvbnRlbnQ6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8ub3V0ZXJIVE1MIHx8ICcnIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVlc3QuYWN0aW9uID09PSAnc2V0Q29udGVudCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZG9jdW1lbnQub3BlbigpO1xuICAgICAgICAgIGRvY3VtZW50LndyaXRlKHJlcXVlc3QuY29udGVudCk7XG4gICAgICAgICAgZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0U291cmNlTG9jYXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQpOiBTb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZnJhbWV3b3JrID0gdGhpcy5kZXRlY3RGcmFtZXdvcmsoKTtcblxuICAgIHN3aXRjaCAoZnJhbWV3b3JrKSB7XG4gICAgICBjYXNlICdyZWFjdCc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RSZWFjdFNvdXJjZShlbGVtZW50KTtcbiAgICAgIGNhc2UgJ3Z1ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RWdWVTb3VyY2UoZWxlbWVudCk7XG4gICAgICBjYXNlICdzdmVsdGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0U3ZlbHRlU291cmNlKGVsZW1lbnQpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RSZWFjdFNvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBob29rID0gKHdpbmRvdyBhcyBhbnkpLl9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcbiAgICBpZiAoIWhvb2spIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmaWJlciA9IHRoaXMuZmluZFJlYWN0RmliZXIoZWxlbWVudCk7XG4gICAgaWYgKCFmaWJlcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNvdXJjZSA9IGZpYmVyLl9kZWJ1Z1NvdXJjZSB8fCBmaWJlci5wZW5kaW5nUHJvcHM/Ll9fc291cmNlIHx8IGZpYmVyLm1lbW9pemVkUHJvcHM/Ll9fc291cmNlO1xuXG4gICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UuZmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGU6IHNvdXJjZS5maWxlTmFtZSxcbiAgICAgICAgbGluZTogc291cmNlLmxpbmVOdW1iZXIsXG4gICAgICAgIGNvbHVtbjogc291cmNlLmNvbHVtbk51bWJlcixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFJlYWN0RmliZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkge1xuICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGVsZW1lbnQpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuc3RhcnRzV2l0aCgnX19yZWFjdEludGVybmFsSW5zdGFuY2UkJykgfHwgY2FuZGlkYXRlLnN0YXJ0c1dpdGgoJ19fcmVhY3RGaWJlciQnKSxcbiAgICApO1xuICAgIHJldHVybiBrZXkgPyAoZWxlbWVudCBhcyBhbnkpW2tleV0gOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0VnVlU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhvb2sgPSAod2luZG93IGFzIGFueSkuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcbiAgICBpZiAoIWhvb2spIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgaW5zdGFuY2UgPSAoZWxlbWVudCBhcyBhbnkpLl9fdnVlUGFyZW50Q29tcG9uZW50O1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlID0gKGVsZW1lbnQgYXMgYW55KS5fX3Z1ZV9fO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZT8udHlwZT8uX19maWxlKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbjogU291cmNlTG9jYXRpb24gPSB7XG4gICAgICAgIGZpbGU6IGluc3RhbmNlLnR5cGUuX19maWxlLFxuICAgICAgICBsaW5lOiAxLFxuICAgICAgfTtcblxuICAgICAgaWYgKGluc3RhbmNlLnZub2RlPy5sb2MpIHtcbiAgICAgICAgbG9jYXRpb24ubGluZSA9IGluc3RhbmNlLnZub2RlLmxvYy5zdGFydC5saW5lO1xuICAgICAgICBsb2NhdGlvbi5jb2x1bW4gPSBpbnN0YW5jZS52bm9kZS5sb2Muc3RhcnQuY29sdW1uO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFN2ZWx0ZVNvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSAoZWxlbWVudCBhcyBhbnkpLl9fc3ZlbHRlX2NvbXBvbmVudDtcbiAgICBpZiAoY29tcG9uZW50Py4kJD8uY3R4Py4kJF9sb2NhdGlvbikge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudC4kJC5jdHguJCRfbG9jYXRpb247XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdEZyYW1ld29yaygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXykgcmV0dXJuICdyZWFjdCc7XG4gICAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fKSByZXR1cm4gJ3Z1ZSc7XG4gICAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX3N2ZWx0ZSkgcmV0dXJuICdzdmVsdGUnO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRET01QYXRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXRoOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgbGV0IHNlbGVjdG9yID0gY3VycmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChjdXJyZW50LmlkKSB7XG4gICAgICAgIHNlbGVjdG9yICs9IGAjJHtjdXJyZW50LmlkfWA7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQuY2xhc3NOYW1lKSB7XG4gICAgICAgIHNlbGVjdG9yICs9IGAuJHtjdXJyZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpLmpvaW4oJy4nKX1gO1xuICAgICAgfVxuXG4gICAgICBwYXRoLnVuc2hpZnQoc2VsZWN0b3IpO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5qb2luKCcgPiAnKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0SGVscGVycygpIHtcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgICBbZGF0YS1oYW56by1ob3Zlcl0ge1xuICAgICAgICBvdXRsaW5lOiAycHggZGFzaGVkICNmZjZiNmIgIWltcG9ydGFudDtcbiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDJweCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIGA7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZSkgPT4ge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtaGFuem8taG92ZXJdJykuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhhbnpvLWhvdmVyJyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGUuYWx0S2V5ICYmIGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgZS50YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLWhvdmVyJywgJ3RydWUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQUkgQ29udHJvbCBPdmVybGF5IFx1MjAxNCB0YWtlb3ZlciB2aXN1YWwgZmVlZGJhY2sgKyB1c2VyIGludGVyYWN0aW9uIGxvY2tcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IGFpT3ZlcmxheSA9ICgoKSA9PiB7XG4gIGxldCBvdmVybGF5OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgY3Vyc29yOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RhdHVzRWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBjYW5jZWxCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBoaWdobGlnaHRFbDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IHRyYWlsTm9kZXM6IEhUTUxEaXZFbGVtZW50W10gPSBbXTtcbiAgbGV0IGludGVyYWN0aW9uQmxvY2tBY3RpdmUgPSBmYWxzZTtcblxuICBjb25zdCBPVkVSTEFZX0lEID0gJ2hhbnpvLWFpLW92ZXJsYXknO1xuICBjb25zdCBTVFlMRVNfSUQgPSAnaGFuem8tYWktb3ZlcmxheS1zdHlsZXMnO1xuICBjb25zdCBCTE9DS0VEX0VWRU5UUyA9IFtcbiAgICAnY2xpY2snLCAnZGJsY2xpY2snLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnY29udGV4dG1lbnUnLFxuICAgICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnLCAnd2hlZWwnLFxuICAgICdrZXlkb3duJywgJ2tleXVwJywgJ2tleXByZXNzJyxcbiAgXTtcblxuICBmdW5jdGlvbiBpbmplY3RTdHlsZXMoKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFNUWUxFU19JRCkpIHJldHVybjtcblxuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9IFNUWUxFU19JRDtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIC8qIC0tLS0gT3ZlcmxheSBiYWNrZHJvcCAtLS0tICovXG4gICAgICAjJHtPVkVSTEFZX0lEfSB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDY7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7XG4gICAgICAgIGJhY2tncm91bmQ6XG4gICAgICAgICAgcmFkaWFsLWdyYWRpZW50KDkwdncgOTB2aCBhdCAxNSUgOCUsIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjEwKSwgdHJhbnNwYXJlbnQgNTUlKSxcbiAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoNjV2dyA2NXZoIGF0IDg0JSA4MiUsIHJnYmEoOTksIDEwMiwgMjQxLCAwLjEwKSwgdHJhbnNwYXJlbnQgNjAlKSxcbiAgICAgICAgICByZ2JhKDIsIDQsIDEwLCAwLjQyKTtcbiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEuNXB4KTtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtcyBlYXNlO1xuICAgICAgfVxuICAgICAgIyR7T1ZFUkxBWV9JRH0uaGFuem8tdmlzaWJsZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIC0tLS0gUHVsc2luZyBjeWFuIGdsb3cgY3Vyc29yIC0tLS0gKi9cbiAgICAgIC5oYW56by1haS1jdXJzb3Ige1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDc7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoNiwgMTgyLCAyMTIsIDAuOTUpO1xuICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgIDAgMCA4cHggMnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuNDUpLFxuICAgICAgICAgIDAgMCAyNHB4IDZweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjE4KTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xOHMgZWFzZS1vdXQsIHRvcCAwLjE4cyBlYXNlLW91dDtcbiAgICAgICAgYW5pbWF0aW9uOiBoYW56by1jdXJzb3ItcHVsc2UgMS42cyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1jdXJzb3IuaGFuem8tdmlzaWJsZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xOHMgZWFzZS1vdXQsIHRvcCAwLjE4cyBlYXNlLW91dCwgb3BhY2l0eSAzMDBtcyBlYXNlO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1jdXJzb3ItcHVsc2Uge1xuICAgICAgICAwJSwgMTAwJSB7XG4gICAgICAgICAgYm94LXNoYWRvdzpcbiAgICAgICAgICAgIDAgMCA4cHggMnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuNDUpLFxuICAgICAgICAgICAgMCAwIDI0cHggNnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuMTgpO1xuICAgICAgICB9XG4gICAgICAgIDUwJSB7XG4gICAgICAgICAgYm94LXNoYWRvdzpcbiAgICAgICAgICAgIDAgMCAxNHB4IDRweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjY1KSxcbiAgICAgICAgICAgIDAgMCAzNnB4IDEwcHggcmdiYSg2LCAxODIsIDIxMiwgMC4yOCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogLS0tLSBDdXJzb3IgdHJhaWwgLS0tLSAqL1xuICAgICAgLmhhbnpvLWN1cnNvci10cmFpbCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgd2lkdGg6IDZweDtcbiAgICAgICAgaGVpZ2h0OiA2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg2LCAxODIsIDIxMiwgMC43KTtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLXRyYWlsLWZhZGUgMC40cyBlYXNlLW91dCBmb3J3YXJkcztcbiAgICAgIH1cbiAgICAgIEBrZXlmcmFtZXMgaGFuem8tdHJhaWwtZmFkZSB7XG4gICAgICAgIGZyb20geyBvcGFjaXR5OiAwLjc7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEpOyB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMC4xNSk7IH1cbiAgICAgIH1cblxuICAgICAgLyogLS0tLSBTdGF0dXMgYmFubmVyICh0b3AgY2VudGVyIHBpbGwpIC0tLS0gKi9cbiAgICAgIC5oYW56by1haS1zdGF0dXMge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMTZweDtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMTBweDtcbiAgICAgICAgbWF4LXdpZHRoOiA5MHZ3O1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDE0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoOCwgMTIsIDIwLCAwLjk0KSwgcmdiYSgxMCwgMTYsIDI0LCAwLjk2KSk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjI2KTtcbiAgICAgICAgY29sb3I6ICNmM2Y0ZjY7XG4gICAgICAgIGZvbnQ6IDEzcHgvMS40IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjtcbiAgICAgICAgYm94LXNoYWRvdzpcbiAgICAgICAgICAwIDEwcHggMzZweCByZ2JhKDAsIDAsIDAsIDAuNDYpLFxuICAgICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtcyBlYXNlO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLXN0YXR1czo6YmVmb3JlIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgaW5zZXQ6IC0ycHggYXV0byAtMnB4IC0yMCU7XG4gICAgICAgIHdpZHRoOiA0MCU7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNiksIHRyYW5zcGFyZW50KTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgtMThkZWcpO1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLXN0YXR1cy1zaGVlbiAzLjZzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cbiAgICAgIEBrZXlmcmFtZXMgaGFuem8tc3RhdHVzLXNoZWVuIHtcbiAgICAgICAgMCUsIDY4JSB7IGxlZnQ6IC0zMCU7IG9wYWNpdHk6IDA7IH1cbiAgICAgICAgNzIlIHsgb3BhY2l0eTogMC40OyB9XG4gICAgICAgIDEwMCUgeyBsZWZ0OiAxMzAlOyBvcGFjaXR5OiAwOyB9XG4gICAgICB9XG4gICAgICAuaGFuem8tYWktc3RhdHVzID4gKiB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1zdGF0dXMuaGFuem8tdmlzaWJsZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLWJyYW5kLWJ1YmJsZSB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICBtaW4td2lkdGg6IDMwcHg7XG4gICAgICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMjVweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgY29sb3I6ICNlMGYyZmU7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTQsIDExNiwgMTQ0LCAwLjk1KSwgcmdiYSgxNSwgMjMsIDQyLCAwLjk1KSk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjM1KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tcHVsc2UtZG90IHtcbiAgICAgICAgd2lkdGg6IDhweDtcbiAgICAgICAgaGVpZ2h0OiA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgICAgYmFja2dyb3VuZDogIzA2YjZkNDtcbiAgICAgICAgYW5pbWF0aW9uOiBoYW56by1kb3QtcHVsc2UgMS40cyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbiAgICAgIH1cbiAgICAgIEBrZXlmcmFtZXMgaGFuem8tZG90LXB1bHNlIHtcbiAgICAgICAgMCUsIDEwMCUgeyBvcGFjaXR5OiAxOyB9XG4gICAgICAgIDUwJSB7IG9wYWNpdHk6IDAuNDsgfVxuICAgICAgfVxuXG4gICAgICAuaGFuem8tYWktc3RhdHVzIC5oYW56by1sYWJlbCB7XG4gICAgICAgIG1heC13aWR0aDogNDZ2dztcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLWRvdHM6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIGFuaW1hdGlvbjogaGFuem8tYW5pbWF0ZWQtZG90cyAxLjVzIHN0ZXBzKDQpIGluZmluaXRlO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1hbmltYXRlZC1kb3RzIHtcbiAgICAgICAgMCUgeyBjb250ZW50OiAnJzsgfVxuICAgICAgICAyNSUgeyBjb250ZW50OiAnLic7IH1cbiAgICAgICAgNTAlIHsgY29udGVudDogJy4uJzsgfVxuICAgICAgICA3NSUgeyBjb250ZW50OiAnLi4uJzsgfVxuICAgICAgfVxuXG4gICAgICAuaGFuem8tYWktc3RhdHVzIC5oYW56by1zdG9wLWJ0biB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCk7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7XG4gICAgICAgIGNvbG9yOiAjZjhmYWZjO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBwYWRkaW5nOiA0cHggMTJweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMsIGJvcmRlci1jb2xvciAwLjE1cztcbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLXN0b3AtYnRuOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMjAsIDM4LCAzOCwgMC4yOCk7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNDgsIDExMywgMTEzLCAwLjYpO1xuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIFwiVGFrZSBCYWNrIENvbnRyb2xcIiBidXR0b24gKGJvdHRvbS1yaWdodCkgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLWNhbmNlbCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgYm90dG9tOiAyNHB4O1xuICAgICAgICByaWdodDogMjRweDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgcGFkZGluZzogMTJweCAyNHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTUsIDE4LCAyNCwgMC45NSk7XG4gICAgICAgIGNvbG9yOiAjZjNmNGY2O1xuICAgICAgICBmb250OiA2MDAgMTRweC8xLjQgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjQpO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtcyBlYXNlLCBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLWNhbmNlbC5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1jYW5jZWw6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgMzgsIDM4LCAwLjM1KTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyMCwgMzgsIDM4LCAwLjUpO1xuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIEVsZW1lbnQgaGlnaGxpZ2h0IC0tLS0gKi9cbiAgICAgIC5oYW56by1haS1oaWdobGlnaHQge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDc7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDYsIDE4MiwgMjEyLCAwLjg1KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggcmdiYSg2LCAxODIsIDIxMiwgMC4xNSk7XG4gICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xNXMsIHRvcCAwLjE1cywgd2lkdGggMC4xNXMsIGhlaWdodCAwLjE1cztcbiAgICAgIH1cbiAgICBgO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPdmVybGF5RWxlbWVudCh0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhKFxuICAgICAgb3ZlcmxheT8uY29udGFpbnModGFyZ2V0KSB8fFxuICAgICAgc3RhdHVzRWw/LmNvbnRhaW5zKHRhcmdldCkgfHxcbiAgICAgIGNhbmNlbEJ0bj8uY29udGFpbnModGFyZ2V0KSB8fFxuICAgICAgY3Vyc29yPy5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICBoaWdobGlnaHRFbD8uY29udGFpbnModGFyZ2V0KVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBibG9ja0ludGVyYWN0aW9uKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghaW50ZXJhY3Rpb25CbG9ja0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCAmJiBldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2FpLmNvbnRyb2wuY2FuY2VsJyB9KTtcbiAgICAgIGhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPdmVybGF5RWxlbWVudChldmVudC50YXJnZXQpKSByZXR1cm47XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0SW50ZXJhY3Rpb25CbG9jayhhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaW50ZXJhY3Rpb25CbG9ja0FjdGl2ZSA9PT0gYWN0aXZlKSByZXR1cm47XG5cbiAgICBpbnRlcmFjdGlvbkJsb2NrQWN0aXZlID0gYWN0aXZlO1xuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIEJMT0NLRURfRVZFTlRTKSB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBibG9ja0ludGVyYWN0aW9uLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBibG9ja0ludGVyYWN0aW9uLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93KHRhc2s6IHN0cmluZykge1xuICAgIGlmIChvdmVybGF5KSBoaWRlKCk7XG5cbiAgICBpbmplY3RTdHlsZXMoKTtcbiAgICBzZXRJbnRlcmFjdGlvbkJsb2NrKHRydWUpO1xuXG4gICAgLy8gQmFja2Ryb3BcbiAgICBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgb3ZlcmxheS5pZCA9IE9WRVJMQVlfSUQ7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcblxuICAgIC8vIEN1cnNvclxuICAgIGN1cnNvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGN1cnNvci5jbGFzc05hbWUgPSAnaGFuem8tYWktY3Vyc29yJztcbiAgICBjdXJzb3Iuc3R5bGUubGVmdCA9IGAke3dpbmRvdy5pbm5lcldpZHRoIC8gMn1weGA7XG4gICAgY3Vyc29yLnN0eWxlLnRvcCA9IGAke3dpbmRvdy5pbm5lckhlaWdodCAvIDJ9cHhgO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY3Vyc29yKTtcblxuICAgIC8vIFN0YXR1cyBiYW5uZXJcbiAgICBzdGF0dXNFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICdoYW56by1haS1zdGF0dXMnO1xuICAgIHN0YXR1c0VsLmlubmVySFRNTCA9IGBcbiAgICAgIDxzcGFuIGNsYXNzPVwiaGFuem8tYnJhbmQtYnViYmxlXCI+QUk8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcHVsc2UtZG90XCI+PC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImhhbnpvLWxhYmVsXCI+JHtlc2NhcGVIdG1sKHRhc2sgfHwgJ0hhbnpvIEFJIGlzIGNvbnRyb2xsaW5nIHRoaXMgdGFiJyl9PC9zcGFuPjxzcGFuIGNsYXNzPVwiaGFuem8tZG90c1wiPjwvc3Bhbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJoYW56by1zdG9wLWJ0blwiPlN0b3A8L2J1dHRvbj5cbiAgICBgO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3RhdHVzRWwpO1xuXG4gICAgc3RhdHVzRWwucXVlcnlTZWxlY3RvcignLmhhbnpvLXN0b3AtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhaS5jb250cm9sLmNhbmNlbCcgfSk7XG4gICAgICBoaWRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyBcIlRha2UgQmFjayBDb250cm9sXCIgYnV0dG9uXG4gICAgY2FuY2VsQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgY2FuY2VsQnRuLmNsYXNzTmFtZSA9ICdoYW56by1haS1jYW5jZWwnO1xuICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdUYWtlIEJhY2sgQ29udHJvbCc7XG4gICAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhaS5jb250cm9sLmNhbmNlbCcgfSk7XG4gICAgICBoaWRlKCk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW5jZWxCdG4pO1xuXG4gICAgLy8gRmFkZSBpbiAobmV4dCBmcmFtZSBzbyB0aGUgdHJhbnNpdGlvbiB0cmlnZ2VycylcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgb3ZlcmxheT8uY2xhc3NMaXN0LmFkZCgnaGFuem8tdmlzaWJsZScpO1xuICAgICAgY3Vyc29yPy5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgICBzdGF0dXNFbD8uY2xhc3NMaXN0LmFkZCgnaGFuem8tdmlzaWJsZScpO1xuICAgICAgY2FuY2VsQnRuPy5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlKCkge1xuICAgIC8vIEZhZGUgb3V0XG4gICAgb3ZlcmxheT8uY2xhc3NMaXN0LnJlbW92ZSgnaGFuem8tdmlzaWJsZScpO1xuICAgIGN1cnNvcj8uY2xhc3NMaXN0LnJlbW92ZSgnaGFuem8tdmlzaWJsZScpO1xuICAgIHN0YXR1c0VsPy5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG4gICAgY2FuY2VsQnRuPy5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG5cbiAgICAvLyBSZW1vdmUgYWZ0ZXIgdHJhbnNpdGlvblxuICAgIGNvbnN0IHJlZnMgPSB7IG92ZXJsYXksIGN1cnNvciwgc3RhdHVzRWwsIGNhbmNlbEJ0biwgaGlnaGxpZ2h0RWwgfTtcbiAgICBjb25zdCB0cmFpbHMgPSBbLi4udHJhaWxOb2Rlc107XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlZnMub3ZlcmxheT8ucmVtb3ZlKCk7XG4gICAgICByZWZzLmN1cnNvcj8ucmVtb3ZlKCk7XG4gICAgICByZWZzLnN0YXR1c0VsPy5yZW1vdmUoKTtcbiAgICAgIHJlZnMuY2FuY2VsQnRuPy5yZW1vdmUoKTtcbiAgICAgIHJlZnMuaGlnaGxpZ2h0RWw/LnJlbW92ZSgpO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHRyYWlscykge1xuICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0sIDMyMCk7XG5cbiAgICBzZXRJbnRlcmFjdGlvbkJsb2NrKGZhbHNlKTtcblxuICAgIG92ZXJsYXkgPSBudWxsO1xuICAgIGN1cnNvciA9IG51bGw7XG4gICAgc3RhdHVzRWwgPSBudWxsO1xuICAgIGNhbmNlbEJ0biA9IG51bGw7XG4gICAgaGlnaGxpZ2h0RWwgPSBudWxsO1xuICAgIHRyYWlsTm9kZXMgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVDdXJzb3IoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoIWN1cnNvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgY2xhbXBlZFggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCwgTnVtYmVyLmlzRmluaXRlKHgpID8geCA6IDApKTtcbiAgICBjb25zdCBjbGFtcGVkWSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCwgTnVtYmVyLmlzRmluaXRlKHkpID8geSA6IDApKTtcblxuICAgIC8vIFRyYWlsIGRvdFxuICAgIGNvbnN0IHRyYWlsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdHJhaWwuY2xhc3NOYW1lID0gJ2hhbnpvLWN1cnNvci10cmFpbCc7XG4gICAgdHJhaWwuc3R5bGUubGVmdCA9IGAke2NsYW1wZWRYfXB4YDtcbiAgICB0cmFpbC5zdHlsZS50b3AgPSBgJHtjbGFtcGVkWX1weGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0cmFpbCk7XG4gICAgdHJhaWxOb2Rlcy5wdXNoKHRyYWlsKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdHJhaWwucmVtb3ZlKCk7XG4gICAgICB0cmFpbE5vZGVzID0gdHJhaWxOb2Rlcy5maWx0ZXIoKG5vZGUpID0+IG5vZGUgIT09IHRyYWlsKTtcbiAgICB9LCA0MDApO1xuXG4gICAgd2hpbGUgKHRyYWlsTm9kZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIHRyYWlsTm9kZXMuc2hpZnQoKT8ucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY3Vyc29yLnN0eWxlLmxlZnQgPSBgJHtjbGFtcGVkWH1weGA7XG4gICAgY3Vyc29yLnN0eWxlLnRvcCA9IGAke2NsYW1wZWRZfXB4YDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZ2hsaWdodChzZWxlY3Rvcjogc3RyaW5nKSB7XG4gICAgaGlnaGxpZ2h0RWw/LnJlbW92ZSgpO1xuICAgIGhpZ2hsaWdodEVsID0gbnVsbDtcblxuICAgIGlmICghc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChyZWN0LndpZHRoID09PSAwICYmIHJlY3QuaGVpZ2h0ID09PSAwKSByZXR1cm47XG5cbiAgICAgIGhpZ2hsaWdodEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBoaWdobGlnaHRFbC5jbGFzc05hbWUgPSAnaGFuem8tYWktaGlnaGxpZ2h0JztcbiAgICAgIGhpZ2hsaWdodEVsLnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCgwLCByZWN0LmxlZnQgLSA0KX1weGA7XG4gICAgICBoaWdobGlnaHRFbC5zdHlsZS50b3AgPSBgJHtNYXRoLm1heCgwLCByZWN0LnRvcCAtIDQpfXB4YDtcbiAgICAgIGhpZ2hsaWdodEVsLnN0eWxlLndpZHRoID0gYCR7cmVjdC53aWR0aCArIDh9cHhgO1xuICAgICAgaGlnaGxpZ2h0RWwuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHQgKyA4fXB4YDtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlnaGxpZ2h0RWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIGludmFsaWQgc2VsZWN0b3JzLlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1cyh0ZXh0OiBzdHJpbmcpIHtcbiAgICBpZiAoIXN0YXR1c0VsKSByZXR1cm47XG5cbiAgICBjb25zdCBsYWJlbCA9IHN0YXR1c0VsLnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1sYWJlbCcpO1xuICAgIGlmIChsYWJlbCkge1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0IHx8ICdIYW56byBBSSBpcyBjb250cm9sbGluZyB0aGlzIHRhYic7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICByZXR1cm4geyBzaG93LCBoaWRlLCBtb3ZlQ3Vyc29yLCBoaWdobGlnaHQsIHVwZGF0ZVN0YXR1cyB9O1xufSkoKTtcblxudHlwZSBPdmVybGF5Q2hhdFJvbGUgPSAndXNlcicgfCAnYXNzaXN0YW50JyB8ICdzeXN0ZW0nO1xuXG5pbnRlcmZhY2UgT3ZlcmxheUNoYXRNZXNzYWdlIHtcbiAgcm9sZTogT3ZlcmxheUNoYXRSb2xlO1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBPdmVybGF5RWxlbWVudENvbnRleHQge1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICB0YWc6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBodG1sOiBzdHJpbmc7XG59XG5cbmNsYXNzIEhhbnpvUGFnZU92ZXJsYXkge1xuICBwcml2YXRlIG1vdW50ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBlbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgb3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIHNlbmRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSB3YXRjaE1vZGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBlZGl0TW9kZSA9IGZhbHNlO1xuICBwcml2YXRlIG1vZGVsc0xvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIG1lc3NhZ2VzOiBPdmVybGF5Q2hhdE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkQ29udGV4dDogT3ZlcmxheUVsZW1lbnRDb250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJlZEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRpdGluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByb290OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhdW5jaGVyOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBhbmVsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VzRWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5wdXRFbDogSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbmRCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbW9kZWxFbDogSFRNTFNlbGVjdEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb250ZXh0RWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2F0Y2hCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRpdEJ0bjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0dXNFbDogSFRNTFNwYW5FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaGlnaGxpZ2h0Qm94OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5qZWN0U3R5bGVzKCk7XG4gICAgdGhpcy5tb3VudCgpO1xuICAgIHRoaXMuYmluZEdsb2JhbEV2ZW50cygpO1xuICB9XG5cbiAgdG9nZ2xlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLm9wZW4pIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRoaXMuaGlkZSgpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVNb3VudGVkKCk7XG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLWVuYWJsZWQnLCAndHJ1ZScpO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMubG9hZE1vZGVscygpO1xuICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICB9XG5cbiAgaGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnJvb3Q/LnNldEF0dHJpYnV0ZSgnZGF0YS1vcGVuJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy51cGRhdGVTdGF0dXMoJycpO1xuICAgIHRoaXMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICB0aGlzLnNldFdhdGNoTW9kZShmYWxzZSk7XG4gICAgdGhpcy5zZXRFZGl0TW9kZShmYWxzZSk7XG4gIH1cblxuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTW91bnRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3VudGVkKSByZXR1cm47XG4gICAgdGhpcy5tb3VudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3RTdHlsZXMoKTogdm9pZCB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYW56by1wYWdlLW92ZXJsYXktc3R5bGVzJykpIHJldHVybjtcblxuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9ICdoYW56by1wYWdlLW92ZXJsYXktc3R5bGVzJztcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgcmlnaHQ6IDIwcHg7XG4gICAgICAgIGJvdHRvbTogMjBweDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NTtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdCAqIHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIH1cblxuICAgICAgI2hhbnpvLXBhZ2Utb3ZlcmxheS1yb290W2RhdGEtZW5hYmxlZD1cImZhbHNlXCJdIC5oYW56by1wYWdlLWxhdW5jaGVyIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDE2cHgpO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbGF1bmNoZXIge1xuICAgICAgICB3aWR0aDogNTRweDtcbiAgICAgICAgaGVpZ2h0OiA1NHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgyMiwgMjQsIDMxLCAwLjk2KSwgcmdiYSg3LCA4LCAxMiwgMC45NikpO1xuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxNHB4IDM0cHggcmdiYSgwLCAwLCAwLCAwLjM1KTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2UsIG9wYWNpdHkgMC4ycyBlYXNlO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1sYXVuY2hlcjpob3ZlciB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtcGFuZWwge1xuICAgICAgICB3aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpO1xuICAgICAgICBtYXgtaGVpZ2h0OiBtaW4oNjIwcHgsIGNhbGMoMTAwdmggLSAyOHB4KSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTEsIDEzLCAxOCwgMC45NyksIHJnYmEoNywgOCwgMTIsIDAuOTcpKTtcbiAgICAgICAgY29sb3I6ICNlZWYyZmY7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMjJweCA0OHB4IHJnYmEoMCwgMCwgMCwgMC40NSk7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSByaWdodDtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCkgc2NhbGUoMC45OCk7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xOHMgZWFzZSwgb3BhY2l0eSAwLjE4cyBlYXNlO1xuICAgICAgfVxuXG4gICAgICAjaGFuem8tcGFnZS1vdmVybGF5LXJvb3RbZGF0YS1vcGVuPVwidHJ1ZVwiXSAuaGFuem8tcGFnZS1wYW5lbCB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdFtkYXRhLW9wZW49XCJ0cnVlXCJdIC5oYW56by1wYWdlLWxhdW5jaGVyIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkpO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtaGVhZGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE0cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpO1xuICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpLCB0cmFuc3BhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWJyYW5kIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4O1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWhlYWRlci1hY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tY2hpcC1idG4ge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgICAgcGFkZGluZzogNHB4IDEwcHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMik7XG4gICAgICAgIGNvbG9yOiAjZDZkZWZmO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWNoaXAtYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSg1NiwgMTg5LCAyNDgsIDAuNjIpO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE0LCAxMTYsIDE0NCwgMC4zKTtcbiAgICAgICAgY29sb3I6ICNlMGYyZmU7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1pY29uLWJ0biB7XG4gICAgICAgIHdpZHRoOiAyOHB4O1xuICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGNvbG9yOiAjZTVlN2ViO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbWV0YSB7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweCA2cHggMTRweDtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgYXV0bztcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbnRleHQge1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIGNvbG9yOiAjYTViNGZjO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2Utc3RhdHVzIHtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBjb2xvcjogIzkzYzVmZDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLW1vZGVsLXJvdyB7XG4gICAgICAgIHBhZGRpbmc6IDAgMTRweCA4cHggMTRweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLW1vZGVsLXJvdyBzZWxlY3Qge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpO1xuICAgICAgICBjb2xvcjogI2YxZjVmOTtcbiAgICAgICAgcGFkZGluZzogN3B4IDlweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1tZXNzYWdlcyB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDIwMHB4O1xuICAgICAgICBtYXgtaGVpZ2h0OiAzNzBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgcGFkZGluZzogOHB4IDE0cHggMTJweCAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbXNnIHtcbiAgICAgICAgcGFkZGluZzogOXB4IDEwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLW1zZy51c2VyIHtcbiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgICAgIG1heC13aWR0aDogODglO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4yKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuNCk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLW1zZy5hc3Npc3RhbnQge1xuICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgICAgICBtYXgtd2lkdGg6IDkyJTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtY29tcG9zZXIge1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIHRleHRhcmVhIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLWhlaWdodDogMzhweDtcbiAgICAgICAgbWF4LWhlaWdodDogMTEwcHg7XG4gICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE3KTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTtcbiAgICAgICAgY29sb3I6ICNmOGZhZmM7XG4gICAgICAgIHBhZGRpbmc6IDlweCAxMXB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIGJ1dHRvbiB7XG4gICAgICAgIG1pbi13aWR0aDogNjhweDtcbiAgICAgICAgaGVpZ2h0OiAzOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM3LCA5OSwgMjM1LCAwLjY1KTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgzNywgOTksIDIzNSwgMC45NSksIHJnYmEoMzAsIDY0LCAxNzUsIDAuOTUpKTtcbiAgICAgICAgY29sb3I6ICNlZmY2ZmY7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciBidXR0b246ZGlzYWJsZWQge1xuICAgICAgICBvcGFjaXR5OiAwLjU1O1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWhpZ2hsaWdodCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NDtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjk1KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgxNCwgMTE2LCAxNDQsIDAuMik7XG4gICAgICB9XG5cbiAgICAgIFtkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nPVwidHJ1ZVwiXSB7XG4gICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDI1MSwgMTkxLCAzNiwgMC45MikgIWltcG9ydGFudDtcbiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDJweCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIGA7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICBwcml2YXRlIG1vdW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcblxuICAgIHRoaXMucm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucm9vdC5pZCA9ICdoYW56by1wYWdlLW92ZXJsYXktcm9vdCc7XG4gICAgdGhpcy5yb290LnNldEF0dHJpYnV0ZSgnZGF0YS1vcGVuJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy5yb290LnNldEF0dHJpYnV0ZSgnZGF0YS1lbmFibGVkJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy5yb290LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLXBhbmVsXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWw9XCJIYW56byBQYWdlIEFzc2lzdGFudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1icmFuZFwiPkhhbnpvIE92ZXJsYXk8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1oZWFkZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWNoaXAtYnRuXCIgZGF0YS1yb2xlPVwid2F0Y2hcIiBkYXRhLWFjdGl2ZT1cImZhbHNlXCIgdGl0bGU9XCJXYXRjaCBlbGVtZW50cyBvbiBob3ZlclwiPldhdGNoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGFuem8tY2hpcC1idG5cIiBkYXRhLXJvbGU9XCJlZGl0XCIgZGF0YS1hY3RpdmU9XCJmYWxzZVwiIHRpdGxlPVwiQ2xpY2sgYW55IGVsZW1lbnQgdG8gZWRpdCB0ZXh0XCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWljb24tYnRuXCIgZGF0YS1yb2xlPVwiY2xvc2VcIiB0aXRsZT1cIk1pbmltaXplXCI+XHUwMEQ3PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1tZXRhXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtY29udGV4dFwiPlVzZSBXYXRjaCB0byBpbnNwZWN0IHBhZ2UgZWxlbWVudHMuPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYW56by1wYWdlLXN0YXR1c1wiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1tb2RlbC1yb3dcIj5cbiAgICAgICAgICA8c2VsZWN0IGRhdGEtcm9sZT1cIm1vZGVsXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0XCI+Q2xhdWRlIFNvbm5ldCA0PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhdWRlLW9wdXMtNC0yMDI1MDUxNFwiPkNsYXVkZSBPcHVzIDQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJncHQtNG9cIj5HUFQtNG88L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ6ZW4tY29kZXItZmxhc2hcIj5aZW4gQ29kZXIgRmxhc2g8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ6ZW4tbWF4XCI+WmVuIE1heDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtbWVzc2FnZXNcIiBkYXRhLXJvbGU9XCJtZXNzYWdlc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLW1zZyBhc3Npc3RhbnRcIj5Bc2sgYWJvdXQgdGhpcyBwYWdlLCBpbnNwZWN0IGFueSBlbGVtZW50LCBvciB0dXJuIG9uIEVkaXQgbW9kZSB0byBjaGFuZ2UgdGV4dCBpbi1wbGFjZS48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWNvbXBvc2VyXCI+XG4gICAgICAgICAgPHRleHRhcmVhIGRhdGEtcm9sZT1cImlucHV0XCIgcm93cz1cIjFcIiBwbGFjZWhvbGRlcj1cIkFzayBhYm91dCB0aGlzIHBhZ2UuLi5cIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxidXR0b24gZGF0YS1yb2xlPVwic2VuZFwiIHR5cGU9XCJidXR0b25cIj5Bc2s8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJoYW56by1wYWdlLWxhdW5jaGVyXCIgZGF0YS1yb2xlPVwibGF1bmNoZXJcIiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJPcGVuIEhhbnpvIE92ZXJsYXlcIj5BSTwvYnV0dG9uPlxuICAgIGA7XG5cbiAgICB0aGlzLnBhbmVsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1wYWdlLXBhbmVsJyk7XG4gICAgdGhpcy5sYXVuY2hlciA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwibGF1bmNoZXJcIl0nKTtcbiAgICB0aGlzLm1lc3NhZ2VzRWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cIm1lc3NhZ2VzXCJdJyk7XG4gICAgdGhpcy5pbnB1dEVsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJpbnB1dFwiXScpO1xuICAgIHRoaXMuc2VuZEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwic2VuZFwiXScpO1xuICAgIHRoaXMubW9kZWxFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwibW9kZWxcIl0nKTtcbiAgICB0aGlzLmNvbnRleHRFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuaGFuem8tcGFnZS1jb250ZXh0Jyk7XG4gICAgdGhpcy53YXRjaEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwid2F0Y2hcIl0nKTtcbiAgICB0aGlzLmVkaXRCdG4gPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cImVkaXRcIl0nKTtcbiAgICB0aGlzLnN0YXR1c0VsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1wYWdlLXN0YXR1cycpO1xuXG4gICAgdGhpcy5sYXVuY2hlcj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNob3coKSk7XG4gICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJjbG9zZVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICB0aGlzLndhdGNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2V0V2F0Y2hNb2RlKCF0aGlzLndhdGNoTW9kZSkpO1xuICAgIHRoaXMuZWRpdEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNldEVkaXRNb2RlKCF0aGlzLmVkaXRNb2RlKSk7XG4gICAgdGhpcy5zZW5kQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuYXNrUGFnZVF1ZXN0aW9uKCkpO1xuICAgIHRoaXMuaW5wdXRFbD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5hc2tQYWdlUXVlc3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmlucHV0RWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlucHV0RWwpIHJldHVybjtcbiAgICAgIHRoaXMuaW5wdXRFbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICB0aGlzLmlucHV0RWwuc3R5bGUuaGVpZ2h0ID0gYCR7TWF0aC5taW4odGhpcy5pbnB1dEVsLnNjcm9sbEhlaWdodCwgMTEwKX1weGA7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kR2xvYmFsRXZlbnRzKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIChldmVudCkgPT4gdGhpcy5vbk1vdXNlTW92ZShldmVudCksIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLm9uRG9jdW1lbnRDbGljayhldmVudCksIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMub25LZXlEb3duKGV2ZW50KSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhdGNoTW9kZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0UGFnZVRhcmdldChldmVudC50YXJnZXQpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgdGhpcy5ob3ZlcmVkRWxlbWVudCA9IHRhcmdldDtcbiAgICB0aGlzLnNob3dIaWdobGlnaHQodGFyZ2V0KTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb250ZXh0KSB7XG4gICAgICB0aGlzLmNvbnRleHRFbCAmJiAodGhpcy5jb250ZXh0RWwudGV4dENvbnRlbnQgPSB0aGlzLmdldEVsZW1lbnRTdW1tYXJ5KHRhcmdldCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhdGNoTW9kZSAmJiAhdGhpcy5lZGl0TW9kZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0UGFnZVRhcmdldChldmVudC50YXJnZXQpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMud2F0Y2hNb2RlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29udGV4dCA9IHRoaXMuY2FwdHVyZUVsZW1lbnRDb250ZXh0KHRhcmdldCk7XG4gICAgICB0aGlzLmNvbnRleHRFbCAmJiAodGhpcy5jb250ZXh0RWwudGV4dENvbnRlbnQgPSB0aGlzLmdldEVsZW1lbnRTdW1tYXJ5KHRhcmdldCkpO1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VsZW1lbnQgc2VsZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lZGl0TW9kZSkge1xuICAgICAgdGhpcy5lbmFibGVJbmxpbmVFZGl0KHRhcmdldCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdGluZyBlbGVtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgaWYgKHRoaXMuZWRpdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdCh0aGlzLmVkaXRpbmdFbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IGNhbmNlbGVkJyk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wZW4pIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYWdlVGFyZ2V0KHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLnJvb3Q/LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybiBudWxsO1xuICAgIGlmICghdGFyZ2V0LmlzQ29ubmVjdGVkKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2h0bWwnIHx8IHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdib2R5JykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0V2F0Y2hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMud2F0Y2hNb2RlID0gYWN0aXZlO1xuICAgIGlmIChhY3RpdmUpIHRoaXMuc2V0RWRpdE1vZGUoZmFsc2UpO1xuICAgIHRoaXMud2F0Y2hCdG4/LnNldEF0dHJpYnV0ZSgnZGF0YS1hY3RpdmUnLCBhY3RpdmUgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5ob3ZlcmVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb250ZXh0ICYmIHRoaXMuY29udGV4dEVsKSB7XG4gICAgICAgIHRoaXMuY29udGV4dEVsLnRleHRDb250ZW50ID0gJ1VzZSBXYXRjaCB0byBpbnNwZWN0IHBhZ2UgZWxlbWVudHMuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ1dhdGNoIG1vZGUgb24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVkaXRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdE1vZGUgPSBhY3RpdmU7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5zZXRXYXRjaE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuZWRpdEJ0bj8uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZScsIGFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIGlmICghYWN0aXZlICYmIHRoaXMuZWRpdGluZ0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQodGhpcy5lZGl0aW5nRWxlbWVudCwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IG1vZGUgb24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZUlubGluZUVkaXQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nRWxlbWVudCAmJiB0aGlzLmVkaXRpbmdFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICB0aGlzLmRpc2FibGVJbmxpbmVFZGl0KHRoaXMuZWRpdGluZ0VsZW1lbnQsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgdGhpcy5lZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1oYW56by1vcmlnaW5hbC1odG1sJykpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnLCBlbGVtZW50LmlubmVySFRNTCk7XG4gICAgfVxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAndHJ1ZScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzcGVsbGNoZWNrJywgJ3RydWUnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1oYW56by1pbmxpbmUtZWRpdGluZycsICd0cnVlJyk7XG4gICAgZWxlbWVudC5mb2N1cygpO1xuICAgIHRoaXMuZWRpdGluZ0VsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdCByZXZlcnRlZCcpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdChlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VkaXQgYXBwbGllZCcpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBibHVySGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdCBhcHBsaWVkJyk7XG4gICAgfTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgYmx1ckhhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZUlubGluZUVkaXQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGtlZXBDaGFuZ2VzOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFrZWVwQ2hhbmdlcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1oYW56by1vcmlnaW5hbC1odG1sJyk7XG4gICAgICBpZiAob3JpZ2luYWwgIT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBvcmlnaW5hbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJyk7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snKTtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oYW56by1pbmxpbmUtZWRpdGluZycpO1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnKTtcblxuICAgIGlmICh0aGlzLmVkaXRpbmdFbGVtZW50ID09PSBlbGVtZW50KSB7XG4gICAgICB0aGlzLmVkaXRpbmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dIaWdobGlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAocmVjdC53aWR0aCA9PT0gMCAmJiByZWN0LmhlaWdodCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhckhpZ2hsaWdodCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5oaWdobGlnaHRCb3gpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0Qm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmhpZ2hsaWdodEJveC5jbGFzc05hbWUgPSAnaGFuem8tcGFnZS1oaWdobGlnaHQnO1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGlnaGxpZ2h0Qm94KTtcbiAgICB9XG5cbiAgICB0aGlzLmhpZ2hsaWdodEJveC5zdHlsZS5sZWZ0ID0gYCR7TWF0aC5tYXgoMCwgcmVjdC5sZWZ0IC0gMyl9cHhgO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLnRvcCA9IGAke01hdGgubWF4KDAsIHJlY3QudG9wIC0gMyl9cHhgO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLndpZHRoID0gYCR7cmVjdC53aWR0aCArIDZ9cHhgO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLmhlaWdodCA9IGAke3JlY3QuaGVpZ2h0ICsgNn1weGA7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySGlnaGxpZ2h0KCk6IHZvaWQge1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94Py5yZW1vdmUoKTtcbiAgICB0aGlzLmhpZ2hsaWdodEJveCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNhcHR1cmVFbGVtZW50Q29udGV4dChlbGVtZW50OiBIVE1MRWxlbWVudCk6IE92ZXJsYXlFbGVtZW50Q29udGV4dCB7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMubm9ybWFsaXplVGV4dChlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50IHx8ICcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3I6IHRoaXMuYnVpbGRTZWxlY3RvcihlbGVtZW50KSxcbiAgICAgIHRhZzogZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICB0ZXh0OiB0ZXh0LnNsaWNlKDAsIDgwMCksXG4gICAgICBodG1sOiBlbGVtZW50Lm91dGVySFRNTC5zbGljZSgwLCAxMjAwKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoZWxlbWVudC5pZCkgcmV0dXJuIGAjJHtlbGVtZW50LmlkfWA7XG5cbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgY3VycmVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gZWxlbWVudDtcbiAgICBsZXQgZGVwdGggPSAwO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgZGVwdGggPCA2KSB7XG4gICAgICBsZXQgcGFydCA9IGN1cnJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGN1cnJlbnQuY2xhc3NMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gQXJyYXkuZnJvbShjdXJyZW50LmNsYXNzTGlzdCkuc2xpY2UoMCwgMikuam9pbignLicpO1xuICAgICAgICBpZiAoY2xhc3NOYW1lKSBwYXJ0ICs9IGAuJHtjbGFzc05hbWV9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY29uc3Qgc2libGluZ3MgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZHJlbikuZmlsdGVyKChub2RlKSA9PiBub2RlLnRhZ05hbWUgPT09IGN1cnJlbnQhLnRhZ05hbWUpO1xuICAgICAgICBpZiAoc2libGluZ3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2libGluZ3MuaW5kZXhPZihjdXJyZW50KSArIDE7XG4gICAgICAgICAgcGFydCArPSBgOm50aC1vZi10eXBlKCR7aW5kZXh9KWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhcnRzLnVuc2hpZnQocGFydCk7XG4gICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgICAgZGVwdGggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbignID4gJyk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVRleHQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRTdW1tYXJ5KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmNhcHR1cmVFbGVtZW50Q29udGV4dChlbGVtZW50KTtcbiAgICByZXR1cm4gYCR7Y3R4LnRhZ30gXHUyMDIyICR7Y3R4LnNlbGVjdG9yfWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRNb2RlbHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubW9kZWxzTG9hZGVkIHx8ICF0aGlzLm1vZGVsRWwpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnY2hhdC5saXN0TW9kZWxzJyB9KTtcbiAgICAgIGlmICghcmVzcG9uc2U/LnN1Y2Nlc3MgfHwgIUFycmF5LmlzQXJyYXkocmVzcG9uc2UubW9kZWxzKSB8fCAhcmVzcG9uc2UubW9kZWxzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5tb2RlbEVsLnZhbHVlO1xuICAgICAgdGhpcy5tb2RlbEVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiByZXNwb25zZS5tb2RlbHMpIHtcbiAgICAgICAgaWYgKCFtb2RlbD8uaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0aW9uLnZhbHVlID0gbW9kZWwuaWQ7XG4gICAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IG1vZGVsLm5hbWUgfHwgbW9kZWwuaWQ7XG4gICAgICAgIHRoaXMubW9kZWxFbC5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZpb3VzICYmIEFycmF5LmZyb20odGhpcy5tb2RlbEVsLm9wdGlvbnMpLnNvbWUoKG9wdCkgPT4gb3B0LnZhbHVlID09PSBwcmV2aW91cykpIHtcbiAgICAgICAgdGhpcy5tb2RlbEVsLnZhbHVlID0gcHJldmlvdXM7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGVsc0xvYWRlZCA9IHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZWVwIGxvY2FsIGRlZmF1bHRzIGlmIG1vZGVsIGZldGNoIGZhaWxzLlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNJbnB1dCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXRFbCkgcmV0dXJuO1xuICAgIHRoaXMuaW5wdXRFbC5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBlbmRNZXNzYWdlKHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnLCBjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZXNFbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSBgaGFuem8tcGFnZS1tc2cgJHtyb2xlfWA7XG4gICAgZGl2LnRleHRDb250ZW50ID0gY29udGVudDtcbiAgICB0aGlzLm1lc3NhZ2VzRWwuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICB0aGlzLm1lc3NhZ2VzRWwuc2Nyb2xsVG9wID0gdGhpcy5tZXNzYWdlc0VsLnNjcm9sbEhlaWdodDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0dXNFbCkgcmV0dXJuO1xuICAgIHRoaXMuc3RhdHVzRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFBhZ2VDb250ZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5ub3JtYWxpemVUZXh0KHdpbmRvdy5nZXRTZWxlY3Rpb24/LigpPy50b1N0cmluZygpIHx8ICcnKTtcbiAgICBjb25zdCBjb250ZXh0TGluZXMgPSBbXG4gICAgICBgVVJMOiAke2xvY2F0aW9uLmhyZWZ9YCxcbiAgICAgIGBUaXRsZTogJHtkb2N1bWVudC50aXRsZSB8fCAnVW50aXRsZWQnfWAsXG4gICAgXTtcblxuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIGNvbnRleHRMaW5lcy5wdXNoKGBUZXh0U2VsZWN0aW9uOiAke3NlbGVjdGlvbi5zbGljZSgwLCA2MDApfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRDb250ZXh0ID0gdGhpcy5zZWxlY3RlZENvbnRleHQgfHwgKHRoaXMuaG92ZXJlZEVsZW1lbnQgPyB0aGlzLmNhcHR1cmVFbGVtZW50Q29udGV4dCh0aGlzLmhvdmVyZWRFbGVtZW50KSA6IG51bGwpO1xuICAgIGlmIChlbGVtZW50Q29udGV4dCkge1xuICAgICAgY29udGV4dExpbmVzLnB1c2goYEVsZW1lbnRTZWxlY3RvcjogJHtlbGVtZW50Q29udGV4dC5zZWxlY3Rvcn1gKTtcbiAgICAgIGlmIChlbGVtZW50Q29udGV4dC50ZXh0KSBjb250ZXh0TGluZXMucHVzaChgRWxlbWVudFRleHQ6ICR7ZWxlbWVudENvbnRleHQudGV4dC5zbGljZSgwLCA2MDApfWApO1xuICAgICAgY29udGV4dExpbmVzLnB1c2goYEVsZW1lbnRIVE1MOiAke2VsZW1lbnRDb250ZXh0Lmh0bWwuc2xpY2UoMCwgODAwKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dExpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhc2tQYWdlUXVlc3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2VuZGluZyB8fCAhdGhpcy5pbnB1dEVsKSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLm5vcm1hbGl6ZVRleHQodGhpcy5pbnB1dEVsLnZhbHVlKTtcbiAgICBpZiAoIXByb21wdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdG9rZW5SZXNwID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmdldFRva2VuJyB9KTtcbiAgICBpZiAoIXRva2VuUmVzcD8uc3VjY2VzcyB8fCAhdG9rZW5SZXNwLnRva2VuKSB7XG4gICAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdQbGVhc2Ugc2lnbiBpbiBmcm9tIHRoZSBIYW56byBzaWRlYmFyL3BvcHVwIGJlZm9yZSB1c2luZyBwYWdlIGNoYXQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZVN0YXR1cygnVGhpbmtpbmcuLi4nKTtcbiAgICB0aGlzLnNlbmRCdG4gJiYgKHRoaXMuc2VuZEJ0bi5kaXNhYmxlZCA9IHRydWUpO1xuXG4gICAgdGhpcy5pbnB1dEVsLnZhbHVlID0gJyc7XG4gICAgdGhpcy5pbnB1dEVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ3VzZXInLCBwcm9tcHQpO1xuXG4gICAgY29uc3Qgc3lzdGVtQ29udGV4dCA9IHRoaXMuYnVpbGRQYWdlQ29udGV4dCgpO1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbEVsPy52YWx1ZSB8fCAnZ3B0LTRvJztcbiAgICBjb25zdCByZXF1ZXN0TWVzc2FnZXM6IE92ZXJsYXlDaGF0TWVzc2FnZVtdID0gW1xuICAgICAge1xuICAgICAgICByb2xlOiAnc3lzdGVtJyxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICdZb3UgYXJlIEhhbnpvIHBhZ2Ugb3ZlcmxheSBhc3Npc3RhbnQuJyxcbiAgICAgICAgICAnVXNlIHByb3ZpZGVkIHBhZ2UgY29udGV4dCBhbmQgc2VsZWN0ZWQgZWxlbWVudCBjb250ZXh0IHdoZW4gcmVsZXZhbnQuJyxcbiAgICAgICAgICAnQmUgY29uY2lzZSBhbmQgcHJvdmlkZSBjb25jcmV0ZSBVSSBvciBET00gZWRpdCBzdWdnZXN0aW9ucyB3aGVuIGFza2VkLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgc3lzdGVtQ29udGV4dCxcbiAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLm1lc3NhZ2VzLnNsaWNlKC04KSxcbiAgICAgIHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiBwcm9tcHQgfSxcbiAgICBdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICBhY3Rpb246ICdjaGF0LmNvbXBsZXRlJyxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIG1lc3NhZ2VzOiByZXF1ZXN0TWVzc2FnZXMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZT8uc3VjY2VzcyB8fCAhcmVzcG9uc2UuY29udGVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2U/LmVycm9yIHx8ICdObyByZXNwb25zZSBmcm9tIGNoYXQgc2VydmljZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhbnN3ZXIgPSBTdHJpbmcocmVzcG9uc2UuY29udGVudCkudHJpbSgpO1xuICAgICAgdGhpcy5hcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBhbnN3ZXIgfHwgJ05vIHJlc3BvbnNlIGNvbnRlbnQuJyk7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHByb21wdCB9LCB7IHJvbGU6ICdhc3Npc3RhbnQnLCBjb250ZW50OiBhbnN3ZXIgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcy5zbGljZSgtMjApO1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ1JlYWR5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5hcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgRXJyb3I6ICR7ZXJyb3I/Lm1lc3NhZ2UgfHwgJ0NoYXQgcmVxdWVzdCBmYWlsZWQnfWApO1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0Vycm9yJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2VuZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zZW5kQnRuICYmICh0aGlzLnNlbmRCdG4uZGlzYWJsZWQgPSBmYWxzZSk7XG4gICAgICB0aGlzLmZvY3VzSW5wdXQoKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcGFnZU92ZXJsYXkgPSBuZXcgSGFuem9QYWdlT3Zlcmxh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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QUFBLElBRVEsZ0JBQXNCO0FBQzVCLFVBQUksS0FBSyxRQUFTO0FBQ2xCLFdBQUssTUFBTTtBQUFBLElBQ2I7QUFBQSxJQUVRLGVBQXFCO0FBQzNCLFVBQUksU0FBUyxlQUFlLDJCQUEyQixFQUFHO0FBRTFELFlBQU0sUUFBUSxTQUFTLGNBQWMsT0FBTztBQUM1QyxZQUFNLEtBQUs7QUFDWCxZQUFNLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
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+IH0sXG4gIHM6IFNob3J0Y3V0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgW1NUT1JBR0VfS0VZX0lOU1BFQ1RdOiBzIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQTtBQUVBLFlBQUksRUFBRUEsV0FBV0MsVUFBVUQsV0FBV0MsT0FBT0MsV0FBV0YsV0FBV0MsT0FBT0MsUUFBUUMsS0FBSztBQUNyRixnQkFBTSxJQUFJQyxNQUFNLDJEQUEyRDtRQUM3RTtBQUVBLFlBQUksRUFBRUosV0FBV0ssV0FBV0wsV0FBV0ssUUFBUUgsV0FBV0YsV0FBV0ssUUFBUUgsUUFBUUMsS0FBSztBQUN4RixnQkFBTUcsbURBQW1EO0FBT3pELGdCQUFNQyxXQUFXQyxtQkFBaUI7QUFJaEMsa0JBQU1DLGNBQWM7Y0FDbEIsVUFBVTtn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RXhDLFlBQU0sUUFBUSxTQUFTLGNBQWMsT0FBTztBQUM1QyxZQUFNLEtBQUs7QUFDWCxZQUFNLGNBQWM7QUFBQTtBQUFBLFNBRWYsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBYVYsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxUnBCLGVBQVMsS0FBSyxZQUFZLEtBQUs7QUFBQSxJQUNqQztBQUFBLElBRVEsUUFBYztBQTV1Q3hCLFVBQUFBLEtBQUFDLEtBQUFFLEtBQUFDLEtBQUFDLEtBQUFDO0FBNnVDSSxVQUFJLEtBQUssUUFBUztBQUVsQixXQUFLLE9B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TUFBTSxNQUFNLFdBQVcsTUFBTSxRQUFRO0FBQUEsRUFDaEQsR0FBRztBQUdILE1BQUksbUJBQW1CO0FBcjVEdkI7QUFtNkRBLE1BQUk7QUFDRixVQUFNLFNBQVEsOENBQWlCLFlBQWpCLG1CQUEwQixZQUExQiw0QkFBb0MsRUFBRSxNQUFNLGdCQUFnQixTQUNwRSw0Q0FBZ0IsWUFBaEIsbUJBQXlCLFlBQXpCLDRCQUFtQyxFQUFFLE1BQU0sZ0JBQWdCO0FBQ2pFLFFBQUksTUFBTTtBQUNSLFlBQU0sT0FBTyxZQUFZLE1BQU07QUFDN0IsWUFBSTtBQUFFLGVBQUssWUFBWSxFQUFFLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFBQSxRQUFHLFFBQ25EO0FBQUUsd0JBQWMsSUFBSTtBQUFBLFFBQUc7QUFBQSxNQUMvQixHQUFHLEdBQU07QUFDVCx1QkFBSyxpQkFBTCxtQkFBbUIsZ0JBQW5CLDRCQUFpQyxNQUFNLGNBQWMsSUFBSTtBQUFBLElBQzNEO0FBQUEsRUFDRixRQUFRO0FBQUEsRUFBbUU7IiwKICAibmFtZXMiOiBbImdsb2JhbFRoaXMiLCAiY2hyb21lIiwgInJ1bnRpbWUiLCAiaWQiLCAiRXJyb3IiLCAiYnJvd3NlciIsICJDSFJPTUVfU0VORF9NRVNTQUdFX0NBTExCQUNLX05PX1JFU1BPTlNFX01FU1NBR0UiLCAid3JhcEFQSXMiLCAiZXh0ZW5zaW9uQVBJcyIsICJhcGlNZXRhZGF0YSIsICJPYmplY3QiLCAia2V5cyIsICJsZW5ndGgiLCAiRGVmYXVsdFdlYWtNYXAiLCAiV2Vha01hcCIsICJjb25zdHJ1Y3RvciIsICJjcmVhdGVJdGVtIiwgIml0ZW1zIiwgInVuZGVmaW5lZCIsICJnZXQiLCAia2V5IiwgImhhcyIsICJzZXQiLCAiaXNUaGVuYWJsZSIsICJ2YWx1ZSIsICJ0aGVuIiwgIm1ha2VDYWxsYmFjayIsICJwcm9taXNlIiwgIm1ldGFkYXRhIiwgImNhbGxiYWNrQXJncyIsICJsYXN0RXJyb3IiLCAicmVqZWN0IiwgIm1lc3NhZ2UiLCAic2luZ2xlQ2FsbGJhY2tBcmciLCAicmVzb2x2ZSIsICJwbHVyYWxpemVBcmd1bWVudHMiLCAibnVtQXJncyIsICJ3cmFwQXN5bmNGdW5jdGlvbiIsICJuYW1lIiwgImFzeW5jRnVuY3Rpb25XcmFwcGVyIiwgInRhcmdldCIsICJhcmdzIiwgIm1pbkFyZ3MiLCAibWF4QXJncyIsICJQcm9taXNlIiwgImZhbGxiYWNrVG9Ob0NhbGxiYWNrIiwgImNiRXJyb3IiLCAiY29uc29sZSIsICJ3YXJuIiwgIm5vQ2FsbGJhY2siLCAid3JhcE1ldGhvZCIsICJtZXRob2QiLCAid3JhcHBlciIsICJQcm94eSIsICJhcHBseSIsICJ0YXJnZXRNZXRob2QiLCAidGhpc09iaiIsICJjYWxsIiwgImhhc093blByb3BlcnR5IiwgIkZ1bmN0aW9uIiwgImJpbmQiLCAicHJvdG90eXBlIiwgIndyYXBPYmplY3QiLCAid3JhcHBlcnMiLCAiY2FjaGUiLCAiY3JlYXRlIiwgImhhbmRsZXJzIiwgInByb3h5VGFyZ2V0IiwgInByb3AiLCAicmVjZWl2ZXIiLCAiZGVmaW5lUHJvcGVydHkiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiZGVzYyIsICJSZWZsZWN0IiwgImRlbGV0ZVByb3BlcnR5IiwgIndyYXBFdmVudCIsICJ3cmFwcGVyTWFwIiwgImFkZExpc3RlbmVyIiwgImxpc3RlbmVyIiwgImhhc0xpc3RlbmVyIiwgInJlbW92ZUxpc3RlbmVyIiwgIm9uUmVxdWVzdEZpbmlzaGVkV3JhcHBlcnMiLCAib25SZXF1ZXN0RmluaXNoZWQiLCAicmVxIiwgIndyYXBwZWRSZXEiLCAiZ2V0Q29udGVudCIsICJvbk1lc3NhZ2VXcmFwcGVycyIsICJvbk1lc3NhZ2UiLCAic2VuZGVyIiwgInNlbmRSZXNwb25zZSIsICJkaWRDYWxsU2VuZFJlc3BvbnNlIiwgIndyYXBwZWRTZW5kUmVzcG9uc2UiLCAic2VuZFJlc3BvbnNlUHJvbWlzZSIsICJyZXNwb25zZSIsICJyZXN1bHQiLCAiZXJyIiwgImlzUmVzdWx0VGhlbmFibGUiLCAic2VuZFByb21pc2VkUmVzdWx0IiwgIm1zZyIsICJlcnJvciIsICJfX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X18iLCAiY2F0Y2giLCAid3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2siLCAicmVwbHkiLCAid3JhcHBlZFNlbmRNZXNzYWdlIiwgImFwaU5hbWVzcGFjZU9iaiIsICJ3cmFwcGVkQ2IiLCAicHVzaCIsICJzZW5kTWVzc2FnZSIsICJzdGF0aWNXcmFwcGVycyIsICJkZXZ0b29scyIsICJuZXR3b3JrIiwgIm9uTWVzc2FnZUV4dGVybmFsIiwgInRhYnMiLCAic2V0dGluZ01ldGFkYXRhIiwgImNsZWFyIiwgInByaXZhY3kiLCAic2VydmljZXMiLCAid2Vic2l0ZXMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiX2EiLCAiX2IiLCAibG9jYXRpb24iLCAiX2MiLCAiX2QiLCAiX2UiLCAiX2YiXQp9Cg==