@zintrust/workers 0.1.28 → 0.1.30

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 (111) hide show
  1. package/README.md +16 -1
  2. package/dist/AnomalyDetection.d.ts +4 -0
  3. package/dist/AnomalyDetection.js +8 -0
  4. package/dist/BroadcastWorker.d.ts +2 -0
  5. package/dist/CanaryController.js +49 -5
  6. package/dist/ChaosEngineering.js +13 -0
  7. package/dist/ClusterLock.js +21 -10
  8. package/dist/DeadLetterQueue.js +12 -8
  9. package/dist/MultiQueueWorker.d.ts +1 -1
  10. package/dist/MultiQueueWorker.js +12 -7
  11. package/dist/NotificationWorker.d.ts +2 -0
  12. package/dist/PriorityQueue.d.ts +2 -2
  13. package/dist/PriorityQueue.js +20 -21
  14. package/dist/ResourceMonitor.js +65 -38
  15. package/dist/WorkerFactory.d.ts +23 -3
  16. package/dist/WorkerFactory.js +420 -40
  17. package/dist/WorkerInit.js +8 -3
  18. package/dist/WorkerMetrics.d.ts +2 -1
  19. package/dist/WorkerMetrics.js +152 -93
  20. package/dist/WorkerRegistry.d.ts +6 -0
  21. package/dist/WorkerRegistry.js +70 -1
  22. package/dist/WorkerShutdown.d.ts +21 -0
  23. package/dist/WorkerShutdown.js +82 -9
  24. package/dist/WorkerShutdownDurableObject.d.ts +12 -0
  25. package/dist/WorkerShutdownDurableObject.js +41 -0
  26. package/dist/build-manifest.json +171 -99
  27. package/dist/createQueueWorker.d.ts +2 -0
  28. package/dist/createQueueWorker.js +42 -27
  29. package/dist/dashboard/types.d.ts +5 -0
  30. package/dist/dashboard/workers-api.js +136 -43
  31. package/dist/http/WorkerApiController.js +1 -0
  32. package/dist/http/WorkerController.js +133 -85
  33. package/dist/http/WorkerMonitoringService.d.ts +11 -0
  34. package/dist/http/WorkerMonitoringService.js +62 -0
  35. package/dist/http/middleware/CustomValidation.js +1 -1
  36. package/dist/http/middleware/EditWorkerValidation.d.ts +1 -1
  37. package/dist/http/middleware/EditWorkerValidation.js +7 -6
  38. package/dist/http/middleware/ProcessorPathSanitizer.js +101 -35
  39. package/dist/http/middleware/WorkerValidationChain.js +1 -0
  40. package/dist/index.d.ts +2 -1
  41. package/dist/index.js +1 -0
  42. package/dist/routes/workers.js +48 -6
  43. package/dist/storage/WorkerStore.d.ts +4 -1
  44. package/dist/storage/WorkerStore.js +55 -7
  45. package/dist/telemetry/api/TelemetryAPI.d.ts +46 -0
  46. package/dist/telemetry/api/TelemetryAPI.js +219 -0
  47. package/dist/telemetry/api/TelemetryMonitoringService.d.ts +17 -0
  48. package/dist/telemetry/api/TelemetryMonitoringService.js +113 -0
  49. package/dist/telemetry/components/AlertPanel.d.ts +1 -0
  50. package/dist/telemetry/components/AlertPanel.js +13 -0
  51. package/dist/telemetry/components/CostTracking.d.ts +1 -0
  52. package/dist/telemetry/components/CostTracking.js +14 -0
  53. package/dist/telemetry/components/ResourceUsageChart.d.ts +1 -0
  54. package/dist/telemetry/components/ResourceUsageChart.js +11 -0
  55. package/dist/telemetry/components/WorkerHealthChart.d.ts +1 -0
  56. package/dist/telemetry/components/WorkerHealthChart.js +11 -0
  57. package/dist/telemetry/index.d.ts +15 -0
  58. package/dist/telemetry/index.js +60 -0
  59. package/dist/telemetry/routes/dashboard.d.ts +6 -0
  60. package/dist/telemetry/routes/dashboard.js +608 -0
  61. package/dist/ui/router/EmbeddedAssets.d.ts +4 -0
  62. package/dist/ui/router/EmbeddedAssets.js +13 -0
  63. package/dist/ui/router/ui.js +100 -4
  64. package/package.json +9 -5
  65. package/src/AnomalyDetection.ts +9 -0
  66. package/src/CanaryController.ts +41 -5
  67. package/src/ChaosEngineering.ts +14 -0
  68. package/src/ClusterLock.ts +22 -9
  69. package/src/DeadLetterQueue.ts +13 -8
  70. package/src/MultiQueueWorker.ts +15 -8
  71. package/src/PriorityQueue.ts +21 -22
  72. package/src/ResourceMonitor.ts +72 -40
  73. package/src/WorkerFactory.ts +545 -49
  74. package/src/WorkerInit.ts +8 -3
  75. package/src/WorkerMetrics.ts +183 -105
  76. package/src/WorkerRegistry.ts +80 -1
  77. package/src/WorkerShutdown.ts +115 -9
  78. package/src/WorkerShutdownDurableObject.ts +64 -0
  79. package/src/createQueueWorker.ts +73 -30
  80. package/src/dashboard/types.ts +5 -0
  81. package/src/dashboard/workers-api.ts +165 -52
  82. package/src/http/WorkerApiController.ts +1 -0
  83. package/src/http/WorkerController.ts +167 -90
  84. package/src/http/WorkerMonitoringService.ts +77 -0
  85. package/src/http/middleware/CustomValidation.ts +1 -1
  86. package/src/http/middleware/EditWorkerValidation.ts +7 -6
  87. package/src/http/middleware/ProcessorPathSanitizer.ts +123 -36
  88. package/src/http/middleware/WorkerValidationChain.ts +1 -0
  89. package/src/index.ts +6 -1
  90. package/src/routes/workers.ts +66 -9
  91. package/src/storage/WorkerStore.ts +59 -9
  92. package/src/telemetry/api/TelemetryAPI.ts +292 -0
  93. package/src/telemetry/api/TelemetryMonitoringService.ts +149 -0
  94. package/src/telemetry/components/AlertPanel.ts +13 -0
  95. package/src/telemetry/components/CostTracking.ts +14 -0
  96. package/src/telemetry/components/ResourceUsageChart.ts +11 -0
  97. package/src/telemetry/components/WorkerHealthChart.ts +11 -0
  98. package/src/telemetry/index.ts +121 -0
  99. package/src/telemetry/public/assets/zintrust-logo.svg +15 -0
  100. package/src/telemetry/routes/dashboard.ts +638 -0
  101. package/src/telemetry/styles/tailwind.css +1 -0
  102. package/src/telemetry/styles/zintrust-theme.css +8 -0
  103. package/src/ui/router/EmbeddedAssets.ts +13 -0
  104. package/src/ui/router/ui.ts +112 -5
  105. package/src/ui/workers/index.html +2 -2
  106. package/src/ui/workers/main.js +232 -61
  107. package/src/ui/workers/zintrust.svg +30 -0
  108. package/dist/dashboard/workers-dashboard-ui.d.ts +0 -3
  109. package/dist/dashboard/workers-dashboard-ui.js +0 -1026
  110. package/dist/dashboard/workers-dashboard.d.ts +0 -4
  111. package/dist/dashboard/workers-dashboard.js +0 -904
@@ -0,0 +1,4 @@
1
+ export declare const INDEX_HTML = "\nPCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+WmluVHJ1c3QgV29ya2VycyBEYXNoYm9hcmQ8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ3b3JrZXJzL3N0eWxlcy5jc3MiIC8+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItdG9wIj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTZweCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvZ28tZnJhbWUiPgogICAgICAgICAgICAgIDxpbWcgc3JjPSJ3b3JrZXJzL3ppbnRydXN0LnN2ZyIgYWx0PSJaaW5UcnVzdCIgY2xhc3M9ImxvZ28taW1nIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGgxPlppblRydXN0IFdvcmtlcnM8L2gxPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYWN0aW9ucyI+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InRoZW1lLXRvZ2dsZSIgY2xhc3M9InRoZW1lLXRvZ2dsZSI+CiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICBkPSJNMTIgMXYyTTEyIDIxdjJNNC4yMiA0LjIybDEuNDIgMS40Mk0xOC4zNiAxOC4zNmwxLjQyIDEuNDJNMSAxMmgyTTIxIDEyaDJNNC4yMiAxOS43OGwxLjQyLTEuNDJNMTguMzYgNS42NGwxLjQyLTEuNDIiCiAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIFRoZW1lCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJhdXRvLXJlZnJlc2gtdG9nZ2xlIiBjbGFzcz0iYnRuIiBvbmNsaWNrPSJ0b2dnbGVBdXRvUmVmcmVzaCgpIj4KICAgICAgICAgICAgICA8c3ZnIGlkPSJhdXRvLXJlZnJlc2gtaWNvbiIgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9IjUgMyAxOSAxMiA1IDIxIDUgMyIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8c3BhbiBpZD0iYXV0by1yZWZyZXNoLWxhYmVsIj5BdXRvIFJlZnJlc2g8L3NwYW4+CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIG9uY2xpY2s9ImZldGNoRGF0YSgpIj4KICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzIDR2NmgtNiIgLz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xIDIwdi02aDYiIC8+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMy41MSA5YTkgOSAwIDAgMSAxNC44NS0zLjM2TDIzIDEwTTEgMTRsNC42NCA0LjM2QTkgOSAwIDAgMCAyMC40OSAxNSIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICBSZWZyZXNoCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9InNob3dBZGRXb3JrZXJNb2RhbCgpIj4KICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICAgICAgPGxpbmUgeDE9IjEyIiB5MT0iNSIgeDI9IjEyIiB5Mj0iMTkiIC8+CiAgICAgICAgICAgICAgICA8bGluZSB4MT0iNSIgeTE9IjEyIiB4Mj0iMTkiIHkyPSIxMiIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICBBZGQgV29ya2VyCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9Im5hdi1iYXIiPgogICAgICAgICAgPG5hdiBjbGFzcz0ibmF2LWxpbmtzIj4KICAgICAgICAgICAgPGEgaHJlZj0iL3F1ZXVlLW1vbml0b3IiIGNsYXNzPSJuYXYtbGluayI+UXVldWUgTW9uaXRvcjwvYT4KICAgICAgICAgICAgPGEgaHJlZj0iL3RlbGVtZXRyeSIgY2xhc3M9Im5hdi1saW5rIj5UZWxlbWV0cnk8L2E+CiAgICAgICAgICAgIDxhIGhyZWY9Ii9tZXRyaWNzIiBjbGFzcz0ibmF2LWxpbmsiPk1ldHJpY3M8L2E+CiAgICAgICAgICA8L25hdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVycy1iYXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVyLWdyb3VwIj4KICAgICAgICAgICAgPHNwYW4+U3RhdHVzOjwvc3Bhbj4KICAgICAgICAgICAgPHNlbGVjdCBpZD0ic3RhdHVzLWZpbHRlciI+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5BbGwgU3RhdHVzPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0icnVubmluZyI+UnVubmluZzwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InN0b3BwZWQiPlN0b3BwZWQ8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJlcnJvciI+RXJyb3I8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJwYXVzZWQiPlBhdXNlZDwvb3B0aW9uPgogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVyLWdyb3VwIj4KICAgICAgICAgICAgPHNwYW4+RHJpdmVyOjwvc3Bhbj4KICAgICAgICAgICAgPHNlbGVjdCBpZD0iZHJpdmVyLWZpbHRlciI+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5BbGwgRHJpdmVyczwvb3B0aW9uPgogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVyLWdyb3VwIj4KICAgICAgICAgICAgPHNwYW4+U29ydDo8L3NwYW4+CiAgICAgICAgICAgIDxzZWxlY3QgaWQ9InNvcnQtc2VsZWN0Ij4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJuYW1lIj5Tb3J0IGJ5IE5hbWU8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJzdGF0dXMiIHNlbGVjdGVkPlNvcnQgYnkgU3RhdHVzPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZHJpdmVyIj5Tb3J0IGJ5IERyaXZlcjwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImhlYWx0aCI+U29ydCBieSBIZWFsdGg8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2ZXJzaW9uIj5Tb3J0IGJ5IFZlcnNpb248L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJwcm9jZXNzZWQiPlNvcnQgYnkgUGVyZm9ybWFuY2U8L29wdGlvbj4KICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWFyY2gtYm94Ij4KICAgICAgICAgICAgPHN2ZyBjbGFzcz0ic2VhcmNoLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iOCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgPGxpbmUgeDE9IjIxIiB5MT0iMjEiIHgyPSIxNi42NSIgeTI9IjE2LjY1Ij48L2xpbmU+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InNlYXJjaC1pbnB1dCIgcGxhY2Vob2xkZXI9IlNlYXJjaCB3b3JrZXJzLi4uIiAvPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBpZD0ibG9hZGluZyIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKSI+CiAgICAgICAgPGRpdj5Mb2FkaW5nIHdvcmtlcnMuLi48L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2CiAgICAgICAgaWQ9ImVycm9yIgogICAgICAgIHN0eWxlPSJkaXNwbGF5OiBub25lOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7IGNvbG9yOiB2YXIoLS1kYW5nZXIpIgogICAgICA+CiAgICAgICAgPGRpdj5GYWlsZWQgdG8gbG9hZCB3b3JrZXJzIGRhdGE8L2Rpdj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIG9uY2xpY2s9ImZldGNoRGF0YSgpIiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweCI+UmV0cnk8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJ3b3JrZXJzLWNvbnRlbnQiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdW1tYXJ5LWJhciIgaWQ9InF1ZXVlLXN1bW1hcnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3VtbWFyeS1pdGVtIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN1bW1hcnktbGFiZWwiPlF1ZXVlIERyaXZlcjwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN1bW1hcnktdmFsdWUiIGlkPSJxdWV1ZS1kcml2ZXIiPi08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LWxhYmVsIj5RdWV1ZXM8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LXZhbHVlIiBpZD0icXVldWUtdG90YWwiPjA8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LWxhYmVsIj5Kb2JzPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS12YWx1ZSIgaWQ9InF1ZXVlLWpvYnMiPjA8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LWxhYmVsIj5Qcm9jZXNzaW5nPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS12YWx1ZSIgaWQ9InF1ZXVlLXByb2Nlc3NpbmciPjA8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LWxhYmVsIj5GYWlsZWQ8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LXZhbHVlIiBpZD0icXVldWUtZmFpbGVkIj4wPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdW1tYXJ5LWl0ZW0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS1sYWJlbCI+RHJpdmVyczwvc3Bhbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJpdmVycy1saXN0IiBpZD0iZHJpdmVycy1saXN0Ij48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS13cmFwcGVyIj4KICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMjUwcHgiPldvcmtlcjwvdGg+CiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDEyMHB4Ij5TdGF0dXM8L3RoPgogICAgICAgICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOiAxMjBweCI+SGVhbHRoPC90aD4KICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTAwcHgiPkRyaXZlcjwvdGg+CiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDEwMHB4Ij5WZXJzaW9uPC90aD4KICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMzIwcHgiPlBlcmZvcm1hbmNlPC90aD4KICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTgwcHgiPkFjdGlvbnM8L3RoPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgIDx0Ym9keSBpZD0id29ya2Vycy10Ym9keSI+CiAgICAgICAgICAgICAgICA8IS0tIFdvcmtlcnMgd2lsbCBiZSBwb3B1bGF0ZWQgaGVyZSAtLT4KICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5hdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luYXRpb24taW5mbyIgaWQ9InBhZ2luYXRpb24taW5mbyI+U2hvd2luZyAwLTAgb2YgMCB3b3JrZXJzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luYXRpb24tY29udHJvbHMiPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InBhZ2UtYnRuIiBpZD0icHJldi1idG4iIG9uY2xpY2s9ImxvYWRQYWdlKCdwcmV2JykiIGRpc2FibGVkPgogICAgICAgICAgICAgICAgPHN2ZwogICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiCiAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiCiAgICAgICAgICAgICAgICAgIHN0cm9rZT0iY3VycmVudENvbG9yIgogICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjE1IDE4IDkgMTIgMTUgNiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxkaXYgaWQ9InBhZ2UtbnVtYmVycyIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4Ij48L2Rpdj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwYWdlLWJ0biIgaWQ9Im5leHQtYnRuIiBvbmNsaWNrPSJsb2FkUGFnZSgnbmV4dCcpIiBkaXNhYmxlZD4KICAgICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDI0IDI0IgogICAgICAgICAgICAgICAgICBmaWxsPSJub25lIgogICAgICAgICAgICAgICAgICBzdHJva2U9ImN1cnJlbnRDb2xvciIKICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49InJvdW5kIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPSI5IDE4IDE1IDEyIDkgNiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvYnV0dG9uPgoKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXNpemUtc2VsZWN0b3IiPgogICAgICAgICAgICAgICAgPHNwYW4+U2hvdzo8L3NwYW4+CiAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJsaW1pdC1zZWxlY3QiIG9uY2hhbmdlPSJjaGFuZ2VMaW1pdCh0aGlzLnZhbHVlKSI+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwIj4xMDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNSI+MjU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTAiPjUwPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwMCI+MTAwPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJ3b3JrZXJzL21haW4uanMiPjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=\n";
2
+ export declare const STYLES_CSS = "\nOnJvb3QgewogIC0tYmc6ICMwYjEyMjA7CiAgLS1jYXJkOiAjMGYxNzJhOwogIC0tYm9yZGVyOiAjMWUyOTNiOwogIC0tdGV4dDogI2UyZThmMDsKICAtLW11dGVkOiAjOTRhM2I4OwogIC0tYWNjZW50OiAjMzhiZGY4OwogIC0tYWNjZW50LWhvdmVyOiAjMGVhNWU5OwoKICAvKiBNb2Rlcm4gVXRpbGl0aWVzICovCiAgLS1zdXJmYWNlLWhvdmVyOiAjMWUyOTNiOwogIC0tc3VyZmFjZS1hY3RpdmU6ICMzMzQxNTU7CiAgLS1pbnB1dC1iZzogIzBmMTcyYTsKCiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpOwogIC0tc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpOwogIC0tc2hhZG93LWxnOiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIDAuMSk7CgogIC8qIEJyYW5kIENvbG9ycyAqLwogIC0tcHJpbWFyeTogIzBlYTVlOTsKICAtLXN1Y2Nlc3M6ICMyMmM1NWU7CiAgLS13YXJuaW5nOiAjZjU5ZTBiOwogIC0tZGFuZ2VyOiAjZWY0NDQ0OwogIC0taW5mbzogIzNiODJmNjsKfQoKaHRtbFtkYXRhLXRoZW1lPSdsaWdodCddIHsKICAtLWJnOiAjZjFmNWY5OwogIC0tY2FyZDogI2ZmZmZmZjsKICAtLWJvcmRlcjogI2UyZThmMDsKICAtLXRleHQ6ICMzMzQxNTU7CiAgLS1tdXRlZDogIzY0NzQ4YjsKCiAgLS1zdXJmYWNlLWhvdmVyOiAjZjhmYWZjOwogIC0tc3VyZmFjZS1hY3RpdmU6ICNlMmU4ZjA7CiAgLS1pbnB1dC1iZzogI2ZmZmZmZjsKCiAgLS1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpOwogIC0tc2hhZG93LWxnOiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMDUpLCAwIDRweCA2cHggLTRweCByZ2IoMCAwIDAgLyAwLjAyKTsKfQoKKiB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDA7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKYm9keSB7CiAgZm9udC1mYW1pbHk6CiAgICAnSW50ZXInLAogICAgc3lzdGVtLXVpLAogICAgLWFwcGxlLXN5c3RlbSwKICAgIHNhbnMtc2VyaWY7CiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKICBsaW5lLWhlaWdodDogMS41OwogIHRyYW5zaXRpb246CiAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwKICAgIGNvbG9yIDAuM3MgZWFzZTsKICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKfQoKLmNvbnRhaW5lciB7CiAgbWF4LXdpZHRoOiAxNDAwcHg7CiAgbWFyZ2luOiAwIGF1dG87CiAgcGFkZGluZzogNDBweCAyNHB4Owp9CgovKiBUcmFuc2l0aW9ucyAqLwouY2FyZCwKLmhlYWRlciwKLnRhYmxlLWNvbnRhaW5lciwKLmJ0biwKLmFjdGlvbi1idG4sCmlucHV0LApzZWxlY3QgewogIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0Owp9CgovKiBIZWFkZXIgU3R5bGVzICovCi5oZWFkZXIgewogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogIHBhZGRpbmc6IDI0cHggMzJweDsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgbWFyZ2luLWJvdHRvbTogMzJweDsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cpOwp9CgouaGVhZGVyLXRvcCB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBtYXJnaW4tYm90dG9tOiAyNHB4Owp9CgouaGVhZGVyIGgxIHsKICBmb250LXNpemU6IDI0cHg7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgY29sb3I6IHZhcigtLXRleHQpOwp9CgouaGVhZGVyLWFjdGlvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiAxMnB4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi8qIE5hdmlnYXRpb24gQmFyICovCi5uYXYtYmFyIHsKICBwYWRkaW5nLWJvdHRvbTogMjRweDsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBtYXJnaW4tYm90dG9tOiAyNHB4Owp9CgoubmF2LWxpbmtzIHsKICBkaXNwbGF5OiBmbGV4OwogIGdhcDogMzJweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubmF2LWxpbmsgewogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGZvbnQtc2l6ZTogMTRweDsKICBmb250LXdlaWdodDogNTAwOwogIHBhZGRpbmc6IDhweCAxMnB4OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm5hdi1saW5rOmhvdmVyIHsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7Cn0KCi5uYXYtbGluay5hY3RpdmUgewogIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICBiYWNrZ3JvdW5kOiByZ2JhKDE0LCAxNjUsIDIzMywgMC4xKTsKfQoKLm5hdi1saW5rLmFjdGl2ZTo6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IC0yNXB4OwogIGxlZnQ6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgd2lkdGg6IDQwcHg7CiAgaGVpZ2h0OiAzcHg7CiAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeSk7CiAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgovKiBCdXR0b25zICYgSW5wdXRzICovCi5idG4gewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA4cHg7CiAgcGFkZGluZzogMTBweCAxNnB4OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXNtKTsKICBoZWlnaHQ6IDQwcHg7Cn0KCi5idG46aG92ZXIgewogIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICBib3JkZXItY29sb3I6IHZhcigtLW11dGVkKTsKfQoKLmJ0bi1wcmltYXJ5IHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5KTsKICBjb2xvcjogd2hpdGU7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcHJpbWFyeSk7Cn0KCi5idG4tcHJpbWFyeTpob3ZlciB7CiAgYmFja2dyb3VuZDogIzAyODRjNzsgLyogRGFya2VyIGJsdWUgKi8KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDE0LCAxNjUsIDIzMywgMC4yNSk7CiAgY29sb3I6IHdoaXRlOwp9CgoudGhlbWUtdG9nZ2xlIHsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBwYWRkaW5nOiA4cHggMTJweDsKICBib3JkZXItcmFkaXVzOiA4cHg7CiAgZm9udC1zaXplOiAxM3B4OwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBnYXA6IDhweDsKICBoZWlnaHQ6IDQwcHg7Cn0KCi50aGVtZS10b2dnbGU6aG92ZXIgewogIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwp9CgovKiBGaWx0ZXJzICovCi5maWx0ZXJzLWJhciB7CiAgZGlzcGxheTogZmxleDsKICBnYXA6IDE2cHg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBmbGV4LXdyYXA6IHdyYXA7CiAgcGFkZGluZy10b3A6IDI0cHg7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5maWx0ZXItZ3JvdXAgewogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBnYXA6IDEwcHg7Cn0KCi5maWx0ZXItZ3JvdXAgbGFiZWwgewogIGZvbnQtc2l6ZTogMTNweDsKICBmb250LXdlaWdodDogNjAwOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgouZmlsdGVyLWdyb3VwIHNlbGVjdCwKLmZpbHRlci1ncm91cCBpbnB1dCB7CiAgcGFkZGluZzogOHB4IDEycHg7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBib3JkZXItcmFkaXVzOiA4cHg7CiAgZm9udC1zaXplOiAxNHB4OwogIGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgbWluLXdpZHRoOiAxNDBweDsKICBoZWlnaHQ6IDM4cHg7Cn0KCi5maWx0ZXItZ3JvdXAgc2VsZWN0OmZvY3VzLAouZmlsdGVyLWdyb3VwIGlucHV0OmZvY3VzIHsKICBvdXRsaW5lOiBub25lOwogIGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeSk7CiAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMTQsIDE2NSwgMjMzLCAwLjEpOwp9Cgouc2VhcmNoLWJveCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICB3aWR0aDogMjgwcHg7Cn0KCi5zZWFyY2gtYm94IC5zZWFyY2gtaWNvbiB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDEycHg7CiAgd2lkdGg6IDE2cHg7CiAgaGVpZ2h0OiAxNnB4OwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIGZpbGw6IG5vbmU7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5zZWFyY2gtYm94IGlucHV0IHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDQwcHg7CiAgcGFkZGluZzogOHB4IDEycHggOHB4IDM2cHg7CiAgYmFja2dyb3VuZDogdmFyKC0taW5wdXQtYmcpOwogIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKICBmb250LXNpemU6IDE0cHg7CiAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLnNlYXJjaC1ib3ggaW5wdXQ6Zm9jdXMgewogIG91dGxpbmU6IG5vbmU7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgxNCwgMTY1LCAyMzMsIDAuMSk7Cn0KCi8qIFN1bW1hcnkgQmFyICovCi5zdW1tYXJ5LWJhciB7CiAgbWFyZ2luOiAxNnB4IDAgMDsKICBwYWRkaW5nOiAxNnB4IDIwcHg7CiAgYmFja2dyb3VuZDogdmFyKC0tY2FyZCk7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBib3JkZXItcmFkaXVzOiAxMnB4OwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC13cmFwOiB3cmFwOwogIGdhcDogMTZweCAyNHB4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXNtKTsKfQoKLnN1bW1hcnktaXRlbSB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGdhcDogNHB4OwogIG1pbi13aWR0aDogMTIwcHg7Cn0KCi5zdW1tYXJ5LWxhYmVsIHsKICBmb250LXNpemU6IDEycHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLnN1bW1hcnktdmFsdWUgewogIGZvbnQtc2l6ZTogMTZweDsKICBmb250LXdlaWdodDogNzAwOwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmRyaXZlcnMtbGlzdCB7CiAgZGlzcGxheTogZmxleDsKICBnYXA6IDhweDsKICBmbGV4LXdyYXA6IHdyYXA7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLmRyaXZlci1jaGlwIHsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBwYWRkaW5nOiA0cHggMTBweDsKICBib3JkZXItcmFkaXVzOiA5OTk5cHg7Cn0KCi8qIFRhYmxlIENvbnRhaW5lciAqLwoudGFibGUtY29udGFpbmVyIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbGcpOwp9Cgp0YWJsZSB7CiAgd2lkdGg6IDEwMCU7CiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKICBib3JkZXItc3BhY2luZzogMDsKfQoKdGggewogIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwogIHBhZGRpbmc6IDE2cHggMjRweDsKICB0ZXh0LWFsaWduOiBsZWZ0OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgZm9udC1zaXplOiAxMnB4OwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCnRkIHsKICBwYWRkaW5nOiAyMHB4IDI0cHg7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgZm9udC1zaXplOiAxNHB4OwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCnRib2R5IHRyIHsKICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2U7Cn0KCnRib2R5IHRyOmhvdmVyIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLWhvdmVyKTsKfQoKdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZCB7CiAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLyogV29ya2VyIElkZW50aXR5ICovCi53b3JrZXItbmFtZSB7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgZm9udC1zaXplOiAxNXB4OwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLndvcmtlci1xdWV1ZSB7CiAgZm9udC1zaXplOiAxMnB4OwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLWFjdGl2ZSk7CiAgcGFkZGluZzogMnB4IDZweDsKICBib3JkZXItcmFkaXVzOiA0cHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgovKiBUeXBvZ3JhcGh5ICYgQmFkZ2VzICovCi5zdGF0dXMtYmFkZ2UgewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA4cHg7CiAgcGFkZGluZzogNnB4IDEwcHg7CiAgYm9yZGVyLXJhZGl1czogOTk5OXB4OyAvKiBQaWxsIHNoYXBlICovCiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgd2lkdGg6IGZpdC1jb250ZW50Owp9Cgouc3RhdHVzLXJ1bm5pbmcgewogIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMSk7CiAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzQsIDE5NywgOTQsIDAuMik7Cn0KCi5zdGF0dXMtc3RvcHBlZCB7CiAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4xKTsKICBjb2xvcjogdmFyKC0tZGFuZ2VyKTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIzOSwgNjgsIDY4LCAwLjIpOwp9Cgouc3RhdHVzLWVycm9yIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4xKTsKICBjb2xvcjogdmFyKC0td2FybmluZyk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNDUsIDE1OCwgMTEsIDAuMik7Cn0KCi5zdGF0dXMtZG90IHsKICB3aWR0aDogOHB4OwogIGhlaWdodDogOHB4OwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9Cgouc3RhdHVzLXJ1bm5pbmcgLnN0YXR1cy1kb3QgewogIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwp9Ci5zdGF0dXMtc3RvcHBlZCAuc3RhdHVzLWRvdCB7CiAgYmFja2dyb3VuZDogdmFyKC0tZGFuZ2VyKTsKfQouc3RhdHVzLWVycm9yIC5zdGF0dXMtZG90IHsKICBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuaW5nKTsKfQoKLmhlYWx0aC1pbmRpY2F0b3IgewogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLmhlYWx0aC1kb3QgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICB3aWR0aDogOHB4OwogIGhlaWdodDogOHB4OwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBtYXJnaW4tcmlnaHQ6IDZweDsKfQouaGVhbHRoLWhlYWx0aHkgewogIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwp9Ci5oZWFsdGgtdW5oZWFsdGh5IHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1kYW5nZXIpOwp9Ci5oZWFsdGgtZGVncmFkZWQgewogIGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmcpOwp9Ci5oZWFsdGgtd2FybmluZyB7CiAgYmFja2dyb3VuZDogdmFyKC0td2FybmluZyk7Cn0KLmhlYWx0aC11bmtub3duIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1tdXRlZCk7Cn0KCi8qIERyaXZlciAmIFZlcnNpb24gKi8KLmRyaXZlci1iYWRnZSB7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIHBhZGRpbmc6IDRweCA4cHg7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogNjAwOwogIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi52ZXJzaW9uLWJhZGdlIHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC1zaXplOiAxMnB4Owp9CgovKiBQZXJmb3JtYW5jZSBJY29ucyAqLwoucGVyZm9ybWFuY2UtaWNvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiAxNnB4Owp9CgoucGVyZi1pY29uIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA2cHg7CiAgZm9udC1zaXplOiAxM3B4OwogIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5wZXJmLWljb24gc3ZnIHsKICB3aWR0aDogMTZweDsKICBoZWlnaHQ6IDE2cHg7CiAgc3Ryb2tlLXdpZHRoOiAyLjU7Cn0KCi5wZXJmLWljb24ucHJvY2Vzc2VkIHsKICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7Cn0KLnBlcmYtaWNvbi50aW1lIHsKICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7Cn0KLnBlcmYtaWNvbi5tZW1vcnkgewogIGNvbG9yOiAjOGI1Y2Y2Owp9CgovKiBBY3Rpb24gQnV0dG9ucyB3aXRoIFNWR3MgKi8KLmFjdGlvbnMtY2VsbCB7CiAgZGlzcGxheTogZmxleDsKICBnYXA6IDhweDsKfQoKLmFjdGlvbi1idG4gewogIHdpZHRoOiAzNHB4OwogIGhlaWdodDogMzRweDsKICBwYWRkaW5nOiAwOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIHRyYW5zaXRpb246IGFsbCAwLjJzOwp9CgouYWN0aW9uLWJ0bjpob3ZlciB7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIGJvcmRlci1jb2xvcjogdmFyKC0tbXV0ZWQpOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctc20pOwp9CgouYWN0aW9uLWJ0biBzdmcgewogIHdpZHRoOiAxNnB4OwogIGhlaWdodDogMTZweDsKICBzdHJva2U6IGN1cnJlbnRDb2xvcjsKICBzdHJva2Utd2lkdGg6IDI7CiAgZmlsbDogbm9uZTsKICBzdHJva2UtbGluZWNhcDogcm91bmQ7CiAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsKfQoKLyogU3BlY2lmaWMgQWN0aW9uIENvbG9ycyBPbiBIb3ZlciAqLwouYWN0aW9uLWJ0bi5zdGFydDpob3ZlciB7CiAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogIGJvcmRlci1jb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgYmFja2dyb3VuZDogcmdiYSgzNCwgMTk3LCA5NCwgMC4xKTsKfQouYWN0aW9uLWJ0bi5zdG9wOmhvdmVyIHsKICBjb2xvcjogdmFyKC0tZGFuZ2VyKTsKICBib3JkZXItY29sb3I6IHZhcigtLWRhbmdlcik7CiAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4xKTsKfQouYWN0aW9uLWJ0bi5yZXN0YXJ0OmhvdmVyIHsKICBjb2xvcjogdmFyKC0td2FybmluZyk7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS13YXJuaW5nKTsKICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4xKTsKfQouYWN0aW9uLWJ0bi5kZWJ1Zzpob3ZlciB7CiAgY29sb3I6IHZhcigtLWluZm8pOwogIGJvcmRlci1jb2xvcjogdmFyKC0taW5mbyk7CiAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMSk7Cn0KLmFjdGlvbi1idG4uZGVsZXRlOmhvdmVyIHsKICBjb2xvcjogdmFyKC0tZGFuZ2VyKTsKICBib3JkZXItY29sb3I6IHZhcigtLWRhbmdlcik7CiAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4xKTsKfQoKLyogRXhwYW5kYWJsZSBSb3dzICovCi5leHBhbmRhYmxlLXJvdyB7CiAgZGlzcGxheTogbm9uZTsKfQoKLmV4cGFuZGFibGUtcm93Lm9wZW4gewogIGRpc3BsYXk6IHRhYmxlLXJvdzsKfQoKLmV4cGFuZGVyIHsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5kZXRhaWxzLWNvbnRlbnQgewogIHBhZGRpbmc6IDMycHg7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgYm94LXNoYWRvdzogaW5zZXQgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wMik7Cn0KCi5kZXRhaWxzLWdyaWQgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyODBweCwgMWZyKSk7CiAgZ2FwOiAyNHB4Owp9CgouZGV0YWlsLXNlY3Rpb24gewogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogIHBhZGRpbmc6IDIwcHg7CiAgYm9yZGVyLXJhZGl1czogMTJweDsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1zbSk7Cn0KCi5kZXRhaWwtc2VjdGlvbiBoNCB7CiAgZm9udC1zaXplOiAxM3B4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA4cHg7Cn0KCi5kZXRhaWwtaXRlbSB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBwYWRkaW5nOiA4cHggMDsKICBmb250LXNpemU6IDEzcHg7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5kZXRhaWwtaXRlbTpsYXN0LWNoaWxkIHsKICBib3JkZXItYm90dG9tOiBub25lOwp9CgouZGV0YWlsLWl0ZW0gc3BhbjpmaXJzdC1jaGlsZCB7CiAgY29sb3I6IHZhcigtLW11dGVkKTsKICBmb250LXdlaWdodDogNTAwOwp9CgouZGV0YWlsLWl0ZW0gc3BhbjpsYXN0LWNoaWxkIHsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLyogTG9nbyAqLwoubG9nby1mcmFtZSB7CiAgd2lkdGg6IDQwcHg7CiAgaGVpZ2h0OiA0MHB4OwogIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxNCwgMTY1LCAyMzMsIDAuMSkgMCUsIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjIpIDEwMCUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTQsIDE2NSwgMjMzLCAwLjMpOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLmxvZ28taW1nIHsKICB3aWR0aDogMjZweDsKICBoZWlnaHQ6IDI2cHg7CiAgZGlzcGxheTogYmxvY2s7Cn0KCi5sb2dvIHsKICB3aWR0aDogMzRweDsKICBoZWlnaHQ6IDM0cHg7CiAgYm9yZGVyLXJhZGl1czogOXB4OwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTQsIDE2NSwgMjMzLCAwLjM1KTsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE0LCAxNjUsIDIzMywgMC4yNSksIHJnYmEoMiwgMTMyLCAxOTksIDAuMTIpKTsKfQoKLyogSWNvbnMgR2VuZXJpYyAqLwouaWNvbiB7CiAgd2lkdGg6IDE4cHg7CiAgaGVpZ2h0OiAxOHB4OwogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9CgovKiBQYWdpbmF0aW9uICovCi5wYWdpbmF0aW9uIHsKICBtYXJnaW4tdG9wOiAyMHB4OwogIGRpc3BsYXk6IGZsZXg7CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgcGFkZGluZzogMTZweCAyNHB4OwogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgYm9yZGVyLXJhZGl1czogMTJweDsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cpOwp9CgoucGFnZS1idG4gewogIHdpZHRoOiAzOHB4OwogIGhlaWdodDogMzhweDsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmc6IDA7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBib3JkZXItcmFkaXVzOiAxMHB4OwogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgdHJhbnNpdGlvbjogYWxsIDAuMnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5wYWdlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyKTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXNtKTsKfQoKLnBhZ2UtYnRuLmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeSk7CiAgY29sb3I6IHdoaXRlOwogIGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeSk7CiAgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiYSgxNCwgMTY1LCAyMzMsIDAuMyk7Cn0KCi5wYWdlLWJ0bjpkaXNhYmxlZCB7CiAgb3BhY2l0eTogMC40OwogIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwp9CgoucGFnZS1idG4gc3ZnIHsKICB3aWR0aDogMThweDsKICBoZWlnaHQ6IDE4cHg7CiAgc3Ryb2tlLXdpZHRoOiAycHg7Cn0KCi8qIFBhZ2UgU2l6ZSBTZWxlY3RvciAqLwoucGFnaW5hdGlvbi1jb250cm9scyB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogOHB4OwogIGZsZXgtd3JhcDogd3JhcDsKfQoKLnBhZ2Utc2l6ZS1zZWxlY3RvciB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogOHB4OwogIG1hcmdpbi1sZWZ0OiAxNnB4OwogIHBhZGRpbmctbGVmdDogMTZweDsKICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5wYWdlLXNpemUtc2VsZWN0b3IgbGFiZWwgewogIGZvbnQtc2l6ZTogMTNweDsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5wYWdlLXNpemUtc2VsZWN0b3Igc2VsZWN0IHsKICBwYWRkaW5nOiAwIDMycHggMCAxMnB4OwogIGhlaWdodDogMzhweDsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2FyZCk7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIGZvbnQtc2l6ZTogMTNweDsKICBmb250LXdlaWdodDogNTAwOwogIGN1cnNvcjogcG9pbnRlcjsKICBhcHBlYXJhbmNlOiBub25lOwogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9J25vbmUnIHZpZXdCb3g9JzAgMCAyNCAyNCcgc3Ryb2tlPSclMjM5NGEzYjgnJTNFJTNDcGF0aCBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS13aWR0aD0nMicgZD0nTTE5IDlsLTcgNy03LTcnJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCA4cHggY2VudGVyOwogIGJhY2tncm91bmQtc2l6ZTogMTZweDsKICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKfQoKLnBhZ2Utc2l6ZS1zZWxlY3RvciBzZWxlY3Q6aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwogIGJvcmRlci1jb2xvcjogdmFyKC0tbXV0ZWQpOwp9CgoucGFnZS1zaXplLXNlbGVjdG9yIHNlbGVjdDpmb2N1cyB7CiAgb3V0bGluZTogbm9uZTsKICBib3JkZXItY29sb3I6IHZhcigtLXByaW1hcnkpOwogIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDE0LCAxNjUsIDIzMywgMC4xKTsKfQoKLyogVG9nZ2xlIFN3aXRjaCAqLwouYXV0by1zdGFydC10b2dnbGUsCi5hdXRvLXN3aXRjaC10b2dnbGUgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgd2lkdGg6IDQ0cHg7CiAgaGVpZ2h0OiAyNHB4OwogIGN1cnNvcjogcG9pbnRlcjsKfQoKLmF1dG8tc3RhcnQtdG9nZ2xlIGlucHV0LAouYXV0by1zd2l0Y2gtdG9nZ2xlIGlucHV0IHsKICBvcGFjaXR5OiAwOwogIHdpZHRoOiAwOwogIGhlaWdodDogMDsKfQoKLnRvZ2dsZS1zbGlkZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdG9wOiAwOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgYm90dG9tOiAwOwogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UtYWN0aXZlKTsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIHRyYW5zaXRpb246IDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICBib3JkZXItcmFkaXVzOiAzNHB4Owp9CgoudG9nZ2xlLXNsaWRlcjpiZWZvcmUgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBjb250ZW50OiAnJzsKICBoZWlnaHQ6IDE4cHg7CiAgd2lkdGg6IDE4cHg7CiAgbGVmdDogMnB4OwogIGJvdHRvbTogMnB4OwogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW11dGVkKTsKICB0cmFuc2l0aW9uOiAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7Cn0KCmlucHV0OmNoZWNrZWQgKyAudG9nZ2xlLXNsaWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxNCwgMTY1LCAyMzMsIDAuMTUpOyAvKiBQcmltYXJ5IHRyYW5zcGFyZW50ICovCiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKfQoKaW5wdXQ6Y2hlY2tlZCArIC50b2dnbGUtc2xpZGVyOmJlZm9yZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpOwogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnkpOwp9CgovKiBIb3ZlciBnZW5lcmljIGZvciB0b2dnbGVzICovCi5hdXRvLXN0YXJ0LXRvZ2dsZTpob3ZlciAudG9nZ2xlLXNsaWRlciwKLmF1dG8tc3dpdGNoLXRvZ2dsZTpob3ZlciAudG9nZ2xlLXNsaWRlciB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tdXRlZCk7Cn0KCi8qIFJlc3BvbnNpdmUgRGVzaWduIC0gVGFibGV0ICovCkBtZWRpYSAobWF4LXdpZHRoOiAxMDI0cHgpIHsKICAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDMwcHggMjBweDsKICB9CgogIC5oZWFkZXIgewogICAgcGFkZGluZzogMjBweCAyNHB4OwogICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICB9CgogIC5oZWFkZXItdG9wIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogMTZweDsKICB9CgogIC5oZWFkZXItYWN0aW9ucyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICB9CgogIC5maWx0ZXJzLWJhciB7CiAgICBnYXA6IDEycHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgfQoKICAuc2VhcmNoLWJveCB7CiAgICB3aWR0aDogMjQwcHg7CiAgfQoKICAuc3VtbWFyeS1iYXIgewogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiAxMnB4IDE2cHg7CiAgfQoKICAuc3VtbWFyeS1pdGVtIHsKICAgIG1pbi13aWR0aDogMTAwcHg7CiAgfQoKICAudGFibGUtY29udGFpbmVyIHsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogIH0KCiAgdGFibGUgewogICAgbWluLXdpZHRoOiA5MDBweDsKICB9CgogIC5kZXRhaWxzLWdyaWQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDIwcHg7CiAgfQp9CgovKiBSZXNwb25zaXZlIERlc2lnbiAtIE1vYmlsZSAqLwpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDE2cHggMTJweDsKICB9CgogIC5oZWFkZXIgewogICAgcGFkZGluZzogMTZweDsKICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogIH0KCiAgLmhlYWRlciBoMSB7CiAgICBmb250LXNpemU6IDIwcHg7CiAgfQoKICAuaGVhZGVyLXRvcCA+IGRpdjpmaXJzdC1jaGlsZCB7CiAgICBnYXA6IDEycHg7CiAgfQoKICAubG9nby1pbWcgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgfQoKICAuaGVhZGVyLWFjdGlvbnMgewogICAgZ2FwOiA4cHg7CiAgfQoKICAudGhlbWUtdG9nZ2xlIHsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgaGVpZ2h0OiAzMnB4OwogIH0KCiAgLm5hdi1iYXIgewogICAgcGFkZGluZy1ib3R0b206IDE2cHg7CiAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogIH0KCiAgLm5hdi1saW5rcyB7CiAgICBnYXA6IDE2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgfQoKICAubmF2LWxpbmsgewogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgfQoKICAuZmlsdGVycy1iYXIgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgZ2FwOiAxNnB4OwogIH0KCiAgLmZpbHRlci1ncm91cCB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogNnB4OwogIH0KCiAgLmZpbHRlci1ncm91cCBsYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICAuZmlsdGVyLWdyb3VwIHNlbGVjdCwKICAuZmlsdGVyLWdyb3VwIGlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA0MHB4OwogIH0KCiAgLnNlYXJjaC1ib3ggewogICAgd2lkdGg6IDEwMCU7CiAgfQoKICAuc2VhcmNoLWJveCBpbnB1dCB7CiAgICBoZWlnaHQ6IDQwcHg7CiAgfQoKICAuc3VtbWFyeS1iYXIgewogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgZ2FwOiAxMnB4OwogIH0KCiAgLnN1bW1hcnktaXRlbSB7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgfQoKICAuc3VtbWFyeS1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgfQoKICAuc3VtbWFyeS12YWx1ZSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgfQoKICAudGFibGUtY29udGFpbmVyIHsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIG1hcmdpbjogMCAtMTJweDsKICAgIHBhZGRpbmc6IDAgMTJweDsKICB9CgogIHRhYmxlIHsKICAgIG1pbi13aWR0aDogNzAwcHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgfQoKICB0aCB7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgfQoKICB0ZCB7CiAgICBwYWRkaW5nOiAxNnB4OwogICAgZm9udC1zaXplOiAxM3B4OwogIH0KCiAgLndvcmtlci1uYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICB9CgogIC53b3JrZXItcXVldWUgewogICAgZm9udC1zaXplOiAxMXB4OwogIH0KCiAgLnN0YXR1cy1iYWRnZSB7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogIH0KCiAgLmFjdGlvbi1idG4gewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBwYWRkaW5nOiAwOwogIH0KCiAgLmFjdGlvbi1idG4gc3ZnIHsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogIH0KCiAgLnBlcmZvcm1hbmNlLWljb25zIHsKICAgIGdhcDogOHB4OwogIH0KCiAgLnBlcmYtaWNvbiB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgfQoKICAucGVyZi1pY29uIHNwYW4gewogICAgZm9udC1zaXplOiAxMHB4OwogIH0KCiAgLnBhZ2luYXRpb24gewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDE2cHg7CiAgfQoKICAucGFnaW5hdGlvbi1jb250cm9scyB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGdhcDogOHB4OwogIH0KCiAgLnBhZ2luYXRpb24tYnRuIHsKICAgIG1pbi13aWR0aDogMzZweDsKICAgIGhlaWdodDogMzZweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICB9CgogIC5wYWdlLXNpemUtc2VsZWN0b3IgewogICAgbWFyZ2luLWxlZnQ6IDA7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgcGFkZGluZy10b3A6IDEycHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICB9CgogIC5kZXRhaWxzLWNvbnRlbnQgewogICAgcGFkZGluZzogMTZweDsKICB9CgogIC5kZXRhaWxzLWdyaWQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDE2cHg7CiAgfQoKICAuZGV0YWlsLXNlY3Rpb24gewogICAgcGFkZGluZzogMTZweDsKICB9CgogIC5kZXRhaWwtc2VjdGlvbiBoNCB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogIH0KCiAgLmRldGFpbC1pdGVtIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogOHB4IDA7CiAgfQoKICAuZGV0YWlsLWl0ZW0gc3BhbjpmaXJzdC1jaGlsZCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgfQoKICAuZGV0YWlsLWl0ZW0gc3BhbjpsYXN0LWNoaWxkIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICB9CgogIC5oZWFsdGgtY2hlY2tzIHsKICAgIGdhcDogOHB4OwogIH0KCiAgLmhlYWx0aC1jaGVjayB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDhweDsKICB9CgogIC5yZWNlbnQtbG9ncy1jb250YWluZXIgewogICAgbWF4LWhlaWdodDogMTUwcHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgfQoKICAubG9nLWVudHJ5IHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogNHB4IDA7CiAgfQp9CgovKiBSZXNwb25zaXZlIERlc2lnbiAtIFNtYWxsIE1vYmlsZSAqLwpAbWVkaWEgKG1heC13aWR0aDogNDgwcHgpIHsKICAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDEycHggOHB4OwogIH0KCiAgLmhlYWRlciB7CiAgICBwYWRkaW5nOiAxMnB4OwogIH0KCiAgLmhlYWRlciBoMSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgfQoKICAubG9nby1pbWcgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgfQoKICAudGhlbWUtdG9nZ2xlIHsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgfQoKICAubmF2LWxpbmsgewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICB9CgogIC5zdW1tYXJ5LWJhciB7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICB9CgogIC50YWJsZS1jb250YWluZXIgewogICAgbWFyZ2luOiAwIC04cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICB9CgogIHRhYmxlIHsKICAgIG1pbi13aWR0aDogNjAwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICB0aCB7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICB9CgogIHRkIHsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICAuYWN0aW9uLWJ0biB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICB9CgogIC5hY3Rpb24tYnRuIHN2ZyB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICB9CgogIC5wZXJmLWljb24gc3BhbiB7CiAgICBmb250LXNpemU6IDlweDsKICB9CgogIC5kZXRhaWxzLWNvbnRlbnQgewogICAgcGFkZGluZzogMTJweDsKICB9CgogIC5kZXRhaWwtc2VjdGlvbiB7CiAgICBwYWRkaW5nOiAxMnB4OwogIH0KCiAgLmRldGFpbC1zZWN0aW9uIGg0IHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICB9Cn0KCi8qIEhpZGUvU2hvdyBjb2x1bW5zIGZvciBtb2JpbGUgKi8KQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmhpZGUtbW9iaWxlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogNTc2cHgpIHsKICAuaGlkZS1zbWFsbCB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQoKLyogTW9iaWxlIHRhYmxlIHNjcm9sbCBoaW50ICovCkBtZWRpYSAobWF4LXdpZHRoOiA5OTJweCkgewogIC50YWJsZS13cmFwcGVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB9CgogIC50YWJsZS13cmFwcGVyOjphZnRlciB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMDsKICAgIHJpZ2h0OiAwOwogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB0cmFuc3BhcmVudCAwJSwgdmFyKC0tY2FyZCkgNTAlKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogMCAwIDhweCAwOwogIH0KfQoKLyogVG91Y2gtZnJpZW5kbHkgaW50ZXJhY3Rpb25zICovCkBtZWRpYSAoaG92ZXI6IG5vbmUpIGFuZCAocG9pbnRlcjogY29hcnNlKSB7CiAgLmFjdGlvbi1idG46aG92ZXIgewogICAgdHJhbnNmb3JtOiBub25lOwogIH0KCiAgLmJ0bjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQoKICAubmF2LWxpbms6aG92ZXIgewogICAgdHJhbnNmb3JtOiBub25lOwogIH0KCiAgLmFjdGlvbi1idG46YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSk7CiAgfQoKICAuYnRuOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpOwogIH0KfQoKLyogTGFuZHNjYXBlIG1vYmlsZSBhZGp1c3RtZW50cyAqLwpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgewogIC5oZWFkZXIgewogICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICB9CgogIC5maWx0ZXJzLWJhciB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiA4cHg7CiAgfQoKICAuZmlsdGVyLWdyb3VwIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgd2lkdGg6IGF1dG87CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogIH0KCiAgLmZpbHRlci1ncm91cCBzZWxlY3QsCiAgLmZpbHRlci1ncm91cCBpbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKICB9CgogIC5zZWFyY2gtYm94IHsKICAgIHdpZHRoOiAyMDBweDsKICAgIGZsZXg6IDE7CiAgfQp9Ci50YWJsZS13cmFwcGVyOjphZnRlciB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICByaWdodDogMDsKICB3aWR0aDogMjBweDsKICBoZWlnaHQ6IDEwMCU7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCwgdmFyKC0tY2FyZCkpOwogIHBvaW50ZXItZXZlbnRzOiBub25lOwogIG9wYWNpdHk6IDA7CiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzOwp9Ci50YWJsZS13cmFwcGVyOmhvdmVyOjphZnRlciB7CiAgb3BhY2l0eTogMTsKfQo=\n";
3
+ export declare const MAIN_JS = "\nLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi8KLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LWZ1bmN0aW9uLXJldHVybi10eXBlICovCi8qIGdsb2JhbCBkb2N1bWVudCwgYWxlcnQsIGNvbmZpcm0gKi8KLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqLwovLyBDb25maWd1cmF0aW9uCmNvbnN0IEFQSV9CQVNFID0gJyc7Cgpjb25zdCBUSEVNRV9LRVkgPSAnemludHJ1c3Qtd29ya2Vycy1kYXNoYm9hcmQtdGhlbWUnOwpjb25zdCBBVVRPX1JFRlJFU0hfS0VZID0gJ3ppbnRydXN0LXdvcmtlcnMtZGFzaGJvYXJkLWF1dG8tcmVmcmVzaCc7CmNvbnN0IFBBR0VfU0laRV9LRVkgPSAnemludHJ1c3Qtd29ya2Vycy1kYXNoYm9hcmQtcGFnZS1zaXplJzsKY29uc3QgX0JVTEtfQVVUT19TVEFSVF9LRVkgPSAnemludHJ1c3Qtd29ya2Vycy1kYXNoYm9hcmQtYnVsay1hdXRvLXN0YXJ0JzsKCmxldCBjdXJyZW50UGFnZSA9IDE7CmxldCB0b3RhbFBhZ2VzID0gMTsKbGV0IHRvdGFsV29ya2VycyA9IDA7CmxldCBhdXRvUmVmcmVzaEVuYWJsZWQgPSB0cnVlOwpsZXQgcmVmcmVzaFRpbWVyID0gbnVsbDsKbGV0IGN1cnJlbnRUaGVtZSA9IG51bGw7CmxldCBldmVudFNvdXJjZSA9IG51bGw7CmxldCBzc2VBY3RpdmUgPSBmYWxzZTsKbGV0IGxhc3RTc2VSZWZyZXNoID0gMDsKY29uc3QgX2J1bGtBdXRvU3RhcnRFbmFibGVkID0gZmFsc2U7CmNvbnN0IF9sYXN0V29ya2VycyA9IFtdOwpjb25zdCBkZXRhaWxzQ2FjaGUgPSBuZXcgTWFwKCk7CmNvbnN0IE1BWF9DQUNIRV9TSVpFID0gNTA7CgovLyBUaGVtZSBtYW5hZ2VtZW50CmZ1bmN0aW9uIGdldFByZWZlcnJlZFRoZW1lKCkgewogIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFRIRU1FX0tFWSk7CiAgaWYgKHN0b3JlZCA9PT0gJ2xpZ2h0JyB8fCBzdG9yZWQgPT09ICdkYXJrJykgewogICAgcmV0dXJuIHN0b3JlZDsKICB9CiAgY29uc3QgcHJlZmVyc0xpZ2h0ID0KICAgIGdsb2JhbFRoaXMud2luZG93Lm1hdGNoTWVkaWEgJiYKICAgIGdsb2JhbFRoaXMud2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpJykubWF0Y2hlczsKICByZXR1cm4gcHJlZmVyc0xpZ2h0ID8gJ2xpZ2h0JyA6ICdkYXJrJzsKfQoKZnVuY3Rpb24gYXBwbHlUaGVtZShuZXh0VGhlbWUpIHsKICBjdXJyZW50VGhlbWUgPSBuZXh0VGhlbWU7CiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRhdGFzZXQudGhlbWUgPSBuZXh0VGhlbWU7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oVEhFTUVfS0VZLCBuZXh0VGhlbWUpOwp9CgpmdW5jdGlvbiB0b2dnbGVUaGVtZSgpIHsKICBhcHBseVRoZW1lKGN1cnJlbnRUaGVtZSA9PT0gJ2RhcmsnID8gJ2xpZ2h0JyA6ICdkYXJrJyk7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgRE9NIGVsZW1lbnRzCmZ1bmN0aW9uIGdldERvbUVsZW1lbnRzKCkgewogIHJldHVybiB7CiAgICBsb2FkaW5nOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpLAogICAgZXJyb3I6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcicpLAogICAgY29udGVudDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dvcmtlcnMtY29udGVudCcpLAogICAgc2VhcmNoQnRuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoLWJ0bicpLAogIH07Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBzaG93IGxvYWRpbmcgc3RhdGUKZnVuY3Rpb24gc2hvd0xvYWRpbmdTdGF0ZShlbGVtZW50cykgewogIGlmIChlbGVtZW50cy5jb250ZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgZWxlbWVudHMubG9hZGluZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICB9IGVsc2UgewogICAgZWxlbWVudHMuY29udGVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7CiAgfQogIGVsZW1lbnRzLmVycm9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgaWYgKGVsZW1lbnRzLnNlYXJjaEJ0bikgZWxlbWVudHMuc2VhcmNoQnRuLmRpc2FibGVkID0gdHJ1ZTsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGhpZGUgbG9hZGluZyBzdGF0ZQpmdW5jdGlvbiBoaWRlTG9hZGluZ1N0YXRlKGVsZW1lbnRzKSB7CiAgZWxlbWVudHMubG9hZGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGVsZW1lbnRzLmNvbnRlbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgZWxlbWVudHMuY29udGVudC5zdHlsZS5vcGFjaXR5ID0gJzEnOwogIGlmIChlbGVtZW50cy5zZWFyY2hCdG4pIGVsZW1lbnRzLnNlYXJjaEJ0bi5kaXNhYmxlZCA9IGZhbHNlOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gaGFuZGxlIGZldGNoIGVycm9yCmZ1bmN0aW9uIGhhbmRsZUZldGNoRXJyb3IoZWxlbWVudHMsIGVycm9yKSB7CiAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgd29ya2VyczonLCBlcnJvcik7CiAgaGlkZUxvYWRpbmdTdGF0ZShlbGVtZW50cyk7CiAgZWxlbWVudHMuZXJyb3Iuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byB2YWxpZGF0ZSB3b3JrZXIgZGF0YQpmdW5jdGlvbiB2YWxpZGF0ZVdvcmtlckRhdGEoZGF0YSkgewogIGlmICghZGF0YSB8fCAhZGF0YS53b3JrZXJzIHx8ICFBcnJheS5pc0FycmF5KGRhdGEud29ya2VycykpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgd29ya2VyIGRhdGEgc3RydWN0dXJlOicsIGRhdGEpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKLy8gRGF0YSBmZXRjaGluZyAtIG9ubHkgZm9yIHNlYXJjaCBhbmQgcGFnaW5hdGlvbiwgU1NFIGhhbmRsZXMgcmVndWxhciB1cGRhdGVzCmFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSgpIHsKICBjb25zdCBlbGVtZW50cyA9IGdldERvbUVsZW1lbnRzKCk7CgogIHNob3dMb2FkaW5nU3RhdGUoZWxlbWVudHMpOwoKICB0cnkgewogICAgY29uc3QgcXVlcnkgPSBlbGVtZW50cy5zZWFyY2hCdG4KICAgICAgPyBlbGVtZW50cy5zZWFyY2hCdG4ucGFyZW50RWxlbWVudD8ucGFyZW50RWxlbWVudD8ucXVlcnlTZWxlY3RvcignaW5wdXQnKT8udmFsdWUKICAgICAgOiAnJzsKICAgIGNvbnN0IGxpbWl0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oUEFHRV9TSVpFX0tFWSkgfHwgJzEwMCc7CgogICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7CiAgICAgIHBhZ2U6IGN1cnJlbnRQYWdlLnRvU3RyaW5nKCksCiAgICAgIGxpbWl0OiBsaW1pdCwKICAgICAgc3RhdHVzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzLWZpbHRlcicpPy52YWx1ZSB8fCAnJywKICAgICAgZHJpdmVyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJpdmVyLWZpbHRlcicpPy52YWx1ZSB8fCAnJywKICAgICAgc29ydEJ5OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc29ydC1zZWxlY3QnKT8udmFsdWUgfHwgJ3N0YXR1cycsCiAgICAgIHNvcnRPcmRlcjogJ2FzYycsCiAgICAgIHNlYXJjaDogcXVlcnksCiAgICB9KTsKCiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKEFQSV9CQVNFICsgJy9hcGkvd29ya2Vycz8nICsgcGFyYW1zLnRvU3RyaW5nKCkpOwogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggd29ya2VyczonLCByZXNwb25zZS5zdGF0dXNUZXh0KTsKICAgICAgaGlkZUxvYWRpbmdTdGF0ZShlbGVtZW50cyk7CiAgICAgIGVsZW1lbnRzLmVycm9yLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgZGF0YSByZWNlaXZlZDonLCBkYXRhKTsKCiAgICBpZiAoIXZhbGlkYXRlV29ya2VyRGF0YShkYXRhKSkgewogICAgICBlbGVtZW50cy5lcnJvci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgaGlkZUxvYWRpbmdTdGF0ZShlbGVtZW50cyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zb2xlLmxvZygnUmVuZGVyaW5nJywgZGF0YS53b3JrZXJzLmxlbmd0aCwgJ3dvcmtlcnMnKTsKICAgIHJlbmRlcldvcmtlcnMoZGF0YSk7CiAgICBoaWRlTG9hZGluZ1N0YXRlKGVsZW1lbnRzKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIGhhbmRsZUZldGNoRXJyb3IoZWxlbWVudHMsIGVycik7CiAgfQp9CgpmdW5jdGlvbiBjaGFuZ2VMaW1pdChfbmV3TGltaXQpIHsKICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShQQUdFX1NJWkVfS0VZLCBfbmV3TGltaXQpOwogIGN1cnJlbnRQYWdlID0gMTsKICBmZXRjaERhdGEoKTsgLy8gRW5hYmxlIGZvciBwYWdpbmF0aW9uCn0KCi8vIE1ha2UgZnVuY3Rpb25zIGdsb2JhbGx5IGF2YWlsYWJsZSBmb3IgSFRNTCBvbmNsaWNrL29uY2hhbmdlIGhhbmRsZXJzCmdsb2JhbFRoaXMuY2hhbmdlTGltaXQgPSBjaGFuZ2VMaW1pdDsKZ2xvYmFsVGhpcy50b2dnbGVBdXRvUmVmcmVzaCA9IHRvZ2dsZUF1dG9SZWZyZXNoOwpnbG9iYWxUaGlzLmZldGNoRGF0YSA9IGZldGNoRGF0YTsKZ2xvYmFsVGhpcy5zaG93QWRkV29ya2VyTW9kYWwgPSBzaG93QWRkV29ya2VyTW9kYWw7Cmdsb2JhbFRoaXMubG9hZFBhZ2UgPSBsb2FkUGFnZTsKZ2xvYmFsVGhpcy5zdGFydFdvcmtlciA9IHN0YXJ0V29ya2VyOwpnbG9iYWxUaGlzLnN0b3BXb3JrZXIgPSBzdG9wV29ya2VyOwpnbG9iYWxUaGlzLnJlc3RhcnRXb3JrZXIgPSByZXN0YXJ0V29ya2VyOwpnbG9iYWxUaGlzLmRlbGV0ZVdvcmtlciA9IGRlbGV0ZVdvcmtlcjsKZ2xvYmFsVGhpcy50b2dnbGVBdXRvU3RhcnQgPSB0b2dnbGVBdXRvU3RhcnQ7Cmdsb2JhbFRoaXMudG9nZ2xlRGV0YWlscyA9IHRvZ2dsZURldGFpbHM7CgovLyBIZWxwZXIgZnVuY3Rpb25zIHRvIHJlZHVjZSBjb21wbGV4aXR5CmZ1bmN0aW9uIHZhbGlkYXRlRHJpdmVyKGRyaXZlcikgewogIHJldHVybiAhZHJpdmVyIHx8IFsnZGF0YWJhc2UnLCAncmVkaXMnLCAnbWVtb3J5J10uaW5jbHVkZXMoZHJpdmVyKTsKfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hXb3JrZXJEYXRhKHdvcmtlck5hbWUsIGRyaXZlcikgewogIGNvbnN0IFtkZXRhaWxzUmVzLCBoaXN0b3J5UmVzLCB0cmVuZFJlcywgc2xhUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgIGZldGNoKEFQSV9CQVNFICsgJy9hcGkvd29ya2Vycy8nICsgd29ya2VyTmFtZSArICcvZGV0YWlscz9kcml2ZXI9JyArIGRyaXZlciksCiAgICBmZXRjaChBUElfQkFTRSArICcvYXBpL3dvcmtlcnMvJyArIHdvcmtlck5hbWUgKyAnL21vbml0b3JpbmcvaGlzdG9yeT9saW1pdD01MCcpLAogICAgZmV0Y2goQVBJX0JBU0UgKyAnL2FwaS93b3JrZXJzLycgKyB3b3JrZXJOYW1lICsgJy9tb25pdG9yaW5nL3RyZW5kJyksCiAgICBmZXRjaChBUElfQkFTRSArICcvYXBpL3dvcmtlcnMvJyArIHdvcmtlck5hbWUgKyAnL3NsYS9zdGF0dXMnKSwKICBdKTsKCiAgcmV0dXJuIHsgZGV0YWlsc1JlcywgaGlzdG9yeVJlcywgdHJlbmRSZXMsIHNsYVJlcyB9Owp9Cgphc3luYyBmdW5jdGlvbiBwcm9jZXNzRGV0YWlsc1Jlc3BvbnNlKGRldGFpbHNSZXMsIGRhdGEpIHsKICBpZiAoIWRldGFpbHNSZXMub2spIHJldHVybjsKICBjb25zdCBqc29uID0gYXdhaXQgZGV0YWlsc1Jlcy5qc29uKCk7CiAgT2JqZWN0LmFzc2lnbihkYXRhLCBqc29uKTsKfQoKYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1NsYVJlc3BvbnNlKHNsYVJlcywgZGF0YSkgewogIGlmICghc2xhUmVzLm9rKSByZXR1cm47CiAgY29uc3Qgc2xhSnNvbiA9IGF3YWl0IHNsYVJlcy5qc29uKCk7CiAgaWYgKHNsYUpzb24uc3RhdHVzKSB7CiAgICBpZiAoIWRhdGEuZGV0YWlscykgZGF0YS5kZXRhaWxzID0ge307CiAgICBkYXRhLmRldGFpbHMuc2xhID0gc2xhSnNvbi5zdGF0dXM7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBwcm9jZXNzSGlzdG9yeVJlc3BvbnNlKGhpc3RvcnlSZXMsIGRhdGEpIHsKICBpZiAoIWhpc3RvcnlSZXMub2spIHJldHVybjsKICBjb25zdCBoaXN0b3J5SnNvbiA9IGF3YWl0IGhpc3RvcnlSZXMuanNvbigpOwogIGlmICghaGlzdG9yeUpzb24uaGlzdG9yeSB8fCAhQXJyYXkuaXNBcnJheShoaXN0b3J5SnNvbi5oaXN0b3J5KSkgcmV0dXJuOwoKICBjb25zdCBmb3JtYXR0ZWRMb2dzID0gaGlzdG9yeUpzb24uaGlzdG9yeS5tYXAoKGgpID0+IHsKICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZShoLnRpbWVzdGFtcCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7CiAgICBjb25zdCBtc2cgPSBoLm1lc3NhZ2UgPyBgIC0gJHtoLm1lc3NhZ2V9YCA6ICcnOwogICAgcmV0dXJuIGBbJHt0aW1lfV0gJHtoLnN0YXR1cy50b1VwcGVyQ2FzZSgpfSAoJHtoLmxhdGVuY3l9bXMpJHttc2d9YDsKICB9KTsKCiAgaWYgKCFkYXRhLmRldGFpbHMpIGRhdGEuZGV0YWlscyA9IHt9OwogIGRhdGEuZGV0YWlscy5yZWNlbnRMb2dzID0gZm9ybWF0dGVkTG9nczsKfQoKYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1RyZW5kUmVzcG9uc2UodHJlbmRSZXMsIGRhdGEpIHsKICBpZiAoIXRyZW5kUmVzLm9rKSByZXR1cm47CiAgY29uc3QgdHJlbmRKc29uID0gYXdhaXQgdHJlbmRSZXMuanNvbigpOwogIGlmICghdHJlbmRKc29uLnRyZW5kKSByZXR1cm47CgogIGlmICghZGF0YS5kZXRhaWxzKSBkYXRhLmRldGFpbHMgPSB7fTsKICBpZiAoIWRhdGEuZGV0YWlscy5tZXRyaWNzKSBkYXRhLmRldGFpbHMubWV0cmljcyA9IHt9OwogIGRhdGEuZGV0YWlscy5tZXRyaWNzLnVwdGltZVRyZW5kID0gKHRyZW5kSnNvbi50cmVuZC51cHRpbWUgKiAxMDApLnRvRml4ZWQoMSkgKyAnJSc7CiAgaWYgKHRyZW5kSnNvbi50cmVuZC5zYW1wbGVzKSBkYXRhLmRldGFpbHMubWV0cmljcy5zYW1wbGVzID0gdHJlbmRKc29uLnRyZW5kLnNhbXBsZXM7Cn0KCmZ1bmN0aW9uIG1hbmFnZUNhY2hlU2l6ZSgpIHsKICBpZiAoZGV0YWlsc0NhY2hlLnNpemUgPj0gTUFYX0NBQ0hFX1NJWkUpIHsKICAgIGNvbnN0IGZpcnN0S2V5ID0gZGV0YWlsc0NhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7CiAgICBkZXRhaWxzQ2FjaGUuZGVsZXRlKGZpcnN0S2V5KTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVdvcmtlckRldGFpbHMod29ya2VyTmFtZSwgZGV0YWlsUm93LCBkcml2ZXIpIHsKICBpZiAoIXdvcmtlck5hbWUgfHwgIWRldGFpbFJvdykgcmV0dXJuOwoKICBpZiAoIWRldGFpbHNDYWNoZS5oYXMod29ya2VyTmFtZSkpIHsKICAgIHRyeSB7CiAgICAgIGlmICghdmFsaWRhdGVEcml2ZXIoZHJpdmVyKSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZHJpdmVyIHNwZWNpZmllZCcpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgZmV0Y2hXb3JrZXJEYXRhKHdvcmtlck5hbWUsIGRyaXZlcik7CiAgICAgIGNvbnN0IGRhdGEgPSB7fTsKCiAgICAgIGF3YWl0IHByb2Nlc3NEZXRhaWxzUmVzcG9uc2UocmVzcG9uc2VzLmRldGFpbHNSZXMsIGRhdGEpOwogICAgICBhd2FpdCBwcm9jZXNzU2xhUmVzcG9uc2UocmVzcG9uc2VzLnNsYVJlcywgZGF0YSk7CiAgICAgIGF3YWl0IHByb2Nlc3NIaXN0b3J5UmVzcG9uc2UocmVzcG9uc2VzLmhpc3RvcnlSZXMsIGRhdGEpOwogICAgICBhd2FpdCBwcm9jZXNzVHJlbmRSZXNwb25zZShyZXNwb25zZXMudHJlbmRSZXMsIGRhdGEpOwoKICAgICAgbWFuYWdlQ2FjaGVTaXplKCk7CiAgICAgIGRldGFpbHNDYWNoZS5zZXQod29ya2VyTmFtZSwgZGF0YSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgd29ya2VyIGRldGFpbHM6JywgZXJyKTsKICAgIH0KICB9CgogIGNvbnN0IGNhY2hlZCA9IGRldGFpbHNDYWNoZS5nZXQod29ya2VyTmFtZSk7CiAgY29uc3QgZGV0YWlsc0RhdGEgPSBjYWNoZWQ/LmRldGFpbHMgPz8gY2FjaGVkOwogIHVwZGF0ZURldGFpbFZpZXdzKGRldGFpbFJvdywgZGV0YWlsc0RhdGEpOwp9CgovLyBIZWxwZXIgdG8gc2FmZSBhY2Nlc3MgbmVzdGVkIHByb3BlcnRpZXMgKHNoYXJlZCBhY3Jvc3MgZnVuY3Rpb25zKQpjb25zdCBnZXQgPSAob2JqLCBwYXRoKSA9PiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvLCBpKSA9PiAobyA/IG9baV0gOiBudWxsKSwgb2JqKTsKCi8vIEhlbHBlciBmdW5jdGlvbiB0byByZXNvbHZlIG1ldHJpYyB2YWx1ZSBmcm9tIGRpZmZlcmVudCBkYXRhIHNvdXJjZXMKZnVuY3Rpb24gcmVzb2x2ZU1ldHJpY1ZhbHVlKGRldGFpbHMsIGtleSwgb3JpZ2luYWxWYWx1ZSkgewogIGlmICgha2V5LnN0YXJ0c1dpdGgoJ21ldHJpY3MuJykpIHJldHVybiBvcmlnaW5hbFZhbHVlOwoKICBjb25zdCBtZXRyaWNLZXkgPSBrZXkucmVwbGFjZSgnbWV0cmljcy4nLCAnJyk7CiAgLy8gVHJ5IHRvIGdldCBmcm9tIGRldGFpbHMubWV0cmljcyBmaXJzdCwgdGhlbiBmcm9tIGRldGFpbHMgZGlyZWN0bHksIHRoZW4gZnJvbSB3b3JrZXIKICByZXR1cm4gKAogICAgZ2V0KGRldGFpbHMsIGBtZXRyaWNzLiR7bWV0cmljS2V5fWApIHx8CiAgICBnZXQoZGV0YWlscywgbWV0cmljS2V5KSB8fAogICAgZ2V0KGRldGFpbHMsIGBkZXRhaWxzLm1ldHJpY3MuJHttZXRyaWNLZXl9YCkgfHwKICAgIG9yaWdpbmFsVmFsdWUKICApOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IG1ldHJpYyB2YWx1ZXMKZnVuY3Rpb24gZm9ybWF0TWV0cmljVmFsdWUoa2V5LCB2YWx1ZSkgewogIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7CgogIHN3aXRjaCAoa2V5KSB7CiAgICBjYXNlICdtZXRyaWNzLnByb2Nlc3NlZCc6CiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpLnRvTG9jYWxlU3RyaW5nKCk7CiAgICBjYXNlICdtZXRyaWNzLmF2Z1RpbWUnOgogICAgICByZXR1cm4gdmFsdWUgKyAnbXMnOwogICAgY2FzZSAnbWV0cmljcy5tZW1vcnknOgogICAgICByZXR1cm4gdmFsdWUgKyAnTUInOwogICAgY2FzZSAnbWV0cmljcy5jcHUnOgogICAgICByZXR1cm4gdmFsdWUgKyAnJSc7CiAgICBjYXNlICdtZXRyaWNzLnVwdGltZSc6CiAgICAgIHJldHVybiBmb3JtYXRVcHRpbWUodmFsdWUpOwogICAgY2FzZSAnaGVhbHRoLmxhc3RDaGVjayc6CiAgICAgIHJldHVybiBmb3JtYXRUaW1lQWdvKHZhbHVlKTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgYSBzaW5nbGUgZWxlbWVudApmdW5jdGlvbiB1cGRhdGVEZXRhaWxFbGVtZW50KGVsLCBkZXRhaWxzKSB7CiAgY29uc3Qga2V5ID0gZWwuZGF0YXNldC5rZXk7CiAgbGV0IHZhbHVlID0gZ2V0KGRldGFpbHMsIGtleSk7CgogIC8vIFJlc29sdmUgbWV0cmljIHZhbHVlcyBmcm9tIGRpZmZlcmVudCBzb3VyY2VzCiAgdmFsdWUgPSByZXNvbHZlTWV0cmljVmFsdWUoZGV0YWlscywga2V5LCB2YWx1ZSk7CgogIC8vIEZvcm1hdCB0aGUgdmFsdWUKICB2YWx1ZSA9IGZvcm1hdE1ldHJpY1ZhbHVlKGtleSwgdmFsdWUpOwoKICAvLyBVcGRhdGUgZWxlbWVudCBpZiB2YWx1ZSBpcyB2YWxpZAogIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJykgewogICAgZWwudGV4dENvbnRlbnQgPSB2YWx1ZTsKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZURldGFpbFZpZXdzKGRldGFpbFJvdywgZGV0YWlscykgewogIGlmICghZGV0YWlscykgcmV0dXJuOwoKICAvLyBVcGRhdGUgYWxsIGRhdGEta2V5IGVsZW1lbnRzCiAgZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWtleV0nKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7CiAgICB1cGRhdGVEZXRhaWxFbGVtZW50KGVsZW1lbnQpOwogIH0pOwoKICAvLyBEZWxlZ2F0ZSB0byBzcGVjaWFsaXplZCBmdW5jdGlvbnMKICB1cGRhdGVMb2dzQ29udGFpbmVyKGRldGFpbFJvdywgZGV0YWlscyk7CiAgdXBkYXRlU0xBQ29udGFpbmVyKGRldGFpbFJvdywgZGV0YWlscyk7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBmb3JtYXQgdXB0aW1lCmZ1bmN0aW9uIGZvcm1hdFVwdGltZShzZWNvbmRzKSB7CiAgaWYgKCFzZWNvbmRzIHx8IHNlY29uZHMgPT09ICdOL0EnKSByZXR1cm4gJ04vQSc7CgogIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA4NjQwMCk7CiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKChzZWNvbmRzICUgODY0MDApIC8gMzYwMCk7CiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSAzNjAwKSAvIDYwKTsKCiAgaWYgKGRheXMgPiAwKSB7CiAgICByZXR1cm4gYCR7ZGF5c31kICR7aG91cnN9aCAke21pbnV0ZXN9bWA7CiAgfSBlbHNlIGlmIChob3VycyA+IDApIHsKICAgIHJldHVybiBgJHtob3Vyc31oICR7bWludXRlc31tYDsKICB9IGVsc2UgewogICAgcmV0dXJuIGAke21pbnV0ZXN9bWA7CiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVMb2dzQ29udGFpbmVyKGRldGFpbFJvdywgZGV0YWlscykgewogIC8vIEhhbmRsZSBsb2dzIGlmIHByZXNlbnQKICBjb25zdCBsb2dzQ29udGFpbmVyID0gZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3IoJy5sb2dzLWNvbnRlbnQnKTsKICBpZiAobG9nc0NvbnRhaW5lciAmJiBkZXRhaWxzLnJlY2VudExvZ3MgJiYgQXJyYXkuaXNBcnJheShkZXRhaWxzLnJlY2VudExvZ3MpKSB7CiAgICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50IHNhZmVseQogICAgd2hpbGUgKGxvZ3NDb250YWluZXIuZmlyc3RDaGlsZCkgewogICAgICBsb2dzQ29udGFpbmVyLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgICB9CgogICAgaWYgKGRldGFpbHMucmVjZW50TG9ncy5sZW5ndGggPT09IDApIHsKICAgICAgY29uc3Qgbm9Mb2dzTXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIG5vTG9nc01zZy5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOwogICAgICBub0xvZ3NNc2cudGV4dENvbnRlbnQgPSAnTm8gcmVjZW50IGxvZ3MnOwogICAgICBsb2dzQ29udGFpbmVyLmFwcGVuZENoaWxkKG5vTG9nc01zZyk7CiAgICB9IGVsc2UgewogICAgICBkZXRhaWxzLnJlY2VudExvZ3MuZm9yRWFjaCgobG9nKSA9PiB7CiAgICAgICAgbGV0IGNvbG9yID0gJ3ZhcigtLXRleHQpJzsKICAgICAgICBpZiAoCiAgICAgICAgICBsb2cudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZmFpbGVkJykgfHwKICAgICAgICAgIGxvZy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdlcnJvcicpIHx8CiAgICAgICAgICBsb2cudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZG93bicpIHx8CiAgICAgICAgICBsb2cudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndW5oZWFsdGh5JykKICAgICAgICApCiAgICAgICAgICBjb2xvciA9ICd2YXIoLS1kYW5nZXIpJzsKICAgICAgICBlbHNlIGlmIChsb2cudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnc3VjY2VzcycpIHx8IGxvZy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdoZWFsdGh5JykpCiAgICAgICAgICBjb2xvciA9ICd2YXIoLS1zdWNjZXNzKSc7CiAgICAgICAgZWxzZSBpZiAobG9nLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3Byb2Nlc3NpbmcnKSkgY29sb3IgPSAndmFyKC0taW5mbyknOwoKICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgbG9nRWxlbWVudC5zdHlsZS5jb2xvciA9IGNvbG9yOwogICAgICAgIGxvZ0VsZW1lbnQudGV4dENvbnRlbnQgPSBsb2c7IC8vIFNhZmU6IHRleHRDb250ZW50IGRvZXNuJ3QgZXhlY3V0ZSBIVE1MCiAgICAgICAgbG9nc0NvbnRhaW5lci5hcHBlbmRDaGlsZChsb2dFbGVtZW50KTsKICAgICAgfSk7CiAgICB9CiAgfSBlbHNlIGlmIChsb2dzQ29udGFpbmVyKSB7CiAgICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50IHNhZmVseQogICAgd2hpbGUgKGxvZ3NDb250YWluZXIuZmlyc3RDaGlsZCkgewogICAgICBsb2dzQ29udGFpbmVyLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgICB9CiAgICBjb25zdCBub0xvZ3NNc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIG5vTG9nc01zZy5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOwogICAgbm9Mb2dzTXNnLnRleHRDb250ZW50ID0gJ05vIGxvZ3MgYXZhaWxhYmxlJzsKICAgIGxvZ3NDb250YWluZXIuYXBwZW5kQ2hpbGQobm9Mb2dzTXNnKTsKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVNMQUNvbnRhaW5lcihkZXRhaWxSb3csIGRldGFpbHMpIHsKICAvLyBSZW5kZXIgU0xBIFNjb3JlY2FyZCBpZiBjb250YWluZXIvZGF0YSBleGlzdHMKICBjb25zdCBzbGFDb250YWluZXIgPSBkZXRhaWxSb3cucXVlcnlTZWxlY3RvcignLnNsYS1zY29yZWNhcmQtY29udGFpbmVyJyk7CiAgaWYgKHNsYUNvbnRhaW5lciAmJiBkZXRhaWxzLnNsYSkgewogICAgY29uc3QgcyA9IGRldGFpbHMuc2xhOwoKICAgIC8vIENsZWFyIGV4aXN0aW5nIGNvbnRlbnQgc2FmZWx5CiAgICB3aGlsZSAoc2xhQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHsKICAgICAgc2xhQ29udGFpbmVyLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgICB9CgogICAgLy8gQ3JlYXRlIG1haW4gY29udGFpbmVyCiAgICBjb25zdCBtYWluRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBtYWluRGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tYm9yZGVyKSc7CiAgICBtYWluRGl2LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc2cHgnOwogICAgbWFpbkRpdi5zdHlsZS5wYWRkaW5nID0gJzEwcHgnOwogICAgbWFpbkRpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWlucHV0LWJnKSc7CgogICAgLy8gQ3JlYXRlIGhlYWRlcgogICAgY29uc3QgaGVhZGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBoZWFkZXJEaXYuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgIGhlYWRlckRpdi5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdzcGFjZS1iZXR3ZWVuJzsKICAgIGhlYWRlckRpdi5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnOHB4JzsKICAgIGhlYWRlckRpdi5zdHlsZS5ib3JkZXJCb3R0b20gPSAnMXB4IHNvbGlkIHZhcigtLWJvcmRlciknOwogICAgaGVhZGVyRGl2LnN0eWxlLnBhZGRpbmdCb3R0b20gPSAnNHB4JzsKCiAgICBjb25zdCB0aXRsZVN0cm9uZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0cm9uZycpOwogICAgdGl0bGVTdHJvbmcuc3R5bGUuZm9udFNpemUgPSAnMTNweCc7CiAgICB0aXRsZVN0cm9uZy50ZXh0Q29udGVudCA9ICdTTEEgU3RhdHVzJzsKCiAgICBjb25zdCBzdGF0dXNTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgLy8gRXh0cmFjdCBuZXN0ZWQgdGVybmFyeSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CiAgICBsZXQgc3RhdHVzQ2xhc3M7CiAgICBpZiAocy5zdGF0dXMgPT09ICdwYXNzJykgewogICAgICBzdGF0dXNDbGFzcyA9ICdhY3RpdmUnOwogICAgfSBlbHNlIGlmIChzLnN0YXR1cyA9PT0gJ2ZhaWwnKSB7CiAgICAgIHN0YXR1c0NsYXNzID0gJ2Vycm9yJzsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXR1c0NsYXNzID0gJ3dhcm5pbmcnOwogICAgfQogICAgc3RhdHVzU3Bhbi5jbGFzc05hbWUgPSBgc3RhdHVzLWJhZGdlIHN0YXR1cy0ke3N0YXR1c0NsYXNzfWA7CiAgICBzdGF0dXNTcGFuLnRleHRDb250ZW50ID0gcy5zdGF0dXMudG9VcHBlckNhc2UoKTsKCiAgICBoZWFkZXJEaXYuYXBwZW5kQ2hpbGQodGl0bGVTdHJvbmcpOwogICAgaGVhZGVyRGl2LmFwcGVuZENoaWxkKHN0YXR1c1NwYW4pOwogICAgbWFpbkRpdi5hcHBlbmRDaGlsZChoZWFkZXJEaXYpOwoKICAgIC8vIENyZWF0ZSBjaGVja3MgY29udGFpbmVyCiAgICBjb25zdCBjaGVja3NEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNoZWNrc0Rpdi5jbGFzc05hbWUgPSAnc2xhLWNoZWNrcyc7CgogICAgaWYgKHMuY2hlY2tzICYmIE9iamVjdC5rZXlzKHMuY2hlY2tzKS5sZW5ndGggPiAwKSB7CiAgICAgIE9iamVjdC5lbnRyaWVzKHMuY2hlY2tzKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7CiAgICAgICAgLy8gRXh0cmFjdCBuZXN0ZWQgdGVybmFyeSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CiAgICAgICAgbGV0IGNvbG9yOwogICAgICAgIGlmICh2YWwuc3RhdHVzID09PSAncGFzcycpIHsKICAgICAgICAgIGNvbG9yID0gJ3ZhcigtLXN1Y2Nlc3MpJzsKICAgICAgICB9IGVsc2UgaWYgKHZhbC5zdGF0dXMgPT09ICdmYWlsJykgewogICAgICAgICAgY29sb3IgPSAndmFyKC0tZGFuZ2VyKSc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbG9yID0gJ3ZhcigtLXdhcm5pbmcpJzsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGNoZWNrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgY2hlY2tEaXYuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICBjaGVja0Rpdi5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdzcGFjZS1iZXR3ZWVuJzsKICAgICAgICBjaGVja0Rpdi5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JzsKICAgICAgICBjaGVja0Rpdi5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnNHB4JzsKCiAgICAgICAgY29uc3Qga2V5U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBrZXlTcGFuLnRleHRDb250ZW50ID0ga2V5OyAvLyBTYWZlOiB0ZXh0Q29udGVudAoKICAgICAgICBjb25zdCB2YWx1ZVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgdmFsdWVTcGFuLnN0eWxlLmNvbG9yID0gY29sb3I7CiAgICAgICAgdmFsdWVTcGFuLnRleHRDb250ZW50ID0gYCR7dmFsLnZhbHVlfSAobXNnOiAke3ZhbC5zdGF0dXN9KWA7IC8vIFNhZmU6IHRleHRDb250ZW50CgogICAgICAgIGNoZWNrRGl2LmFwcGVuZENoaWxkKGtleVNwYW4pOwogICAgICAgIGNoZWNrRGl2LmFwcGVuZENoaWxkKHZhbHVlU3Bhbik7CiAgICAgICAgY2hlY2tzRGl2LmFwcGVuZENoaWxkKGNoZWNrRGl2KTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBub0NoZWNrc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBub0NoZWNrc0Rpdi5jbGFzc05hbWUgPSAndGV4dC1tdXRlZCc7CiAgICAgIG5vQ2hlY2tzRGl2LnRleHRDb250ZW50ID0gJ05vIGNoZWNrcyc7CiAgICAgIGNoZWNrc0Rpdi5hcHBlbmRDaGlsZChub0NoZWNrc0Rpdik7CiAgICB9CgogICAgbWFpbkRpdi5hcHBlbmRDaGlsZChjaGVja3NEaXYpOwoKICAgIC8vIENyZWF0ZSBmb290ZXIKICAgIGNvbnN0IGZvb3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZm9vdGVyRGl2LnN0eWxlLm1hcmdpblRvcCA9ICc2cHgnOwogICAgZm9vdGVyRGl2LnN0eWxlLmZvbnRTaXplID0gJzEwcHgnOwogICAgZm9vdGVyRGl2LnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7CiAgICBmb290ZXJEaXYuc3R5bGUudGV4dEFsaWduID0gJ3JpZ2h0JzsKICAgIGZvb3RlckRpdi50ZXh0Q29udGVudCA9IGBFdmFsdWF0ZWQ6ICR7bmV3IERhdGUocy5ldmFsdWF0ZWRBdCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDsKCiAgICBtYWluRGl2LmFwcGVuZENoaWxkKGZvb3RlckRpdik7CiAgICBzbGFDb250YWluZXIuYXBwZW5kQ2hpbGQobWFpbkRpdik7CiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVRdWV1ZVN1bW1hcnkocXVldWVEYXRhKSB7CiAgaWYgKCFxdWV1ZURhdGEpIHJldHVybjsKICBjb25zdCBkcml2ZXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWV1ZS1kcml2ZXInKTsKICBjb25zdCB0b3RhbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1ZXVlLXRvdGFsJyk7CiAgY29uc3Qgam9ic0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1ZXVlLWpvYnMnKTsKICBjb25zdCBwcm9jZXNzaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVldWUtcHJvY2Vzc2luZycpOwogIGNvbnN0IGZhaWxlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1ZXVlLWZhaWxlZCcpOwoKICBpZiAoZHJpdmVyRWwpIGRyaXZlckVsLnRleHRDb250ZW50ID0gcXVldWVEYXRhLmRyaXZlciB8fCAnLSc7CiAgaWYgKHRvdGFsRWwpIHRvdGFsRWwudGV4dENvbnRlbnQgPSBTdHJpbmcocXVldWVEYXRhLnRvdGFsUXVldWVzID8/IDApOwogIGlmIChqb2JzRWwpIGpvYnNFbC50ZXh0Q29udGVudCA9IFN0cmluZyhxdWV1ZURhdGEudG90YWxKb2JzID8/IDApOwogIGlmIChwcm9jZXNzaW5nRWwpIHByb2Nlc3NpbmdFbC50ZXh0Q29udGVudCA9IFN0cmluZyhxdWV1ZURhdGEucHJvY2Vzc2luZ0pvYnMgPz8gMCk7CiAgaWYgKGZhaWxlZEVsKSBmYWlsZWRFbC50ZXh0Q29udGVudCA9IFN0cmluZyhxdWV1ZURhdGEuZmFpbGVkSm9icyA/PyAwKTsKfQoKZnVuY3Rpb24gdXBkYXRlRHJpdmVyRmlsdGVyKGRyaXZlcnMpIHsKICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJpdmVyLWZpbHRlcicpOwogIGlmICghc2VsZWN0IHx8ICFBcnJheS5pc0FycmF5KGRyaXZlcnMpKSByZXR1cm47CiAgY29uc3QgY3VycmVudFZhbHVlID0gc2VsZWN0LnZhbHVlOwoKICAvLyBDbGVhciBleGlzdGluZyBvcHRpb25zIHNhZmVseQogIHdoaWxlIChzZWxlY3QuZmlyc3RDaGlsZCkgewogICAgc2VsZWN0LmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgfQoKICAvLyBBZGQgIkFsbCBEcml2ZXJzIiBvcHRpb24KICBjb25zdCBhbGxPcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICBhbGxPcHRpb24udmFsdWUgPSAnJzsKICBhbGxPcHRpb24udGV4dENvbnRlbnQgPSAnQWxsIERyaXZlcnMnOwogIHNlbGVjdC5hcHBlbmRDaGlsZChhbGxPcHRpb24pOwogIGRyaXZlcnMuZm9yRWFjaCgoZHJpdmVyKSA9PiB7CiAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgIG9wdGlvbi52YWx1ZSA9IGRyaXZlcjsKICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IGRyaXZlci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGRyaXZlci5zbGljZSgxKTsKICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHRpb24pOwogIH0pOwogIGlmIChkcml2ZXJzLmluY2x1ZGVzKGN1cnJlbnRWYWx1ZSkpIHsKICAgIHNlbGVjdC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTsKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZURyaXZlcnNMaXN0KGRyaXZlcnMpIHsKICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyaXZlcnMtbGlzdCcpOwogIGlmICghbGlzdCkgcmV0dXJuOwoKICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50IHNhZmVseQogIHdoaWxlIChsaXN0LmZpcnN0Q2hpbGQpIHsKICAgIGxpc3QuZmlyc3RDaGlsZC5yZW1vdmUoKTsKICB9CiAgaWYgKCFBcnJheS5pc0FycmF5KGRyaXZlcnMpIHx8IGRyaXZlcnMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm47CiAgfQogIGRyaXZlcnMuZm9yRWFjaCgoZHJpdmVyKSA9PiB7CiAgICBjb25zdCBjaGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgY2hpcC5jbGFzc05hbWUgPSAnZHJpdmVyLWNoaXAnOwogICAgY2hpcC50ZXh0Q29udGVudCA9IGRyaXZlcjsKICAgIGxpc3QuYXBwZW5kQ2hpbGQoY2hpcCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVdvcmtlclJvdyh3b3JrZXIpIHsKICBjb25zdCBkZXRhaWxzSWQgPSBgZGV0YWlscy0ke3dvcmtlci5uYW1lLnJlcGxhY2VBbGwoL1teYS16MC05XS9naSwgJy0nKX1gOwoKICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwogIHJvdy5jbGFzc05hbWUgPSAnZXhwYW5kZXInOwogIHJvdy5kYXRhc2V0Lndvcmtlck5hbWUgPSB3b3JrZXIubmFtZTsKICByb3cuZGF0YXNldC53b3JrZXJEcml2ZXIgPSB3b3JrZXIuZHJpdmVyOwoKICAvLyBDcmVhdGUgY2VsbHMgdXNpbmcgaGVscGVyIGZ1bmN0aW9ucwogIGNvbnN0IG5hbWVDZWxsID0gY3JlYXRlTmFtZUNlbGwod29ya2VyLCBkZXRhaWxzSWQpOwogIGNvbnN0IHN0YXR1c0NlbGwgPSBjcmVhdGVTdGF0dXNDZWxsKHdvcmtlcik7CiAgY29uc3QgaGVhbHRoQ2VsbCA9IGNyZWF0ZUhlYWx0aENlbGwod29ya2VyKTsKICBjb25zdCBkcml2ZXJDZWxsID0gY3JlYXRlRHJpdmVyQ2VsbCh3b3JrZXIpOwogIGNvbnN0IHZlcnNpb25DZWxsID0gY3JlYXRlVmVyc2lvbkNlbGwod29ya2VyKTsKICBjb25zdCBwZXJmQ2VsbCA9IGNyZWF0ZVBlcmZvcm1hbmNlQ2VsbCgpOwogIGNvbnN0IGFjdGlvbkNlbGwgPSBjcmVhdGVBY3Rpb25DZWxsKHdvcmtlcik7CgogIC8vIEFwcGVuZCBhbGwgY2VsbHMgdG8gcm93CiAgcm93LmFwcGVuZENoaWxkKG5hbWVDZWxsKTsKICByb3cuYXBwZW5kQ2hpbGQoc3RhdHVzQ2VsbCk7CiAgcm93LmFwcGVuZENoaWxkKGhlYWx0aENlbGwpOwogIHJvdy5hcHBlbmRDaGlsZChkcml2ZXJDZWxsKTsKICByb3cuYXBwZW5kQ2hpbGQodmVyc2lvbkNlbGwpOwogIHJvdy5hcHBlbmRDaGlsZChwZXJmQ2VsbCk7CiAgcm93LmFwcGVuZENoaWxkKGFjdGlvbkNlbGwpOwoKICByZXR1cm4geyByb3csIGRldGFpbHNJZCB9Owp9CgpmdW5jdGlvbiBjcmVhdGVOYW1lQ2VsbCh3b3JrZXIsIGRldGFpbHNJZCkgewogIGNvbnN0IG5hbWVDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCiAgLy8gQ3JlYXRlIGV4cGFuZGFibGUgY29udGFpbmVyCiAgY29uc3QgbmFtZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIG5hbWVDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGAKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgYDsKICBuYW1lQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnb25jbGljaycsIGB0b2dnbGVEZXRhaWxzKCcke2RldGFpbHNJZH0nKWApOwogIG5hbWVDb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsICdDbGljayB0byBleHBhbmQgd29ya2VyIGRldGFpbHMnKTsKCiAgLy8gQWRkIGV4cGFuZC9jb2xsYXBzZSBpY29uCiAgY29uc3QgZXhwYW5kSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGV4cGFuZEljb24uY2xhc3NOYW1lID0gJ2V4cGFuZC1pY29uJzsKICBleHBhbmRJY29uLmlkID0gYGV4cGFuZC1pY29uLSR7ZGV0YWlsc0lkfWA7CiAgZXhwYW5kSWNvbi5pbm5lckhUTUwgPSBgCiAgICA8c3ZnIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICAgICA8cG9seWxpbmUgcG9pbnRzPSI5IDE4IDE1IDEyIDkgNiI+PC9wb2x5bGluZT4KICAgIDwvc3ZnPgogIGA7CiAgZXhwYW5kSWNvbi5zdHlsZS5jc3NUZXh0ID0gYAogICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTsKICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgICBmbGV4LXNocmluazogMDsKICBgOwoKICAvLyBBZGQgd29ya2VyIG5hbWUKICBjb25zdCBuYW1lRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgbmFtZURpdi5jbGFzc05hbWUgPSAnd29ya2VyLW5hbWUnOwogIG5hbWVEaXYudGV4dENvbnRlbnQgPSB3b3JrZXIubmFtZTsgLy8gU2FmZTogdGV4dENvbnRlbnQKCiAgLy8gQWRkIHF1ZXVlIG5hbWUKICBjb25zdCBxdWV1ZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIHF1ZXVlRGl2LmNsYXNzTmFtZSA9ICd3b3JrZXItcXVldWUnOwogIHF1ZXVlRGl2LnRleHRDb250ZW50ID0gd29ya2VyLnF1ZXVlTmFtZTsgLy8gU2FmZTogdGV4dENvbnRlbnQKICBxdWV1ZURpdi5zdHlsZS5tYXJnaW5MZWZ0ID0gJzI0cHgnOyAvLyBBbGlnbiB3aXRoIHdvcmtlciBuYW1lCgogIC8vIEFzc2VtYmxlIHRoZSBzdHJ1Y3R1cmUKICBuYW1lQ29udGFpbmVyLmFwcGVuZENoaWxkKGV4cGFuZEljb24pOwogIG5hbWVDb250YWluZXIuYXBwZW5kQ2hpbGQobmFtZURpdik7CgogIG5hbWVDZWxsLmFwcGVuZENoaWxkKG5hbWVDb250YWluZXIpOwogIG5hbWVDZWxsLmFwcGVuZENoaWxkKHF1ZXVlRGl2KTsKICByZXR1cm4gbmFtZUNlbGw7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVN0YXR1c0NlbGwod29ya2VyKSB7CiAgY29uc3Qgc3RhdHVzQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgY29uc3Qgc3RhdHVzU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICBzdGF0dXNTcGFuLmNsYXNzTmFtZSA9IGBzdGF0dXMtYmFkZ2Ugc3RhdHVzLSR7d29ya2VyLnN0YXR1c31gOwogIGNvbnN0IHN0YXR1c0RvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICBzdGF0dXNEb3QuY2xhc3NOYW1lID0gJ3N0YXR1cy1kb3QnOwogIGNvbnN0IHN0YXR1c1RleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgKICAgIHdvcmtlci5zdGF0dXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JrZXIuc3RhdHVzLnNsaWNlKDEpCiAgKTsKICBzdGF0dXNTcGFuLmFwcGVuZENoaWxkKHN0YXR1c0RvdCk7CiAgc3RhdHVzU3Bhbi5hcHBlbmRDaGlsZChzdGF0dXNUZXh0KTsKICBzdGF0dXNDZWxsLmFwcGVuZENoaWxkKHN0YXR1c1NwYW4pOwogIHJldHVybiBzdGF0dXNDZWxsOwp9CgpmdW5jdGlvbiBjcmVhdGVIZWFsdGhDZWxsKHdvcmtlcikgewogIGNvbnN0IGhlYWx0aENlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogIGNvbnN0IGhlYWx0aERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGhlYWx0aERpdi5jbGFzc05hbWUgPSAnaGVhbHRoLWluZGljYXRvcic7CiAgY29uc3QgaGVhbHRoRG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGhlYWx0aERvdC5jbGFzc05hbWUgPSBgaGVhbHRoLWRvdCBoZWFsdGgtJHt3b3JrZXIuaGVhbHRoLnN0YXR1c31gOwogIGNvbnN0IGhlYWx0aFRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgKICAgIHdvcmtlci5oZWFsdGguc3RhdHVzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29ya2VyLmhlYWx0aC5zdGF0dXMuc2xpY2UoMSkKICApOwogIGhlYWx0aERpdi5hcHBlbmRDaGlsZChoZWFsdGhEb3QpOwogIGhlYWx0aERpdi5hcHBlbmRDaGlsZChoZWFsdGhUZXh0KTsKICBoZWFsdGhDZWxsLmFwcGVuZENoaWxkKGhlYWx0aERpdik7CiAgcmV0dXJuIGhlYWx0aENlbGw7Cn0KCmZ1bmN0aW9uIGNyZWF0ZURyaXZlckNlbGwod29ya2VyKSB7CiAgY29uc3QgZHJpdmVyQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgY29uc3QgZHJpdmVyU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICBkcml2ZXJTcGFuLmNsYXNzTmFtZSA9ICdkcml2ZXItYmFkZ2UnOwogIGRyaXZlclNwYW4udGV4dENvbnRlbnQgPSB3b3JrZXIuZHJpdmVyOyAvLyBTYWZlOiB0ZXh0Q29udGVudAogIGRyaXZlckNlbGwuYXBwZW5kQ2hpbGQoZHJpdmVyU3Bhbik7CiAgcmV0dXJuIGRyaXZlckNlbGw7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVZlcnNpb25DZWxsKHdvcmtlcikgewogIGNvbnN0IHZlcnNpb25DZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICBjb25zdCB2ZXJzaW9uU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICB2ZXJzaW9uU3Bhbi5jbGFzc05hbWUgPSAndmVyc2lvbi1iYWRnZSc7CiAgdmVyc2lvblNwYW4udGV4dENvbnRlbnQgPSBgdiR7d29ya2VyLnZlcnNpb259YDsgLy8gU2FmZTogdGV4dENvbnRlbnQKICB2ZXJzaW9uQ2VsbC5hcHBlbmRDaGlsZCh2ZXJzaW9uU3Bhbik7CiAgcmV0dXJuIHZlcnNpb25DZWxsOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gc2FmZWx5IGV4dHJhY3QgcGVyZm9ybWFuY2UgbWV0cmljcwpmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZU1ldHJpY3Mod29ya2VyKSB7CiAgaWYgKCF3b3JrZXIpIHJldHVybiB7IHByb2Nlc3NlZDogMCwgYXZnVGltZTogMCwgbWVtb3J5OiAwIH07CgogIGNvbnN0IG1ldHJpY3MgPSB3b3JrZXIubWV0cmljcyB8fCB7fTsKICByZXR1cm4gewogICAgcHJvY2Vzc2VkOiBtZXRyaWNzLnByb2Nlc3NlZCB8fCB3b3JrZXIucHJvY2Vzc2VkIHx8IDAsCiAgICBhdmdUaW1lOiBtZXRyaWNzLmF2Z1RpbWUgfHwgd29ya2VyLmF2Z1RpbWUgfHwgMCwKICAgIG1lbW9yeTogbWV0cmljcy5tZW1vcnkgfHwgd29ya2VyLm1lbW9yeSB8fCAwLAogIH07Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcGVyZm9ybWFuY2UgaWNvbiBIVE1MCmZ1bmN0aW9uIGNyZWF0ZVBlcmZvcm1hbmNlSWNvbkh0bWwodHlwZSwgdmFsdWUsIHVuaXQpIHsKICBjb25zdCBpY29ucyA9IHsKICAgIHByb2Nlc3NlZDogYAogICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgICAgICAgPGxpbmUgeDE9IjEyIiB5MT0iMjAiIHgyPSIxMiIgeTI9IjEwIiAvPgogICAgICAgIDxsaW5lIHgxPSIxOCIgeTE9IjIwIiB4Mj0iMTgiIHkyPSI0IiAvPgogICAgICAgIDxsaW5lIHgxPSI2IiB5MT0iMjAiIHgyPSI2IiB5Mj0iMTYiIC8+CiAgICAgIDwvc3ZnPgogICAgYCwKICAgIHRpbWU6IGAKICAgICAgPHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICAgICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjEyIDYgMTIgMTIgMTYgMTQiIC8+CiAgICAgIDwvc3ZnPgogICAgYCwKICAgIG1lbW9yeTogYAogICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgICAgICAgPHJlY3QgeD0iNCIgeT0iNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiByeD0iMiIgcnk9IjIiIC8+CiAgICAgICAgPHJlY3QgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iNiIgLz4KICAgICAgICA8bGluZSB4MT0iOSIgeTE9IjEiIHgyPSI5IiB5Mj0iNCIgLz4KICAgICAgICA8bGluZSB4MT0iMTUiIHkxPSIxIiB4Mj0iMTUiIHkyPSI0IiAvPgogICAgICAgIDxsaW5lIHgxPSI5IiB5MT0iMjAiIHgyPSI5IiB5Mj0iMjMiIC8+CiAgICAgICAgPGxpbmUgeDE9IjE1IiB5MT0iMjAiIHgyPSIxNSIgeTI9IjIzIiAvPgogICAgICAgIDxsaW5lIHgxPSIyMCIgeTE9IjkiIHgyPSIyMyIgeTI9IjkiIC8+CiAgICAgICAgPGxpbmUgeDE9IjIwIiB5MT0iMTQiIHgyPSIyMyIgeTI9IjE0IiAvPgogICAgICAgIDxsaW5lIHgxPSIxIiB5MT0iOSIgeDI9IjQiIHkyPSI5IiAvPgogICAgICAgIDxsaW5lIHgxPSIxIiB5MT0iMTQiIHgyPSI0IiB5Mj0iMTQiIC8+CiAgICAgIDwvc3ZnPgogICAgYCwKICB9OwoKICBjb25zdCB0aXRsZXMgPSB7CiAgICBwcm9jZXNzZWQ6ICdQcm9jZXNzZWQgSm9icycsCiAgICB0aW1lOiAnQXZnIFRpbWUnLAogICAgbWVtb3J5OiAnTWVtb3J5IFVzYWdlJywKICB9OwoKICByZXR1cm4gYAogICAgPGRpdiBjbGFzcz0icGVyZi1pY29uICR7dHlwZX0iIHRpdGxlPSIke3RpdGxlc1t0eXBlXX0iPgogICAgICAke2ljb25zW3R5cGVdfQogICAgICA8c3Bhbj4ke3ZhbHVlfSR7dW5pdH08L3NwYW4+CiAgICA8L2Rpdj4KICBgOwp9CgpmdW5jdGlvbiBjcmVhdGVQZXJmb3JtYW5jZUNlbGwod29ya2VyKSB7CiAgY29uc3QgcGVyZkNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogIGNvbnN0IHBlcmZEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICBwZXJmRGl2LmNsYXNzTmFtZSA9ICdwZXJmb3JtYW5jZS1pY29ucyc7CgogIGNvbnN0IG1ldHJpY3MgPSBnZXRQZXJmb3JtYW5jZU1ldHJpY3Mod29ya2VyKTsKICBjb25zdCBwcm9jZXNzZWRWYWx1ZSA9IG1ldHJpY3MucHJvY2Vzc2VkID8gbWV0cmljcy5wcm9jZXNzZWQudG9Mb2NhbGVTdHJpbmcoKSA6ICcwJzsKCiAgcGVyZkRpdi5pbm5lckhUTUwgPSBgCiAgICAke2NyZWF0ZVBlcmZvcm1hbmNlSWNvbkh0bWwoJ3Byb2Nlc3NlZCcsIHByb2Nlc3NlZFZhbHVlLCAnJyl9CiAgICAke2NyZWF0ZVBlcmZvcm1hbmNlSWNvbkh0bWwoJ3RpbWUnLCBtZXRyaWNzLmF2Z1RpbWUsICdtcycpfQogICAgJHtjcmVhdGVQZXJmb3JtYW5jZUljb25IdG1sKCdtZW1vcnknLCBtZXRyaWNzLm1lbW9yeSwgJ01CJyl9CiAgYDsKCiAgcGVyZkNlbGwuYXBwZW5kQ2hpbGQocGVyZkRpdik7CiAgcmV0dXJuIHBlcmZDZWxsOwp9CgpmdW5jdGlvbiBjcmVhdGVBY3Rpb25DZWxsKHdvcmtlcikgewogIGNvbnN0IGFjdGlvbkNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogIGNvbnN0IGFjdGlvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGFjdGlvbkRpdi5jbGFzc05hbWUgPSAnYWN0aW9ucy1jZWxsJzsKCiAgLy8gVG9nZ2xlIHZpc2liaWxpdHkgYmFzZWQgb24gc3RhdHVzCiAgaWYgKHdvcmtlci5zdGF0dXMgPT09ICdydW5uaW5nJykgewogICAgY29uc3Qgc3RvcEJ0biA9IGNyZWF0ZUFjdGlvbkJ1dHRvbignc3RvcCcsICdTdG9wJywgKCkgPT4KICAgICAgc3RvcFdvcmtlcih3b3JrZXIubmFtZSwgd29ya2VyLmRyaXZlcikKICAgICk7CiAgICBhY3Rpb25EaXYuYXBwZW5kQ2hpbGQoc3RvcEJ0bik7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHN0YXJ0QnRuID0gY3JlYXRlQWN0aW9uQnV0dG9uKCdzdGFydCcsICdTdGFydCcsICgpID0+CiAgICAgIHN0YXJ0V29ya2VyKHdvcmtlci5uYW1lLCB3b3JrZXIuZHJpdmVyKQogICAgKTsKICAgIGFjdGlvbkRpdi5hcHBlbmRDaGlsZChzdGFydEJ0bik7CiAgfQoKICBjb25zdCByZXN0YXJ0QnRuID0gY3JlYXRlQWN0aW9uQnV0dG9uKCdyZXN0YXJ0JywgJ1Jlc3RhcnQnLCAoKSA9PgogICAgcmVzdGFydFdvcmtlcih3b3JrZXIubmFtZSwgd29ya2VyLmRyaXZlcikKICApOwogIGNvbnN0IGRlbGV0ZUJ0biA9IGNyZWF0ZUFjdGlvbkJ1dHRvbignZGVsZXRlJywgJ0RlbGV0ZScsICgpID0+CiAgICBkZWxldGVXb3JrZXIod29ya2VyLm5hbWUsIHdvcmtlci5kcml2ZXIpCiAgKTsKICBjb25zdCB2aWV3SnNvbkJ0biA9IGNyZWF0ZUFjdGlvbkJ1dHRvbigndmlldycsICdWaWV3IEpTT04nLCAoKSA9PgogICAgdmlld1dvcmtlckpzb24od29ya2VyLm5hbWUsIHdvcmtlci5kcml2ZXIpCiAgKTsKICBjb25zdCBlZGl0SnNvbkJ0biA9IGNyZWF0ZUFjdGlvbkJ1dHRvbignZWRpdCcsICdFZGl0IEpTT04nLCAoKSA9PgogICAgZWRpdFdvcmtlckpzb24od29ya2VyLm5hbWUsIHdvcmtlci5kcml2ZXIpCiAgKTsKCiAgYWN0aW9uRGl2LmFwcGVuZENoaWxkKHJlc3RhcnRCdG4pOwogIGFjdGlvbkRpdi5hcHBlbmRDaGlsZChkZWxldGVCdG4pOwogIGFjdGlvbkRpdi5hcHBlbmRDaGlsZCh2aWV3SnNvbkJ0bik7CiAgYWN0aW9uRGl2LmFwcGVuZENoaWxkKGVkaXRKc29uQnRuKTsKICBhY3Rpb25DZWxsLmFwcGVuZENoaWxkKGFjdGlvbkRpdik7CgogIHJldHVybiBhY3Rpb25DZWxsOwp9CgpmdW5jdGlvbiBjcmVhdGVBY3Rpb25CdXR0b24odHlwZSwgdGl0bGUsIG9uQ2xpY2tIYW5kbGVyKSB7CiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgYnV0dG9uLmNsYXNzTmFtZSA9IGBhY3Rpb24tYnRuICR7dHlwZX1gOwogIGJ1dHRvbi50aXRsZSA9IHRpdGxlOwogIGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIG9uQ2xpY2tIYW5kbGVyKCk7CiAgfTsKCiAgLy8gQ3JlYXRlIFNWRyBpY29uIGJhc2VkIG9uIGJ1dHRvbiB0eXBlCiAgY29uc3Qgc3ZnID0gY3JlYXRlQnV0dG9uSWNvbih0eXBlKTsKICBidXR0b24uYXBwZW5kQ2hpbGQoc3ZnKTsKCiAgcmV0dXJuIGJ1dHRvbjsKfQoKLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgc3BlY2lmaWMgU1ZHIGljb25zCmZ1bmN0aW9uIGNyZWF0ZVN0YXJ0SWNvbigpIHsKICBjb25zdCBzdmcgPSBjcmVhdGVTdmdFbGVtZW50KCk7CiAgY29uc3QgcG9seWdvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncG9seWdvbicpOwogIHBvbHlnb24uc2V0QXR0cmlidXRlKCdwb2ludHMnLCAnNSAzIDE5IDEyIDUgMjEgNSAzJyk7CiAgcG9seWdvbi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnY3VycmVudENvbG9yJyk7CiAgc3ZnLmFwcGVuZENoaWxkKHBvbHlnb24pOwogIHJldHVybiBzdmc7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVN0b3BJY29uKCkgewogIGNvbnN0IHN2ZyA9IGNyZWF0ZVN2Z0VsZW1lbnQoKTsKICBjb25zdCByZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7CiAgcmVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCAnMycpOwogIHJlY3Quc2V0QXR0cmlidXRlKCd5JywgJzMnKTsKICByZWN0LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTgnKTsKICByZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzE4Jyk7CiAgcmVjdC5zZXRBdHRyaWJ1dGUoJ3J4JywgJzInKTsKICByZWN0LnNldEF0dHJpYnV0ZSgncnknLCAnMicpOwogIHJlY3Quc2V0QXR0cmlidXRlKCdmaWxsJywgJ2N1cnJlbnRDb2xvcicpOwogIHN2Zy5hcHBlbmRDaGlsZChyZWN0KTsKICByZXR1cm4gc3ZnOwp9CgpmdW5jdGlvbiBjcmVhdGVSZXN0YXJ0SWNvbigpIHsKICBjb25zdCBzdmcgPSBjcmVhdGVTdmdFbGVtZW50KCk7CiAgY29uc3QgcG9seWxpbmUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwb2x5bGluZScpOwogIHBvbHlsaW5lMS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsICcyMyA0IDIzIDEwIDE3IDEwJyk7CiAgY29uc3QgcG9seWxpbmUyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwb2x5bGluZScpOwogIHBvbHlsaW5lMi5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsICcxIDIwIDEgMTQgNyAxNCcpOwogIGNvbnN0IHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTsKICBwYXRoLnNldEF0dHJpYnV0ZSgnZCcsICdNMy41MSA5YTkgOSAwIDAgMSAxNC44NS0zLjM2TDIzIDEwTTEgMTRsNC42NCA0LjM2QTkgOSAwIDAgMCAyMC40OSAxNScpOwogIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZTEpOwogIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZTIpOwogIHN2Zy5hcHBlbmRDaGlsZChwYXRoKTsKICByZXR1cm4gc3ZnOwp9CgpmdW5jdGlvbiBjcmVhdGVEZWxldGVJY29uKCkgewogIGNvbnN0IHN2ZyA9IGNyZWF0ZVN2Z0VsZW1lbnQoKTsKICBjb25zdCBkZWxldGVQb2x5bGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncG9seWxpbmUnKTsKICBkZWxldGVQb2x5bGluZS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsICczIDYgNSA2IDIxIDYnKTsKICBjb25zdCBkZWxldGVQYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7CiAgZGVsZXRlUGF0aC5zZXRBdHRyaWJ1dGUoCiAgICAnZCcsCiAgICAnTTE5IDZ2MTRhMiAyIDAgMCAxLTIgMkg3YTIgMiAwIDAgMS0yLTJWNm0zIDBWNGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYyJwogICk7CiAgY29uc3QgbGluZTEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2xpbmUnKTsKICBsaW5lMS5zZXRBdHRyaWJ1dGUoJ3gxJywgJzEwJyk7CiAgbGluZTEuc2V0QXR0cmlidXRlKCd5MScsICcxMScpOwogIGxpbmUxLnNldEF0dHJpYnV0ZSgneDInLCAnMTAnKTsKICBsaW5lMS5zZXRBdHRyaWJ1dGUoJ3kyJywgJzE3Jyk7CiAgY29uc3QgbGluZTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2xpbmUnKTsKICBsaW5lMi5zZXRBdHRyaWJ1dGUoJ3gxJywgJzE0Jyk7CiAgbGluZTIuc2V0QXR0cmlidXRlKCd5MScsICcxMScpOwogIGxpbmUyLnNldEF0dHJpYnV0ZSgneDInLCAnMTQnKTsKICBsaW5lMi5zZXRBdHRyaWJ1dGUoJ3kyJywgJzE3Jyk7CiAgc3ZnLmFwcGVuZENoaWxkKGRlbGV0ZVBvbHlsaW5lKTsKICBzdmcuYXBwZW5kQ2hpbGQoZGVsZXRlUGF0aCk7CiAgc3ZnLmFwcGVuZENoaWxkKGxpbmUxKTsKICBzdmcuYXBwZW5kQ2hpbGQobGluZTIpOwogIHJldHVybiBzdmc7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVZpZXdJY29uKCkgewogIGNvbnN0IHN2ZyA9IGNyZWF0ZVN2Z0VsZW1lbnQoKTsKICBjb25zdCBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7CiAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCAnTTEgMTJzNC04IDExLTggMTEgOCAxMSA4LTQgOC0xMSA4LTExLTgtMTEtOHonKTsKICBjb25zdCBjaXJjbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2NpcmNsZScpOwogIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N4JywgJzEyJyk7CiAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnY3knLCAnMTInKTsKICBjaXJjbGUuc2V0QXR0cmlidXRlKCdyJywgJzMnKTsKICBzdmcuYXBwZW5kQ2hpbGQocGF0aCk7CiAgc3ZnLmFwcGVuZENoaWxkKGNpcmNsZSk7CiAgcmV0dXJuIHN2ZzsKfQoKZnVuY3Rpb24gY3JlYXRlRWRpdEljb24oKSB7CiAgY29uc3Qgc3ZnID0gY3JlYXRlU3ZnRWxlbWVudCgpOwogIGNvbnN0IHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTsKICBwYXRoLnNldEF0dHJpYnV0ZSgnZCcsICdNMTEgNEg0YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0ydi03Jyk7CiAgY29uc3QgcGF0aDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTsKICBwYXRoMi5zZXRBdHRyaWJ1dGUoJ2QnLCAnTTE4LjUgMi41YTIuMTIxIDIuMTIxIDAgMCAxIDMgM0wxMiAxNWwtNCAxIDEtNCA5LjUtOS41eicpOwogIHN2Zy5hcHBlbmRDaGlsZChwYXRoKTsKICBzdmcuYXBwZW5kQ2hpbGQocGF0aDIpOwogIHJldHVybiBzdmc7Cn0KCi8vIENyZWF0ZSBiYXNlIFNWRyBlbGVtZW50IHdpdGggY29tbW9uIGF0dHJpYnV0ZXMKZnVuY3Rpb24gY3JlYXRlU3ZnRWxlbWVudCgpIHsKICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpOwogIHN2Zy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2ljb24nKTsKICBzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAyNCAyNCcpOwogIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpOwogIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdjdXJyZW50Q29sb3InKTsKICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMicpOwogIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgc3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVqb2luJywgJ3JvdW5kJyk7CiAgcmV0dXJuIHN2ZzsKfQoKZnVuY3Rpb24gY3JlYXRlQnV0dG9uSWNvbih0eXBlKSB7CiAgc3dpdGNoICh0eXBlKSB7CiAgICBjYXNlICdzdGFydCc6CiAgICAgIHJldHVybiBjcmVhdGVTdGFydEljb24oKTsKICAgIGNhc2UgJ3N0b3AnOgogICAgICByZXR1cm4gY3JlYXRlU3RvcEljb24oKTsKICAgIGNhc2UgJ3Jlc3RhcnQnOgogICAgICByZXR1cm4gY3JlYXRlUmVzdGFydEljb24oKTsKICAgIGNhc2UgJ2RlbGV0ZSc6CiAgICAgIHJldHVybiBjcmVhdGVEZWxldGVJY29uKCk7CiAgICBjYXNlICd2aWV3JzoKICAgICAgcmV0dXJuIGNyZWF0ZVZpZXdJY29uKCk7CiAgICBjYXNlICdlZGl0JzoKICAgICAgcmV0dXJuIGNyZWF0ZUVkaXRJY29uKCk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gY3JlYXRlU3ZnRWxlbWVudCgpOwogIH0KfQoKZnVuY3Rpb24gY3JlYXRlRGV0YWlsUm93KHdvcmtlciwgZGV0YWlsc0lkKSB7CiAgY29uc3QgZGV0YWlsUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKICBkZXRhaWxSb3cuY2xhc3NOYW1lID0gJ2V4cGFuZGFibGUtcm93JzsKICBkZXRhaWxSb3cuaWQgPSBkZXRhaWxzSWQ7CiAgZGV0YWlsUm93LmRhdGFzZXQud29ya2VyTmFtZSA9IHdvcmtlci5uYW1lOwogIGRldGFpbFJvdy5kYXRhc2V0LndvcmtlckRyaXZlciA9IHdvcmtlci5kcml2ZXI7CgogIC8vIERlbGVnYXRlIEhUTUwgY3JlYXRpb24gdG8gc3BlY2lhbGl6ZWQgZnVuY3Rpb24KICBkZXRhaWxSb3cuaW5uZXJIVE1MID0gY3JlYXRlRGV0YWlsUm93SFRNTCh3b3JrZXIpOwoKICByZXR1cm4gZGV0YWlsUm93Owp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBIVE1MCmZ1bmN0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKHdvcmtlcikgewogIHJldHVybiBgCiAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtc2VjdGlvbiI+CiAgICAgIDxoND5Db25maWd1cmF0aW9uPC9oND4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPlF1ZXVlIE5hbWU8L3NwYW4+CiAgICAgICAgPHNwYW4gZGF0YS1rZXk9ImNvbmZpZ3VyYXRpb24ucXVldWVOYW1lIj4ke3dvcmtlci5xdWV1ZU5hbWV9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPldvcmtlciBOYW1lPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJjb25maWd1cmF0aW9uLm5hbWUiPiR7d29ya2VyLm5hbWV9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPkRyaXZlcjwvc3Bhbj4KICAgICAgICA8c3BhbiBkYXRhLWtleT0iY29uZmlndXJhdGlvbi5kcml2ZXIiPiR7d29ya2VyLmRyaXZlcn08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+VmVyc2lvbjwvc3Bhbj4KICAgICAgICA8c3BhbiBkYXRhLWtleT0iY29uZmlndXJhdGlvbi52ZXJzaW9uIj52JHt3b3JrZXIudmVyc2lvbn08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+QXV0byBTdGFydDwvc3Bhbj4KICAgICAgICA8bGFiZWwgY2xhc3M9ImF1dG8tc3RhcnQtdG9nZ2xlIiBvbmNsaWNrPSJldmVudC5zdG9wUHJvcGFnYXRpb24oKSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giICR7d29ya2VyLmF1dG9TdGFydCA/ICdjaGVja2VkJyA6ICcnfSBvbmNoYW5nZT0idG9nZ2xlQXV0b1N0YXJ0KCcke3dvcmtlci5uYW1lfScsICcke3dvcmtlci5kcml2ZXJ9JywgdGhpcy5jaGVja2VkKSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idG9nZ2xlLXNsaWRlciI+PC9zcGFuPgogICAgICAgIDwvbGFiZWw+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+U3RhdHVzPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJjb25maWd1cmF0aW9uLnN0YXR1cyI+JHt3b3JrZXIuc3RhdHVzfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIFBlcmZvcm1hbmNlIE1ldHJpY3Mgc2VjdGlvbiBIVE1MCmZ1bmN0aW9uIGNyZWF0ZVBlcmZvcm1hbmNlTWV0cmljc1NlY3Rpb24od29ya2VyKSB7CiAgcmV0dXJuIGAKICAgIDxkaXYgY2xhc3M9ImRldGFpbC1zZWN0aW9uIj4KICAgICAgPGg0PlBlcmZvcm1hbmNlIE1ldHJpY3M8L2g0PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+UHJvY2Vzc2VkIEpvYnM8L3NwYW4+CiAgICAgICAgPHNwYW4gZGF0YS1rZXk9Im1ldHJpY3MucHJvY2Vzc2VkIj4ke3dvcmtlci5wcm9jZXNzZWQudG9Mb2NhbGVTdHJpbmcoKX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+RmFpbGVkIEpvYnM8L3NwYW4+CiAgICAgICAgPHNwYW4gZGF0YS1rZXk9Im1ldHJpY3MuZmFpbGVkIj4ke3dvcmtlci5mYWlsZWQgfHwgMH08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+QXZlcmFnZSBUaW1lPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJtZXRyaWNzLmF2Z1RpbWUiPiR7d29ya2VyLmF2Z1RpbWV9bXM8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+TWVtb3J5IFVzYWdlPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJtZXRyaWNzLm1lbW9yeSI+JHt3b3JrZXIubWVtb3J5fU1CPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPkNQVSBVc2FnZTwvc3Bhbj4KICAgICAgICA8c3BhbiBkYXRhLWtleT0ibWV0cmljcy5jcHUiPiR7d29ya2VyLmNwdSB8fCAnTi9BJ308L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+VXB0aW1lPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJtZXRyaWNzLnVwdGltZSI+JHt3b3JrZXIudXB0aW1lIHx8ICdOL0EnfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIEhlYWx0aCAmIFN0YXR1cyBzZWN0aW9uIEhUTUwKZnVuY3Rpb24gY3JlYXRlSGVhbHRoU3RhdHVzU2VjdGlvbih3b3JrZXIpIHsKICByZXR1cm4gYAogICAgPGRpdiBjbGFzcz0iZGV0YWlsLXNlY3Rpb24iPgogICAgICA8aDQ+SGVhbHRoICYgU3RhdHVzPC9oND4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPkhlYWx0aCBTdGF0dXM8L3NwYW4+CiAgICAgICAgPHNwYW4gZGF0YS1rZXk9ImhlYWx0aC5zdGF0dXMiPiR7d29ya2VyLmhlYWx0aD8uc3RhdHVzIHx8ICd1bmtub3duJ308L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+TGFzdCBDaGVjazwvc3Bhbj4KICAgICAgICA8c3BhbiBkYXRhLWtleT0iaGVhbHRoLmxhc3RDaGVjayIgY2xhc3M9Imxhc3QtY2hlY2siPiR7Zm9ybWF0VGltZUFnbyh3b3JrZXIuaGVhbHRoPy5sYXN0Q2hlY2spfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRldGFpbC1pdGVtIj4KICAgICAgICA8c3Bhbj5IZWFsdGggQ2hlY2tzPC9zcGFuPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWx0aC1jaGVja3MiPgogICAgICAgICAgJHtyZW5kZXJIZWFsdGhDaGVja3Mod29ya2VyLmhlYWx0aD8uY2hlY2tzKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRldGFpbC1pdGVtIj4KICAgICAgICA8c3Bhbj5Xb3JrZXIgU3RhdHVzPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJzdGF0dXMiIGNsYXNzPSJzdGF0dXMtYmFkZ2Ugc3RhdHVzLSR7d29ya2VyLnN0YXR1c30iPiR7d29ya2VyLnN0YXR1c308L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYDsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHJlbmRlciBoZWFsdGggY2hlY2tzCmZ1bmN0aW9uIHJlbmRlckhlYWx0aENoZWNrcyhjaGVja3MpIHsKICBpZiAoIWNoZWNrcyB8fCAhQXJyYXkuaXNBcnJheShjaGVja3MpIHx8IGNoZWNrcy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiAnPHNwYW4gY2xhc3M9Im5vLWNoZWNrcyI+Tm8gaGVhbHRoIGNoZWNrcyBhdmFpbGFibGU8L3NwYW4+JzsKICB9CgogIHJldHVybiBjaGVja3MKICAgIC5tYXAoCiAgICAgIChjaGVjaykgPT4gYAogICAgPGRpdiBjbGFzcz0iaGVhbHRoLWNoZWNrIj4KICAgICAgPHNwYW4gY2xhc3M9ImNoZWNrLW5hbWUiPiR7Y2hlY2submFtZX08L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjaGVjay1zdGF0dXMgc3RhdHVzLSR7Y2hlY2suc3RhdHVzfSI+JHtjaGVjay5zdGF0dXN9PC9zcGFuPgogICAgICAke2NoZWNrLm1lc3NhZ2UgPyBgPHNwYW4gY2xhc3M9ImNoZWNrLW1lc3NhZ2UiPiR7Y2hlY2subWVzc2FnZX08L3NwYW4+YCA6ICcnfQogICAgPC9kaXY+CiAgYAogICAgKQogICAgLmpvaW4oJycpOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IHRpbWUgYXMgImFnbyIKZnVuY3Rpb24gZm9ybWF0VGltZUFnbyh0aW1lc3RhbXApIHsKICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICdOZXZlcic7CgogIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7CiAgY29uc3QgY2hlY2tUaW1lID0gbmV3IERhdGUodGltZXN0YW1wKTsKICBjb25zdCBkaWZmTXMgPSBub3cgLSBjaGVja1RpbWU7CgogIGlmIChkaWZmTXMgPCAwKSByZXR1cm4gJ0p1c3Qgbm93JzsKCiAgY29uc3QgZGlmZlNlY29uZHMgPSBNYXRoLmZsb29yKGRpZmZNcyAvIDEwMDApOwogIGNvbnN0IGRpZmZNaW51dGVzID0gTWF0aC5mbG9vcihkaWZmU2Vjb25kcyAvIDYwKTsKICBjb25zdCBkaWZmSG91cnMgPSBNYXRoLmZsb29yKGRpZmZNaW51dGVzIC8gNjApOwogIGNvbnN0IGRpZmZEYXlzID0gTWF0aC5mbG9vcihkaWZmSG91cnMgLyAyNCk7CgogIGlmIChkaWZmU2Vjb25kcyA8IDYwKSB7CiAgICByZXR1cm4gZGlmZlNlY29uZHMgPD0gMSA/ICdKdXN0IG5vdycgOiBgJHtkaWZmU2Vjb25kc31zIGFnb2A7CiAgfSBlbHNlIGlmIChkaWZmTWludXRlcyA8IDYwKSB7CiAgICByZXR1cm4gYCR7ZGlmZk1pbnV0ZXN9bSBhZ29gOwogIH0gZWxzZSBpZiAoZGlmZkhvdXJzIDwgMjQpIHsKICAgIHJldHVybiBgJHtkaWZmSG91cnN9aCBhZ29gOwogIH0gZWxzZSBpZiAoZGlmZkRheXMgPCA3KSB7CiAgICByZXR1cm4gYCR7ZGlmZkRheXN9ZCBhZ29gOwogIH0gZWxzZSB7CiAgICByZXR1cm4gY2hlY2tUaW1lLnRvTG9jYWxlRGF0ZVN0cmluZygpOwogIH0KfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBSZWNlbnQgTG9ncyBzZWN0aW9uIEhUTUwKZnVuY3Rpb24gY3JlYXRlUmVjZW50TG9nc1NlY3Rpb24od29ya2VyKSB7CiAgcmV0dXJuIGAKICAgIDxkaXYgY2xhc3M9ImRldGFpbC1zZWN0aW9uIj4KICAgICAgPGg0PlJlY2VudCBMb2dzIChIaXN0b3J5KTwvaDQ+CiAgICAgIDxkaXYgY2xhc3M9InJlY2VudC1sb2dzLWNvbnRhaW5lciIgc3R5bGU9IgogICAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgICAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1iZyk7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICAiPgogICAgICAgIDxkaXYgY2xhc3M9ImxvZ3MtY29udGVudCI+CiAgICAgICAgICAkewogICAgICAgICAgICB3b3JrZXIuZGV0YWlscz8ucmVjZW50TG9ncwogICAgICAgICAgICAgID8ubWFwKAogICAgICAgICAgICAgICAgKGxvZykgPT4gYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2ctZW50cnkgbG9nLSR7bG9nLmxldmVsLnRvTG93ZXJDYXNlKCl9Ij4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibG9nLXRpbWVzdGFtcCI+WyR7bG9nLnRpbWVzdGFtcH1dPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsb2ctbGV2ZWwiPiR7bG9nLmxldmVsLnRvVXBwZXJDYXNlKCl9PC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsb2ctbWVzc2FnZSI+JHtsb2cubWVzc2FnZX08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYAogICAgICAgICAgICAgICkKICAgICAgICAgICAgICAuam9pbignJykgfHwgJzxkaXYgY2xhc3M9Im5vLWxvZ3MiPk5vIHJlY2VudCBsb2dzIGF2YWlsYWJsZTwvZGl2PicKICAgICAgICAgIH0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9CgpmdW5jdGlvbiBjcmVhdGVEZXRhaWxSb3dIVE1MKHdvcmtlcikgewogIHJldHVybiBgCiAgICAgICAgICA8dGQgY29sc3Bhbj0iNyIgY2xhc3M9ImRldGFpbHMtY2VsbCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRldGFpbHMtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlscy1ncmlkIj4KICAgICAgICAgICAgICAgICR7Y3JlYXRlQ29uZmlndXJhdGlvblNlY3Rpb24od29ya2VyKX0KICAgICAgICAgICAgICAgICR7Y3JlYXRlUGVyZm9ybWFuY2VNZXRyaWNzU2VjdGlvbih3b3JrZXIpfQogICAgICAgICAgICAgICAgJHtjcmVhdGVIZWFsdGhTdGF0dXNTZWN0aW9uKHdvcmtlcil9CiAgICAgICAgICAgICAgICAke2NyZWF0ZVJlY2VudExvZ3NTZWN0aW9uKHdvcmtlcil9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICBgOwp9CgpmdW5jdGlvbiByZW5kZXJXb3JrZXJzKGRhdGEpIHsKICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3b3JrZXJzLXRib2R5Jyk7CiAgaWYgKCF0Ym9keSkgcmV0dXJuOwoKICBjb25zdCBleHBhbmRlZFdvcmtlcnMgPSBuZXcgU2V0KAogICAgQXJyYXkuZnJvbSh0Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCcuZXhwYW5kYWJsZS1yb3cub3BlbicpKQogICAgICAubWFwKChyb3cpID0+IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkJyk/LnJlcGxhY2UoJ2RldGFpbHMtJywgJycpKQogICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgKTsKCiAgLy8gQ2xlYXIgZXhpc3RpbmcgY29udGVudCBzYWZlbHkKICB3aGlsZSAodGJvZHkuZmlyc3RDaGlsZCkgewogICAgdGJvZHkuZmlyc3RDaGlsZC5yZW1vdmUoKTsKICB9CgogIGlmICghZGF0YS53b3JrZXJzIHx8IGRhdGEud29ya2Vycy5sZW5ndGggPT09IDApIHsKICAgIGNvbnN0IG5vV29ya2Vyc1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CiAgICBjb25zdCBub1dvcmtlcnNDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIG5vV29ya2Vyc0NlbGwuY29sU3BhbiA9ICc3JzsKICAgIG5vV29ya2Vyc0NlbGwuY2xhc3NOYW1lID0gJ3RleHQtY2VudGVyIHAtNCc7CiAgICBub1dvcmtlcnNDZWxsLnRleHRDb250ZW50ID0gJ05vIHdvcmtlcnMgZm91bmQnOwogICAgbm9Xb3JrZXJzUm93LmFwcGVuZENoaWxkKG5vV29ya2Vyc0NlbGwpOwogICAgdGJvZHkuYXBwZW5kQ2hpbGQobm9Xb3JrZXJzUm93KTsKCiAgICB1cGRhdGVRdWV1ZVN1bW1hcnkoZGF0YS5xdWV1ZURhdGEpOwogICAgdXBkYXRlRHJpdmVyRmlsdGVyKGRhdGEuZHJpdmVycyk7CiAgICB1cGRhdGVEcml2ZXJzTGlzdChkYXRhLmRyaXZlcnMpOwogICAgdXBkYXRlUGFnaW5hdGlvbihkYXRhLnBhZ2luYXRpb24pOwogICAgcmV0dXJuOwogIH0KCiAgZGF0YS53b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgY29uc3QgeyByb3csIGRldGFpbHNJZCB9ID0gY3JlYXRlV29ya2VyUm93KHdvcmtlcik7CiAgICBjb25zdCBkZXRhaWxSb3cgPSBjcmVhdGVEZXRhaWxSb3cod29ya2VyLCBkZXRhaWxzSWQpOwoKICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gd29ya2VyLm5hbWUucmVwbGFjZUFsbCgvW15hLXowLTldL2dpLCAnLScpOwogICAgaWYgKGV4cGFuZGVkV29ya2Vycy5oYXMobm9ybWFsaXplZE5hbWUpKSB7CiAgICAgIGRldGFpbFJvdy5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7CiAgICAgIGVuc3VyZVdvcmtlckRldGFpbHMod29ya2VyLm5hbWUsIGRldGFpbFJvdywgd29ya2VyLmRyaXZlcik7CiAgICB9CgogICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTsKICAgIHRib2R5LmFwcGVuZENoaWxkKGRldGFpbFJvdyk7CiAgfSk7CgogIHVwZGF0ZVF1ZXVlU3VtbWFyeShkYXRhLnF1ZXVlRGF0YSk7CiAgdXBkYXRlRHJpdmVyRmlsdGVyKGRhdGEuZHJpdmVycyk7CiAgdXBkYXRlRHJpdmVyc0xpc3QoZGF0YS5kcml2ZXJzKTsKICB1cGRhdGVQYWdpbmF0aW9uKGRhdGEucGFnaW5hdGlvbik7Cn0KCmZ1bmN0aW9uIHRvZ2dsZURldGFpbHMocm93SWQpIHsKICBjb25zdCByb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyb3dJZCk7CiAgaWYgKHJvdykgewogICAgY29uc3QgaXNPcGVuID0gcm93LmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTsKCiAgICAvLyBSb3RhdGUgZXhwYW5kIGljb24KICAgIGNvbnN0IGV4cGFuZEljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgZXhwYW5kLWljb24tJHtyb3dJZH1gKTsKICAgIGlmIChleHBhbmRJY29uKSB7CiAgICAgIGV4cGFuZEljb24uc3R5bGUudHJhbnNmb3JtID0gaXNPcGVuID8gJ3JvdGF0ZSg5MGRlZyknIDogJ3JvdGF0ZSgwZGVnKSc7CiAgICB9CgogICAgaWYgKGlzT3BlbikgewogICAgICBjb25zdCB3b3JrZXJOYW1lID0gcm93LmRhdGFzZXQud29ya2VyTmFtZSB8fCByb3dJZC5yZXBsYWNlKCdkZXRhaWxzLScsICcnKTsKICAgICAgY29uc3Qgd29ya2VyRHJpdmVyID0gcm93LmRhdGFzZXQud29ya2VyRHJpdmVyOwogICAgICBlbnN1cmVXb3JrZXJEZXRhaWxzKHdvcmtlck5hbWUsIHJvdywgd29ya2VyRHJpdmVyKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2luYXRpb24ocGFnaW5hdGlvbikgewogIGN1cnJlbnRQYWdlID0gcGFnaW5hdGlvbi5wYWdlOwogIHRvdGFsUGFnZXMgPSBwYWdpbmF0aW9uLnRvdGFsUGFnZXM7CiAgdG90YWxXb3JrZXJzID0gcGFnaW5hdGlvbi50b3RhbDsKCiAgY29uc3Qgc3RhcnQgPSAocGFnaW5hdGlvbi5wYWdlIC0gMSkgKiBwYWdpbmF0aW9uLmxpbWl0ICsgMTsKICBjb25zdCBlbmQgPSBNYXRoLm1pbihwYWdpbmF0aW9uLnBhZ2UgKiBwYWdpbmF0aW9uLmxpbWl0LCBwYWdpbmF0aW9uLnRvdGFsKTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2luYXRpb24taW5mbycpLnRleHRDb250ZW50ID0KICAgIGBTaG93aW5nICR7dG90YWxXb3JrZXJzID09PSAwID8gMCA6IHN0YXJ0fS0ke2VuZH0gb2YgJHt0b3RhbFdvcmtlcnN9IHdvcmtlcnNgOwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldi1idG4nKS5kaXNhYmxlZCA9ICFwYWdpbmF0aW9uLmhhc1ByZXY7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25leHQtYnRuJykuZGlzYWJsZWQgPSAhcGFnaW5hdGlvbi5oYXNOZXh0OwoKICAvLyBVcGRhdGUgcGFnZSBudW1iZXJzCiAgY29uc3QgcGFnZU51bWJlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1udW1iZXJzJyk7CgogIC8vIENsZWFyIGV4aXN0aW5nIGNvbnRlbnQgc2FmZWx5CiAgd2hpbGUgKHBhZ2VOdW1iZXJzLmZpcnN0Q2hpbGQpIHsKICAgIHBhZ2VOdW1iZXJzLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgfQoKICBjb25zdCBzdGFydFBhZ2UgPSBNYXRoLm1heCgxLCBjdXJyZW50UGFnZSAtIDIpOwogIGNvbnN0IGVuZFBhZ2UgPSBNYXRoLm1pbih0b3RhbFBhZ2VzLCBjdXJyZW50UGFnZSArIDIpOwoKICBmb3IgKGxldCBpID0gc3RhcnRQYWdlOyBpIDw9IGVuZFBhZ2U7IGkrKykgewogICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICBidG4uY2xhc3NOYW1lID0gYHBhZ2UtYnRuICR7aSA9PT0gY3VycmVudFBhZ2UgPyAnYWN0aXZlJyA6ICcnfWA7CiAgICBidG4udGV4dENvbnRlbnQgPSBpLnRvU3RyaW5nKCk7CiAgICBidG4ub25jbGljayA9ICgpID0+IGdvVG9QYWdlKGkpOwogICAgcGFnZU51bWJlcnMuYXBwZW5kQ2hpbGQoYnRuKTsKICB9Cn0KCmZ1bmN0aW9uIGxvYWRQYWdlKGRpcmVjdGlvbikgewogIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2JyAmJiBjdXJyZW50UGFnZSA+IDEpIHsKICAgIGN1cnJlbnRQYWdlLS07CiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICduZXh0JyAmJiBjdXJyZW50UGFnZSA8IHRvdGFsUGFnZXMpIHsKICAgIGN1cnJlbnRQYWdlKys7CiAgfQogIGZldGNoRGF0YSgpOyAvLyBFbmFibGUgZm9yIHBhZ2luYXRpb24KfQoKZnVuY3Rpb24gZ29Ub1BhZ2UocGFnZSkgewogIGN1cnJlbnRQYWdlID0gcGFnZTsKICBmZXRjaERhdGEoKTsgLy8gRW5hYmxlIGZvciBwYWdpbmF0aW9uCn0KCi8vIFdvcmtlciBhY3Rpb25zCmFzeW5jIGZ1bmN0aW9uIHN0YXJ0V29ya2VyKG5hbWUsIGRyaXZlcikgewogIC8vIEZpbmQgYW5kIGRpc2FibGUgdGhlIHN0YXJ0IGJ1dHRvbiB0byBwcmV2ZW50IG11bHRpcGxlIGNsaWNrcwogIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYnV0dG9uW29uY2xpY2s9InN0YXJ0V29ya2VyKCcke25hbWV9JywgJyR7ZHJpdmVyfScpIl1gKTsKICBpZiAoc3RhcnRCdG4pIHsKICAgIHN0YXJ0QnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgIHN0YXJ0QnRuLnRleHRDb250ZW50ID0gJ1N0YXJ0aW5nLi4uJzsKICB9CgogIHRyeSB7CiAgICBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL3dvcmtlcnMvJHtuYW1lfS9zdGFydD9kcml2ZXI9JHtkcml2ZXJ9YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICAgIGZldGNoRGF0YSgpOyAvLyBSZWZyZXNoIGRhdGEgYWZ0ZXIgYWN0aW9uCiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgd29ya2VyOicsIGVycik7CiAgICAvLyBSZS1lbmFibGUgYnV0dG9uIG9uIGVycm9yCiAgICBpZiAoc3RhcnRCdG4pIHsKICAgICAgc3RhcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgc3RhcnRCdG4udGV4dENvbnRlbnQgPSAnU3RhcnQnOwogICAgfQogIH0KfQoKYXN5bmMgZnVuY3Rpb24gc3RvcFdvcmtlcihuYW1lLCBkcml2ZXIpIHsKICAvLyBGaW5kIGFuZCBkaXNhYmxlIHRoZSBzdG9wIGJ1dHRvbiB0byBwcmV2ZW50IG11bHRpcGxlIGNsaWNrcwogIGNvbnN0IHN0b3BCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBidXR0b25bb25jbGljaz0ic3RvcFdvcmtlcignJHtuYW1lfScsICcke2RyaXZlcn0nKSJdYCk7CiAgaWYgKHN0b3BCdG4pIHsKICAgIHN0b3BCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgc3RvcEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wcGluZy4uLic7CiAgfQoKICB0cnkgewogICAgYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS93b3JrZXJzLyR7bmFtZX0vc3RvcD9kcml2ZXI9JHtkcml2ZXJ9YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICAgIGZldGNoRGF0YSgpOyAvLyBSZWZyZXNoIGRhdGEgYWZ0ZXIgYWN0aW9uCiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RvcCB3b3JrZXI6JywgZXJyKTsKICAgIC8vIFJlLWVuYWJsZSBidXR0b24gb24gZXJyb3IKICAgIGlmIChzdG9wQnRuKSB7CiAgICAgIHN0b3BCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgc3RvcEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wJzsKICAgIH0KICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIHJlc3RhcnRXb3JrZXIobmFtZSwgZHJpdmVyKSB7CiAgLy8gRmluZCBhbmQgZGlzYWJsZSB0aGUgcmVzdGFydCBidXR0b24gdG8gcHJldmVudCBtdWx0aXBsZSBjbGlja3MKICBjb25zdCByZXN0YXJ0QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigKICAgIGBidXR0b25bb25jbGljaz0icmVzdGFydFdvcmtlcignJHtuYW1lfScsICcke2RyaXZlcn0nKSJdYAogICk7CiAgaWYgKHJlc3RhcnRCdG4pIHsKICAgIHJlc3RhcnRCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgcmVzdGFydEJ0bi50ZXh0Q29udGVudCA9ICdSZXN0YXJ0aW5nLi4uJzsKICB9CgogIHRyeSB7CiAgICBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL3dvcmtlcnMvJHtuYW1lfS9yZXN0YXJ0P2RyaXZlcj0ke2RyaXZlcn1gLCB7CiAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgfSk7CiAgICBmZXRjaERhdGEoKTsgLy8gUmVmcmVzaCBkYXRhIGFmdGVyIGFjdGlvbgogIH0gY2F0Y2ggKGVycikgewogICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlc3RhcnQgd29ya2VyOicsIGVycik7CiAgICAvLyBSZS1lbmFibGUgYnV0dG9uIG9uIGVycm9yCiAgICBpZiAocmVzdGFydEJ0bikgewogICAgICByZXN0YXJ0QnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgIHJlc3RhcnRCdG4udGV4dENvbnRlbnQgPSAnUmVzdGFydCc7CiAgICB9CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVXb3JrZXIobmFtZSwgZHJpdmVyKSB7CiAgaWYgKCFjb25maXJtKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHdvcmtlciAiJHtuYW1lfSI/IFRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuYCkpIHsKICAgIHJldHVybjsKICB9CiAgdHJ5IHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS93b3JrZXJzLyR7bmFtZX0/ZHJpdmVyPSR7ZHJpdmVyfWAsIHsKICAgICAgbWV0aG9kOiAnREVMRVRFJywKICAgIH0pOwogICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVsZXRlIHdvcmtlcicpOwogICAgZmV0Y2hEYXRhKCk7IC8vIFJlZnJlc2ggZGF0YSBhZnRlciBhY3Rpb24KICB9IGNhdGNoIChlcnIpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgd29ya2VyOicsIGVycik7CiAgICBhbGVydCgnRmFpbGVkIHRvIGRlbGV0ZSB3b3JrZXI6ICcgKyBlcnIubWVzc2FnZSk7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiB0b2dnbGVBdXRvU3RhcnQobmFtZSwgZHJpdmVyLCBlbmFibGVkKSB7CiAgdHJ5IHsKICAgIGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvd29ya2Vycy8ke25hbWV9L2F1dG8tc3RhcnQ/ZHJpdmVyPSR7ZHJpdmVyfWAsIHsKICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVuYWJsZWQgfSksCiAgICB9KTsKICB9IGNhdGNoIChlcnIpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byB0b2dnbGUgYXV0by1zdGFydDonLCBlcnIpOwogIH0KfQoKZnVuY3Rpb24gc2hvd0FkZFdvcmtlck1vZGFsKCkgewogIC8vIFRPRE86IEltcGxlbWVudCBhZGQgd29ya2VyIG1vZGFsCiAgYWxlcnQoJ0FkZCBXb3JrZXIgZnVuY3Rpb25hbGl0eSBjb21pbmcgc29vbiEnKTsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBtb2RhbCBvdmVybGF5CmZ1bmN0aW9uIGNyZWF0ZU1vZGFsT3ZlcmxheSgpIHsKICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIG1vZGFsLmNsYXNzTmFtZSA9ICdtb2RhbC1vdmVybGF5JzsKICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gYAogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHotaW5kZXg6IDEwMDA7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTsKICBgOwogIHJldHVybiBtb2RhbDsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBtb2RhbCBjb250ZW50CmZ1bmN0aW9uIGNyZWF0ZU1vZGFsQ29udGVudCgpIHsKICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgY29udGVudC5jbGFzc05hbWUgPSAnbW9kYWwtY29udGVudCBqc29uLW1vZGFsJzsKICBjb250ZW50LnN0eWxlLmNzc1RleHQgPSBgCiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICAgIHBhZGRpbmc6IDI0cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgbWF4LXdpZHRoOiA5MCU7CiAgICBtYXgtaGVpZ2h0OiA5MCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1sZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgbWluLXdpZHRoOiA0MDBweDsKICBgOwogIHJldHVybiBjb250ZW50Owp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIG1vZGFsIGhlYWRlcgpmdW5jdGlvbiBjcmVhdGVNb2RhbEhlYWRlcihuYW1lLCBvbkNsb3NlKSB7CiAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgaGVhZGVyLnN0eWxlLmNzc1RleHQgPSBgCiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGA7CgogIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTsKICB0aXRsZS50ZXh0Q29udGVudCA9IGBXb3JrZXIgSlNPTjogJHtuYW1lfWA7CiAgdGl0bGUuc3R5bGUuY3NzVGV4dCA9IGAKICAgIG1hcmdpbjogMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgYDsKCiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICBjbG9zZUJ0bi5pbm5lckhUTUwgPSBgCiAgICA8c3ZnIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgPGxpbmUgeDE9IjE4IiB5MT0iNiIgeDI9IjYiIHkyPSIxOCI+PC9saW5lPgogICAgICA8bGluZSB4MT0iNiIgeTE9IjYiIHgyPSIxOCIgeTI9IjE4Ij48L2xpbmU+CiAgICA8L3N2Zz4KICBgOwogIGNsb3NlQnRuLmNsYXNzTmFtZSA9ICdidG4tY2xvc2UnOwogIGNsb3NlQnRuLnN0eWxlLmNzc1RleHQgPSBgCiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6IHZhcigtLW11dGVkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzOwogIGA7CiAgY2xvc2VCdG4ub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICBjbG9zZUJ0bi5zdHlsZS5jb2xvciA9ICd2YXIoLS10ZXh0KSc7CiAgfTsKICBjbG9zZUJ0bi5vbm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkgewogICAgY2xvc2VCdG4uc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJzsKICB9OwogIGNsb3NlQnRuLm9uY2xpY2sgPSBvbkNsb3NlOwoKICBoZWFkZXIuYXBwZW5kQ2hpbGQodGl0bGUpOwogIGhlYWRlci5hcHBlbmRDaGlsZChjbG9zZUJ0bik7CiAgcmV0dXJuIGhlYWRlcjsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBKU09OIGRpc3BsYXkKZnVuY3Rpb24gY3JlYXRlSnNvbkRpc3BsYXkoanNvbkNvbnRlbnQpIHsKICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTsKICBwcmUudGV4dENvbnRlbnQgPSBqc29uQ29udGVudDsKICBwcmUuc3R5bGUuY3NzVGV4dCA9IGAKICAgIGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHBhZGRpbmc6IDE2cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIGZvbnQtZmFtaWx5OiAnU0YgTW9ubycsICdNb25hY28nLCAnSW5jb25zb2xhdGEnLCAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS41OwogICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogIGA7CiAgcmV0dXJuIHByZTsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBjb3B5IGJ1dHRvbgpmdW5jdGlvbiBjcmVhdGVDb3B5QnV0dG9uKGpzb25Db250ZW50KSB7CiAgY29uc3QgYWN0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGFjdGlvbnMuc3R5bGUuY3NzVGV4dCA9IGAKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDEycHg7CiAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBgOwoKICBjb25zdCBjb3B5QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgY29weUJ0bi5pbm5lckhUTUwgPSBgCiAgICA8c3ZnIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiA4cHg7Ij4KICAgICAgPHJlY3QgeD0iOSIgeT0iOSIgd2lkdGg9IjEzIiBoZWlnaHQ9IjEzIiByeD0iMiIgcnk9IjIiPjwvcmVjdD4KICAgICAgPHBhdGggZD0iTTUgMTVINGEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg5YTIgMiAwIDAgMSAyIDJ2MSI+PC9wYXRoPgogICAgPC9zdmc+CiAgICBDb3B5IEpTT04KICBgOwogIGNvcHlCdG4uY2xhc3NOYW1lID0gJ2J0bic7CiAgY29weUJ0bi5zdHlsZS5jc3NUZXh0ID0gYAogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgYDsKICBjb3B5QnRuLm9ubW91c2VvdmVyID0gZnVuY3Rpb24gKCkgewogICAgY29weUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudC1ob3ZlciknOwogIH07CiAgY29weUJ0bi5vbm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkgewogICAgY29weUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudCknOwogIH07CiAgY29weUJ0bi5vbmNsaWNrID0gYXN5bmMgKCkgPT4gewogICAgdHJ5IHsKICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoanNvbkNvbnRlbnQpOwogICAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBjb3B5QnRuLmlubmVySFRNTDsKICAgICAgY29weUJ0bi5pbm5lckhUTUwgPSBgCiAgICAgICAgPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3R5bGU9Im1hcmdpbi1yaWdodDogOHB4OyI+CiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPSIyMCA2IDkgMTcgNCAxMiI+PC9wb2x5bGluZT4KICAgICAgICA8L3N2Zz4KICAgICAgICBDb3BpZWQhCiAgICAgIGA7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGNvcHlCdG4uaW5uZXJIVE1MID0gb3JpZ2luYWxUZXh0OwogICAgICB9LCAyMDAwKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY29weTonLCBlcnIpOwogICAgfQogIH07CgogIGFjdGlvbnMuYXBwZW5kQ2hpbGQoY29weUJ0bik7CiAgcmV0dXJuIGFjdGlvbnM7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBzZXR1cCBtb2RhbCBldmVudCBoYW5kbGVycwpmdW5jdGlvbiBzZXR1cE1vZGFsSGFuZGxlcnMobW9kYWwpIHsKICAvLyBPbmx5IGNsb3NlIG9uIGV4cGxpY2l0IGNsb3NlIGJ1dHRvbiBjbGljayAtIG5vdCBvbiBiYWNrZHJvcCBjbGljayBvciBFU0MKICAvLyBUaGlzIGVuc3VyZXMgZGV2ZWxvcGVycyBpbnRlbnRpb25hbGx5IGNsb3NlIHRoZSBtb2RhbAoKICAvLyBQcmV2ZW50IGJvZHkgc2Nyb2xsIHdoZW4gbW9kYWwgaXMgb3BlbgogIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmUnLCAoKSA9PiB7CiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7CiAgfSk7Cn0KCi8vIFZpZXcgd29ya2VyIEpTT04gZGF0YQphc3luYyBmdW5jdGlvbiB2aWV3V29ya2VySnNvbihuYW1lLCBkcml2ZXIpIHsKICB0cnkgewogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL3dvcmtlcnMvJHtuYW1lfS9kZXRhaWxzP2RyaXZlcj0ke2RyaXZlcn1gKTsKICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggd29ya2VyIGRhdGEnKTsKICAgIH0KCiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgY29uc3QganNvbkNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTsKCiAgICAvLyBDcmVhdGUgbW9kYWwgY29tcG9uZW50cwogICAgY29uc3QgbW9kYWwgPSBjcmVhdGVNb2RhbE92ZXJsYXkoKTsKICAgIGNvbnN0IGNvbnRlbnQgPSBjcmVhdGVNb2RhbENvbnRlbnQoKTsKICAgIGNvbnN0IGhlYWRlciA9IGNyZWF0ZU1vZGFsSGVhZGVyKG5hbWUsICgpID0+IG1vZGFsLnJlbW92ZSgpKTsKICAgIGNvbnN0IGpzb25EaXNwbGF5ID0gY3JlYXRlSnNvbkRpc3BsYXkoanNvbkNvbnRlbnQpOwogICAgY29uc3QgY29weUJ1dHRvbiA9IGNyZWF0ZUNvcHlCdXR0b24oanNvbkNvbnRlbnQpOwoKICAgIC8vIEFzc2VtYmxlIG1vZGFsCiAgICBjb250ZW50LmFwcGVuZENoaWxkKGhlYWRlcik7CiAgICBjb250ZW50LmFwcGVuZENoaWxkKGpzb25EaXNwbGF5KTsKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoY29weUJ1dHRvbik7CiAgICBtb2RhbC5hcHBlbmRDaGlsZChjb250ZW50KTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9kYWwpOwoKICAgIC8vIFNldHVwIGV2ZW50IGhhbmRsZXJzCiAgICBzZXR1cE1vZGFsSGFuZGxlcnMobW9kYWwpOwogIH0gY2F0Y2ggKGVycikgewogICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHZpZXcgd29ya2VyIEpTT046JywgZXJyKTsKICAgIGFsZXJ0KCdGYWlsZWQgdG8gbG9hZCB3b3JrZXIgSlNPTjogJyArIGVyci5tZXNzYWdlKTsKICB9Cn0KCi8vIENyZWF0ZSBtb2RhbCBlbGVtZW50IHdpdGggYmFzaWMgc3R5bGluZwpmdW5jdGlvbiBjcmVhdGVNb2RhbCgpIHsKICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIG1vZGFsLnN0eWxlLmNzc1RleHQgPSBgCiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgei1pbmRleDogMTAwMDsKICBgOwogIHJldHVybiBtb2RhbDsKfQoKLy8gQ3JlYXRlIEpTT04gdGV4dGFyZWEgZm9yIGVkaXRpbmcKZnVuY3Rpb24gY3JlYXRlSnNvblRleHRhcmVhKGpzb25Db250ZW50KSB7CiAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogIHRleHRhcmVhLnZhbHVlID0ganNvbkNvbnRlbnQ7CiAgdGV4dGFyZWEuc3R5bGUuY3NzVGV4dCA9IGAKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA0MDBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHJlc2l6ZTogdmVydGljYWw7CiAgYDsKICByZXR1cm4gdGV4dGFyZWE7Cn0KCi8vIENyZWF0ZSBzYXZlIGFuZCBjYW5jZWwgYnV0dG9ucwpmdW5jdGlvbiBjcmVhdGVFZGl0QnV0dG9ucyhtb2RhbCwgdGV4dGFyZWEsIG5hbWUsIGRyaXZlcikgewogIGNvbnN0IGJ1dHRvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGJ1dHRvbkRpdi5zdHlsZS5jc3NUZXh0ID0gYAogICAgbWFyZ2luLXRvcDogMTVweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDEwcHg7CiAgYDsKCiAgY29uc3Qgc2F2ZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSc7CiAgc2F2ZUJ0bi5zdHlsZS5jc3NUZXh0ID0gYAogICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiAjMjhhNzQ1OwogICAgY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogIGA7CgogIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdDYW5jZWwnOwogIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gYAogICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiAjNmM3NTdkOwogICAgY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogIGA7CiAgY2FuY2VsQnRuLm9uY2xpY2sgPSAoKSA9PiBtb2RhbC5yZW1vdmUoKTsKCiAgc2F2ZUJ0bi5vbmNsaWNrID0gYXN5bmMgKCkgPT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBKU09OLnBhcnNlKHRleHRhcmVhLnZhbHVlKTsKICAgICAgLy8gVXNlIHRoZSBuZXcgZWRpdCBlbmRwb2ludCB0aGF0IGhhcyB3aXRoQ3JlYXRlV29ya2VyVmFsaWRhdGlvbgogICAgICBjb25zdCB1cGRhdGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvd29ya2Vycy8ke25hbWV9L2VkaXQ/ZHJpdmVyPSR7ZHJpdmVyfWAsIHsKICAgICAgICBtZXRob2Q6ICdQVVQnLAogICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHVwZGF0ZWREYXRhKSwKICAgICAgfSk7CgogICAgICBpZiAoIXVwZGF0ZVJlc3BvbnNlLm9rKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIHdvcmtlcicpOwogICAgICB9CgogICAgICBhbGVydCgnV29ya2VyIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IScpOwogICAgICBtb2RhbC5yZW1vdmUoKTsKICAgICAgZmV0Y2hEYXRhKCk7IC8vIFJlZnJlc2ggZGF0YSBhZnRlciBhY3Rpb24KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGFsZXJ0KCdJbnZhbGlkIEpTT046ICcgKyBlcnJvci5tZXNzYWdlKTsKICAgIH0KICB9OwoKICBidXR0b25EaXYuYXBwZW5kQ2hpbGQoc2F2ZUJ0bik7CiAgYnV0dG9uRGl2LmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7CiAgcmV0dXJuIGJ1dHRvbkRpdjsKfQoKLy8gRWRpdCB3b3JrZXIgSlNPTiBkYXRhCmFzeW5jIGZ1bmN0aW9uIGVkaXRXb3JrZXJKc29uKG5hbWUsIGRyaXZlcikgewogIHRyeSB7CiAgICAvLyBHZXQgZGlyZWN0IGRyaXZlciBkYXRhIGZvciBlZGl0aW5nIChyYXcgcGVyc2lzdGVkIGRhdGEgd2l0aG91dCBlbnJpY2htZW50KQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL3dvcmtlcnMvJHtuYW1lfS9kcml2ZXItZGF0YT9kcml2ZXI9JHtkcml2ZXJ9YCk7CiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIHdvcmtlciBkcml2ZXIgZGF0YScpOwogICAgfQoKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICBjb25zdCBqc29uQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEuZGF0YSwgbnVsbCwgMik7CgogICAgLy8gQ3JlYXRlIG1vZGFsIGNvbXBvbmVudHMKICAgIGNvbnN0IG1vZGFsID0gY3JlYXRlTW9kYWwoKTsKICAgIGNvbnN0IGNvbnRlbnQgPSBjcmVhdGVNb2RhbENvbnRlbnQoKTsKICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTsKICAgIHRpdGxlLnRleHRDb250ZW50ID0gYEVkaXQgV29ya2VyIEpTT046ICR7bmFtZX1gOwogICAgdGl0bGUuc3R5bGUubWFyZ2luQm90dG9tID0gJzE1cHgnOwoKICAgIC8vIEFkZCB3YXJuaW5nIGFib3V0IGltbXV0YWJsZSBmaWVsZHMKICAgIGNvbnN0IHdhcm5pbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHdhcm5pbmcuc3R5bGUuY3NzVGV4dCA9IGAKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2FybmluZy1iZywgI2ZmZjNjZCk7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXdhcm5pbmctYm9yZGVyLCAjZmZlYWE3KTsKICAgICAgY29sb3I6IHZhcigtLXdhcm5pbmctdGV4dCwgIzg1NjQwNCk7CiAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgYDsKICAgIHdhcm5pbmcuaW5uZXJIVE1MID0gYAogICAgICA8c3Ryb25nPuKaoO+4jyBOb3RlOjwvc3Ryb25nPiBXb3JrZXIgbmFtZSAoPGNvZGU+JHtuYW1lfTwvY29kZT4pIGFuZCBkcml2ZXIgKDxjb2RlPiR7ZHJpdmVyfTwvY29kZT4pIGNhbm5vdCBiZSBjaGFuZ2VkLgogICAgICBPbmx5IG90aGVyIGNvbmZpZ3VyYXRpb24gZmllbGRzIGNhbiBiZSBtb2RpZmllZC4KICAgIGA7CgogICAgY29uc3QgdGV4dGFyZWEgPSBjcmVhdGVKc29uVGV4dGFyZWEoanNvbkNvbnRlbnQpOwogICAgY29uc3QgYnV0dG9uRGl2ID0gY3JlYXRlRWRpdEJ1dHRvbnMobW9kYWwsIHRleHRhcmVhLCBuYW1lLCBkcml2ZXIpOwoKICAgIC8vIEFzc2VtYmxlIG1vZGFsCiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRpdGxlKTsKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQod2FybmluZyk7CiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRleHRhcmVhKTsKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoYnV0dG9uRGl2KTsKICAgIG1vZGFsLmFwcGVuZENoaWxkKGNvbnRlbnQpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7CgogICAgLy8gT25seSBjbG9zZSBvbiBleHBsaWNpdCBjbG9zZSBidXR0b24gY2xpY2sgLSBub3Qgb24gYmFja2Ryb3AgY2xpY2sgb3IgRVNDCiAgICAvLyBUaGlzIGVuc3VyZXMgZGV2ZWxvcGVycyBpbnRlbnRpb25hbGx5IGNsb3NlIHRoZSBtb2RhbAoKICAgIC8vIFByZXZlbnQgYm9keSBzY3JvbGwgd2hlbiBtb2RhbCBpcyBvcGVuCiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CiAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmUnLCAoKSA9PiB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsKICAgIH0pOwogIH0gY2F0Y2ggKGVycikgewogICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGVkaXQgd29ya2VyIEpTT046JywgZXJyKTsKICAgIGFsZXJ0KCdGYWlsZWQgdG8gbG9hZCB3b3JrZXIgSlNPTjogJyArIGVyci5tZXNzYWdlKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUF1dG9SZWZyZXNoKCkgewogIHNldEF1dG9SZWZyZXNoKCFhdXRvUmVmcmVzaEVuYWJsZWQpOwp9CgpmdW5jdGlvbiBzZXR1cEV2ZW50U3RyZWFtKCkgewogIGlmICghZ2xvYmFsVGhpcy53aW5kb3cuRXZlbnRTb3VyY2UpIHJldHVybjsKCiAgaWYgKGV2ZW50U291cmNlKSB7CiAgICBldmVudFNvdXJjZS5jbG9zZSgpOwogICAgZXZlbnRTb3VyY2UgPSBudWxsOwogIH0KCiAgLy8gR2V0IGN1cnJlbnQgc29ydCBwYXJhbWV0ZXJzIHRvIG1hdGNoIGZldGNoRGF0YQogIGNvbnN0IHNvcnRCeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb3J0LXNlbGVjdCcpPy52YWx1ZSB8fCAnc3RhdHVzJzsKICBjb25zdCBzb3J0T3JkZXIgPSAnYXNjJzsKICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzLWZpbHRlcicpPy52YWx1ZSB8fCAnJzsKICBjb25zdCBkcml2ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJpdmVyLWZpbHRlcicpPy52YWx1ZSB8fCAnJzsKICBjb25zdCBzZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoLWlucHV0Jyk/LnZhbHVlIHx8ICcnOwoKICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsKICAgIHNvcnRCeSwKICAgIHNvcnRPcmRlciwKICAgIHN0YXR1cywKICAgIGRyaXZlciwKICAgIHNlYXJjaCwKICB9KTsKCiAgZXZlbnRTb3VyY2UgPSBuZXcgZ2xvYmFsVGhpcy53aW5kb3cuRXZlbnRTb3VyY2UoCiAgICBBUElfQkFTRSArICcvYXBpL3dvcmtlcnMvZXZlbnRzPycgKyBwYXJhbXMudG9TdHJpbmcoKQogICk7CgogIGV2ZW50U291cmNlLm9ub3BlbiA9ICgpID0+IHsKICAgIHNzZUFjdGl2ZSA9IHRydWU7CiAgICBpZiAocmVmcmVzaFRpbWVyKSB7CiAgICAgIGNsZWFySW50ZXJ2YWwocmVmcmVzaFRpbWVyKTsKICAgICAgcmVmcmVzaFRpbWVyID0gbnVsbDsKICAgIH0KICB9OwoKICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSAoZXZ0KSA9PiB7CiAgICBjb25zdCBlbGVtZW50cyA9IGdldERvbUVsZW1lbnRzKCk7CgogICAgdHJ5IHsKICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZ0LmRhdGEpOwogICAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLnR5cGUgPT09ICdzbmFwc2hvdCcpIHsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGlmIChub3cgLSBsYXN0U3NlUmVmcmVzaCA8IDQwMDApIHJldHVybjsKICAgICAgICBsYXN0U3NlUmVmcmVzaCA9IG5vdzsKICAgICAgICAvLyBVc2UgU1NFIGRhdGEgdG8gdXBkYXRlIHRoZSBwYWdlCiAgICAgICAgaWYgKHBheWxvYWQud29ya2VycykgewogICAgICAgICAgcmVuZGVyV29ya2VycyhwYXlsb2FkLndvcmtlcnMpOwogICAgICAgICAgLy8gSGlkZSBsb2FkaW5nIHN0YXRlIGlmIGl0J3Mgc2hvd2luZwogICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5zbmFwc2hvdCkgewogICAgICAgICAgLy8gSGFuZGxlIHF1ZXVlIHNuYXBzaG90IGV2ZW50cyAoZGlmZmVyZW50IGZvcm1hdCkKICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdRdWV1ZSBzbmFwc2hvdCByZWNlaXZlZCwgbm90IHVwZGF0aW5nIHdvcmtlcnMgVUknKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBheWxvYWQubW9uaXRvcmluZykgewogICAgICAgICAgLy8gSGFuZGxlIHF1ZXVlIG1vbml0b3JpbmcgZXZlbnRzIChkaWZmZXJlbnQgZm9ybWF0KQogICAgICAgIH0KICAgICAgfQogICAgICBoaWRlTG9hZGluZ1N0YXRlKGVsZW1lbnRzKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBoaWRlTG9hZGluZ1N0YXRlKGVsZW1lbnRzKTsKICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBhcnNlIFNTRSBwYXlsb2FkJywgZXJyKTsKICAgIH0KICB9OwoKICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4gewogICAgaWYgKGV2ZW50U291cmNlKSB7CiAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CiAgICAgIGV2ZW50U291cmNlID0gbnVsbDsKICAgIH0KICAgIHNzZUFjdGl2ZSA9IGZhbHNlOwogIH07Cn0KCi8vIEhlbHBlciBmdW5jdGlvbnMgdG8gcmVkdWNlIGNvbXBsZXhpdHkKZnVuY3Rpb24gY2xlYXJSZWZyZXNoVGltZXIoKSB7CiAgaWYgKHJlZnJlc2hUaW1lcikgewogICAgY2xlYXJJbnRlcnZhbChyZWZyZXNoVGltZXIpOwogICAgcmVmcmVzaFRpbWVyID0gbnVsbDsKICB9Cn0KCmZ1bmN0aW9uIGRpc2FibGVFdmVudFN0cmVhbSgpIHsKICBpZiAoZXZlbnRTb3VyY2UpIHsKICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CiAgICBldmVudFNvdXJjZSA9IG51bGw7CiAgfQogIHNzZUFjdGl2ZSA9IGZhbHNlOwp9CgpmdW5jdGlvbiBlbmFibGVFdmVudFN0cmVhbU9yUG9sbGluZygpIHsKICBpZiAoZ2xvYmFsVGhpcy53aW5kb3cuRXZlbnRTb3VyY2UpIHsKICAgIHNldHVwRXZlbnRTdHJlYW0oKTsKICB9IGVsc2UgaWYgKCFzc2VBY3RpdmUgJiYgYXV0b1JlZnJlc2hFbmFibGVkKSB7CiAgICByZWZyZXNoVGltZXIgPSBzZXRJbnRlcnZhbChmZXRjaERhdGEsIDMwMDAwKTsgLy8gQ29tbWVudGVkIG91dCAtIFNTRSBzaG91bGQgYmUgcHJpbWFyeQogIH0KfQoKZnVuY3Rpb24gY3JlYXRlUGF1c2VJY29uKGljb24pIHsKICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50CiAgd2hpbGUgKGljb24uZmlyc3RDaGlsZCkgewogICAgaWNvbi5maXJzdENoaWxkLnJlbW92ZSgpOwogIH0KICAvLyBDcmVhdGUgcGF1c2UgaWNvbgogIGNvbnN0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7CiAgc3ZnLnNldEF0dHJpYnV0ZSgndmlld0JveCcsICcwIDAgMjQgMjQnKTsKICBjb25zdCByZWN0MSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncmVjdCcpOwogIHJlY3QxLnNldEF0dHJpYnV0ZSgneCcsICc2Jyk7CiAgcmVjdDEuc2V0QXR0cmlidXRlKCd5JywgJzQnKTsKICByZWN0MS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzQnKTsKICByZWN0MS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxNicpOwogIGNvbnN0IHJlY3QyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7CiAgcmVjdDIuc2V0QXR0cmlidXRlKCd4JywgJzE0Jyk7CiAgcmVjdDIuc2V0QXR0cmlidXRlKCd5JywgJzQnKTsKICByZWN0Mi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzQnKTsKICByZWN0Mi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxNicpOwogIHN2Zy5hcHBlbmRDaGlsZChyZWN0MSk7CiAgc3ZnLmFwcGVuZENoaWxkKHJlY3QyKTsKICBpY29uLmFwcGVuZENoaWxkKHN2Zyk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVBsYXlJY29uKGljb24pIHsKICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50CiAgd2hpbGUgKGljb24uZmlyc3RDaGlsZCkgewogICAgaWNvbi5maXJzdENoaWxkLnJlbW92ZSgpOwogIH0KICAvLyBDcmVhdGUgcGxheSBpY29uCiAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTsKICBzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAyNCAyNCcpOwogIGNvbnN0IHBvbHlnb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BvbHlnb24nKTsKICBwb2x5Z29uLnNldEF0dHJpYnV0ZSgncG9pbnRzJywgJzUgMyAxOSAxMiA1IDIxIDUgMycpOwogIHN2Zy5hcHBlbmRDaGlsZChwb2x5Z29uKTsKICBpY29uLmFwcGVuZENoaWxkKHN2Zyk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVJlZnJlc2hCdXR0b24oZW5hYmxlZCkgewogIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRvLXJlZnJlc2gtdG9nZ2xlJyk7CiAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRvLXJlZnJlc2gtaWNvbicpOwogIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dG8tcmVmcmVzaC1sYWJlbCcpOwoKICBpZiAoIWJ0biB8fCAhaWNvbiB8fCAhbGFiZWwpIHJldHVybjsKCiAgaWYgKGVuYWJsZWQpIHsKICAgIGxhYmVsLnRleHRDb250ZW50ID0gJ1BhdXNlIFJlZnJlc2gnOwogICAgY3JlYXRlUGF1c2VJY29uKGljb24pOwogIH0gZWxzZSB7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICdBdXRvIFJlZnJlc2gnOwogICAgY3JlYXRlUGxheUljb24oaWNvbik7CiAgfQp9CgovLyBBdXRvLXJlZnJlc2ggLSBSZWZhY3RvcmVkIHRvIHJlZHVjZSBjb21wbGV4aXR5CmZ1bmN0aW9uIHNldEF1dG9SZWZyZXNoKGVuYWJsZWQpIHsKICBhdXRvUmVmcmVzaEVuYWJsZWQgPSBlbmFibGVkOwogIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFVVE9fUkVGUkVTSF9LRVksIGVuYWJsZWQudG9TdHJpbmcoKSk7CgogIGNsZWFyUmVmcmVzaFRpbWVyKCk7CgogIGlmICghZW5hYmxlZCkgewogICAgZGlzYWJsZUV2ZW50U3RyZWFtKCk7CiAgfQoKICBpZiAoZW5hYmxlZCkgewogICAgZW5hYmxlRXZlbnRTdHJlYW1PclBvbGxpbmcoKTsKICB9CgogIHVwZGF0ZVJlZnJlc2hCdXR0b24oZW5hYmxlZCk7Cn0KCi8vIEV2ZW50IGxpc3RlbmVycwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gewogIC8vIEluaXRpYWxpemUgdGhlbWUKICBjdXJyZW50VGhlbWUgPSBnZXRQcmVmZXJyZWRUaGVtZSgpOwogIGFwcGx5VGhlbWUoY3VycmVudFRoZW1lKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtdG9nZ2xlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVUaGVtZSk7CgogIC8vIFNldCB1cCBldmVudCBsaXN0ZW5lcnMKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzLWZpbHRlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgIGN1cnJlbnRQYWdlID0gMTsKICAgIHNldHVwRXZlbnRTdHJlYW0oKTsgLy8gUmVjb25uZWN0IFNTRSB3aXRoIG5ldyBmaWx0ZXJzCiAgICBmZXRjaERhdGEoKTsgLy8gRW5hYmxlIGZvciBzZWFyY2gvZmlsdGVyCiAgfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyaXZlci1maWx0ZXInKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICBjdXJyZW50UGFnZSA9IDE7CiAgICBzZXR1cEV2ZW50U3RyZWFtKCk7IC8vIFJlY29ubmVjdCBTU0Ugd2l0aCBuZXcgZmlsdGVycwogICAgZmV0Y2hEYXRhKCk7IC8vIEVuYWJsZSBmb3Igc2VhcmNoL2ZpbHRlcgogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb3J0LXNlbGVjdCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgIGN1cnJlbnRQYWdlID0gMTsKICAgIHNldHVwRXZlbnRTdHJlYW0oKTsgLy8gUmVjb25uZWN0IFNTRSB3aXRoIG5ldyBzb3J0CiAgICBmZXRjaERhdGEoKTsgLy8gRW5hYmxlIGZvciBzb3J0aW5nCiAgfSk7CgogIGNvbnN0IHNlYXJjaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2gtYnRuJyk7CiAgaWYgKHNlYXJjaEJ0bikgewogICAgc2VhcmNoQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICBjdXJyZW50UGFnZSA9IDE7CiAgICAgIHNldHVwRXZlbnRTdHJlYW0oKTsgLy8gUmVjb25uZWN0IFNTRSB3aXRoIG5ldyBzZWFyY2gKICAgICAgZmV0Y2hEYXRhKCk7IC8vIEVuYWJsZSBmb3Igc2VhcmNoCiAgICB9KTsKICB9CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaC1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHsKICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgewogICAgICBjdXJyZW50UGFnZSA9IDE7CiAgICAgIHNldHVwRXZlbnRTdHJlYW0oKTsgLy8gUmVjb25uZWN0IFNTRSB3aXRoIG5ldyBzZWFyY2gKICAgICAgZmV0Y2hEYXRhKCk7IC8vIEVuYWJsZSBmb3Igc2VhcmNoCiAgICB9CiAgfSk7CgogIC8vIEluaXRpYWxpemUgYXV0by1yZWZyZXNoCiAgY29uc3Qgc3RvcmVkQXV0b1JlZnJlc2ggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBVVRPX1JFRlJFU0hfS0VZKTsKICBpZiAoc3RvcmVkQXV0b1JlZnJlc2ggPT09IG51bGwpIHsKICAgIC8vIE9ubHkgdXNlIGRlZmF1bHQgaWYgbm8gdmFsdWUgaXMgc3RvcmVkCiAgICBzZXRBdXRvUmVmcmVzaCh0cnVlKTsKICB9IGVsc2UgewogICAgLy8gVXNlIHN0b3JlZCB2YWx1ZQogICAgc2V0QXV0b1JlZnJlc2goc3RvcmVkQXV0b1JlZnJlc2ggPT09ICd0cnVlJyk7CiAgfQogIHNldHVwRXZlbnRTdHJlYW0oKTsKICAvLyBTU0Ugc2hvdWxkIGhhbmRsZSBpbml0aWFsIGRhdGEgbG9hZGluZwogIGdsb2JhbFRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHsKICAgIGlmIChldmVudFNvdXJjZSkgewogICAgICBldmVudFNvdXJjZS5jbG9zZSgpOwogICAgfQogIH0pOwp9KTsK\n";
4
+ export declare const ZINTRUST_SVG = "\nPHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9Inp0LWcyZCIgeDE9IjEwIiB5MT0iNTAiIHgyPSI5MCIgeTI9IjUwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMmM1NWUiIC8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzM4YmRmOCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjM0IiBzdHJva2U9InJnYmEoMjU1LDI1NSwyNTUsMC4xNikiIHN0cm9rZS13aWR0aD0iNCIgLz4KICA8ZWxsaXBzZSBjeD0iNTAiIGN5PSI1MCIgcng9IjQwIiByeT0iMTgiIHN0cm9rZT0idXJsKCN6dC1nMmQpIiBzdHJva2Utd2lkdGg9IjQiIC8+CiAgPGVsbGlwc2UgY3g9IjUwIiBjeT0iNTAiIHJ4PSIxOCIgcnk9IjQwIiBzdHJva2U9InVybCgjenQtZzJkKSIgc3Ryb2tlLXdpZHRoPSI0IiBvcGFjaXR5PSIwLjc1IiAvPgogIDxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjYiIGZpbGw9InVybCgjenQtZzJkKSIgLz4KICA8cGF0aAogICAgZD0iTTQwIDUyQzM1IDUyIDMyIDQ5IDMyIDQ0QzMyIDM5IDM1IDM2IDQwIDM2SDQ4IgogICAgc3Ryb2tlPSJ3aGl0ZSIKICAgIHN0cm9rZS13aWR0aD0iNiIKICAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAvPgogIDxwYXRoCiAgICBkPSJNNjAgNDhDNjUgNDggNjggNTEgNjggNTZDNjggNjEgNjUgNjQgNjAgNjRINTIiCiAgICBzdHJva2U9IndoaXRlIgogICAgc3Ryb2tlLXdpZHRoPSI2IgogICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIC8+CiAgPHBhdGgKICAgIGQ9Ik00NCA1MEg1NiIKICAgIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwwLjIyKSIKICAgIHN0cm9rZS13aWR0aD0iNiIKICAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAvPgo8L3N2Zz4K\n";
@@ -0,0 +1,13 @@
1
+ // Auto-generated file. Do not edit manually.
2
+ export const INDEX_HTML = `
3
+ PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+WmluVHJ1c3QgV29ya2VycyBEYXNoYm9hcmQ8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ3b3JrZXJzL3N0eWxlcy5jc3MiIC8+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItdG9wIj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTZweCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvZ28tZnJhbWUiPgogICAgICAgICAgICAgIDxpbWcgc3JjPSJ3b3JrZXJzL3ppbnRydXN0LnN2ZyIgYWx0PSJaaW5UcnVzdCIgY2xhc3M9ImxvZ28taW1nIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGgxPlppblRydXN0IFdvcmtlcnM8L2gxPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYWN0aW9ucyI+CiAgICAgICAgICAgIDxidXR0b24gaWQ9InRoZW1lLXRvZ2dsZSIgY2xhc3M9InRoZW1lLXRvZ2dsZSI+CiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICBkPSJNMTIgMXYyTTEyIDIxdjJNNC4yMiA0LjIybDEuNDIgMS40Mk0xOC4zNiAxOC4zNmwxLjQyIDEuNDJNMSAxMmgyTTIxIDEyaDJNNC4yMiAxOS43OGwxLjQyLTEuNDJNMTguMzYgNS42NGwxLjQyLTEuNDIiCiAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIFRoZW1lCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJhdXRvLXJlZnJlc2gtdG9nZ2xlIiBjbGFzcz0iYnRuIiBvbmNsaWNrPSJ0b2dnbGVBdXRvUmVmcmVzaCgpIj4KICAgICAgICAgICAgICA8c3ZnIGlkPSJhdXRvLXJlZnJlc2gtaWNvbiIgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9IjUgMyAxOSAxMiA1IDIxIDUgMyIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8c3BhbiBpZD0iYXV0by1yZWZyZXNoLWxhYmVsIj5BdXRvIFJlZnJlc2g8L3NwYW4+CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIG9uY2xpY2s9ImZldGNoRGF0YSgpIj4KICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzIDR2NmgtNiIgLz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xIDIwdi02aDYiIC8+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMy41MSA5YTkgOSAwIDAgMSAxNC44NS0zLjM2TDIzIDEwTTEgMTRsNC42NCA0LjM2QTkgOSAwIDAgMCAyMC40OSAxNSIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICBSZWZyZXNoCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9InNob3dBZGRXb3JrZXJNb2RhbCgpIj4KICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICAgICAgPGxpbmUgeDE9IjEyIiB5MT0iNSIgeDI9IjEyIiB5Mj0iMTkiIC8+CiAgICAgICAgICAgICAgICA8bGluZSB4MT0iNSIgeTE9IjEyIiB4Mj0iMTkiIHkyPSIxMiIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICBBZGQgV29ya2VyCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9Im5hdi1iYXIiPgogICAgICAgICAgPG5hdiBjbGFzcz0ibmF2LWxpbmtzIj4KICAgICAgICAgICAgPGEgaHJlZj0iL3F1ZXVlLW1vbml0b3IiIGNsYXNzPSJuYXYtbGluayI+UXVldWUgTW9uaXRvcjwvYT4KICAgICAgICAgICAgPGEgaHJlZj0iL3RlbGVtZXRyeSIgY2xhc3M9Im5hdi1saW5rIj5UZWxlbWV0cnk8L2E+CiAgICAgICAgICAgIDxhIGhyZWY9Ii9tZXRyaWNzIiBjbGFzcz0ibmF2LWxpbmsiPk1ldHJpY3M8L2E+CiAgICAgICAgICA8L25hdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVycy1iYXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVyLWdyb3VwIj4KICAgICAgICAgICAgPHNwYW4+U3RhdHVzOjwvc3Bhbj4KICAgICAgICAgICAgPHNlbGVjdCBpZD0ic3RhdHVzLWZpbHRlciI+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5BbGwgU3RhdHVzPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0icnVubmluZyI+UnVubmluZzwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InN0b3BwZWQiPlN0b3BwZWQ8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJlcnJvciI+RXJyb3I8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJwYXVzZWQiPlBhdXNlZDwvb3B0aW9uPgogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVyLWdyb3VwIj4KICAgICAgICAgICAgPHNwYW4+RHJpdmVyOjwvc3Bhbj4KICAgICAgICAgICAgPHNlbGVjdCBpZD0iZHJpdmVyLWZpbHRlciI+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5BbGwgRHJpdmVyczwvb3B0aW9uPgogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVyLWdyb3VwIj4KICAgICAgICAgICAgPHNwYW4+U29ydDo8L3NwYW4+CiAgICAgICAgICAgIDxzZWxlY3QgaWQ9InNvcnQtc2VsZWN0Ij4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJuYW1lIj5Tb3J0IGJ5IE5hbWU8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJzdGF0dXMiIHNlbGVjdGVkPlNvcnQgYnkgU3RhdHVzPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZHJpdmVyIj5Tb3J0IGJ5IERyaXZlcjwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImhlYWx0aCI+U29ydCBieSBIZWFsdGg8L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2ZXJzaW9uIj5Tb3J0IGJ5IFZlcnNpb248L29wdGlvbj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJwcm9jZXNzZWQiPlNvcnQgYnkgUGVyZm9ybWFuY2U8L29wdGlvbj4KICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWFyY2gtYm94Ij4KICAgICAgICAgICAgPHN2ZyBjbGFzcz0ic2VhcmNoLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iOCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgPGxpbmUgeDE9IjIxIiB5MT0iMjEiIHgyPSIxNi42NSIgeTI9IjE2LjY1Ij48L2xpbmU+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InNlYXJjaC1pbnB1dCIgcGxhY2Vob2xkZXI9IlNlYXJjaCB3b3JrZXJzLi4uIiAvPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBpZD0ibG9hZGluZyIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKSI+CiAgICAgICAgPGRpdj5Mb2FkaW5nIHdvcmtlcnMuLi48L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2CiAgICAgICAgaWQ9ImVycm9yIgogICAgICAgIHN0eWxlPSJkaXNwbGF5OiBub25lOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7IGNvbG9yOiB2YXIoLS1kYW5nZXIpIgogICAgICA+CiAgICAgICAgPGRpdj5GYWlsZWQgdG8gbG9hZCB3b3JrZXJzIGRhdGE8L2Rpdj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIG9uY2xpY2s9ImZldGNoRGF0YSgpIiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweCI+UmV0cnk8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJ3b3JrZXJzLWNvbnRlbnQiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdW1tYXJ5LWJhciIgaWQ9InF1ZXVlLXN1bW1hcnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3VtbWFyeS1pdGVtIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN1bW1hcnktbGFiZWwiPlF1ZXVlIERyaXZlcjwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN1bW1hcnktdmFsdWUiIGlkPSJxdWV1ZS1kcml2ZXIiPi08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LWxhYmVsIj5RdWV1ZXM8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LXZhbHVlIiBpZD0icXVldWUtdG90YWwiPjA8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LWxhYmVsIj5Kb2JzPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS12YWx1ZSIgaWQ9InF1ZXVlLWpvYnMiPjA8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LWxhYmVsIj5Qcm9jZXNzaW5nPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS12YWx1ZSIgaWQ9InF1ZXVlLXByb2Nlc3NpbmciPjA8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1bW1hcnktaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LWxhYmVsIj5GYWlsZWQ8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdW1tYXJ5LXZhbHVlIiBpZD0icXVldWUtZmFpbGVkIj4wPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdW1tYXJ5LWl0ZW0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3VtbWFyeS1sYWJlbCI+RHJpdmVyczwvc3Bhbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJpdmVycy1saXN0IiBpZD0iZHJpdmVycy1saXN0Ij48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS13cmFwcGVyIj4KICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMjUwcHgiPldvcmtlcjwvdGg+CiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDEyMHB4Ij5TdGF0dXM8L3RoPgogICAgICAgICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOiAxMjBweCI+SGVhbHRoPC90aD4KICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTAwcHgiPkRyaXZlcjwvdGg+CiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDEwMHB4Ij5WZXJzaW9uPC90aD4KICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMzIwcHgiPlBlcmZvcm1hbmNlPC90aD4KICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTgwcHgiPkFjdGlvbnM8L3RoPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgIDx0Ym9keSBpZD0id29ya2Vycy10Ym9keSI+CiAgICAgICAgICAgICAgICA8IS0tIFdvcmtlcnMgd2lsbCBiZSBwb3B1bGF0ZWQgaGVyZSAtLT4KICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5hdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luYXRpb24taW5mbyIgaWQ9InBhZ2luYXRpb24taW5mbyI+U2hvd2luZyAwLTAgb2YgMCB3b3JrZXJzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luYXRpb24tY29udHJvbHMiPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InBhZ2UtYnRuIiBpZD0icHJldi1idG4iIG9uY2xpY2s9ImxvYWRQYWdlKCdwcmV2JykiIGRpc2FibGVkPgogICAgICAgICAgICAgICAgPHN2ZwogICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiCiAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiCiAgICAgICAgICAgICAgICAgIHN0cm9rZT0iY3VycmVudENvbG9yIgogICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjE1IDE4IDkgMTIgMTUgNiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxkaXYgaWQ9InBhZ2UtbnVtYmVycyIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4Ij48L2Rpdj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwYWdlLWJ0biIgaWQ9Im5leHQtYnRuIiBvbmNsaWNrPSJsb2FkUGFnZSgnbmV4dCcpIiBkaXNhYmxlZD4KICAgICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDI0IDI0IgogICAgICAgICAgICAgICAgICBmaWxsPSJub25lIgogICAgICAgICAgICAgICAgICBzdHJva2U9ImN1cnJlbnRDb2xvciIKICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49InJvdW5kIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPSI5IDE4IDE1IDEyIDkgNiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvYnV0dG9uPgoKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXNpemUtc2VsZWN0b3IiPgogICAgICAgICAgICAgICAgPHNwYW4+U2hvdzo8L3NwYW4+CiAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJsaW1pdC1zZWxlY3QiIG9uY2hhbmdlPSJjaGFuZ2VMaW1pdCh0aGlzLnZhbHVlKSI+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwIj4xMDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNSI+MjU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTAiPjUwPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwMCI+MTAwPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJ3b3JrZXJzL21haW4uanMiPjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=
4
+ `;
5
+ export const STYLES_CSS = `
6
+ OnJvb3QgewogIC0tYmc6ICMwYjEyMjA7CiAgLS1jYXJkOiAjMGYxNzJhOwogIC0tYm9yZGVyOiAjMWUyOTNiOwogIC0tdGV4dDogI2UyZThmMDsKICAtLW11dGVkOiAjOTRhM2I4OwogIC0tYWNjZW50OiAjMzhiZGY4OwogIC0tYWNjZW50LWhvdmVyOiAjMGVhNWU5OwoKICAvKiBNb2Rlcm4gVXRpbGl0aWVzICovCiAgLS1zdXJmYWNlLWhvdmVyOiAjMWUyOTNiOwogIC0tc3VyZmFjZS1hY3RpdmU6ICMzMzQxNTU7CiAgLS1pbnB1dC1iZzogIzBmMTcyYTsKCiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpOwogIC0tc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpOwogIC0tc2hhZG93LWxnOiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIDAuMSk7CgogIC8qIEJyYW5kIENvbG9ycyAqLwogIC0tcHJpbWFyeTogIzBlYTVlOTsKICAtLXN1Y2Nlc3M6ICMyMmM1NWU7CiAgLS13YXJuaW5nOiAjZjU5ZTBiOwogIC0tZGFuZ2VyOiAjZWY0NDQ0OwogIC0taW5mbzogIzNiODJmNjsKfQoKaHRtbFtkYXRhLXRoZW1lPSdsaWdodCddIHsKICAtLWJnOiAjZjFmNWY5OwogIC0tY2FyZDogI2ZmZmZmZjsKICAtLWJvcmRlcjogI2UyZThmMDsKICAtLXRleHQ6ICMzMzQxNTU7CiAgLS1tdXRlZDogIzY0NzQ4YjsKCiAgLS1zdXJmYWNlLWhvdmVyOiAjZjhmYWZjOwogIC0tc3VyZmFjZS1hY3RpdmU6ICNlMmU4ZjA7CiAgLS1pbnB1dC1iZzogI2ZmZmZmZjsKCiAgLS1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpOwogIC0tc2hhZG93LWxnOiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMDUpLCAwIDRweCA2cHggLTRweCByZ2IoMCAwIDAgLyAwLjAyKTsKfQoKKiB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDA7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKYm9keSB7CiAgZm9udC1mYW1pbHk6CiAgICAnSW50ZXInLAogICAgc3lzdGVtLXVpLAogICAgLWFwcGxlLXN5c3RlbSwKICAgIHNhbnMtc2VyaWY7CiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKICBsaW5lLWhlaWdodDogMS41OwogIHRyYW5zaXRpb246CiAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwKICAgIGNvbG9yIDAuM3MgZWFzZTsKICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKfQoKLmNvbnRhaW5lciB7CiAgbWF4LXdpZHRoOiAxNDAwcHg7CiAgbWFyZ2luOiAwIGF1dG87CiAgcGFkZGluZzogNDBweCAyNHB4Owp9CgovKiBUcmFuc2l0aW9ucyAqLwouY2FyZCwKLmhlYWRlciwKLnRhYmxlLWNvbnRhaW5lciwKLmJ0biwKLmFjdGlvbi1idG4sCmlucHV0LApzZWxlY3QgewogIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW4tb3V0Owp9CgovKiBIZWFkZXIgU3R5bGVzICovCi5oZWFkZXIgewogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogIHBhZGRpbmc6IDI0cHggMzJweDsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgbWFyZ2luLWJvdHRvbTogMzJweDsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cpOwp9CgouaGVhZGVyLXRvcCB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBtYXJnaW4tYm90dG9tOiAyNHB4Owp9CgouaGVhZGVyIGgxIHsKICBmb250LXNpemU6IDI0cHg7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgY29sb3I6IHZhcigtLXRleHQpOwp9CgouaGVhZGVyLWFjdGlvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiAxMnB4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi8qIE5hdmlnYXRpb24gQmFyICovCi5uYXYtYmFyIHsKICBwYWRkaW5nLWJvdHRvbTogMjRweDsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBtYXJnaW4tYm90dG9tOiAyNHB4Owp9CgoubmF2LWxpbmtzIHsKICBkaXNwbGF5OiBmbGV4OwogIGdhcDogMzJweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubmF2LWxpbmsgewogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGZvbnQtc2l6ZTogMTRweDsKICBmb250LXdlaWdodDogNTAwOwogIHBhZGRpbmc6IDhweCAxMnB4OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm5hdi1saW5rOmhvdmVyIHsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7Cn0KCi5uYXYtbGluay5hY3RpdmUgewogIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICBiYWNrZ3JvdW5kOiByZ2JhKDE0LCAxNjUsIDIzMywgMC4xKTsKfQoKLm5hdi1saW5rLmFjdGl2ZTo6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IC0yNXB4OwogIGxlZnQ6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgd2lkdGg6IDQwcHg7CiAgaGVpZ2h0OiAzcHg7CiAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeSk7CiAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgovKiBCdXR0b25zICYgSW5wdXRzICovCi5idG4gewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA4cHg7CiAgcGFkZGluZzogMTBweCAxNnB4OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXNtKTsKICBoZWlnaHQ6IDQwcHg7Cn0KCi5idG46aG92ZXIgewogIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICBib3JkZXItY29sb3I6IHZhcigtLW11dGVkKTsKfQoKLmJ0bi1wcmltYXJ5IHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5KTsKICBjb2xvcjogd2hpdGU7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcHJpbWFyeSk7Cn0KCi5idG4tcHJpbWFyeTpob3ZlciB7CiAgYmFja2dyb3VuZDogIzAyODRjNzsgLyogRGFya2VyIGJsdWUgKi8KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDE0LCAxNjUsIDIzMywgMC4yNSk7CiAgY29sb3I6IHdoaXRlOwp9CgoudGhlbWUtdG9nZ2xlIHsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBwYWRkaW5nOiA4cHggMTJweDsKICBib3JkZXItcmFkaXVzOiA4cHg7CiAgZm9udC1zaXplOiAxM3B4OwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBnYXA6IDhweDsKICBoZWlnaHQ6IDQwcHg7Cn0KCi50aGVtZS10b2dnbGU6aG92ZXIgewogIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwp9CgovKiBGaWx0ZXJzICovCi5maWx0ZXJzLWJhciB7CiAgZGlzcGxheTogZmxleDsKICBnYXA6IDE2cHg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBmbGV4LXdyYXA6IHdyYXA7CiAgcGFkZGluZy10b3A6IDI0cHg7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5maWx0ZXItZ3JvdXAgewogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBnYXA6IDEwcHg7Cn0KCi5maWx0ZXItZ3JvdXAgbGFiZWwgewogIGZvbnQtc2l6ZTogMTNweDsKICBmb250LXdlaWdodDogNjAwOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgouZmlsdGVyLWdyb3VwIHNlbGVjdCwKLmZpbHRlci1ncm91cCBpbnB1dCB7CiAgcGFkZGluZzogOHB4IDEycHg7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBib3JkZXItcmFkaXVzOiA4cHg7CiAgZm9udC1zaXplOiAxNHB4OwogIGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgbWluLXdpZHRoOiAxNDBweDsKICBoZWlnaHQ6IDM4cHg7Cn0KCi5maWx0ZXItZ3JvdXAgc2VsZWN0OmZvY3VzLAouZmlsdGVyLWdyb3VwIGlucHV0OmZvY3VzIHsKICBvdXRsaW5lOiBub25lOwogIGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeSk7CiAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMTQsIDE2NSwgMjMzLCAwLjEpOwp9Cgouc2VhcmNoLWJveCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICB3aWR0aDogMjgwcHg7Cn0KCi5zZWFyY2gtYm94IC5zZWFyY2gtaWNvbiB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDEycHg7CiAgd2lkdGg6IDE2cHg7CiAgaGVpZ2h0OiAxNnB4OwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIGZpbGw6IG5vbmU7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5zZWFyY2gtYm94IGlucHV0IHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDQwcHg7CiAgcGFkZGluZzogOHB4IDEycHggOHB4IDM2cHg7CiAgYmFja2dyb3VuZDogdmFyKC0taW5wdXQtYmcpOwogIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKICBmb250LXNpemU6IDE0cHg7CiAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLnNlYXJjaC1ib3ggaW5wdXQ6Zm9jdXMgewogIG91dGxpbmU6IG5vbmU7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgxNCwgMTY1LCAyMzMsIDAuMSk7Cn0KCi8qIFN1bW1hcnkgQmFyICovCi5zdW1tYXJ5LWJhciB7CiAgbWFyZ2luOiAxNnB4IDAgMDsKICBwYWRkaW5nOiAxNnB4IDIwcHg7CiAgYmFja2dyb3VuZDogdmFyKC0tY2FyZCk7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBib3JkZXItcmFkaXVzOiAxMnB4OwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC13cmFwOiB3cmFwOwogIGdhcDogMTZweCAyNHB4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXNtKTsKfQoKLnN1bW1hcnktaXRlbSB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGdhcDogNHB4OwogIG1pbi13aWR0aDogMTIwcHg7Cn0KCi5zdW1tYXJ5LWxhYmVsIHsKICBmb250LXNpemU6IDEycHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLnN1bW1hcnktdmFsdWUgewogIGZvbnQtc2l6ZTogMTZweDsKICBmb250LXdlaWdodDogNzAwOwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmRyaXZlcnMtbGlzdCB7CiAgZGlzcGxheTogZmxleDsKICBnYXA6IDhweDsKICBmbGV4LXdyYXA6IHdyYXA7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLmRyaXZlci1jaGlwIHsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBwYWRkaW5nOiA0cHggMTBweDsKICBib3JkZXItcmFkaXVzOiA5OTk5cHg7Cn0KCi8qIFRhYmxlIENvbnRhaW5lciAqLwoudGFibGUtY29udGFpbmVyIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbGcpOwp9Cgp0YWJsZSB7CiAgd2lkdGg6IDEwMCU7CiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKICBib3JkZXItc3BhY2luZzogMDsKfQoKdGggewogIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwogIHBhZGRpbmc6IDE2cHggMjRweDsKICB0ZXh0LWFsaWduOiBsZWZ0OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgZm9udC1zaXplOiAxMnB4OwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCnRkIHsKICBwYWRkaW5nOiAyMHB4IDI0cHg7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgZm9udC1zaXplOiAxNHB4OwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCnRib2R5IHRyIHsKICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2U7Cn0KCnRib2R5IHRyOmhvdmVyIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLWhvdmVyKTsKfQoKdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZCB7CiAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLyogV29ya2VyIElkZW50aXR5ICovCi53b3JrZXItbmFtZSB7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgZm9udC1zaXplOiAxNXB4OwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLndvcmtlci1xdWV1ZSB7CiAgZm9udC1zaXplOiAxMnB4OwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLWFjdGl2ZSk7CiAgcGFkZGluZzogMnB4IDZweDsKICBib3JkZXItcmFkaXVzOiA0cHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgovKiBUeXBvZ3JhcGh5ICYgQmFkZ2VzICovCi5zdGF0dXMtYmFkZ2UgewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA4cHg7CiAgcGFkZGluZzogNnB4IDEwcHg7CiAgYm9yZGVyLXJhZGl1czogOTk5OXB4OyAvKiBQaWxsIHNoYXBlICovCiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgd2lkdGg6IGZpdC1jb250ZW50Owp9Cgouc3RhdHVzLXJ1bm5pbmcgewogIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMSk7CiAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzQsIDE5NywgOTQsIDAuMik7Cn0KCi5zdGF0dXMtc3RvcHBlZCB7CiAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4xKTsKICBjb2xvcjogdmFyKC0tZGFuZ2VyKTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIzOSwgNjgsIDY4LCAwLjIpOwp9Cgouc3RhdHVzLWVycm9yIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4xKTsKICBjb2xvcjogdmFyKC0td2FybmluZyk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNDUsIDE1OCwgMTEsIDAuMik7Cn0KCi5zdGF0dXMtZG90IHsKICB3aWR0aDogOHB4OwogIGhlaWdodDogOHB4OwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9Cgouc3RhdHVzLXJ1bm5pbmcgLnN0YXR1cy1kb3QgewogIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwp9Ci5zdGF0dXMtc3RvcHBlZCAuc3RhdHVzLWRvdCB7CiAgYmFja2dyb3VuZDogdmFyKC0tZGFuZ2VyKTsKfQouc3RhdHVzLWVycm9yIC5zdGF0dXMtZG90IHsKICBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuaW5nKTsKfQoKLmhlYWx0aC1pbmRpY2F0b3IgewogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLmhlYWx0aC1kb3QgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICB3aWR0aDogOHB4OwogIGhlaWdodDogOHB4OwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBtYXJnaW4tcmlnaHQ6IDZweDsKfQouaGVhbHRoLWhlYWx0aHkgewogIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwp9Ci5oZWFsdGgtdW5oZWFsdGh5IHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1kYW5nZXIpOwp9Ci5oZWFsdGgtZGVncmFkZWQgewogIGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmcpOwp9Ci5oZWFsdGgtd2FybmluZyB7CiAgYmFja2dyb3VuZDogdmFyKC0td2FybmluZyk7Cn0KLmhlYWx0aC11bmtub3duIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1tdXRlZCk7Cn0KCi8qIERyaXZlciAmIFZlcnNpb24gKi8KLmRyaXZlci1iYWRnZSB7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIHBhZGRpbmc6IDRweCA4cHg7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogNjAwOwogIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi52ZXJzaW9uLWJhZGdlIHsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC1zaXplOiAxMnB4Owp9CgovKiBQZXJmb3JtYW5jZSBJY29ucyAqLwoucGVyZm9ybWFuY2UtaWNvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiAxNnB4Owp9CgoucGVyZi1pY29uIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA2cHg7CiAgZm9udC1zaXplOiAxM3B4OwogIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5wZXJmLWljb24gc3ZnIHsKICB3aWR0aDogMTZweDsKICBoZWlnaHQ6IDE2cHg7CiAgc3Ryb2tlLXdpZHRoOiAyLjU7Cn0KCi5wZXJmLWljb24ucHJvY2Vzc2VkIHsKICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7Cn0KLnBlcmYtaWNvbi50aW1lIHsKICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7Cn0KLnBlcmYtaWNvbi5tZW1vcnkgewogIGNvbG9yOiAjOGI1Y2Y2Owp9CgovKiBBY3Rpb24gQnV0dG9ucyB3aXRoIFNWR3MgKi8KLmFjdGlvbnMtY2VsbCB7CiAgZGlzcGxheTogZmxleDsKICBnYXA6IDhweDsKfQoKLmFjdGlvbi1idG4gewogIHdpZHRoOiAzNHB4OwogIGhlaWdodDogMzRweDsKICBwYWRkaW5nOiAwOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIHRyYW5zaXRpb246IGFsbCAwLjJzOwp9CgouYWN0aW9uLWJ0bjpob3ZlciB7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIGJvcmRlci1jb2xvcjogdmFyKC0tbXV0ZWQpOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctc20pOwp9CgouYWN0aW9uLWJ0biBzdmcgewogIHdpZHRoOiAxNnB4OwogIGhlaWdodDogMTZweDsKICBzdHJva2U6IGN1cnJlbnRDb2xvcjsKICBzdHJva2Utd2lkdGg6IDI7CiAgZmlsbDogbm9uZTsKICBzdHJva2UtbGluZWNhcDogcm91bmQ7CiAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsKfQoKLyogU3BlY2lmaWMgQWN0aW9uIENvbG9ycyBPbiBIb3ZlciAqLwouYWN0aW9uLWJ0bi5zdGFydDpob3ZlciB7CiAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogIGJvcmRlci1jb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgYmFja2dyb3VuZDogcmdiYSgzNCwgMTk3LCA5NCwgMC4xKTsKfQouYWN0aW9uLWJ0bi5zdG9wOmhvdmVyIHsKICBjb2xvcjogdmFyKC0tZGFuZ2VyKTsKICBib3JkZXItY29sb3I6IHZhcigtLWRhbmdlcik7CiAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4xKTsKfQouYWN0aW9uLWJ0bi5yZXN0YXJ0OmhvdmVyIHsKICBjb2xvcjogdmFyKC0td2FybmluZyk7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS13YXJuaW5nKTsKICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4xKTsKfQouYWN0aW9uLWJ0bi5kZWJ1Zzpob3ZlciB7CiAgY29sb3I6IHZhcigtLWluZm8pOwogIGJvcmRlci1jb2xvcjogdmFyKC0taW5mbyk7CiAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMSk7Cn0KLmFjdGlvbi1idG4uZGVsZXRlOmhvdmVyIHsKICBjb2xvcjogdmFyKC0tZGFuZ2VyKTsKICBib3JkZXItY29sb3I6IHZhcigtLWRhbmdlcik7CiAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4xKTsKfQoKLyogRXhwYW5kYWJsZSBSb3dzICovCi5leHBhbmRhYmxlLXJvdyB7CiAgZGlzcGxheTogbm9uZTsKfQoKLmV4cGFuZGFibGUtcm93Lm9wZW4gewogIGRpc3BsYXk6IHRhYmxlLXJvdzsKfQoKLmV4cGFuZGVyIHsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5kZXRhaWxzLWNvbnRlbnQgewogIHBhZGRpbmc6IDMycHg7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgYm94LXNoYWRvdzogaW5zZXQgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wMik7Cn0KCi5kZXRhaWxzLWdyaWQgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyODBweCwgMWZyKSk7CiAgZ2FwOiAyNHB4Owp9CgouZGV0YWlsLXNlY3Rpb24gewogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogIHBhZGRpbmc6IDIwcHg7CiAgYm9yZGVyLXJhZGl1czogMTJweDsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1zbSk7Cn0KCi5kZXRhaWwtc2VjdGlvbiBoNCB7CiAgZm9udC1zaXplOiAxM3B4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA4cHg7Cn0KCi5kZXRhaWwtaXRlbSB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBwYWRkaW5nOiA4cHggMDsKICBmb250LXNpemU6IDEzcHg7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5kZXRhaWwtaXRlbTpsYXN0LWNoaWxkIHsKICBib3JkZXItYm90dG9tOiBub25lOwp9CgouZGV0YWlsLWl0ZW0gc3BhbjpmaXJzdC1jaGlsZCB7CiAgY29sb3I6IHZhcigtLW11dGVkKTsKICBmb250LXdlaWdodDogNTAwOwp9CgouZGV0YWlsLWl0ZW0gc3BhbjpsYXN0LWNoaWxkIHsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLyogTG9nbyAqLwoubG9nby1mcmFtZSB7CiAgd2lkdGg6IDQwcHg7CiAgaGVpZ2h0OiA0MHB4OwogIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxNCwgMTY1LCAyMzMsIDAuMSkgMCUsIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjIpIDEwMCUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTQsIDE2NSwgMjMzLCAwLjMpOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLmxvZ28taW1nIHsKICB3aWR0aDogMjZweDsKICBoZWlnaHQ6IDI2cHg7CiAgZGlzcGxheTogYmxvY2s7Cn0KCi5sb2dvIHsKICB3aWR0aDogMzRweDsKICBoZWlnaHQ6IDM0cHg7CiAgYm9yZGVyLXJhZGl1czogOXB4OwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTQsIDE2NSwgMjMzLCAwLjM1KTsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE0LCAxNjUsIDIzMywgMC4yNSksIHJnYmEoMiwgMTMyLCAxOTksIDAuMTIpKTsKfQoKLyogSWNvbnMgR2VuZXJpYyAqLwouaWNvbiB7CiAgd2lkdGg6IDE4cHg7CiAgaGVpZ2h0OiAxOHB4OwogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9CgovKiBQYWdpbmF0aW9uICovCi5wYWdpbmF0aW9uIHsKICBtYXJnaW4tdG9wOiAyMHB4OwogIGRpc3BsYXk6IGZsZXg7CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgcGFkZGluZzogMTZweCAyNHB4OwogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgYm9yZGVyLXJhZGl1czogMTJweDsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cpOwp9CgoucGFnZS1idG4gewogIHdpZHRoOiAzOHB4OwogIGhlaWdodDogMzhweDsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmc6IDA7CiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBib3JkZXItcmFkaXVzOiAxMHB4OwogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgdHJhbnNpdGlvbjogYWxsIDAuMnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5wYWdlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyKTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXNtKTsKfQoKLnBhZ2UtYnRuLmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeSk7CiAgY29sb3I6IHdoaXRlOwogIGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeSk7CiAgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiYSgxNCwgMTY1LCAyMzMsIDAuMyk7Cn0KCi5wYWdlLWJ0bjpkaXNhYmxlZCB7CiAgb3BhY2l0eTogMC40OwogIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwp9CgoucGFnZS1idG4gc3ZnIHsKICB3aWR0aDogMThweDsKICBoZWlnaHQ6IDE4cHg7CiAgc3Ryb2tlLXdpZHRoOiAycHg7Cn0KCi8qIFBhZ2UgU2l6ZSBTZWxlY3RvciAqLwoucGFnaW5hdGlvbi1jb250cm9scyB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogOHB4OwogIGZsZXgtd3JhcDogd3JhcDsKfQoKLnBhZ2Utc2l6ZS1zZWxlY3RvciB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogOHB4OwogIG1hcmdpbi1sZWZ0OiAxNnB4OwogIHBhZGRpbmctbGVmdDogMTZweDsKICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5wYWdlLXNpemUtc2VsZWN0b3IgbGFiZWwgewogIGZvbnQtc2l6ZTogMTNweDsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5wYWdlLXNpemUtc2VsZWN0b3Igc2VsZWN0IHsKICBwYWRkaW5nOiAwIDMycHggMCAxMnB4OwogIGhlaWdodDogMzhweDsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2FyZCk7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIGZvbnQtc2l6ZTogMTNweDsKICBmb250LXdlaWdodDogNTAwOwogIGN1cnNvcjogcG9pbnRlcjsKICBhcHBlYXJhbmNlOiBub25lOwogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9J25vbmUnIHZpZXdCb3g9JzAgMCAyNCAyNCcgc3Ryb2tlPSclMjM5NGEzYjgnJTNFJTNDcGF0aCBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS13aWR0aD0nMicgZD0nTTE5IDlsLTcgNy03LTcnJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCA4cHggY2VudGVyOwogIGJhY2tncm91bmQtc2l6ZTogMTZweDsKICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKfQoKLnBhZ2Utc2l6ZS1zZWxlY3RvciBzZWxlY3Q6aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwogIGJvcmRlci1jb2xvcjogdmFyKC0tbXV0ZWQpOwp9CgoucGFnZS1zaXplLXNlbGVjdG9yIHNlbGVjdDpmb2N1cyB7CiAgb3V0bGluZTogbm9uZTsKICBib3JkZXItY29sb3I6IHZhcigtLXByaW1hcnkpOwogIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDE0LCAxNjUsIDIzMywgMC4xKTsKfQoKLyogVG9nZ2xlIFN3aXRjaCAqLwouYXV0by1zdGFydC10b2dnbGUsCi5hdXRvLXN3aXRjaC10b2dnbGUgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgd2lkdGg6IDQ0cHg7CiAgaGVpZ2h0OiAyNHB4OwogIGN1cnNvcjogcG9pbnRlcjsKfQoKLmF1dG8tc3RhcnQtdG9nZ2xlIGlucHV0LAouYXV0by1zd2l0Y2gtdG9nZ2xlIGlucHV0IHsKICBvcGFjaXR5OiAwOwogIHdpZHRoOiAwOwogIGhlaWdodDogMDsKfQoKLnRvZ2dsZS1zbGlkZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdG9wOiAwOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgYm90dG9tOiAwOwogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UtYWN0aXZlKTsKICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIHRyYW5zaXRpb246IDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICBib3JkZXItcmFkaXVzOiAzNHB4Owp9CgoudG9nZ2xlLXNsaWRlcjpiZWZvcmUgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBjb250ZW50OiAnJzsKICBoZWlnaHQ6IDE4cHg7CiAgd2lkdGg6IDE4cHg7CiAgbGVmdDogMnB4OwogIGJvdHRvbTogMnB4OwogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW11dGVkKTsKICB0cmFuc2l0aW9uOiAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7Cn0KCmlucHV0OmNoZWNrZWQgKyAudG9nZ2xlLXNsaWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxNCwgMTY1LCAyMzMsIDAuMTUpOyAvKiBQcmltYXJ5IHRyYW5zcGFyZW50ICovCiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKfQoKaW5wdXQ6Y2hlY2tlZCArIC50b2dnbGUtc2xpZGVyOmJlZm9yZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpOwogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnkpOwp9CgovKiBIb3ZlciBnZW5lcmljIGZvciB0b2dnbGVzICovCi5hdXRvLXN0YXJ0LXRvZ2dsZTpob3ZlciAudG9nZ2xlLXNsaWRlciwKLmF1dG8tc3dpdGNoLXRvZ2dsZTpob3ZlciAudG9nZ2xlLXNsaWRlciB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tdXRlZCk7Cn0KCi8qIFJlc3BvbnNpdmUgRGVzaWduIC0gVGFibGV0ICovCkBtZWRpYSAobWF4LXdpZHRoOiAxMDI0cHgpIHsKICAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDMwcHggMjBweDsKICB9CgogIC5oZWFkZXIgewogICAgcGFkZGluZzogMjBweCAyNHB4OwogICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICB9CgogIC5oZWFkZXItdG9wIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogMTZweDsKICB9CgogIC5oZWFkZXItYWN0aW9ucyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICB9CgogIC5maWx0ZXJzLWJhciB7CiAgICBnYXA6IDEycHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgfQoKICAuc2VhcmNoLWJveCB7CiAgICB3aWR0aDogMjQwcHg7CiAgfQoKICAuc3VtbWFyeS1iYXIgewogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiAxMnB4IDE2cHg7CiAgfQoKICAuc3VtbWFyeS1pdGVtIHsKICAgIG1pbi13aWR0aDogMTAwcHg7CiAgfQoKICAudGFibGUtY29udGFpbmVyIHsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogIH0KCiAgdGFibGUgewogICAgbWluLXdpZHRoOiA5MDBweDsKICB9CgogIC5kZXRhaWxzLWdyaWQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDIwcHg7CiAgfQp9CgovKiBSZXNwb25zaXZlIERlc2lnbiAtIE1vYmlsZSAqLwpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDE2cHggMTJweDsKICB9CgogIC5oZWFkZXIgewogICAgcGFkZGluZzogMTZweDsKICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogIH0KCiAgLmhlYWRlciBoMSB7CiAgICBmb250LXNpemU6IDIwcHg7CiAgfQoKICAuaGVhZGVyLXRvcCA+IGRpdjpmaXJzdC1jaGlsZCB7CiAgICBnYXA6IDEycHg7CiAgfQoKICAubG9nby1pbWcgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgfQoKICAuaGVhZGVyLWFjdGlvbnMgewogICAgZ2FwOiA4cHg7CiAgfQoKICAudGhlbWUtdG9nZ2xlIHsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgaGVpZ2h0OiAzMnB4OwogIH0KCiAgLm5hdi1iYXIgewogICAgcGFkZGluZy1ib3R0b206IDE2cHg7CiAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogIH0KCiAgLm5hdi1saW5rcyB7CiAgICBnYXA6IDE2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgfQoKICAubmF2LWxpbmsgewogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgfQoKICAuZmlsdGVycy1iYXIgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgZ2FwOiAxNnB4OwogIH0KCiAgLmZpbHRlci1ncm91cCB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogNnB4OwogIH0KCiAgLmZpbHRlci1ncm91cCBsYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICAuZmlsdGVyLWdyb3VwIHNlbGVjdCwKICAuZmlsdGVyLWdyb3VwIGlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA0MHB4OwogIH0KCiAgLnNlYXJjaC1ib3ggewogICAgd2lkdGg6IDEwMCU7CiAgfQoKICAuc2VhcmNoLWJveCBpbnB1dCB7CiAgICBoZWlnaHQ6IDQwcHg7CiAgfQoKICAuc3VtbWFyeS1iYXIgewogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgZ2FwOiAxMnB4OwogIH0KCiAgLnN1bW1hcnktaXRlbSB7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgfQoKICAuc3VtbWFyeS1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgfQoKICAuc3VtbWFyeS12YWx1ZSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgfQoKICAudGFibGUtY29udGFpbmVyIHsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIG1hcmdpbjogMCAtMTJweDsKICAgIHBhZGRpbmc6IDAgMTJweDsKICB9CgogIHRhYmxlIHsKICAgIG1pbi13aWR0aDogNzAwcHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgfQoKICB0aCB7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgfQoKICB0ZCB7CiAgICBwYWRkaW5nOiAxNnB4OwogICAgZm9udC1zaXplOiAxM3B4OwogIH0KCiAgLndvcmtlci1uYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICB9CgogIC53b3JrZXItcXVldWUgewogICAgZm9udC1zaXplOiAxMXB4OwogIH0KCiAgLnN0YXR1cy1iYWRnZSB7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogIH0KCiAgLmFjdGlvbi1idG4gewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBwYWRkaW5nOiAwOwogIH0KCiAgLmFjdGlvbi1idG4gc3ZnIHsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogIH0KCiAgLnBlcmZvcm1hbmNlLWljb25zIHsKICAgIGdhcDogOHB4OwogIH0KCiAgLnBlcmYtaWNvbiB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgfQoKICAucGVyZi1pY29uIHNwYW4gewogICAgZm9udC1zaXplOiAxMHB4OwogIH0KCiAgLnBhZ2luYXRpb24gewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDE2cHg7CiAgfQoKICAucGFnaW5hdGlvbi1jb250cm9scyB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGdhcDogOHB4OwogIH0KCiAgLnBhZ2luYXRpb24tYnRuIHsKICAgIG1pbi13aWR0aDogMzZweDsKICAgIGhlaWdodDogMzZweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICB9CgogIC5wYWdlLXNpemUtc2VsZWN0b3IgewogICAgbWFyZ2luLWxlZnQ6IDA7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgcGFkZGluZy10b3A6IDEycHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICB9CgogIC5kZXRhaWxzLWNvbnRlbnQgewogICAgcGFkZGluZzogMTZweDsKICB9CgogIC5kZXRhaWxzLWdyaWQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDE2cHg7CiAgfQoKICAuZGV0YWlsLXNlY3Rpb24gewogICAgcGFkZGluZzogMTZweDsKICB9CgogIC5kZXRhaWwtc2VjdGlvbiBoNCB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogIH0KCiAgLmRldGFpbC1pdGVtIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogOHB4IDA7CiAgfQoKICAuZGV0YWlsLWl0ZW0gc3BhbjpmaXJzdC1jaGlsZCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgfQoKICAuZGV0YWlsLWl0ZW0gc3BhbjpsYXN0LWNoaWxkIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICB9CgogIC5oZWFsdGgtY2hlY2tzIHsKICAgIGdhcDogOHB4OwogIH0KCiAgLmhlYWx0aC1jaGVjayB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDhweDsKICB9CgogIC5yZWNlbnQtbG9ncy1jb250YWluZXIgewogICAgbWF4LWhlaWdodDogMTUwcHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgfQoKICAubG9nLWVudHJ5IHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogNHB4IDA7CiAgfQp9CgovKiBSZXNwb25zaXZlIERlc2lnbiAtIFNtYWxsIE1vYmlsZSAqLwpAbWVkaWEgKG1heC13aWR0aDogNDgwcHgpIHsKICAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDEycHggOHB4OwogIH0KCiAgLmhlYWRlciB7CiAgICBwYWRkaW5nOiAxMnB4OwogIH0KCiAgLmhlYWRlciBoMSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgfQoKICAubG9nby1pbWcgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgfQoKICAudGhlbWUtdG9nZ2xlIHsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgfQoKICAubmF2LWxpbmsgewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICB9CgogIC5zdW1tYXJ5LWJhciB7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICB9CgogIC50YWJsZS1jb250YWluZXIgewogICAgbWFyZ2luOiAwIC04cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICB9CgogIHRhYmxlIHsKICAgIG1pbi13aWR0aDogNjAwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICB0aCB7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICB9CgogIHRkIHsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICAuYWN0aW9uLWJ0biB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICB9CgogIC5hY3Rpb24tYnRuIHN2ZyB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICB9CgogIC5wZXJmLWljb24gc3BhbiB7CiAgICBmb250LXNpemU6IDlweDsKICB9CgogIC5kZXRhaWxzLWNvbnRlbnQgewogICAgcGFkZGluZzogMTJweDsKICB9CgogIC5kZXRhaWwtc2VjdGlvbiB7CiAgICBwYWRkaW5nOiAxMnB4OwogIH0KCiAgLmRldGFpbC1zZWN0aW9uIGg0IHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICB9Cn0KCi8qIEhpZGUvU2hvdyBjb2x1bW5zIGZvciBtb2JpbGUgKi8KQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmhpZGUtbW9iaWxlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogNTc2cHgpIHsKICAuaGlkZS1zbWFsbCB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQoKLyogTW9iaWxlIHRhYmxlIHNjcm9sbCBoaW50ICovCkBtZWRpYSAobWF4LXdpZHRoOiA5OTJweCkgewogIC50YWJsZS13cmFwcGVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB9CgogIC50YWJsZS13cmFwcGVyOjphZnRlciB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMDsKICAgIHJpZ2h0OiAwOwogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB0cmFuc3BhcmVudCAwJSwgdmFyKC0tY2FyZCkgNTAlKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogMCAwIDhweCAwOwogIH0KfQoKLyogVG91Y2gtZnJpZW5kbHkgaW50ZXJhY3Rpb25zICovCkBtZWRpYSAoaG92ZXI6IG5vbmUpIGFuZCAocG9pbnRlcjogY29hcnNlKSB7CiAgLmFjdGlvbi1idG46aG92ZXIgewogICAgdHJhbnNmb3JtOiBub25lOwogIH0KCiAgLmJ0bjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQoKICAubmF2LWxpbms6aG92ZXIgewogICAgdHJhbnNmb3JtOiBub25lOwogIH0KCiAgLmFjdGlvbi1idG46YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSk7CiAgfQoKICAuYnRuOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpOwogIH0KfQoKLyogTGFuZHNjYXBlIG1vYmlsZSBhZGp1c3RtZW50cyAqLwpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgewogIC5oZWFkZXIgewogICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICB9CgogIC5maWx0ZXJzLWJhciB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiA4cHg7CiAgfQoKICAuZmlsdGVyLWdyb3VwIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgd2lkdGg6IGF1dG87CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogIH0KCiAgLmZpbHRlci1ncm91cCBzZWxlY3QsCiAgLmZpbHRlci1ncm91cCBpbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKICB9CgogIC5zZWFyY2gtYm94IHsKICAgIHdpZHRoOiAyMDBweDsKICAgIGZsZXg6IDE7CiAgfQp9Ci50YWJsZS13cmFwcGVyOjphZnRlciB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICByaWdodDogMDsKICB3aWR0aDogMjBweDsKICBoZWlnaHQ6IDEwMCU7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCwgdmFyKC0tY2FyZCkpOwogIHBvaW50ZXItZXZlbnRzOiBub25lOwogIG9wYWNpdHk6IDA7CiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzOwp9Ci50YWJsZS13cmFwcGVyOmhvdmVyOjphZnRlciB7CiAgb3BhY2l0eTogMTsKfQo=
7
+ `;
8
+ export const MAIN_JS = `
9
+ LyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi8KLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LWZ1bmN0aW9uLXJldHVybi10eXBlICovCi8qIGdsb2JhbCBkb2N1bWVudCwgYWxlcnQsIGNvbmZpcm0gKi8KLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqLwovLyBDb25maWd1cmF0aW9uCmNvbnN0IEFQSV9CQVNFID0gJyc7Cgpjb25zdCBUSEVNRV9LRVkgPSAnemludHJ1c3Qtd29ya2Vycy1kYXNoYm9hcmQtdGhlbWUnOwpjb25zdCBBVVRPX1JFRlJFU0hfS0VZID0gJ3ppbnRydXN0LXdvcmtlcnMtZGFzaGJvYXJkLWF1dG8tcmVmcmVzaCc7CmNvbnN0IFBBR0VfU0laRV9LRVkgPSAnemludHJ1c3Qtd29ya2Vycy1kYXNoYm9hcmQtcGFnZS1zaXplJzsKY29uc3QgX0JVTEtfQVVUT19TVEFSVF9LRVkgPSAnemludHJ1c3Qtd29ya2Vycy1kYXNoYm9hcmQtYnVsay1hdXRvLXN0YXJ0JzsKCmxldCBjdXJyZW50UGFnZSA9IDE7CmxldCB0b3RhbFBhZ2VzID0gMTsKbGV0IHRvdGFsV29ya2VycyA9IDA7CmxldCBhdXRvUmVmcmVzaEVuYWJsZWQgPSB0cnVlOwpsZXQgcmVmcmVzaFRpbWVyID0gbnVsbDsKbGV0IGN1cnJlbnRUaGVtZSA9IG51bGw7CmxldCBldmVudFNvdXJjZSA9IG51bGw7CmxldCBzc2VBY3RpdmUgPSBmYWxzZTsKbGV0IGxhc3RTc2VSZWZyZXNoID0gMDsKY29uc3QgX2J1bGtBdXRvU3RhcnRFbmFibGVkID0gZmFsc2U7CmNvbnN0IF9sYXN0V29ya2VycyA9IFtdOwpjb25zdCBkZXRhaWxzQ2FjaGUgPSBuZXcgTWFwKCk7CmNvbnN0IE1BWF9DQUNIRV9TSVpFID0gNTA7CgovLyBUaGVtZSBtYW5hZ2VtZW50CmZ1bmN0aW9uIGdldFByZWZlcnJlZFRoZW1lKCkgewogIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFRIRU1FX0tFWSk7CiAgaWYgKHN0b3JlZCA9PT0gJ2xpZ2h0JyB8fCBzdG9yZWQgPT09ICdkYXJrJykgewogICAgcmV0dXJuIHN0b3JlZDsKICB9CiAgY29uc3QgcHJlZmVyc0xpZ2h0ID0KICAgIGdsb2JhbFRoaXMud2luZG93Lm1hdGNoTWVkaWEgJiYKICAgIGdsb2JhbFRoaXMud2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpJykubWF0Y2hlczsKICByZXR1cm4gcHJlZmVyc0xpZ2h0ID8gJ2xpZ2h0JyA6ICdkYXJrJzsKfQoKZnVuY3Rpb24gYXBwbHlUaGVtZShuZXh0VGhlbWUpIHsKICBjdXJyZW50VGhlbWUgPSBuZXh0VGhlbWU7CiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRhdGFzZXQudGhlbWUgPSBuZXh0VGhlbWU7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oVEhFTUVfS0VZLCBuZXh0VGhlbWUpOwp9CgpmdW5jdGlvbiB0b2dnbGVUaGVtZSgpIHsKICBhcHBseVRoZW1lKGN1cnJlbnRUaGVtZSA9PT0gJ2RhcmsnID8gJ2xpZ2h0JyA6ICdkYXJrJyk7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgRE9NIGVsZW1lbnRzCmZ1bmN0aW9uIGdldERvbUVsZW1lbnRzKCkgewogIHJldHVybiB7CiAgICBsb2FkaW5nOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpLAogICAgZXJyb3I6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcicpLAogICAgY29udGVudDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dvcmtlcnMtY29udGVudCcpLAogICAgc2VhcmNoQnRuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoLWJ0bicpLAogIH07Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBzaG93IGxvYWRpbmcgc3RhdGUKZnVuY3Rpb24gc2hvd0xvYWRpbmdTdGF0ZShlbGVtZW50cykgewogIGlmIChlbGVtZW50cy5jb250ZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgewogICAgZWxlbWVudHMubG9hZGluZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICB9IGVsc2UgewogICAgZWxlbWVudHMuY29udGVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7CiAgfQogIGVsZW1lbnRzLmVycm9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgaWYgKGVsZW1lbnRzLnNlYXJjaEJ0bikgZWxlbWVudHMuc2VhcmNoQnRuLmRpc2FibGVkID0gdHJ1ZTsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGhpZGUgbG9hZGluZyBzdGF0ZQpmdW5jdGlvbiBoaWRlTG9hZGluZ1N0YXRlKGVsZW1lbnRzKSB7CiAgZWxlbWVudHMubG9hZGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGVsZW1lbnRzLmNvbnRlbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgZWxlbWVudHMuY29udGVudC5zdHlsZS5vcGFjaXR5ID0gJzEnOwogIGlmIChlbGVtZW50cy5zZWFyY2hCdG4pIGVsZW1lbnRzLnNlYXJjaEJ0bi5kaXNhYmxlZCA9IGZhbHNlOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gaGFuZGxlIGZldGNoIGVycm9yCmZ1bmN0aW9uIGhhbmRsZUZldGNoRXJyb3IoZWxlbWVudHMsIGVycm9yKSB7CiAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgd29ya2VyczonLCBlcnJvcik7CiAgaGlkZUxvYWRpbmdTdGF0ZShlbGVtZW50cyk7CiAgZWxlbWVudHMuZXJyb3Iuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byB2YWxpZGF0ZSB3b3JrZXIgZGF0YQpmdW5jdGlvbiB2YWxpZGF0ZVdvcmtlckRhdGEoZGF0YSkgewogIGlmICghZGF0YSB8fCAhZGF0YS53b3JrZXJzIHx8ICFBcnJheS5pc0FycmF5KGRhdGEud29ya2VycykpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgd29ya2VyIGRhdGEgc3RydWN0dXJlOicsIGRhdGEpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKLy8gRGF0YSBmZXRjaGluZyAtIG9ubHkgZm9yIHNlYXJjaCBhbmQgcGFnaW5hdGlvbiwgU1NFIGhhbmRsZXMgcmVndWxhciB1cGRhdGVzCmFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSgpIHsKICBjb25zdCBlbGVtZW50cyA9IGdldERvbUVsZW1lbnRzKCk7CgogIHNob3dMb2FkaW5nU3RhdGUoZWxlbWVudHMpOwoKICB0cnkgewogICAgY29uc3QgcXVlcnkgPSBlbGVtZW50cy5zZWFyY2hCdG4KICAgICAgPyBlbGVtZW50cy5zZWFyY2hCdG4ucGFyZW50RWxlbWVudD8ucGFyZW50RWxlbWVudD8ucXVlcnlTZWxlY3RvcignaW5wdXQnKT8udmFsdWUKICAgICAgOiAnJzsKICAgIGNvbnN0IGxpbWl0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oUEFHRV9TSVpFX0tFWSkgfHwgJzEwMCc7CgogICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7CiAgICAgIHBhZ2U6IGN1cnJlbnRQYWdlLnRvU3RyaW5nKCksCiAgICAgIGxpbWl0OiBsaW1pdCwKICAgICAgc3RhdHVzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzLWZpbHRlcicpPy52YWx1ZSB8fCAnJywKICAgICAgZHJpdmVyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJpdmVyLWZpbHRlcicpPy52YWx1ZSB8fCAnJywKICAgICAgc29ydEJ5OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc29ydC1zZWxlY3QnKT8udmFsdWUgfHwgJ3N0YXR1cycsCiAgICAgIHNvcnRPcmRlcjogJ2FzYycsCiAgICAgIHNlYXJjaDogcXVlcnksCiAgICB9KTsKCiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKEFQSV9CQVNFICsgJy9hcGkvd29ya2Vycz8nICsgcGFyYW1zLnRvU3RyaW5nKCkpOwogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggd29ya2VyczonLCByZXNwb25zZS5zdGF0dXNUZXh0KTsKICAgICAgaGlkZUxvYWRpbmdTdGF0ZShlbGVtZW50cyk7CiAgICAgIGVsZW1lbnRzLmVycm9yLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgZGF0YSByZWNlaXZlZDonLCBkYXRhKTsKCiAgICBpZiAoIXZhbGlkYXRlV29ya2VyRGF0YShkYXRhKSkgewogICAgICBlbGVtZW50cy5lcnJvci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgaGlkZUxvYWRpbmdTdGF0ZShlbGVtZW50cyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zb2xlLmxvZygnUmVuZGVyaW5nJywgZGF0YS53b3JrZXJzLmxlbmd0aCwgJ3dvcmtlcnMnKTsKICAgIHJlbmRlcldvcmtlcnMoZGF0YSk7CiAgICBoaWRlTG9hZGluZ1N0YXRlKGVsZW1lbnRzKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIGhhbmRsZUZldGNoRXJyb3IoZWxlbWVudHMsIGVycik7CiAgfQp9CgpmdW5jdGlvbiBjaGFuZ2VMaW1pdChfbmV3TGltaXQpIHsKICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShQQUdFX1NJWkVfS0VZLCBfbmV3TGltaXQpOwogIGN1cnJlbnRQYWdlID0gMTsKICBmZXRjaERhdGEoKTsgLy8gRW5hYmxlIGZvciBwYWdpbmF0aW9uCn0KCi8vIE1ha2UgZnVuY3Rpb25zIGdsb2JhbGx5IGF2YWlsYWJsZSBmb3IgSFRNTCBvbmNsaWNrL29uY2hhbmdlIGhhbmRsZXJzCmdsb2JhbFRoaXMuY2hhbmdlTGltaXQgPSBjaGFuZ2VMaW1pdDsKZ2xvYmFsVGhpcy50b2dnbGVBdXRvUmVmcmVzaCA9IHRvZ2dsZUF1dG9SZWZyZXNoOwpnbG9iYWxUaGlzLmZldGNoRGF0YSA9IGZldGNoRGF0YTsKZ2xvYmFsVGhpcy5zaG93QWRkV29ya2VyTW9kYWwgPSBzaG93QWRkV29ya2VyTW9kYWw7Cmdsb2JhbFRoaXMubG9hZFBhZ2UgPSBsb2FkUGFnZTsKZ2xvYmFsVGhpcy5zdGFydFdvcmtlciA9IHN0YXJ0V29ya2VyOwpnbG9iYWxUaGlzLnN0b3BXb3JrZXIgPSBzdG9wV29ya2VyOwpnbG9iYWxUaGlzLnJlc3RhcnRXb3JrZXIgPSByZXN0YXJ0V29ya2VyOwpnbG9iYWxUaGlzLmRlbGV0ZVdvcmtlciA9IGRlbGV0ZVdvcmtlcjsKZ2xvYmFsVGhpcy50b2dnbGVBdXRvU3RhcnQgPSB0b2dnbGVBdXRvU3RhcnQ7Cmdsb2JhbFRoaXMudG9nZ2xlRGV0YWlscyA9IHRvZ2dsZURldGFpbHM7CgovLyBIZWxwZXIgZnVuY3Rpb25zIHRvIHJlZHVjZSBjb21wbGV4aXR5CmZ1bmN0aW9uIHZhbGlkYXRlRHJpdmVyKGRyaXZlcikgewogIHJldHVybiAhZHJpdmVyIHx8IFsnZGF0YWJhc2UnLCAncmVkaXMnLCAnbWVtb3J5J10uaW5jbHVkZXMoZHJpdmVyKTsKfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hXb3JrZXJEYXRhKHdvcmtlck5hbWUsIGRyaXZlcikgewogIGNvbnN0IFtkZXRhaWxzUmVzLCBoaXN0b3J5UmVzLCB0cmVuZFJlcywgc2xhUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgIGZldGNoKEFQSV9CQVNFICsgJy9hcGkvd29ya2Vycy8nICsgd29ya2VyTmFtZSArICcvZGV0YWlscz9kcml2ZXI9JyArIGRyaXZlciksCiAgICBmZXRjaChBUElfQkFTRSArICcvYXBpL3dvcmtlcnMvJyArIHdvcmtlck5hbWUgKyAnL21vbml0b3JpbmcvaGlzdG9yeT9saW1pdD01MCcpLAogICAgZmV0Y2goQVBJX0JBU0UgKyAnL2FwaS93b3JrZXJzLycgKyB3b3JrZXJOYW1lICsgJy9tb25pdG9yaW5nL3RyZW5kJyksCiAgICBmZXRjaChBUElfQkFTRSArICcvYXBpL3dvcmtlcnMvJyArIHdvcmtlck5hbWUgKyAnL3NsYS9zdGF0dXMnKSwKICBdKTsKCiAgcmV0dXJuIHsgZGV0YWlsc1JlcywgaGlzdG9yeVJlcywgdHJlbmRSZXMsIHNsYVJlcyB9Owp9Cgphc3luYyBmdW5jdGlvbiBwcm9jZXNzRGV0YWlsc1Jlc3BvbnNlKGRldGFpbHNSZXMsIGRhdGEpIHsKICBpZiAoIWRldGFpbHNSZXMub2spIHJldHVybjsKICBjb25zdCBqc29uID0gYXdhaXQgZGV0YWlsc1Jlcy5qc29uKCk7CiAgT2JqZWN0LmFzc2lnbihkYXRhLCBqc29uKTsKfQoKYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1NsYVJlc3BvbnNlKHNsYVJlcywgZGF0YSkgewogIGlmICghc2xhUmVzLm9rKSByZXR1cm47CiAgY29uc3Qgc2xhSnNvbiA9IGF3YWl0IHNsYVJlcy5qc29uKCk7CiAgaWYgKHNsYUpzb24uc3RhdHVzKSB7CiAgICBpZiAoIWRhdGEuZGV0YWlscykgZGF0YS5kZXRhaWxzID0ge307CiAgICBkYXRhLmRldGFpbHMuc2xhID0gc2xhSnNvbi5zdGF0dXM7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBwcm9jZXNzSGlzdG9yeVJlc3BvbnNlKGhpc3RvcnlSZXMsIGRhdGEpIHsKICBpZiAoIWhpc3RvcnlSZXMub2spIHJldHVybjsKICBjb25zdCBoaXN0b3J5SnNvbiA9IGF3YWl0IGhpc3RvcnlSZXMuanNvbigpOwogIGlmICghaGlzdG9yeUpzb24uaGlzdG9yeSB8fCAhQXJyYXkuaXNBcnJheShoaXN0b3J5SnNvbi5oaXN0b3J5KSkgcmV0dXJuOwoKICBjb25zdCBmb3JtYXR0ZWRMb2dzID0gaGlzdG9yeUpzb24uaGlzdG9yeS5tYXAoKGgpID0+IHsKICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZShoLnRpbWVzdGFtcCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7CiAgICBjb25zdCBtc2cgPSBoLm1lc3NhZ2UgPyBgIC0gJHtoLm1lc3NhZ2V9YCA6ICcnOwogICAgcmV0dXJuIGBbJHt0aW1lfV0gJHtoLnN0YXR1cy50b1VwcGVyQ2FzZSgpfSAoJHtoLmxhdGVuY3l9bXMpJHttc2d9YDsKICB9KTsKCiAgaWYgKCFkYXRhLmRldGFpbHMpIGRhdGEuZGV0YWlscyA9IHt9OwogIGRhdGEuZGV0YWlscy5yZWNlbnRMb2dzID0gZm9ybWF0dGVkTG9nczsKfQoKYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1RyZW5kUmVzcG9uc2UodHJlbmRSZXMsIGRhdGEpIHsKICBpZiAoIXRyZW5kUmVzLm9rKSByZXR1cm47CiAgY29uc3QgdHJlbmRKc29uID0gYXdhaXQgdHJlbmRSZXMuanNvbigpOwogIGlmICghdHJlbmRKc29uLnRyZW5kKSByZXR1cm47CgogIGlmICghZGF0YS5kZXRhaWxzKSBkYXRhLmRldGFpbHMgPSB7fTsKICBpZiAoIWRhdGEuZGV0YWlscy5tZXRyaWNzKSBkYXRhLmRldGFpbHMubWV0cmljcyA9IHt9OwogIGRhdGEuZGV0YWlscy5tZXRyaWNzLnVwdGltZVRyZW5kID0gKHRyZW5kSnNvbi50cmVuZC51cHRpbWUgKiAxMDApLnRvRml4ZWQoMSkgKyAnJSc7CiAgaWYgKHRyZW5kSnNvbi50cmVuZC5zYW1wbGVzKSBkYXRhLmRldGFpbHMubWV0cmljcy5zYW1wbGVzID0gdHJlbmRKc29uLnRyZW5kLnNhbXBsZXM7Cn0KCmZ1bmN0aW9uIG1hbmFnZUNhY2hlU2l6ZSgpIHsKICBpZiAoZGV0YWlsc0NhY2hlLnNpemUgPj0gTUFYX0NBQ0hFX1NJWkUpIHsKICAgIGNvbnN0IGZpcnN0S2V5ID0gZGV0YWlsc0NhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7CiAgICBkZXRhaWxzQ2FjaGUuZGVsZXRlKGZpcnN0S2V5KTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVdvcmtlckRldGFpbHMod29ya2VyTmFtZSwgZGV0YWlsUm93LCBkcml2ZXIpIHsKICBpZiAoIXdvcmtlck5hbWUgfHwgIWRldGFpbFJvdykgcmV0dXJuOwoKICBpZiAoIWRldGFpbHNDYWNoZS5oYXMod29ya2VyTmFtZSkpIHsKICAgIHRyeSB7CiAgICAgIGlmICghdmFsaWRhdGVEcml2ZXIoZHJpdmVyKSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZHJpdmVyIHNwZWNpZmllZCcpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgZmV0Y2hXb3JrZXJEYXRhKHdvcmtlck5hbWUsIGRyaXZlcik7CiAgICAgIGNvbnN0IGRhdGEgPSB7fTsKCiAgICAgIGF3YWl0IHByb2Nlc3NEZXRhaWxzUmVzcG9uc2UocmVzcG9uc2VzLmRldGFpbHNSZXMsIGRhdGEpOwogICAgICBhd2FpdCBwcm9jZXNzU2xhUmVzcG9uc2UocmVzcG9uc2VzLnNsYVJlcywgZGF0YSk7CiAgICAgIGF3YWl0IHByb2Nlc3NIaXN0b3J5UmVzcG9uc2UocmVzcG9uc2VzLmhpc3RvcnlSZXMsIGRhdGEpOwogICAgICBhd2FpdCBwcm9jZXNzVHJlbmRSZXNwb25zZShyZXNwb25zZXMudHJlbmRSZXMsIGRhdGEpOwoKICAgICAgbWFuYWdlQ2FjaGVTaXplKCk7CiAgICAgIGRldGFpbHNDYWNoZS5zZXQod29ya2VyTmFtZSwgZGF0YSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgd29ya2VyIGRldGFpbHM6JywgZXJyKTsKICAgIH0KICB9CgogIGNvbnN0IGNhY2hlZCA9IGRldGFpbHNDYWNoZS5nZXQod29ya2VyTmFtZSk7CiAgY29uc3QgZGV0YWlsc0RhdGEgPSBjYWNoZWQ/LmRldGFpbHMgPz8gY2FjaGVkOwogIHVwZGF0ZURldGFpbFZpZXdzKGRldGFpbFJvdywgZGV0YWlsc0RhdGEpOwp9CgovLyBIZWxwZXIgdG8gc2FmZSBhY2Nlc3MgbmVzdGVkIHByb3BlcnRpZXMgKHNoYXJlZCBhY3Jvc3MgZnVuY3Rpb25zKQpjb25zdCBnZXQgPSAob2JqLCBwYXRoKSA9PiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvLCBpKSA9PiAobyA/IG9baV0gOiBudWxsKSwgb2JqKTsKCi8vIEhlbHBlciBmdW5jdGlvbiB0byByZXNvbHZlIG1ldHJpYyB2YWx1ZSBmcm9tIGRpZmZlcmVudCBkYXRhIHNvdXJjZXMKZnVuY3Rpb24gcmVzb2x2ZU1ldHJpY1ZhbHVlKGRldGFpbHMsIGtleSwgb3JpZ2luYWxWYWx1ZSkgewogIGlmICgha2V5LnN0YXJ0c1dpdGgoJ21ldHJpY3MuJykpIHJldHVybiBvcmlnaW5hbFZhbHVlOwoKICBjb25zdCBtZXRyaWNLZXkgPSBrZXkucmVwbGFjZSgnbWV0cmljcy4nLCAnJyk7CiAgLy8gVHJ5IHRvIGdldCBmcm9tIGRldGFpbHMubWV0cmljcyBmaXJzdCwgdGhlbiBmcm9tIGRldGFpbHMgZGlyZWN0bHksIHRoZW4gZnJvbSB3b3JrZXIKICByZXR1cm4gKAogICAgZ2V0KGRldGFpbHMsIGBtZXRyaWNzLiR7bWV0cmljS2V5fWApIHx8CiAgICBnZXQoZGV0YWlscywgbWV0cmljS2V5KSB8fAogICAgZ2V0KGRldGFpbHMsIGBkZXRhaWxzLm1ldHJpY3MuJHttZXRyaWNLZXl9YCkgfHwKICAgIG9yaWdpbmFsVmFsdWUKICApOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IG1ldHJpYyB2YWx1ZXMKZnVuY3Rpb24gZm9ybWF0TWV0cmljVmFsdWUoa2V5LCB2YWx1ZSkgewogIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7CgogIHN3aXRjaCAoa2V5KSB7CiAgICBjYXNlICdtZXRyaWNzLnByb2Nlc3NlZCc6CiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpLnRvTG9jYWxlU3RyaW5nKCk7CiAgICBjYXNlICdtZXRyaWNzLmF2Z1RpbWUnOgogICAgICByZXR1cm4gdmFsdWUgKyAnbXMnOwogICAgY2FzZSAnbWV0cmljcy5tZW1vcnknOgogICAgICByZXR1cm4gdmFsdWUgKyAnTUInOwogICAgY2FzZSAnbWV0cmljcy5jcHUnOgogICAgICByZXR1cm4gdmFsdWUgKyAnJSc7CiAgICBjYXNlICdtZXRyaWNzLnVwdGltZSc6CiAgICAgIHJldHVybiBmb3JtYXRVcHRpbWUodmFsdWUpOwogICAgY2FzZSAnaGVhbHRoLmxhc3RDaGVjayc6CiAgICAgIHJldHVybiBmb3JtYXRUaW1lQWdvKHZhbHVlKTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgYSBzaW5nbGUgZWxlbWVudApmdW5jdGlvbiB1cGRhdGVEZXRhaWxFbGVtZW50KGVsLCBkZXRhaWxzKSB7CiAgY29uc3Qga2V5ID0gZWwuZGF0YXNldC5rZXk7CiAgbGV0IHZhbHVlID0gZ2V0KGRldGFpbHMsIGtleSk7CgogIC8vIFJlc29sdmUgbWV0cmljIHZhbHVlcyBmcm9tIGRpZmZlcmVudCBzb3VyY2VzCiAgdmFsdWUgPSByZXNvbHZlTWV0cmljVmFsdWUoZGV0YWlscywga2V5LCB2YWx1ZSk7CgogIC8vIEZvcm1hdCB0aGUgdmFsdWUKICB2YWx1ZSA9IGZvcm1hdE1ldHJpY1ZhbHVlKGtleSwgdmFsdWUpOwoKICAvLyBVcGRhdGUgZWxlbWVudCBpZiB2YWx1ZSBpcyB2YWxpZAogIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJykgewogICAgZWwudGV4dENvbnRlbnQgPSB2YWx1ZTsKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZURldGFpbFZpZXdzKGRldGFpbFJvdywgZGV0YWlscykgewogIGlmICghZGV0YWlscykgcmV0dXJuOwoKICAvLyBVcGRhdGUgYWxsIGRhdGEta2V5IGVsZW1lbnRzCiAgZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWtleV0nKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7CiAgICB1cGRhdGVEZXRhaWxFbGVtZW50KGVsZW1lbnQpOwogIH0pOwoKICAvLyBEZWxlZ2F0ZSB0byBzcGVjaWFsaXplZCBmdW5jdGlvbnMKICB1cGRhdGVMb2dzQ29udGFpbmVyKGRldGFpbFJvdywgZGV0YWlscyk7CiAgdXBkYXRlU0xBQ29udGFpbmVyKGRldGFpbFJvdywgZGV0YWlscyk7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBmb3JtYXQgdXB0aW1lCmZ1bmN0aW9uIGZvcm1hdFVwdGltZShzZWNvbmRzKSB7CiAgaWYgKCFzZWNvbmRzIHx8IHNlY29uZHMgPT09ICdOL0EnKSByZXR1cm4gJ04vQSc7CgogIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA4NjQwMCk7CiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKChzZWNvbmRzICUgODY0MDApIC8gMzYwMCk7CiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSAzNjAwKSAvIDYwKTsKCiAgaWYgKGRheXMgPiAwKSB7CiAgICByZXR1cm4gYCR7ZGF5c31kICR7aG91cnN9aCAke21pbnV0ZXN9bWA7CiAgfSBlbHNlIGlmIChob3VycyA+IDApIHsKICAgIHJldHVybiBgJHtob3Vyc31oICR7bWludXRlc31tYDsKICB9IGVsc2UgewogICAgcmV0dXJuIGAke21pbnV0ZXN9bWA7CiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVMb2dzQ29udGFpbmVyKGRldGFpbFJvdywgZGV0YWlscykgewogIC8vIEhhbmRsZSBsb2dzIGlmIHByZXNlbnQKICBjb25zdCBsb2dzQ29udGFpbmVyID0gZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3IoJy5sb2dzLWNvbnRlbnQnKTsKICBpZiAobG9nc0NvbnRhaW5lciAmJiBkZXRhaWxzLnJlY2VudExvZ3MgJiYgQXJyYXkuaXNBcnJheShkZXRhaWxzLnJlY2VudExvZ3MpKSB7CiAgICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50IHNhZmVseQogICAgd2hpbGUgKGxvZ3NDb250YWluZXIuZmlyc3RDaGlsZCkgewogICAgICBsb2dzQ29udGFpbmVyLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgICB9CgogICAgaWYgKGRldGFpbHMucmVjZW50TG9ncy5sZW5ndGggPT09IDApIHsKICAgICAgY29uc3Qgbm9Mb2dzTXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIG5vTG9nc01zZy5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOwogICAgICBub0xvZ3NNc2cudGV4dENvbnRlbnQgPSAnTm8gcmVjZW50IGxvZ3MnOwogICAgICBsb2dzQ29udGFpbmVyLmFwcGVuZENoaWxkKG5vTG9nc01zZyk7CiAgICB9IGVsc2UgewogICAgICBkZXRhaWxzLnJlY2VudExvZ3MuZm9yRWFjaCgobG9nKSA9PiB7CiAgICAgICAgbGV0IGNvbG9yID0gJ3ZhcigtLXRleHQpJzsKICAgICAgICBpZiAoCiAgICAgICAgICBsb2cudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZmFpbGVkJykgfHwKICAgICAgICAgIGxvZy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdlcnJvcicpIHx8CiAgICAgICAgICBsb2cudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZG93bicpIHx8CiAgICAgICAgICBsb2cudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndW5oZWFsdGh5JykKICAgICAgICApCiAgICAgICAgICBjb2xvciA9ICd2YXIoLS1kYW5nZXIpJzsKICAgICAgICBlbHNlIGlmIChsb2cudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnc3VjY2VzcycpIHx8IGxvZy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdoZWFsdGh5JykpCiAgICAgICAgICBjb2xvciA9ICd2YXIoLS1zdWNjZXNzKSc7CiAgICAgICAgZWxzZSBpZiAobG9nLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3Byb2Nlc3NpbmcnKSkgY29sb3IgPSAndmFyKC0taW5mbyknOwoKICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgbG9nRWxlbWVudC5zdHlsZS5jb2xvciA9IGNvbG9yOwogICAgICAgIGxvZ0VsZW1lbnQudGV4dENvbnRlbnQgPSBsb2c7IC8vIFNhZmU6IHRleHRDb250ZW50IGRvZXNuJ3QgZXhlY3V0ZSBIVE1MCiAgICAgICAgbG9nc0NvbnRhaW5lci5hcHBlbmRDaGlsZChsb2dFbGVtZW50KTsKICAgICAgfSk7CiAgICB9CiAgfSBlbHNlIGlmIChsb2dzQ29udGFpbmVyKSB7CiAgICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50IHNhZmVseQogICAgd2hpbGUgKGxvZ3NDb250YWluZXIuZmlyc3RDaGlsZCkgewogICAgICBsb2dzQ29udGFpbmVyLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgICB9CiAgICBjb25zdCBub0xvZ3NNc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIG5vTG9nc01zZy5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOwogICAgbm9Mb2dzTXNnLnRleHRDb250ZW50ID0gJ05vIGxvZ3MgYXZhaWxhYmxlJzsKICAgIGxvZ3NDb250YWluZXIuYXBwZW5kQ2hpbGQobm9Mb2dzTXNnKTsKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVNMQUNvbnRhaW5lcihkZXRhaWxSb3csIGRldGFpbHMpIHsKICAvLyBSZW5kZXIgU0xBIFNjb3JlY2FyZCBpZiBjb250YWluZXIvZGF0YSBleGlzdHMKICBjb25zdCBzbGFDb250YWluZXIgPSBkZXRhaWxSb3cucXVlcnlTZWxlY3RvcignLnNsYS1zY29yZWNhcmQtY29udGFpbmVyJyk7CiAgaWYgKHNsYUNvbnRhaW5lciAmJiBkZXRhaWxzLnNsYSkgewogICAgY29uc3QgcyA9IGRldGFpbHMuc2xhOwoKICAgIC8vIENsZWFyIGV4aXN0aW5nIGNvbnRlbnQgc2FmZWx5CiAgICB3aGlsZSAoc2xhQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHsKICAgICAgc2xhQ29udGFpbmVyLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgICB9CgogICAgLy8gQ3JlYXRlIG1haW4gY29udGFpbmVyCiAgICBjb25zdCBtYWluRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBtYWluRGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tYm9yZGVyKSc7CiAgICBtYWluRGl2LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc2cHgnOwogICAgbWFpbkRpdi5zdHlsZS5wYWRkaW5nID0gJzEwcHgnOwogICAgbWFpbkRpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWlucHV0LWJnKSc7CgogICAgLy8gQ3JlYXRlIGhlYWRlcgogICAgY29uc3QgaGVhZGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBoZWFkZXJEaXYuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgIGhlYWRlckRpdi5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdzcGFjZS1iZXR3ZWVuJzsKICAgIGhlYWRlckRpdi5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnOHB4JzsKICAgIGhlYWRlckRpdi5zdHlsZS5ib3JkZXJCb3R0b20gPSAnMXB4IHNvbGlkIHZhcigtLWJvcmRlciknOwogICAgaGVhZGVyRGl2LnN0eWxlLnBhZGRpbmdCb3R0b20gPSAnNHB4JzsKCiAgICBjb25zdCB0aXRsZVN0cm9uZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0cm9uZycpOwogICAgdGl0bGVTdHJvbmcuc3R5bGUuZm9udFNpemUgPSAnMTNweCc7CiAgICB0aXRsZVN0cm9uZy50ZXh0Q29udGVudCA9ICdTTEEgU3RhdHVzJzsKCiAgICBjb25zdCBzdGF0dXNTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgLy8gRXh0cmFjdCBuZXN0ZWQgdGVybmFyeSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CiAgICBsZXQgc3RhdHVzQ2xhc3M7CiAgICBpZiAocy5zdGF0dXMgPT09ICdwYXNzJykgewogICAgICBzdGF0dXNDbGFzcyA9ICdhY3RpdmUnOwogICAgfSBlbHNlIGlmIChzLnN0YXR1cyA9PT0gJ2ZhaWwnKSB7CiAgICAgIHN0YXR1c0NsYXNzID0gJ2Vycm9yJzsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXR1c0NsYXNzID0gJ3dhcm5pbmcnOwogICAgfQogICAgc3RhdHVzU3Bhbi5jbGFzc05hbWUgPSBgc3RhdHVzLWJhZGdlIHN0YXR1cy0ke3N0YXR1c0NsYXNzfWA7CiAgICBzdGF0dXNTcGFuLnRleHRDb250ZW50ID0gcy5zdGF0dXMudG9VcHBlckNhc2UoKTsKCiAgICBoZWFkZXJEaXYuYXBwZW5kQ2hpbGQodGl0bGVTdHJvbmcpOwogICAgaGVhZGVyRGl2LmFwcGVuZENoaWxkKHN0YXR1c1NwYW4pOwogICAgbWFpbkRpdi5hcHBlbmRDaGlsZChoZWFkZXJEaXYpOwoKICAgIC8vIENyZWF0ZSBjaGVja3MgY29udGFpbmVyCiAgICBjb25zdCBjaGVja3NEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNoZWNrc0Rpdi5jbGFzc05hbWUgPSAnc2xhLWNoZWNrcyc7CgogICAgaWYgKHMuY2hlY2tzICYmIE9iamVjdC5rZXlzKHMuY2hlY2tzKS5sZW5ndGggPiAwKSB7CiAgICAgIE9iamVjdC5lbnRyaWVzKHMuY2hlY2tzKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7CiAgICAgICAgLy8gRXh0cmFjdCBuZXN0ZWQgdGVybmFyeSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CiAgICAgICAgbGV0IGNvbG9yOwogICAgICAgIGlmICh2YWwuc3RhdHVzID09PSAncGFzcycpIHsKICAgICAgICAgIGNvbG9yID0gJ3ZhcigtLXN1Y2Nlc3MpJzsKICAgICAgICB9IGVsc2UgaWYgKHZhbC5zdGF0dXMgPT09ICdmYWlsJykgewogICAgICAgICAgY29sb3IgPSAndmFyKC0tZGFuZ2VyKSc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbG9yID0gJ3ZhcigtLXdhcm5pbmcpJzsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGNoZWNrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgY2hlY2tEaXYuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICBjaGVja0Rpdi5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdzcGFjZS1iZXR3ZWVuJzsKICAgICAgICBjaGVja0Rpdi5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JzsKICAgICAgICBjaGVja0Rpdi5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnNHB4JzsKCiAgICAgICAgY29uc3Qga2V5U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBrZXlTcGFuLnRleHRDb250ZW50ID0ga2V5OyAvLyBTYWZlOiB0ZXh0Q29udGVudAoKICAgICAgICBjb25zdCB2YWx1ZVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgdmFsdWVTcGFuLnN0eWxlLmNvbG9yID0gY29sb3I7CiAgICAgICAgdmFsdWVTcGFuLnRleHRDb250ZW50ID0gYCR7dmFsLnZhbHVlfSAobXNnOiAke3ZhbC5zdGF0dXN9KWA7IC8vIFNhZmU6IHRleHRDb250ZW50CgogICAgICAgIGNoZWNrRGl2LmFwcGVuZENoaWxkKGtleVNwYW4pOwogICAgICAgIGNoZWNrRGl2LmFwcGVuZENoaWxkKHZhbHVlU3Bhbik7CiAgICAgICAgY2hlY2tzRGl2LmFwcGVuZENoaWxkKGNoZWNrRGl2KTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBub0NoZWNrc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBub0NoZWNrc0Rpdi5jbGFzc05hbWUgPSAndGV4dC1tdXRlZCc7CiAgICAgIG5vQ2hlY2tzRGl2LnRleHRDb250ZW50ID0gJ05vIGNoZWNrcyc7CiAgICAgIGNoZWNrc0Rpdi5hcHBlbmRDaGlsZChub0NoZWNrc0Rpdik7CiAgICB9CgogICAgbWFpbkRpdi5hcHBlbmRDaGlsZChjaGVja3NEaXYpOwoKICAgIC8vIENyZWF0ZSBmb290ZXIKICAgIGNvbnN0IGZvb3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZm9vdGVyRGl2LnN0eWxlLm1hcmdpblRvcCA9ICc2cHgnOwogICAgZm9vdGVyRGl2LnN0eWxlLmZvbnRTaXplID0gJzEwcHgnOwogICAgZm9vdGVyRGl2LnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7CiAgICBmb290ZXJEaXYuc3R5bGUudGV4dEFsaWduID0gJ3JpZ2h0JzsKICAgIGZvb3RlckRpdi50ZXh0Q29udGVudCA9IGBFdmFsdWF0ZWQ6ICR7bmV3IERhdGUocy5ldmFsdWF0ZWRBdCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDsKCiAgICBtYWluRGl2LmFwcGVuZENoaWxkKGZvb3RlckRpdik7CiAgICBzbGFDb250YWluZXIuYXBwZW5kQ2hpbGQobWFpbkRpdik7CiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVRdWV1ZVN1bW1hcnkocXVldWVEYXRhKSB7CiAgaWYgKCFxdWV1ZURhdGEpIHJldHVybjsKICBjb25zdCBkcml2ZXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWV1ZS1kcml2ZXInKTsKICBjb25zdCB0b3RhbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1ZXVlLXRvdGFsJyk7CiAgY29uc3Qgam9ic0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1ZXVlLWpvYnMnKTsKICBjb25zdCBwcm9jZXNzaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVldWUtcHJvY2Vzc2luZycpOwogIGNvbnN0IGZhaWxlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1ZXVlLWZhaWxlZCcpOwoKICBpZiAoZHJpdmVyRWwpIGRyaXZlckVsLnRleHRDb250ZW50ID0gcXVldWVEYXRhLmRyaXZlciB8fCAnLSc7CiAgaWYgKHRvdGFsRWwpIHRvdGFsRWwudGV4dENvbnRlbnQgPSBTdHJpbmcocXVldWVEYXRhLnRvdGFsUXVldWVzID8/IDApOwogIGlmIChqb2JzRWwpIGpvYnNFbC50ZXh0Q29udGVudCA9IFN0cmluZyhxdWV1ZURhdGEudG90YWxKb2JzID8/IDApOwogIGlmIChwcm9jZXNzaW5nRWwpIHByb2Nlc3NpbmdFbC50ZXh0Q29udGVudCA9IFN0cmluZyhxdWV1ZURhdGEucHJvY2Vzc2luZ0pvYnMgPz8gMCk7CiAgaWYgKGZhaWxlZEVsKSBmYWlsZWRFbC50ZXh0Q29udGVudCA9IFN0cmluZyhxdWV1ZURhdGEuZmFpbGVkSm9icyA/PyAwKTsKfQoKZnVuY3Rpb24gdXBkYXRlRHJpdmVyRmlsdGVyKGRyaXZlcnMpIHsKICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJpdmVyLWZpbHRlcicpOwogIGlmICghc2VsZWN0IHx8ICFBcnJheS5pc0FycmF5KGRyaXZlcnMpKSByZXR1cm47CiAgY29uc3QgY3VycmVudFZhbHVlID0gc2VsZWN0LnZhbHVlOwoKICAvLyBDbGVhciBleGlzdGluZyBvcHRpb25zIHNhZmVseQogIHdoaWxlIChzZWxlY3QuZmlyc3RDaGlsZCkgewogICAgc2VsZWN0LmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgfQoKICAvLyBBZGQgIkFsbCBEcml2ZXJzIiBvcHRpb24KICBjb25zdCBhbGxPcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICBhbGxPcHRpb24udmFsdWUgPSAnJzsKICBhbGxPcHRpb24udGV4dENvbnRlbnQgPSAnQWxsIERyaXZlcnMnOwogIHNlbGVjdC5hcHBlbmRDaGlsZChhbGxPcHRpb24pOwogIGRyaXZlcnMuZm9yRWFjaCgoZHJpdmVyKSA9PiB7CiAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgIG9wdGlvbi52YWx1ZSA9IGRyaXZlcjsKICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IGRyaXZlci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGRyaXZlci5zbGljZSgxKTsKICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHRpb24pOwogIH0pOwogIGlmIChkcml2ZXJzLmluY2x1ZGVzKGN1cnJlbnRWYWx1ZSkpIHsKICAgIHNlbGVjdC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTsKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZURyaXZlcnNMaXN0KGRyaXZlcnMpIHsKICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyaXZlcnMtbGlzdCcpOwogIGlmICghbGlzdCkgcmV0dXJuOwoKICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50IHNhZmVseQogIHdoaWxlIChsaXN0LmZpcnN0Q2hpbGQpIHsKICAgIGxpc3QuZmlyc3RDaGlsZC5yZW1vdmUoKTsKICB9CiAgaWYgKCFBcnJheS5pc0FycmF5KGRyaXZlcnMpIHx8IGRyaXZlcnMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm47CiAgfQogIGRyaXZlcnMuZm9yRWFjaCgoZHJpdmVyKSA9PiB7CiAgICBjb25zdCBjaGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgY2hpcC5jbGFzc05hbWUgPSAnZHJpdmVyLWNoaXAnOwogICAgY2hpcC50ZXh0Q29udGVudCA9IGRyaXZlcjsKICAgIGxpc3QuYXBwZW5kQ2hpbGQoY2hpcCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVdvcmtlclJvdyh3b3JrZXIpIHsKICBjb25zdCBkZXRhaWxzSWQgPSBgZGV0YWlscy0ke3dvcmtlci5uYW1lLnJlcGxhY2VBbGwoL1teYS16MC05XS9naSwgJy0nKX1gOwoKICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwogIHJvdy5jbGFzc05hbWUgPSAnZXhwYW5kZXInOwogIHJvdy5kYXRhc2V0Lndvcmtlck5hbWUgPSB3b3JrZXIubmFtZTsKICByb3cuZGF0YXNldC53b3JrZXJEcml2ZXIgPSB3b3JrZXIuZHJpdmVyOwoKICAvLyBDcmVhdGUgY2VsbHMgdXNpbmcgaGVscGVyIGZ1bmN0aW9ucwogIGNvbnN0IG5hbWVDZWxsID0gY3JlYXRlTmFtZUNlbGwod29ya2VyLCBkZXRhaWxzSWQpOwogIGNvbnN0IHN0YXR1c0NlbGwgPSBjcmVhdGVTdGF0dXNDZWxsKHdvcmtlcik7CiAgY29uc3QgaGVhbHRoQ2VsbCA9IGNyZWF0ZUhlYWx0aENlbGwod29ya2VyKTsKICBjb25zdCBkcml2ZXJDZWxsID0gY3JlYXRlRHJpdmVyQ2VsbCh3b3JrZXIpOwogIGNvbnN0IHZlcnNpb25DZWxsID0gY3JlYXRlVmVyc2lvbkNlbGwod29ya2VyKTsKICBjb25zdCBwZXJmQ2VsbCA9IGNyZWF0ZVBlcmZvcm1hbmNlQ2VsbCgpOwogIGNvbnN0IGFjdGlvbkNlbGwgPSBjcmVhdGVBY3Rpb25DZWxsKHdvcmtlcik7CgogIC8vIEFwcGVuZCBhbGwgY2VsbHMgdG8gcm93CiAgcm93LmFwcGVuZENoaWxkKG5hbWVDZWxsKTsKICByb3cuYXBwZW5kQ2hpbGQoc3RhdHVzQ2VsbCk7CiAgcm93LmFwcGVuZENoaWxkKGhlYWx0aENlbGwpOwogIHJvdy5hcHBlbmRDaGlsZChkcml2ZXJDZWxsKTsKICByb3cuYXBwZW5kQ2hpbGQodmVyc2lvbkNlbGwpOwogIHJvdy5hcHBlbmRDaGlsZChwZXJmQ2VsbCk7CiAgcm93LmFwcGVuZENoaWxkKGFjdGlvbkNlbGwpOwoKICByZXR1cm4geyByb3csIGRldGFpbHNJZCB9Owp9CgpmdW5jdGlvbiBjcmVhdGVOYW1lQ2VsbCh3b3JrZXIsIGRldGFpbHNJZCkgewogIGNvbnN0IG5hbWVDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCiAgLy8gQ3JlYXRlIGV4cGFuZGFibGUgY29udGFpbmVyCiAgY29uc3QgbmFtZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIG5hbWVDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGAKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgYDsKICBuYW1lQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnb25jbGljaycsIGB0b2dnbGVEZXRhaWxzKCcke2RldGFpbHNJZH0nKWApOwogIG5hbWVDb250YWluZXIuc2V0QXR0cmlidXRlKCd0aXRsZScsICdDbGljayB0byBleHBhbmQgd29ya2VyIGRldGFpbHMnKTsKCiAgLy8gQWRkIGV4cGFuZC9jb2xsYXBzZSBpY29uCiAgY29uc3QgZXhwYW5kSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGV4cGFuZEljb24uY2xhc3NOYW1lID0gJ2V4cGFuZC1pY29uJzsKICBleHBhbmRJY29uLmlkID0gYGV4cGFuZC1pY29uLSR7ZGV0YWlsc0lkfWA7CiAgZXhwYW5kSWNvbi5pbm5lckhUTUwgPSBgCiAgICA8c3ZnIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICAgICA8cG9seWxpbmUgcG9pbnRzPSI5IDE4IDE1IDEyIDkgNiI+PC9wb2x5bGluZT4KICAgIDwvc3ZnPgogIGA7CiAgZXhwYW5kSWNvbi5zdHlsZS5jc3NUZXh0ID0gYAogICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTsKICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgICBmbGV4LXNocmluazogMDsKICBgOwoKICAvLyBBZGQgd29ya2VyIG5hbWUKICBjb25zdCBuYW1lRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgbmFtZURpdi5jbGFzc05hbWUgPSAnd29ya2VyLW5hbWUnOwogIG5hbWVEaXYudGV4dENvbnRlbnQgPSB3b3JrZXIubmFtZTsgLy8gU2FmZTogdGV4dENvbnRlbnQKCiAgLy8gQWRkIHF1ZXVlIG5hbWUKICBjb25zdCBxdWV1ZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIHF1ZXVlRGl2LmNsYXNzTmFtZSA9ICd3b3JrZXItcXVldWUnOwogIHF1ZXVlRGl2LnRleHRDb250ZW50ID0gd29ya2VyLnF1ZXVlTmFtZTsgLy8gU2FmZTogdGV4dENvbnRlbnQKICBxdWV1ZURpdi5zdHlsZS5tYXJnaW5MZWZ0ID0gJzI0cHgnOyAvLyBBbGlnbiB3aXRoIHdvcmtlciBuYW1lCgogIC8vIEFzc2VtYmxlIHRoZSBzdHJ1Y3R1cmUKICBuYW1lQ29udGFpbmVyLmFwcGVuZENoaWxkKGV4cGFuZEljb24pOwogIG5hbWVDb250YWluZXIuYXBwZW5kQ2hpbGQobmFtZURpdik7CgogIG5hbWVDZWxsLmFwcGVuZENoaWxkKG5hbWVDb250YWluZXIpOwogIG5hbWVDZWxsLmFwcGVuZENoaWxkKHF1ZXVlRGl2KTsKICByZXR1cm4gbmFtZUNlbGw7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVN0YXR1c0NlbGwod29ya2VyKSB7CiAgY29uc3Qgc3RhdHVzQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgY29uc3Qgc3RhdHVzU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICBzdGF0dXNTcGFuLmNsYXNzTmFtZSA9IGBzdGF0dXMtYmFkZ2Ugc3RhdHVzLSR7d29ya2VyLnN0YXR1c31gOwogIGNvbnN0IHN0YXR1c0RvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICBzdGF0dXNEb3QuY2xhc3NOYW1lID0gJ3N0YXR1cy1kb3QnOwogIGNvbnN0IHN0YXR1c1RleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgKICAgIHdvcmtlci5zdGF0dXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JrZXIuc3RhdHVzLnNsaWNlKDEpCiAgKTsKICBzdGF0dXNTcGFuLmFwcGVuZENoaWxkKHN0YXR1c0RvdCk7CiAgc3RhdHVzU3Bhbi5hcHBlbmRDaGlsZChzdGF0dXNUZXh0KTsKICBzdGF0dXNDZWxsLmFwcGVuZENoaWxkKHN0YXR1c1NwYW4pOwogIHJldHVybiBzdGF0dXNDZWxsOwp9CgpmdW5jdGlvbiBjcmVhdGVIZWFsdGhDZWxsKHdvcmtlcikgewogIGNvbnN0IGhlYWx0aENlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogIGNvbnN0IGhlYWx0aERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGhlYWx0aERpdi5jbGFzc05hbWUgPSAnaGVhbHRoLWluZGljYXRvcic7CiAgY29uc3QgaGVhbHRoRG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGhlYWx0aERvdC5jbGFzc05hbWUgPSBgaGVhbHRoLWRvdCBoZWFsdGgtJHt3b3JrZXIuaGVhbHRoLnN0YXR1c31gOwogIGNvbnN0IGhlYWx0aFRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgKICAgIHdvcmtlci5oZWFsdGguc3RhdHVzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29ya2VyLmhlYWx0aC5zdGF0dXMuc2xpY2UoMSkKICApOwogIGhlYWx0aERpdi5hcHBlbmRDaGlsZChoZWFsdGhEb3QpOwogIGhlYWx0aERpdi5hcHBlbmRDaGlsZChoZWFsdGhUZXh0KTsKICBoZWFsdGhDZWxsLmFwcGVuZENoaWxkKGhlYWx0aERpdik7CiAgcmV0dXJuIGhlYWx0aENlbGw7Cn0KCmZ1bmN0aW9uIGNyZWF0ZURyaXZlckNlbGwod29ya2VyKSB7CiAgY29uc3QgZHJpdmVyQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgY29uc3QgZHJpdmVyU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICBkcml2ZXJTcGFuLmNsYXNzTmFtZSA9ICdkcml2ZXItYmFkZ2UnOwogIGRyaXZlclNwYW4udGV4dENvbnRlbnQgPSB3b3JrZXIuZHJpdmVyOyAvLyBTYWZlOiB0ZXh0Q29udGVudAogIGRyaXZlckNlbGwuYXBwZW5kQ2hpbGQoZHJpdmVyU3Bhbik7CiAgcmV0dXJuIGRyaXZlckNlbGw7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVZlcnNpb25DZWxsKHdvcmtlcikgewogIGNvbnN0IHZlcnNpb25DZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICBjb25zdCB2ZXJzaW9uU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICB2ZXJzaW9uU3Bhbi5jbGFzc05hbWUgPSAndmVyc2lvbi1iYWRnZSc7CiAgdmVyc2lvblNwYW4udGV4dENvbnRlbnQgPSBgdiR7d29ya2VyLnZlcnNpb259YDsgLy8gU2FmZTogdGV4dENvbnRlbnQKICB2ZXJzaW9uQ2VsbC5hcHBlbmRDaGlsZCh2ZXJzaW9uU3Bhbik7CiAgcmV0dXJuIHZlcnNpb25DZWxsOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gc2FmZWx5IGV4dHJhY3QgcGVyZm9ybWFuY2UgbWV0cmljcwpmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZU1ldHJpY3Mod29ya2VyKSB7CiAgaWYgKCF3b3JrZXIpIHJldHVybiB7IHByb2Nlc3NlZDogMCwgYXZnVGltZTogMCwgbWVtb3J5OiAwIH07CgogIGNvbnN0IG1ldHJpY3MgPSB3b3JrZXIubWV0cmljcyB8fCB7fTsKICByZXR1cm4gewogICAgcHJvY2Vzc2VkOiBtZXRyaWNzLnByb2Nlc3NlZCB8fCB3b3JrZXIucHJvY2Vzc2VkIHx8IDAsCiAgICBhdmdUaW1lOiBtZXRyaWNzLmF2Z1RpbWUgfHwgd29ya2VyLmF2Z1RpbWUgfHwgMCwKICAgIG1lbW9yeTogbWV0cmljcy5tZW1vcnkgfHwgd29ya2VyLm1lbW9yeSB8fCAwLAogIH07Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcGVyZm9ybWFuY2UgaWNvbiBIVE1MCmZ1bmN0aW9uIGNyZWF0ZVBlcmZvcm1hbmNlSWNvbkh0bWwodHlwZSwgdmFsdWUsIHVuaXQpIHsKICBjb25zdCBpY29ucyA9IHsKICAgIHByb2Nlc3NlZDogYAogICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgICAgICAgPGxpbmUgeDE9IjEyIiB5MT0iMjAiIHgyPSIxMiIgeTI9IjEwIiAvPgogICAgICAgIDxsaW5lIHgxPSIxOCIgeTE9IjIwIiB4Mj0iMTgiIHkyPSI0IiAvPgogICAgICAgIDxsaW5lIHgxPSI2IiB5MT0iMjAiIHgyPSI2IiB5Mj0iMTYiIC8+CiAgICAgIDwvc3ZnPgogICAgYCwKICAgIHRpbWU6IGAKICAgICAgPHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICAgICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjEyIDYgMTIgMTIgMTYgMTQiIC8+CiAgICAgIDwvc3ZnPgogICAgYCwKICAgIG1lbW9yeTogYAogICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgICAgICAgPHJlY3QgeD0iNCIgeT0iNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiByeD0iMiIgcnk9IjIiIC8+CiAgICAgICAgPHJlY3QgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iNiIgLz4KICAgICAgICA8bGluZSB4MT0iOSIgeTE9IjEiIHgyPSI5IiB5Mj0iNCIgLz4KICAgICAgICA8bGluZSB4MT0iMTUiIHkxPSIxIiB4Mj0iMTUiIHkyPSI0IiAvPgogICAgICAgIDxsaW5lIHgxPSI5IiB5MT0iMjAiIHgyPSI5IiB5Mj0iMjMiIC8+CiAgICAgICAgPGxpbmUgeDE9IjE1IiB5MT0iMjAiIHgyPSIxNSIgeTI9IjIzIiAvPgogICAgICAgIDxsaW5lIHgxPSIyMCIgeTE9IjkiIHgyPSIyMyIgeTI9IjkiIC8+CiAgICAgICAgPGxpbmUgeDE9IjIwIiB5MT0iMTQiIHgyPSIyMyIgeTI9IjE0IiAvPgogICAgICAgIDxsaW5lIHgxPSIxIiB5MT0iOSIgeDI9IjQiIHkyPSI5IiAvPgogICAgICAgIDxsaW5lIHgxPSIxIiB5MT0iMTQiIHgyPSI0IiB5Mj0iMTQiIC8+CiAgICAgIDwvc3ZnPgogICAgYCwKICB9OwoKICBjb25zdCB0aXRsZXMgPSB7CiAgICBwcm9jZXNzZWQ6ICdQcm9jZXNzZWQgSm9icycsCiAgICB0aW1lOiAnQXZnIFRpbWUnLAogICAgbWVtb3J5OiAnTWVtb3J5IFVzYWdlJywKICB9OwoKICByZXR1cm4gYAogICAgPGRpdiBjbGFzcz0icGVyZi1pY29uICR7dHlwZX0iIHRpdGxlPSIke3RpdGxlc1t0eXBlXX0iPgogICAgICAke2ljb25zW3R5cGVdfQogICAgICA8c3Bhbj4ke3ZhbHVlfSR7dW5pdH08L3NwYW4+CiAgICA8L2Rpdj4KICBgOwp9CgpmdW5jdGlvbiBjcmVhdGVQZXJmb3JtYW5jZUNlbGwod29ya2VyKSB7CiAgY29uc3QgcGVyZkNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogIGNvbnN0IHBlcmZEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICBwZXJmRGl2LmNsYXNzTmFtZSA9ICdwZXJmb3JtYW5jZS1pY29ucyc7CgogIGNvbnN0IG1ldHJpY3MgPSBnZXRQZXJmb3JtYW5jZU1ldHJpY3Mod29ya2VyKTsKICBjb25zdCBwcm9jZXNzZWRWYWx1ZSA9IG1ldHJpY3MucHJvY2Vzc2VkID8gbWV0cmljcy5wcm9jZXNzZWQudG9Mb2NhbGVTdHJpbmcoKSA6ICcwJzsKCiAgcGVyZkRpdi5pbm5lckhUTUwgPSBgCiAgICAke2NyZWF0ZVBlcmZvcm1hbmNlSWNvbkh0bWwoJ3Byb2Nlc3NlZCcsIHByb2Nlc3NlZFZhbHVlLCAnJyl9CiAgICAke2NyZWF0ZVBlcmZvcm1hbmNlSWNvbkh0bWwoJ3RpbWUnLCBtZXRyaWNzLmF2Z1RpbWUsICdtcycpfQogICAgJHtjcmVhdGVQZXJmb3JtYW5jZUljb25IdG1sKCdtZW1vcnknLCBtZXRyaWNzLm1lbW9yeSwgJ01CJyl9CiAgYDsKCiAgcGVyZkNlbGwuYXBwZW5kQ2hpbGQocGVyZkRpdik7CiAgcmV0dXJuIHBlcmZDZWxsOwp9CgpmdW5jdGlvbiBjcmVhdGVBY3Rpb25DZWxsKHdvcmtlcikgewogIGNvbnN0IGFjdGlvbkNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogIGNvbnN0IGFjdGlvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGFjdGlvbkRpdi5jbGFzc05hbWUgPSAnYWN0aW9ucy1jZWxsJzsKCiAgLy8gVG9nZ2xlIHZpc2liaWxpdHkgYmFzZWQgb24gc3RhdHVzCiAgaWYgKHdvcmtlci5zdGF0dXMgPT09ICdydW5uaW5nJykgewogICAgY29uc3Qgc3RvcEJ0biA9IGNyZWF0ZUFjdGlvbkJ1dHRvbignc3RvcCcsICdTdG9wJywgKCkgPT4KICAgICAgc3RvcFdvcmtlcih3b3JrZXIubmFtZSwgd29ya2VyLmRyaXZlcikKICAgICk7CiAgICBhY3Rpb25EaXYuYXBwZW5kQ2hpbGQoc3RvcEJ0bik7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHN0YXJ0QnRuID0gY3JlYXRlQWN0aW9uQnV0dG9uKCdzdGFydCcsICdTdGFydCcsICgpID0+CiAgICAgIHN0YXJ0V29ya2VyKHdvcmtlci5uYW1lLCB3b3JrZXIuZHJpdmVyKQogICAgKTsKICAgIGFjdGlvbkRpdi5hcHBlbmRDaGlsZChzdGFydEJ0bik7CiAgfQoKICBjb25zdCByZXN0YXJ0QnRuID0gY3JlYXRlQWN0aW9uQnV0dG9uKCdyZXN0YXJ0JywgJ1Jlc3RhcnQnLCAoKSA9PgogICAgcmVzdGFydFdvcmtlcih3b3JrZXIubmFtZSwgd29ya2VyLmRyaXZlcikKICApOwogIGNvbnN0IGRlbGV0ZUJ0biA9IGNyZWF0ZUFjdGlvbkJ1dHRvbignZGVsZXRlJywgJ0RlbGV0ZScsICgpID0+CiAgICBkZWxldGVXb3JrZXIod29ya2VyLm5hbWUsIHdvcmtlci5kcml2ZXIpCiAgKTsKICBjb25zdCB2aWV3SnNvbkJ0biA9IGNyZWF0ZUFjdGlvbkJ1dHRvbigndmlldycsICdWaWV3IEpTT04nLCAoKSA9PgogICAgdmlld1dvcmtlckpzb24od29ya2VyLm5hbWUsIHdvcmtlci5kcml2ZXIpCiAgKTsKICBjb25zdCBlZGl0SnNvbkJ0biA9IGNyZWF0ZUFjdGlvbkJ1dHRvbignZWRpdCcsICdFZGl0IEpTT04nLCAoKSA9PgogICAgZWRpdFdvcmtlckpzb24od29ya2VyLm5hbWUsIHdvcmtlci5kcml2ZXIpCiAgKTsKCiAgYWN0aW9uRGl2LmFwcGVuZENoaWxkKHJlc3RhcnRCdG4pOwogIGFjdGlvbkRpdi5hcHBlbmRDaGlsZChkZWxldGVCdG4pOwogIGFjdGlvbkRpdi5hcHBlbmRDaGlsZCh2aWV3SnNvbkJ0bik7CiAgYWN0aW9uRGl2LmFwcGVuZENoaWxkKGVkaXRKc29uQnRuKTsKICBhY3Rpb25DZWxsLmFwcGVuZENoaWxkKGFjdGlvbkRpdik7CgogIHJldHVybiBhY3Rpb25DZWxsOwp9CgpmdW5jdGlvbiBjcmVhdGVBY3Rpb25CdXR0b24odHlwZSwgdGl0bGUsIG9uQ2xpY2tIYW5kbGVyKSB7CiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgYnV0dG9uLmNsYXNzTmFtZSA9IGBhY3Rpb24tYnRuICR7dHlwZX1gOwogIGJ1dHRvbi50aXRsZSA9IHRpdGxlOwogIGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIG9uQ2xpY2tIYW5kbGVyKCk7CiAgfTsKCiAgLy8gQ3JlYXRlIFNWRyBpY29uIGJhc2VkIG9uIGJ1dHRvbiB0eXBlCiAgY29uc3Qgc3ZnID0gY3JlYXRlQnV0dG9uSWNvbih0eXBlKTsKICBidXR0b24uYXBwZW5kQ2hpbGQoc3ZnKTsKCiAgcmV0dXJuIGJ1dHRvbjsKfQoKLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgc3BlY2lmaWMgU1ZHIGljb25zCmZ1bmN0aW9uIGNyZWF0ZVN0YXJ0SWNvbigpIHsKICBjb25zdCBzdmcgPSBjcmVhdGVTdmdFbGVtZW50KCk7CiAgY29uc3QgcG9seWdvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncG9seWdvbicpOwogIHBvbHlnb24uc2V0QXR0cmlidXRlKCdwb2ludHMnLCAnNSAzIDE5IDEyIDUgMjEgNSAzJyk7CiAgcG9seWdvbi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnY3VycmVudENvbG9yJyk7CiAgc3ZnLmFwcGVuZENoaWxkKHBvbHlnb24pOwogIHJldHVybiBzdmc7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVN0b3BJY29uKCkgewogIGNvbnN0IHN2ZyA9IGNyZWF0ZVN2Z0VsZW1lbnQoKTsKICBjb25zdCByZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7CiAgcmVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCAnMycpOwogIHJlY3Quc2V0QXR0cmlidXRlKCd5JywgJzMnKTsKICByZWN0LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTgnKTsKICByZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzE4Jyk7CiAgcmVjdC5zZXRBdHRyaWJ1dGUoJ3J4JywgJzInKTsKICByZWN0LnNldEF0dHJpYnV0ZSgncnknLCAnMicpOwogIHJlY3Quc2V0QXR0cmlidXRlKCdmaWxsJywgJ2N1cnJlbnRDb2xvcicpOwogIHN2Zy5hcHBlbmRDaGlsZChyZWN0KTsKICByZXR1cm4gc3ZnOwp9CgpmdW5jdGlvbiBjcmVhdGVSZXN0YXJ0SWNvbigpIHsKICBjb25zdCBzdmcgPSBjcmVhdGVTdmdFbGVtZW50KCk7CiAgY29uc3QgcG9seWxpbmUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwb2x5bGluZScpOwogIHBvbHlsaW5lMS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsICcyMyA0IDIzIDEwIDE3IDEwJyk7CiAgY29uc3QgcG9seWxpbmUyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwb2x5bGluZScpOwogIHBvbHlsaW5lMi5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsICcxIDIwIDEgMTQgNyAxNCcpOwogIGNvbnN0IHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTsKICBwYXRoLnNldEF0dHJpYnV0ZSgnZCcsICdNMy41MSA5YTkgOSAwIDAgMSAxNC44NS0zLjM2TDIzIDEwTTEgMTRsNC42NCA0LjM2QTkgOSAwIDAgMCAyMC40OSAxNScpOwogIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZTEpOwogIHN2Zy5hcHBlbmRDaGlsZChwb2x5bGluZTIpOwogIHN2Zy5hcHBlbmRDaGlsZChwYXRoKTsKICByZXR1cm4gc3ZnOwp9CgpmdW5jdGlvbiBjcmVhdGVEZWxldGVJY29uKCkgewogIGNvbnN0IHN2ZyA9IGNyZWF0ZVN2Z0VsZW1lbnQoKTsKICBjb25zdCBkZWxldGVQb2x5bGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncG9seWxpbmUnKTsKICBkZWxldGVQb2x5bGluZS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsICczIDYgNSA2IDIxIDYnKTsKICBjb25zdCBkZWxldGVQYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7CiAgZGVsZXRlUGF0aC5zZXRBdHRyaWJ1dGUoCiAgICAnZCcsCiAgICAnTTE5IDZ2MTRhMiAyIDAgMCAxLTIgMkg3YTIgMiAwIDAgMS0yLTJWNm0zIDBWNGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYyJwogICk7CiAgY29uc3QgbGluZTEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2xpbmUnKTsKICBsaW5lMS5zZXRBdHRyaWJ1dGUoJ3gxJywgJzEwJyk7CiAgbGluZTEuc2V0QXR0cmlidXRlKCd5MScsICcxMScpOwogIGxpbmUxLnNldEF0dHJpYnV0ZSgneDInLCAnMTAnKTsKICBsaW5lMS5zZXRBdHRyaWJ1dGUoJ3kyJywgJzE3Jyk7CiAgY29uc3QgbGluZTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2xpbmUnKTsKICBsaW5lMi5zZXRBdHRyaWJ1dGUoJ3gxJywgJzE0Jyk7CiAgbGluZTIuc2V0QXR0cmlidXRlKCd5MScsICcxMScpOwogIGxpbmUyLnNldEF0dHJpYnV0ZSgneDInLCAnMTQnKTsKICBsaW5lMi5zZXRBdHRyaWJ1dGUoJ3kyJywgJzE3Jyk7CiAgc3ZnLmFwcGVuZENoaWxkKGRlbGV0ZVBvbHlsaW5lKTsKICBzdmcuYXBwZW5kQ2hpbGQoZGVsZXRlUGF0aCk7CiAgc3ZnLmFwcGVuZENoaWxkKGxpbmUxKTsKICBzdmcuYXBwZW5kQ2hpbGQobGluZTIpOwogIHJldHVybiBzdmc7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVZpZXdJY29uKCkgewogIGNvbnN0IHN2ZyA9IGNyZWF0ZVN2Z0VsZW1lbnQoKTsKICBjb25zdCBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7CiAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCAnTTEgMTJzNC04IDExLTggMTEgOCAxMSA4LTQgOC0xMSA4LTExLTgtMTEtOHonKTsKICBjb25zdCBjaXJjbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2NpcmNsZScpOwogIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N4JywgJzEyJyk7CiAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnY3knLCAnMTInKTsKICBjaXJjbGUuc2V0QXR0cmlidXRlKCdyJywgJzMnKTsKICBzdmcuYXBwZW5kQ2hpbGQocGF0aCk7CiAgc3ZnLmFwcGVuZENoaWxkKGNpcmNsZSk7CiAgcmV0dXJuIHN2ZzsKfQoKZnVuY3Rpb24gY3JlYXRlRWRpdEljb24oKSB7CiAgY29uc3Qgc3ZnID0gY3JlYXRlU3ZnRWxlbWVudCgpOwogIGNvbnN0IHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTsKICBwYXRoLnNldEF0dHJpYnV0ZSgnZCcsICdNMTEgNEg0YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0ydi03Jyk7CiAgY29uc3QgcGF0aDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTsKICBwYXRoMi5zZXRBdHRyaWJ1dGUoJ2QnLCAnTTE4LjUgMi41YTIuMTIxIDIuMTIxIDAgMCAxIDMgM0wxMiAxNWwtNCAxIDEtNCA5LjUtOS41eicpOwogIHN2Zy5hcHBlbmRDaGlsZChwYXRoKTsKICBzdmcuYXBwZW5kQ2hpbGQocGF0aDIpOwogIHJldHVybiBzdmc7Cn0KCi8vIENyZWF0ZSBiYXNlIFNWRyBlbGVtZW50IHdpdGggY29tbW9uIGF0dHJpYnV0ZXMKZnVuY3Rpb24gY3JlYXRlU3ZnRWxlbWVudCgpIHsKICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpOwogIHN2Zy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2ljb24nKTsKICBzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAyNCAyNCcpOwogIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpOwogIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdjdXJyZW50Q29sb3InKTsKICBzdmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMicpOwogIHN2Zy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7CiAgc3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVqb2luJywgJ3JvdW5kJyk7CiAgcmV0dXJuIHN2ZzsKfQoKZnVuY3Rpb24gY3JlYXRlQnV0dG9uSWNvbih0eXBlKSB7CiAgc3dpdGNoICh0eXBlKSB7CiAgICBjYXNlICdzdGFydCc6CiAgICAgIHJldHVybiBjcmVhdGVTdGFydEljb24oKTsKICAgIGNhc2UgJ3N0b3AnOgogICAgICByZXR1cm4gY3JlYXRlU3RvcEljb24oKTsKICAgIGNhc2UgJ3Jlc3RhcnQnOgogICAgICByZXR1cm4gY3JlYXRlUmVzdGFydEljb24oKTsKICAgIGNhc2UgJ2RlbGV0ZSc6CiAgICAgIHJldHVybiBjcmVhdGVEZWxldGVJY29uKCk7CiAgICBjYXNlICd2aWV3JzoKICAgICAgcmV0dXJuIGNyZWF0ZVZpZXdJY29uKCk7CiAgICBjYXNlICdlZGl0JzoKICAgICAgcmV0dXJuIGNyZWF0ZUVkaXRJY29uKCk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gY3JlYXRlU3ZnRWxlbWVudCgpOwogIH0KfQoKZnVuY3Rpb24gY3JlYXRlRGV0YWlsUm93KHdvcmtlciwgZGV0YWlsc0lkKSB7CiAgY29uc3QgZGV0YWlsUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKICBkZXRhaWxSb3cuY2xhc3NOYW1lID0gJ2V4cGFuZGFibGUtcm93JzsKICBkZXRhaWxSb3cuaWQgPSBkZXRhaWxzSWQ7CiAgZGV0YWlsUm93LmRhdGFzZXQud29ya2VyTmFtZSA9IHdvcmtlci5uYW1lOwogIGRldGFpbFJvdy5kYXRhc2V0LndvcmtlckRyaXZlciA9IHdvcmtlci5kcml2ZXI7CgogIC8vIERlbGVnYXRlIEhUTUwgY3JlYXRpb24gdG8gc3BlY2lhbGl6ZWQgZnVuY3Rpb24KICBkZXRhaWxSb3cuaW5uZXJIVE1MID0gY3JlYXRlRGV0YWlsUm93SFRNTCh3b3JrZXIpOwoKICByZXR1cm4gZGV0YWlsUm93Owp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBIVE1MCmZ1bmN0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKHdvcmtlcikgewogIHJldHVybiBgCiAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtc2VjdGlvbiI+CiAgICAgIDxoND5Db25maWd1cmF0aW9uPC9oND4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPlF1ZXVlIE5hbWU8L3NwYW4+CiAgICAgICAgPHNwYW4gZGF0YS1rZXk9ImNvbmZpZ3VyYXRpb24ucXVldWVOYW1lIj4ke3dvcmtlci5xdWV1ZU5hbWV9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPldvcmtlciBOYW1lPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJjb25maWd1cmF0aW9uLm5hbWUiPiR7d29ya2VyLm5hbWV9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPkRyaXZlcjwvc3Bhbj4KICAgICAgICA8c3BhbiBkYXRhLWtleT0iY29uZmlndXJhdGlvbi5kcml2ZXIiPiR7d29ya2VyLmRyaXZlcn08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+VmVyc2lvbjwvc3Bhbj4KICAgICAgICA8c3BhbiBkYXRhLWtleT0iY29uZmlndXJhdGlvbi52ZXJzaW9uIj52JHt3b3JrZXIudmVyc2lvbn08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+QXV0byBTdGFydDwvc3Bhbj4KICAgICAgICA8bGFiZWwgY2xhc3M9ImF1dG8tc3RhcnQtdG9nZ2xlIiBvbmNsaWNrPSJldmVudC5zdG9wUHJvcGFnYXRpb24oKSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giICR7d29ya2VyLmF1dG9TdGFydCA/ICdjaGVja2VkJyA6ICcnfSBvbmNoYW5nZT0idG9nZ2xlQXV0b1N0YXJ0KCcke3dvcmtlci5uYW1lfScsICcke3dvcmtlci5kcml2ZXJ9JywgdGhpcy5jaGVja2VkKSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idG9nZ2xlLXNsaWRlciI+PC9zcGFuPgogICAgICAgIDwvbGFiZWw+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+U3RhdHVzPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJjb25maWd1cmF0aW9uLnN0YXR1cyI+JHt3b3JrZXIuc3RhdHVzfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIFBlcmZvcm1hbmNlIE1ldHJpY3Mgc2VjdGlvbiBIVE1MCmZ1bmN0aW9uIGNyZWF0ZVBlcmZvcm1hbmNlTWV0cmljc1NlY3Rpb24od29ya2VyKSB7CiAgcmV0dXJuIGAKICAgIDxkaXYgY2xhc3M9ImRldGFpbC1zZWN0aW9uIj4KICAgICAgPGg0PlBlcmZvcm1hbmNlIE1ldHJpY3M8L2g0PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+UHJvY2Vzc2VkIEpvYnM8L3NwYW4+CiAgICAgICAgPHNwYW4gZGF0YS1rZXk9Im1ldHJpY3MucHJvY2Vzc2VkIj4ke3dvcmtlci5wcm9jZXNzZWQudG9Mb2NhbGVTdHJpbmcoKX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+RmFpbGVkIEpvYnM8L3NwYW4+CiAgICAgICAgPHNwYW4gZGF0YS1rZXk9Im1ldHJpY3MuZmFpbGVkIj4ke3dvcmtlci5mYWlsZWQgfHwgMH08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+QXZlcmFnZSBUaW1lPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJtZXRyaWNzLmF2Z1RpbWUiPiR7d29ya2VyLmF2Z1RpbWV9bXM8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+TWVtb3J5IFVzYWdlPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJtZXRyaWNzLm1lbW9yeSI+JHt3b3JrZXIubWVtb3J5fU1CPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPkNQVSBVc2FnZTwvc3Bhbj4KICAgICAgICA8c3BhbiBkYXRhLWtleT0ibWV0cmljcy5jcHUiPiR7d29ya2VyLmNwdSB8fCAnTi9BJ308L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+VXB0aW1lPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJtZXRyaWNzLnVwdGltZSI+JHt3b3JrZXIudXB0aW1lIHx8ICdOL0EnfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIEhlYWx0aCAmIFN0YXR1cyBzZWN0aW9uIEhUTUwKZnVuY3Rpb24gY3JlYXRlSGVhbHRoU3RhdHVzU2VjdGlvbih3b3JrZXIpIHsKICByZXR1cm4gYAogICAgPGRpdiBjbGFzcz0iZGV0YWlsLXNlY3Rpb24iPgogICAgICA8aDQ+SGVhbHRoICYgU3RhdHVzPC9oND4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWl0ZW0iPgogICAgICAgIDxzcGFuPkhlYWx0aCBTdGF0dXM8L3NwYW4+CiAgICAgICAgPHNwYW4gZGF0YS1rZXk9ImhlYWx0aC5zdGF0dXMiPiR7d29ya2VyLmhlYWx0aD8uc3RhdHVzIHx8ICd1bmtub3duJ308L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtaXRlbSI+CiAgICAgICAgPHNwYW4+TGFzdCBDaGVjazwvc3Bhbj4KICAgICAgICA8c3BhbiBkYXRhLWtleT0iaGVhbHRoLmxhc3RDaGVjayIgY2xhc3M9Imxhc3QtY2hlY2siPiR7Zm9ybWF0VGltZUFnbyh3b3JrZXIuaGVhbHRoPy5sYXN0Q2hlY2spfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRldGFpbC1pdGVtIj4KICAgICAgICA8c3Bhbj5IZWFsdGggQ2hlY2tzPC9zcGFuPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWx0aC1jaGVja3MiPgogICAgICAgICAgJHtyZW5kZXJIZWFsdGhDaGVja3Mod29ya2VyLmhlYWx0aD8uY2hlY2tzKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRldGFpbC1pdGVtIj4KICAgICAgICA8c3Bhbj5Xb3JrZXIgU3RhdHVzPC9zcGFuPgogICAgICAgIDxzcGFuIGRhdGEta2V5PSJzdGF0dXMiIGNsYXNzPSJzdGF0dXMtYmFkZ2Ugc3RhdHVzLSR7d29ya2VyLnN0YXR1c30iPiR7d29ya2VyLnN0YXR1c308L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYDsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHJlbmRlciBoZWFsdGggY2hlY2tzCmZ1bmN0aW9uIHJlbmRlckhlYWx0aENoZWNrcyhjaGVja3MpIHsKICBpZiAoIWNoZWNrcyB8fCAhQXJyYXkuaXNBcnJheShjaGVja3MpIHx8IGNoZWNrcy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiAnPHNwYW4gY2xhc3M9Im5vLWNoZWNrcyI+Tm8gaGVhbHRoIGNoZWNrcyBhdmFpbGFibGU8L3NwYW4+JzsKICB9CgogIHJldHVybiBjaGVja3MKICAgIC5tYXAoCiAgICAgIChjaGVjaykgPT4gYAogICAgPGRpdiBjbGFzcz0iaGVhbHRoLWNoZWNrIj4KICAgICAgPHNwYW4gY2xhc3M9ImNoZWNrLW5hbWUiPiR7Y2hlY2submFtZX08L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJjaGVjay1zdGF0dXMgc3RhdHVzLSR7Y2hlY2suc3RhdHVzfSI+JHtjaGVjay5zdGF0dXN9PC9zcGFuPgogICAgICAke2NoZWNrLm1lc3NhZ2UgPyBgPHNwYW4gY2xhc3M9ImNoZWNrLW1lc3NhZ2UiPiR7Y2hlY2subWVzc2FnZX08L3NwYW4+YCA6ICcnfQogICAgPC9kaXY+CiAgYAogICAgKQogICAgLmpvaW4oJycpOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IHRpbWUgYXMgImFnbyIKZnVuY3Rpb24gZm9ybWF0VGltZUFnbyh0aW1lc3RhbXApIHsKICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuICdOZXZlcic7CgogIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7CiAgY29uc3QgY2hlY2tUaW1lID0gbmV3IERhdGUodGltZXN0YW1wKTsKICBjb25zdCBkaWZmTXMgPSBub3cgLSBjaGVja1RpbWU7CgogIGlmIChkaWZmTXMgPCAwKSByZXR1cm4gJ0p1c3Qgbm93JzsKCiAgY29uc3QgZGlmZlNlY29uZHMgPSBNYXRoLmZsb29yKGRpZmZNcyAvIDEwMDApOwogIGNvbnN0IGRpZmZNaW51dGVzID0gTWF0aC5mbG9vcihkaWZmU2Vjb25kcyAvIDYwKTsKICBjb25zdCBkaWZmSG91cnMgPSBNYXRoLmZsb29yKGRpZmZNaW51dGVzIC8gNjApOwogIGNvbnN0IGRpZmZEYXlzID0gTWF0aC5mbG9vcihkaWZmSG91cnMgLyAyNCk7CgogIGlmIChkaWZmU2Vjb25kcyA8IDYwKSB7CiAgICByZXR1cm4gZGlmZlNlY29uZHMgPD0gMSA/ICdKdXN0IG5vdycgOiBgJHtkaWZmU2Vjb25kc31zIGFnb2A7CiAgfSBlbHNlIGlmIChkaWZmTWludXRlcyA8IDYwKSB7CiAgICByZXR1cm4gYCR7ZGlmZk1pbnV0ZXN9bSBhZ29gOwogIH0gZWxzZSBpZiAoZGlmZkhvdXJzIDwgMjQpIHsKICAgIHJldHVybiBgJHtkaWZmSG91cnN9aCBhZ29gOwogIH0gZWxzZSBpZiAoZGlmZkRheXMgPCA3KSB7CiAgICByZXR1cm4gYCR7ZGlmZkRheXN9ZCBhZ29gOwogIH0gZWxzZSB7CiAgICByZXR1cm4gY2hlY2tUaW1lLnRvTG9jYWxlRGF0ZVN0cmluZygpOwogIH0KfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBSZWNlbnQgTG9ncyBzZWN0aW9uIEhUTUwKZnVuY3Rpb24gY3JlYXRlUmVjZW50TG9nc1NlY3Rpb24od29ya2VyKSB7CiAgcmV0dXJuIGAKICAgIDxkaXYgY2xhc3M9ImRldGFpbC1zZWN0aW9uIj4KICAgICAgPGg0PlJlY2VudCBMb2dzIChIaXN0b3J5KTwvaDQ+CiAgICAgIDxkaXYgY2xhc3M9InJlY2VudC1sb2dzLWNvbnRhaW5lciIgc3R5bGU9IgogICAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgICAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1iZyk7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICAiPgogICAgICAgIDxkaXYgY2xhc3M9ImxvZ3MtY29udGVudCI+CiAgICAgICAgICAkewogICAgICAgICAgICB3b3JrZXIuZGV0YWlscz8ucmVjZW50TG9ncwogICAgICAgICAgICAgID8ubWFwKAogICAgICAgICAgICAgICAgKGxvZykgPT4gYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2ctZW50cnkgbG9nLSR7bG9nLmxldmVsLnRvTG93ZXJDYXNlKCl9Ij4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibG9nLXRpbWVzdGFtcCI+WyR7bG9nLnRpbWVzdGFtcH1dPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsb2ctbGV2ZWwiPiR7bG9nLmxldmVsLnRvVXBwZXJDYXNlKCl9PC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsb2ctbWVzc2FnZSI+JHtsb2cubWVzc2FnZX08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYAogICAgICAgICAgICAgICkKICAgICAgICAgICAgICAuam9pbignJykgfHwgJzxkaXYgY2xhc3M9Im5vLWxvZ3MiPk5vIHJlY2VudCBsb2dzIGF2YWlsYWJsZTwvZGl2PicKICAgICAgICAgIH0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9CgpmdW5jdGlvbiBjcmVhdGVEZXRhaWxSb3dIVE1MKHdvcmtlcikgewogIHJldHVybiBgCiAgICAgICAgICA8dGQgY29sc3Bhbj0iNyIgY2xhc3M9ImRldGFpbHMtY2VsbCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRldGFpbHMtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlscy1ncmlkIj4KICAgICAgICAgICAgICAgICR7Y3JlYXRlQ29uZmlndXJhdGlvblNlY3Rpb24od29ya2VyKX0KICAgICAgICAgICAgICAgICR7Y3JlYXRlUGVyZm9ybWFuY2VNZXRyaWNzU2VjdGlvbih3b3JrZXIpfQogICAgICAgICAgICAgICAgJHtjcmVhdGVIZWFsdGhTdGF0dXNTZWN0aW9uKHdvcmtlcil9CiAgICAgICAgICAgICAgICAke2NyZWF0ZVJlY2VudExvZ3NTZWN0aW9uKHdvcmtlcil9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICBgOwp9CgpmdW5jdGlvbiByZW5kZXJXb3JrZXJzKGRhdGEpIHsKICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3b3JrZXJzLXRib2R5Jyk7CiAgaWYgKCF0Ym9keSkgcmV0dXJuOwoKICBjb25zdCBleHBhbmRlZFdvcmtlcnMgPSBuZXcgU2V0KAogICAgQXJyYXkuZnJvbSh0Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCcuZXhwYW5kYWJsZS1yb3cub3BlbicpKQogICAgICAubWFwKChyb3cpID0+IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkJyk/LnJlcGxhY2UoJ2RldGFpbHMtJywgJycpKQogICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgKTsKCiAgLy8gQ2xlYXIgZXhpc3RpbmcgY29udGVudCBzYWZlbHkKICB3aGlsZSAodGJvZHkuZmlyc3RDaGlsZCkgewogICAgdGJvZHkuZmlyc3RDaGlsZC5yZW1vdmUoKTsKICB9CgogIGlmICghZGF0YS53b3JrZXJzIHx8IGRhdGEud29ya2Vycy5sZW5ndGggPT09IDApIHsKICAgIGNvbnN0IG5vV29ya2Vyc1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CiAgICBjb25zdCBub1dvcmtlcnNDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIG5vV29ya2Vyc0NlbGwuY29sU3BhbiA9ICc3JzsKICAgIG5vV29ya2Vyc0NlbGwuY2xhc3NOYW1lID0gJ3RleHQtY2VudGVyIHAtNCc7CiAgICBub1dvcmtlcnNDZWxsLnRleHRDb250ZW50ID0gJ05vIHdvcmtlcnMgZm91bmQnOwogICAgbm9Xb3JrZXJzUm93LmFwcGVuZENoaWxkKG5vV29ya2Vyc0NlbGwpOwogICAgdGJvZHkuYXBwZW5kQ2hpbGQobm9Xb3JrZXJzUm93KTsKCiAgICB1cGRhdGVRdWV1ZVN1bW1hcnkoZGF0YS5xdWV1ZURhdGEpOwogICAgdXBkYXRlRHJpdmVyRmlsdGVyKGRhdGEuZHJpdmVycyk7CiAgICB1cGRhdGVEcml2ZXJzTGlzdChkYXRhLmRyaXZlcnMpOwogICAgdXBkYXRlUGFnaW5hdGlvbihkYXRhLnBhZ2luYXRpb24pOwogICAgcmV0dXJuOwogIH0KCiAgZGF0YS53b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgY29uc3QgeyByb3csIGRldGFpbHNJZCB9ID0gY3JlYXRlV29ya2VyUm93KHdvcmtlcik7CiAgICBjb25zdCBkZXRhaWxSb3cgPSBjcmVhdGVEZXRhaWxSb3cod29ya2VyLCBkZXRhaWxzSWQpOwoKICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gd29ya2VyLm5hbWUucmVwbGFjZUFsbCgvW15hLXowLTldL2dpLCAnLScpOwogICAgaWYgKGV4cGFuZGVkV29ya2Vycy5oYXMobm9ybWFsaXplZE5hbWUpKSB7CiAgICAgIGRldGFpbFJvdy5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7CiAgICAgIGVuc3VyZVdvcmtlckRldGFpbHMod29ya2VyLm5hbWUsIGRldGFpbFJvdywgd29ya2VyLmRyaXZlcik7CiAgICB9CgogICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTsKICAgIHRib2R5LmFwcGVuZENoaWxkKGRldGFpbFJvdyk7CiAgfSk7CgogIHVwZGF0ZVF1ZXVlU3VtbWFyeShkYXRhLnF1ZXVlRGF0YSk7CiAgdXBkYXRlRHJpdmVyRmlsdGVyKGRhdGEuZHJpdmVycyk7CiAgdXBkYXRlRHJpdmVyc0xpc3QoZGF0YS5kcml2ZXJzKTsKICB1cGRhdGVQYWdpbmF0aW9uKGRhdGEucGFnaW5hdGlvbik7Cn0KCmZ1bmN0aW9uIHRvZ2dsZURldGFpbHMocm93SWQpIHsKICBjb25zdCByb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyb3dJZCk7CiAgaWYgKHJvdykgewogICAgY29uc3QgaXNPcGVuID0gcm93LmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTsKCiAgICAvLyBSb3RhdGUgZXhwYW5kIGljb24KICAgIGNvbnN0IGV4cGFuZEljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgZXhwYW5kLWljb24tJHtyb3dJZH1gKTsKICAgIGlmIChleHBhbmRJY29uKSB7CiAgICAgIGV4cGFuZEljb24uc3R5bGUudHJhbnNmb3JtID0gaXNPcGVuID8gJ3JvdGF0ZSg5MGRlZyknIDogJ3JvdGF0ZSgwZGVnKSc7CiAgICB9CgogICAgaWYgKGlzT3BlbikgewogICAgICBjb25zdCB3b3JrZXJOYW1lID0gcm93LmRhdGFzZXQud29ya2VyTmFtZSB8fCByb3dJZC5yZXBsYWNlKCdkZXRhaWxzLScsICcnKTsKICAgICAgY29uc3Qgd29ya2VyRHJpdmVyID0gcm93LmRhdGFzZXQud29ya2VyRHJpdmVyOwogICAgICBlbnN1cmVXb3JrZXJEZXRhaWxzKHdvcmtlck5hbWUsIHJvdywgd29ya2VyRHJpdmVyKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2luYXRpb24ocGFnaW5hdGlvbikgewogIGN1cnJlbnRQYWdlID0gcGFnaW5hdGlvbi5wYWdlOwogIHRvdGFsUGFnZXMgPSBwYWdpbmF0aW9uLnRvdGFsUGFnZXM7CiAgdG90YWxXb3JrZXJzID0gcGFnaW5hdGlvbi50b3RhbDsKCiAgY29uc3Qgc3RhcnQgPSAocGFnaW5hdGlvbi5wYWdlIC0gMSkgKiBwYWdpbmF0aW9uLmxpbWl0ICsgMTsKICBjb25zdCBlbmQgPSBNYXRoLm1pbihwYWdpbmF0aW9uLnBhZ2UgKiBwYWdpbmF0aW9uLmxpbWl0LCBwYWdpbmF0aW9uLnRvdGFsKTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2luYXRpb24taW5mbycpLnRleHRDb250ZW50ID0KICAgIGBTaG93aW5nICR7dG90YWxXb3JrZXJzID09PSAwID8gMCA6IHN0YXJ0fS0ke2VuZH0gb2YgJHt0b3RhbFdvcmtlcnN9IHdvcmtlcnNgOwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldi1idG4nKS5kaXNhYmxlZCA9ICFwYWdpbmF0aW9uLmhhc1ByZXY7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25leHQtYnRuJykuZGlzYWJsZWQgPSAhcGFnaW5hdGlvbi5oYXNOZXh0OwoKICAvLyBVcGRhdGUgcGFnZSBudW1iZXJzCiAgY29uc3QgcGFnZU51bWJlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1udW1iZXJzJyk7CgogIC8vIENsZWFyIGV4aXN0aW5nIGNvbnRlbnQgc2FmZWx5CiAgd2hpbGUgKHBhZ2VOdW1iZXJzLmZpcnN0Q2hpbGQpIHsKICAgIHBhZ2VOdW1iZXJzLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CiAgfQoKICBjb25zdCBzdGFydFBhZ2UgPSBNYXRoLm1heCgxLCBjdXJyZW50UGFnZSAtIDIpOwogIGNvbnN0IGVuZFBhZ2UgPSBNYXRoLm1pbih0b3RhbFBhZ2VzLCBjdXJyZW50UGFnZSArIDIpOwoKICBmb3IgKGxldCBpID0gc3RhcnRQYWdlOyBpIDw9IGVuZFBhZ2U7IGkrKykgewogICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICBidG4uY2xhc3NOYW1lID0gYHBhZ2UtYnRuICR7aSA9PT0gY3VycmVudFBhZ2UgPyAnYWN0aXZlJyA6ICcnfWA7CiAgICBidG4udGV4dENvbnRlbnQgPSBpLnRvU3RyaW5nKCk7CiAgICBidG4ub25jbGljayA9ICgpID0+IGdvVG9QYWdlKGkpOwogICAgcGFnZU51bWJlcnMuYXBwZW5kQ2hpbGQoYnRuKTsKICB9Cn0KCmZ1bmN0aW9uIGxvYWRQYWdlKGRpcmVjdGlvbikgewogIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2JyAmJiBjdXJyZW50UGFnZSA+IDEpIHsKICAgIGN1cnJlbnRQYWdlLS07CiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICduZXh0JyAmJiBjdXJyZW50UGFnZSA8IHRvdGFsUGFnZXMpIHsKICAgIGN1cnJlbnRQYWdlKys7CiAgfQogIGZldGNoRGF0YSgpOyAvLyBFbmFibGUgZm9yIHBhZ2luYXRpb24KfQoKZnVuY3Rpb24gZ29Ub1BhZ2UocGFnZSkgewogIGN1cnJlbnRQYWdlID0gcGFnZTsKICBmZXRjaERhdGEoKTsgLy8gRW5hYmxlIGZvciBwYWdpbmF0aW9uCn0KCi8vIFdvcmtlciBhY3Rpb25zCmFzeW5jIGZ1bmN0aW9uIHN0YXJ0V29ya2VyKG5hbWUsIGRyaXZlcikgewogIC8vIEZpbmQgYW5kIGRpc2FibGUgdGhlIHN0YXJ0IGJ1dHRvbiB0byBwcmV2ZW50IG11bHRpcGxlIGNsaWNrcwogIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYnV0dG9uW29uY2xpY2s9InN0YXJ0V29ya2VyKCcke25hbWV9JywgJyR7ZHJpdmVyfScpIl1gKTsKICBpZiAoc3RhcnRCdG4pIHsKICAgIHN0YXJ0QnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgIHN0YXJ0QnRuLnRleHRDb250ZW50ID0gJ1N0YXJ0aW5nLi4uJzsKICB9CgogIHRyeSB7CiAgICBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL3dvcmtlcnMvJHtuYW1lfS9zdGFydD9kcml2ZXI9JHtkcml2ZXJ9YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICAgIGZldGNoRGF0YSgpOyAvLyBSZWZyZXNoIGRhdGEgYWZ0ZXIgYWN0aW9uCiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgd29ya2VyOicsIGVycik7CiAgICAvLyBSZS1lbmFibGUgYnV0dG9uIG9uIGVycm9yCiAgICBpZiAoc3RhcnRCdG4pIHsKICAgICAgc3RhcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgc3RhcnRCdG4udGV4dENvbnRlbnQgPSAnU3RhcnQnOwogICAgfQogIH0KfQoKYXN5bmMgZnVuY3Rpb24gc3RvcFdvcmtlcihuYW1lLCBkcml2ZXIpIHsKICAvLyBGaW5kIGFuZCBkaXNhYmxlIHRoZSBzdG9wIGJ1dHRvbiB0byBwcmV2ZW50IG11bHRpcGxlIGNsaWNrcwogIGNvbnN0IHN0b3BCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBidXR0b25bb25jbGljaz0ic3RvcFdvcmtlcignJHtuYW1lfScsICcke2RyaXZlcn0nKSJdYCk7CiAgaWYgKHN0b3BCdG4pIHsKICAgIHN0b3BCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgc3RvcEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wcGluZy4uLic7CiAgfQoKICB0cnkgewogICAgYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS93b3JrZXJzLyR7bmFtZX0vc3RvcD9kcml2ZXI9JHtkcml2ZXJ9YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICAgIGZldGNoRGF0YSgpOyAvLyBSZWZyZXNoIGRhdGEgYWZ0ZXIgYWN0aW9uCiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RvcCB3b3JrZXI6JywgZXJyKTsKICAgIC8vIFJlLWVuYWJsZSBidXR0b24gb24gZXJyb3IKICAgIGlmIChzdG9wQnRuKSB7CiAgICAgIHN0b3BCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgc3RvcEJ0bi50ZXh0Q29udGVudCA9ICdTdG9wJzsKICAgIH0KICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIHJlc3RhcnRXb3JrZXIobmFtZSwgZHJpdmVyKSB7CiAgLy8gRmluZCBhbmQgZGlzYWJsZSB0aGUgcmVzdGFydCBidXR0b24gdG8gcHJldmVudCBtdWx0aXBsZSBjbGlja3MKICBjb25zdCByZXN0YXJ0QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigKICAgIGBidXR0b25bb25jbGljaz0icmVzdGFydFdvcmtlcignJHtuYW1lfScsICcke2RyaXZlcn0nKSJdYAogICk7CiAgaWYgKHJlc3RhcnRCdG4pIHsKICAgIHJlc3RhcnRCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgcmVzdGFydEJ0bi50ZXh0Q29udGVudCA9ICdSZXN0YXJ0aW5nLi4uJzsKICB9CgogIHRyeSB7CiAgICBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL3dvcmtlcnMvJHtuYW1lfS9yZXN0YXJ0P2RyaXZlcj0ke2RyaXZlcn1gLCB7CiAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgfSk7CiAgICBmZXRjaERhdGEoKTsgLy8gUmVmcmVzaCBkYXRhIGFmdGVyIGFjdGlvbgogIH0gY2F0Y2ggKGVycikgewogICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlc3RhcnQgd29ya2VyOicsIGVycik7CiAgICAvLyBSZS1lbmFibGUgYnV0dG9uIG9uIGVycm9yCiAgICBpZiAocmVzdGFydEJ0bikgewogICAgICByZXN0YXJ0QnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgIHJlc3RhcnRCdG4udGV4dENvbnRlbnQgPSAnUmVzdGFydCc7CiAgICB9CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVXb3JrZXIobmFtZSwgZHJpdmVyKSB7CiAgaWYgKCFjb25maXJtKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHdvcmtlciAiJHtuYW1lfSI/IFRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuYCkpIHsKICAgIHJldHVybjsKICB9CiAgdHJ5IHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS93b3JrZXJzLyR7bmFtZX0/ZHJpdmVyPSR7ZHJpdmVyfWAsIHsKICAgICAgbWV0aG9kOiAnREVMRVRFJywKICAgIH0pOwogICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVsZXRlIHdvcmtlcicpOwogICAgZmV0Y2hEYXRhKCk7IC8vIFJlZnJlc2ggZGF0YSBhZnRlciBhY3Rpb24KICB9IGNhdGNoIChlcnIpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgd29ya2VyOicsIGVycik7CiAgICBhbGVydCgnRmFpbGVkIHRvIGRlbGV0ZSB3b3JrZXI6ICcgKyBlcnIubWVzc2FnZSk7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiB0b2dnbGVBdXRvU3RhcnQobmFtZSwgZHJpdmVyLCBlbmFibGVkKSB7CiAgdHJ5IHsKICAgIGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvd29ya2Vycy8ke25hbWV9L2F1dG8tc3RhcnQ/ZHJpdmVyPSR7ZHJpdmVyfWAsIHsKICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVuYWJsZWQgfSksCiAgICB9KTsKICB9IGNhdGNoIChlcnIpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byB0b2dnbGUgYXV0by1zdGFydDonLCBlcnIpOwogIH0KfQoKZnVuY3Rpb24gc2hvd0FkZFdvcmtlck1vZGFsKCkgewogIC8vIFRPRE86IEltcGxlbWVudCBhZGQgd29ya2VyIG1vZGFsCiAgYWxlcnQoJ0FkZCBXb3JrZXIgZnVuY3Rpb25hbGl0eSBjb21pbmcgc29vbiEnKTsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBtb2RhbCBvdmVybGF5CmZ1bmN0aW9uIGNyZWF0ZU1vZGFsT3ZlcmxheSgpIHsKICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIG1vZGFsLmNsYXNzTmFtZSA9ICdtb2RhbC1vdmVybGF5JzsKICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gYAogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHotaW5kZXg6IDEwMDA7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTsKICBgOwogIHJldHVybiBtb2RhbDsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBtb2RhbCBjb250ZW50CmZ1bmN0aW9uIGNyZWF0ZU1vZGFsQ29udGVudCgpIHsKICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgY29udGVudC5jbGFzc05hbWUgPSAnbW9kYWwtY29udGVudCBqc29uLW1vZGFsJzsKICBjb250ZW50LnN0eWxlLmNzc1RleHQgPSBgCiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICAgIHBhZGRpbmc6IDI0cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgbWF4LXdpZHRoOiA5MCU7CiAgICBtYXgtaGVpZ2h0OiA5MCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1sZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgbWluLXdpZHRoOiA0MDBweDsKICBgOwogIHJldHVybiBjb250ZW50Owp9CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIG1vZGFsIGhlYWRlcgpmdW5jdGlvbiBjcmVhdGVNb2RhbEhlYWRlcihuYW1lLCBvbkNsb3NlKSB7CiAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgaGVhZGVyLnN0eWxlLmNzc1RleHQgPSBgCiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGA7CgogIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTsKICB0aXRsZS50ZXh0Q29udGVudCA9IGBXb3JrZXIgSlNPTjogJHtuYW1lfWA7CiAgdGl0bGUuc3R5bGUuY3NzVGV4dCA9IGAKICAgIG1hcmdpbjogMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgYDsKCiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICBjbG9zZUJ0bi5pbm5lckhUTUwgPSBgCiAgICA8c3ZnIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgPGxpbmUgeDE9IjE4IiB5MT0iNiIgeDI9IjYiIHkyPSIxOCI+PC9saW5lPgogICAgICA8bGluZSB4MT0iNiIgeTE9IjYiIHgyPSIxOCIgeTI9IjE4Ij48L2xpbmU+CiAgICA8L3N2Zz4KICBgOwogIGNsb3NlQnRuLmNsYXNzTmFtZSA9ICdidG4tY2xvc2UnOwogIGNsb3NlQnRuLnN0eWxlLmNzc1RleHQgPSBgCiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6IHZhcigtLW11dGVkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzOwogIGA7CiAgY2xvc2VCdG4ub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICBjbG9zZUJ0bi5zdHlsZS5jb2xvciA9ICd2YXIoLS10ZXh0KSc7CiAgfTsKICBjbG9zZUJ0bi5vbm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkgewogICAgY2xvc2VCdG4uc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJzsKICB9OwogIGNsb3NlQnRuLm9uY2xpY2sgPSBvbkNsb3NlOwoKICBoZWFkZXIuYXBwZW5kQ2hpbGQodGl0bGUpOwogIGhlYWRlci5hcHBlbmRDaGlsZChjbG9zZUJ0bik7CiAgcmV0dXJuIGhlYWRlcjsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBKU09OIGRpc3BsYXkKZnVuY3Rpb24gY3JlYXRlSnNvbkRpc3BsYXkoanNvbkNvbnRlbnQpIHsKICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTsKICBwcmUudGV4dENvbnRlbnQgPSBqc29uQ29udGVudDsKICBwcmUuc3R5bGUuY3NzVGV4dCA9IGAKICAgIGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHBhZGRpbmc6IDE2cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIGZvbnQtZmFtaWx5OiAnU0YgTW9ubycsICdNb25hY28nLCAnSW5jb25zb2xhdGEnLCAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS41OwogICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogIGA7CiAgcmV0dXJuIHByZTsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBjb3B5IGJ1dHRvbgpmdW5jdGlvbiBjcmVhdGVDb3B5QnV0dG9uKGpzb25Db250ZW50KSB7CiAgY29uc3QgYWN0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGFjdGlvbnMuc3R5bGUuY3NzVGV4dCA9IGAKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDEycHg7CiAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBgOwoKICBjb25zdCBjb3B5QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgY29weUJ0bi5pbm5lckhUTUwgPSBgCiAgICA8c3ZnIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiA4cHg7Ij4KICAgICAgPHJlY3QgeD0iOSIgeT0iOSIgd2lkdGg9IjEzIiBoZWlnaHQ9IjEzIiByeD0iMiIgcnk9IjIiPjwvcmVjdD4KICAgICAgPHBhdGggZD0iTTUgMTVINGEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg5YTIgMiAwIDAgMSAyIDJ2MSI+PC9wYXRoPgogICAgPC9zdmc+CiAgICBDb3B5IEpTT04KICBgOwogIGNvcHlCdG4uY2xhc3NOYW1lID0gJ2J0bic7CiAgY29weUJ0bi5zdHlsZS5jc3NUZXh0ID0gYAogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgYDsKICBjb3B5QnRuLm9ubW91c2VvdmVyID0gZnVuY3Rpb24gKCkgewogICAgY29weUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudC1ob3ZlciknOwogIH07CiAgY29weUJ0bi5vbm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkgewogICAgY29weUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudCknOwogIH07CiAgY29weUJ0bi5vbmNsaWNrID0gYXN5bmMgKCkgPT4gewogICAgdHJ5IHsKICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoanNvbkNvbnRlbnQpOwogICAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBjb3B5QnRuLmlubmVySFRNTDsKICAgICAgY29weUJ0bi5pbm5lckhUTUwgPSBgCiAgICAgICAgPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3R5bGU9Im1hcmdpbi1yaWdodDogOHB4OyI+CiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPSIyMCA2IDkgMTcgNCAxMiI+PC9wb2x5bGluZT4KICAgICAgICA8L3N2Zz4KICAgICAgICBDb3BpZWQhCiAgICAgIGA7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGNvcHlCdG4uaW5uZXJIVE1MID0gb3JpZ2luYWxUZXh0OwogICAgICB9LCAyMDAwKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY29weTonLCBlcnIpOwogICAgfQogIH07CgogIGFjdGlvbnMuYXBwZW5kQ2hpbGQoY29weUJ0bik7CiAgcmV0dXJuIGFjdGlvbnM7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBzZXR1cCBtb2RhbCBldmVudCBoYW5kbGVycwpmdW5jdGlvbiBzZXR1cE1vZGFsSGFuZGxlcnMobW9kYWwpIHsKICAvLyBPbmx5IGNsb3NlIG9uIGV4cGxpY2l0IGNsb3NlIGJ1dHRvbiBjbGljayAtIG5vdCBvbiBiYWNrZHJvcCBjbGljayBvciBFU0MKICAvLyBUaGlzIGVuc3VyZXMgZGV2ZWxvcGVycyBpbnRlbnRpb25hbGx5IGNsb3NlIHRoZSBtb2RhbAoKICAvLyBQcmV2ZW50IGJvZHkgc2Nyb2xsIHdoZW4gbW9kYWwgaXMgb3BlbgogIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmUnLCAoKSA9PiB7CiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7CiAgfSk7Cn0KCi8vIFZpZXcgd29ya2VyIEpTT04gZGF0YQphc3luYyBmdW5jdGlvbiB2aWV3V29ya2VySnNvbihuYW1lLCBkcml2ZXIpIHsKICB0cnkgewogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL3dvcmtlcnMvJHtuYW1lfS9kZXRhaWxzP2RyaXZlcj0ke2RyaXZlcn1gKTsKICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggd29ya2VyIGRhdGEnKTsKICAgIH0KCiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgY29uc3QganNvbkNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTsKCiAgICAvLyBDcmVhdGUgbW9kYWwgY29tcG9uZW50cwogICAgY29uc3QgbW9kYWwgPSBjcmVhdGVNb2RhbE92ZXJsYXkoKTsKICAgIGNvbnN0IGNvbnRlbnQgPSBjcmVhdGVNb2RhbENvbnRlbnQoKTsKICAgIGNvbnN0IGhlYWRlciA9IGNyZWF0ZU1vZGFsSGVhZGVyKG5hbWUsICgpID0+IG1vZGFsLnJlbW92ZSgpKTsKICAgIGNvbnN0IGpzb25EaXNwbGF5ID0gY3JlYXRlSnNvbkRpc3BsYXkoanNvbkNvbnRlbnQpOwogICAgY29uc3QgY29weUJ1dHRvbiA9IGNyZWF0ZUNvcHlCdXR0b24oanNvbkNvbnRlbnQpOwoKICAgIC8vIEFzc2VtYmxlIG1vZGFsCiAgICBjb250ZW50LmFwcGVuZENoaWxkKGhlYWRlcik7CiAgICBjb250ZW50LmFwcGVuZENoaWxkKGpzb25EaXNwbGF5KTsKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoY29weUJ1dHRvbik7CiAgICBtb2RhbC5hcHBlbmRDaGlsZChjb250ZW50KTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9kYWwpOwoKICAgIC8vIFNldHVwIGV2ZW50IGhhbmRsZXJzCiAgICBzZXR1cE1vZGFsSGFuZGxlcnMobW9kYWwpOwogIH0gY2F0Y2ggKGVycikgewogICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHZpZXcgd29ya2VyIEpTT046JywgZXJyKTsKICAgIGFsZXJ0KCdGYWlsZWQgdG8gbG9hZCB3b3JrZXIgSlNPTjogJyArIGVyci5tZXNzYWdlKTsKICB9Cn0KCi8vIENyZWF0ZSBtb2RhbCBlbGVtZW50IHdpdGggYmFzaWMgc3R5bGluZwpmdW5jdGlvbiBjcmVhdGVNb2RhbCgpIHsKICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIG1vZGFsLnN0eWxlLmNzc1RleHQgPSBgCiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgei1pbmRleDogMTAwMDsKICBgOwogIHJldHVybiBtb2RhbDsKfQoKLy8gQ3JlYXRlIEpTT04gdGV4dGFyZWEgZm9yIGVkaXRpbmcKZnVuY3Rpb24gY3JlYXRlSnNvblRleHRhcmVhKGpzb25Db250ZW50KSB7CiAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogIHRleHRhcmVhLnZhbHVlID0ganNvbkNvbnRlbnQ7CiAgdGV4dGFyZWEuc3R5bGUuY3NzVGV4dCA9IGAKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA0MDBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHJlc2l6ZTogdmVydGljYWw7CiAgYDsKICByZXR1cm4gdGV4dGFyZWE7Cn0KCi8vIENyZWF0ZSBzYXZlIGFuZCBjYW5jZWwgYnV0dG9ucwpmdW5jdGlvbiBjcmVhdGVFZGl0QnV0dG9ucyhtb2RhbCwgdGV4dGFyZWEsIG5hbWUsIGRyaXZlcikgewogIGNvbnN0IGJ1dHRvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGJ1dHRvbkRpdi5zdHlsZS5jc3NUZXh0ID0gYAogICAgbWFyZ2luLXRvcDogMTVweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDEwcHg7CiAgYDsKCiAgY29uc3Qgc2F2ZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSc7CiAgc2F2ZUJ0bi5zdHlsZS5jc3NUZXh0ID0gYAogICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiAjMjhhNzQ1OwogICAgY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogIGA7CgogIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdDYW5jZWwnOwogIGNhbmNlbEJ0bi5zdHlsZS5jc3NUZXh0ID0gYAogICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiAjNmM3NTdkOwogICAgY29sb3I6IHdoaXRlOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogIGA7CiAgY2FuY2VsQnRuLm9uY2xpY2sgPSAoKSA9PiBtb2RhbC5yZW1vdmUoKTsKCiAgc2F2ZUJ0bi5vbmNsaWNrID0gYXN5bmMgKCkgPT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBKU09OLnBhcnNlKHRleHRhcmVhLnZhbHVlKTsKICAgICAgLy8gVXNlIHRoZSBuZXcgZWRpdCBlbmRwb2ludCB0aGF0IGhhcyB3aXRoQ3JlYXRlV29ya2VyVmFsaWRhdGlvbgogICAgICBjb25zdCB1cGRhdGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvd29ya2Vycy8ke25hbWV9L2VkaXQ/ZHJpdmVyPSR7ZHJpdmVyfWAsIHsKICAgICAgICBtZXRob2Q6ICdQVVQnLAogICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHVwZGF0ZWREYXRhKSwKICAgICAgfSk7CgogICAgICBpZiAoIXVwZGF0ZVJlc3BvbnNlLm9rKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIHdvcmtlcicpOwogICAgICB9CgogICAgICBhbGVydCgnV29ya2VyIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IScpOwogICAgICBtb2RhbC5yZW1vdmUoKTsKICAgICAgZmV0Y2hEYXRhKCk7IC8vIFJlZnJlc2ggZGF0YSBhZnRlciBhY3Rpb24KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGFsZXJ0KCdJbnZhbGlkIEpTT046ICcgKyBlcnJvci5tZXNzYWdlKTsKICAgIH0KICB9OwoKICBidXR0b25EaXYuYXBwZW5kQ2hpbGQoc2F2ZUJ0bik7CiAgYnV0dG9uRGl2LmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7CiAgcmV0dXJuIGJ1dHRvbkRpdjsKfQoKLy8gRWRpdCB3b3JrZXIgSlNPTiBkYXRhCmFzeW5jIGZ1bmN0aW9uIGVkaXRXb3JrZXJKc29uKG5hbWUsIGRyaXZlcikgewogIHRyeSB7CiAgICAvLyBHZXQgZGlyZWN0IGRyaXZlciBkYXRhIGZvciBlZGl0aW5nIChyYXcgcGVyc2lzdGVkIGRhdGEgd2l0aG91dCBlbnJpY2htZW50KQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL3dvcmtlcnMvJHtuYW1lfS9kcml2ZXItZGF0YT9kcml2ZXI9JHtkcml2ZXJ9YCk7CiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIHdvcmtlciBkcml2ZXIgZGF0YScpOwogICAgfQoKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICBjb25zdCBqc29uQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEuZGF0YSwgbnVsbCwgMik7CgogICAgLy8gQ3JlYXRlIG1vZGFsIGNvbXBvbmVudHMKICAgIGNvbnN0IG1vZGFsID0gY3JlYXRlTW9kYWwoKTsKICAgIGNvbnN0IGNvbnRlbnQgPSBjcmVhdGVNb2RhbENvbnRlbnQoKTsKICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTsKICAgIHRpdGxlLnRleHRDb250ZW50ID0gYEVkaXQgV29ya2VyIEpTT046ICR7bmFtZX1gOwogICAgdGl0bGUuc3R5bGUubWFyZ2luQm90dG9tID0gJzE1cHgnOwoKICAgIC8vIEFkZCB3YXJuaW5nIGFib3V0IGltbXV0YWJsZSBmaWVsZHMKICAgIGNvbnN0IHdhcm5pbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHdhcm5pbmcuc3R5bGUuY3NzVGV4dCA9IGAKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2FybmluZy1iZywgI2ZmZjNjZCk7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXdhcm5pbmctYm9yZGVyLCAjZmZlYWE3KTsKICAgICAgY29sb3I6IHZhcigtLXdhcm5pbmctdGV4dCwgIzg1NjQwNCk7CiAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgYDsKICAgIHdhcm5pbmcuaW5uZXJIVE1MID0gYAogICAgICA8c3Ryb25nPuKaoO+4jyBOb3RlOjwvc3Ryb25nPiBXb3JrZXIgbmFtZSAoPGNvZGU+JHtuYW1lfTwvY29kZT4pIGFuZCBkcml2ZXIgKDxjb2RlPiR7ZHJpdmVyfTwvY29kZT4pIGNhbm5vdCBiZSBjaGFuZ2VkLgogICAgICBPbmx5IG90aGVyIGNvbmZpZ3VyYXRpb24gZmllbGRzIGNhbiBiZSBtb2RpZmllZC4KICAgIGA7CgogICAgY29uc3QgdGV4dGFyZWEgPSBjcmVhdGVKc29uVGV4dGFyZWEoanNvbkNvbnRlbnQpOwogICAgY29uc3QgYnV0dG9uRGl2ID0gY3JlYXRlRWRpdEJ1dHRvbnMobW9kYWwsIHRleHRhcmVhLCBuYW1lLCBkcml2ZXIpOwoKICAgIC8vIEFzc2VtYmxlIG1vZGFsCiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRpdGxlKTsKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQod2FybmluZyk7CiAgICBjb250ZW50LmFwcGVuZENoaWxkKHRleHRhcmVhKTsKICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoYnV0dG9uRGl2KTsKICAgIG1vZGFsLmFwcGVuZENoaWxkKGNvbnRlbnQpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7CgogICAgLy8gT25seSBjbG9zZSBvbiBleHBsaWNpdCBjbG9zZSBidXR0b24gY2xpY2sgLSBub3Qgb24gYmFja2Ryb3AgY2xpY2sgb3IgRVNDCiAgICAvLyBUaGlzIGVuc3VyZXMgZGV2ZWxvcGVycyBpbnRlbnRpb25hbGx5IGNsb3NlIHRoZSBtb2RhbAoKICAgIC8vIFByZXZlbnQgYm9keSBzY3JvbGwgd2hlbiBtb2RhbCBpcyBvcGVuCiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CiAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmUnLCAoKSA9PiB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsKICAgIH0pOwogIH0gY2F0Y2ggKGVycikgewogICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGVkaXQgd29ya2VyIEpTT046JywgZXJyKTsKICAgIGFsZXJ0KCdGYWlsZWQgdG8gbG9hZCB3b3JrZXIgSlNPTjogJyArIGVyci5tZXNzYWdlKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUF1dG9SZWZyZXNoKCkgewogIHNldEF1dG9SZWZyZXNoKCFhdXRvUmVmcmVzaEVuYWJsZWQpOwp9CgpmdW5jdGlvbiBzZXR1cEV2ZW50U3RyZWFtKCkgewogIGlmICghZ2xvYmFsVGhpcy53aW5kb3cuRXZlbnRTb3VyY2UpIHJldHVybjsKCiAgaWYgKGV2ZW50U291cmNlKSB7CiAgICBldmVudFNvdXJjZS5jbG9zZSgpOwogICAgZXZlbnRTb3VyY2UgPSBudWxsOwogIH0KCiAgLy8gR2V0IGN1cnJlbnQgc29ydCBwYXJhbWV0ZXJzIHRvIG1hdGNoIGZldGNoRGF0YQogIGNvbnN0IHNvcnRCeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb3J0LXNlbGVjdCcpPy52YWx1ZSB8fCAnc3RhdHVzJzsKICBjb25zdCBzb3J0T3JkZXIgPSAnYXNjJzsKICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzLWZpbHRlcicpPy52YWx1ZSB8fCAnJzsKICBjb25zdCBkcml2ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJpdmVyLWZpbHRlcicpPy52YWx1ZSB8fCAnJzsKICBjb25zdCBzZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoLWlucHV0Jyk/LnZhbHVlIHx8ICcnOwoKICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsKICAgIHNvcnRCeSwKICAgIHNvcnRPcmRlciwKICAgIHN0YXR1cywKICAgIGRyaXZlciwKICAgIHNlYXJjaCwKICB9KTsKCiAgZXZlbnRTb3VyY2UgPSBuZXcgZ2xvYmFsVGhpcy53aW5kb3cuRXZlbnRTb3VyY2UoCiAgICBBUElfQkFTRSArICcvYXBpL3dvcmtlcnMvZXZlbnRzPycgKyBwYXJhbXMudG9TdHJpbmcoKQogICk7CgogIGV2ZW50U291cmNlLm9ub3BlbiA9ICgpID0+IHsKICAgIHNzZUFjdGl2ZSA9IHRydWU7CiAgICBpZiAocmVmcmVzaFRpbWVyKSB7CiAgICAgIGNsZWFySW50ZXJ2YWwocmVmcmVzaFRpbWVyKTsKICAgICAgcmVmcmVzaFRpbWVyID0gbnVsbDsKICAgIH0KICB9OwoKICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSAoZXZ0KSA9PiB7CiAgICBjb25zdCBlbGVtZW50cyA9IGdldERvbUVsZW1lbnRzKCk7CgogICAgdHJ5IHsKICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZ0LmRhdGEpOwogICAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLnR5cGUgPT09ICdzbmFwc2hvdCcpIHsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGlmIChub3cgLSBsYXN0U3NlUmVmcmVzaCA8IDQwMDApIHJldHVybjsKICAgICAgICBsYXN0U3NlUmVmcmVzaCA9IG5vdzsKICAgICAgICAvLyBVc2UgU1NFIGRhdGEgdG8gdXBkYXRlIHRoZSBwYWdlCiAgICAgICAgaWYgKHBheWxvYWQud29ya2VycykgewogICAgICAgICAgcmVuZGVyV29ya2VycyhwYXlsb2FkLndvcmtlcnMpOwogICAgICAgICAgLy8gSGlkZSBsb2FkaW5nIHN0YXRlIGlmIGl0J3Mgc2hvd2luZwogICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5zbmFwc2hvdCkgewogICAgICAgICAgLy8gSGFuZGxlIHF1ZXVlIHNuYXBzaG90IGV2ZW50cyAoZGlmZmVyZW50IGZvcm1hdCkKICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdRdWV1ZSBzbmFwc2hvdCByZWNlaXZlZCwgbm90IHVwZGF0aW5nIHdvcmtlcnMgVUknKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBheWxvYWQubW9uaXRvcmluZykgewogICAgICAgICAgLy8gSGFuZGxlIHF1ZXVlIG1vbml0b3JpbmcgZXZlbnRzIChkaWZmZXJlbnQgZm9ybWF0KQogICAgICAgIH0KICAgICAgfQogICAgICBoaWRlTG9hZGluZ1N0YXRlKGVsZW1lbnRzKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBoaWRlTG9hZGluZ1N0YXRlKGVsZW1lbnRzKTsKICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBhcnNlIFNTRSBwYXlsb2FkJywgZXJyKTsKICAgIH0KICB9OwoKICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4gewogICAgaWYgKGV2ZW50U291cmNlKSB7CiAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CiAgICAgIGV2ZW50U291cmNlID0gbnVsbDsKICAgIH0KICAgIHNzZUFjdGl2ZSA9IGZhbHNlOwogIH07Cn0KCi8vIEhlbHBlciBmdW5jdGlvbnMgdG8gcmVkdWNlIGNvbXBsZXhpdHkKZnVuY3Rpb24gY2xlYXJSZWZyZXNoVGltZXIoKSB7CiAgaWYgKHJlZnJlc2hUaW1lcikgewogICAgY2xlYXJJbnRlcnZhbChyZWZyZXNoVGltZXIpOwogICAgcmVmcmVzaFRpbWVyID0gbnVsbDsKICB9Cn0KCmZ1bmN0aW9uIGRpc2FibGVFdmVudFN0cmVhbSgpIHsKICBpZiAoZXZlbnRTb3VyY2UpIHsKICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CiAgICBldmVudFNvdXJjZSA9IG51bGw7CiAgfQogIHNzZUFjdGl2ZSA9IGZhbHNlOwp9CgpmdW5jdGlvbiBlbmFibGVFdmVudFN0cmVhbU9yUG9sbGluZygpIHsKICBpZiAoZ2xvYmFsVGhpcy53aW5kb3cuRXZlbnRTb3VyY2UpIHsKICAgIHNldHVwRXZlbnRTdHJlYW0oKTsKICB9IGVsc2UgaWYgKCFzc2VBY3RpdmUgJiYgYXV0b1JlZnJlc2hFbmFibGVkKSB7CiAgICByZWZyZXNoVGltZXIgPSBzZXRJbnRlcnZhbChmZXRjaERhdGEsIDMwMDAwKTsgLy8gQ29tbWVudGVkIG91dCAtIFNTRSBzaG91bGQgYmUgcHJpbWFyeQogIH0KfQoKZnVuY3Rpb24gY3JlYXRlUGF1c2VJY29uKGljb24pIHsKICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50CiAgd2hpbGUgKGljb24uZmlyc3RDaGlsZCkgewogICAgaWNvbi5maXJzdENoaWxkLnJlbW92ZSgpOwogIH0KICAvLyBDcmVhdGUgcGF1c2UgaWNvbgogIGNvbnN0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7CiAgc3ZnLnNldEF0dHJpYnV0ZSgndmlld0JveCcsICcwIDAgMjQgMjQnKTsKICBjb25zdCByZWN0MSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncmVjdCcpOwogIHJlY3QxLnNldEF0dHJpYnV0ZSgneCcsICc2Jyk7CiAgcmVjdDEuc2V0QXR0cmlidXRlKCd5JywgJzQnKTsKICByZWN0MS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzQnKTsKICByZWN0MS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxNicpOwogIGNvbnN0IHJlY3QyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7CiAgcmVjdDIuc2V0QXR0cmlidXRlKCd4JywgJzE0Jyk7CiAgcmVjdDIuc2V0QXR0cmlidXRlKCd5JywgJzQnKTsKICByZWN0Mi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzQnKTsKICByZWN0Mi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxNicpOwogIHN2Zy5hcHBlbmRDaGlsZChyZWN0MSk7CiAgc3ZnLmFwcGVuZENoaWxkKHJlY3QyKTsKICBpY29uLmFwcGVuZENoaWxkKHN2Zyk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVBsYXlJY29uKGljb24pIHsKICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50CiAgd2hpbGUgKGljb24uZmlyc3RDaGlsZCkgewogICAgaWNvbi5maXJzdENoaWxkLnJlbW92ZSgpOwogIH0KICAvLyBDcmVhdGUgcGxheSBpY29uCiAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTsKICBzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAyNCAyNCcpOwogIGNvbnN0IHBvbHlnb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BvbHlnb24nKTsKICBwb2x5Z29uLnNldEF0dHJpYnV0ZSgncG9pbnRzJywgJzUgMyAxOSAxMiA1IDIxIDUgMycpOwogIHN2Zy5hcHBlbmRDaGlsZChwb2x5Z29uKTsKICBpY29uLmFwcGVuZENoaWxkKHN2Zyk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVJlZnJlc2hCdXR0b24oZW5hYmxlZCkgewogIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRvLXJlZnJlc2gtdG9nZ2xlJyk7CiAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRvLXJlZnJlc2gtaWNvbicpOwogIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dG8tcmVmcmVzaC1sYWJlbCcpOwoKICBpZiAoIWJ0biB8fCAhaWNvbiB8fCAhbGFiZWwpIHJldHVybjsKCiAgaWYgKGVuYWJsZWQpIHsKICAgIGxhYmVsLnRleHRDb250ZW50ID0gJ1BhdXNlIFJlZnJlc2gnOwogICAgY3JlYXRlUGF1c2VJY29uKGljb24pOwogIH0gZWxzZSB7CiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICdBdXRvIFJlZnJlc2gnOwogICAgY3JlYXRlUGxheUljb24oaWNvbik7CiAgfQp9CgovLyBBdXRvLXJlZnJlc2ggLSBSZWZhY3RvcmVkIHRvIHJlZHVjZSBjb21wbGV4aXR5CmZ1bmN0aW9uIHNldEF1dG9SZWZyZXNoKGVuYWJsZWQpIHsKICBhdXRvUmVmcmVzaEVuYWJsZWQgPSBlbmFibGVkOwogIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFVVE9fUkVGUkVTSF9LRVksIGVuYWJsZWQudG9TdHJpbmcoKSk7CgogIGNsZWFyUmVmcmVzaFRpbWVyKCk7CgogIGlmICghZW5hYmxlZCkgewogICAgZGlzYWJsZUV2ZW50U3RyZWFtKCk7CiAgfQoKICBpZiAoZW5hYmxlZCkgewogICAgZW5hYmxlRXZlbnRTdHJlYW1PclBvbGxpbmcoKTsKICB9CgogIHVwZGF0ZVJlZnJlc2hCdXR0b24oZW5hYmxlZCk7Cn0KCi8vIEV2ZW50IGxpc3RlbmVycwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gewogIC8vIEluaXRpYWxpemUgdGhlbWUKICBjdXJyZW50VGhlbWUgPSBnZXRQcmVmZXJyZWRUaGVtZSgpOwogIGFwcGx5VGhlbWUoY3VycmVudFRoZW1lKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtdG9nZ2xlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVUaGVtZSk7CgogIC8vIFNldCB1cCBldmVudCBsaXN0ZW5lcnMKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzLWZpbHRlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgIGN1cnJlbnRQYWdlID0gMTsKICAgIHNldHVwRXZlbnRTdHJlYW0oKTsgLy8gUmVjb25uZWN0IFNTRSB3aXRoIG5ldyBmaWx0ZXJzCiAgICBmZXRjaERhdGEoKTsgLy8gRW5hYmxlIGZvciBzZWFyY2gvZmlsdGVyCiAgfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyaXZlci1maWx0ZXInKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICBjdXJyZW50UGFnZSA9IDE7CiAgICBzZXR1cEV2ZW50U3RyZWFtKCk7IC8vIFJlY29ubmVjdCBTU0Ugd2l0aCBuZXcgZmlsdGVycwogICAgZmV0Y2hEYXRhKCk7IC8vIEVuYWJsZSBmb3Igc2VhcmNoL2ZpbHRlcgogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb3J0LXNlbGVjdCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgIGN1cnJlbnRQYWdlID0gMTsKICAgIHNldHVwRXZlbnRTdHJlYW0oKTsgLy8gUmVjb25uZWN0IFNTRSB3aXRoIG5ldyBzb3J0CiAgICBmZXRjaERhdGEoKTsgLy8gRW5hYmxlIGZvciBzb3J0aW5nCiAgfSk7CgogIGNvbnN0IHNlYXJjaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2gtYnRuJyk7CiAgaWYgKHNlYXJjaEJ0bikgewogICAgc2VhcmNoQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICBjdXJyZW50UGFnZSA9IDE7CiAgICAgIHNldHVwRXZlbnRTdHJlYW0oKTsgLy8gUmVjb25uZWN0IFNTRSB3aXRoIG5ldyBzZWFyY2gKICAgICAgZmV0Y2hEYXRhKCk7IC8vIEVuYWJsZSBmb3Igc2VhcmNoCiAgICB9KTsKICB9CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaC1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHsKICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgewogICAgICBjdXJyZW50UGFnZSA9IDE7CiAgICAgIHNldHVwRXZlbnRTdHJlYW0oKTsgLy8gUmVjb25uZWN0IFNTRSB3aXRoIG5ldyBzZWFyY2gKICAgICAgZmV0Y2hEYXRhKCk7IC8vIEVuYWJsZSBmb3Igc2VhcmNoCiAgICB9CiAgfSk7CgogIC8vIEluaXRpYWxpemUgYXV0by1yZWZyZXNoCiAgY29uc3Qgc3RvcmVkQXV0b1JlZnJlc2ggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBVVRPX1JFRlJFU0hfS0VZKTsKICBpZiAoc3RvcmVkQXV0b1JlZnJlc2ggPT09IG51bGwpIHsKICAgIC8vIE9ubHkgdXNlIGRlZmF1bHQgaWYgbm8gdmFsdWUgaXMgc3RvcmVkCiAgICBzZXRBdXRvUmVmcmVzaCh0cnVlKTsKICB9IGVsc2UgewogICAgLy8gVXNlIHN0b3JlZCB2YWx1ZQogICAgc2V0QXV0b1JlZnJlc2goc3RvcmVkQXV0b1JlZnJlc2ggPT09ICd0cnVlJyk7CiAgfQogIHNldHVwRXZlbnRTdHJlYW0oKTsKICAvLyBTU0Ugc2hvdWxkIGhhbmRsZSBpbml0aWFsIGRhdGEgbG9hZGluZwogIGdsb2JhbFRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHsKICAgIGlmIChldmVudFNvdXJjZSkgewogICAgICBldmVudFNvdXJjZS5jbG9zZSgpOwogICAgfQogIH0pOwp9KTsK
10
+ `;
11
+ export const ZINTRUST_SVG = `
12
+ PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9Inp0LWcyZCIgeDE9IjEwIiB5MT0iNTAiIHgyPSI5MCIgeTI9IjUwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMmM1NWUiIC8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzM4YmRmOCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjM0IiBzdHJva2U9InJnYmEoMjU1LDI1NSwyNTUsMC4xNikiIHN0cm9rZS13aWR0aD0iNCIgLz4KICA8ZWxsaXBzZSBjeD0iNTAiIGN5PSI1MCIgcng9IjQwIiByeT0iMTgiIHN0cm9rZT0idXJsKCN6dC1nMmQpIiBzdHJva2Utd2lkdGg9IjQiIC8+CiAgPGVsbGlwc2UgY3g9IjUwIiBjeT0iNTAiIHJ4PSIxOCIgcnk9IjQwIiBzdHJva2U9InVybCgjenQtZzJkKSIgc3Ryb2tlLXdpZHRoPSI0IiBvcGFjaXR5PSIwLjc1IiAvPgogIDxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjYiIGZpbGw9InVybCgjenQtZzJkKSIgLz4KICA8cGF0aAogICAgZD0iTTQwIDUyQzM1IDUyIDMyIDQ5IDMyIDQ0QzMyIDM5IDM1IDM2IDQwIDM2SDQ4IgogICAgc3Ryb2tlPSJ3aGl0ZSIKICAgIHN0cm9rZS13aWR0aD0iNiIKICAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAvPgogIDxwYXRoCiAgICBkPSJNNjAgNDhDNjUgNDggNjggNTEgNjggNTZDNjggNjEgNjUgNjQgNjAgNjRINTIiCiAgICBzdHJva2U9IndoaXRlIgogICAgc3Ryb2tlLXdpZHRoPSI2IgogICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIC8+CiAgPHBhdGgKICAgIGQ9Ik00NCA1MEg1NiIKICAgIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwwLjIyKSIKICAgIHN0cm9rZS13aWR0aD0iNiIKICAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAvPgo8L3N2Zz4K
13
+ `;