rubyfox-server 2.17.3.2 → 2.19.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +10 -1
  3. data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +90 -20
  4. data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +9 -0
  5. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +11 -0
  6. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +3 -3
  7. data/lib/rubyfox/server/data/config/core.xml +4 -4
  8. data/lib/rubyfox/server/data/config/default.words.txt +11 -0
  9. data/lib/rubyfox/server/data/config/log4j.properties +1 -2
  10. data/lib/rubyfox/server/data/config/server.xml +1 -1
  11. data/lib/rubyfox/server/data/data/GeoLite2-Country.mmdb +0 -0
  12. data/lib/rubyfox/server/data/data/bannedusers/users.bin +0 -0
  13. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  14. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina-tasks.xml +39 -39
  15. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +0 -0
  16. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.sh +0 -0
  17. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  18. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  19. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.sh +0 -0
  20. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/daemon.sh +0 -0
  21. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.sh +0 -0
  22. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.sh +0 -0
  23. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.sh +0 -0
  24. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.sh +0 -0
  25. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.sh +0 -0
  26. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  27. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  28. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.sh +0 -0
  29. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.sh +0 -0
  30. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/Catalina/localhost/rewrite.config +1 -1
  31. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +263 -263
  32. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +209 -207
  33. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/context.xml +31 -31
  34. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xml +23 -23
  35. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xsd +52 -52
  36. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
  37. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/server.xml +177 -161
  38. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xml +18 -7
  39. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xsd +59 -59
  40. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/web.xml +4740 -4737
  41. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  42. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  43. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  44. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  45. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  46. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/sfs2x-ws-helper.jar +0 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  71. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  72. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  73. data/lib/rubyfox/server/data/lib/javax.activation-1.2.0.jar +0 -0
  74. data/lib/rubyfox/server/data/lib/javax.mail.jar +0 -0
  75. data/lib/rubyfox/server/data/lib/js/JSApi.js +2 -1
  76. data/lib/rubyfox/server/data/lib/js/LibApi.js +181 -48
  77. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  78. data/lib/rubyfox/server/data/lib/sfs2x-cluster.jar +0 -0
  79. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  80. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  81. data/lib/rubyfox/server/data/sfs2x-service +26 -30
  82. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  83. data/lib/rubyfox/server/data/www/HelloServlet/WEB-INF/web.xml +1 -3
  84. data/lib/rubyfox/server/data/www/ROOT/_css_/default.css +14 -6
  85. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +44 -2
  86. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +98 -61
  87. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/endors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-6~mod-7~mod-8~mod-9.bundle.js +17357 -0
  88. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +4 -4
  89. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +3 -3
  90. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +101 -66
  91. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +544 -8
  92. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +915 -1480
  93. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-15~module-16~module-4.bundle.js +2665 -0
  94. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +606 -3093
  95. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13~module-16~module-17~module-4.bundle.js +2665 -0
  96. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-14.bundle.js +764 -0
  97. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-15.bundle.js +71 -0
  98. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-16.bundle.js +1787 -0
  99. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-17.bundle.js +3383 -0
  100. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +121 -1009
  101. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +1214 -1744
  102. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +398 -666
  103. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +717 -192
  104. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +2117 -665
  105. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +613 -690
  106. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~mod-0~mod-1~mod-10~mod-11~mod-16~mod-5~mod-6~mod-7~mod-8.bundle.js +17357 -0
  107. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-5~mod-6~mod-7~mod-8~mod-9.bundle.js +17357 -0
  108. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/{vendors~module-0~module-1~module-13~module-4~module-5~module-7~module-8.bundle.js → vendors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-5~mod-7~mod-8~mod-9.bundle.js} +2 -2
  109. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-12.bundle.js +807 -0
  110. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-13.bundle.js +807 -0
  111. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-configurator.html +32 -0
  112. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-monitor.html +185 -0
  113. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-updater.html +47 -0
  114. data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-deployer.html +84 -0
  115. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +15 -8
  116. data/lib/rubyfox/server/data/www/ROOT/index.html +13 -23
  117. data/lib/rubyfox/server/data/www/host-manager/META-INF/context.xml +2 -2
  118. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/404.jsp +2 -2
  119. data/lib/rubyfox/server/data/www/host-manager/{manager.xml → WEB-INF/manager.xml} +5 -1
  120. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/web.xml +17 -0
  121. data/lib/rubyfox/server/data/www/host-manager/css/manager.css +141 -0
  122. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.svg +967 -0
  123. data/lib/rubyfox/server/data/www/manager/META-INF/context.xml +2 -0
  124. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCerts.jsp +1 -1
  125. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCiphers.jsp +1 -1
  126. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorTrustedCerts.jsp +1 -1
  127. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionDetail.jsp +3 -3
  128. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionsList.jsp +1 -1
  129. data/lib/rubyfox/server/data/www/manager/WEB-INF/web.xml +17 -0
  130. data/lib/rubyfox/server/data/www/manager/css/manager.css +141 -0
  131. data/lib/rubyfox/server/data/www/manager/images/tomcat.svg +967 -0
  132. data/lib/rubyfox/server/data/www/manager/xform.xsl +74 -59
  133. data/lib/rubyfox/server/version.rb +1 -1
  134. metadata +30 -31
  135. data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
  136. data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
  137. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
  138. data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
  139. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
  140. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
  141. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
  142. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
  143. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
  144. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.png +0 -0
  145. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
  146. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
  147. data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
  148. data/lib/rubyfox/server/data/lib/apache-tomcat/LICENSE +0 -1061
  149. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +0 -68
  150. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +0 -81
  151. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +0 -174
  152. data/lib/rubyfox/server/data/lib/imap.jar +0 -0
  153. data/lib/rubyfox/server/data/lib/mailapi.jar +0 -0
  154. data/lib/rubyfox/server/data/lib/pop3.jar +0 -0
  155. data/lib/rubyfox/server/data/lib/smtp.jar +0 -0
  156. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +0 -2634
  157. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +0 -807
  158. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.gif +0 -0
  159. data/lib/rubyfox/server/data/www/manager/images/tomcat.gif +0 -0
  160. /data/lib/rubyfox/server/data/data/buddylists/{BasicExamples/.keep → .keep} +0 -0
@@ -5709,9 +5709,9 @@ class MetricsManager
5709
5709
  this.CONTACTS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.CONTACTS, 'Contacts', 'Total number of connections\n<i>A connection is recorded each time a socket/BlueBox connection is established by a client</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER);
5710
5710
  this.VISITS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.VISITS, 'Visits', 'Total number of visits\n<i>A visit is recorded each time a user performs a successful login</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER);
5711
5711
  this.UNIQUE_VISITORS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.UNIQUE_VISITORS, 'Unique visitors', 'Number of unduplicated (counted only once) visitors over the course of the selected time period\n<i>The visitor uniqueness is based on the username and login Zone: the same username used in different Zones is considered to be a different visitor</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER);
5712
- this.NEW_VISITORS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.NEW_VISITORS, 'New visitors', 'Number of first time visitors, independently from the selected time period\n<i>A visitor is recorded as \'new\' if his/her username has never been used before in the same Zone (based on the available data)</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER);
5712
+ this.NEW_VISITORS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.NEW_VISITORS, 'New visitors', 'Number of first time visitors, independently from the selected time period\n<i>A visitor is recorded as \'new\' if their username has never been used before in the same Zone (based on the available data)</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER);
5713
5713
  this.NEW_VISITORS_VISITS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.NEW_VISITORS_VISITS, 'Visits of new visitors', 'Total number of visits of first time visitors over the selected time period\n<i>A visit is recorded a \'new\' over the time period if the user is recorded as new visitor in that period</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER);
5714
- this.RET_VISITORS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.RET_VISITORS, 'Returning visitors', 'Number of visitors whose first visit happened before the selected time period\n<i>A visitor is recorded as \'returning\' if his/her username was already used before in the same Zone (based on the available data)</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER, true);
5714
+ this.RET_VISITORS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.RET_VISITORS, 'Returning visitors', 'Number of visitors whose first visit happened before the selected time period\n<i>A visitor is recorded as \'returning\' if their username was already used before in the same Zone (based on the available data)</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER, true);
5715
5715
  this.RET_VISITORS_VISITS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.RET_VISITORS_VISITS, 'Visits of returning visitors', 'Total number of visits of users whose first visit happened before the selected time period\n<i>A visit is recorded as \'return\' over the time period if the user is recorded as a returning visitor in that period</i>', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].NUMBER, true);
5716
5716
  this.PERC_NEW_VISITORS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.PERC_NEW_VISITORS, 'New visitors %', 'Percentage of first time visitors over the number of unique visitors in the selected time period', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].PERCENTAGE, true);
5717
5717
  this.PERC_RET_VISITORS = new _data_metric__WEBPACK_IMPORTED_MODULE_0__["BaseMetric"](MetricsManager.PERC_RET_VISITORS, 'Returning visitors %', 'Percentage of returning visitors over the number of unique visitors in the selected time period', _data_metric__WEBPACK_IMPORTED_MODULE_0__["MetricType"].PERCENTAGE, true);
@@ -7634,7 +7634,7 @@ class Analytics extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
7634
7634
  params.putBool('rebuild', rebuild);
7635
7635
 
7636
7636
  // ENABLE FOR TESTING PURPOSE ONLY, WHEN PROCESSING LOGS GENERATED WITH A DIFFERENT LOCALE
7637
- params.putUtfString('locale', 'en');
7637
+ //params.putUtfString('locale', 'en');
7638
7638
 
7639
7639
  this.sendExtensionRequest(this.REQ_START_LOG_ANALYSIS, params);
7640
7640
 
@@ -7659,4 +7659,4 @@ class Analytics extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
7659
7659
  /***/ })
7660
7660
 
7661
7661
  }]);
7662
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMC5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYW5hbHl0aWNzLWJhc2UtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYW5hbHl0aWNzLWRhdGEtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYXBwbGljYXRpb24vYXBwbGljYXRpb24tY2hhcnQtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYXBwbGljYXRpb24vYXBwbGljYXRpb24tdGFibGUtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYmFzZS1jaGFydC12aWV3LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9iYXNlLW1hcC12aWV3LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9iYXNlLXRhYmxlLXZpZXcuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2RlbW9ncmFwaGljcy9kZW1vZ3JhcGhpY3MtY2hhcnQtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGVtb2dyYXBoaWNzL2RlbW9ncmFwaGljcy1tYXAtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGVtb2dyYXBoaWNzL2RlbW9ncmFwaGljcy1wcm8tYWR2LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9kZW1vZ3JhcGhpY3MvZGVtb2dyYXBoaWNzLXRhYmxlLXZpZXcuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2V4Y2VwdGlvbnMvZXhjZXB0aW9ucy1jaGFydC12aWV3LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9leGNlcHRpb25zL2V4Y2VwdGlvbnMtdGFibGUtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZmlsdGVyLWV2ZW50LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tYWluLWNoYXJ0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tZXRyaWMtZGlzcGxheS1zdGF0ZS5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljLWxpc3QtaXRlbS5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvdGVjaG5vbG9neS90ZWNobm9sb2d5LWNoYXJ0LXZpZXcuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3RlY2hub2xvZ3kvdGVjaG5vbG9neS1wcm8tYWR2LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy90ZWNobm9sb2d5L3RlY2hub2xvZ3ktdGFibGUtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvdGlueS12aXNpdHMtY2hhcnQuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3Zpc2l0b3JzLWNoYXJ0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGF0YS1yYW5nZS1tYW5hZ2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGF0YS9jb250YWluZXJzLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGF0YS9tZXRyaWMuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9kYXRhL3N0YXRzLWRhdGEtZmlsdGVyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGF0YS90YWJsZS1kYXRhLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljcy1tYW5hZ2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvdXRpbHMvZGF0ZS1oZWxwZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy92aWV3LW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbW9kdWxlcy9hbmFseXRpY3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEFuYWx5dGljc0Jhc2VFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2hhZG93IHJvb3Rcblx0XHRjb25zdCBzaGFkb3dSb290ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGU6ICdvcGVuJ30pO1xuXHRcdHNoYWRvd1Jvb3QuaW5uZXJIVE1MID0gYFxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCJhc3NldHMvY3NzL2N1c3RvbS1ib290c3RyYXAubWluLmNzc1wiIC8+XG5cdFx0XHQ8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cImFzc2V0cy9jc3Mva2VuZG8uY3VzdG9tLWJvb3RzdHJhcC12NC5jc3NcIiAvPlxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCJhc3NldHMvY3NzL2ZvbnRhd2Vzb21lL2Nzcy9hbGwubWluLmNzc1wiIC8+XG5cblx0XHRcdDxzdHlsZT5cblx0XHRcdFx0Omhvc3Qge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5oZWxwLXRvb2x0aXAge1xuXHRcdFx0XHRcdHRleHQtYWxpZ246IGxlZnQ7XG5cdFx0XHRcdFx0d2hpdGUtc3BhY2U6IHByZS13cmFwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Lmljb24taW52aXNpYmxlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR2aXNpYmlsaXR5OiBoaWRkZW47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuc2hvdy1wb2ludGVyIHtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQubWV0cmljTWFpbiB7XG5cdFx0XHRcdFx0Y29sb3I6ICMzMzk5ZmY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQubWV0cmljQ29tcGFyZSB7XG5cdFx0XHRcdFx0Y29sb3I6ICNmZjk5MDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuY2hhcnQtdG9vbHRpcC1jYXRlZ29yeSB7XG5cdFx0XHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblx0XHRgO1xuXHR9XG5cblx0Z2V0JChzZWxlY3Rvcilcblx0e1xuXHRcdHJldHVybiAkKHNlbGVjdG9yLCB0aGlzLnNoYWRvd1Jvb3QpO1xuXHR9XG59XG4iLCJpbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuL2FuYWx5dGljcy1iYXNlLWVsZW1lbnQnO1xuaW1wb3J0IHtUaW55VmlzaXRzQ2hhcnR9IGZyb20gJy4vdGlueS12aXNpdHMtY2hhcnQnO1xuaW1wb3J0IHtNYWluQ2hhcnR9IGZyb20gJy4vbWFpbi1jaGFydCc7XG5pbXBvcnQge01ldHJpY0xpc3RJdGVtfSBmcm9tICcuL21ldHJpYy1saXN0LWl0ZW0nO1xuaW1wb3J0IHtWaXNpdG9yc0NoYXJ0fSBmcm9tICcuL3Zpc2l0b3JzLWNoYXJ0JztcblxuZXhwb3J0IGNsYXNzIEFuYWx5dGljc0RhdGFWaWV3IGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdC51bHRyYS1saWdodCB7XG5cdFx0XHRcdFx0b3BhY2l0eTogLjU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQjcHJvZ3Jlc3NCYXIge1xuXHRcdFx0XHRcdHdpZHRoOiAyMDBweDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCNwcm9ncmVzc0JhciAuay1wcm9ncmVzcy1zdGF0dXMge1xuXHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuY3VzdG9tLWNvbDo6c2xvdHRlZCgqKSB7XG5cblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1zdGFydCBtYi0zXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2xcIj5cblx0XHRcdFx0XHQ8dGlueS12aXNpdHMtY2hhcnQgaWQ9XCJ0aW55VmlzaXRzQ2hhcnRcIj48L3RpbnktdmlzaXRzLWNoYXJ0PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tYXV0byBvcmRlci1maXJzdCBvcmRlci1zbS1sYXN0IHRleHQtcmlnaHRcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwicHJvZ3Jlc3NcIiBjbGFzcz1cIlwiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIG1yLTFcIj5Mb2FkaW5nPC9zcGFuPlxuXHRcdFx0XHRcdFx0PGRpdiBpZD1cInByb2dyZXNzQmFyXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PHNtYWxsIGlkPVwiZWxhcHNlZFwiIGNsYXNzPVwidGV4dC1tdXRlZCB1bHRyYS1saWdodFwiPjwvc21hbGw+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cblx0XHRcdFx0XHQ8bWFpbi1jaGFydCBpZD1cIm1haW5DaGFydFwiPjwvbWFpbi1jaGFydD5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwibWV0cmljc0xpc3RcIiBjbGFzcz1cInJvdyBuby1ndXR0ZXJzXCI+PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLThcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwidmlzaXRvcnNQaWVDaGFydHNcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cblx0XHRcdFx0XHRcdFx0PGhyIGNsYXNzPVwidy0xMDAgZC1tZC1ub25lXCI+XG5cdFx0XHRcdFx0XHRcdDx2aXNpdG9ycy1jaGFydCBpZD1cInZpc2l0b3JzUGllTWFpblwiPjwvdmlzaXRvcnMtY2hhcnQ+XG5cdFx0XHRcdFx0XHRcdDx2aXNpdG9ycy1jaGFydCBpZD1cInZpc2l0b3JzUGllQ29tcFwiIGNvbXBhcmU9XCJ0cnVlXCI+PC92aXNpdG9ycy1jaGFydD5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxzbG90IGNsYXNzPVwiY3VzdG9tLWNvbFwiIG5hbWU9XCJjdXN0b20tY29sdW1uXCI+PC9zbG90PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cblx0XHR0aGlzLl9tZXRyaWNJdGVtc0J5SWQgPSBbXTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtZXRyaWMgbGlzdCBpdGVtIGNsaWNrXG5cdFx0dGhpcy5nZXQkKCcjbWV0cmljc0xpc3QnKS5vbignbWV0cmljLWNsaWNrJywgJC5wcm94eSh0aGlzLl9vbk1ldHJpY0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBIaWRlIHRoZSB2aXNpdG9ycyBwaWUgY2hhcnRzOyB3aWxsIGJlIHNob3duIGlmIGluaXRpYWxpemVkIG9ubHlcblx0XHR0aGlzLmdldCQoJyN2aXNpdG9yc1BpZUNoYXJ0cycpLmhpZGUoKTtcblxuXHRcdC8vIEhpZGUgdGhlIGNvbXBhcmUgdmlzaXRvcnMgcGllIGNoYXJ0OyB3aWxsIGJlIHNob3duIGlmIGNvbXBhcmUgaXMgYWN0aXZlXG5cdFx0dGhpcy5nZXQkKCcjdmlzaXRvcnNQaWVDb21wJykuaGlkZSgpO1xuXG5cdFx0Ly8gSGlkZSBlbGFwc2VkIGFuZCBwcm9ncmVzcyBiYXJcblx0XHR0aGlzLmdldCQoJyNwcm9ncmVzcycpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJyNlbGFwc2VkJykuaGlkZSgpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJcblx0XHR0aGlzLl9wcm9ncmVzc0JhciA9IHRoaXMuZ2V0JCgnI3Byb2dyZXNzQmFyJykua2VuZG9Qcm9ncmVzc0Jhcih7XG5cdFx0XHRtaW46IDAsXG4gICAgICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9Qcm9ncmVzc0JhcicpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHR0aGlzLmdldCQoJyNtZXRyaWNzTGlzdCcpLm9mZignbWV0cmljLWNsaWNrJyk7XG5cdFx0dGhpcy5nZXQkKCdzbG90Jykub2ZmKCdmaWx0ZXItc2V0Jyk7XG5cdH1cblxuXHRnZXQgdmlld0lkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl92aWV3SWQ7XG5cdH1cblxuXHRzZXQgdmlld0lkKHZhbHVlKVxuXHR7XG5cdFx0dGhpcy5fdmlld0lkID0gdmFsdWU7XG5cdH1cblxuXHRnZXQgZmlsdGVyKClcblx0e1xuXHRcdHJldHVybiAodGhpcy5fZmlsdGVyID8gdGhpcy5fZmlsdGVyIDogbnVsbCk7XG5cdH1cblxuXHRnZXQgbWFpbkNoYXJ0KClcblx0e1xuXHRcdHJldHVybiB0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ21haW5DaGFydCcpO1xuXHR9XG5cblx0Z2V0IHRpbnlWaXNpdHNDaGFydCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKCd0aW55VmlzaXRzQ2hhcnQnKTtcblx0fVxuXG5cdGFkZE1ldHJpY0xpc3RJdGVtKG5hbWUsIGhhc0NoYXJ0LCBtTWFpbiwgbUNvbXBhcmUsIGlzT3ZlcnZpZXcgPSBmYWxzZSlcblx0e1xuXHRcdGxldCBtaSA9IG5ldyBNZXRyaWNMaXN0SXRlbSgpO1xuXHRcdG1pLmluaXQodGhpcy5fdmlld0lkLCBuYW1lLCBoYXNDaGFydCwgbU1haW4sIG1Db21wYXJlLCBpc092ZXJ2aWV3KTtcblx0XHRtaS5jbGFzc0xpc3QuYWRkKCdjb2wtMTInKTtcblx0XHRtaS5jbGFzc0xpc3QuYWRkKCdjb2wtc20tNicpO1xuXHRcdG1pLmNsYXNzTGlzdC5hZGQoJ2NvbC1tZC0xMicpO1xuXG5cdFx0dGhpcy5fbWV0cmljSXRlbXNCeUlkW25hbWVdID0gbWk7XG5cblx0XHQvLyBBZGQgaXRlbSB0byBtZXRyaWNzIGxpc3Rcblx0XHR0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ21ldHJpY3NMaXN0JykuYXBwZW5kQ2hpbGQobWkpO1xuXHR9XG5cblx0c2V0TWV0cmljSXRlbVN0YXRlKG1ldHJpY0lkLCBzdGF0ZSlcblx0e1xuXHRcdGlmICh0aGlzLl9tZXRyaWNJdGVtc0J5SWRbbWV0cmljSWRdKVxuXHRcdFx0dGhpcy5fbWV0cmljSXRlbXNCeUlkW21ldHJpY0lkXS5zdGF0ZSA9IHN0YXRlO1xuXHR9XG5cblx0cmVmcmVzaE1ldHJpY0l0ZW0obWV0cmljSWQpXG5cdHtcblx0XHRpZiAodGhpcy5fbWV0cmljSXRlbXNCeUlkW21ldHJpY0lkXSlcblx0XHRcdHRoaXMuX21ldHJpY0l0ZW1zQnlJZFttZXRyaWNJZF0ucmVmcmVzaCgpO1xuXHR9XG5cblx0aW5pdFZpc2l0b3JzUGllQ2hhcnRzKG1EYXRhLCBjRGF0YSlcblx0e1xuXHRcdC8vIEluaXQgbWFpbiB2aXNpdG9ycyBwaWUgY2hhcnRcblx0XHR0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ3Zpc2l0b3JzUGllTWFpbicpLmluaXQodGhpcy5fdmlld0lkLCBtRGF0YS5wbnYsIG1EYXRhLnBydiwgbURhdGEubnZ2LCBtRGF0YS5ydnYpO1xuXG5cdFx0Ly8gSW5pdCBjb21wYXJlIHZpc2l0b3JzIHBpZSBjaGFydFxuXHRcdHRoaXMuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgndmlzaXRvcnNQaWVDb21wJykuaW5pdCh0aGlzLl92aWV3SWQsIGNEYXRhLnBudiwgY0RhdGEucHJ2LCBjRGF0YS5udnYsIGNEYXRhLnJ2dik7XG5cblx0XHQvLyBTaG93IHZpc2l0b3JzIHBpZSBjaGFydHNcblx0XHR0aGlzLmdldCQoJyN2aXNpdG9yc1BpZUNoYXJ0cycpLnNob3coKTtcblx0fVxuXG5cdHNldFZpc2l0b3JzUGllQ2hhcnRzU3RhdGUoc3RhdGUpXG5cdHtcblx0XHR0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ3Zpc2l0b3JzUGllTWFpbicpLnN0YXRlID0gc3RhdGU7XG5cdFx0dGhpcy5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKCd2aXNpdG9yc1BpZUNvbXAnKS5zdGF0ZSA9IHN0YXRlO1xuXHR9XG5cblx0c2hvd1Zpc2l0b3JzQ29tcGFyZVBpZUNoYXJ0KGRvU2hvdylcblx0e1xuXHRcdGlmIChkb1Nob3cpXG5cdFx0XHR0aGlzLmdldCQoJyN2aXNpdG9yc1BpZUNvbXAnKS5zaG93KCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5nZXQkKCcjdmlzaXRvcnNQaWVDb21wJykuaGlkZSgpO1xuXHR9XG5cblx0cmVmcmVzaFZpc2l0b3JzUGllQ2hhcnRzKClcblx0e1xuXHRcdHRoaXMuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgndmlzaXRvcnNQaWVNYWluJykucmVmcmVzaCgpO1xuXHRcdHRoaXMuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgndmlzaXRvcnNQaWVDb21wJykucmVmcmVzaCgpO1xuXHR9XG5cblx0c2V0TWFpbkNoYXJ0QXZhaWxUaW1lVW5pdHMocmFuZ2VMZW4pXG5cdHtcblx0XHRjb25zdCBob3VybHlFbmFibGVkID0gKHJhbmdlTGVuIDw9IDcpOyAvLyBPbmUgd2Vla1xuXHRcdGNvbnN0IGRhaWx5RW5hYmxlZCA9IChyYW5nZUxlbiA8PSA5Myk7IC8vIFRocmVlIG1vbnRocyAofilcblx0XHRjb25zdCB3ZWVrbHlFbmFibGVkID0gKHJhbmdlTGVuIDw9IDczMCk7IC8vIFR3byB5ZWFyc1xuXG5cdFx0bGV0IGN1cnJlbnRVbml0ID0gdGhpcy5tYWluQ2hhcnQuZ2V0U2VsZWN0ZWRUaW1lVW5pdCgpO1xuXG5cdFx0aWYgKGN1cnJlbnRVbml0ID09ICdISCcgJiYgIWhvdXJseUVuYWJsZWQpXG5cdFx0XHRjdXJyZW50VW5pdCA9ICdERCc7XG5cblx0XHRpZiAoY3VycmVudFVuaXQgPT0gJ0REJyAmJiAhZGFpbHlFbmFibGVkKVxuXHRcdFx0Y3VycmVudFVuaXQgPSAnV1cnO1xuXG5cdFx0aWYgKGN1cnJlbnRVbml0ID09ICdXVycgJiYgIXdlZWtseUVuYWJsZWQpXG5cdFx0XHRjdXJyZW50VW5pdCA9ICdNTSc7XG5cblx0XHR0aGlzLm1haW5DaGFydC5zZXRUaW1lVW5pdChjdXJyZW50VW5pdCwgaG91cmx5RW5hYmxlZCwgZGFpbHlFbmFibGVkLCB3ZWVrbHlFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tTZXBhcmF0b3Jcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZpbHRlckRpc3BsYXlWYWx1ZVxuXHQgKi9cblx0c2V0RGF0YUZpbHRlcihmaWx0ZXIsIGNoZWNrU2VwYXJhdG9yLCBmaWx0ZXJEaXNwbGF5VmFsdWUgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5fZmlsdGVyID0gZmlsdGVyO1xuXG5cdFx0Ly8gRGlzcGxheSBmaWx0ZXJcblx0XHR0aGlzLm1haW5DaGFydC5kaXNwbGF5RmlsdGVyKHRoaXMuX2ZpbHRlciwgY2hlY2tTZXBhcmF0b3IsIGZpbHRlckRpc3BsYXlWYWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2RzIGNoZWNrcyBpZiB0aGUgY3VycmVudCB2aWV3IGhhcyB0aGUgc2FtZSBmaWx0ZXIgYW5kIHRpbWUgdW5pdCBzZXR0aW5ncyBjb21wYXJlZCB0byB0aG9zZSBwYXNzZWQgYXMgcGFyYW1zLlxuXHQgKiBUaGlzIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNoYXJ0IGRhdGEgYXBwbHkgdG8gdGhlIGN1cnJlbnQgdmlldyB0b28sIGFuZCB3ZSBjYW4gdXBkYXRlIGl0LlxuXHQgKiBJZiB0cnVlIGlzIHJldHVybmVkIHRoZW4gdGhpcyB2aWV3IGhhcyB0aGUgc2FtZSBzZXR0aW5ncy5cblx0ICpcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICogQHBhcmFtICB7c3RyaW5nfSB0aW1lVW5pdFxuXHQgKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0dmFsaWRhdGVWaWV3U2V0dGluZ3MoZmlsdGVyLCB0aW1lVW5pdClcblx0e1xuXHRcdC8vIENoZWNrIHRpbWUgdW5pdFxuXHRcdGlmICh0aGlzLm1haW5DaGFydC5nZXRTZWxlY3RlZFRpbWVVbml0KCkgIT0gdGltZVVuaXQpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBDaGVjayBmaWx0ZXJcblx0XHRpZiAoKGZpbHRlciA9PSBudWxsICYmIHRoaXMuX2ZpbHRlciAhPSBudWxsKSB8fCAoZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyID09IG51bGwpKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAoZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChmaWx0ZXIubmFtZSAhPSB0aGlzLl9maWx0ZXIubmFtZSB8fCBmaWx0ZXIudmFsdWUgIT0gdGhpcy5fZmlsdGVyLnZhbHVlKVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHNldEVsYXBzZWQoZWxhcHNlZClcblx0e1xuXHRcdHRoaXMuZ2V0JCgnI2VsYXBzZWQnKS50ZXh0KGVsYXBzZWQpO1xuXHR9XG5cblx0c2V0UHJvZ3Jlc3MoaXNMb2FkaW5nLCBleHBlY3RlZFByb2dyZXNzVXBkYXRlcyA9IC0xKVxuXHR7XG5cdFx0aWYgKGlzTG9hZGluZylcblx0XHR7XG5cdFx0XHR0aGlzLmdldCQoJyNlbGFwc2VkJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjcHJvZ3Jlc3MnKS5zaG93KCk7XG5cblx0XHRcdC8vIEluaXQgcHJvZ3Jlc3MgYmFyXG5cdFx0XHR0aGlzLl9wcm9ncmVzc0Jhci5zZXRPcHRpb25zKHttYXg6IGV4cGVjdGVkUHJvZ3Jlc3NVcGRhdGVzfSk7XG5cdFx0XHR0aGlzLl9wcm9ncmVzc0Jhci52YWx1ZSgwKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuZ2V0JCgnI3Byb2dyZXNzJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjZWxhcHNlZCcpLnNob3coKTtcblx0XHR9XG5cdH1cblxuXHR1cGRhdGVQcm9ncmVzcyhzdGVwcylcblx0e1xuXHRcdGxldCB2YWx1ZSA9IHRoaXMuX3Byb2dyZXNzQmFyLnZhbHVlKCkgKyBzdGVwcztcblx0XHR0aGlzLl9wcm9ncmVzc0Jhci52YWx1ZSh2YWx1ZSk7XG5cdH1cblxuXHRfb25NZXRyaWNDbGljayhlKVxuXHR7XG5cdFx0Y29uc3QgbWV0cmljSXRlbSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IG1ldHJpY0lkID0gbWV0cmljSXRlbS5uYW1lO1xuXHRcdHRoaXMubWFpbkNoYXJ0LnNldFNlbGVjdGVkTWV0cmljQnlJZChtZXRyaWNJZCk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdhbmFseXRpY3MtZGF0YS12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2FuYWx5dGljcy1kYXRhLXZpZXcnLCBBbmFseXRpY3NEYXRhVmlldyk7XG4iLCJpbXBvcnQge0Jhc2VDaGFydFZpZXd9IGZyb20gJy4uL2Jhc2UtY2hhcnQtdmlldyc7XG5pbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuLi9maWx0ZXItZXZlbnQnO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkNoYXJ0VmlldyBleHRlbmRzIEJhc2VDaGFydFZpZXdcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSlcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KHRoaXMuX3RhYmxlRGF0YS5kYXRhKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdF9kcmF3Q2hhcnQoY2hhcnREYXRhKVxuXHR7XG5cdFx0Y29uc3QgbWV0cmljID0gdGhpcy5nZXRTZWxlY3RlZE1ldHJpYygpO1xuXG5cdFx0aWYgKGNoYXJ0RGF0YSAhPSBudWxsICYmIGNoYXJ0RGF0YS5sZW5ndGggPiAwICYmIG1ldHJpYyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0Y2hhcnREYXRhID0gY2hhcnREYXRhLmZpbHRlcihvYmogPT4gb2JqLnpvbmUgPT0gdGhpcy5fZmlsdGVyLnZhbHVlKTtcblxuXHRcdFx0Ly8gU29ydCBhbmQgZXh0cmFjdCB0b3AgMTAgdmFsdWVzXG5cdFx0XHRsZXQgZGF0YSA9IGNoYXJ0RGF0YS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGJbbWV0cmljLmlkXSAtIGFbbWV0cmljLmlkXSB9KS5zbGljZSgwLCAxMCk7XG5cblx0XHRcdC8vIElTU1VFISEhISEhIVxuXHRcdFx0Ly8gSWYgdGhlIG1ldHJpYyBpZCBzdGFydHMgd2l0aCBcIiVcIiwgS2VuZG8gY2hhcnQgY3Jhc2hlc1xuXHRcdFx0Ly8gRm9yIHRoaXMgcmVhc29uIGluc3RlYWQgb2Ygc2ltcGx5IHNldHRpbmcgdGhlIHNlcmllcyBmaWVsZCBhbmQgY2F0ZWdvcnkgZmllbGQsIHdlIG5lZWQgdG8gcmVidWlsZCB0aGUgc2VyaWVzIGRhdGEgaXRlbXMgZnJvbSB0aGUgY2hhcnQgZGF0YVxuXHRcdFx0Ly8gKG5vdGU6IGZvciB0aW1lIG1ldHJpY3MsIHZhbHVlIGlzIGNvbnZlcnRlZCBmcm9tIG1pbGxpcyB0byBtaW51dGVzKVxuXG5cdFx0XHRkYXRhID0gZGF0YS5tYXAob2JqID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHR6b25lOiBvYmpbJ3pvbmUnXSxcblx0XHRcdFx0XHR2YWx1ZTogKCFtZXRyaWMuaXNUaW1lID8gb2JqW21ldHJpYy5pZF0gOiBtb21lbnQuZHVyYXRpb24ob2JqW21ldHJpYy5pZF0pLmFzTWludXRlcygpLnRvRml4ZWQoMikpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGRhdGEgc291cmNlXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBjaGFydFxuXHRcdFx0bGV0IHZhbHVlQXhpc1RlbXBsYXRlID0gJyM6IHZhbHVlICMnO1xuXHRcdFx0bGV0IHNlcmllc0Zvcm1hdCA9ICd7MH0nO1xuXG5cdFx0XHRpZiAobWV0cmljLmlzUGVyY2VudGFnZSlcblx0XHRcdHtcblx0XHRcdFx0dmFsdWVBeGlzVGVtcGxhdGUgPSAnIzogdmFsdWUgIyUnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9JSc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChtZXRyaWMuaXNUaW1lKVxuXHRcdFx0e1xuXHRcdFx0XHR2YWx1ZUF4aXNUZW1wbGF0ZSA9ICcjOiB2YWx1ZSAjIG1pbnMnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9IG1pbnMnO1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0T3B0aW9ucyh7XG5cdFx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRcdGhlaWdodDogKGRhdGEubGVuZ3RoICogNDUgKyA1MCksIC8vKCFpc0ZpbHRlcmVkID8gNTAwIDogMTAwKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlcmllczogW3tcblx0XHRcdFx0XHRuYW1lOiBtZXRyaWMubmFtZSxcblx0XHRcdFx0XHRmaWVsZDogJ3ZhbHVlJyxcblx0XHRcdFx0XHRjYXRlZ29yeUZpZWxkOiAnem9uZScsXG5cdFx0XHRcdFx0Zm9ybWF0OiBzZXJpZXNGb3JtYXRcblx0XHRcdFx0fV0sXG5cdFx0XHRcdHZhbHVlQXhpczoge1xuXHRcdFx0XHRcdG1heDogKG1ldHJpYy5pc1BlcmNlbnRhZ2UgPyAxMDAgOiB1bmRlZmluZWQpLFxuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IHZhbHVlQXhpc1RlbXBsYXRlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2F0ZWdvcnlBeGlzOiBbe1xuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9iai5kYXRhSXRlbS56b25lICE9ICcnID8gb2JqLmRhdGFJdGVtLnpvbmUgOiAnW3Vua25vd25dJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fV0sXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gU2V0IGNoYXJ0IGRhdGEgc291cmNlXG5cdFx0XHR0aGlzLl9jaGFydC5zZXREYXRhU291cmNlKGRzKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0RGF0YVNvdXJjZShbXSk7XG5cdH1cblxuXHRvblNlcmllc0NsaWNrKGUpXG5cdHtcblx0XHRpZiAodGhpcy5fZmlsdGVyID09IG51bGwgfHwgdGhpcy5fZmlsdGVyLnZhbHVlICE9IGUuZGF0YUl0ZW0uem9uZSlcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCd6b25lJywgZS5kYXRhSXRlbS56b25lLCBmYWxzZSkgKTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2FwcGxpY2F0aW9uLWNoYXJ0LXZpZXcnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYXBwbGljYXRpb24tY2hhcnQtdmlldycsIEFwcGxpY2F0aW9uQ2hhcnRWaWV3KTtcbiIsImltcG9ydCB7QmFzZVRhYmxlVmlld30gZnJvbSAnLi4vYmFzZS10YWJsZS12aWV3JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge01ldHJpY3NNYW5hZ2VyfSBmcm9tICcuLi8uLi8uLi8uLi9tYW5hZ2Vycy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL21ldHJpY3MtbWFuYWdlcic7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuLi9maWx0ZXItZXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb25UYWJsZVZpZXcgZXh0ZW5kcyBCYXNlVGFibGVWaWV3XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEEpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRcdC8vIElmIGZpbHRlciBpcyBzZXQsIGRpc2FibGUgZ3JpZCBzZWxlY3Rpb25cblx0XHRcdFx0dGhpcy5zZXRUYWJsZVNlbGVjdGFibGUoIWlzRmlsdGVyZWQpO1xuXG5cdFx0XHRcdC8vIFNldCBmaWx0ZXJpbmdcblx0XHRcdFx0Y29uc3QgZHNGaWx0ZXIgPSBbXTtcblxuXHRcdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0XHRkc0ZpbHRlci5wdXNoKHtcblx0XHRcdFx0XHRcdGZpZWxkOiAnem9uZScsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogdGhpcy5fZmlsdGVyLnZhbHVlXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQXNzaWduIGRhdGFwcm92aWRlciB0byBncmlkXG5cdFx0XHRcdGxldCBkcyA9IG5ldyBrZW5kby5kYXRhLkRhdGFTb3VyY2Uoe1xuXHRcdFx0XHRcdGZpbHRlcjogZHNGaWx0ZXIsXG5cdFx0XHRcdFx0c29ydDoge1xuXHRcdFx0XHRcdFx0ZmllbGQ6ICd2aXNpdHMnLFxuXHRcdFx0XHRcdFx0ZGlyOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGRhdGE6IHRoaXMuX3RhYmxlRGF0YS5kYXRhXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMuX2dyaWQuc2V0RGF0YVNvdXJjZShkcyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuX2dyaWQuc2V0RGF0YVNvdXJjZShbXSk7XG5cdFx0fVxuXHR9XG5cblx0b25JdGVtQ2xpY2soKVxuXHR7XG5cdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fZ3JpZC5kYXRhSXRlbSh0aGlzLl9ncmlkLnNlbGVjdCgpKTtcblxuXHRcdGlmIChkYXRhSXRlbSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCd6b25lJywgZGF0YUl0ZW0uem9uZSwgZmFsc2UpICk7XG5cdFx0fVxuXHR9XG5cblx0Y29uZmlndXJlQ29sdW1ucygpXG5cdHtcblx0XHR0aGlzLl9ncmlkLnNldE9wdGlvbnMoe1xuXHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0ZmllbGQ6ICd6b25lJyxcblx0XHRcdFx0dGl0bGU6ICdab25lJyxcblx0XHRcdFx0d2lkdGg6IDIwMCxcblx0XHRcdFx0bG9ja2VkOiBmYWxzZSxcblx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFJdGVtLnpvbmUgPT0gJycpXG5cdFx0XHRcdFx0XHRyZXR1cm4gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLnpvbmU7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnVmlzaXRzJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVklTSVRTLFxuXHRcdFx0XHRcdHRpdGxlOiAnVG90YWwnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0VmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LHtcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVklTSVRTLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdVbmlxdWUgdmlzaXRvcnMnLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0se1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdPdmVyYWxsICUnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ05ldyB2aXNpdG9ycycsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnTmV3IHZpc2l0cyAlJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzEsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSkpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ0F2ZyB2aXNpdCBkdXJhdGlvbicsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH1dXG5cdFx0fSk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdhcHBsaWNhdGlvbi10YWJsZS12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2FwcGxpY2F0aW9uLXRhYmxlLXZpZXcnLCBBcHBsaWNhdGlvblRhYmxlVmlldyk7XG4iLCJpbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuL2FuYWx5dGljcy1iYXNlLWVsZW1lbnQnO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4vbWV0cmljLWRpc3BsYXktc3RhdGUnO1xuXG5leHBvcnQgY2xhc3MgQmFzZUNoYXJ0VmlldyBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJtYi0zXCI+XG5cdFx0XHRcdDxzZWxlY3QgaWQ9XCJtZXRyaWNzRERcIj48L3NlbGVjdD5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtY2lyY2xlLW5vdGNoIGZhLXNwaW4gdGV4dC1zZWNvbmRhcnkgYWxpZ24tbWlkZGxlIGxvYWRpbmctc3Bpbm5lciBtbC0xXCI+PC9pPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC13YXJuaW5nIG1pc3Npbmctd2FybmluZyBzaG93LXRvb2x0aXAgbWwtMVwiIHRpdGxlPVwiRGF0YSBsb2FkaW5nIGludGVycnVwdGVkXCI+PC9pPlxuXHRcdFx0PC9kaXY+XG5cblx0XHRcdDxkaXYgaWQ9XCJjaGFydFwiPjwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLyBIaWRlIGxvYWRpbmcgc3Bpbm5lciBhbmQgd2FybmluZ1xuXHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJy5taXNzaW5nLXdhcm5pbmcnKS5oaWRlKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIG1ldHJpYyBzZWxlY3RvciBkcm9wZG93blxuXHRcdHRoaXMuX21ldHJpY3NERCA9IHRoaXMuZ2V0JCgnI21ldHJpY3NERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICd0ZXh0JyxcbiAgICAgICAgICAgIGRhdGFWYWx1ZUZpZWxkOiAndmFsdWUnLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMub25NZXRyaWNDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9Ecm9wRG93bkxpc3QnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2hlYWRlcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjaGFydFxuXHRcdHRoaXMuX2NoYXJ0ID0gdGhpcy5nZXQkKCcjY2hhcnQnKS5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgICAgICAgIGxlZ2VuZDoge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcblx0XHRcdFx0Y29sb3I6ICcjMzM5OWZmJyxcblx0XHRcdFx0b3ZlcmxheToge1xuXHRcdFx0XHRcdGdyYWRpZW50OiAnbm9uZSdcblx0XHRcdFx0fSxcbiAgICAgICAgICAgIH0sXG5cdFx0XHRjYXRlZ29yeUF4aXM6IHtcblx0XHRcdFx0bWFqb3JHcmlkTGluZXM6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuICAgICAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdFx0XHRcdHRlbXBsYXRlOiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY2F0ZWdvcnlcIj5cblx0XHRcdFx0XHRcdDxzdHJvbmc+XG5cdFx0XHRcdFx0XHRcdCMgaWYgKGNhdGVnb3J5ICE9ICcnKSB7ICNcblx0XHRcdFx0XHRcdFx0IzogY2F0ZWdvcnkgI1xuXHRcdFx0XHRcdFx0XHQjIH0gZWxzZSB7ICNcblx0XHRcdFx0XHRcdFx0W3Vua25vd25dXG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cdFx0XHRcdFx0XHQ8L3N0cm9uZz5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jYXRlZ29yeVwiPlxuXHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtc3F1YXJlXCIgc3R5bGU9XCJjb2xvcjogIzogc2VyaWVzLmNvbG9yICNcIj48L2k+XG5cdFx0XHRcdFx0XHQjOiBzZXJpZXMubmFtZSAjIDogIzoga2VuZG8uZm9ybWF0KHNlcmllcy5mb3JtYXQsIHZhbHVlKSAjXG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdGApLFxuXHRcdFx0XHRiYWNrZ3JvdW5kOiAnI2U0ZTRlNCdcbiAgICAgICAgICAgIH0sXG5cdFx0XHRzZXJpZXNDbGljazogJC5wcm94eSh0aGlzLm9uU2VyaWVzQ2xpY2ssIHRoaXMpXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvQ2hhcnQnKTtcblx0fVxuXG5cdGdldCBzdGF0ZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cdH1cblxuXHRzZXQgc3RhdGUodmFsdWUpXG5cdHtcblx0XHRpZiAodmFsdWUgIT0gdGhpcy5zdGF0ZSlcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUpXG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHZhbHVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZSBjaGFuZ2Vcblx0XHRcdHRoaXMuaGFuZGxlU3RhdGVDaGFuZ2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7VGFibGVEYXRhfSB0YWJsZURhdGFcbiBcdCAqIEBwYXJhbSAge2FycmF5fSBtZXRyaWNzRFBcblx0ICovXG5cdGluaXQodGFibGVEYXRhLCBtZXRyaWNzKVxuXHR7XG5cdFx0dGhpcy5fdGFibGVEYXRhID0gdGFibGVEYXRhO1xuXHRcdHRoaXMuX21ldHJpY3NCeUlkID0ge307XG5cblx0XHQvLyBDb25maWd1cmUgbWV0cmljcyBkcm9wZG93blxuXHRcdGxldCBtZXRyaWNzRFAgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWV0cmljcy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRjb25zdCBiYXNlTWV0cmljID0gbWV0cmljc1tpXTtcblxuXHRcdFx0bWV0cmljc0RQLnB1c2goe3ZhbHVlOiBiYXNlTWV0cmljLmlkLCB0ZXh0OiBiYXNlTWV0cmljLm5hbWV9KTtcblxuXHRcdFx0Ly8gQWRkIGVudHJ5IHRvIG1ldHJpY3NCeUlkIGFycmF5XG5cdFx0XHR0aGlzLl9tZXRyaWNzQnlJZFtiYXNlTWV0cmljLmlkXSA9IGJhc2VNZXRyaWM7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IG1ldHJpY3MgZHJvcGRvd24gZGF0YXByb3ZpZGVyXG5cdFx0dGhpcy5fbWV0cmljc0RELnNldERhdGFTb3VyY2UobWV0cmljc0RQKTtcblxuXHRcdC8vIFNldCBzZWxlY3RlZCBpbmRleFxuXHRcdHRoaXMuX21ldHJpY3NERC5zZWxlY3QoMCk7XG5cblx0XHR0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuXHRcdC8vIFJlZnJlc2hcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdGdldFNlbGVjdGVkTWV0cmljKClcblx0e1xuXHRcdC8vIFJldHVybiBCYXNlTWV0cmljIG9iamVjdFxuXHRcdHJldHVybiB0aGlzLl9tZXRyaWNzQnlJZFt0aGlzLl9tZXRyaWNzREQudmFsdWUoKV07XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtTdGF0c0RhdGFGaWx0ZXJ9IGZpbHRlclxuXHQgKi9cblx0c2V0RmlsdGVyKGZpbHRlcilcblx0e1xuXHRcdHRoaXMuX2ZpbHRlciA9IGZpbHRlcjtcblxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRoYW5kbGVTdGF0ZUNoYW5nZSgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5oaWRlKCk7XG5cdFx0XHR0aGlzLmdldCQoJy5taXNzaW5nLXdhcm5pbmcnKS5oaWRlKCk7XG5cblx0XHRcdHN3aXRjaCAodGhpcy5zdGF0ZSlcblx0XHRcdHtcblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORzpcblx0XHRcdFx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5zaG93KCk7IC8vIFNob3cgbG9hZGluZyBzcGlubmVyXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuTUlTU0lORzpcblx0XHRcdFx0XHR0aGlzLmdldCQoJy5taXNzaW5nLXdhcm5pbmcnKS5zaG93KCk7IC8vIFNob3cgbG9hZGluZyBpbnRlcnJ1cHRlZCB3YXJuaW5nXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQTpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0fVxuXHR9XG5cblx0b25NZXRyaWNDaGFuZ2UoKVxuXHR7XG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHRvblNlcmllc0NsaWNrKGUpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRyZWZyZXNoT25XaW5kb3dSZXNpemUoKVxuXHR7XG5cdFx0dGhpcy5fY2hhcnQucmVkcmF3KCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBCYXNlTWFwVmlldyBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXHRcdFx0XHQjbWFwIHtcblx0XHRcdFx0XHRoZWlnaHQ6IDUwMHB4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0I21hcDpmb2N1cyB7XG5cdFx0XHRcdFx0b3V0bGluZTogbm9uZTtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PHN2ZyBzdHlsZT1cIndpZHRoOiAwOyBoZWlnaHQ6IDA7IHBvc2l0aW9uOiBhYnNvbHV0ZTtcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBmb2N1c2FibGU9XCJmYWxzZVwiPlxuXHRcdFx0XHQ8bGluZWFyR3JhZGllbnQgaWQ9XCJnYXVnZUdyYWRpZW50XCIgeDI9XCIxXCIgeTI9XCIxXCI+XG5cdFx0XHRcdFx0PHN0b3Agb2Zmc2V0PVwiMCVcIiBzdG9wLWNvbG9yPVwiI2JmZGRmZVwiIC8+XG5cdFx0XHRcdFx0PHN0b3Agb2Zmc2V0PVwiMTAwJVwiIHN0b3AtY29sb3I9XCIjMzM5OWZmXCIgLz5cblx0XHRcdFx0PC9saW5lYXJHcmFkaWVudD5cblx0XHRcdDwvc3ZnPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0PHNlbGVjdCBpZD1cIm1ldHJpY3NERFwiPjwvc2VsZWN0PlxuXHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXIgbWwtMVwiPjwvaT5cblx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC13YXJuaW5nIG1pc3Npbmctd2FybmluZyBzaG93LXRvb2x0aXAgbWwtMVwiIHRpdGxlPVwiRGF0YSBsb2FkaW5nIGludGVycnVwdGVkXCI+PC9pPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1hdXRvIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwic2NhbGVNaW5cIiBjbGFzcz1cInRleHQtbXV0ZWQgbXQtMlwiPjwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgaWQ9XCJnYXVnZVwiPjwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgaWQ9XCJzY2FsZU1heFwiIGNsYXNzPVwidGV4dC1tdXRlZCBtdC0yXCI+VEJEPC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cblx0XHRcdDxkaXYgaWQ9XCJtYXBcIiBjbGFzcz1cImJvcmRlclwiPjwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLyBIaWRlIGxvYWRpbmcgc3Bpbm5lciBhbmQgd2FybmluZ1xuXHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJy5taXNzaW5nLXdhcm5pbmcnKS5oaWRlKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIG1ldHJpYyBzZWxlY3RvciBkcm9wZG93blxuXHRcdHRoaXMuX21ldHJpY3NERCA9IHRoaXMuZ2V0JCgnI21ldHJpY3NERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICd0ZXh0JyxcbiAgICAgICAgICAgIGRhdGFWYWx1ZUZpZWxkOiAndmFsdWUnLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMub25NZXRyaWNDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9Ecm9wRG93bkxpc3QnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2hlYWRlcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBtYXBcblx0XHR0aGlzLl9tYXAgPSB0aGlzLmdldCQoJyNtYXAnKS5rZW5kb01hcCh7XG5cdFx0XHRjZW50ZXI6IFszMC43NTEyNzgsIC0yLjc0MTEzM10sXG5cdFx0XHR6b29tOiAyLFxuXHRcdFx0bGF5ZXJEZWZhdWx0czoge1xuXHRcdFx0XHRzaGFwZToge1xuXHRcdFx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdFx0XHRmaWxsOiB7XG5cdFx0XHRcdFx0XHRcdGNvbG9yOiAnI2VlZSdcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzaGFwZUNyZWF0ZWQ6ICQucHJveHkodGhpcy5vblNoYXBlQ3JlYXRlZCwgdGhpcyksXG5cdFx0XHRzaGFwZUZlYXR1cmVDcmVhdGVkOiAkLnByb3h5KHRoaXMub25TaGFwZUZlYXR1cmVDcmVhdGVkLCB0aGlzKSxcblx0XHRcdHNoYXBlTW91c2VFbnRlcjogJC5wcm94eSh0aGlzLm9uU2hhcGVNb3VzZUVudGVyLCB0aGlzKSxcblx0XHRcdHNoYXBlTW91c2VMZWF2ZTogJC5wcm94eSh0aGlzLm9uU2hhcGVNb3VzZUxlYXZlLCB0aGlzKSxcblx0XHRcdHNoYXBlQ2xpY2s6ICQucHJveHkodGhpcy5vblNoYXBlQ2xpY2ssIHRoaXMpLFxuXHRcdH0pLmRhdGEoJ2tlbmRvTWFwJyk7XG5cblx0XHQvLyBHYXVnZSBpbml0aWFsaXplZCBieSBjaGlsZCBjbGFzcywgaWYgbmVlZGVkXG5cdH1cblxuXHRnZXQgc3RhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuXHR9XG5cblx0c2V0IHN0YXRlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlICE9IHRoaXMuc3RhdGUpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlKVxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdGUnLCB2YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdGF0ZScpO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGUgY2hhbmdlXG5cdFx0XHR0aGlzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1RhYmxlRGF0YX0gdGFibGVEYXRhXG4gXHQgKiBAcGFyYW0gIHthcnJheX0gbWV0cmljc0RQXG5cdCAqL1xuXHRpbml0KHRhYmxlRGF0YSwgbWV0cmljcylcblx0e1xuXHRcdHRoaXMuX3RhYmxlRGF0YSA9IHRhYmxlRGF0YTtcblx0XHR0aGlzLl9tZXRyaWNzQnlJZCA9IHt9O1xuXG5cdFx0Ly8gQ29uZmlndXJlIG1ldHJpY3MgZHJvcGRvd25cblx0XHRsZXQgbWV0cmljc0RQID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1ldHJpY3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0Y29uc3QgYmFzZU1ldHJpYyA9IG1ldHJpY3NbaV07XG5cblx0XHRcdG1ldHJpY3NEUC5wdXNoKHt2YWx1ZTogYmFzZU1ldHJpYy5pZCwgdGV4dDogYmFzZU1ldHJpYy5uYW1lfSk7XG5cblx0XHRcdC8vIEFkZCBlbnRyeSB0byBtZXRyaWNzQnlJZCBhcnJheVxuXHRcdFx0dGhpcy5fbWV0cmljc0J5SWRbYmFzZU1ldHJpYy5pZF0gPSBiYXNlTWV0cmljO1xuXHRcdH1cblxuXHRcdC8vIFNldCBtZXRyaWNzIGRyb3Bkb3duIGRhdGFwcm92aWRlclxuXHRcdHRoaXMuX21ldHJpY3NERC5zZXREYXRhU291cmNlKG1ldHJpY3NEUCk7XG5cblx0XHQvLyBTZXQgc2VsZWN0ZWQgaW5kZXhcblx0XHR0aGlzLl9tZXRyaWNzREQuc2VsZWN0KDApO1xuXG5cdFx0dGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG5cblx0XHQvLyBSZWZyZXNoXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHRnZXRTZWxlY3RlZE1ldHJpYygpXG5cdHtcblx0XHQvLyBSZXR1cm4gQmFzZU1ldHJpYyBvYmplY3Rcblx0XHRyZXR1cm4gdGhpcy5fbWV0cmljc0J5SWRbdGhpcy5fbWV0cmljc0RELnZhbHVlKCldO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICovXG5cdHNldEZpbHRlcihmaWx0ZXIpXG5cdHtcblx0XHR0aGlzLl9maWx0ZXIgPSBmaWx0ZXI7XG5cblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0Ly8gVE8gQkUgT1ZFUlJJRERFTlxuXHR9XG5cblx0aGFuZGxlU3RhdGVDaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuaGlkZSgpO1xuXG5cdFx0XHRzd2l0Y2ggKHRoaXMuc3RhdGUpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgc3Bpbm5lclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgaW50ZXJydXB0ZWQgd2FybmluZ1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEE6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdG9uTWV0cmljQ2hhbmdlKClcblx0e1xuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0b25TZXJpZXNDbGljayhlKVxuXHR7XG5cdFx0Ly8gVE8gQkUgT1ZFUlJJRERFTlxuXHR9XG5cblx0cmVmcmVzaE9uV2luZG93UmVzaXplKClcblx0e1xuXHRcdGNvbnN0IGlzTWFwVmlzaWJsZSA9ICh0aGlzLm9mZnNldFBhcmVudCAhPSBudWxsKTtcblxuXHRcdGlmIChpc01hcFZpc2libGUpXG5cdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdG9uU2hhcGVDcmVhdGVkKGUpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRvblNoYXBlRmVhdHVyZUNyZWF0ZWQoZSlcblx0e1xuXHRcdC8vIFRPIEJFIE9WRVJSSURERU5cblx0fVxuXG5cdG9uU2hhcGVNb3VzZUVudGVyKGUpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRvblNoYXBlTW91c2VMZWF2ZShlKVxuXHR7XG5cdFx0Ly8gVE8gQkUgT1ZFUlJJRERFTlxuXHR9XG5cblx0b25TaGFwZUNsaWNrKGUpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cbn1cbiIsImltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBCYXNlVGFibGVWaWV3IGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdC5rLWdyaWQtY29udGVudCB7XG5cdFx0XHRcdFx0bWF4LWhlaWdodDogNTAwcHg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuay1ncmlkLWNvbnRlbnQgdHJbcm9sZT1yb3ddIHtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuay1mb290ZXItdGVtcGxhdGUge1xuXHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdH1cblx0XHRcdDwvc3R5bGU+XG5cblx0XHRcdDxkaXYgaWQ9XCJjb250YWluZXJcIj5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtY2lyY2xlLW5vdGNoIGZhLXNwaW4gdGV4dC1zZWNvbmRhcnkgYWxpZ24tbWlkZGxlIGxvYWRpbmctc3Bpbm5lclwiPjwvaT5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtd2FybmluZyBtaXNzaW5nLXdhcm5pbmcgc2hvdy10b29sdGlwIFwiIHRpdGxlPVwiRGF0YSBsb2FkaW5nIGludGVycnVwdGVkXCI+PC9pPlxuXHRcdFx0PC9kaXY+XG5cblx0XHRcdDxkaXYgaWQ9XCJncmlkXCI+PC9kaXY+XG5cdFx0YDtcblxuXHRcdC8vIEhpZGUgbG9hZGluZyBzcGlubmVyIGFuZCB3YXJuaW5nXG5cdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdHRoaXMuZ2V0JCgnLm1pc3Npbmctd2FybmluZycpLmhpZGUoKTtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2NvbnRhaW5lcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBkYXRhIGdyaWQgKEVYQ0VQVCBDT0xVTU5TLCBBUyBXRSBORUVEIE1FVFJJQ1MgVE8gQkUgQUNDRVNTSUJMRSlcblx0XHR0aGlzLl9ncmlkID0gdGhpcy5nZXQkKCcjZ3JpZCcpLmtlbmRvR3JpZCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG5cdFx0XHRzZWxlY3RhYmxlOiBmYWxzZSxcblx0XHRcdG5vUmVjb3Jkczoge1xuXHRcdFx0XHR0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJwLTJcIj5ObyBkYXRhLjwvZGl2Pidcblx0XHRcdH0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5vbkl0ZW1DbGljaywgdGhpcylcbiAgICAgICAgfSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cdH1cblxuXHRnZXQgc3RhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuXHR9XG5cblx0c2V0IHN0YXRlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlICE9IHRoaXMuc3RhdGUpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlKVxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdGUnLCB2YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdGF0ZScpO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGUgY2hhbmdlXG5cdFx0XHR0aGlzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1RhYmxlRGF0YX0gdGFibGVEYXRhXG4gXHQgKiBAcGFyYW0gIHtNZXRyaWNDb250YWluZXJ9IG1ldHJpY0NvbnRhaW5lclxuXHQgKi9cblx0aW5pdCh0YWJsZURhdGEsIG1ldHJpY0NvbnRhaW5lcilcblx0e1xuXHRcdHRoaXMuX3RhYmxlRGF0YSA9IHRhYmxlRGF0YTtcblx0XHR0aGlzLl9tZXRyaWNDb250YWluZXIgPSBtZXRyaWNDb250YWluZXI7XG5cblx0XHQvLyBDb25maWd1cmUgY29sdW1uc1xuXHRcdHRoaXMuY29uZmlndXJlQ29sdW1ucygpO1xuXG5cdFx0dGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG5cblx0XHQvLyBSZWZyZXNoXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtTdGF0c0RhdGFGaWx0ZXJ9IGZpbHRlclxuXHQgKi9cblx0c2V0RmlsdGVyKGZpbHRlcilcblx0e1xuXHRcdHRoaXMuX2ZpbHRlciA9IGZpbHRlcjtcblxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRvbkl0ZW1DbGljaygpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRjb25maWd1cmVDb2x1bW5zKClcblx0e1xuXHRcdC8vIFRPIEJFIE9WRVJSSURERU5cblx0fVxuXG5cdGhhbmRsZVN0YXRlQ2hhbmdlKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnLm1pc3Npbmctd2FybmluZycpLmhpZGUoKTtcblxuXHRcdFx0c3dpdGNoICh0aGlzLnN0YXRlKVxuXHRcdFx0e1xuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HOlxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLnNob3coKTsgLy8gU2hvdyBsb2FkaW5nIHNwaW5uZXJcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5NSVNTSU5HOlxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnLm1pc3Npbmctd2FybmluZycpLnNob3coKTsgLy8gU2hvdyBsb2FkaW5nIGludGVycnVwdGVkIHdhcm5pbmdcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBOlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0XHR9XG5cdH1cblxuXHRzZXRUYWJsZVNlbGVjdGFibGUoc2VsZWN0YWJsZSlcblx0e1xuXHRcdGxldCBzZWwgPSBzZWxlY3RhYmxlID8gJ3JvdycgOiBmYWxzZTtcblx0XHR0aGlzLl9ncmlkLnNldE9wdGlvbnMoe1xuXHRcdFx0c2VsZWN0YWJsZTogc2VsXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7TWV0cmljfSBtZXRyaWNcblx0ICovXG5cdGdldFZhbHVlQ29sVGVtcGxhdGUobWV0cmljKVxuXHR7XG5cdFx0cmV0dXJuICQucHJveHkoZnVuY3Rpb24gKGRhdGFJdGVtKSB7XG5cdFx0XHRjb25zdCBtZXRyaWNJZCA9IHRoaXMubWV0cmljLmJhc2VNZXRyaWMuaWQ7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGRhdGFJdGVtW21ldHJpY0lkXTtcblxuXHRcdFx0aWYgKCFpc05hTih2YWx1ZSkpXG5cdFx0XHRcdHJldHVybiB0aGlzLm1ldHJpYy5iYXNlTWV0cmljLmdldFZhbHVlQXNTdHJpbmcodmFsdWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gJyc7IC8vcmV0dXJuICdbZXhwYW5kXSc7XG5cdFx0fSwgeyBtZXRyaWM6IG1ldHJpYyB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtNZXRyaWN9IG1ldHJpY1xuXHQgKi9cblx0Z2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKG1ldHJpYylcblx0e1xuXHRcdHJldHVybiAkLnByb3h5KGZ1bmN0aW9uIChkYXRhSXRlbSkge1xuXHRcdFx0Y29uc3QgbWV0cmljSWQgPSB0aGlzLm1ldHJpYy5iYXNlTWV0cmljLmlkO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBkYXRhSXRlbVttZXRyaWNJZF07XG5cblx0XHRcdGlmICghaXNOYU4odmFsdWUpKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBvdmVyYWxsID0gdGhpcy5tZXRyaWMuZ2V0VmFsdWUoKTtcblx0XHRcdFx0Y29uc3QgcGVyYyA9IChvdmVyYWxsID4gMCA/IHZhbHVlIC8gb3ZlcmFsbCAqIDEwMCA6IC0xKTtcblx0XHRcdFx0cmV0dXJuIChwZXJjID4gLTEgPyBwZXJjLnRvRml4ZWQoMikgKyBcIiVcIiA6IFwiLS1cIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiAnJzsgLy9yZXR1cm4gJ1tleHBhbmRdJztcblx0XHR9LCB7IG1ldHJpYzogbWV0cmljIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge01ldHJpY30gbWV0cmljXG5cdCAqL1xuXHRnZXRBZ2dyU3VtVmFsdWVDb2xUZW1wbGF0ZShtZXRyaWMpXG5cdHtcblx0XHRyZXR1cm4gJC5wcm94eShmdW5jdGlvbiAoZGF0YUl0ZW0pIHtcblx0XHRcdGNvbnN0IG1ldHJpY0lkID0gdGhpcy5tZXRyaWMuYmFzZU1ldHJpYy5pZDtcblx0XHRcdGNvbnN0IHZhbHVlID0gZGF0YUl0ZW1bbWV0cmljSWRdLnN1bTtcblx0XHRcdHJldHVybiB0aGlzLm1ldHJpYy5iYXNlTWV0cmljLmdldFZhbHVlQXNTdHJpbmcodmFsdWUpO1xuXHRcdH0sIHsgbWV0cmljOiBtZXRyaWMgfSk7XG5cdH1cblxuXHRnZXRBZ2dyU3VtUGVyY2VudGFnZUNvbFRlbXBsYXRlMShtZXRyaWMpXG5cdHtcblx0XHRyZXR1cm4gJC5wcm94eShmdW5jdGlvbiAoZGF0YUl0ZW0pIHtcblx0XHRcdGNvbnN0IG1ldHJpY0lkID0gdGhpcy5tZXRyaWMuYmFzZU1ldHJpYy5pZDtcblx0XHRcdGNvbnN0IHZhbHVlID0gZGF0YUl0ZW1bbWV0cmljSWRdLnN1bTtcblx0XHRcdGNvbnN0IG92ZXJhbGwgPSB0aGlzLm1ldHJpYy5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgcGVyYyA9IChvdmVyYWxsID4gMCA/IHZhbHVlIC8gb3ZlcmFsbCAqIDEwMCA6IC0xKTtcblx0XHRcdHJldHVybiAocGVyYyA+IC0xID8gcGVyYy50b0ZpeGVkKDIpICsgXCIlXCIgOiBcIi0tXCIpO1xuXHRcdH0sIHsgbWV0cmljOiBtZXRyaWMgfSk7XG5cdH1cblxuXHRyZWZyZXNoT25XaW5kb3dSZXNpemUoKVxuXHR7XG5cdFx0dGhpcy5fZ3JpZC5yZWZyZXNoKCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZUNoYXJ0Vmlld30gZnJvbSAnLi4vYmFzZS1jaGFydC12aWV3JztcbmltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4uL2FuYWx5dGljcy1iYXNlLWVsZW1lbnQnO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4uL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7RmlsdGVyU2V0RXZlbnR9IGZyb20gJy4uL2ZpbHRlci1ldmVudCc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGNsYXNzIERlbW9ncmFwaGljc0NoYXJ0VmlldyBleHRlbmRzIEJhc2VDaGFydFZpZXdcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSlcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KHRoaXMuX3RhYmxlRGF0YS5kYXRhKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdF9kcmF3Q2hhcnQoY2hhcnREYXRhKVxuXHR7XG5cdFx0Y29uc3QgbWV0cmljID0gdGhpcy5nZXRTZWxlY3RlZE1ldHJpYygpO1xuXG5cdFx0aWYgKGNoYXJ0RGF0YSAhPSBudWxsICYmIGNoYXJ0RGF0YS5sZW5ndGggPiAwICYmIG1ldHJpYyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0Y2hhcnREYXRhID0gY2hhcnREYXRhLmZpbHRlcihvYmogPT4gb2JqLmNvdW50cnlDb2RlID09IHRoaXMuX2ZpbHRlci52YWx1ZSk7XG5cblx0XHRcdC8vIFNvcnQgYW5kIGV4dHJhY3QgdG9wIDEwIHZhbHVlc1xuXHRcdFx0bGV0IGRhdGEgPSBjaGFydERhdGEuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBiW21ldHJpYy5pZF0gLSBhW21ldHJpYy5pZF0gfSkuc2xpY2UoMCwgMTApO1xuXG5cdFx0XHQvLyBJU1NVRSEhISEhISFcblx0XHRcdC8vIElmIHRoZSBtZXRyaWMgaWQgc3RhcnRzIHdpdGggXCIlXCIsIEtlbmRvIGNoYXJ0IGNyYXNoZXNcblx0XHRcdC8vIEZvciB0aGlzIHJlYXNvbiBpbnN0ZWFkIG9mIHNpbXBseSBzZXR0aW5nIHRoZSBzZXJpZXMgZmllbGQgYW5kIGNhdGVnb3J5IGZpZWxkLCB3ZSBuZWVkIHRvIHJlYnVpbGQgdGhlIHNlcmllcyBkYXRhIGl0ZW1zIGZyb20gdGhlIGNoYXJ0IGRhdGFcblx0XHRcdC8vIChub3RlOiBmb3IgdGltZSBtZXRyaWNzLCB2YWx1ZSBpcyBjb252ZXJ0ZWQgZnJvbSBtaWxsaXMgdG8gbWludXRlcylcblxuXHRcdFx0ZGF0YSA9IGRhdGEubWFwKG9iaiA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Y291bnRyeTogb2JqWydjb3VudHJ5TmFtZSddLFxuXHRcdFx0XHRcdGNvZGU6IG9ialsnY291bnRyeUNvZGUnXSxcblx0XHRcdFx0XHR2YWx1ZTogKCFtZXRyaWMuaXNUaW1lID8gb2JqW21ldHJpYy5pZF0gOiBtb21lbnQuZHVyYXRpb24ob2JqW21ldHJpYy5pZF0pLmFzTWludXRlcygpLnRvRml4ZWQoMikpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGRhdGEgc291cmNlXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBjaGFydFxuXHRcdFx0bGV0IHZhbHVlQXhpc1RlbXBsYXRlID0gJyM6IHZhbHVlICMnO1xuXHRcdFx0bGV0IHNlcmllc0Zvcm1hdCA9ICd7MH0nO1xuXG5cdFx0XHRpZiAobWV0cmljLmlzUGVyY2VudGFnZSlcblx0XHRcdHtcblx0XHRcdFx0dmFsdWVBeGlzVGVtcGxhdGUgPSAnIzogdmFsdWUgIyUnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9JSc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChtZXRyaWMuaXNUaW1lKVxuXHRcdFx0e1xuXHRcdFx0XHR2YWx1ZUF4aXNUZW1wbGF0ZSA9ICcjOiB2YWx1ZSAjIG1pbnMnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9IG1pbnMnO1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0T3B0aW9ucyh7XG5cdFx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRcdGhlaWdodDogKGRhdGEubGVuZ3RoICogNDUgKyA1MCksIC8vKCFpc0ZpbHRlcmVkID8gNTAwIDogMTAwKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlcmllczogW3tcblx0XHRcdFx0XHRuYW1lOiBtZXRyaWMubmFtZSxcblx0XHRcdFx0XHRmaWVsZDogJ3ZhbHVlJyxcblx0XHRcdFx0XHRjYXRlZ29yeUZpZWxkOiAnY291bnRyeScsXG5cdFx0XHRcdFx0Zm9ybWF0OiBzZXJpZXNGb3JtYXRcblx0XHRcdFx0fV0sXG5cdFx0XHRcdHZhbHVlQXhpczoge1xuXHRcdFx0XHRcdG1heDogKG1ldHJpYy5pc1BlcmNlbnRhZ2UgPyAxMDAgOiB1bmRlZmluZWQpLFxuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IHZhbHVlQXhpc1RlbXBsYXRlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2F0ZWdvcnlBeGlzOiBbe1xuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9iai5kYXRhSXRlbS5jb3VudHJ5ICE9ICcnID8gb2JqLmRhdGFJdGVtLmNvdW50cnkgOiAnW3Vua25vd25dJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fV0sXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gU2V0IGNoYXJ0IGRhdGEgc291cmNlXG5cdFx0XHR0aGlzLl9jaGFydC5zZXREYXRhU291cmNlKGRzKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0RGF0YVNvdXJjZShbXSk7XG5cdH1cblxuXHRvblNlcmllc0NsaWNrKGUpXG5cdHtcblx0XHRpZiAodGhpcy5fZmlsdGVyID09IG51bGwgfHwgdGhpcy5fZmlsdGVyLnZhbHVlICE9IGUuZGF0YUl0ZW0uY29kZSlcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCdjb3VudHJ5JywgZS5kYXRhSXRlbS5jb2RlLCBmYWxzZSwgZS5kYXRhSXRlbS5jb3VudHJ5KSApO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnZGVtb2dyYXBoaWNzLWNoYXJ0LXZpZXcnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZGVtb2dyYXBoaWNzLWNoYXJ0LXZpZXcnLCBEZW1vZ3JhcGhpY3NDaGFydFZpZXcpO1xuIiwiaW1wb3J0IHtCYXNlTWFwVmlld30gZnJvbSAnLi4vYmFzZS1tYXAtdmlldyc7XG5pbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuLi9maWx0ZXItZXZlbnQnO1xuaW1wb3J0ICogYXMgY2hyb21hIGZyb20gJ2Nocm9tYS1qcyc7XG5cbmV4cG9ydCBjbGFzcyBEZW1vZ3JhcGhpY3NNYXBWaWV3IGV4dGVuZHMgQmFzZU1hcFZpZXdcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5TSEFQRV9TVFJPS0VfQ09MT1IgPSAnI2FhYSc7XG5cdFx0dGhpcy5TSEFQRV9TVFJPS0VfV0lEVEggPSAwLjU7XG5cblx0XHQvLyBMb2FkIEdlb0pTT04gZmlsZSBjb250YWluaW5nIGNvdW50cmllcyBnZW9tZXRyeVxuXHRcdHRoaXMuX2xvYWRKU09OKCdhc3NldHMvZGF0YS9jb3VudHJpZXMuZ2VvLmpzb24nLCAkLnByb3h5KHRoaXMuX29uQ291bnRyaWVzRGF0YUxvYWRlZCwgdGhpcykpO1xuXG5cdFx0Lypcblx0XHROT1RFOiBIT1cgVE8gR0VORVJBVEUgVEhFIEdFT0pTT04gRklMRVxuXHRcdDEpIEdvIHRvIE5hdHVyYWwgRWFydGggd2Vic2l0ZSAoaHR0cHM6Ly93d3cubmF0dXJhbGVhcnRoZGF0YS5jb20vZG93bmxvYWRzLykgYW5kIGRvd25sb2FkIG1hcCBkYXRhXG5cdFx0ICAgKGN1bHR1cmFsLCBzbWFsbCBzY2FsZSBkYXRhIGlzIGVub3VnaCBmb3Igb3VyIHB1cnBvc2UpXG5cdFx0MikgR28gdG8gdGhpcyBNYXBTaGFwZXIgd2Vic2l0ZSAoaHR0cHM6Ly9tYXBzaGFwZXIub3JnLykgYW5kIGltcG9ydCAuZGJmLCAucHJqIGFuZCAuc2hwIGZpbGVzIGRvd25sb2FkZWQgYmVmb3JlXG5cdFx0MykgT3B0aW9uYWw6IHNlbGVjdCBhbmQgZGVsZXRlIEFuY3RhcnRpY2Fcblx0XHQ0KSBPcGVuIE1hcFNoYXBlciBjb25zb2xlIGFuZCBydW4gZmlsdGVyIGNvbW1hbmQ6XG5cdFx0ICAgbWFwc2hhcGVyIC1maWx0ZXItZmllbGRzIGZpZWxkcz1JU09fQTIsTkFNRVxuXHRcdCAgIChhY3R1YWxseSBOQU1FIGlzIG5vdCByZWFsbHkgbmVlZGVkKVxuXHRcdDUpIE9wZW4gTWFwU2hhcGVyIGV4cG9ydGVyIGFuZCBleHBvcnQgdG8gR2VvSlNPTiBmb3JtYXRcblx0XHQ2KSBjb3B5IGZpbGUgdG8gZGlzdC9hc3NldHMvZGF0YSBmb2xkZXIgYW5kIHJlbmFtZSBpdCB0byBjb3VudHJpZXMuZ2VvLmpzb25cblx0XHQqL1xuXG5cdFx0Ly8gSW5saXRpYWxpemUgZ2F1Z2Vcblx0XHR0aGlzLl9nYXVnZSA9IHRoaXMuZ2V0JCgnI2dhdWdlJykua2VuZG9MaW5lYXJHYXVnZSh7XG5cdFx0XHRwb2ludGVyOiB7XG5cdFx0XHRcdG9wYWNpdHk6IDAsXG5cdCAgICAgICAgICAgIHZhbHVlOiAwLFxuXHQgICAgICAgICAgICBzaGFwZTogJ2Fycm93Jyxcblx0ICAgICAgICAgIFx0c2l6ZTogMTAsXG5cdFx0XHRcdGNvbG9yOiAnIzIxMjUyOSdcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNjYWxlOiB7XG5cdFx0XHRcdHZlcnRpY2FsOiBmYWxzZSxcblx0ICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHRcdG1pbjogMCxcblx0ICAgICAgICAgICAgcmFuZ2VzOiBbe1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3VybCgjZ2F1Z2VHcmFkaWVudCknXG5cdCAgICAgICAgICAgIH1dLFxuXHRcdFx0XHRyYW5nZVNpemU6IDEwLFxuXHQgICAgICAgICAgXHRtYWpvclRpY2tzOiB7XG5cdCAgICAgICAgICAgIFx0dmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICBcdG1pbm9yVGlja3M6IHtcblx0ICAgICAgICAgICAgXHR2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgXHRsYWJlbHM6IHtcblx0ICAgICAgICAgICAgXHR2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgXHRsaW5lOiB7XG5cdCAgICAgICAgICAgIFx0dmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pLmRhdGEoJ2tlbmRvTGluZWFyR2F1Z2UnKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBKVxuXHRcdFx0XHRcdHRoaXMuX2RyYXdNYXAodGhpcy5fdGFibGVEYXRhLmRhdGEpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5fZHJhd01hcChudWxsKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZHJhd01hcChtYXBEYXRhKVxuXHR7XG5cdFx0Ly8gV0UgTkVFRCBUTyBDS0VDSyBWSVNJQklMSVRZIEFTIEEgV09SS0FST1VORCwgQkVDQVVTRSBXSEVOIEhJRERFTiBUSEUgTUFQIExBWUVSUyBDQU4nVCBDUkVBVEVEXG5cdFx0Y29uc3QgaXNNYXBWaXNpYmxlID0gKHRoaXMub2Zmc2V0UGFyZW50ICE9IG51bGwpO1xuXG5cdFx0aWYgKGlzTWFwVmlzaWJsZSAmJiBtYXBEYXRhICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Y29uc3QgaXNGaWx0ZXJlZCA9ICh0aGlzLl9maWx0ZXIgIT0gbnVsbCAmJiB0aGlzLl9maWx0ZXIudmFsdWUgIT0gbnVsbCk7XG5cblx0XHRcdGlmIChpc0ZpbHRlcmVkKVxuXHRcdFx0XHRtYXBEYXRhID0gbWFwRGF0YS5maWx0ZXIob2JqID0+IG9iai5jb3VudHJ5Q29kZSA9PSB0aGlzLl9maWx0ZXIudmFsdWUpO1xuXG5cdFx0XHQvLyBNYXAgdGFibGUgZGF0YSBieSBjb3VudHJ5IGlkXG5cdFx0XHRsZXQgbWV0cmljc0J5Q291bnRyeSA9IG1hcERhdGEucmVkdWNlKChvYmosIGl0ZW0pID0+IHtcblx0XHRcdFx0b2JqW2l0ZW0uY291bnRyeUNvZGVdID0gaXRlbVxuXHRcdFx0XHRyZXR1cm4gb2JqXG5cdFx0XHR9LCB7fSk7XG5cblx0XHRcdGxldCBtZXRyaWMgPSB0aGlzLmdldFNlbGVjdGVkTWV0cmljKCk7XG5cdFx0XHRsZXQgZG9tYWluTWluID0gMDtcblx0XHRcdGxldCBkb21haW5NYXggPSAxO1xuXG5cdFx0XHQvLyBNZXJnZSBtZXRyaWNzIGludG8gY291bnRyaWVzIGRhdGFcblx0XHRcdGZvciAobGV0IGNvdW50cnkgb2YgdGhpcy5fY291bnRyaWVzRGF0YS5mZWF0dXJlcylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNvdW50cnlDb2RlID0gY291bnRyeS5wcm9wZXJ0aWVzLklTT19BMjtcblx0XHRcdFx0bGV0IG1ldHJpY3NEYXRhID0gbWV0cmljc0J5Q291bnRyeVtjb3VudHJ5Q29kZV07XG5cdFx0XHRcdGxldCBkYXRhID0gbnVsbDtcblxuXHRcdFx0XHRpZiAobWV0cmljc0RhdGEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgdmFsID0gbWV0cmljc0RhdGFbbWV0cmljLmlkXTtcblx0XHRcdFx0XHRsZXQgdmFsU3RyaW5nID0gbWV0cmljLmdldFZhbHVlQXNTdHJpbmcodmFsKTtcblxuXHRcdFx0XHRcdGlmICh2YWwgPiBkb21haW5NYXgpXG5cdFx0XHRcdFx0XHRkb21haW5NYXggPSB2YWw7XG5cblx0XHRcdFx0XHRkYXRhID0ge1xuXHRcdFx0XHRcdFx0Y29kZTogY291bnRyeUNvZGUsXG5cdFx0XHRcdFx0XHRjb3VudHJ5OiBtZXRyaWNzRGF0YS5jb3VudHJ5TmFtZSxcblx0XHRcdFx0XHRcdG1ldHJpY0xhYmVsOiBtZXRyaWMubmFtZSxcblx0XHRcdFx0XHRcdG1ldHJpY1N0cmluZzogdmFsU3RyaW5nLFxuXHRcdFx0XHRcdFx0bWV0cmljVmFsdWU6IHZhbFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb3VudHJ5LmRhdGEgPSBkYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgY29sb3Igc2NhbGVcblx0XHRcdC8vIERvbWFpbiBpcyBzZXQgYmFzZWQgb24gdGhlIHRvcCB2YWx1ZVxuXHRcdFx0dGhpcy5fY29sb3JTY2FsZSA9IGNocm9tYS5zY2FsZShbJyNiZmRkZmUnLCAnIzMzOTlmZiddKS5kb21haW4oW2RvbWFpbk1pbiwgZG9tYWluTWF4XSk7XG5cblx0XHRcdC8vIFNob3cgZG9tYWluXG5cdFx0XHR0aGlzLmdldCQoJyNzY2FsZU1pbicpLnRleHQoZG9tYWluTWluKTtcblx0XHRcdHRoaXMuZ2V0JCgnI3NjYWxlTWF4JykudGV4dChkb21haW5NYXgpO1xuXG5cdFx0XHQvLyBTZWcgZ2F1Z2Ugc2NhbGUgbWF4XG5cdFx0XHR0aGlzLl9nYXVnZS5vcHRpb25zLnNjYWxlLm1pbiA9IGRvbWFpbk1pbjtcblx0XHRcdHRoaXMuX2dhdWdlLm9wdGlvbnMuc2NhbGUubWF4ID0gZG9tYWluTWF4O1xuXHRcdFx0dGhpcy5fZ2F1Z2Uub3B0aW9ucy5zY2FsZS5yYW5nZXNbMF0uZnJvbSA9IGRvbWFpbk1pbjtcblx0XHRcdHRoaXMuX2dhdWdlLm9wdGlvbnMuc2NhbGUucmFuZ2VzWzBdLnRvID0gZG9tYWluTWF4O1xuXHRcdFx0dGhpcy5fZ2F1Z2UucmVkcmF3KCk7XG5cblx0XHRcdC8vIERyYXcgbWFwIGxheWVyXG5cdFx0XHQvLyBJTVBPUlRBTlQgTk9URTogdGhpcyByZXF1aXJlcyBtYXAgdG8gYmUgZGVzdHJveWVkIGFuZCByZWNyZWF0ZWQsXG5cdFx0XHQvLyBhcyB0aGUgd2lkZ2V0IGRvZXNuJ3Qgc3VwcG9ydCBkeW5hbWljIGxheWVyIGNyZWF0aW9uXG5cblx0XHRcdGxldCBvcHRpb25zID0gdGhpcy5fbWFwLm9wdGlvbnM7XG4gICAgICAgICAgICBvcHRpb25zLmxheWVycyA9IFt7XG5cdFx0XHRcdHR5cGU6ICdzaGFwZScsXG5cdFx0XHRcdGRhdGFTb3VyY2U6IHtcblx0XHRcdFx0XHR0eXBlOiAnZ2VvanNvbicsXG5cdFx0XHRcdFx0ZGF0YTogdGhpcy5fY291bnRyaWVzRGF0YS5mZWF0dXJlc1xuXHRcdFx0XHR9XG5cdFx0XHR9XTtcblxuICAgICAgICAgICAgdGhpcy5fbWFwLmRlc3Ryb3koKTtcblxuICAgICAgICAgICAgdGhpcy5fbWFwID0gdGhpcy5nZXQkKCcjbWFwJykuZW1wdHkoKS5rZW5kb01hcChvcHRpb25zKS5kYXRhKCdrZW5kb01hcCcpO1xuXHRcdH1cblx0fVxuXG5cdG9uU2hhcGVDcmVhdGVkKGUpXG5cdHtcblx0XHRjb25zdCBzaGFwZSA9IGUuc2hhcGU7XG5cdFx0Y29uc3QgbWV0cmljVmFsdWUgPSBzaGFwZS5kYXRhSXRlbS5kYXRhID8gc2hhcGUuZGF0YUl0ZW0uZGF0YS5tZXRyaWNWYWx1ZSA6IG51bGw7XG5cblx0XHRpZiAobWV0cmljVmFsdWUpIHtcblx0XHRcdHZhciBjb2xvciA9IHRoaXMuX2NvbG9yU2NhbGUobWV0cmljVmFsdWUpLmhleCgpO1xuXHRcdFx0c2hhcGUub3B0aW9ucy5maWxsLnNldCgnY29sb3InLCBjb2xvcik7XG5cdFx0fVxuXHR9XG5cblx0b25TaGFwZUZlYXR1cmVDcmVhdGVkKGUpXG5cdHtcblx0XHRpZiAoZS5kYXRhSXRlbS5kYXRhKVxuXHRcdHtcblx0XHRcdGUuZ3JvdXAub3B0aW9ucy50b29sdGlwID0ge1xuXHRcdFx0XHRwb3NpdGlvbjogJ2N1cnNvcicsXG5cdFx0XHRcdG9mZnNldDogMTAsXG5cdFx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0XHRsZXQgZGF0YSA9IGUudGFyZ2V0LmRhdGFJdGVtLmRhdGE7XG5cdFx0XHRcdFx0cmV0dXJuIGBcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYXAtdG9vbHRpcFwiPlxuXHRcdFx0XHRcdFx0XHQ8c3Ryb25nPiR7ZGF0YS5jb3VudHJ5fTwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0XHQ8YnI+XG5cdFx0XHRcdFx0XHRcdDxzcGFuPiR7ZGF0YS5tZXRyaWNMYWJlbH08L3NwYW4+IDogPHNwYW4+JHtkYXRhLm1ldHJpY1N0cmluZ308L3NwYW4+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxzY3JpcHQ+XG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgYSB3b3JrYXJvdW5kIHRvIHN0eWxlIHRoZSB0b29sdGlwIHByb3Blcmx5OyBtYXAudG9vbHRpcCBjbGFzcyBpbiBkZWZpbmVkIGluIGdsb2JhbCBzdHlsZS5jc3Ncblx0XHRcdFx0XHRcdFx0JCgnLm1hcC10b29sdGlwJykuY2xvc2VzdCgnLmstdG9vbHRpcCcpLmNzcygncGFkZGluZycsICcwJyk7XG5cdFx0XHRcdFx0XHQ8L3NjcmlwdD5cblx0XHRcdFx0XHRgO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdG9uU2hhcGVNb3VzZUVudGVyKGUpXG5cdHtcblx0XHRpZiAoZS5zaGFwZS5kYXRhSXRlbS5kYXRhKVxuXHRcdHtcblx0XHRcdC8vIFNldCBzaGFwZSBzdHJva2Vcblx0XHRcdGUuc2hhcGUub3B0aW9ucy5zZXQoJ3N0cm9rZS5jb2xvcicsICcjZmY5OTAwJyk7XG5cdFx0XHRlLnNoYXBlLm9wdGlvbnMuc2V0KCdzdHJva2Uud2lkdGgnLCAyKTtcblxuXHRcdFx0Ly8gU2hvdyBnYXVnZSBwb2ludGVyXG5cdFx0XHR0aGlzLl9nYXVnZS5vcHRpb25zLnBvaW50ZXIub3BhY2l0eSA9IDE7XG5cdFx0XHR0aGlzLl9nYXVnZS5vcHRpb25zLnBvaW50ZXIudmFsdWUgPSBlLnNoYXBlLmRhdGFJdGVtLmRhdGEubWV0cmljVmFsdWU7XG5cdFx0XHR0aGlzLl9nYXVnZS5yZWRyYXcoKTtcblx0XHR9XG5cdH1cblxuXHRvblNoYXBlTW91c2VMZWF2ZShlKVxuXHR7XG5cdFx0Ly8gUmVzZWV0IHNoYXBlIHN0cm9rZVxuXHRcdGUuc2hhcGUub3B0aW9ucy5zZXQoJ3N0cm9rZS5jb2xvcicsIHRoaXMuU0hBUEVfU1RST0tFX0NPTE9SKTtcblx0XHRlLnNoYXBlLm9wdGlvbnMuc2V0KCdzdHJva2Uud2lkdGgnLCB0aGlzLlNIQVBFX1NUUk9LRV9XSURUSCk7XG5cblx0XHQvLyBIaWRlIGdhdWdlIHBvaW50ZXJcblx0XHR0aGlzLl9nYXVnZS5vcHRpb25zLnBvaW50ZXIub3BhY2l0eSA9IDA7XG5cdFx0dGhpcy5fZ2F1Z2UucmVkcmF3KCk7XG5cdH1cblxuXHRvblNoYXBlQ2xpY2soZSlcblx0e1xuXHRcdGxldCBkYXRhID0gZS5zaGFwZS5kYXRhSXRlbS5kYXRhO1xuXG4gICAgICAgIGlmIChkYXRhKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLl9maWx0ZXIgPT0gbnVsbCB8fCB0aGlzLl9maWx0ZXIudmFsdWUgIT0gZGF0YS5jb2RlKVxuXHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIG5ldyBGaWx0ZXJTZXRFdmVudCgnY291bnRyeScsIGRhdGEuY29kZSwgZmFsc2UsIGRhdGEuY291bnRyeSkgKTtcblx0XHR9XG4gICAgfVxuXG5cdF9sb2FkSlNPTihwYXRoLCBjYWxsYmFja0ZuKVxuXHR7XG5cdFx0bGV0IHhvYmogPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHR4b2JqLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKTtcblx0XHR4b2JqLm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpO1xuXHRcdHhvYmoub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHhvYmoucmVhZHlTdGF0ZSA9PSA0ICYmIHhvYmouc3RhdHVzID09IFwiMjAwXCIpIHtcblx0XHRcdFx0Ly8gUmVxdWlyZWQgdXNlIG9mIGFuIGFub255bW91cyBjYWxsYmFjayBhcyAub3BlbiB3aWxsIE5PVCByZXR1cm4gYSB2YWx1ZSBidXQgc2ltcGx5IHJldHVybnMgdW5kZWZpbmVkIGluIGFzeW5jaHJvbm91cyBtb2RlXG5cdFx0XHRcdGNhbGxiYWNrRm4oeG9iai5yZXNwb25zZVRleHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0eG9iai5zZW5kKG51bGwpO1xuXHR9XG5cblx0X29uQ291bnRyaWVzRGF0YUxvYWRlZChqc29uU3RyaW5nKVxuXHR7XG5cdFx0Ly8gUGFyc2UgSlNPTiBzdHJpbmcgaW50byBvYmplY3Rcblx0XHR0aGlzLl9jb3VudHJpZXNEYXRhID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2RlbW9ncmFwaGljcy1tYXAtdmlldycpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkZW1vZ3JhcGhpY3MtbWFwLXZpZXcnLCBEZW1vZ3JhcGhpY3NNYXBWaWV3KTtcbiIsImltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4uL2FuYWx5dGljcy1iYXNlLWVsZW1lbnQnO1xuXG5leHBvcnQgY2xhc3MgRGVtb2dyYXBoaWNzUHJvQWR2IGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdC5jYXJkIHtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IDE4cmVtO1xuXHRcdFx0XHR9XG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2PlxuXHRcdFx0XHQ8aDUgY2xhc3M9XCJ0ZXh0LWNlbnRlciBteS0zXCI+VXBncmFkZSB0byA8c3Ryb25nPkFuYWx5dGljcyBQcm88L3N0cm9uZz4gdG8gZW5hYmxlIGRlbW9ncmFwaGljIHZpZXcgb24gdGhlIG1ldHJpY3MqIGFuZCBnZXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8L2g1PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC1sZy00XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0XHQ8aW1nIGNsYXNzPVwiY2FyZC1pbWctdG9wXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmFseXRpY3MtYWR2L2RlbW9ncmFwaGljc1RhYmxlLnBuZ1wiIGFsdD1cIlRhYnVsYXIgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+VmlldyBtZXRyaWNzIGluIHRhYnVsYXIgZm9ybSwgc3BsaXQgYnkgY291bnRyeTsgZmlsdGVyIGRhdGEgYnkgY291bnRyeSBpbiBvbmUgY2xpY2suPC9wPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLWxpZ2h0IG15LTMgbXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJjYXJkLWltZy10b3BcIiBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuYWx5dGljcy1hZHYvZGVtb2dyYXBoaWNzQ2hhcnQucG5nXCIgYWx0PVwiVG9wIGNvdW50cmllc1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+VmlldyB0b3AgY291bnRyaWVzIGNoYXJ0IGZvciBlYWNoIG1ldHJpYzsgZmlsdGVyIGRhdGEgYnkgY291bnRyeSBpbiBvbmUgY2xpY2suPC9wPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLWxpZ2h0IG15LTMgbXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJjYXJkLWltZy10b3BcIiBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuYWx5dGljcy1hZHYvZGVtb2dyYXBoaWNzTWFwLnBuZ1wiIGFsdD1cIldvcmxkIG1hcFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+VmlldyBtYXAgd2l0aCBjb3VudHJ5IHJhbmtpbmcgYmFzZWQgb24gdGhlIHNlbGVjdGVkIG1ldHJpYzsgZmlsdGVyIGRhdGEgYnkgY291bnRyeSBpbiBvbmUgY2xpY2suPC9wPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLWxpZ2h0IG15LTMgbXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJjYXJkLWltZy10b3BcIiBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuYWx5dGljcy1hZHYvZGVtb2dyYXBoaWNzRmlsdGVyLnBuZ1wiIGFsdD1cIkZpbHRlciBieSBjb3VudHJ5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5GaWx0ZXIgbWV0cmljcyBieSBjb3VudHJ5LCBnZXR0aW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhbmQgdGhlICUgd2l0aCByZXNwZWN0IHRvIHRoZSBvdmVyYWxsIHZhbHVlLjwvcD5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC1sZy00XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0XHQ8aW1nIGNsYXNzPVwiY2FyZC1pbWctdG9wXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmFseXRpY3MtYWR2L2NvbXBhcmUucG5nXCIgYWx0PVwiQ29tcGFyZSBkYXRhXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5Db21wYXJlIGRhdGEgcmFuZ2VzIGFuZCBnZXQgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVzZXIgYmVoYXZpb3IgaW4gZGlmZmVyZW50IHRpbWUgcGVyaW9kcywgb3ZlcmFsbCBhbmQgYnkgY291bnRyeS48L3A+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNiBjb2wtbGctNFwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItbGlnaHQgbXktMyBteC1hdXRvXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhcmQtaW1nLXRvcFwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5hbHl0aWNzLWFkdi9kZW1vZ3JhcGhpY3NDb21wYXJlLnBuZ1wiIGFsdD1cIkNvbXBhcmUgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+Q29tcGFyZSBkYXRhIHJhbmdlcyBhbmQgZ2V0IHBlci1tZXRyaWMgYmVoYXZpb3Igb3ZlciBkaWZmZXJlbnQgdGltZSBwZXJpb2RzLCBvdmVyYWxsIGFuZCBieSBjb3VudHJ5LjwvcD5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxoNSBjbGFzcz1cIm10LTIgbWItMyB0ZXh0LWNlbnRlclwiPjxhIGhyZWY9XCJodHRwczovL3d3dy5zbWFydGZveHNlcnZlci5jb20vc2hvcC9pbmRleC5waHA/ZGlzcGF0Y2g9cHJvZHVjdHMudmlldyZwcm9kdWN0X2lkPTMxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+Q2xpY2sgaGVyZSB0byB1cGdyYWRlPC9hPjwvaDU+XG5cdFx0XHRcdDxwIGNsYXNzPVwidGV4dC1jZW50ZXIgbXktMFwiPjxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj4qIEF2YWlsYWJsZSBtZXRyaWNzOiBWaXNpdHMgfCBVbmlxdWUgdmlzaXRvcnMgfCBOZXcgdmlzaXRvcnMgfCBOZXcgdmlzaXRzICUgfCBBdmcuIHZpc2l0IGR1cmF0aW9uPC9zbWFsbD48L3A+XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnZGVtb2dyYXBoaWNzLXByby1hZHYnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZGVtb2dyYXBoaWNzLXByby1hZHYnLCBEZW1vZ3JhcGhpY3NQcm9BZHYpO1xuIiwiaW1wb3J0IHtCYXNlVGFibGVWaWV3fSBmcm9tICcuLi9iYXNlLXRhYmxlLXZpZXcnO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4uL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7TWV0cmljc01hbmFnZXJ9IGZyb20gJy4uLy4uLy4uLy4uL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljcy1tYW5hZ2VyJztcbmltcG9ydCB7RmlsdGVyU2V0RXZlbnR9IGZyb20gJy4uL2ZpbHRlci1ldmVudCc7XG5cbmV4cG9ydCBjbGFzcyBEZW1vZ3JhcGhpY3NUYWJsZVZpZXcgZXh0ZW5kcyBCYXNlVGFibGVWaWV3XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEEpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRcdC8vIElmIGZpbHRlciBpcyBzZXQsIGRpc2FibGUgZ3JpZCBzZWxlY3Rpb25cblx0XHRcdFx0dGhpcy5zZXRUYWJsZVNlbGVjdGFibGUoIWlzRmlsdGVyZWQpO1xuXG5cdFx0XHRcdC8vIFNldCBmaWx0ZXJpbmdcblx0XHRcdFx0Y29uc3QgZHNGaWx0ZXIgPSBbXTtcblxuXHRcdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0XHRkc0ZpbHRlci5wdXNoKHtcblx0XHRcdFx0XHRcdGZpZWxkOiAnY291bnRyeUNvZGUnLCBvcGVyYXRvcjogJ2VxJywgdmFsdWU6IHRoaXMuX2ZpbHRlci52YWx1ZVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIEFzc2lnbiBkYXRhcHJvdmlkZXIgdG8gZ3JpZFxuXHRcdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0XHRmaWx0ZXI6IGRzRmlsdGVyLFxuXHRcdFx0XHRcdHNvcnQ6IHtcblx0XHRcdFx0XHRcdGZpZWxkOiAndmlzaXRzJyxcblx0XHRcdFx0XHRcdGRpcjogJ2Rlc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkYXRhOiB0aGlzLl90YWJsZURhdGEuZGF0YVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoW10pO1xuXHRcdH1cblx0fVxuXG5cdG9uSXRlbUNsaWNrKClcblx0e1xuXHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2dyaWQuZGF0YUl0ZW0odGhpcy5fZ3JpZC5zZWxlY3QoKSk7XG5cblx0XHRpZiAoZGF0YUl0ZW0gIT0gbnVsbClcblx0XHR7XG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIG5ldyBGaWx0ZXJTZXRFdmVudCgnY291bnRyeScsIGRhdGFJdGVtLmNvdW50cnlDb2RlLCBmYWxzZSwgZGF0YUl0ZW0uY291bnRyeU5hbWUpICk7XG5cdFx0fVxuXHR9XG5cblx0Y29uZmlndXJlQ29sdW1ucygpXG5cdHtcblx0XHR0aGlzLl9ncmlkLnNldE9wdGlvbnMoe1xuXHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0ZmllbGQ6ICdjb3VudHJ5TmFtZScsXG5cdFx0XHRcdHRpdGxlOiAnQ291bnRyeScsXG5cdFx0XHRcdHdpZHRoOiAyMDAsXG5cdFx0XHRcdGxvY2tlZDogZmFsc2UsXG5cdFx0XHRcdHRlbXBsYXRlOiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdFx0XHRcdGlmIChkYXRhSXRlbS5jb3VudHJ5TmFtZSA9PSAnJylcblx0XHRcdFx0XHRcdHJldHVybiAnW3Vua25vd25dJztcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gZGF0YUl0ZW0uY291bnRyeU5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnVmlzaXRzJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVklTSVRTLFxuXHRcdFx0XHRcdHRpdGxlOiAnVG90YWwnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0VmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LHtcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVklTSVRTLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdVbmlxdWUgdmlzaXRvcnMnLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0se1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdPdmVyYWxsICUnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ05ldyB2aXNpdG9ycycsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnTmV3IHZpc2l0cyAlJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzEsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSkpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ0F2ZyB2aXNpdCBkdXJhdGlvbicsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH1dXG5cdFx0fSk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdkZW1vZ3JhcGhpY3MtdGFibGUtdmlldycpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkZW1vZ3JhcGhpY3MtdGFibGUtdmlldycsIERlbW9ncmFwaGljc1RhYmxlVmlldyk7XG4iLCJpbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuLi9maWx0ZXItZXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRXhjZXB0aW9uc0NoYXJ0VmlldyBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJtYi0zXCI+XG5cdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXIgbWwtMVwiPjwvaT5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtd2FybmluZyBtaXNzaW5nLXdhcm5pbmcgc2hvdy10b29sdGlwIG1sLTFcIiB0aXRsZT1cIkRhdGEgbG9hZGluZyBpbnRlcnJ1cHRlZFwiPjwvaT5cblx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8ZGl2IGlkPVwiY2hhcnRcIj48L2Rpdj5cblx0XHRgO1xuXG5cdFx0Ly8gSGlkZSBsb2FkaW5nIHNwaW5uZXIgYW5kIHdhcm5pbmdcblx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5oaWRlKCk7XG5cdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuaGlkZSgpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBoZWxwIHRvb2x0aXBzXG5cdFx0dGhpcy5nZXQkKCcjaGVhZGVyJykua2VuZG9Ub29sdGlwKHtcblx0XHRcdGZpbHRlcjogJ2lbdGl0bGVdLmhlbHAsIC5zaG93LXRvb2x0aXBbdGl0bGVdJyxcblx0XHRcdHBvc2l0aW9uOiAncmlnaHQnLFxuXHRcdFx0Y29udGVudDogZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRyZXR1cm4gYDxkaXYgY2xhc3M9J2hlbHAtdG9vbHRpcCc+JHtlLnRhcmdldC5kYXRhKCd0aXRsZScpfTwvZGl2PmA7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGNoYXJ0XG5cdFx0dGhpcy5fY2hhcnQgPSB0aGlzLmdldCQoJyNjaGFydCcpLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgbGVnZW5kOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH0sXG5cdFx0XHRzZXJpZXNEZWZhdWx0czoge1xuXHRcdFx0XHRsYWJlbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IFwiIz0gY2F0ZWdvcnkgIzogXFxuICM9IHZhbHVlIyVcIlxuICAgICAgICAgICAgICAgIH0sXG5cdFx0XHRcdG92ZXJsYXk6IHtcblx0XHRcdFx0XHRncmFkaWVudDogJ25vbmUnXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICB9LFxuXHRcdFx0c2VyaWVzOiBbe1xuXHRcdFx0XHR0eXBlOiAncGllJyxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiAxNTAsXG5cdFx0XHRcdGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICdjYXRlZ29yeScsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHR0ZW1wbGF0ZToga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNhdGVnb3J5XCI+XG5cdFx0XHRcdFx0XHQ8c3Ryb25nPlxuXHRcdFx0XHRcdFx0XHQjIGlmIChjYXRlZ29yeSAhPSAnJykgeyAjXG5cdFx0XHRcdFx0XHRcdCM6IGNhdGVnb3J5ICNcblx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFt1bmtub3duXVxuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0PC9zdHJvbmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY2F0ZWdvcnlcIj5cblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLXNxdWFyZVwiIHN0eWxlPVwiY29sb3I6ICM6IGRhdGFJdGVtLmNvbG9yICNcIj48L2k+XG5cdFx0XHRcdFx0XHQjOiB2YWx1ZSAjJSAoIzogZGF0YUl0ZW0udG90YWwgIylcblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0YCksXG5cdFx0XHRcdGJhY2tncm91bmQ6ICcjZTRlNGU0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0NoYXJ0Jyk7XG5cdH1cblxuXHRnZXQgc3RhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuXHR9XG5cblx0c2V0IHN0YXRlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlICE9IHRoaXMuc3RhdGUpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlKVxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdGUnLCB2YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdGF0ZScpO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGUgY2hhbmdlXG5cdFx0XHR0aGlzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1RhYmxlRGF0YX0gdGFibGVEYXRhXG4gXHQgKiBAcGFyYW0gIHthcnJheX0gbWV0cmljc0RQXG5cdCAqL1xuXHRpbml0KHRhYmxlRGF0YSwgbWV0cmljcylcblx0e1xuXHRcdHRoaXMuX3RhYmxlRGF0YSA9IHRhYmxlRGF0YTtcblx0XHR0aGlzLl9tZXRyaWNzQnlJZCA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtZXRyaWNzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGJhc2VNZXRyaWMgPSBtZXRyaWNzW2ldO1xuXG5cdFx0XHQvLyBBZGQgZW50cnkgdG8gbWV0cmljc0J5SWQgYXJyYXlcblx0XHRcdHRoaXMuX21ldHJpY3NCeUlkW2Jhc2VNZXRyaWMuaWRdID0gYmFzZU1ldHJpYztcblx0XHR9XG5cblx0XHR0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuXHRcdC8vIFJlZnJlc2hcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqL1xuXHRzZXRGaWx0ZXIoZmlsdGVyKVxuXHR7XG5cdFx0dGhpcy5fZmlsdGVyID0gZmlsdGVyO1xuXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHRyZWZyZXNoKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBKVxuXHRcdFx0XHR0aGlzLl9kcmF3Q2hhcnQodGhpcy5fdGFibGVEYXRhLmRhdGEpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl9kcmF3Q2hhcnQobnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlU3RhdGVDaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuaGlkZSgpO1xuXG5cdFx0XHRzd2l0Y2ggKHRoaXMuc3RhdGUpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgc3Bpbm5lclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgaW50ZXJydXB0ZWQgd2FybmluZ1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEE6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdHJlZnJlc2hPbldpbmRvd1Jlc2l6ZSgpXG5cdHtcblx0XHR0aGlzLl9jaGFydC5yZWRyYXcoKTtcblx0fVxuXG5cdF9kcmF3Q2hhcnQoY2hhcnREYXRhKVxuXHR7XG5cdFx0aWYgKGNoYXJ0RGF0YSAhPSBudWxsICYmIGNoYXJ0RGF0YS5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdHtcblx0XHRcdCBcdGNoYXJ0RGF0YSA9IGNoYXJ0RGF0YS5maWx0ZXIob2JqID0+IHtcblx0XHRcdFx0XHRsZXQgdmFsdWVzID0gdGhpcy5fZmlsdGVyLnZhbHVlLnNwbGl0KCc6Jyk7XG5cblx0XHRcdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9iai50eXBlICsgJzonICsgb2JqLmRlc2NyaXB0aW9uID09IHRoaXMuX2ZpbHRlci52YWx1ZSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50eXBlID09IHRoaXMuX2ZpbHRlci52YWx1ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCB0b3RhbCA9IDA7XG5cdFx0XHRsZXQgZXJyb3JzID0gMDtcblx0XHRcdGxldCB3YXJuaW5ncyA9IDA7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcnREYXRhLmxlbmd0aDsgaSsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgaXRlbSA9IGNoYXJ0RGF0YVtpXTtcblx0XHRcdFx0bGV0IHZhbHVlID0gaXRlbVsnZXhjZXB0aW9ucyddO1xuXG5cdFx0XHRcdHRvdGFsICs9IHZhbHVlO1xuXG5cdFx0XHRcdGlmIChpdGVtLnR5cGUgPT0gJ1dBUk4nKVxuXHRcdFx0XHRcdHdhcm5pbmdzICs9IHZhbHVlO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZXJyb3JzICs9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgd2FybmluZ3NQZXJjID0gd2FybmluZ3MgLyB0b3RhbCAqIDEwMDtcblx0XHRcdGxldCBlcnJvcnNQZXJjID0gZXJyb3JzIC8gdG90YWwgKiAxMDA7XG5cblx0XHRcdHRoaXMuX2NoYXJ0LnNldERhdGFTb3VyY2UoW1xuXHRcdFx0XHR7Y2F0ZWdvcnk6ICdXYXJuaW5ncycsIHZhbHVlOiB3YXJuaW5nc1BlcmMudG9GaXhlZCgyKSwgdG90YWw6IHdhcm5pbmdzLCBjb2xvcjogJyNmZmNjMzMnfSxcblx0XHRcdFx0e2NhdGVnb3J5OidFcnJvcnMnLCB2YWx1ZTogZXJyb3JzUGVyYy50b0ZpeGVkKDIpLCB0b3RhbDogZXJyb3JzLCBjb2xvcjogJyNmZjMzMDAnfVxuXHRcdFx0XSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX2NoYXJ0LnNldERhdGFTb3VyY2UoW10pO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnZXhjZXB0aW9ucy1jaGFydC12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2V4Y2VwdGlvbnMtY2hhcnQtdmlldycsIEV4Y2VwdGlvbnNDaGFydFZpZXcpO1xuIiwiaW1wb3J0IHtCYXNlVGFibGVWaWV3fSBmcm9tICcuLi9iYXNlLXRhYmxlLXZpZXcnO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4uL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7TWV0cmljc01hbmFnZXJ9IGZyb20gJy4uLy4uLy4uLy4uL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljcy1tYW5hZ2VyJztcbmltcG9ydCB7RmlsdGVyU2V0RXZlbnR9IGZyb20gJy4uL2ZpbHRlci1ldmVudCc7XG5cbmV4cG9ydCBjbGFzcyBFeGNlcHRpb25zVGFibGVWaWV3IGV4dGVuZHMgQmFzZVRhYmxlVmlld1xue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cdH1cblxuXHRyZWZyZXNoKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBpc0ZpbHRlcmVkID0gKHRoaXMuX2ZpbHRlciAhPSBudWxsICYmIHRoaXMuX2ZpbHRlci52YWx1ZSAhPSBudWxsKTtcblx0XHRcdFx0Y29uc3QgZmlsdGVyVmFsdWVzID0gaXNGaWx0ZXJlZCA/IHRoaXMuX2ZpbHRlci52YWx1ZS5zcGxpdCgnOicpIDogW107XG5cblx0XHRcdFx0Ly8gSWYgZmlsdGVyIGlzIHNldCBhbmQgaGFzIG11bHRpcGxlIHZhbHVlcywgZGlzYWJsZSBncmlkIHNlbGVjdGlvblxuXHRcdFx0XHR0aGlzLnNldFRhYmxlU2VsZWN0YWJsZSghKGlzRmlsdGVyZWQgJiYgZmlsdGVyVmFsdWVzLmxlbmd0aCA+IDEpKTtcblxuXHRcdFx0XHQvLyBTZXQgZmlsdGVyaW5nXG5cdFx0XHRcdGNvbnN0IGRzRmlsdGVyID0gW107XG5cblx0XHRcdFx0aWYgKGlzRmlsdGVyZWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkc0ZpbHRlci5wdXNoKHtcblx0XHRcdFx0XHRcdGZpZWxkOiAndHlwZScsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogZmlsdGVyVmFsdWVzWzBdXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoZmlsdGVyVmFsdWVzLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0ZHNGaWx0ZXIucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGZpZWxkOiAnZGVzY3JpcHRpb24nLCBvcGVyYXRvcjogJ2VxJywgdmFsdWU6IGZpbHRlclZhbHVlc1sxXVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXNzaWduIGRhdGFwcm92aWRlciB0byBncmlkXG5cdFx0XHRcdGxldCBkcyA9IG5ldyBrZW5kby5kYXRhLkRhdGFTb3VyY2Uoe1xuXHRcdFx0XHRcdGZpbHRlcjogZHNGaWx0ZXIsXG5cdFx0XHRcdFx0c29ydDoge1xuXHRcdFx0XHRcdFx0ZmllbGQ6ICdkZXNjcmlwdGlvbicsXG5cdFx0XHRcdFx0XHRkaXI6ICdhc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkYXRhOiB0aGlzLl90YWJsZURhdGEuZGF0YSxcblx0XHRcdFx0XHRncm91cDoge1xuXHRcdFx0XHRcdFx0ZmllbGQ6ICd0eXBlJywgYWdncmVnYXRlczogW1xuXHRcdFx0XHRcdFx0XHR7ZmllbGQ6ICdkZXNjcmlwdGlvbicsIGFnZ3JlZ2F0ZTogJ2NvdW50J30sXG5cdFx0XHRcdFx0XHRcdHtmaWVsZDogTWV0cmljc01hbmFnZXIuRVhDRVBUSU9OUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHRdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogW1xuXHRcdFx0XHRcdFx0e2ZpZWxkOiAnZGVzY3JpcHRpb24nLCBhZ2dyZWdhdGU6ICdjb3VudCd9LFxuXHRcdFx0XHRcdFx0e2ZpZWxkOiBNZXRyaWNzTWFuYWdlci5FWENFUFRJT05TLCBhZ2dyZWdhdGU6ICdzdW0nfSxcblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMuX2dyaWQuc2V0RGF0YVNvdXJjZShkcyk7XG5cblx0XHRcdFx0Ly8gQWRkIGNsaWNrIGxpc3RlbmVyIHRvIGdyb3VwIGhlYWRlciByb3dzXG5cdFx0XHRcdHRoaXMuZ2V0JCgnI2dyaWQnKS5maW5kKCcuay1ncm91cGluZy1yb3cnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uR3JvdXBIZWFkZXJDbGljaywgdGhpcykpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoW10pO1xuXHRcdH1cblx0fVxuXG5cdF9vbkdyb3VwSGVhZGVyQ2xpY2soZSlcblx0e1xuXHRcdC8vIElmIGV4cGFuZC9jb2xsYXBzZSBpY29uIGlzIGNsaWNrZWQsIGRvIG5vdCBmaXJlIGV2ZW50XG5cdFx0aWYgKCEkKGUudGFyZ2V0KS5oYXNDbGFzcygnay1pY29uJykpXG5cdFx0e1xuXHRcdFx0Y29uc3QgaXNGaWx0ZXJlZCA9ICh0aGlzLl9maWx0ZXIgIT0gbnVsbCAmJiB0aGlzLl9maWx0ZXIudmFsdWUgIT0gbnVsbCk7XG5cdFx0XHRjb25zdCB0eXBlID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJy5ncm91cC1oZWFkZXInKS5hdHRyKCdkYXRhLXR5cGUnKTtcblxuXHRcdFx0aWYgKCFpc0ZpbHRlcmVkICYmIHR5cGUpXG5cdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCdleGNlcHRpb24nLCB0eXBlLCB0cnVlKSApO1xuXHRcdH1cblx0fVxuXG5cdG9uSXRlbUNsaWNrKClcblx0e1xuXHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2dyaWQuZGF0YUl0ZW0odGhpcy5fZ3JpZC5zZWxlY3QoKSk7XG5cblx0XHRpZiAoZGF0YUl0ZW0gIT0gbnVsbClcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCdleGNlcHRpb24nLCBgJHtkYXRhSXRlbS50eXBlfToke2RhdGFJdGVtLmRlc2NyaXB0aW9ufWAsIHRydWUpICk7XG5cdH1cblxuXHRjb25maWd1cmVDb2x1bW5zKClcblx0e1xuXHRcdHRoaXMuX2dyaWQuc2V0T3B0aW9ucyh7XG5cdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRmaWVsZDogJ3R5cGUnLFxuXHRcdFx0XHR0aXRsZTogJ1R5cGUnLFxuXHRcdFx0XHRncm91cEhlYWRlclRlbXBsYXRlOiAnPHNwYW4gY2xhc3M9XCJncm91cC1oZWFkZXJcIiBkYXRhLXR5cGU9XCIjPXZhbHVlI1wiPiM9dmFsdWUjPC9zcGFuPicsXG5cdFx0XHRcdGhpZGRlbjogdHJ1ZSxcblx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFJdGVtLnR5cGUgPT0gJycpXG5cdFx0XHRcdFx0XHRyZXR1cm4gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLnR5cGU7XG5cdFx0XHRcdH1cblx0XHRcdH0se1xuXHRcdFx0XHRmaWVsZDogJ2Rlc2NyaXB0aW9uJyxcblx0XHRcdFx0dGl0bGU6ICdFeGNlcHRpb24nLFxuXHRcdFx0XHR3aWR0aDogNDAwLFxuXHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRpZiAoZGF0YUl0ZW0uZGVzY3JpcHRpb24gPT0gJycpXG5cdFx0XHRcdFx0XHRyZXR1cm4gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLmRlc2NyaXB0aW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9LHtcblx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMsXG5cdFx0XHRcdHRpdGxlOiAnVG90YWwnLFxuXHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMpKSxcblx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0fSxcblx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtVmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5FWENFUFRJT05TKSksXG5cdFx0XHR9LHtcblx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMsXG5cdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMpKSxcblx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0fSxcblx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtUGVyY2VudGFnZUNvbFRlbXBsYXRlMSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5FWENFUFRJT05TKSlcblx0XHRcdH1dXG5cdFx0fSk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdleGNlcHRpb25zLXRhYmxlLXZpZXcnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZXhjZXB0aW9ucy10YWJsZS12aWV3JywgRXhjZXB0aW9uc1RhYmxlVmlldyk7XG4iLCJleHBvcnQgY2xhc3MgRmlsdGVyU2V0RXZlbnQgZXh0ZW5kcyBDdXN0b21FdmVudFxue1xuXHRjb25zdHJ1Y3RvcihmaWx0ZXJOYW1lLCBmaWx0ZXJWYWx1ZSwgY2hlY2tTZXBhcmF0b3IsIGZpbHRlckRpc3BsYXlWYWx1ZSA9IG51bGwpXG5cdHtcblx0XHRzdXBlcignZmlsdGVyLXNldCcsIHtcblx0XHRcdGJ1YmJsZXM6IHRydWUsXG5cdFx0XHRjb21wb3NlZDogdHJ1ZSwgLy8gQWxsb3dzIGV2ZW50IHRvIGJ1YmJsZSBvdXRzaWRlIG9mIEN1c3RvbSBFbGVtZW50XG5cdFx0XHRkZXRhaWw6IHtcblx0XHRcdFx0ZmlsdGVyTmFtZTogZmlsdGVyTmFtZSxcblx0XHRcdFx0ZmlsdGVyVmFsdWU6IGZpbHRlclZhbHVlLFxuXHRcdFx0XHRjaGVja1NlcGFyYXRvcjogY2hlY2tTZXBhcmF0b3IsXG5cdFx0XHRcdGZpbHRlckRpc3BsYXlWYWx1ZTogZmlsdGVyRGlzcGxheVZhbHVlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiIsImltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5pbXBvcnQge01ldHJpY3NNYW5hZ2VyfSBmcm9tICcuLi8uLi8uLi9tYW5hZ2Vycy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL21ldHJpY3MtbWFuYWdlcic7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuL2ZpbHRlci1ldmVudCc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGNsYXNzIE1haW5DaGFydCBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXHRcdFx0XHQudHJ1bmNhdGUge1xuXHRcdFx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdFx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdFx0XHR0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5jb250YWluZXItZml4IHtcblx0XHRcdFx0XHQvKiBUaGlzIGF2b2lkcyBmbGV4IGNoaWxkIGNvbnRhaW5pbmcgYSBwb3RlbnRpYWxseSB2ZXJ5IGxhcmdlIGNoaWxkIHRvIGJyZWFrIHRoZSBsYXlvdXQgKi9cblx0XHRcdFx0XHRtaW4td2lkdGg6IDA7XG5cdFx0XHRcdH1cblx0XHRcdDwvc3R5bGU+XG5cblx0XHRcdDxkaXYgaWQ9XCJoZWFkZXJcIiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC1hdXRvIG15LTFcIj5cblx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1jaGFydC1hcmVhIG1yLTFcIj48L2k+XG5cdFx0XHRcdFx0PHNlbGVjdCBpZD1cIm1ldHJpY3NERFwiIGNsYXNzPVwibXItMVwiPjwvc2VsZWN0PlxuXHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXJcIj48L2k+XG5cdFx0XHRcdFx0PGkgaWQ9XCJ3YXJuaW5nXCIgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtd2FybmluZyBzaG93LXRvb2x0aXAgbWwtMVwiIHRpdGxlPVwiRGF0YSBsb2FkaW5nIGludGVycnVwdGVkXCI+PC9pPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQgbXktMSBweC1tZC0wIGNvbnRhaW5lci1maXhcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwiZmlsdGVyXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBkLWZsZXggbWItMCBweS0yIHB4LTMgYWxpZ24taXRlbXMtY2VudGVyXCIgcm9sZT1cImFsZXJ0XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgaWQ9XCJmaWx0ZXJOYW1lXCIgY2xhc3M9XCJ0ZXh0LW11dGVkIGZvbnQtd2VpZ2h0LWJvbGQgdGV4dC11cHBlcmNhc2UgbXItMlwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwiZmlsdGVyVmFsdWVcIiBjbGFzcz1cImZsZXgtZ3Jvdy0xIGZvbnQtd2VpZ2h0LWJvbGQgdHJ1bmNhdGVcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBpZD1cInJlZHVjZUZpbHRlckJ0XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtIG1sLTIgcHktMCBweC0xXCIgdGl0bGU9XCJSZW1vdmUgc3ViLWZpbHRlclwiPjxpIGNsYXNzPVwiZmFzIGZhLXN0ZXAtYmFja3dhcmRcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdDxidXR0b24gaWQ9XCJyZW1vdmVGaWx0ZXJCdFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbSBtbC0yIHB5LTAgcHgtMVwiIHRpdGxlPVwiUmVtb3ZlIGZpbHRlclwiPjxpIGNsYXNzPVwiZmFzIGZhLWVqZWN0XCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZmllbGRzZXQgaWQ9XCJ0aW1lVW5pdFNlbGVjdG9yXCIgY2xhc3M9XCJjb2wtMTIgY29sLW1kLWF1dG8gbXktMSBmbGV4LXJvd1wiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjdXN0b20tY29udHJvbCBjdXN0b20tcmFkaW8gZC1pbmxpbmUtYmxvY2sgbXItMiBzaG93LXRvb2x0aXBcIiB0aXRsZT1cIkhvdXJseSBjaGFydDxicj48c3BhbiBzdHlsZT0nd2hpdGUtc3BhY2U6IG5vd3JhcDsnPihyYW5nZSAmbHQ7PSA3IGRheXMpPC9zcGFuPlwiPlxuXHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ0aW1lVW5pdFwiIGlkPVwiaG91cmx5UkJcIiBjbGFzcz1cImN1c3RvbS1jb250cm9sLWlucHV0XCIgY2hlY2tlZCB2YWx1ZT1cIkhIXCI+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cImhvdXJseVJCXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2xvY2tcIj48L2k+PC9sYWJlbD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLXJhZGlvIGQtaW5saW5lLWJsb2NrIG1yLTIgc2hvdy10b29sdGlwXCIgdGl0bGU9XCJEYWlseSBjaGFydDxicj48c3BhbiBzdHlsZT0nd2hpdGUtc3BhY2U6IG5vd3JhcDsnPihyYW5nZSAmbHQ7PSAzIG1vbnRocyk8L3NwYW4+XCI+XG5cdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInRpbWVVbml0XCIgaWQ9XCJkYWlseVJCXCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1pbnB1dFwiIHZhbHVlPVwiRERcIj5cblx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jb250cm9sLWxhYmVsXCIgZm9yPVwiZGFpbHlSQlwiPjxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLWRheVwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjdXN0b20tY29udHJvbCBjdXN0b20tcmFkaW8gZC1pbmxpbmUtYmxvY2sgbXItMiBzaG93LXRvb2x0aXBcIiB0aXRsZT1cIldlZWtseSBjaGFydDxicj48c3BhbiBzdHlsZT0nd2hpdGUtc3BhY2U6IG5vd3JhcDsnPihyYW5nZSAmbHQ7PSAyIHllYXJzKTwvc3Bhbj5cIj5cblx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwidGltZVVuaXRcIiBpZD1cIndlZWtseVJCXCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1pbnB1dFwiIHZhbHVlPVwiV1dcIj5cblx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jb250cm9sLWxhYmVsXCIgZm9yPVwid2Vla2x5UkJcIj48aSBjbGFzcz1cImZhcyBmYS1jYWxlbmRhci13ZWVrXCI+PC9pPjwvbGFiZWw+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1yYWRpbyBkLWlubGluZS1ibG9jayBzaG93LXRvb2x0aXBcIiB0aXRsZT1cIk1vbnRobHkgY2hhcnRcIj5cblx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwidGltZVVuaXRcIiBpZD1cIm1vbnRobHlSQlwiIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiB2YWx1ZT1cIk1NXCI+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cIm1vbnRobHlSQlwiPjxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLWFsdFwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2ZpZWxkc2V0PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGlkPVwiY2hhcnRcIj48L2Rpdj5cblx0XHRgO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBtZXRyaWMgc2VsZWN0b3IgZHJvcGRvd25cblx0XHR0aGlzLl9tZXRyaWNzREQgPSB0aGlzLmdldCQoJyNtZXRyaWNzREQnKS5rZW5kb0Ryb3BEb3duTGlzdCh7XG5cdFx0XHRkYXRhVGV4dEZpZWxkOiAndGV4dCcsXG4gICAgICAgICAgICBkYXRhVmFsdWVGaWVsZDogJ3ZhbHVlJyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbk1ldHJpY0NoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSGlkZSBsb2FkaW5nIHNwaW5uZXIgYW5kIHdhcm5pbmdcblx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5oaWRlKCk7XG5cdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLmhpZGUoKTtcblxuXHRcdC8vIEhpZGUgZmlsdGVyXG5cdFx0dGhpcy5nZXQkKCcjZmlsdGVyJykuaGlkZSgpO1xuXHRcdHRoaXMuZ2V0JCgnI3JlZHVjZUZpbHRlckJ0JykuaGlkZSgpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIGZpbHRlciBidXR0b25zXG5cdFx0dGhpcy5nZXQkKCcjcmVkdWNlRmlsdGVyQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVkdWNlRmlsdGVyQ2xpY2ssIHRoaXMpKTtcblx0XHR0aGlzLmdldCQoJyNyZW1vdmVGaWx0ZXJCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVGaWx0ZXJDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIHRpbWUgdW5pdCBjaGFuZ2Vcblx0XHR0aGlzLmdldCQoJ2lucHV0W25hbWU9XCJ0aW1lVW5pdFwiXScpLm9uKCdjaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uVGltZVVuaXRDaGFuZ2UsIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2hlYWRlcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW50aWFsaXplIG1haW4gY2hhcnRcblx0XHR0aGlzLl9jaGFydCA9IHRoaXMuZ2V0JCgnI2NoYXJ0Jykua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiAyNTAsXG5cdFx0XHRcdGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcmllczogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJlYScsXG5cdFx0XHRcdG5hbWU6ICdtYWluJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICBjYXRlZ29yeUZpZWxkOiAndGltZScsXG5cdFx0XHRcdGNhdGVnb3J5QXhpczogJ21haW4nLFxuXHRcdFx0XHRjb2xvcjogJyMzMzk5ZmYnLFxuXHRcdFx0XHRsaW5lOiB7XG5cdFx0XHRcdFx0d2lkdGg6IDJcblx0XHRcdFx0fSxcblx0XHRcdFx0bWFya2Vyczoge1xuXHRcdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICB9LFxuXHRcdFx0e1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5lJyxcblx0XHRcdFx0bmFtZTogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICd0aW1lJyxcblx0XHRcdFx0Y2F0ZWdvcnlBeGlzOiAnY29tcGFyZScsXG5cdFx0XHRcdGNvbG9yOiAnI2ZmOTkwMCcsXG5cdFx0XHRcdGxpbmU6IHtcblx0XHRcdFx0XHR3aWR0aDogMlxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgfV0sXG5cdFx0XHRjYXRlZ29yeUF4aXM6IFt7XG5cdFx0XHRcdG5hbWU6ICdtYWluJyxcblx0XHRcdFx0dHlwZTogJ2RhdGUnLFxuXHRcdFx0XHRiYXNlVW5pdDogJycsXG5cdFx0XHRcdGp1c3RpZmllZDogdHJ1ZSxcblx0XHRcdFx0bWF4RGl2aXNpb25zOiB3aW5kb3cuaW5uZXJXaWR0aCA8IDkwMCA/IDEyIDogMjQsXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdGNvbG9yOiAnIzMzOTlmZicsXG5cdFx0XHRcdFx0ZGF0ZUZvcm1hdHM6XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bWludXRlczogJ0hIOm1tJyxcblx0XHRcdFx0XHRcdGhvdXJzOiAnSEg6bW0nLFxuXHRcdFx0XHRcdFx0ZGF5czogJ2RkIE1NTScsXG5cdFx0XHRcdFx0XHR3ZWVrczogJ2RkIE1NTScsXG5cdFx0XHRcdFx0XHRtb250aHM6ICdkZCBNTU0nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdGF4aXNDcm9zc2luZ1ZhbHVlOiAwXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiAnY29tcGFyZScsXG5cdFx0XHRcdHR5cGU6ICdkYXRlJyxcblx0XHRcdFx0YmFzZVVuaXQ6ICcnLFxuXHRcdFx0XHRqdXN0aWZpZWQ6IHRydWUsXG5cdFx0XHRcdG1heERpdmlzaW9uczogd2luZG93LmlubmVyV2lkdGggPCA5MDAgPyAxMiA6IDI0LFxuXHRcdFx0XHRsYWJlbHM6IHtcblx0XHRcdFx0XHRjb2xvcjogJyNmZjk5MDAnLFxuXHRcdFx0XHRcdGRhdGVGb3JtYXRzOlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG1pbnV0ZXM6ICdISDptbScsXG5cdFx0XHRcdFx0XHRob3VyczogJ0hIOm1tJyxcblx0XHRcdFx0XHRcdGRheXM6ICdkZCBNTU0nLFxuXHRcdFx0XHRcdFx0d2Vla3M6ICdkZCBNTU0nLFxuXHRcdFx0XHRcdFx0bW9udGhzOiAnZGQgTU1NJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0YXhpc0Nyb3NzaW5nVmFsdWU6IDI1XG5cdFx0XHR9XSxcblx0XHRcdHZhbHVlQXhpczoge1xuXHRcdFx0XHRheGlzQ3Jvc3NpbmdWYWx1ZXM6IFswLCA5OTk5OTk5OTk5OTk5XVxuXHRcdFx0fSxcblx0XHRcdHRvb2x0aXA6IHtcblx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jYXRlZ29yeVwiPlxuXHRcdFx0XHRcdFx0PHN0cm9uZz5cblx0XHRcdFx0XHRcdFx0Izoga2VuZG8udG9TdHJpbmcoY2F0ZWdvcnksICdkZCBNTU0geXl5eScpICNcblx0XHRcdFx0XHRcdFx0IyBpZiAoZGF0YUl0ZW0uc2hvd0hvdXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdGgjOiBrZW5kby50b1N0cmluZyhjYXRlZ29yeSwgJ0hIJykgI1xuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0PC9zdHJvbmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLXNxdWFyZVwiIHN0eWxlPVwiY29sb3I6ICM6IHNlcmllcy5jb2xvciAjXCI+PC9pPlxuXHRcdFx0XHRcdFx0IzogZGF0YUl0ZW0ubmFtZSAjIDogIzoga2VuZG8uZm9ybWF0KGRhdGFJdGVtLmZvcm1hdCwgdmFsdWUpICNcblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0YCksXG5cdFx0XHRcdGJhY2tncm91bmQ6ICcjZTRlNGU0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0NoYXJ0Jyk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gcmVkcmF3IHdoYXQncyBuZWVkZWQgaW4gY2FzZSBvZiB3aW5kb3cgcmVzaXplXG5cdFx0JCh3aW5kb3cpLm9uKCdyZXNpemUnLCAkLnByb3h5KHRoaXMuX29uV2luZG93UmVzaXplLCB0aGlzKSk7XG5cdH1cblxuXHRnZXQgc3RhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuXHR9XG5cblx0c2V0IHN0YXRlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlICE9IHRoaXMuc3RhdGUpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlKVxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdGUnLCB2YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdGF0ZScpO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGUgY2hhbmdlXG5cdFx0XHR0aGlzLl9oYW5kbGVTdGF0ZUNoYW5nZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtDaGFydENvbnRhaW5lcn0gY2hhcnRDb250YWluZXJcblx0ICovXG5cdGluaXQoY2hhcnRDb250YWluZXIpXG5cdHtcblx0XHR0aGlzLl9jaGFydENvbnRhaW5lciA9IGNoYXJ0Q29udGFpbmVyO1xuXHRcdHRoaXMuX21ldHJpY3NCeUlkID0ge307XG5cblx0XHQvLyBDb25maWd1cmUgbWV0cmljcyBkcm9wZG93blxuXHRcdGxldCBtZXRyaWNzRFAgPSBbXTtcblx0XHRsZXQgaW5kZXggPSAwXG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJ0Q29udGFpbmVyLmNoYXJ0SWRzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGNoYXJ0SWQgPSBjaGFydENvbnRhaW5lci5jaGFydElkc1tpXTtcblx0XHRcdGNvbnN0IGJhc2VNZXRyaWMgPSBjaGFydENvbnRhaW5lci5tYWluQ2hhcnRzW2NoYXJ0SWRdLmJhc2VNZXRyaWM7XG5cblx0XHRcdG1ldHJpY3NEUC5wdXNoKHt2YWx1ZTogYmFzZU1ldHJpYy5pZCwgdGV4dDogYmFzZU1ldHJpYy5uYW1lfSk7XG5cblx0XHRcdGlmIChjaGFydElkID09IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUylcblx0XHRcdFx0aW5kZXggPSBpO1xuXG5cdFx0XHQvLyBBZGQgZW50cnkgdG8gbWV0cmljc0J5SWQgYXJyYXlcblx0XHRcdHRoaXMuX21ldHJpY3NCeUlkW2Jhc2VNZXRyaWMuaWRdID0gYmFzZU1ldHJpYztcblx0XHR9XG5cblx0XHQvLyBTZXQgbWV0cmljcyBkcm9wZG93biBkYXRhcHJvdmlkZXJcblx0XHR0aGlzLl9tZXRyaWNzREQuc2V0RGF0YVNvdXJjZShtZXRyaWNzRFApO1xuXG5cdFx0Ly8gU2V0IHNlbGVjdGVkIGluZGV4XG5cdFx0dGhpcy5fbWV0cmljc0RELnNlbGVjdChpbmRleCk7XG5cblx0XHR0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuXHRcdC8vIFJlZnJlc2hcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdGdldFNlbGVjdGVkTWV0cmljSWQoKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkID0gdGhpcy5fZ2V0U2VsZWN0ZWRNZXRyaWMoKTtcblx0XHRyZXR1cm4gKHNlbGVjdGVkICE9IG51bGwgPyBzZWxlY3RlZC5pZCA6IG51bGwpO1xuXHR9XG5cblx0c2V0U2VsZWN0ZWRNZXRyaWNCeUlkKG1ldHJpY0lkKVxuXHR7XG5cdFx0aWYgKG1ldHJpY0lkICE9IHRoaXMuZ2V0U2VsZWN0ZWRNZXRyaWNJZCgpKVxuXHRcdHtcblx0XHRcdHRoaXMuX21ldHJpY3NERC5zZWxlY3QoZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLnZhbHVlID09PSBtZXRyaWNJZDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBGaXJlIG1ldHJpYyBjaGFuZ2UgZXZlbnRcblx0XHRcdHRoaXMuX29uTWV0cmljQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0U2VsZWN0ZWRUaW1lVW5pdCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXQkKCdpbnB1dFtuYW1lPVwidGltZVVuaXRcIl06Y2hlY2tlZCcpLnZhbCgpO1xuXHR9XG5cblx0c2V0VGltZVVuaXQodGltZVVuaXQsIGhvdXJseUVuYWJsZWQsIGRhaWx5RW5hYmxlZCwgd2Vla2x5RW5hYmxlZClcblx0e1xuXHRcdHRoaXMuZ2V0JChgaW5wdXRbbmFtZT1cInRpbWVVbml0XCJdW3ZhbHVlPVwiJHt0aW1lVW5pdH1cIl1gKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cblx0XHR0aGlzLmdldCQoJyNob3VybHlSQicpLmF0dHIoJ2Rpc2FibGVkJywgIWhvdXJseUVuYWJsZWQpO1xuXHRcdHRoaXMuZ2V0JCgnI2RhaWx5UkInKS5hdHRyKCdkaXNhYmxlZCcsICFkYWlseUVuYWJsZWQpO1xuXHRcdHRoaXMuZ2V0JCgnI3dlZWtseVJCJykuYXR0cignZGlzYWJsZWQnLCAhd2Vla2x5RW5hYmxlZCk7XG5cdH1cblxuXHRfb25NZXRyaWNDaGFuZ2UoKVxuXHR7XG5cdFx0Y29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NoYXJ0LW1ldHJpYy1jaGFuZ2UnLCB7XG5cdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUgLy8gQWxsb3dzIGV2ZW50IHRvIGJ1YmJsZSBvdXRzaWRlIG9mIEN1c3RvbSBFbGVtZW50XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0X29uVGltZVVuaXRDaGFuZ2UoKVxuXHR7XG5cdFx0Y29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3RpbWUtdW5pdC1jaGFuZ2UnLCB7XG5cdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUgLy8gQWxsb3dzIGV2ZW50IHRvIGJ1YmJsZSBvdXRzaWRlIG9mIEN1c3RvbSBFbGVtZW50XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0X2dldFNlbGVjdGVkTWV0cmljKClcblx0e1xuXHRcdC8vIFJldHVybiBCYXNlTWV0cmljIG9iamVjdFxuXHRcdHJldHVybiB0aGlzLl9tZXRyaWNzQnlJZFt0aGlzLl9tZXRyaWNzREQudmFsdWUoKV07XG5cdH1cblxuXHRfaGFuZGxlU3RhdGVDaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnI3RpbWVVbml0U2VsZWN0b3InKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcblx0XHRcdHRoaXMuX21ldHJpY3NERC5lbmFibGUodHJ1ZSk7XG5cblx0XHRcdHN3aXRjaCAodGhpcy5zdGF0ZSlcblx0XHRcdHtcblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORzpcblx0XHRcdFx0XHR0aGlzLl9tZXRyaWNzREQuZW5hYmxlKGZhbHNlKTsgLy8gRGlzYWJsZSBtZXRyaWMgZG9ycGRvd25cblx0XHRcdFx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5zaG93KCk7IC8vIFNob3cgbG9hZGluZyBzcGlubmVyXG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjdGltZVVuaXRTZWxlY3RvcicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7IC8vIERpc2FibGUgdGltZSBzZWxlY3RvclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLnNob3coKTsgLy8gU2hvdyBsb2FkaW5nIGludGVycnVwdGVkIHdhcm5pbmdcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0fVxuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHRjb25zdCBtZXRyaWMgPSB0aGlzLl9nZXRTZWxlY3RlZE1ldHJpYygpO1xuXG5cdFx0XHQvLyBSZXNldCBjaGFydCBkYXRhcHJvdmlkZXJcblx0XHRcdHRoaXMuX2NoYXJ0LmZpbmRTZXJpZXNCeU5hbWUoJ21haW4nKS5kYXRhKG51bGwpO1xuXHRcdFx0dGhpcy5fY2hhcnQuZmluZFNlcmllc0J5TmFtZSgnY29tcGFyZScpLmRhdGEobnVsbCk7XG5cblx0XHRcdC8vIEhpZGUgY2F0ZWdvcnkgYXhpcyBmb3IgXCJjb21wYXJlXCIgc2VyaWVzXG5cdFx0XHR0aGlzLl9jaGFydC5vcHRpb25zLmNhdGVnb3J5QXhpc1sxXS52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBheGlzIGJhc2VkIG9uIHNlbGVjdGVkIHRpbWUgdW5pdFxuXHRcdFx0Y29uc3QgdGltZVVuaXQgPSB0aGlzLmdldFNlbGVjdGVkVGltZVVuaXQoKTtcblx0XHRcdHRoaXMuX2NoYXJ0Lm9wdGlvbnMuY2F0ZWdvcnlBeGlzWzBdLmJhc2VVbml0ID0gdGhpcy5fZ2V0Q2hhcnRCYXNlVW5pdCh0aW1lVW5pdCk7XG5cdFx0XHR0aGlzLl9jaGFydC5vcHRpb25zLmNhdGVnb3J5QXhpc1sxXS5iYXNlVW5pdCA9IHRoaXMuX2dldENoYXJ0QmFzZVVuaXQodGltZVVuaXQpO1xuXG5cdFx0XHQvLyBSZXNldCB2ZXJ0aWNhbCBheGlzXG5cdFx0XHR0aGlzLl9jaGFydC5zZXRPcHRpb25zKHtcblx0XHRcdFx0dmFsdWVBeGlzOiB7XG5cdFx0XHRcdFx0bWluOiAobWV0cmljICE9IG51bGwgJiYgbWV0cmljLmlzUGVyY2VudGFnZSA/IDAgOiB1bmRlZmluZWQpLFxuXHRcdCAgICBcdFx0bWF4OiAobWV0cmljICE9IG51bGwgJiYgbWV0cmljLmlzUGVyY2VudGFnZSA/IDEwMCA6IHVuZGVmaW5lZCksXG5cdFx0XHRcdFx0bGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiAobWV0cmljICE9IG51bGwgJiYgbWV0cmljLmlzUGVyY2VudGFnZSA/ICd7MH0lJyA6ICd7MH0nKVxuXHQgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSB8fCB0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkUpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGNoYXJ0SWQgPSBtZXRyaWMuaWQ7XG5cblx0XHRcdFx0Ly8gQnVpbGQgbWFpbiBjaGFydCBkYXRhXG5cdFx0XHRcdGNvbnN0IG1haW5DaGFydCA9IHRoaXMuX2NoYXJ0Q29udGFpbmVyLmdldE1haW5DaGFydChjaGFydElkKTtcblx0XHRcdFx0bGV0IG1haW5EUyA9IFtdO1xuXG5cdFx0XHRcdGZvciAobGV0IG10ID0gMDsgbXQgPCBtYWluQ2hhcnQuZGF0YVgubGVuZ3RoOyBtdCsrKVxuXHRcdFx0XHRcdG1haW5EUy5wdXNoKHRoaXMuX2dldENoYXJ0SXRlbShtYWluQ2hhcnQsIG10KSk7XG5cblx0XHRcdFx0Ly8gQXNzaWduIGNoYXJ0IGRhdGEgdG8gY2hhcnRcblx0XHRcdFx0bGV0IHNlcmllcyA9IHRoaXMuX2NoYXJ0LmZpbmRTZXJpZXNCeU5hbWUoJ21haW4nKTtcblx0XHRcdFx0c2VyaWVzLmRhdGEobWFpbkRTKTtcblxuXHRcdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQV9DT01QQVJFKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQnVpbGQgY29tcGFyZSBjaGFydCBkYXRhXG5cdFx0XHRcdFx0Y29uc3QgY29tcENoYXJ0ID0gdGhpcy5fY2hhcnRDb250YWluZXIuZ2V0Q29tcGFyZUNoYXJ0KGNoYXJ0SWQpO1xuXHRcdFx0XHRcdGxldCBjb21wRFMgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAobGV0IG10ID0gMDsgbXQgPCBjb21wQ2hhcnQuZGF0YVgubGVuZ3RoOyBtdCsrKVxuXHRcdFx0XHRcdFx0Y29tcERTLnB1c2godGhpcy5fZ2V0Q2hhcnRJdGVtKGNvbXBDaGFydCwgbXQpKTtcblxuXHRcdFx0XHRcdC8vIFNob3cgY2F0ZWdvcnkgYXhpc1xuXHRcdFx0XHRcdHRoaXMuX2NoYXJ0Lm9wdGlvbnMuY2F0ZWdvcnlBeGlzWzFdLnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly8gQXNzaWduIGNoYXJ0IGRhdGEgdG8gY2hhcnRcblx0XHRcdFx0XHRsZXQgc2VyaWVzID0gdGhpcy5fY2hhcnQuZmluZFNlcmllc0J5TmFtZSgnY29tcGFyZScpO1xuXHRcdFx0XHRcdHNlcmllcy5kYXRhKGNvbXBEUyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY2hhcnQucmVkcmF3KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqIEBwYXJhbSAge2Jvb2xlYW59IGNoZWNrU2VwYXJhdG9yXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gZmlsdGVyRGlzcGxheVZhbHVlMFxuXHQgKi9cblx0ZGlzcGxheUZpbHRlcihmaWx0ZXIsIGNoZWNrU2VwYXJhdG9yLCBmaWx0ZXJEaXNwbGF5VmFsdWUwKVxuXHR7XG5cdFx0dGhpcy5fZmlsdGVyID0gZmlsdGVyO1xuXG5cdFx0aWYgKGZpbHRlci52YWx1ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHRoaXMuZ2V0JCgnI2ZpbHRlck5hbWUnKS50ZXh0KGZpbHRlci5uYW1lKTtcblxuXHRcdFx0bGV0IHZhbHVlcyA9IGNoZWNrU2VwYXJhdG9yID8gZmlsdGVyLnZhbHVlLnNwbGl0KCc6JykgOiBbZmlsdGVyLnZhbHVlXTtcblxuXHRcdFx0aWYgKGZpbHRlckRpc3BsYXlWYWx1ZTAgIT0gbnVsbClcblx0XHRcdFx0dmFsdWVzWzBdID0gZmlsdGVyRGlzcGxheVZhbHVlMDtcblxuXHRcdFx0bGV0IHZhbHVlVHh0ID0gKHZhbHVlc1swXSAhPSAnJyA/IHZhbHVlc1swXSA6ICdbdW5rbm93bl0nKTtcblxuXHRcdFx0aWYgKHZhbHVlcy5sZW5ndGggPiAxKVxuXHRcdFx0XHR2YWx1ZVR4dCArPSAnIDogJyArICh2YWx1ZXNbMV0gIT0gJycgPyB2YWx1ZXNbMV0gOiAnW3Vua25vd25dJyk7XG5cblx0XHRcdHRoaXMuZ2V0JCgnI2ZpbHRlclZhbHVlJykudGV4dCh2YWx1ZVR4dCk7XG5cblx0XHRcdGlmICh2YWx1ZXMubGVuZ3RoID4gMSlcblx0XHRcdFx0dGhpcy5nZXQkKCcjcmVkdWNlRmlsdGVyQnQnKS5zaG93KCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuZ2V0JCgnI3JlZHVjZUZpbHRlckJ0JykuaGlkZSgpO1xuXG5cdFx0XHR0aGlzLmdldCQoJyNmaWx0ZXInKS5zaG93KCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvL2J0X3JlZHVjZUZpbHRlci52aXNpYmxlID0gYnRfcmVkdWNlRmlsdGVyLmluY2x1ZGVJbkxheW91dCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5nZXQkKCcjcmVkdWNlRmlsdGVyQnQnKS5oaWRlKCk7XG5cdFx0XHR0aGlzLmdldCQoJyNmaWx0ZXJOYW1lJykudGV4dCgnJyk7XG5cdFx0XHR0aGlzLmdldCQoJyNmaWx0ZXJWYWx1ZScpLnRleHQoJycpO1xuXHRcdFx0dGhpcy5nZXQkKCcjZmlsdGVyJykuaGlkZSgpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRDaGFydEl0ZW0oY2hhcnRJdGVtRGF0YSwgaW5kZXgpXG5cdHtcblx0XHRsZXQgdmFsdWU7XG5cdFx0bGV0IGZvcm1hdCA9ICcnO1xuXG5cdFx0aWYgKGNoYXJ0SXRlbURhdGEuYmFzZU1ldHJpYy5pc1RpbWUpXG5cdFx0e1xuXHRcdFx0dmFsdWUgPSBtb21lbnQuZHVyYXRpb24oY2hhcnRJdGVtRGF0YS5kYXRhWVtpbmRleF0pLmFzTWludXRlcygpLnRvRml4ZWQoMik7XG5cdFx0XHRmb3JtYXQgPSAnIG1pbnMnO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dmFsdWUgPSBjaGFydEl0ZW1EYXRhLmRhdGFZW2luZGV4XTtcblxuXHRcdFx0aWYgKGNoYXJ0SXRlbURhdGEuYmFzZU1ldHJpYy5pc1BlcmNlbnRhZ2UpXG5cdFx0XHRcdGZvcm1hdCA9ICclJztcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGltZTogY2hhcnRJdGVtRGF0YS5kYXRhWFtpbmRleF0sXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRuYW1lOiBjaGFydEl0ZW1EYXRhLmJhc2VNZXRyaWMubmFtZSxcblx0XHRcdHNob3dIb3VyOiBjaGFydEl0ZW1EYXRhLnRpbWVVbml0ID09ICdISCcsXG5cdFx0XHRmb3JtYXQ6ICd7MH0nICsgZm9ybWF0XG5cdFx0fVxuXHR9XG5cblx0X2dldENoYXJ0QmFzZVVuaXQodGltZVVuaXQpXG5cdHtcblx0XHRzd2l0Y2ggKHRpbWVVbml0KSB7XG5cdFx0XHRjYXNlICdISCc6XG5cdFx0XHRcdHJldHVybiAnaG91cnMnXG5cdFx0XHRjYXNlICdERCc6XG5cdFx0XHRcdHJldHVybiAnZGF5cydcblx0XHRcdGNhc2UgJ1dXJzpcblx0XHRcdFx0cmV0dXJuICd3ZWVrcydcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiAnbW9udGhzJ1xuXHRcdH1cblx0fVxuXG5cdF9vblJlZHVjZUZpbHRlckNsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9maWx0ZXIgIT0gbnVsbCAmJiB0aGlzLl9maWx0ZXIudmFsdWUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLl9maWx0ZXIudmFsdWUuc3BsaXQoJzonKTtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KHRoaXMuX2ZpbHRlci5uYW1lLCB2YWx1ZXNbMF0sIGZhbHNlKSApO1xuXHRcdH1cblx0fVxuXG5cdF9vblJlbW92ZUZpbHRlckNsaWNrKClcblx0e1xuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KG51bGwsIG51bGwsIGZhbHNlKSApO1xuXHR9XG5cblx0X29uV2luZG93UmVzaXplKClcblx0e1xuXHRcdHRoaXMuX2NoYXJ0LnJlZHJhdygpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnbWFpbi1jaGFydCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdtYWluLWNoYXJ0JywgTWFpbkNoYXJ0KTtcbiIsImV4cG9ydCBjbGFzcyBNZXRyaWNEaXNwbGF5U3RhdGVcbntcblx0c3RhdGljIGdldCBFTVBUWSgpIHsgcmV0dXJuICdlbXB0eScgfVxuXHRzdGF0aWMgZ2V0IE1JU1NJTkcoKSB7IHJldHVybiAnbWlzc2luZycgfVxuXHRzdGF0aWMgZ2V0IExPQURJTkcoKSB7IHJldHVybiAnbG9hZGluZycgfVxuXHRzdGF0aWMgZ2V0IERBVEEoKSB7IHJldHVybiAnZGF0YScgfVxuXHRzdGF0aWMgZ2V0IERBVEFfQ09NUEFSRSgpIHsgcmV0dXJuICdkYXRhQ29tcGFyZScgfVxufVxuIiwiaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcblxuZXhwb3J0IGNsYXNzIE1ldHJpY0xpc3RJdGVtIGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdC52YWx1ZSB7XG5cdFx0XHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PGRpdiBpZD1cImNvbnRhaW5lclwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IG15LTFcIj5cblx0XHRcdFx0PGkgaWQ9XCJpY29uXCIgY2xhc3M9XCJmYXMgZmEtY2hhcnQtYXJlYSBtci0xIG10LTEgaWNvbi1pbnZpc2libGVcIj48L2k+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBpZD1cIm5hbWVcIiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgc2hvdy10b29sdGlwXCIgdGl0bGU9XCJcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUtbm90Y2ggZmEtc3BpbiB0ZXh0LXNlY29uZGFyeSBhbGlnbi1taWRkbGUgbG9hZGluZy1zcGlubmVyIG1sLTJcIj48L2k+XG5cdFx0XHRcdFx0XHQ8aSBpZD1cIndhcm5pbmdcIiBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC13YXJuaW5nIHNob3ctdG9vbHRpcCBtbC0yXCIgdGl0bGU9XCJEYXRhIGxvYWRpbmcgaW50ZXJydXB0ZWRcIj48L2k+XG5cdFx0XHRcdFx0XHQ8c3Ryb25nIGNsYXNzPVwibWwtMlwiPjxzcGFuIGlkPVwidmFsdWVcIj48L3NwYW4+PC9zdHJvbmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwib3ZlcmFsbFwiPlxuXHRcdFx0XHRcdFx0PHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPk92ZXJhbGw6IDxzdHJvbmcgaWQ9b3ZlcmFsbFZhbHVlPjwvc3Ryb25nPiA8c3BhbiBpZD1cIm92ZXJhbGxQZXJjXCI+PC9zcGFuPjwvc21hbGw+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwidmVyc3VzXCI+XG5cdFx0XHRcdFx0XHQ8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmcgaWQ9XCJ2YWx1ZTNcIiBjbGFzcz1cIm1ldHJpY01haW5cIj48L3N0cm9uZz5cblx0XHRcdFx0XHRcdFx0PHNwYW4+dnM8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmcgaWQ9XCJ2YWx1ZTRcIiBjbGFzcz1cIm1ldHJpY0NvbXBhcmVcIj48L3N0cm9uZz5cblx0XHRcdFx0XHRcdDwvc21hbGw+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblxuXHRcdC8vIEhpZGUgbG9hZGluZyBzcGlubmVyIGFuZCB3YXJuaW5nXG5cdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdHRoaXMuZ2V0JCgnI3dhcm5pbmcnKS5oaWRlKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIGhlbHAgdG9vbHRpcHNcblx0XHR0aGlzLmdldCQoJyNoZWFkZXInKS5rZW5kb1Rvb2x0aXAoe1xuXHRcdFx0ZmlsdGVyOiAnaVt0aXRsZV0uaGVscCwgLnNob3ctdG9vbHRpcFt0aXRsZV0nLFxuXHRcdFx0cG9zaXRpb246ICdyaWdodCcsXG5cdFx0XHRjb250ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHJldHVybiBgPGRpdiBjbGFzcz0naGVscC10b29sdGlwJz4ke2UudGFyZ2V0LmRhdGEoJ3RpdGxlJyl9PC9kaXY+YDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGdldCBuYW1lKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9uYW1lO1xuXHR9XG5cblx0Z2V0IGhhc0NoYXJ0KClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9oYXNDaGFydDtcblx0fVxuXG5cdGdldCBzdGF0ZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cdH1cblxuXHRzZXQgc3RhdGUodmFsdWUpXG5cdHtcblx0XHRpZiAodmFsdWUgIT0gdGhpcy5zdGF0ZSlcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUpXG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHZhbHVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZSBjaGFuZ2Vcblx0XHRcdHRoaXMuX2hhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gdmlld0lkXG4gXHQgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiBcdCAqIEBwYXJhbSAge2Jvb2xlYW59IGhhc0NoYXJ0XG5cdCAqIEBwYXJhbSAge01ldHJpY30gbU1haW5cblx0ICogQHBhcmFtICB7TWV0cmljfSBtQ29tcGFyZVxuIFx0ICogQHBhcmFtICB7Ym9vbGVhbn0gaXNPdmVydmlld1xuXHQgKi9cblx0aW5pdCh2aWV3SWQsIG5hbWUsIGhhc0NoYXJ0LCBtTWFpbiwgbUNvbXBhcmUsIGlzT3ZlcnZpZXcpXG5cdHtcblx0XHR0aGlzLl92aWV3SWQgPSB2aWV3SWQ7XG5cdFx0dGhpcy5fbmFtZSA9IG5hbWU7XG5cdFx0dGhpcy5faGFzQ2hhcnQgPSBoYXNDaGFydDtcblx0XHR0aGlzLl9tTWFpbiA9IG1NYWluO1xuXHRcdHRoaXMuX21Db21wYXJlID0gbUNvbXBhcmU7XG5cdFx0dGhpcy5pc092ZXJ2aWV3ID0gaXNPdmVydmlldztcblxuXHRcdGNvbnN0IGJhc2VNZXRyaWMgPSBtTWFpbi5iYXNlTWV0cmljO1xuXG5cdFx0Ly8gU2hvdyBpY29uXG5cdFx0aWYgKGhhc0NoYXJ0KVxuXHRcdFx0dGhpcy5nZXQkKCcjaWNvbicpLnJlbW92ZUNsYXNzKCdpY29uLWludmlzaWJsZScpO1xuXG5cdFx0Ly8gU2V0IG5hbWVcblx0XHR0aGlzLmdldCQoJyNuYW1lJykudGV4dChiYXNlTWV0cmljLm5hbWUgKyAnOicpO1xuXG5cdFx0Ly8gU2V0IHRvb2x0aXBcblx0XHR0aGlzLmdldCQoJyNuYW1lJykuYXR0cigndGl0bGUnLCBgPHN0cm9uZz4ke2Jhc2VNZXRyaWMubmFtZX08L3N0cm9uZz48YnIvPiR7YmFzZU1ldHJpYy5kZXNjcmlwdGlvbn1gKTtcblxuXHRcdHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG5cdFx0Ly8gUmVmcmVzaFxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHR0aGlzLmdldCQoJyN2YWx1ZScpLnRleHQoJycpO1xuXHRcdFx0dGhpcy5nZXQkKCcjdmFsdWUnKS5yZW1vdmVDbGFzcygpO1xuXG5cdFx0XHR0aGlzLmdldCQoJyNvdmVyYWxsJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjdmVyc3VzJykuaGlkZSgpO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSB8fCB0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkUpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IHNob3dDb21wYXJlID0gKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRSk7XG5cblx0XHRcdFx0aWYgKHNob3dDb21wYXJlKVxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZlcnN1cycpLnNob3coKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI292ZXJhbGwnKS5zaG93KCk7XG5cblx0XHRcdFx0aWYgKCFzaG93Q29tcGFyZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIFNldCBtYWluIHZhbHVlXG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjdmFsdWUnKS50ZXh0KHRoaXMuX21NYWluLmdldFZhbHVlRlN0cmluZygpKTtcblxuXHRcdFx0XHRcdC8vIFNob3cgcGVyY2VudGFnZSBvZiBvdmVyYWxsIHZhbHVlIChleGNlcHQgaWYgY3VycmVudCB2aWV3IGlzIE92ZXJ2aWV3KVxuXHRcdFx0XHRcdGlmICghdGhpcy5pc092ZXJ2aWV3KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0JCgnI292ZXJhbGxWYWx1ZScpLnRleHQodGhpcy5fbU1haW4uZ2V0VmFsdWVTdHJpbmcoKSk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHBlcmMgPSB0aGlzLl9tTWFpbi5nZXRWYWx1ZUYoKSAvIHRoaXMuX21NYWluLmdldFZhbHVlKCkgKiAxMDA7XG5cdFx0XHRcdFx0XHR0aGlzLmdldCQoJyNvdmVyYWxsUGVyYycpLnRleHQodGhpcy5fbU1haW4uZ2V0VmFsdWUoKSA+IDAgPyBgKCR7cGVyYy50b0ZpeGVkKDIpfSUpYCA6ICcnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5nZXQkKCcjb3ZlcmFsbCcpLmhpZGUoKTtcblxuXHRcdFx0XHRcdC8vIFNldCBzdHlsZVxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlJykuYWRkQ2xhc3MoJ21ldHJpY01haW4gdmFsdWUnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBMYWJlbDogKy8tICUgKHZhbHVlMyB2cyB2YWx1ZTQpXG5cblx0XHRcdFx0XHQvLyBTZXQgbWFpbiB2YWx1ZVxuXHRcdFx0XHRcdGNvbnN0IHZhbE1haW4gPSBNYXRoLm1heCh0aGlzLl9tTWFpbi5nZXRWYWx1ZUYoKSwgMCk7XG5cdFx0XHRcdFx0Y29uc3QgdmFsQ29tcCA9IE1hdGgubWF4KHRoaXMuX21Db21wYXJlLmdldFZhbHVlRigpLCAwKTtcblxuXHRcdFx0XHRcdGxldCBwZXJjMTtcblxuXHRcdFx0XHRcdGlmICh2YWxNYWluID4gMCAmJiB2YWxDb21wID09IDApXG5cdFx0XHRcdFx0XHRwZXJjMSA9IDEwMDtcblx0XHRcdFx0XHRlbHNlIGlmICh2YWxNYWluID09IDAgJiYgdmFsQ29tcCA+IDApXG5cdFx0XHRcdFx0XHRwZXJjMSA9IC0xMDA7XG5cdFx0XHRcdFx0ZWxzZSBpZiAodmFsTWFpbiA9PSAwICYmIHZhbENvbXAgPT0gMClcblx0XHRcdFx0XHRcdHBlcmMxID0gMDtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRwZXJjMSA9ICh2YWxNYWluIC8gdmFsQ29tcCAqIDEwMCkgLSAxMDA7XG5cblx0XHRcdFx0XHR0aGlzLmdldCQoJyN2YWx1ZScpLnRleHQoKHBlcmMxID4gMCA/ICcrJyA6ICcnKSArIHBlcmMxLnRvRml4ZWQoMikgKyAnJScpO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHZlcnN1c1xuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlMycpLnRleHQodGhpcy5fbU1haW4uZ2V0VmFsdWVGU3RyaW5nKCkpO1xuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlNCcpLnRleHQodGhpcy5fbUNvbXBhcmUuZ2V0VmFsdWVGU3RyaW5nKCkpO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHN0eWxlXG5cdFx0XHRcdFx0aWYgKHBlcmMxID4gMClcblx0XHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlJykuYWRkQ2xhc3MoJ3RleHQtc3VjY2VzcyB2YWx1ZScpO1xuXHRcdFx0XHRcdGVsc2UgaWYgKHBlcmMxIDwgMClcblx0XHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlJykuYWRkQ2xhc3MoJ3RleHQtZGFuZ2VyIHZhbHVlJyk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5nZXQkKCcjdmFsdWUnKS5hZGRDbGFzcygndGV4dC1kYXJrIHZhbHVlJyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfaGFuZGxlU3RhdGVDaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLmhpZGUoKTtcblxuXHRcdFx0dGhpcy5nZXQkKCcjY29udGFpbmVyJykucmVtb3ZlQ2xhc3MoJ3Nob3ctcG9pbnRlcicpO1xuXHRcdFx0JCh0aGlzKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHRcdHN3aXRjaCAodGhpcy5zdGF0ZSlcblx0XHRcdHtcblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORzpcblx0XHRcdFx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5zaG93KCk7IC8vIFNob3cgbG9hZGluZyBzcGlubmVyXG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjY29udGFpbmVyJykucmVtb3ZlQ2xhc3MoJ3Nob3ctcG9pbnRlcicpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLnNob3coKTsgLy8gU2hvdyBsb2FkaW5nIGludGVycnVwdGVkIHdhcm5pbmdcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBOlxuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkU6XG5cdFx0XHRcdFx0aWYgKHRoaXMuaGFzQ2hhcnQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGhpcy5nZXQkKCcjY29udGFpbmVyJykuYWRkQ2xhc3MoJ3Nob3ctcG9pbnRlcicpO1xuXHRcdFx0XHRcdFx0JCh0aGlzKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uTWV0cmljQ2xpY2ssIHRoaXMpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vbk1ldHJpY0NsaWNrKClcblx0e1xuXHRcdGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdtZXRyaWMtY2xpY2snLCB7XG5cdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUgLy8gQWxsb3dzIGV2ZW50IHRvIGJ1YmJsZSBvdXRzaWRlIG9mIEN1c3RvbSBFbGVtZW50XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnbWV0cmljLWxpc3QtaXRlbScpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdtZXRyaWMtbGlzdC1pdGVtJywgTWV0cmljTGlzdEl0ZW0pO1xuIiwiaW1wb3J0IHtCYXNlQ2hhcnRWaWV3fSBmcm9tICcuLi9iYXNlLWNoYXJ0LXZpZXcnO1xuaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi4vbWV0cmljLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHtGaWx0ZXJTZXRFdmVudH0gZnJvbSAnLi4vZmlsdGVyLWV2ZW50JztcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgY2xhc3MgVGVjaG5vbG9neUNoYXJ0VmlldyBleHRlbmRzIEJhc2VDaGFydFZpZXdcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSlcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KHRoaXMuX3RhYmxlRGF0YS5kYXRhKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdF9kcmF3Q2hhcnQoY2hhcnREYXRhKVxuXHR7XG5cdFx0Y29uc3QgbWV0cmljID0gdGhpcy5nZXRTZWxlY3RlZE1ldHJpYygpO1xuXG5cdFx0aWYgKGNoYXJ0RGF0YSAhPSBudWxsICYmIGNoYXJ0RGF0YS5sZW5ndGggPiAwICYmIG1ldHJpYyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdHtcblx0XHRcdCBcdGNoYXJ0RGF0YSA9IGNoYXJ0RGF0YS5maWx0ZXIob2JqID0+IHtcblx0XHRcdFx0XHRsZXQgdmFsdWVzID0gdGhpcy5fZmlsdGVyLnZhbHVlLnNwbGl0KCc6Jyk7XG5cblx0XHRcdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9iai5wbGF0Zm9ybSArICc6JyArIG9iai52ZXJzaW9uID09IHRoaXMuX2ZpbHRlci52YWx1ZSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai5wbGF0Zm9ybSA9PSB0aGlzLl9maWx0ZXIudmFsdWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTb3J0IGFuZCBleHRyYWN0IHRvcCAxMCB2YWx1ZXNcblx0XHRcdGxldCBkYXRhID0gY2hhcnREYXRhLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYlttZXRyaWMuaWRdIC0gYVttZXRyaWMuaWRdIH0pLnNsaWNlKDAsIDEwKTtcblxuXHRcdFx0Ly8gSVNTVUUhISEhISEhXG5cdFx0XHQvLyBJZiB0aGUgbWV0cmljIGlkIHN0YXJ0cyB3aXRoIFwiJVwiLCBLZW5kbyBjaGFydCBjcmFzaGVzXG5cdFx0XHQvLyBGb3IgdGhpcyByZWFzb24gaW5zdGVhZCBvZiBzaW1wbHkgc2V0dGluZyB0aGUgc2VyaWVzIGZpZWxkIGFuZCBjYXRlZ29yeSBmaWVsZCwgd2UgbmVlZCB0byByZWJ1aWxkIHRoZSBzZXJpZXMgZGF0YSBpdGVtcyBmcm9tIHRoZSBjaGFydCBkYXRhXG5cdFx0XHQvLyAobm90ZTogZm9yIHRpbWUgbWV0cmljcywgdmFsdWUgaXMgY29udmVydGVkIGZyb20gbWlsbGlzIHRvIG1pbnV0ZXMpXG5cblx0XHRcdGRhdGEgPSBkYXRhLm1hcChvYmogPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHBsYXRmb3JtOiBvYmpbJ3BsYXRmb3JtJ10sXG5cdFx0XHRcdFx0dmVyc2lvbjogb2JqWyd2ZXJzaW9uJ10sXG5cdFx0XHRcdFx0aXRlbTogb2JqWydwbGF0Zm9ybSddICsgKG9ialsndmVyc2lvbiddICE9ICcnID8gJyB8ICcgKyBvYmpbJ3ZlcnNpb24nXSA6ICcnKSxcblx0XHRcdFx0XHR2YWx1ZTogKCFtZXRyaWMuaXNUaW1lID8gb2JqW21ldHJpYy5pZF0gOiBtb21lbnQuZHVyYXRpb24ob2JqW21ldHJpYy5pZF0pLmFzTWludXRlcygpLnRvRml4ZWQoMikpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGRhdGEgc291cmNlXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBjaGFydFxuXHRcdFx0bGV0IHZhbHVlQXhpc1RlbXBsYXRlID0gJyM6IHZhbHVlICMnO1xuXHRcdFx0bGV0IHNlcmllc0Zvcm1hdCA9ICd7MH0nO1xuXG5cdFx0XHRpZiAobWV0cmljLmlzUGVyY2VudGFnZSlcblx0XHRcdHtcblx0XHRcdFx0dmFsdWVBeGlzVGVtcGxhdGUgPSAnIzogdmFsdWUgIyUnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9JSc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChtZXRyaWMuaXNUaW1lKVxuXHRcdFx0e1xuXHRcdFx0XHR2YWx1ZUF4aXNUZW1wbGF0ZSA9ICcjOiB2YWx1ZSAjIG1pbnMnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9IG1pbnMnO1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0T3B0aW9ucyh7XG5cdFx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRcdGhlaWdodDogKGRhdGEubGVuZ3RoICogNDUgKyA1MCksIC8vKCFpc0ZpbHRlcmVkID8gNTAwIDogMTAwKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlcmllczogW3tcblx0XHRcdFx0XHRuYW1lOiBtZXRyaWMubmFtZSxcblx0XHRcdFx0XHRmaWVsZDogJ3ZhbHVlJyxcblx0XHRcdFx0XHRjYXRlZ29yeUZpZWxkOiAnaXRlbScsXG5cdFx0XHRcdFx0Zm9ybWF0OiBzZXJpZXNGb3JtYXRcblx0XHRcdFx0fV0sXG5cdFx0XHRcdHZhbHVlQXhpczoge1xuXHRcdFx0XHRcdG1heDogKG1ldHJpYy5pc1BlcmNlbnRhZ2UgPyAxMDAgOiB1bmRlZmluZWQpLFxuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IHZhbHVlQXhpc1RlbXBsYXRlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2F0ZWdvcnlBeGlzOiBbe1xuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb2JqLmRhdGFJdGVtLnBsYXRmb3JtICsgJ1xcblZlcnNpb246ICcgKyAob2JqLmRhdGFJdGVtLnZlcnNpb24gIT0gJycgPyBvYmouZGF0YUl0ZW0udmVyc2lvbiA6ICdbdW5rbm93bl0nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9XSxcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBTZXQgY2hhcnQgZGF0YSBzb3VyY2Vcblx0XHRcdHRoaXMuX2NoYXJ0LnNldERhdGFTb3VyY2UoZHMpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aGlzLl9jaGFydC5zZXREYXRhU291cmNlKFtdKTtcblx0fVxuXG5cdG9uU2VyaWVzQ2xpY2soZSlcblx0e1xuXHRcdGxldCBwdiA9IGAke2UuZGF0YUl0ZW0ucGxhdGZvcm19OiR7ZS5kYXRhSXRlbS52ZXJzaW9ufWA7XG5cblx0XHRpZiAodGhpcy5fZmlsdGVyID09IG51bGwgfHwgdGhpcy5fZmlsdGVyLnZhbHVlICE9IHB2KVxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCBuZXcgRmlsdGVyU2V0RXZlbnQoJ2NsaWVudCcsIHB2LCB0cnVlKSApO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndGVjaG5vbG9neS1jaGFydC12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3RlY2hub2xvZ3ktY2hhcnQtdmlldycsIFRlY2hub2xvZ3lDaGFydFZpZXcpO1xuIiwiaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBUZWNobm9sb2d5UHJvQWR2IGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0PHN0eWxlPlxuXHRcdFx0LmNhcmQge1xuXHRcdFx0XHRtYXgtd2lkdGg6IDE4cmVtO1xuXHRcdFx0fVxuXHRcdDwvc3R5bGU+XG5cblx0XHQ8ZGl2PlxuXHRcdFx0PGg1IGNsYXNzPVwidGV4dC1jZW50ZXIgbXktM1wiPlVwZ3JhZGUgdG8gPHN0cm9uZz5BbmFseXRpY3MgUHJvPC9zdHJvbmc+IHRvIGVuYWJsZSB0ZWNobm9sb2dpY2FsIHZpZXcgb24gdGhlIG1ldHJpY3MqIGFuZCBnZXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8L2g1PlxuXHRcdFx0PGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC1sZy00XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItbGlnaHQgbXktMyBteC1hdXRvXCI+XG5cdFx0XHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJjYXJkLWltZy10b3BcIiBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuYWx5dGljcy1hZHYvdGVjaG5vbG9neVRhYmxlLnBuZ1wiIGFsdD1cIlRhYnVsYXIgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5WaWV3IG1ldHJpY3MgaW4gdGFidWxhciBmb3JtLCBzcGxpdCBieSBjbGllbnQgcGxhdGZvcm07IGRyaWxsIGRvd24gdG8gY2xpZW50IHZlcnNpb24gYW5kIGZpbHRlciBkYXRhIGluIG9uZSBjbGljay48L3A+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhcmQtaW1nLXRvcFwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5hbHl0aWNzLWFkdi90ZWNobm9sb2d5Q2hhcnQucG5nXCIgYWx0PVwiVG9wIGNsaWVudHNcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+VmlldyB0b3AgY2xpZW50IHBsYXRmb3JtcyBjaGFydCBmb3IgZWFjaCBtZXRyaWM7IGRyaWxsIGRvd24gdG8gY2xpZW50IHZlcnNpb24gYW5kIGZpbHRlciBkYXRhIGluIG9uZSBjbGljay48L3A+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhcmQtaW1nLXRvcFwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5hbHl0aWNzLWFkdi90ZWNobm9sb2d5RmlsdGVyLnBuZ1wiIGFsdD1cIkZpbHRlciBieSBjbGllbnQgdHlwZVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5GaWx0ZXIgbWV0cmljcyBieSBjbGllbnQgdHlwZSwgZ2V0dGluZyB0aGUgYWJzb2x1dGUgdmFsdWUgYW5kIHRoZSAlIHdpdGggcmVzcGVjdCB0byB0aGUgb3ZlcmFsbCB2YWx1ZS48L3A+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhcmQtaW1nLXRvcFwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5hbHl0aWNzLWFkdi9jb21wYXJlLnBuZ1wiIGFsdD1cIkNvbXBhcmUgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5Db21wYXJlIGRhdGEgcmFuZ2VzIGFuZCBnZXQgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVzZXJzIGJlaGF2aW9yIGluIGRpZmZlcmVudCB0aW1lIHBlcmlvZHMsIG92ZXJhbGwgYW5kIGJ5IGNsaWVudCBwbGF0Zm9ybS92ZXJzaW9uLjwvcD5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNiBjb2wtbGctNFwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLWxpZ2h0IG15LTMgbXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHQ8aW1nIGNsYXNzPVwiY2FyZC1pbWctdG9wXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmFseXRpY3MtYWR2L3RlY2hub2xvZ3lDb21wYXJlLnBuZ1wiIGFsdD1cIkNvbXBhcmUgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5Db21wYXJlIGRhdGEgcmFuZ2VzIGFuZCBnZXQgcGVyIG1ldHJpYyBiZWhhdmlvciBvdmVyIGRpZmZlcmVudCB0aW1lIHBlcmlvZHMsIG92ZXJhbGwgYW5kIGJ5IGNsaWVudCBwbGF0Zm9ybS92ZXJzaW9uLjwvcD5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxoNSBjbGFzcz1cIm10LTIgbWItMyB0ZXh0LWNlbnRlclwiPjxhIGhyZWY9XCJodHRwczovL3d3dy5zbWFydGZveHNlcnZlci5jb20vc2hvcC9pbmRleC5waHA/ZGlzcGF0Y2g9cHJvZHVjdHMudmlldyZwcm9kdWN0X2lkPTMxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+Q2xpY2sgaGVyZSB0byB1cGdyYWRlPC9hPjwvaDU+XG5cdFx0XHQ8cCBjbGFzcz1cInRleHQtY2VudGVyIG15LTBcIj48c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+KiBBdmFpbGFibGUgbWV0cmljczogVmlzaXRzIHwgVW5pcXVlIHZpc2l0b3JzIHwgTmV3IHZpc2l0b3JzIHwgTmV3IHZpc2l0cyAlIHwgQXZnLiB2aXNpdCBkdXJhdGlvbjwvc21hbGw+PC9wPlxuXHRcdDwvZGl2PlxuXHRcdGA7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCd0ZWNobm9sb2d5LXByby1hZHYnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgndGVjaG5vbG9neS1wcm8tYWR2JywgVGVjaG5vbG9neVByb0Fkdik7XG4iLCJpbXBvcnQge0Jhc2VUYWJsZVZpZXd9IGZyb20gJy4uL2Jhc2UtdGFibGUtdmlldyc7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi4vbWV0cmljLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHtNZXRyaWNzTWFuYWdlcn0gZnJvbSAnLi4vLi4vLi4vLi4vbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tZXRyaWNzLW1hbmFnZXInO1xuaW1wb3J0IHtGaWx0ZXJTZXRFdmVudH0gZnJvbSAnLi4vZmlsdGVyLWV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRlY2hub2xvZ3lUYWJsZVZpZXcgZXh0ZW5kcyBCYXNlVGFibGVWaWV3XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEEpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJWYWx1ZXMgPSBpc0ZpbHRlcmVkID8gdGhpcy5fZmlsdGVyLnZhbHVlLnNwbGl0KCc6JykgOiBbXTtcblxuXHRcdFx0XHQvLyBJZiBmaWx0ZXIgaXMgc2V0IGFuZCBoYXMgbXVsdGlwbGUgdmFsdWVzLCBkaXNhYmxlIGdyaWQgc2VsZWN0aW9uXG5cdFx0XHRcdHRoaXMuc2V0VGFibGVTZWxlY3RhYmxlKCEoaXNGaWx0ZXJlZCAmJiBmaWx0ZXJWYWx1ZXMubGVuZ3RoID4gMSkpO1xuXG5cdFx0XHRcdC8vIFNldCBmaWx0ZXJpbmdcblx0XHRcdFx0Y29uc3QgZHNGaWx0ZXIgPSBbXTtcblxuXHRcdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRzRmlsdGVyLnB1c2goe1xuXHRcdFx0XHRcdFx0ZmllbGQ6ICdwbGF0Zm9ybScsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogZmlsdGVyVmFsdWVzWzBdXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoZmlsdGVyVmFsdWVzLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0ZHNGaWx0ZXIucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGZpZWxkOiAndmVyc2lvbicsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogZmlsdGVyVmFsdWVzWzFdXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBc3NpZ24gZGF0YXByb3ZpZGVyIHRvIGdyaWRcblx0XHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdFx0ZmlsdGVyOiBkc0ZpbHRlcixcblx0XHRcdFx0XHRzb3J0OiB7XG5cdFx0XHRcdFx0XHRmaWVsZDogJ3Zpc2l0cycsXG5cdFx0XHRcdFx0XHRkaXI6ICdkZXNjJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZGF0YTogdGhpcy5fdGFibGVEYXRhLmRhdGEsXG5cdFx0XHRcdFx0Z3JvdXA6IHtcblx0XHRcdFx0XHRcdGZpZWxkOiAncGxhdGZvcm0nLCBhZ2dyZWdhdGVzOiBbXG5cdFx0XHRcdFx0XHRcdHtmaWVsZDogJ3ZlcnNpb24nLCBhZ2dyZWdhdGU6ICdjb3VudCd9LFxuXHRcdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHRcdHtmaWVsZDogTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLCBhZ2dyZWdhdGU6ICdzdW0nfSxcblx0XHRcdFx0XHRcdFx0e2ZpZWxkOiBNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMsIGFnZ3JlZ2F0ZTogJ3N1bSd9LFxuXHRcdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTiwgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHRdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogW1xuXHRcdFx0XHRcdFx0e2ZpZWxkOiAndmVyc2lvbicsIGFnZ3JlZ2F0ZTogJ2NvdW50J30sXG5cdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTiwgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdFx0XHRcdC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBncm91cCBoZWFkZXIgcm93c1xuXHRcdFx0XHR0aGlzLmdldCQoJyNncmlkJykuZmluZCgnLmstZ3JvdXBpbmctcm93Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkdyb3VwSGVhZGVyQ2xpY2ssIHRoaXMpKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fZ3JpZC5zZXREYXRhU291cmNlKFtdKTtcblx0XHR9XG5cdH1cblxuXHRfb25Hcm91cEhlYWRlckNsaWNrKGUpXG5cdHtcblx0XHQvLyBJZiBleHBhbmQvY29sbGFwc2UgaWNvbiBpcyBjbGlja2VkLCBkbyBub3QgZmlyZSBldmVudFxuXHRcdGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2staWNvbicpKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXHRcdFx0Y29uc3QgcGxhdGZvcm0gPSAkKGUuY3VycmVudFRhcmdldCkuZmluZCgnLmdyb3VwLWhlYWRlcicpLmF0dHIoJ2RhdGEtcGxhdGZvcm0nKTtcblxuXHRcdFx0aWYgKCFpc0ZpbHRlcmVkICYmIHBsYXRmb3JtKVxuXHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIG5ldyBGaWx0ZXJTZXRFdmVudCgnY2xpZW50JywgcGxhdGZvcm0sIHRydWUpICk7XG5cdFx0fVxuXHR9XG5cblx0b25JdGVtQ2xpY2soKVxuXHR7XG5cdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fZ3JpZC5kYXRhSXRlbSh0aGlzLl9ncmlkLnNlbGVjdCgpKTtcblxuXHRcdGlmIChkYXRhSXRlbSAhPSBudWxsKVxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCBuZXcgRmlsdGVyU2V0RXZlbnQoJ2NsaWVudCcsIGAke2RhdGFJdGVtLnBsYXRmb3JtfToke2RhdGFJdGVtLnZlcnNpb259YCwgdHJ1ZSkgKTtcblx0fVxuXG5cdGNvbmZpZ3VyZUNvbHVtbnMoKVxuXHR7XG5cdFx0dGhpcy5fZ3JpZC5zZXRPcHRpb25zKHtcblx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdGZpZWxkOiAncGxhdGZvcm0nLFxuXHRcdFx0XHR0aXRsZTogJ1BsYXRmb3JtJyxcblx0XHRcdFx0Z3JvdXBIZWFkZXJUZW1wbGF0ZTogJzxzcGFuIGNsYXNzPVwiZ3JvdXAtaGVhZGVyXCIgZGF0YS1wbGF0Zm9ybT1cIiM9dmFsdWUjXCI+Iz12YWx1ZSM8L3NwYW4+Jyxcblx0XHRcdFx0aGlkZGVuOiB0cnVlLFxuXHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRpZiAoZGF0YUl0ZW0ucGxhdGZvcm0gPT0gJycpXG5cdFx0XHRcdFx0XHRyZXR1cm4gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLnBsYXRmb3JtO1xuXHRcdFx0XHR9XG5cdFx0XHR9LHtcblx0XHRcdFx0ZmllbGQ6ICd2ZXJzaW9uJyxcblx0XHRcdFx0dGl0bGU6ICdQbGF0Zm9ybSAvIFZlcnNpb24nLFxuXHRcdFx0XHR3aWR0aDogMjAwLFxuXHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRpZiAoZGF0YUl0ZW0udmVyc2lvbiA9PSAnJylcblx0XHRcdFx0XHRcdHJldHVybiAnW3Vua25vd25dJztcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gZGF0YUl0ZW0udmVyc2lvbjtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdWaXNpdHMnLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5WSVNJVFMsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlZJU0lUUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFnZ3JlZ2F0ZXM6IFsnc3VtJ10sXG5cdFx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtVmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUyxcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuVklTSVRTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0XHRncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiB0aGlzLmdldEFnZ3JTdW1QZXJjZW50YWdlQ29sVGVtcGxhdGUxKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlZJU0lUUykpXG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ1VuaXF1ZSB2aXNpdG9ycycsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0XHRncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiB0aGlzLmdldEFnZ3JTdW1WYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHR9LHtcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhZ2dyZWdhdGVzOiBbJ3N1bSddLFxuXHRcdFx0XHRcdGdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGU6IHRoaXMuZ2V0QWdnclN1bVBlcmNlbnRhZ2VDb2xUZW1wbGF0ZTEodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTKSlcblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnTmV3IHZpc2l0b3JzJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTLFxuXHRcdFx0XHRcdHRpdGxlOiAnVG90YWwnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0VmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhZ2dyZWdhdGVzOiBbJ3N1bSddLFxuXHRcdFx0XHRcdGdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGU6IHRoaXMuZ2V0QWdnclN1bVZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdH0se1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdPdmVyYWxsICUnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFnZ3JlZ2F0ZXM6IFsnc3VtJ10sXG5cdFx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtUGVyY2VudGFnZUNvbFRlbXBsYXRlMSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMpKVxuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdOZXcgdmlzaXRzICUnLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSxcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzEpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiAnJm1kYXNoOydcblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSkpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGU6ICcmbWRhc2g7J1xuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdBdmcgdmlzaXQgZHVyYXRpb24nLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5BVkdfVklTSVRfRFVSQVRJT04sXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTikpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFnZ3JlZ2F0ZXM6IFsnc3VtJ10sXG5cdFx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtVmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5BVkdfVklTSVRfRFVSQVRJT04pKSxcblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0XHRncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiB0aGlzLmdldEFnZ3JTdW1QZXJjZW50YWdlQ29sVGVtcGxhdGUxKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTikpXG5cdFx0XHRcdH1dXG5cdFx0XHR9XVxuXHRcdH0pO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndGVjaG5vbG9neS10YWJsZS12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3RlY2hub2xvZ3ktdGFibGUtdmlldycsIFRlY2hub2xvZ3lUYWJsZVZpZXcpO1xuIiwiaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcblxuZXhwb3J0IGNsYXNzIFRpbnlWaXNpdHNDaGFydCBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiY29udGFpbmVyXCI+XG5cdFx0XHRcdDxkaXYgaWQ9XCJsb2FkaW5nXCI+XG5cdFx0XHRcdFx0PHNwYW4+JSBvZiB2aXNpdHM6PC9zcGFuPlxuXHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXIgbWwtMlwiPjwvaT5cblx0XHRcdFx0XHQ8aSBpZD1cIndhcm5pbmdcIiBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC13YXJuaW5nIHNob3ctdG9vbHRpcCBtbC0yXCIgdGl0bGU9XCJEYXRhIGxvYWRpbmcgaW50ZXJydXB0ZWRcIj48L2k+XG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDxkaXYgaWQ9XCJjaGFydHNcIiBjbGFzcz1cInNob3ctcG9pbnRlclwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWFpblBpZVwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBpZD1cIm1haW5WaXNpdHNcIiBjbGFzcz1cIm1sLTFcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4+JSBvZiB2aXNpdHM6IDxzdHJvbmcgaWQ9XCJtYWluVmFsdWVcIiBjbGFzcz1cIm1ldHJpY01haW5cIj48L3N0cm9uZz48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgaWQ9XCJjb21wVmlzaXRzXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBpZD1cImNvbXBQaWVcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1sLTFcIj5DaGFuZ2UgaW4gJSBvZiB2aXNpdHM6IDxzdHJvbmcgaWQ9XCJjb21wVmFsdWVcIj48L3N0cm9uZz48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDxkaXYgaWQ9XCJkZXRhaWxzXCI+XG5cdFx0XHRcdFx0PHNtYWxsIGlkPVwibWFpbkRldGFpbHNcIj5cblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZSBmYS14cyBtZXRyaWNNYWluXCI+PC9pPlxuXHRcdFx0XHRcdFx0PHNwYW4gaWQ9XCJtYWluUmFuZ2VcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIj5cblx0XHRcdFx0XHRcdFx0PHN0cm9uZyBpZD1cIm1haW5QZXJjXCIgY2xhc3M9XCJtZXRyaWNNYWluXCI+PC9zdHJvbmc+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIGlkPVwibWFpblZhbHVlc1wiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvc21hbGw+XG5cdFx0XHRcdFx0PGJyPlxuXHRcdFx0XHRcdDxzbWFsbCBpZD1cImNvbXBEZXRhaWxzXCI+XG5cdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUgZmEteHMgbWV0cmljQ29tcGFyZVwiPjwvaT5cblx0XHRcdFx0XHRcdDxzcGFuIGlkPVwiY29tcFJhbmdlXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCI+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmcgaWQ9XCJjb21wUGVyY1wiIGNsYXNzPVwibWV0cmljQ29tcGFyZVwiPjwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBpZD1cImNvbXBWYWx1ZXNcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L3NtYWxsPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLyBIaWRlIGxvYWRpbmcgc3Bpbm5lciBhbmQgd2FybmluZ1xuXHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJyN3YXJuaW5nJykuaGlkZSgpO1xuXG5cdFx0Ly8gSGlkZSBjaGFydHMgYW5kIGRldGFpbHMgc2VjdGlvblxuXHRcdHRoaXMuZ2V0JCgnI2NoYXJ0cycpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJyNkZXRhaWxzJykuaGlkZSgpO1xuXG5cdFx0Ly8gQWRkIGNsaWNrIGxpc3RlbmVyXG5cdFx0dGhpcy5nZXQkKCcjY2hhcnRzJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIHBpZSBjaGFydHNcblx0XHR0aGlzLl9tYWluUGllID0gdGhpcy5nZXQkKCcjbWFpblBpZScpLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuXHRcdFx0bGVnZW5kOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFydEFyZWE6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogMjQsXG5cdFx0XHRcdGhlaWdodDogMjRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuICAgICAgICAgICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG5cdFx0XHRcdGhpZ2hsaWdodDoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG92ZXJsYXk6IHtcblx0XHRcdFx0XHRncmFkaWVudDogJ25vbmUnXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyaWVzOiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwaWUnLFxuXHRcdFx0XHRwYWRkaW5nOiAtNCxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiA5MCxcblx0XHRcdFx0ZmllbGQ6ICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ25hbWUnLFxuICAgICAgICAgICAgfV0sXG5cdFx0XHRzZXJpZXNDb2xvcnM6IFsnIzMzOTlmZicsICcjY2NjJ10sXG4gICAgICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXG5cdFx0dGhpcy5fY29tcFBpZSA9IHRoaXMuZ2V0JCgnI2NvbXBQaWUnKS5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcblx0XHRcdGxlZ2VuZDoge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhcnRBcmVhOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDI0LFxuXHRcdFx0XHRoZWlnaHQ6IDI0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcbiAgICAgICAgICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuXHRcdFx0XHRoaWdobGlnaHQ6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyaWVzOiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwaWUnLFxuXHRcdFx0XHRwYWRkaW5nOiAtNCxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiA5MCxcblx0XHRcdFx0ZmllbGQ6ICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRvdmVybGF5OiB7XG5cdFx0XHRcdFx0Z3JhZGllbnQ6ICdub25lJ1xuXHRcdFx0XHR9LFxuICAgICAgICAgICAgfV0sXG5cdFx0XHRzZXJpZXNDb2xvcnM6IFsnI2ZmOTkwMCcsICcjY2NjJ10sXG4gICAgICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXHR9XG5cblx0Z2V0IHN0YXRlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnc3RhdGUnKTtcblx0fVxuXG5cdHNldCBzdGF0ZSh2YWx1ZSlcblx0e1xuXHRcdGlmICh2YWx1ZSAhPSB0aGlzLnN0YXRlKVxuXHRcdHtcblx0XHRcdGlmICh2YWx1ZSlcblx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoJ3N0YXRlJywgdmFsdWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnc3RhdGUnKTtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlIGNoYW5nZVxuXHRcdFx0dGhpcy5faGFuZGxlU3RhdGVDaGFuZ2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7c3RyaW5nfSB2aWV3SWRcblx0ICogQHBhcmFtICB7TWV0cmljfSBtTWFpblxuXHQgKiBAcGFyYW0gIHtNZXRyaWN9IG1Db21wYXJlXG5cdCAqL1xuXHRpbml0KHZpZXdJZCwgbU1haW4sIG1Db21wYXJlKVxuXHR7XG5cdFx0dGhpcy5fdmlld0lkID0gdmlld0lkO1xuXHRcdHRoaXMuX21NYWluID0gbU1haW47XG5cdFx0dGhpcy5fbUNvbXBhcmUgPSBtQ29tcGFyZTtcblxuXHRcdHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG5cdFx0Ly8gUmVmcmVzaFxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHQvLyBBbHdheXMgaGlkZSBkZXRhaWxzXG5cdFx0XHR0aGlzLmdldCQoJyNkZXRhaWxzJykuaGlkZSgpO1xuXG5cdFx0XHR0aGlzLmdldCQoJyNtYWluVmlzaXRzJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjY29tcFZpc2l0cycpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnI2NvbXBEZXRhaWxzJykuaGlkZSgpO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSB8fCB0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkUpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IHNob3dDb21wYXJlID0gKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRSk7XG5cblx0XHRcdFx0Ly8gU2V0dXAgaW50ZXJmYWNlXG5cdFx0XHRcdGlmIChzaG93Q29tcGFyZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI2NvbXBWaXNpdHMnKS5zaG93KCk7XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjY29tcERldGFpbHMnKS5zaG93KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI21haW5WaXNpdHMnKS5zaG93KCk7XG5cblx0XHRcdFx0Ly8gU2hvdyBtYWluIHJhbmdlXG5cdFx0XHRcdGNvbnN0IG1haW5QZXJjID0gKHRoaXMuX21NYWluLmdldFZhbHVlKCkgPT0gMCA/IDEwMCA6ICh0aGlzLl9tTWFpbi5nZXRWYWx1ZUYoKSAvIHRoaXMuX21NYWluLmdldFZhbHVlKCkgKiAxMDApKTtcblx0XHRcdFx0dGhpcy5fbWFpblBpZS5zZXREYXRhU291cmNlKFt7bmFtZTonc2VsZWN0ZCcsIHZhbHVlOm1haW5QZXJjfSwge25hbWU6J290aGVyJywgdmFsdWU6KDEwMCAtIG1haW5QZXJjKX1dKTtcblx0XHRcdFx0dGhpcy5nZXQkKCcjbWFpblZhbHVlJykudGV4dChtYWluUGVyYy50b0ZpeGVkKDIpICsgJyUnKTtcblx0XHRcdFx0dGhpcy5nZXQkKCcjbWFpblBlcmMnKS50ZXh0KG1haW5QZXJjLnRvRml4ZWQoMikgKyAnJScpO1xuXHRcdFx0XHR0aGlzLmdldCQoJyNtYWluUmFuZ2UnKS50ZXh0KHRoaXMuX21NYWluLmdldFJhbmdlU3RyaW5nKCkpO1xuXHRcdFx0XHR0aGlzLmdldCQoJyNtYWluVmFsdWVzJykudGV4dChgKCR7dGhpcy5fbU1haW4uZ2V0VmFsdWVGKCl9IG9mICR7dGhpcy5fbU1haW4uZ2V0VmFsdWUoKX0pYCk7XG5cblx0XHRcdFx0Ly8gU2hvdyBjb21wYXJlZCByYW5nZVxuXHRcdFx0XHRpZiAoc2hvd0NvbXBhcmUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBjb21wYXJlUGVyYyA9ICh0aGlzLl9tQ29tcGFyZS5nZXRWYWx1ZSgpID09IDAgPyAxMDAgOiAodGhpcy5fbUNvbXBhcmUuZ2V0VmFsdWVGKCkgLyB0aGlzLl9tQ29tcGFyZS5nZXRWYWx1ZSgpICogMTAwKSk7XG5cdFx0XHRcdFx0dGhpcy5fY29tcFBpZS5zZXREYXRhU291cmNlKFt7bmFtZTonc2VsZWN0ZCcsIHZhbHVlOmNvbXBhcmVQZXJjfSwge25hbWU6J290aGVyJywgdmFsdWU6KDEwMCAtIGNvbXBhcmVQZXJjKX1dKTtcblxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gbWFpblBlcmMgLSBjb21wYXJlUGVyYztcblx0XHRcdFx0XHR0aGlzLmdldCQoJyNjb21wVmFsdWUnKS50ZXh0KCh2YWx1ZSA+IDAgPyAnKycgOiAnJykgKyB2YWx1ZS50b0ZpeGVkKDIpICsgJyUnKTtcblxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI2NvbXBSYW5nZScpLnRleHQodGhpcy5fbUNvbXBhcmUuZ2V0UmFuZ2VTdHJpbmcoKSk7XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjY29tcFBlcmMnKS50ZXh0KGNvbXBhcmVQZXJjLnRvRml4ZWQoMikgKyAnJScpO1xuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI2NvbXBWYWx1ZXMnKS50ZXh0KGAoJHt0aGlzLl9tQ29tcGFyZS5nZXRWYWx1ZUYoKX0gb2YgJHt0aGlzLl9tQ29tcGFyZS5nZXRWYWx1ZSgpfSlgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdGF0ZUNoYW5nZSgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHR0aGlzLmdldCQoJyNsb2FkaW5nJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnI2NoYXJ0cycpLmhpZGUoKTtcblxuXHRcdFx0c3dpdGNoICh0aGlzLnN0YXRlKVxuXHRcdFx0e1xuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HOlxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI2xvYWRpbmcnKS5zaG93KCk7XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgc3Bpbm5lclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjbG9hZGluZycpLnNob3coKTtcblx0XHRcdFx0XHR0aGlzLmdldCQoJyN3YXJuaW5nJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgaW50ZXJydXB0ZWQgd2FybmluZ1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEE6XG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRTpcblx0XHRcdFx0XHR0aGlzLmdldCQoJyNjaGFydHMnKS5zaG93KCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNsaWNrKClcblx0e1xuXHRcdC8vIFNob3cvaGlkZSBkZXRhaWxzXG5cdFx0dGhpcy5nZXQkKCcjZGV0YWlscycpLnRvZ2dsZSgpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndGlueS12aXNpdHMtY2hhcnQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgndGlueS12aXNpdHMtY2hhcnQnLCBUaW55VmlzaXRzQ2hhcnQpO1xuIiwiaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcblxuZXhwb3J0IGNsYXNzIFZpc2l0b3JzQ2hhcnQgZXh0ZW5kcyBBbmFseXRpY3NCYXNlRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHQvLyBBZGQgaHRtbCB0byBzaGFkb3dSb290IGRlZmluZWQgaW4gcGFyZW50IGNsYXNzIChBbmFseXRpY3NCYXNlRWxlbWVudClcblx0XHR0aGlzLnNoYWRvd1Jvb3QuaW5uZXJIVE1MICs9IGBcblx0XHRcdDxzdHlsZT5cblx0XHRcdFx0LmRvdCB7XG5cdFx0XHRcdFx0dmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuXHRcdFx0XHRcdGNvbG9yOiAjY2NjO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LnZpc2l0cyB7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IC44cmVtO1xuXHRcdFx0XHR9XG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiY29udGFpbmVyXCIgY2xhc3M9XCJyb3cgbm8tZ3V0dGVycyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG5cdFx0XHRcdFx0PGRpdiBpZD1cInBpZUNoYXJ0XCIgY2xhc3M9XCJtci0yXCI+PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sXCI+XG5cdFx0XHRcdFx0PGRpdiBpZD1cIm5ld1Zpc2l0b3JzXCIgY2xhc3M9XCJkLWlubGluZS1ibG9jayBtci0yXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdFx0XHQ8c21hbGwgY2xhc3M9XCJkb3RcIj48aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUgZmEteHMgdG8tYmUtc3R5bGVkXCI+PC9pPjwvc21hbGw+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIGlkPVwibmV3VmlzaXRvcnNMYWJlbFwiIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCBzaG93LXRvb2x0aXBcIiB0aXRsZT1cIlwiPk5ldyB2aXNpdG9yczo8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXIgbWwtMlwiPjwvaT5cblx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtd2FybmluZyBtaXNzaW5nLXdhcm5pbmcgc2hvdy10b29sdGlwIG1sLTJcIiB0aXRsZT1cIkRhdGEgbG9hZGluZyBpbnRlcnJ1cHRlZFwiPjwvaT5cblx0XHRcdFx0XHRcdFx0PHN0cm9uZyBjbGFzcz1cIm1sLTJcIj48c3BhbiBpZD1cIm5ld1Zpc2l0b3JzUGVyY1wiIGNsYXNzPVwidG8tYmUtc3R5bGVkXCI+PC9zcGFuPjwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidmlzaXRzXCI+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZSBmYS14cyBpY29uLWludmlzaWJsZVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0PHNtYWxsIGlkPVwibmV3VmlzVmlzaXRzVmFsdWVNYWluXCI+PC9zbWFsbD5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgaWQ9XCJyZXRWaXNpdG9yc1wiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIj5cblx0XHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHRcdDxzbWFsbCBjbGFzcz1cImRvdFwiPjxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZSBmYS14c1wiPjwvaT48L3NtYWxsPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBpZD1cInJldFZpc2l0b3JzTGFiZWxcIiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgc2hvdy10b29sdGlwXCIgdGl0bGU9XCJcIj5SZXR1cm5pbmcgdmlzaXRvcnM6PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUtbm90Y2ggZmEtc3BpbiB0ZXh0LXNlY29uZGFyeSBhbGlnbi1taWRkbGUgbG9hZGluZy1zcGlubmVyIG1sLTJcIj48L2k+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZSB0ZXh0LXdhcm5pbmcgbWlzc2luZy13YXJuaW5nIHNob3ctdG9vbHRpcCBtbC0yXCIgdGl0bGU9XCJEYXRhIGxvYWRpbmcgaW50ZXJydXB0ZWRcIj48L2k+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmcgY2xhc3M9XCJtbC0yXCI+PHNwYW4gaWQ9XCJyZXRWaXNpdG9yc1BlcmNcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj48L3NwYW4+PC9zdHJvbmc+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ2aXNpdHNcIj5cblx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtY2lyY2xlIGZhLXhzIGljb24taW52aXNpYmxlXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHQ8c21hbGwgaWQ9XCJyZXRWaXNWaXNpdHNWYWx1ZU1haW5cIj48L3NtYWxsPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2NvbnRhaW5lcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwaWUgY2hhcnRcblx0XHR0aGlzLl9waWVDaGFydCA9IHRoaXMuZ2V0JCgnI3BpZUNoYXJ0Jykua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoYXJ0QXJlYToge1xuICAgICAgICAgICAgICAgIHdpZHRoOiA1MCxcblx0XHRcdFx0aGVpZ2h0OiA1MFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcmllc0RlZmF1bHRzOiB7XG4gICAgICAgICAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcblx0XHRcdFx0aGlnaGxpZ2h0OiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0b3ZlcmxheToge1xuXHRcdFx0XHRcdGdyYWRpZW50OiAnbm9uZSdcblx0XHRcdFx0fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXJpZXM6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3BpZScsXG5cdFx0XHRcdHBhZGRpbmc6IC00LFxuICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGU6IDAsXG5cdFx0XHRcdGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICd0eXBlJyxcbiAgICAgICAgICAgIH1dLFxuXHRcdFx0c2VyaWVzQ29sb3JzOiBbKCF0aGlzLmNvbXBhcmUgPyAnIzMzOTlmZicgOiAnI2ZmOTkwMCcpLCAnI2NjYyddLCAvLyBDb25kaXRpb25hbCBzdHlsaW5nXG4gICAgICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXG5cdFx0Ly8gU2V0IGNvbmRpdGlvbmFsIHN0eWxpbmdcblx0XHR0aGlzLmdldCQoJy50by1iZS1zdHlsZWQnKS5hZGRDbGFzcyghdGhpcy5jb21wYXJlID8gJ21ldHJpY01haW4nIDogJ21ldHJpY0NvbXBhcmUnKTtcblx0fVxuXG5cdGdldCBjb21wYXJlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnY29tcGFyZScpID09ICd0cnVlJztcblx0fVxuXG5cdHNldCBjb21wYXJlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlKVxuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoJ2NvbXBhcmUnLCB2YWx1ZSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2NvbXBhcmUnKTtcblx0fVxuXG5cdGdldCBzdGF0ZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cdH1cblxuXHRzZXQgc3RhdGUodmFsdWUpXG5cdHtcblx0XHRpZiAodmFsdWUgIT0gdGhpcy5zdGF0ZSlcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUpXG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHZhbHVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZSBjaGFuZ2Vcblx0XHRcdHRoaXMuX2hhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gdmlld0lkXG5cdCAqIEBwYXJhbSAge01ldHJpY30gbmV3VmlzaXRvcnNQZXJjXG5cdCAqIEBwYXJhbSAge01ldHJpY30gcmV0VmlzaXRvcnNQZXJjXG5cdCAqIEBwYXJhbSAge01ldHJpY30gbmV3VmlzVmlzaXRzXG5cdCAqIEBwYXJhbSAge01ldHJpY30gcmV0VmlzVmlzaXRzXG5cdCAqL1xuXHRpbml0KHZpZXdJZCwgbmV3VmlzaXRvcnNQZXJjLCByZXRWaXNpdG9yc1BlcmMsIG5ld1Zpc1Zpc2l0cywgcmV0VmlzVmlzaXRzKVxuXHR7XG5cdFx0dGhpcy5fdmlld0lkID0gdmlld0lkO1xuXHRcdHRoaXMuX25ld1Zpc2l0b3JzUGVyYyA9IG5ld1Zpc2l0b3JzUGVyYztcblx0XHR0aGlzLl9yZXRWaXNpdG9yc1BlcmMgPSByZXRWaXNpdG9yc1BlcmM7XG5cdFx0dGhpcy5fbmV3VmlzVmlzaXRzID0gbmV3VmlzVmlzaXRzO1xuXHRcdHRoaXMuX3JldFZpc1Zpc2l0cyA9IHJldFZpc1Zpc2l0cztcblxuXHRcdC8vIFNldCB0b29sdGlwIGNvbnRlbnRcblx0XHRjb25zdCBtMSA9IHRoaXMuX3JldFZpc2l0b3JzUGVyYy5iYXNlTWV0cmljO1xuXHRcdGNvbnN0IG0yID0gdGhpcy5fcmV0VmlzVmlzaXRzLmJhc2VNZXRyaWM7XG5cdFx0dGhpcy5nZXQkKCcjcmV0VmlzaXRvcnNMYWJlbCcpLmF0dHIoJ3RpdGxlJywgYDxzdHJvbmc+JHttMS5uYW1lfTwvc3Ryb25nPjxicj48c3Bhbj4ke20xLmRlc2NyaXB0aW9ufTxzcGFuPjxicj48YnI+PHN0cm9uZz4ke20yLm5hbWV9PC9zdHJvbmc+PGJyPjxzcGFuPiR7bTIuZGVzY3JpcHRpb259PHNwYW4+PGJyPjxicj5gKTtcblxuXHRcdGNvbnN0IG0zID0gdGhpcy5fbmV3VmlzaXRvcnNQZXJjLmJhc2VNZXRyaWM7XG5cdFx0Y29uc3QgbTQgPSB0aGlzLl9uZXdWaXNWaXNpdHMuYmFzZU1ldHJpYztcblx0XHR0aGlzLmdldCQoJyNuZXdWaXNpdG9yc0xhYmVsJykuYXR0cigndGl0bGUnLCBgPHN0cm9uZz4ke20zLm5hbWV9PC9zdHJvbmc+PGJyPjxzcGFuPiR7bTMuZGVzY3JpcHRpb259PHNwYW4+PGJyPjxicj48c3Ryb25nPiR7bTQubmFtZX08L3N0cm9uZz48YnI+PHNwYW4+JHttNC5kZXNjcmlwdGlvbn08c3Bhbj48YnI+PGJyPmApO1xuXG5cdFx0dGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG5cblx0XHQvLyBSZWZyZXNoXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHRyZWZyZXNoKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdC8vIFJlc2V0XG5cdFx0XHR0aGlzLl9waWVDaGFydC5zZXREYXRhU291cmNlKFtdKTtcblx0XHRcdHRoaXMuZ2V0JCgnI25ld1Zpc2l0b3JzUGVyYycpLnRleHQoJycpO1xuXHRcdFx0dGhpcy5nZXQkKCcjcmV0VmlzaXRvcnNQZXJjJykudGV4dCgnJyk7XG5cdFx0XHR0aGlzLmdldCQoJyNuZXdWaXNWaXNpdHNWYWx1ZU1haW4nKS50ZXh0KCcnKTtcblx0XHRcdHRoaXMuZ2V0JCgnI3JldFZpc1Zpc2l0c1ZhbHVlTWFpbicpLnRleHQoJycpO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSlcblx0XHRcdFx0dGhpcy5fZGlzcGxheURhdGEoKTtcblx0XHR9XG5cdH1cblxuXHRfZGlzcGxheURhdGEoKVxuXHR7XG5cdFx0Y29uc3QgbmV3VmlzaXRvcnNQZXJjVmFsdWUgPSB0aGlzLl9uZXdWaXNpdG9yc1BlcmMuZ2V0VmFsdWVGKCk7XG5cdFx0Y29uc3QgcmV0VmlzaXRvcnNQZXJjVmFsdWUgPSB0aGlzLl9yZXRWaXNpdG9yc1BlcmMuZ2V0VmFsdWVGKCk7XG5cblx0XHRjb25zdCBuZXdWaXNpdG9yc1BlcmNTdHJpbmcgPSB0aGlzLl9uZXdWaXNpdG9yc1BlcmMuZ2V0VmFsdWVGU3RyaW5nKCk7XG5cdFx0Y29uc3QgcmV0VmlzaXRvcnNQZXJjU3RyaW5nID0gdGhpcy5fcmV0VmlzaXRvcnNQZXJjLmdldFZhbHVlRlN0cmluZygpO1xuXG5cdFx0Y29uc3QgbmV3VmlzaXRzU3RyaW5nID0gdGhpcy5fbmV3VmlzVmlzaXRzLmdldFZhbHVlRlN0cmluZygpICsgJyB2aXNpdHMnO1xuXHRcdGNvbnN0IHJldFZpc2l0c1N0cmluZyA9IHRoaXMuX3JldFZpc1Zpc2l0cy5nZXRWYWx1ZUZTdHJpbmcoKSArICcgdmlzaXRzJztcblxuXHRcdHRoaXMuX3BpZUNoYXJ0LnNldERhdGFTb3VyY2UoW3t0eXBlOiduZXcnLCB2YWx1ZTpuZXdWaXNpdG9yc1BlcmNWYWx1ZX0sIHtuYW1lOidyZXQnLCB2YWx1ZTpyZXRWaXNpdG9yc1BlcmNWYWx1ZX1dKTtcblxuXHRcdHRoaXMuZ2V0JCgnI25ld1Zpc2l0b3JzUGVyYycpLnRleHQobmV3VmlzaXRvcnNQZXJjU3RyaW5nKTtcblx0XHR0aGlzLmdldCQoJyNyZXRWaXNpdG9yc1BlcmMnKS50ZXh0KHJldFZpc2l0b3JzUGVyY1N0cmluZyk7XG5cblx0XHR0aGlzLmdldCQoJyNuZXdWaXNWaXNpdHNWYWx1ZU1haW4nKS50ZXh0KG5ld1Zpc2l0c1N0cmluZyk7XG5cdFx0dGhpcy5nZXQkKCcjcmV0VmlzVmlzaXRzVmFsdWVNYWluJykudGV4dChyZXRWaXNpdHNTdHJpbmcpO1xuXHR9XG5cblx0X2hhbmRsZVN0YXRlQ2hhbmdlKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnLm1pc3Npbmctd2FybmluZycpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnI3BpZUNoYXJ0JykuaGlkZSgpO1xuXG5cdFx0XHRzd2l0Y2ggKHRoaXMuc3RhdGUpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgc3Bpbm5lclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgaW50ZXJydXB0ZWQgd2FybmluZ1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEE6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjcGllQ2hhcnQnKS5zaG93KCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ3Zpc2l0b3JzLWNoYXJ0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3Zpc2l0b3JzLWNoYXJ0JywgVmlzaXRvcnNDaGFydCk7XG4iLCJpbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7RGF0ZUhlbHBlcn0gZnJvbSAnLi91dGlscy9kYXRlLWhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBEYXRhUmFuZ2VNYW5hZ2VyXG57XG5cdGNvbnN0cnVjdG9yKHJhbmdlU2VsZWN0b3JNb2RhbClcblx0e1xuXHRcdHRoaXMuVE9EQVkgPSAnVG9kYXknO1xuXHRcdHRoaXMuWUVTVEVSREFZID0gJ1llc3RlcmRheSc7XG5cdFx0dGhpcy5MQVNUX1dFRUsgPSAnTGFzdCB3ZWVrJztcblx0XHR0aGlzLkxBU1RfTU9OVEggPSAnTGFzdCBtb250aCc7XG5cdFx0dGhpcy5DVVNUT00gPSAnQ3VzdG9tJztcblxuXHRcdHRoaXMuUFJFREVGSU5FRF9SQU5HRVMgPSBbdGhpcy5UT0RBWSwgdGhpcy5ZRVNURVJEQVksIHRoaXMuTEFTVF9XRUVLLCB0aGlzLkxBU1RfTU9OVEgsIHRoaXMuQ1VTVE9NXTtcblxuXHRcdHRoaXMuX3JhbmdlTW9kYWwgPSByYW5nZVNlbGVjdG9yTW9kYWw7XG5cblx0XHQvLyBJbml0aWFsaXplIHdpZGdldHNcblx0XHR0aGlzLl9pbml0V2lkZ2V0cygpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHR0aGlzLl9jb21wYXJlQ2Iub2ZmKCdjaGFuZ2UnKTtcblx0fVxuXG5cdHNldERlZmF1bHRSYW5nZSgpXG5cdHtcblx0XHQvLyBEZWZhdWx0IGRhdGEgcmFuZ2UgaXMgbGFzdCB3ZWVrICh0aGUgd2VlayBiZWZvcmUgdGhlIGN1cnJlbnQgb25lKVxuXHRcdHRoaXMuc2V0UHJlZGVmaW5lZFJhbmdlKHRoaXMuTEFTVF9XRUVLKTtcblx0fVxuXG5cdHNldFByZWRlZmluZWRSYW5nZShzZWxlY3RlZFJhbmdlVGV4dClcblx0e1xuXHRcdGNvbnN0IHRvZGF5MCA9IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpO1xuXHRcdGNvbnN0IHRvZGF5MjMgPSBtb21lbnQoKS5ob3VycygyMykuc3RhcnRPZignaG91cicpO1xuXG5cdFx0bGV0IGZyb207XG5cdFx0bGV0IHRvO1xuXG5cdFx0c3dpdGNoIChzZWxlY3RlZFJhbmdlVGV4dClcblx0XHR7XG5cdFx0XHRjYXNlIHRoaXMuVE9EQVk6XG5cdFx0XHRcdGZyb20gPSB0b2RheTA7XG5cdFx0XHRcdHRvID0gdG9kYXkyMztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgdGhpcy5ZRVNURVJEQVk6XG5cdFx0XHRcdGZyb20gPSB0b2RheTAuc3VidHJhY3QoMSwgJ2RheXMnKTtcblx0XHRcdFx0dG8gPSB0b2RheTIzLnN1YnRyYWN0KDEsICdkYXlzJyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIHRoaXMuTEFTVF9XRUVLOlxuXHRcdFx0XHRmcm9tID0gdG9kYXkwLnN1YnRyYWN0KDcsICdkYXlzJykuc3RhcnRPZignd2VlaycpO1xuXHRcdFx0XHR0byA9IHRvZGF5MjMuc3VidHJhY3QoNywgJ2RheXMnKS5lbmRPZignd2VlaycpLmhvdXIoMjMpLnN0YXJ0T2YoJ2hvdXInKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgdGhpcy5MQVNUX01PTlRIOlxuXHRcdFx0XHRmcm9tID0gdG9kYXkwLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJyk7XG5cdFx0XHRcdHRvID0gdG9kYXkyMy5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS5ob3VyKDIzKS5zdGFydE9mKCdob3VyJyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIHRoaXMuQ1VTVE9NOlxuXHRcdFx0XHQvLyBLZWVwIHByZXZpb3VzIHZhbHVlcyBmcm9tIHNlbGVjdGVkUmFuZ2Ugb2JqZWN0XG5cdFx0XHRcdGZyb20gPSB0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tO1xuXHRcdFx0XHR0byA9IHRoaXMuX3NlbGVjdGVkUmFuZ2UubWFpblRvO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyBTZXQgc2VsZWN0ZWQgcmFuZ2Vcblx0XHR0aGlzLl9zZXRSYW5nZShmcm9tLCB0bywgdGhpcy5QUkVERUZJTkVEX1JBTkdFUy5pbmRleE9mKHNlbGVjdGVkUmFuZ2VUZXh0KSk7XG5cdH1cblxuXHRzZXRDdXN0b21SYW5nZSgpXG5cdHtcblx0XHRsZXQgZnJvbSA9IG1vbWVudCh0aGlzLl9mcm9tRGF0ZURQLnZhbHVlKCkpO1xuXHRcdGZyb20uaG91cnModGhpcy5fZnJvbUhvdXJOUy52YWx1ZSgpKS5zdGFydE9mKCdob3VyJyk7XG5cblx0XHRsZXQgdG8gPSBtb21lbnQodGhpcy5fdG9EYXRlRFAudmFsdWUoKSk7XG5cdFx0dG8uaG91cnModGhpcy5fdG9Ib3VyTlMudmFsdWUoKSAtIDEpLnN0YXJ0T2YoJ2hvdXInKTtcblxuXHRcdC8vIENoZWNrIGlmICd0bycgZGF0ZSBpcyBiZWZvcmUgJ2Zyb20nIGRhdGVcblx0XHRpZiAodG8uaXNCZWZvcmUoZnJvbSkpXG5cdFx0XHR0byA9IG1vbWVudChmcm9tKTtcblxuXHRcdC8vIFNldCBzZWxlY3RlZCByYW5nZVxuXHRcdHRoaXMuX3NldFJhbmdlKGZyb20sIHRvLCB0aGlzLlBSRURFRklORURfUkFOR0VTLmluZGV4T2YodGhpcy5DVVNUT00pKTtcblx0fVxuXG5cdHNldE5ld1JhbmdlKHJhbmdlKVxuXHR7XG5cdFx0Ly8gU2V0IHByZWRlZmluZWQgcmFuZ2VzIHNlbGVjdG9yXG5cdFx0Y29uc3QgdG9kYXkgPSBtb21lbnQoKTtcblx0XHRsZXQgaW5kZXggPSB0aGlzLlBSRURFRklORURfUkFOR0VTLmluZGV4T2YodGhpcy5DVVNUT00pO1xuXG5cdFx0aWYgKHJhbmdlLm1haW5Gcm9tLmhvdXJzKCkgPT0gMCAmJiByYW5nZS5tYWluVG8uaG91cnMoKSA9PSAyMylcblx0XHR7XG5cdFx0XHRpZiAoRGF0ZUhlbHBlci5hcmVEYXRlc0VxdWFsKHJhbmdlLm1haW5Gcm9tLCByYW5nZS5tYWluVG8pKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBUT0RBWVxuXHRcdFx0XHRpZiAoRGF0ZUhlbHBlci5hcmVEYXRlc0VxdWFsKHJhbmdlLm1haW5Gcm9tLCB0b2RheSkpXG5cdFx0XHRcdFx0aW5kZXggPSB0aGlzLlBSRURFRklORURfUkFOR0VTLmluZGV4T2YodGhpcy5UT0RBWSk7XG5cblx0XHRcdFx0Ly8gWUVTVEVSREFZXG5cdFx0XHRcdGVsc2UgaWYgKERhdGVIZWxwZXIuYXJlRGF0ZXNFcXVhbChyYW5nZS5tYWluRnJvbSwgRGF0ZUhlbHBlci5nZXRQcmV2RGF5KHRvZGF5KSkpXG5cdFx0XHRcdFx0aW5kZXggPSB0aGlzLlBSRURFRklORURfUkFOR0VTLmluZGV4T2YodGhpcy5ZRVNURVJEQVkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMQVNUIFdFRUtcblx0XHRcdGVsc2UgaWYgKERhdGVIZWxwZXIuYXJlRGF0ZXNFcXVhbChyYW5nZS5tYWluRnJvbSwgRGF0ZUhlbHBlci5nZXRGaXJzdERheU9mUHJldldlZWsodG9kYXkpKSAmJiBEYXRlSGVscGVyLmFyZURhdGVzRXF1YWwocmFuZ2UubWFpblRvLCBEYXRlSGVscGVyLmdldExhc3REYXlPZlByZXZXZWVrKHRvZGF5KSkpXG5cdFx0XHRcdGluZGV4ID0gdGhpcy5QUkVERUZJTkVEX1JBTkdFUy5pbmRleE9mKHRoaXMuTEFTVF9XRUVLKTtcblxuXHRcdFx0Ly8gTEFTVCBNT05USFxuXHRcdFx0ZWxzZSBpZiAoRGF0ZUhlbHBlci5hcmVEYXRlc0VxdWFsKHJhbmdlLm1haW5Gcm9tLCBEYXRlSGVscGVyLmdldEZpcnN0RGF5T2ZQcmV2TW9udGgodG9kYXkpKSAmJiBEYXRlSGVscGVyLmFyZURhdGVzRXF1YWwocmFuZ2UubWFpblRvLCBEYXRlSGVscGVyLmdldExhc3REYXlPZlByZXZNb250aCh0b2RheSkpKVxuXHRcdFx0XHRpbmRleCA9IHRoaXMuUFJFREVGSU5FRF9SQU5HRVMuaW5kZXhPZih0aGlzLkxBU1RfTU9OVEgpO1xuXHRcdH1cblxuXHRcdC8vIEVuYWJsZSBjb21wYXJlOyBjb21wYXJlIGRhdGVzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBzaGl0ICh0aGV5IGFyZSBub3QgdGFrZW4gZnJvbSB0aGUgcmFuZ2Ugb2JqZWN0KVxuXHRcdHRoaXMuX2NvbXBhcmVDYi5wcm9wKCdjaGVja2VkJywgKHJhbmdlLmNvbXBhcmVGcm9tICE9IG51bGwgJiYgcmFuZ2UuY29tcGFyZVRvICE9IG51bGwpKTtcblxuXHRcdC8vIFNldCBzZWxlY3RlZCByYW5nZVxuXHRcdHRoaXMuX3NldFJhbmdlKHJhbmdlLm1haW5Gcm9tLCByYW5nZS5tYWluVG8sIGluZGV4KTtcblx0fVxuXG5cdGdldFNlbGVjdGVkUmFuZ2UoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkUmFuZ2U7XG5cdH1cblxuXHRnZXRSYW5nZUxlbmd0aCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8uZGlmZih0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tLCAnZGF5cycpICsgMTtcblx0fVxuXG5cdGRpc2FibGVTaGlmdEZvckRlbW8oKVxuXHR7XG5cdFx0dGhpcy5fc2hpZnROUy5lbmFibGUoZmFsc2UpO1xuXHRcdHRoaXMuX3NoaWZ0TlMud3JhcHBlci5hZGRDbGFzcygnc2hvdy10b29sdGlwJyk7XG5cdFx0dGhpcy5fc2hpZnROUy53cmFwcGVyLmF0dHIoJ3RpdGxlJywgJ0NvbXBhcmUgcmFuZ2Ugc2hpZnQgYXZhaWxhYmxlIGluIGxpY2Vuc2VkIHZlcnNpb24gb25seScpO1xuXHR9XG5cblx0ZGlzYWJsZUNvbXBhcmVGb3JCYXNpYygpXG5cdHtcblx0XHR0aGlzLl9jb21wYXJlQ2IuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHQkKCcjYW5sLWNvbXBhcmVMYicsIHRoaXMuX3JhbmdlTW9kYWwpLnRleHQoJ0NvbXBhcmUgKFBSTyBPTkxZKScpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgd2lkZ2V0cy5cblx0ICovXG5cdF9pbml0V2lkZ2V0cygpXG5cdHtcblx0XHQvLyBJbml0aWFsaXplIHJhbmdlIGRyb3Bkb3duXG5cdFx0dGhpcy5fcmFuZ2VERCA9ICQoJyNhbmwtcmFuZ2VQcmVzZWxlY3RERCcsIHRoaXMuX3JhbmdlTW9kYWwpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFTb3VyY2U6IHRoaXMuUFJFREVGSU5FRF9SQU5HRVMsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25QcmVkZWZpbmVkUmFuZ2VDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9Ecm9wRG93bkxpc3QnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgY29tcGFyZSBjaGVja2JveFxuXHRcdHRoaXMuX2NvbXBhcmVDYiA9ICQoJyNhbmwtY29tcGFyZUNiJywgdGhpcy5fcmFuZ2VNb2RhbCk7XG5cdFx0dGhpcy5fY29tcGFyZUNiLm9uKCdjaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uUHJlZGVmaW5lZFJhbmdlQ2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0IGZyb20gZGF0ZSBwaWNrZXJcblx0XHR0aGlzLl9mcm9tRGF0ZURQID0gJCgnI2FubC1mcm9tRGF0ZURQJywgdGhpcy5fcmFuZ2VNb2RhbCkua2VuZG9EYXRlUGlja2VyKHtcblx0XHRcdG1heDogbmV3IERhdGUoKSxcblx0XHRcdGZvb3RlcjogZmFsc2UsXG5cdFx0XHRmb3JtYXQ6ICdkZCBNTU0geXl5eScsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25SYW5nZUNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0RhdGVQaWNrZXInKTtcblxuXHRcdC8vIEluaXQgZnJvbSBob3VyIGlucHV0XG5cdFx0dGhpcy5fZnJvbUhvdXJOUyA9ICQoJyNhbmwtZnJvbUhvdXJOUycsIHRoaXMuX3JhbmdlTW9kYWwpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDAsXG5cdFx0XHRtYXg6IDIzLFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vblJhbmdlQ2hhbmdlLCB0aGlzKVxuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdC8vIEluaXQgdG8gZGF0ZSBwaWNrZXJcblx0XHR0aGlzLl90b0RhdGVEUCA9ICQoJyNhbmwtdG9EYXRlRFAnLCB0aGlzLl9yYW5nZU1vZGFsKS5rZW5kb0RhdGVQaWNrZXIoe1xuXHRcdFx0bWF4OiBuZXcgRGF0ZSgpLFxuXHRcdFx0Zm9vdGVyOiBmYWxzZSxcblx0XHRcdGZvcm1hdDogJ2RkIE1NTSB5eXl5Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vblJhbmdlQ2hhbmdlLCB0aGlzKVxuXHRcdH0pLmRhdGEoJ2tlbmRvRGF0ZVBpY2tlcicpO1xuXG5cdFx0Ly8gSW5pdCB0byBob3VyIGlucHV0XG5cdFx0dGhpcy5fdG9Ib3VyTlMgPSAkKCcjYW5sLXRvSG91ck5TJywgdGhpcy5fcmFuZ2VNb2RhbCkua2VuZG9OdW1lcmljVGV4dEJveCh7XG5cdFx0ICAgIG1pbjogMSxcblx0XHRcdG1heDogMjQsXG5cdFx0ICAgIHN0ZXA6IDEsXG5cdFx0ICAgIGZvcm1hdDogJyMnLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uUmFuZ2VDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXG5cdFx0Ly8gSW5pdCBzaGlmdCBpbnB1dFxuXHRcdHRoaXMuX3NoaWZ0TlMgPSAkKCcjYW5sLXNoaWZ0TlMnLCB0aGlzLl9yYW5nZU1vZGFsKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAtMTAwLFxuXHRcdFx0bWF4OiAtMSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIycsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25QcmVkZWZpbmVkUmFuZ2VDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXHR9XG5cblx0X29uUmFuZ2VDaGFuZ2UoKVxuXHR7XG5cdFx0dGhpcy5zZXRDdXN0b21SYW5nZSgpO1xuXHR9XG5cblx0X29uUHJlZGVmaW5lZFJhbmdlQ2hhbmdlKClcblx0e1xuXHRcdHRoaXMuc2V0UHJlZGVmaW5lZFJhbmdlKHRoaXMuX3JhbmdlREQudmFsdWUoKSk7XG5cdH1cblxuXHRfc2V0UmFuZ2UoZnJvbSwgdG8sIHByZWRlZkluZGV4KVxuXHR7XG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZSA9IG5ldyBTdGF0c0RhdGFSYW5nZSgpO1xuXG5cdFx0Ly8gU2V0IHNlbGVjdGVkIHJhbmdlXG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluRnJvbSA9IGZyb207XG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8gPSB0bztcblxuXHRcdC8vIFNldCBjb21wYXJlZCByYW5nZVxuXHRcdHRoaXMuX3NldENvbXBhcmVkUmFuZ2UoKTtcblxuXHRcdC8vIFVwZGF0ZSB2aWV3XG5cdFx0dGhpcy5fdXBkYXRlVmlldyhwcmVkZWZJbmRleCk7XG5cdH1cblxuXHRfc2V0Q29tcGFyZWRSYW5nZSgpXG5cdHtcblx0XHRjb25zdCBjb21wYXJlU2hpZnQgPSB0aGlzLl9nZXRDb21wYXJlU2hpZnQoKTtcblxuXHRcdGlmIChjb21wYXJlU2hpZnQgPCAwKVxuXHRcdHtcblx0XHRcdGNvbnN0IHJhbmdlRGlmZiA9IHRoaXMuX3NlbGVjdGVkUmFuZ2UubWFpblRvLmRpZmYodGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluRnJvbSwgJ2RheXMnKTtcblxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZS5jb21wYXJlRnJvbSA9IG1vbWVudCh0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tKS5hZGQoY29tcGFyZVNoaWZ0ICogKHJhbmdlRGlmZiArIDEpLCAnZGF5cycpO1xuXHRcdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZS5jb21wYXJlVG8gPSBtb21lbnQodGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8pLmFkZChjb21wYXJlU2hpZnQgKiAocmFuZ2VEaWZmICsgMSksICdkYXlzJyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLl9zZWxlY3RlZFJhbmdlLmNvbXBhcmVGcm9tID0gbnVsbDtcblx0XHRcdHRoaXMuX3NlbGVjdGVkUmFuZ2UuY29tcGFyZVRvID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Q29tcGFyZVNoaWZ0KClcblx0e1xuXHRcdHJldHVybiAodGhpcy5fY29tcGFyZUNiLnByb3AoJ2NoZWNrZWQnKSA/IHRoaXMuX3NoaWZ0TlMudmFsdWUoKSA6IDApO1xuXHR9XG5cblx0X3VwZGF0ZVZpZXcoaW5kZXgpXG5cdHtcblx0XHQvLyBQcmVkZWZpbmVkIHJhbmdlIHNlbGVjdG9yXG5cdFx0dGhpcy5fcmFuZ2VERC5zZWxlY3QoaW5kZXgpO1xuXG5cdFx0Y29uc3QgaXNDdXN0b20gPSAoaW5kZXggPT0gdGhpcy5QUkVERUZJTkVEX1JBTkdFUy5pbmRleE9mKHRoaXMuQ1VTVE9NKSk7XG5cdFx0dGhpcy5fZnJvbURhdGVEUC5lbmFibGUoaXNDdXN0b20pO1xuXHRcdHRoaXMuX2Zyb21Ib3VyTlMuZW5hYmxlKGlzQ3VzdG9tKTtcblx0XHR0aGlzLl90b0RhdGVEUC5lbmFibGUoaXNDdXN0b20pO1xuXHRcdHRoaXMuX3RvSG91ck5TLmVuYWJsZShpc0N1c3RvbSk7XG5cblx0XHQvLyBBbHdheXMgc2V0IHRvIHJlYWRvbmx5IHRvIGRpc2FibGUgbWFudWFsIGlucHV0XG5cdFx0aWYgKGlzQ3VzdG9tKVxuXHRcdHtcblx0XHRcdCQoJyNhbmwtZnJvbURhdGVEUCcsIHRoaXMuX3JhbmdlTW9kYWwpLmF0dHIoJ3JlYWRvbmx5JywgdHJ1ZSk7XG5cdFx0XHQkKCcjYW5sLXRvRGF0ZURQJywgdGhpcy5fcmFuZ2VNb2RhbCkuYXR0cigncmVhZG9ubHknLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBGcm9tXG5cdFx0dGhpcy5fZnJvbURhdGVEUC52YWx1ZSh0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tLnRvRGF0ZSgpKTtcblx0XHR0aGlzLl9mcm9tSG91ck5TLnZhbHVlKHRoaXMuX3NlbGVjdGVkUmFuZ2UubWFpbkZyb20uaG91cnMoKSk7XG5cdFx0dGhpcy5fdG9EYXRlRFAubWluKHRoaXMuX3NlbGVjdGVkUmFuZ2UubWFpbkZyb20udG9EYXRlKCkpO1xuXG5cdFx0Ly8gVG9cblx0XHR0aGlzLl90b0RhdGVEUC52YWx1ZSh0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Uby50b0RhdGUoKSk7XG5cdFx0dGhpcy5fdG9Ib3VyTlMudmFsdWUodGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8uaG91cnMoKSArIDEpO1xuXG5cdFx0Ly8gQ29tcGFyZWQgcmFuZ2UgaW4gdGV4dGZpZWxkc1xuXHRcdCQoJyNhbmwtY29tcGFyZUZyb21EYXRlTGInLCB0aGlzLl9yYW5nZU1vZGFsKS50ZXh0KHRoaXMuX3NlbGVjdGVkUmFuZ2UuZ2V0Q29tcGFyZUZyb21TdHJpbmcoKSk7XG5cdFx0JCgnI2FubC1jb21wYXJlVG9EYXRlTGInLCB0aGlzLl9yYW5nZU1vZGFsKS50ZXh0KHRoaXMuX3NlbGVjdGVkUmFuZ2UuZ2V0Q29tcGFyZVRvU3RyaW5nKCkpO1xuXG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkUmFuZ2UuY29tcGFyZUZyb20gIT0gbnVsbCAmJiB0aGlzLl9zZWxlY3RlZFJhbmdlLmNvbXBhcmVUbyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHRoaXMuX2NvbXBhcmVDYi5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cblx0XHRcdGNvbnN0IGRpZmYxID0gdGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8uZGlmZih0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tLCAnZGF5cycpICsgMTtcblx0XHRcdGNvbnN0IGRpZmYyID0gdGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluRnJvbS5kaWZmKHRoaXMuX3NlbGVjdGVkUmFuZ2UuY29tcGFyZUZyb20sICdkYXlzJyk7XG5cblx0XHRcdHRoaXMuX3NoaWZ0TlMudmFsdWUoLShkaWZmMi9kaWZmMSkpO1xuXHRcdFx0bGV0IHNoaWZ0TGFiZWwgPSAkKCcjYW5sLXNoaWZ0TGInLCB0aGlzLl9yYW5nZU1vZGFsKTtcblxuXHRcdFx0aWYgKGRpZmYxID09IDEpXG5cdFx0XHRcdHNoaWZ0TGFiZWwudGV4dCgnZGF5JyArICh0aGlzLl9zaGlmdE5TLnZhbHVlKCkgPCAtMSA/ICdzJyA6ICcnKSk7XG5cdFx0XHRlbHNlIGlmIChkaWZmMSA9PSA3KVxuXHRcdFx0XHRzaGlmdExhYmVsLnRleHQoJ3dlZWsnICsgKHRoaXMuX3NoaWZ0TlMudmFsdWUoKSA8IC0xID8gJ3MnIDogJycpKTtcblx0XHRcdGVsc2UgaWYgKGRpZmYxIDw9IDMxICYmIGRpZmYxID49IDI4KVxuXHRcdFx0XHRzaGlmdExhYmVsLnRleHQoJ21vbnRoJyArICh0aGlzLl9zaGlmdE5TLnZhbHVlKCkgPCAtMSA/ICdzJyA6ICcnKSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHNoaWZ0TGFiZWwudGV4dCgnKGN1c3RvbSBzcGFuKScpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5fY29tcGFyZUNiLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHR0aGlzLl9zaGlmdE5TLnZhbHVlKC0xKTtcblx0XHR9XG5cdH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbmV4cG9ydCBjbGFzcyBTdGF0c0RhdGFSYW5nZVxue1xuXHRzdGF0aWMgZ2V0IFNFUEFSQVRPUigpIHsgcmV0dXJuICcgwrsgJzsgfVxuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHRoaXMubWFpbkZyb20gPSBudWxsO1xuXHRcdHRoaXMubWFpblRvID0gbnVsbDtcblx0XHR0aGlzLmNvbXBhcmVGcm9tID0gbnVsbDtcblx0XHR0aGlzLmNvbXBhcmVUbyA9IG51bGw7XG5cdH1cblxuXHRzdGF0aWMgbmV3RnJvbVNGU09iamVjdChvYmopXG5cdHtcblx0XHRsZXQgc2RyID0gbmV3IFN0YXRzRGF0YVJhbmdlKCk7XG5cblx0XHRzZHIubWFpbkZyb20gPSBEYXRlSGVscGVyLmdldERhdGVGcm9tVHJhbnNmZXJTdHJpbmcob2JqLmdldFV0ZlN0cmluZygnbWZyb20nKSk7XG5cdFx0c2RyLm1haW5UbyA9IERhdGVIZWxwZXIuZ2V0RGF0ZUZyb21UcmFuc2ZlclN0cmluZyhvYmouZ2V0VXRmU3RyaW5nKCdtdG8nKSk7XG5cblx0XHRpZiAob2JqLmNvbnRhaW5zS2V5KCdjZnJvbScpICYmIG9iai5jb250YWluc0tleSgnY3RvJykpXG5cdFx0e1xuXHRcdFx0c2RyLmNvbXBhcmVGcm9tID0gRGF0ZUhlbHBlci5nZXREYXRlRnJvbVRyYW5zZmVyU3RyaW5nKG9iai5nZXRVdGZTdHJpbmcoJ2Nmcm9tJykpO1xuXHRcdFx0c2RyLmNvbXBhcmVUbyA9ICBEYXRlSGVscGVyLmdldERhdGVGcm9tVHJhbnNmZXJTdHJpbmcob2JqLmdldFV0ZlN0cmluZygnY3RvJykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzZHI7XG5cdH1cblxuXHRnZXQgZG9Db21wYXJlKClcblx0e1xuXHRcdHJldHVybiAodGhpcy5jb21wYXJlRnJvbSAhPSBudWxsICYmIHRoaXMuY29tcGFyZVRvICE9IG51bGwpO1xuXHR9XG5cblx0ZHVtcCgpXG5cdHtcblx0XHRjb25zb2xlLmxvZygnLS0tLS0gUkFOR0UgLS0tLScpXG5cdFx0Y29uc29sZS5sb2coJ0Zyb206JywgdGhpcy5tYWluRnJvbS50b1N0cmluZygpKTtcblx0XHRjb25zb2xlLmxvZygnVG86JywgdGhpcy5tYWluVG8udG9TdHJpbmcoKSk7XG5cblx0XHRpZiAodGhpcy5jb21wYXJlRnJvbSAhPSBudWxsICYmIHRoaXMuY29tcGFyZVRvICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5sb2coJy0tLS0gQ09NUEFSRSAtLS0tJylcblx0XHRcdGNvbnNvbGUubG9nKCdGcm9tOicsIHRoaXMuY29tcGFyZUZyb20udG9TdHJpbmcoKSk7XG5cdFx0XHRjb25zb2xlLmxvZygnVG86JywgdGhpcy5jb21wYXJlVG8udG9TdHJpbmcoKSk7XG5cdFx0fVxuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0nKVxuXHR9XG5cblx0dG9TRlNPYmplY3QoKVxuXHR7XG5cdFx0bGV0IG9iaiA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblxuXHRcdG9iai5wdXRVdGZTdHJpbmcoJ21mcm9tJywgRGF0ZUhlbHBlci5nZXRUcmFuc2ZlclN0cmluZ0Zyb21EYXRlKHRoaXMubWFpbkZyb20pKTtcblx0XHRvYmoucHV0VXRmU3RyaW5nKCdtdG8nLCBEYXRlSGVscGVyLmdldFRyYW5zZmVyU3RyaW5nRnJvbURhdGUodGhpcy5tYWluVG8pKTtcblxuXHRcdGlmICh0aGlzLmRvQ29tcGFyZSlcblx0XHR7XG5cdFx0XHRvYmoucHV0VXRmU3RyaW5nKCdjZnJvbScsIERhdGVIZWxwZXIuZ2V0VHJhbnNmZXJTdHJpbmdGcm9tRGF0ZSh0aGlzLmNvbXBhcmVGcm9tKSk7XG5cdFx0XHRvYmoucHV0VXRmU3RyaW5nKCdjdG8nLCBEYXRlSGVscGVyLmdldFRyYW5zZmVyU3RyaW5nRnJvbURhdGUodGhpcy5jb21wYXJlVG8pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9XG5cblx0bWFpbkVxdWFsc1RvKG90aGVyUmFuZ2UpXG5cdHtcblx0XHRpZiAob3RoZXJSYW5nZSA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gTWFpbiBmcm9tXG5cdFx0aWYgKCFEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKHRoaXMubWFpbkZyb20sIG90aGVyUmFuZ2UubWFpbkZyb20pKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gTWFpbiB0b1xuXHRcdGlmICghRGF0ZUhlbHBlci5hcmVEYXRlVGltZXNFcXVhbCh0aGlzLm1haW5Ubywgb3RoZXJSYW5nZS5tYWluVG8pKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRjb21wYXJlRXF1YWxzVG8ob3RoZXJSYW5nZSlcblx0e1xuXHRcdGlmIChvdGhlclJhbmdlID09IG51bGwpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBDb21wYXJlIGZyb21cblx0XHRpZiAoIURhdGVIZWxwZXIuYXJlRGF0ZVRpbWVzRXF1YWwodGhpcy5jb21wYXJlRnJvbSwgb3RoZXJSYW5nZS5jb21wYXJlRnJvbSkpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBDb21wYXJlIHRvXG5cdFx0aWYgKCFEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKHRoaXMuY29tcGFyZVRvLCBvdGhlclJhbmdlLmNvbXBhcmVUbykpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF90b1N0cmluZyhkYXRlKVxuXHR7XG5cdFx0cmV0dXJuIGRhdGUuZm9ybWF0KERhdGVIZWxwZXIuREFURV9NQVNLKTtcblx0fVxuXG5cdF90b1N0cmluZ1dpdGhIb3VyKGRhdGUsIGFkZDEpXG5cdHtcblx0XHRyZXR1cm4gYCR7dGhpcy5fdG9TdHJpbmcoZGF0ZSl9ICR7ZGF0ZS5ob3VycygpICsgKGFkZDEgPyAxIDogMCl9aGA7XG5cdH1cblxuXHRnZXRNYWluUmFuZ2VTdHJpbmcoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3RvU3RyaW5nKHRoaXMubWFpbkZyb20pICsgU3RhdHNEYXRhUmFuZ2UuU0VQQVJBVE9SICsgdGhpcy5fdG9TdHJpbmcodGhpcy5tYWluVG8pO1xuXHR9XG5cblx0Z2V0Q29tcGFyZVJhbmdlU3RyaW5nKHByZWZpeCA9ICcnKVxuXHR7XG5cdFx0aWYgKHRoaXMuZG9Db21wYXJlKVxuXHRcdFx0cmV0dXJuIHByZWZpeCArIHRoaXMuX3RvU3RyaW5nKHRoaXMuY29tcGFyZUZyb20pICsgU3RhdHNEYXRhUmFuZ2UuU0VQQVJBVE9SICsgdGhpcy5fdG9TdHJpbmcodGhpcy5jb21wYXJlVG8pO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAnJztcblx0fVxuXG5cdGdldENvbXBhcmVGcm9tU3RyaW5nKClcblx0e1xuXHRcdGlmICh0aGlzLmNvbXBhcmVGcm9tICE9IG51bGwpXG5cdFx0XHRyZXR1cm4gdGhpcy5fdG9TdHJpbmdXaXRoSG91cih0aGlzLmNvbXBhcmVGcm9tLCBmYWxzZSk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuICcnO1xuXHR9XG5cblx0Z2V0Q29tcGFyZVRvU3RyaW5nKClcblx0e1xuXHRcdGlmICh0aGlzLmNvbXBhcmVUbyAhPSBudWxsKVxuXHRcdFx0cmV0dXJuIHRoaXMuX3RvU3RyaW5nV2l0aEhvdXIodGhpcy5jb21wYXJlVG8sIHRydWUpO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAnJztcblx0fVxufVxuIiwiaW1wb3J0IHtCYXNlTWV0cmljfSBmcm9tICcuL21ldHJpYyc7XG5pbXBvcnQge0RhdGVIZWxwZXJ9IGZyb20gJy4uL3V0aWxzL2RhdGUtaGVscGVyJztcbmltcG9ydCB7U3RhdHNEYXRhUmFuZ2V9IGZyb20gJy4uL2RhdGEtcmFuZ2UtbWFuYWdlcic7XG5cbmV4cG9ydCBjbGFzcyBNZXRyaWNDb250YWluZXJcbntcblx0Y29uc3RydWN0b3Iodmlld0lkLCBiYXNlTWV0cmljcylcblx0e1xuXHRcdHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcblxuXHRcdHRoaXMubWFpbk1ldHJpY3MgPSBbXTtcblx0XHR0aGlzLmNvbXBNZXRyaWNzID0gW107XG5cdFx0dGhpcy5tZXRyaWNJZHMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZU1ldHJpY3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0aWYgKGJhc2VNZXRyaWNzW2ldIGluc3RhbmNlb2YgQmFzZU1ldHJpYylcblx0XHRcdFx0dGhpcy5fYWRkTWV0cmljKGJhc2VNZXRyaWNzW2ldKTtcblx0XHR9XG5cdH1cblxuXHRnZXRQYXJlbnRWaWV3KClcblx0e1xuXHRcdHJldHVybiB0aGlzLl92aWV3SWQ7XG5cdH1cblxuXHRjb250YWluc01ldHJpYyhpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLm1ldHJpY0lkcy5pbmRleE9mKGlkKSA+IC0xO1xuXHR9XG5cblx0Z2V0TWFpbk1ldHJpYyhpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLm1haW5NZXRyaWNzW2lkXTtcblx0fVxuXG5cdGdldENvbXBhcmVNZXRyaWMoaWQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5jb21wTWV0cmljc1tpZF07XG5cdH1cblxuXHRpc01ldHJpY1VwZGF0ZWQoaWQsIHNkciwgZmlsdGVyKVxuXHR7XG5cdFx0bGV0IG1pc3NpbmdWYWx1ZXMgPSB0aGlzLmdldE1ldHJpY01pc3NpbmdWYWx1ZUZsYWdzKGlkLCBzZHIsIGZpbHRlcik7XG5cblx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG1pc3NpbmdWYWx1ZXMubGVuZ3RoOyBqKyspXG5cdFx0e1xuXHRcdFx0aWYgKG1pc3NpbmdWYWx1ZXNbal0pXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGdldE1ldHJpY01pc3NpbmdWYWx1ZUZsYWdzKGlkLCBzZHIsIGZpbHRlcilcblx0e1xuXHRcdGxldCBtYWluTWlzc2luZ0ZsYWdzID0gdGhpcy5fZ2V0TWV0cmljTWlzc2luZ1ZhbHVlRmxhZ3MxKGlkLCBmYWxzZSwgc2RyLm1haW5Gcm9tLCBzZHIubWFpblRvLCBmaWx0ZXIpO1xuXHRcdGxldCBjb21wTWlzc2luZ0ZsYWdzO1xuXG5cdFx0aWYgKHNkci5kb0NvbXBhcmUpXG5cdFx0XHRjb21wTWlzc2luZ0ZsYWdzID0gdGhpcy5fZ2V0TWV0cmljTWlzc2luZ1ZhbHVlRmxhZ3MxKGlkLCB0cnVlLCBzZHIuY29tcGFyZUZyb20sIHNkci5jb21wYXJlVG8sIGZpbHRlcik7XG5cdFx0ZWxzZVxuXHRcdFx0Y29tcE1pc3NpbmdGbGFncyA9IFtmYWxzZSwgZmFsc2VdO1xuXG5cdFx0cmV0dXJuIG1haW5NaXNzaW5nRmxhZ3MuY29uY2F0KGNvbXBNaXNzaW5nRmxhZ3MpO1xuXHR9XG5cblx0X2FkZE1ldHJpYyhiYXNlTWV0cmljKVxuXHR7XG5cdFx0bGV0IG1haW4gPSBuZXcgTWV0cmljKGJhc2VNZXRyaWMpO1xuXHRcdGxldCBjb21wID0gbmV3IE1ldHJpYyhiYXNlTWV0cmljKTtcblxuXHRcdHRoaXMubWFpbk1ldHJpY3NbYmFzZU1ldHJpYy5pZF0gPSBtYWluO1xuXHRcdHRoaXMuY29tcE1ldHJpY3NbYmFzZU1ldHJpYy5pZF0gPSBjb21wO1xuXG5cdFx0dGhpcy5tZXRyaWNJZHMucHVzaChiYXNlTWV0cmljLmlkKTtcblx0fVxuXG5cdF9nZXRNZXRyaWNNaXNzaW5nVmFsdWVGbGFnczEoaWQsIGlzQ29tcGFyZSwgcmFuZ2VGcm9tLCByYW5nZVRvLCBmaWx0ZXIpXG5cdHtcblx0XHRsZXQgbWV0cmljID0gKCFpc0NvbXBhcmUgPyB0aGlzLm1haW5NZXRyaWNzW2lkXSA6IHRoaXMuY29tcE1ldHJpY3NbaWRdKTtcblxuXHRcdGxldCBpc092ZXJhbGxNaXNzaW5nID0gZmFsc2U7XG5cdFx0bGV0IGlzRmlsdGVyZWRNaXNzaW5nID0gZmFsc2U7XG5cblx0XHQvLyBNZXRyaWMgY2FuJ3QgYmUgbnVsbDsgaWYgaXQgaXMsIHdlIGFyZSBsb29raW5nIHVwIHRoZSB3cm9uZyBpZFxuXHRcdGlmIChtZXRyaWMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgcmFuZ2VDaGFuZ2VkID0gIURhdGVIZWxwZXIuYXJlRGF0ZVRpbWVzRXF1YWwobWV0cmljLnJhbmdlRnJvbSwgcmFuZ2VGcm9tKSB8fCAhRGF0ZUhlbHBlci5hcmVEYXRlVGltZXNFcXVhbChtZXRyaWMucmFuZ2VUbywgcmFuZ2VUbyk7XG5cblx0XHRcdC8vIE9WRVJBTEwgVkFMVUVcblx0XHRcdGlzT3ZlcmFsbE1pc3NpbmcgPSByYW5nZUNoYW5nZWQ7XG5cblx0XHRcdC8vIEZJTFRFUkVEIFZBTFVFXG5cdFx0XHRpZiAoZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fdmlld0lkID09IGZpbHRlci52aWV3SWQpXG5cdFx0XHR7XG5cdFx0XHRcdGlzRmlsdGVyZWRNaXNzaW5nID0gIChyYW5nZUNoYW5nZWQgJiYgbWV0cmljLmZpbHRlclZhbHVlICE9IG51bGwpIHx8IChmaWx0ZXIudmFsdWUgIT0gbnVsbCAmJiBmaWx0ZXIudmFsdWUgIT0gbWV0cmljLmZpbHRlclZhbHVlKTtcblxuXHRcdFx0XHQvKlxuXHRcdFx0XHQvLyBJZiBmaWx0ZXIgaXMgbm90IGFwcGxpZWQgd2UgY2FuIHNraXAgdGhlIGZpbHRlcmVkIHZhbHVlIChhc3N1bWUgaXQgaXMgdXBkYXRlZCAtIHdlIHdvbid0IHVzZSBpdCBhbnl3YXkpXG5cdFx0XHRcdGlmIChmaWx0ZXIudmFsdWUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIENoZWNrIGZpbHRlcjogaWYgaXQgZGlkbid0IGNoYW5nZSwgdGhlbiB0aGUgZmlsdGVyZWQgdmFsdWUgaXMgdXBkYXRlZFxuXHRcdFx0XHRcdGlmIChtZXRyaWMuZmlsdGVyVmFsdWUgPT0gZmlsdGVyLnZhbHVlKVxuXHRcdFx0XHRcdFx0aXNGaWx0ZXJlZE1pc3NpbmcgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0aXNGaWx0ZXJlZE1pc3NpbmcgPSBmYWxzZTtcblx0XHRcdFx0Ki9cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gW2lzT3ZlcmFsbE1pc3NpbmcsIGlzRmlsdGVyZWRNaXNzaW5nXTtcblx0fVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuZXhwb3J0IGNsYXNzIE1ldHJpY1xue1xuXHRjb25zdHJ1Y3RvcihiYXNlTWV0cmljKVxuXHR7XG5cdFx0dGhpcy5iYXNlTWV0cmljID0gYmFzZU1ldHJpYztcblxuXHRcdHRoaXMuX3ZhbHVlO1xuXHRcdHRoaXMuX3ZhbHVlRiA9IE5hTjtcblxuXHRcdC8vIG1vbWVudC5qc1xuXHRcdHRoaXMucmFuZ2VGcm9tO1xuXHRcdHRoaXMucmFuZ2VUbztcblxuXHRcdHRoaXMuZmlsdGVyTmFtZTtcblx0XHR0aGlzLmZpbHRlclZhbHVlO1xuXHR9XG5cblx0Z2V0UmFuZ2VTdHJpbmcoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMucmFuZ2VGcm9tLmZvcm1hdChEYXRlSGVscGVyLkRBVEVfTUFTSykgKyBTdGF0c0RhdGFSYW5nZS5TRVBBUkFUT1IgKyB0aGlzLnJhbmdlVG8uZm9ybWF0KERhdGVIZWxwZXIuREFURV9NQVNLKTtcblx0fVxuXG5cdGdldFZhbHVlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl92YWx1ZTtcblx0fVxuXG5cdGdldFZhbHVlU3RyaW5nKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9nZXRWYWx1ZUFzU3RyaW5nKHRoaXMuX3ZhbHVlKTtcblx0fVxuXG5cdHNldFZhbHVlKHZhbClcblx0e1xuXHRcdHRoaXMuX3ZhbHVlID0gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbHVlIEYgaXMgdGhlIGZpbHRlcmVkIG1ldHJpYyB2YWx1ZVxuXHQgKiBJZiBubyBmaWx0ZXIgaXMgc2V0LCB2YWx1ZSAxIGlzIHJldHVybmVkLlxuXHQgKi9cblx0Z2V0VmFsdWVGKClcblx0e1xuXHRcdGlmICh0aGlzLmZpbHRlck5hbWUgIT0gbnVsbCB8fCB0aGlzLmZpbHRlclZhbHVlICE9IG51bGwpXG5cdFx0XHRyZXR1cm4gdGhpcy5fdmFsdWVGO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0aGlzLl92YWx1ZTtcblx0fVxuXG5cdGdldFZhbHVlRlN0cmluZygpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0VmFsdWVBc1N0cmluZyh0aGlzLmdldFZhbHVlRigpKTtcblx0fVxuXG5cdHNldFZhbHVlRih2YWwsIGZpbHRlck5hbWUsIGZpbHRlclZhbHVlKVxuXHR7XG5cdFx0aWYgKGZpbHRlclZhbHVlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0dGhpcy5maWx0ZXJOYW1lID0gZmlsdGVyTmFtZTtcblx0XHRcdHRoaXMuZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZTtcblx0XHRcdHRoaXMuX3ZhbHVlRiA9IHZhbDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5yZXNldFZhbHVlRigpO1xuXHR9XG5cblx0cmVzZXRWYWx1ZUYoKVxuXHR7XG5cdFx0dGhpcy5maWx0ZXJOYW1lID0gbnVsbDtcblx0XHR0aGlzLmZpbHRlclZhbHVlID0gbnVsbDtcblx0XHR0aGlzLl92YWx1ZUYgPSBOYU47XG5cdH1cblxuXHR0b1N0cmluZygpXG5cdHtcblx0XHRyZXR1cm4gYCR7YmFzZU1ldHJpYy5pZH0gW292ZXJhbGw6ICR7dGhpcy5nZXRWYWx1ZVN0cmluZygpfSB8IGZpbHRlcmVkICgke3RoaXMuZmlsdGVyTmFtZX06JHt0aGlzLmZpbHRlclZhbHVlfSk6ICR7dGhpcy5nZXRWYWx1ZUZTdHJpbmcoKX1dYDtcblx0fVxuXG5cdF9nZXRWYWx1ZUFzU3RyaW5nKHZhbClcblx0e1xuXHRcdHJldHVybiB0aGlzLmJhc2VNZXRyaWMuZ2V0VmFsdWVBc1N0cmluZyh2YWwpO1xuXHR9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5leHBvcnQgY2xhc3MgQ2hhcnRDb250YWluZXJcbntcblx0Y29uc3RydWN0b3Iodmlld0lkLCBiYXNlTWV0cmljcylcblx0e1xuXHRcdHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcblxuXHRcdHRoaXMubWFpbkNoYXJ0cyA9IFtdO1xuXHRcdHRoaXMuY29tcENoYXJ0cyA9IFtdO1xuXHRcdHRoaXMuY2hhcnRJZHMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZU1ldHJpY3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0aWYgKGJhc2VNZXRyaWNzW2ldIGluc3RhbmNlb2YgQmFzZU1ldHJpYylcblx0XHRcdFx0dGhpcy5fYWRkQ2hhcnQoYmFzZU1ldHJpY3NbaV0pO1xuXHRcdH1cblx0fVxuXG5cdGdldFBhcmVudFZpZXcoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdJZDtcblx0fVxuXG5cdGdldE1haW5DaGFydChpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLm1haW5DaGFydHNbaWRdO1xuXHR9XG5cblx0Z2V0Q29tcGFyZUNoYXJ0KGlkKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuY29tcENoYXJ0c1tpZF07XG5cdH1cblxuXHRpc0NoYXJ0T3ZlcmFsbE91dGRhdGVkKGlkLCBzZHIsIGZpbHRlciwgdGltZVVuaXQpXG5cdHtcblx0XHRpZiAoc2RyLmRvQ29tcGFyZSlcblx0XHRcdHJldHVybiB0aGlzLmlzTWFpbkNoYXJ0T3V0ZGF0ZWQoaWQsIHNkci5tYWluRnJvbSwgc2RyLm1haW5UbywgZmlsdGVyLCB0aW1lVW5pdCkgfHwgdGhpcy5pc0NvbXBhcmVDaGFydE91dGRhdGVkKGlkLCBzZHIuY29tcGFyZUZyb20sIHNkci5jb21wYXJlVG8sIGZpbHRlciwgdGltZVVuaXQpO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0aGlzLmlzTWFpbkNoYXJ0T3V0ZGF0ZWQoaWQsIHNkci5tYWluRnJvbSwgc2RyLm1haW5UbywgZmlsdGVyLCB0aW1lVW5pdCk7XG5cdH1cblxuXHRpc01haW5DaGFydE91dGRhdGVkKGlkLCByYW5nZUZyb20sIHJhbmdlVG8sIGZpbHRlciwgdGltZVVuaXQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faXNDaGFydE91dGRhdGVkKGlkLCBmYWxzZSwgcmFuZ2VGcm9tLCByYW5nZVRvLCBmaWx0ZXIsIHRpbWVVbml0KTtcblx0fVxuXG5cdGlzQ29tcGFyZUNoYXJ0T3V0ZGF0ZWQoaWQsIHJhbmdlRnJvbSwgcmFuZ2VUbywgZmlsdGVyLCB0aW1lVW5pdClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pc0NoYXJ0T3V0ZGF0ZWQoaWQsIHRydWUsIHJhbmdlRnJvbSwgcmFuZ2VUbywgZmlsdGVyLCB0aW1lVW5pdCk7XG5cdH1cblxuXHRfYWRkQ2hhcnQoYmFzZU1ldHJpYylcblx0e1xuXHRcdGxldCBtYWluID0gbmV3IENoYXJ0KGJhc2VNZXRyaWMpO1xuXHRcdGxldCBjb21wID0gbmV3IENoYXJ0KGJhc2VNZXRyaWMpO1xuXG5cdFx0dGhpcy5tYWluQ2hhcnRzW2Jhc2VNZXRyaWMuaWRdID0gbWFpbjtcblx0XHR0aGlzLmNvbXBDaGFydHNbYmFzZU1ldHJpYy5pZF0gPSBjb21wO1xuXG5cdFx0dGhpcy5jaGFydElkcy5wdXNoKGJhc2VNZXRyaWMuaWQpO1xuXHR9XG5cblx0X2lzQ2hhcnRPdXRkYXRlZChpZCwgaXNDb21wYXJlLCByYW5nZUZyb20sIHJhbmdlVG8sIGZpbHRlciwgdGltZVVuaXQpXG5cdHtcblx0XHRsZXQgZmlsdGVyTmFtZSA9IGZpbHRlciAhPSBudWxsID8gZmlsdGVyLm5hbWUgOiBudWxsO1xuXHRcdGxldCBmaWx0ZXJWYWx1ZSA9IGZpbHRlciAhPSBudWxsID8gZmlsdGVyLnZhbHVlIDogbnVsbDtcblxuXHRcdGxldCBjaGFydE9iaiA9ICghaXNDb21wYXJlID8gdGhpcy5tYWluQ2hhcnRzW2lkXSA6IHRoaXMuY29tcENoYXJ0c1tpZF0pO1xuXG5cdFx0aWYgKGNoYXJ0T2JqICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gQ2hlY2sgcmFuZ2Vcblx0XHRcdGlmIChEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKGNoYXJ0T2JqLnJhbmdlRnJvbSwgcmFuZ2VGcm9tKSAmJlxuXHRcdFx0XHREYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKGNoYXJ0T2JqLnJhbmdlVG8sIHJhbmdlVG8pKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBDaGVjayBmaWx0ZXJcblx0XHRcdFx0aWYgKGNoYXJ0T2JqLmZpbHRlck5hbWUgPT0gZmlsdGVyTmFtZSAmJiBjaGFydE9iai5maWx0ZXJWYWx1ZSA9PSBmaWx0ZXJWYWx1ZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIENoZWNrIHRpbWUgdW5pdFxuXHRcdFx0XHRcdGlmIChjaGFydE9iai50aW1lVW5pdCA9PSB0aW1lVW5pdClcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5leHBvcnQgY2xhc3MgQ2hhcnRcbntcblx0Y29uc3RydWN0b3IoYmFzZU1ldHJpYylcblx0e1xuXHRcdHRoaXMuYmFzZU1ldHJpYyA9IGJhc2VNZXRyaWM7XG5cdFx0dGhpcy5kYXRhWCA9IFtdO1xuXHRcdHRoaXMuZGF0YVkgPSBbXTtcblx0XHR0aGlzLnJhbmdlRnJvbTtcblx0XHR0aGlzLnJhbmdlVG87XG5cdFx0dGhpcy50aW1lVW5pdDtcblx0XHR0aGlzLmZpbHRlck5hbWU7XG5cdFx0dGhpcy5maWx0ZXJWYWx1ZTtcblx0fVxufVxuIiwiaW1wb3J0IHtEYXRlSGVscGVyfSBmcm9tICcuLi91dGlscy9kYXRlLWhlbHBlcic7XG5pbXBvcnQge1N0YXRzRGF0YVJhbmdlfSBmcm9tICcuLi9kYXRhLXJhbmdlLW1hbmFnZXInO1xuXG5leHBvcnQgY2xhc3MgTWV0cmljVHlwZVxue1xuXHRzdGF0aWMgZ2V0IE5VTUJFUigpIHsgcmV0dXJuICdudW1iZXInIH1cblx0c3RhdGljIGdldCBQRVJDRU5UQUdFKCkgeyByZXR1cm4gJ3BlcmNlbnRhZ2UnIH1cblx0c3RhdGljIGdldCBUSU1FKCkgeyByZXR1cm4gJ3RpbWUnIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbmV4cG9ydCBjbGFzcyBCYXNlTWV0cmljXG57XG5cdGNvbnN0cnVjdG9yKGlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgdHlwZSwgaXNTdWJNZXRyaWMgPSBmYWxzZSlcblx0e1xuXHRcdHRoaXMuX2lkID0gaWQ7XG5cdFx0dGhpcy5fbmFtZSA9IG5hbWU7XG5cdFx0dGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblx0XHR0aGlzLl90eXBlID0gdHlwZTtcblx0XHR0aGlzLl9pc1N1Yk1ldHJpYyA9IGlzU3ViTWV0cmljO1xuXHR9XG5cblx0Z2V0IGlkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pZDtcblx0fVxuXG5cdGdldCBuYW1lKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9uYW1lO1xuXHR9XG5cblx0Z2V0IGRlc2NyaXB0aW9uKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcblx0fVxuXG5cdGdldCB0eXBlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl90eXBlO1xuXHR9XG5cblx0Z2V0IGlzU3ViTWV0cmljKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pc1N1Yk1ldHJpYztcblx0fVxuXG5cdGdldCBpc1BlcmNlbnRhZ2UoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3R5cGUgPT0gTWV0cmljVHlwZS5QRVJDRU5UQUdFO1xuXHR9XG5cblx0Z2V0IGlzVGltZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdHlwZSA9PSBNZXRyaWNUeXBlLlRJTUU7XG5cdH1cblxuXHRnZXRWYWx1ZUFzU3RyaW5nKHZhbClcblx0e1xuXHRcdGlmICghaXNOYU4odmFsKSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5pc1BlcmNlbnRhZ2UpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh2YWwgPj0gMClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh2YWwgJSAxID09IDApXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsLnRvU3RyaW5nKCkgKyAnJSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbC50b0ZpeGVkKDIpICsgJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gJy0tJztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHRoaXMuaXNUaW1lKVxuXHRcdFx0XHRyZXR1cm4gRGF0ZUhlbHBlci5mb3JtYXRUaW1lKHZhbCk7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh2YWwgJSAxID09IDApXG5cdFx0XHRcdFx0cmV0dXJuIHZhbC50b1N0cmluZygpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmV0dXJuIHZhbC50b0ZpeGVkKDIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gJyc7XG5cdH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTdGF0c0RhdGFGaWx0ZXJcbntcblx0Y29uc3RydWN0b3Iodmlld0lkLCBuYW1lLCB2YWx1ZSlcblx0e1xuXHRcdHRoaXMudmlld0lkID0gdmlld0lkO1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0dG9TRlNPYmplY3QoKVxuXHR7XG5cdFx0bGV0IG9iaiA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRvYmoucHV0VXRmU3RyaW5nKCduYW1lJywgdGhpcy5uYW1lKTtcblx0XHRvYmoucHV0VXRmU3RyaW5nKCd2YWx1ZScsIHRoaXMudmFsdWUpO1xuXG5cdFx0cmV0dXJuIG9iajtcblx0fVxufVxuIiwiaW1wb3J0IHtEYXRlSGVscGVyfSBmcm9tICcuLi91dGlscy9kYXRlLWhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZURhdGFcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5yYW5nZUZyb207XG5cdFx0dGhpcy5yYW5nZVRvO1xuXHRcdHRoaXMuZGF0YTtcblx0fVxuXG5cdGlzRGF0YVVwZGF0ZWQobmV3UmFuZ2VGcm9tLCBuZXdSYW5nZVRvKVxuXHR7XG5cdFx0cmV0dXJuIChEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKHRoaXMucmFuZ2VGcm9tLCBuZXdSYW5nZUZyb20pICYmIERhdGVIZWxwZXIuYXJlRGF0ZVRpbWVzRXF1YWwodGhpcy5yYW5nZVRvLCBuZXdSYW5nZVRvKSk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1ldHJpYywgTWV0cmljVHlwZX0gZnJvbSAnLi9kYXRhL21ldHJpYyc7XG5pbXBvcnQge0RhdGVIZWxwZXJ9IGZyb20gJy4vdXRpbHMvZGF0ZS1oZWxwZXInO1xuaW1wb3J0IHtNZXRyaWNDb250YWluZXIsIENoYXJ0Q29udGFpbmVyfSBmcm9tICcuL2RhdGEvY29udGFpbmVycyc7XG5pbXBvcnQge1RhYmxlRGF0YX0gZnJvbSAnLi9kYXRhL3RhYmxlLWRhdGEnO1xuaW1wb3J0IHtWaWV3TWFuYWdlcn0gZnJvbSAnLi92aWV3LW1hbmFnZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBNZXRyaWNzTWFuYWdlclxue1xuXHRzdGF0aWMgZ2V0IENPTlRBQ1RTKCkgeyByZXR1cm4gJ2NvbnRhY3RzJyB9XG5cdHN0YXRpYyBnZXQgVklTSVRTKCkgeyByZXR1cm4gJ3Zpc2l0cycgfVxuXHRzdGF0aWMgZ2V0IFVOSVFVRV9WSVNJVE9SUygpIHsgcmV0dXJuICd1VmlzaXRvcnMnIH1cblx0c3RhdGljIGdldCBORVdfVklTSVRPUlMoKSB7IHJldHVybiAnblZpc2l0b3JzJyB9XG5cdHN0YXRpYyBnZXQgTkVXX1ZJU0lUT1JTX1ZJU0lUUygpIHsgcmV0dXJuICduVmlzaXRvcnNWaXNpdHMnIH1cblx0c3RhdGljIGdldCBSRVRfVklTSVRPUlMoKSB7IHJldHVybiAnclZpc2l0b3JzJyB9XG5cdHN0YXRpYyBnZXQgUkVUX1ZJU0lUT1JTX1ZJU0lUUygpIHsgcmV0dXJuICdyVmlzaXRvcnNWaXNpdHMnIH1cblx0c3RhdGljIGdldCBQRVJDX05FV19WSVNJVE9SUygpIHsgcmV0dXJuICclbmV3VmlzaXRvcnMnIH1cblx0c3RhdGljIGdldCBQRVJDX1JFVF9WSVNJVE9SUygpIHsgcmV0dXJuICclcmV0VmlzaXRvcnMnIH1cblx0c3RhdGljIGdldCBQRVJDX05FV19WSVNJVFNfMSgpIHsgcmV0dXJuICclbmV3VmlzaXRzMScgfVxuXHQvL3N0YXRpYyBnZXQgUEVSQ19ORVdfVklTSVRTXzIoKSB7IHJldHVybiAnJW5ld1Zpc2l0czInIH1cblx0c3RhdGljIGdldCBBVkdfVklTSVRfRFVSQVRJT04oKSB7IHJldHVybiAnYXZnVmlzaXREdXInIH1cblx0c3RhdGljIGdldCBBVkdfQ0NVKCkgeyByZXR1cm4gJ2F2Z0NjdScgfVxuXHRzdGF0aWMgZ2V0IFBFQUtfQ0NVKCkgeyByZXR1cm4gJ3BlYWtDY3UnIH1cblx0c3RhdGljIGdldCBST09NU19DUkVBVEVEKCkgeyByZXR1cm4gJ3Jvb21zJyB9XG5cdHN0YXRpYyBnZXQgQVZHX1JPT01fRFVSQVRJT04oKSB7IHJldHVybiAnYXZnUm9vbUR1cicgfVxuXHRzdGF0aWMgZ2V0IFBFUkNfR0FNRV9ST09NUygpIHsgcmV0dXJuICclZ2FtZXMnIH1cblx0c3RhdGljIGdldCBST09NX0pPSU5TKCkgeyByZXR1cm4gJ2pvaW5zJyB9XG5cdHN0YXRpYyBnZXQgQVZHX1JPT01fSk9JTlMoKSB7IHJldHVybiAnYXZnSm9pbnMnIH1cblx0c3RhdGljIGdldCBFWENFUFRJT05TKCkgeyByZXR1cm4gJ2V4Y2VwdGlvbnMnIH1cblx0c3RhdGljIGdldCBVTklRVUVfRVhDRVBUSU9OUygpIHsgcmV0dXJuICd1RXhjZXB0aW9ucycgfVxuXHRzdGF0aWMgZ2V0IEFWR19FWENFUFRfT0NDVVJFTkNFKCkgeyByZXR1cm4gJ2F2Z0V4Y09jY3VycicgfVxuXG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5TVUJNRVRSSUNfRElGRiA9ICdkaWZmJztcblx0XHR0aGlzLlNVQk1FVFJJQ19QRVJDID0gJ3BlcmMnO1xuXHRcdHRoaXMuU1VCTUVUUklDX0RJViA9ICdkaXYnO1xuXG5cdFx0dGhpcy5DT05UQUNUUyA9XHRcdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5DT05UQUNUUywgJ0NvbnRhY3RzJywgJ1RvdGFsIG51bWJlciBvZiBjb25uZWN0aW9uc1xcbjxpPkEgY29ubmVjdGlvbiBpcyByZWNvcmRlZCBlYWNoIHRpbWUgYSBzb2NrZXQvQmx1ZUJveCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGJ5IGEgY2xpZW50PC9pPicsIE1ldHJpY1R5cGUuTlVNQkVSKTtcblx0XHR0aGlzLlZJU0lUUyA9XHRcdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMsICdWaXNpdHMnLCAnVG90YWwgbnVtYmVyIG9mIHZpc2l0c1xcbjxpPkEgdmlzaXQgaXMgcmVjb3JkZWQgZWFjaCB0aW1lIGEgdXNlciBwZXJmb3JtcyBhIHN1Y2Nlc3NmdWwgbG9naW48L2k+JywgTWV0cmljVHlwZS5OVU1CRVIpO1xuXHRcdHRoaXMuVU5JUVVFX1ZJU0lUT1JTID1cdFx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLCAnVW5pcXVlIHZpc2l0b3JzJywgJ051bWJlciBvZiB1bmR1cGxpY2F0ZWQgKGNvdW50ZWQgb25seSBvbmNlKSB2aXNpdG9ycyBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kXFxuPGk+VGhlIHZpc2l0b3IgdW5pcXVlbmVzcyBpcyBiYXNlZCBvbiB0aGUgdXNlcm5hbWUgYW5kIGxvZ2luIFpvbmU6IHRoZSBzYW1lIHVzZXJuYW1lIHVzZWQgaW4gZGlmZmVyZW50IFpvbmVzIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBkaWZmZXJlbnQgdmlzaXRvcjwvaT4nLCBNZXRyaWNUeXBlLk5VTUJFUik7XG5cdFx0dGhpcy5ORVdfVklTSVRPUlMgPVx0XHRcdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUywgJ05ldyB2aXNpdG9ycycsICdOdW1iZXIgb2YgZmlyc3QgdGltZSB2aXNpdG9ycywgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZFxcbjxpPkEgdmlzaXRvciBpcyByZWNvcmRlZCBhcyBcXCduZXdcXCcgaWYgaGlzL2hlciB1c2VybmFtZSBoYXMgbmV2ZXIgYmVlbiB1c2VkIGJlZm9yZSBpbiB0aGUgc2FtZSBab25lIChiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIGRhdGEpPC9pPicsIE1ldHJpY1R5cGUuTlVNQkVSKTtcblx0XHR0aGlzLk5FV19WSVNJVE9SU19WSVNJVFMgPVx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTX1ZJU0lUUywgJ1Zpc2l0cyBvZiBuZXcgdmlzaXRvcnMnLCAnVG90YWwgbnVtYmVyIG9mIHZpc2l0cyBvZiBmaXJzdCB0aW1lIHZpc2l0b3JzIG92ZXIgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kXFxuPGk+QSB2aXNpdCBpcyByZWNvcmRlZCBhIFxcJ25ld1xcJyBvdmVyIHRoZSB0aW1lIHBlcmlvZCBpZiB0aGUgdXNlciBpcyByZWNvcmRlZCBhcyBuZXcgdmlzaXRvciBpbiB0aGF0IHBlcmlvZDwvaT4nLCBNZXRyaWNUeXBlLk5VTUJFUik7XG5cdFx0dGhpcy5SRVRfVklTSVRPUlMgPVx0XHRcdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlJFVF9WSVNJVE9SUywgJ1JldHVybmluZyB2aXNpdG9ycycsICdOdW1iZXIgb2YgdmlzaXRvcnMgd2hvc2UgZmlyc3QgdmlzaXQgaGFwcGVuZWQgYmVmb3JlIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZFxcbjxpPkEgdmlzaXRvciBpcyByZWNvcmRlZCBhcyBcXCdyZXR1cm5pbmdcXCcgaWYgaGlzL2hlciB1c2VybmFtZSB3YXMgYWxyZWFkeSB1c2VkIGJlZm9yZSBpbiB0aGUgc2FtZSBab25lIChiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIGRhdGEpPC9pPicsIE1ldHJpY1R5cGUuTlVNQkVSLCB0cnVlKTtcblx0XHR0aGlzLlJFVF9WSVNJVE9SU19WSVNJVFMgPVx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuUkVUX1ZJU0lUT1JTX1ZJU0lUUywgJ1Zpc2l0cyBvZiByZXR1cm5pbmcgdmlzaXRvcnMnLCAnVG90YWwgbnVtYmVyIG9mIHZpc2l0cyBvZiB1c2VycyB3aG9zZSBmaXJzdCB2aXNpdCBoYXBwZW5lZCBiZWZvcmUgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kXFxuPGk+QSB2aXNpdCBpcyByZWNvcmRlZCBhcyBcXCdyZXR1cm5cXCcgb3ZlciB0aGUgdGltZSBwZXJpb2QgaWYgdGhlIHVzZXIgaXMgcmVjb3JkZWQgYXMgYSByZXR1cm5pbmcgdmlzaXRvciBpbiB0aGF0IHBlcmlvZDwvaT4nLCBNZXRyaWNUeXBlLk5VTUJFUiwgdHJ1ZSk7XG5cdFx0dGhpcy5QRVJDX05FV19WSVNJVE9SUyA9XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVE9SUywgJ05ldyB2aXNpdG9ycyAlJywgJ1BlcmNlbnRhZ2Ugb2YgZmlyc3QgdGltZSB2aXNpdG9ycyBvdmVyIHRoZSBudW1iZXIgb2YgdW5pcXVlIHZpc2l0b3JzIGluIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZCcsIE1ldHJpY1R5cGUuUEVSQ0VOVEFHRSwgdHJ1ZSk7XG5cdFx0dGhpcy5QRVJDX1JFVF9WSVNJVE9SUyA9XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX1JFVF9WSVNJVE9SUywgJ1JldHVybmluZyB2aXNpdG9ycyAlJywgJ1BlcmNlbnRhZ2Ugb2YgcmV0dXJuaW5nIHZpc2l0b3JzIG92ZXIgdGhlIG51bWJlciBvZiB1bmlxdWUgdmlzaXRvcnMgaW4gdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kJywgTWV0cmljVHlwZS5QRVJDRU5UQUdFLCB0cnVlKTtcblx0XHR0aGlzLlBFUkNfTkVXX1ZJU0lUU18xID1cdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xLCAnTmV3IHZpc2l0cyAlJywgJ1BlcmNlbnRhZ2Ugb2YgZmlyc3QgdGltZSB2aXNpdHMgb3ZlciB0aGUgdG90YWwgdmlzaXRzIGluIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZCcsIE1ldHJpY1R5cGUuUEVSQ0VOVEFHRSwgdHJ1ZSk7XG5cdFx0Ly90aGlzLlBFUkNfTkVXX1ZJU0lUU18yID1cdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18yLCAnTmV3IHZpc2l0cyAlJywgJ1RCRCcsIE1ldHJpY1R5cGUuUEVSQ0VOVEFHRSwgdHJ1ZSk7XG5cdFx0dGhpcy5BVkdfVklTSVRfRFVSQVRJT04gPVx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OLCAnQXZnLiB2aXNpdCBkdXJhdGlvbicsICdBdmVyYWdlIHRpbWUgZHVyYXRpb24gb2YgYSB2aXNpdCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kXFxuPGk+VGhlIGR1cmF0aW9uIG9mIGEgdmlzaXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsb2dpbiB0aW1lIGFuZCBsb2dvdXQgKG9yIGRpc2Nvbm5lY3Rpb24pIHRpbWU8L2k+JywgTWV0cmljVHlwZS5USU1FKTtcblx0XHR0aGlzLkFWR19DQ1UgPVx0XHRcdFx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX0NDVSwgJ0F2Zy4gY29uY3VycmVudCB1c2VycycsICdBdmVyYWdlIG51bWJlciBvZiBjb25jdXJyZW50IHVzZXJzIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgc2VsZWN0ZWQgdGltZSBwZXJpb2QnLCBNZXRyaWNUeXBlLk5VTUJFUik7XG5cdFx0dGhpcy5QRUFLX0NDVSA9XHRcdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRUFLX0NDVSwgJ1BlYWsgY29uY3VycmVudCB1c2VycycsICdQZWFrIG51bWJlciBvZiBjb25jdXJyZW50IHVzZXJzIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgc2VsZWN0ZWQgdGltZSBwZXJpb2QnLCBNZXRyaWNUeXBlLk5VTUJFUik7XG5cdFx0dGhpcy5ST09NU19DUkVBVEVEID1cdFx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuUk9PTVNfQ1JFQVRFRCwgJ1Jvb21zIGNyZWF0ZWQnLCAnVG90YWwgbnVtYmVyIG9mIFJvb21zIGNyZWF0ZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZCcsIE1ldHJpY1R5cGUuTlVNQkVSKTtcblx0XHR0aGlzLkFWR19ST09NX0RVUkFUSU9OID1cdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkFWR19ST09NX0RVUkFUSU9OLCAnQXZnLiBSb29tIGR1cmF0aW9uJywgJ0F2ZXJhZ2UgdGltZSBkdXJhdGlvbiBvZiBkeW5hbWljIFJvb21zXFxuPGk+VGhlIGR1cmF0aW9uIG9mIGEgUm9vbSBpcyB0aGUgdGltZSB0aGF0IG9jY3VycyBiZXR3ZWVuIGl0cyBjcmVhdGlvbiBhbmQgaXRzIGRlc3RydWN0aW9uLCBiYXNlZCBvbiB0aGUgcmVtb3ZhbCBwb2xpY3kgc2V0IGZvciB0aGUgUm9vbTwvaT4nLCBNZXRyaWNUeXBlLlRJTUUpO1xuXHRcdHRoaXMuUEVSQ19HQU1FX1JPT01TID1cdFx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuUEVSQ19HQU1FX1JPT01TLCAnR2FtZSBSb29tcyAlJywgJ1BlcmNlbnRhZ2Ugb2YgR2FtZSBSb29tcyBvdmVyIHRoZSB0b3RhbCBudW1iZXIgb2YgUm9vbXMgY3JlYXRlZFxcbjxpPkEgUm9vbSBpcyBvZiB0eXBlIEdhbWUgaWYgdGhlIFxcJ2lzR2FtZVxcJyBmbGFnIGlzIHNldCB0byB0cnVlIGR1cmluZyB0aGUgUm9vbSBjcmVhdGlvbjwvaT4nLCBNZXRyaWNUeXBlLlBFUkNFTlRBR0UpO1xuXHRcdHRoaXMuUk9PTV9KT0lOUyA9XHRcdFx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuUk9PTV9KT0lOUywgJ1Jvb20gam9pbnMnLCAnTnVtYmVyIG9mIFJvb20gam9pbnMgcmVnaXN0ZXJlZCBkdXJpbmcgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kJywgTWV0cmljVHlwZS5OVU1CRVIpO1xuXHRcdHRoaXMuQVZHX1JPT01fSk9JTlMgPVx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5BVkdfUk9PTV9KT0lOUywgJ0F2Zy4gUm9vbSBqb2lucyBwZXIgdXNlcicsICdBdmVyYWdlIG51bWJlciBvZiBSb29tIGpvaW5zIG92ZXIgdGhlIG51bWJlciBvZiB1bmlxdWUgdmlzaXRvcnNcXG48aT5JZiB0aGUgUm9vbXMgY3JlYXRlZCBhcmUgbW9zdGx5IEdhbWUgUm9vbXMsIHRoaXMgbWV0cmljIHNob3dzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBtYXRjaGVzIHBsYXllZCBieSBlYWNoIHZpc2l0b3I8L2k+JywgTWV0cmljVHlwZS5OVU1CRVIsIHRydWUpO1xuXHRcdHRoaXMuRVhDRVBUSU9OUyA9XHRcdFx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuRVhDRVBUSU9OUywgJ0V4Y2VwdGlvbnMnLCAnVG90YWwgbnVtYmVyIG9mIGV4Y2VwdGlvbnNcXG48aT5BbiBleGNlcHRpb24gY2FuIGJlIGVpdGhlciBhbiBFUlJPUiBvciBhIFdBUk5JTkc8L2k+JywgTWV0cmljVHlwZS5OVU1CRVIpO1xuXHRcdHRoaXMuVU5JUVVFX0VYQ0VQVElPTlMgPVx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuVU5JUVVFX0VYQ0VQVElPTlMsICdVbmlxdWUgZXhjZXB0aW9ucycsICdOdW1iZXIgb2YgdW5kdXBsaWNhdGVkIChjb3VudGVkIG9ubHkgb25jZSkgZXhjZXB0aW9ucyBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kXFxuPGk+VGhlIGV4Y2VwdGlvbiB1bmlxdWVuZXNzIGlzIGJhc2VkIG9uIHRoZSBlcnJvci93YXJuaW5nIGRlc2NyaXB0aW9uPC9pPicsIE1ldHJpY1R5cGUuTlVNQkVSKTtcblx0XHR0aGlzLkFWR19FWENFUFRfT0NDVVJFTkNFID1cdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkFWR19FWENFUFRfT0NDVVJFTkNFLCAnQXZnLiBleGNlcHRpb24gb2NjdXJyZW5jZScsICdBdmVyYWdlIG51bWJlciBvZiB0aW1lcyBhIHVuaXF1ZSBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZCcsIE1ldHJpY1R5cGUuTlVNQkVSLCB0cnVlKTtcblxuXHRcdC8vIENvbmZpZ3VyZSBtZXRyaWNzIGFuZCB0YWJsZSBkYXRhXG5cblx0XHR0aGlzLl9tZXRyaWNDb250YWluZXJzID0gW107XG5cdFx0dGhpcy5fY2hhcnRDb250YWluZXJzID0gW107XG5cdFx0dGhpcy5fbGlzdE1ldHJpY3MgPSBbXTtcblx0XHR0aGlzLl90YWJsZURhdGFDb250YWluZXIgPSBbXTtcblx0XHR0aGlzLl90YWJsZURhdGFNZXRyaWNzID0gW3RoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OXTtcblxuXHRcdGxldCB2aWV3SWQ7XG5cblx0XHQvLyBPdmVydmlld1xuXHRcdHZpZXdJZCA9IFZpZXdNYW5hZ2VyLk9WRVJWSUVXO1xuXHRcdHRoaXMuX21ldHJpY0NvbnRhaW5lcnNbdmlld0lkXSA9IG5ldyBNZXRyaWNDb250YWluZXIodmlld0lkLCBbdGhpcy5DT05UQUNUUywgdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5SRVRfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTX1ZJU0lUUywgdGhpcy5SRVRfVklTSVRPUlNfVklTSVRTLCB0aGlzLlBFUkNfTkVXX1ZJU0lUT1JTLCB0aGlzLlBFUkNfUkVUX1ZJU0lUT1JTLCB0aGlzLlBFUkNfTkVXX1ZJU0lUU18xLCB0aGlzLkFWR19WSVNJVF9EVVJBVElPTiwgdGhpcy5BVkdfQ0NVLCB0aGlzLlBFQUtfQ0NVLCB0aGlzLkVYQ0VQVElPTlNdKTtcblx0XHR0aGlzLl9jaGFydENvbnRhaW5lcnNbdmlld0lkXSA9IG5ldyBDaGFydENvbnRhaW5lcih2aWV3SWQsIFt0aGlzLkNPTlRBQ1RTLCB0aGlzLlZJU0lUUywgdGhpcy5VTklRVUVfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTLCB0aGlzLlBFUkNfTkVXX1ZJU0lUU18xLCB0aGlzLkFWR19WSVNJVF9EVVJBVElPTiwgdGhpcy5BVkdfQ0NVXSk7XG5cdFx0dGhpcy5fbGlzdE1ldHJpY3Nbdmlld0lkXSA9IFt0aGlzLkNPTlRBQ1RTLCB0aGlzLlZJU0lUUywgdGhpcy5VTklRVUVfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTLCB0aGlzLlBFUkNfTkVXX1ZJU0lUU18xLCB0aGlzLkFWR19WSVNJVF9EVVJBVElPTiwgdGhpcy5BVkdfQ0NVLCB0aGlzLlBFQUtfQ0NVLCB0aGlzLkVYQ0VQVElPTlNdO1xuXG5cdFx0Ly8gRGVtb2dyYXBoaWNzXG5cdFx0dmlld0lkID0gVmlld01hbmFnZXIuREVNT0dSQVBISUNTO1xuXHRcdHRoaXMuX21ldHJpY0NvbnRhaW5lcnNbdmlld0lkXSA9IG5ldyBNZXRyaWNDb250YWluZXIodmlld0lkLCBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5SRVRfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTX1ZJU0lUUywgdGhpcy5SRVRfVklTSVRPUlNfVklTSVRTLCB0aGlzLlBFUkNfTkVXX1ZJU0lUT1JTLCB0aGlzLlBFUkNfUkVUX1ZJU0lUT1JTLCB0aGlzLlBFUkNfTkVXX1ZJU0lUU18xLCB0aGlzLkFWR19WSVNJVF9EVVJBVElPTl0pO1xuXHRcdHRoaXMuX2NoYXJ0Q29udGFpbmVyc1t2aWV3SWRdID0gbmV3IENoYXJ0Q29udGFpbmVyKHZpZXdJZCwgW3RoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzFdKTtcblx0XHR0aGlzLl9saXN0TWV0cmljc1t2aWV3SWRdID0gW3RoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OXTtcblx0XHR0aGlzLl90YWJsZURhdGFDb250YWluZXJbdmlld0lkXSA9IG5ldyBUYWJsZURhdGEoKTtcblxuXHRcdC8vIFRlY2hub2xvZ3lcblx0XHR2aWV3SWQgPSBWaWV3TWFuYWdlci5URUNITk9MT0dZO1xuXHRcdHRoaXMuX21ldHJpY0NvbnRhaW5lcnNbdmlld0lkXSA9IG5ldyBNZXRyaWNDb250YWluZXIodmlld0lkLCBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5SRVRfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTX1ZJU0lUUywgdGhpcy5SRVRfVklTSVRPUlNfVklTSVRTLCB0aGlzLlBFUkNfTkVXX1ZJU0lUT1JTLCB0aGlzLlBFUkNfUkVUX1ZJU0lUT1JTLCB0aGlzLlBFUkNfTkVXX1ZJU0lUU18xLCB0aGlzLkFWR19WSVNJVF9EVVJBVElPTl0pO1xuXHRcdHRoaXMuX2NoYXJ0Q29udGFpbmVyc1t2aWV3SWRdID0gbmV3IENoYXJ0Q29udGFpbmVyKHZpZXdJZCwgW3RoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzFdKTtcblx0XHR0aGlzLl9saXN0TWV0cmljc1t2aWV3SWRdID0gW3RoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OXTtcblx0XHR0aGlzLl90YWJsZURhdGFDb250YWluZXJbdmlld0lkXSA9IG5ldyBUYWJsZURhdGEoKTtcblxuXHRcdC8vIEFwcGxpY2F0aW9uXG5cdFx0dmlld0lkID0gVmlld01hbmFnZXIuQVBQTElDQVRJT047XG5cdFx0dGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdID0gbmV3IE1ldHJpY0NvbnRhaW5lcih2aWV3SWQsIFt0aGlzLlZJU0lUUywgdGhpcy5VTklRVUVfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTLCB0aGlzLlJFVF9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlNfVklTSVRTLCB0aGlzLlJFVF9WSVNJVE9SU19WSVNJVFMsIHRoaXMuUEVSQ19ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19SRVRfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OLCB0aGlzLkFWR19DQ1UsIHRoaXMuUEVBS19DQ1UsIHRoaXMuUk9PTVNfQ1JFQVRFRCwgdGhpcy5BVkdfUk9PTV9EVVJBVElPTiwgdGhpcy5QRVJDX0dBTUVfUk9PTVMsIHRoaXMuUk9PTV9KT0lOUywgdGhpcy5BVkdfUk9PTV9KT0lOU10pO1xuXHRcdHRoaXMuX2NoYXJ0Q29udGFpbmVyc1t2aWV3SWRdID0gbmV3IENoYXJ0Q29udGFpbmVyKHZpZXdJZCwgW3RoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OLCB0aGlzLkFWR19DQ1VdKTtcblx0XHR0aGlzLl9saXN0TWV0cmljc1t2aWV3SWRdID0gW3RoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OLCB0aGlzLkFWR19DQ1UsIHRoaXMuUEVBS19DQ1UsIHRoaXMuUk9PTVNfQ1JFQVRFRCwgdGhpcy5BVkdfUk9PTV9EVVJBVElPTiwgdGhpcy5QRVJDX0dBTUVfUk9PTVMsIHRoaXMuUk9PTV9KT0lOUywgdGhpcy5BVkdfUk9PTV9KT0lOU107XG5cdFx0dGhpcy5fdGFibGVEYXRhQ29udGFpbmVyW3ZpZXdJZF0gPSBuZXcgVGFibGVEYXRhKCk7XG5cblx0XHQvLyBFeGNlcHRpb25cblx0XHR2aWV3SWQgPSBWaWV3TWFuYWdlci5FWENFUFRJT05TO1xuXHRcdHRoaXMuX21ldHJpY0NvbnRhaW5lcnNbdmlld0lkXSA9IG5ldyBNZXRyaWNDb250YWluZXIodmlld0lkLCBbdGhpcy5WSVNJVFMsIHRoaXMuRVhDRVBUSU9OUywgdGhpcy5VTklRVUVfRVhDRVBUSU9OUywgdGhpcy5BVkdfRVhDRVBUX09DQ1VSRU5DRV0pO1xuXHRcdHRoaXMuX2NoYXJ0Q29udGFpbmVyc1t2aWV3SWRdID0gbmV3IENoYXJ0Q29udGFpbmVyKHZpZXdJZCwgW3RoaXMuRVhDRVBUSU9OUywgdGhpcy5VTklRVUVfRVhDRVBUSU9OU10pO1xuXHRcdHRoaXMuX2xpc3RNZXRyaWNzW3ZpZXdJZF0gPSBbdGhpcy5FWENFUFRJT05TLCB0aGlzLlVOSVFVRV9FWENFUFRJT05TLCB0aGlzLkFWR19FWENFUFRfT0NDVVJFTkNFXTtcblx0XHR0aGlzLl90YWJsZURhdGFDb250YWluZXJbdmlld0lkXSA9IG5ldyBUYWJsZURhdGEoKTtcblx0fVxuXG5cdGRlc3Ryb3koKVxuXHR7XG5cdFx0Ly8gTm90aGluZyB0byBkbz9cblx0fVxuXG5cdGdldEJhc2VNZXRyaWModmlld0lkLCBtZXRyaWNJZClcblx0e1xuXHRcdGxldCBjb250YWluZXIgPSB0aGlzLl9tZXRyaWNDb250YWluZXJzW3ZpZXdJZF07XG5cblx0XHRpZiAoY29udGFpbmVyICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IG1ldHJpYyA9IGNvbnRhaW5lci5tYWluTWV0cmljc1ttZXRyaWNJZF07XG5cblx0XHRcdGlmIChtZXRyaWMgIT0gbnVsbClcblx0XHRcdFx0cmV0dXJuIG1ldHJpYy5iYXNlTWV0cmljO1xuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0QmFzZU1ldHJpY3NEaXNwbGF5TGlzdCh2aWV3SWQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbGlzdE1ldHJpY3Nbdmlld0lkXTtcblx0fVxuXG5cdGdldE1ldHJpY0RhdGFDb250YWluZXIodmlld0lkKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21ldHJpY0NvbnRhaW5lcnNbdmlld0lkXTtcblx0fVxuXG5cdGdldENoYXJ0RGF0YUNvbnRhaW5lcih2aWV3SWQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2hhcnRDb250YWluZXJzW3ZpZXdJZF07XG5cdH1cblxuXHRnZXRUYWJsZURhdGFNZXRyaWNzKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl90YWJsZURhdGFNZXRyaWNzO1xuXHR9XG5cblx0Z2V0VGFibGVEYXRhKHZpZXdJZClcblx0e1xuXHRcdHJldHVybiB0aGlzLl90YWJsZURhdGFDb250YWluZXJbdmlld0lkXTtcblx0fVxuXG5cdGlzTWV0cmljSW5EaXNwbGF5TGlzdCh2aWV3SWQsIG1ldHJpY0lkKVxuXHR7XG5cdFx0bGV0IGJhc2VNZXRyaWMgPSB0aGlzLmdldEJhc2VNZXRyaWModmlld0lkLCBtZXRyaWNJZCk7XG5cblx0XHRpZiAoYmFzZU1ldHJpYyAhPSBudWxsKVxuXHRcdFx0cmV0dXJuIHRoaXMuX2xpc3RNZXRyaWNzW3ZpZXdJZF0uaW5kZXhPZihiYXNlTWV0cmljKSA+IC0xO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtTRlNPYmplY3R9IGNoYXJ0RGF0YVxuXHQgKiBAcGFyYW0gIHthcnJheX0gdXBkYXRhYmxlVmlld3Ncblx0ICogQHBhcmFtICB7U3RhdHNEYXRhUmFuZ2V9IHNkclxuXHQgKiBAcGFyYW0gIHtTdGF0c0RhdGFGaWx0ZXJ9IGZpbHRlclxuXHQgKiBAcGFyYW0gIHt0aW1lVW5pdH0gdGltZVVuaXRcblx0ICovXG5cdHVwZGF0ZUNoYXJ0KGNoYXJ0RGF0YSwgdXBkYXRhYmxlVmlld3MsIHNkciwgZmlsdGVyLCB0aW1lVW5pdClcblx0e1xuXHRcdGxldCBjaGFydElkID0gY2hhcnREYXRhLmdldFV0ZlN0cmluZygnaWQnKTtcblx0XHRsZXQgaXNNYWluID0gKGNoYXJ0RGF0YS5nZXRVdGZTdHJpbmcoJ3R5cGUnKSA9PSAnbWFpbicpO1xuXHRcdGxldCBkYXRhWFggPSBjaGFydERhdGEuZ2V0U0ZTQXJyYXkoJ3gnKTtcblx0XHRsZXQgZGF0YVlZID0gY2hhcnREYXRhLmdldFNGU0FycmF5KCd5Jyk7XG5cblx0XHQvLyBDb252ZXJ0IGRhdGFcblx0XHRsZXQgZGF0YVggPSBbXTtcblx0XHRsZXQgZGF0YVkgPSBbXTtcblxuXHRcdGZvciAobGV0IGQgPSAwOyBkIDwgZGF0YVhYLnNpemUoKTsgZCsrKVxuXHRcdHtcblx0XHRcdGxldCB4ID0gZGF0YVhYLmdldFV0ZlN0cmluZyhkKTtcblx0XHRcdGxldCB5ID0gZGF0YVlZLmdldChkKTtcblxuXHRcdFx0ZGF0YVgucHVzaCh4KTtcblx0XHRcdGRhdGFZLnB1c2goeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGFibGVWaWV3cy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgdmlld0lkID0gdXBkYXRhYmxlVmlld3NbaV07XG5cdFx0XHRsZXQgY2MgPSB0aGlzLmdldENoYXJ0RGF0YUNvbnRhaW5lcih2aWV3SWQpO1xuXHRcdFx0bGV0IGNoYXJ0T2JqID0gaXNNYWluID8gY2MuZ2V0TWFpbkNoYXJ0KGNoYXJ0SWQpIDogY2MuZ2V0Q29tcGFyZUNoYXJ0KGNoYXJ0SWQpO1xuXG5cdFx0XHQvLyBDaGFydCBvYmogbWlnaHQgYmUgbnVsbCBpZiB0aGF0IGNoYXJ0IGlkIGlzIG5vdCBhdmFpYWxibGUgZm9yIHRoZSBzZWxlY3RlZCB2aWV3XG5cdFx0XHRpZiAoY2hhcnRPYmogIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Y2hhcnRPYmouZGF0YVggPSBkYXRhWDtcblx0XHRcdFx0Y2hhcnRPYmouZGF0YVkgPSBkYXRhWTtcblx0XHRcdFx0Y2hhcnRPYmoucmFuZ2VGcm9tID0gbW9tZW50KGlzTWFpbiA/IHNkci5tYWluRnJvbSA6IHNkci5jb21wYXJlRnJvbSk7XG5cdFx0XHRcdGNoYXJ0T2JqLnJhbmdlVG8gPSBtb21lbnQoaXNNYWluID8gc2RyLm1haW5UbyA6IHNkci5jb21wYXJlVG8pO1xuXHRcdFx0XHRjaGFydE9iai50aW1lVW5pdCA9IHRpbWVVbml0O1xuXHRcdFx0XHRjaGFydE9iai5maWx0ZXJOYW1lID0gKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLm5hbWUgOiBudWxsKTtcblx0XHRcdFx0Y2hhcnRPYmouZmlsdGVyVmFsdWUgPSAoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIudmFsdWUgOiBudWxsKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7U0ZTQXJyYXl9IHRhYmxlRGF0YVxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IHZpZXdJZFxuXHQgKiBAcGFyYW0gIHtTdGF0c0RhdGFSYW5nZX0gc2RyXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqL1xuXHR1cGRhdGVUYWJsZSh0YWJsZURhdGEsIHZpZXdJZCwgc2RyLCBmaWx0ZXIpXG5cdHtcblx0XHRsZXQgdGQgPSB0aGlzLl90YWJsZURhdGFDb250YWluZXJbdmlld0lkXTtcblxuXHRcdGlmICh0ZCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHRkLnJhbmdlRnJvbSA9IG1vbWVudChzZHIubWFpbkZyb20pO1xuXHRcdFx0dGQucmFuZ2VUbyA9IG1vbWVudChzZHIubWFpblRvKTtcblxuXHRcdFx0bGV0IGRhdGEgPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZURhdGEuc2l6ZSgpOyBpKyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkYXRhQXJyID0gdGFibGVEYXRhLmdldFNGU0FycmF5KGkpO1xuXHRcdFx0XHRsZXQgb2JqID0ge307XG5cdFx0XHRcdGxldCBpbmRleCA9IDA7XG5cblx0XHRcdFx0aWYgKHZpZXdJZCA9PSBWaWV3TWFuYWdlci5ERU1PR1JBUEhJQ1MpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvYmouY291bnRyeUNvZGUgPSBkYXRhQXJyLmdldFV0ZlN0cmluZyhpbmRleCsrKTtcblx0XHRcdFx0XHRvYmouY291bnRyeU5hbWUgPSBkYXRhQXJyLmdldFV0ZlN0cmluZyhpbmRleCsrKTtcblxuXHRcdFx0XHRcdC8vIGlmIChvYmouY291bnRyeU5hbWUgPT0gJycpXG5cdFx0XHRcdFx0Ly8gXHRvYmouY291bnRyeU5hbWUgPSAnW3Vua25vd25dJztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh2aWV3SWQgPT0gVmlld01hbmFnZXIuVEVDSE5PTE9HWSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9iai5wbGF0Zm9ybSA9IGRhdGFBcnIuZ2V0VXRmU3RyaW5nKGluZGV4KyspO1xuXHRcdFx0XHRcdG9iai52ZXJzaW9uID0gZGF0YUFyci5nZXRVdGZTdHJpbmcoaW5kZXgrKyk7XG5cblx0XHRcdFx0XHQvLyBpZiAob2JqLnBsYXRmb3JtID09ICcnKVxuXHRcdFx0XHRcdC8vIFx0b2JqLnBsYXRmb3JtID0gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0Ly9cblx0XHRcdFx0XHQvLyBpZiAob2JqLnZlcnNpb24gPT0gJycpXG5cdFx0XHRcdFx0Ly8gXHRvYmoudmVyc2lvbiA9ICdbdW5rbm93bl0nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHZpZXdJZCA9PSBWaWV3TWFuYWdlci5BUFBMSUNBVElPTilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9iai56b25lID0gZGF0YUFyci5nZXRVdGZTdHJpbmcoaW5kZXgrKyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAodmlld0lkID09IFZpZXdNYW5hZ2VyLkVYQ0VQVElPTlMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvYmoudHlwZSA9IGRhdGFBcnIuZ2V0VXRmU3RyaW5nKGluZGV4KyspO1xuXHRcdFx0XHRcdG9iai5kZXNjcmlwdGlvbiA9IGRhdGFBcnIuZ2V0VXRmU3RyaW5nKGluZGV4KyspO1xuXHRcdFx0XHRcdG9ialtNZXRyaWNzTWFuYWdlci5FWENFUFRJT05TXSA9IGRhdGFBcnIuZ2V0TG9uZyhpbmRleCsrKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkYXRhIGNvbW1vbiB0byAoYWxtb3N0KSBhbGwgdmlld3Ncblx0XHRcdFx0aWYgKHZpZXdJZCAhPSBWaWV3TWFuYWdlci5FWENFUFRJT05TKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2JqW01ldHJpY3NNYW5hZ2VyLlZJU0lUU10gPSBkYXRhQXJyLmdldExvbmcoaW5kZXgrKyk7XG5cdFx0XHRcdFx0b2JqW01ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SU10gPSBkYXRhQXJyLmdldExvbmcoaW5kZXgrKyk7XG5cdFx0XHRcdFx0b2JqW01ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SU10gPSBkYXRhQXJyLmdldExvbmcoaW5kZXgrKyk7XG5cdFx0XHRcdFx0b2JqW01ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xXSA9IGRhdGFBcnIuZ2V0RG91YmxlKGluZGV4KyspO1xuXHRcdFx0XHRcdG9ialtNZXRyaWNzTWFuYWdlci5BVkdfVklTSVRfRFVSQVRJT05dID0gZGF0YUFyci5nZXRMb25nKGluZGV4KyspO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGF0YS5wdXNoKG9iaik7XG5cdFx0XHR9XG5cblx0XHRcdHRkLmRhdGEgPSBkYXRhO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtTRlNPYmplY3R9IG1ldHJpY3NEYXRhXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YVJhbmdlfSBzZHJcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICovXG5cdHVwZGF0ZU1ldHJpY3MobWV0cmljc0RhdGEsIHNkciwgZmlsdGVyKVxuXHR7XG5cdFx0bGV0IG1ldHJpY0tleXNBcnJheSA9IG1ldHJpY3NEYXRhLmdldEtleXNBcnJheSgpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWV0cmljS2V5c0FycmF5Lmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBtZXRyaWNJZCA9IG1ldHJpY0tleXNBcnJheVtpXTtcblx0XHRcdGxldCBuZXdNZXRyaWNWYWx1ZXMgPSBtZXRyaWNzRGF0YS5nZXRTRlNPYmplY3QobWV0cmljSWQpO1xuXG5cdFx0XHQvLyBDeWNsZSB0aHJvdWdoIGFsbCB2aWV3cyB1cGRhdGluZyBtZXRyaWNzIHdpdGggdmFsdWVzIHNlbnQgYnkgdGhlIHNlcnZlclxuXHRcdFx0Zm9yIChsZXQgdiA9IDA7IHYgPCBWaWV3TWFuYWdlci5WSUVXUy5sZW5ndGg7IHYrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHZpZXdJZCA9IFZpZXdNYW5hZ2VyLlZJRVdTW3ZdO1xuXHRcdFx0XHRsZXQgbUNvbnRhaW5lciA9IHRoaXMuX21ldHJpY0NvbnRhaW5lcnNbdmlld0lkXTtcblxuXHRcdFx0XHRpZiAobUNvbnRhaW5lci5jb250YWluc01ldHJpYyhtZXRyaWNJZCkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBNQUlOIE1FVFJJQ1xuXG5cdFx0XHRcdFx0bGV0IGhhc01haW4gPSBuZXdNZXRyaWNWYWx1ZXMuY29udGFpbnNLZXkoJ21haW4nKTtcblx0XHRcdFx0XHRsZXQgaGFzTWFpbkYgPSBuZXdNZXRyaWNWYWx1ZXMuY29udGFpbnNLZXkoJ21haW5fZicpO1xuXG5cdFx0XHRcdFx0aWYgKGhhc01haW4gfHwgaGFzTWFpbkYpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG1NZXRyaWMgPSBtQ29udGFpbmVyLmdldE1haW5NZXRyaWMobWV0cmljSWQpO1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlTWV0cmljKHZpZXdJZCwgbU1ldHJpYywgc2RyLm1haW5Gcm9tLCBzZHIubWFpblRvLCBmaWx0ZXIsIChoYXNNYWluID8gbmV3TWV0cmljVmFsdWVzLmdldCgnbWFpbicpIDogTmFOKSwgKGhhc01haW5GID8gbmV3TWV0cmljVmFsdWVzLmdldCgnbWFpbl9mJykgOiBOYU4pKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBDT01QQVJFIE1FVFJJQ1xuXG5cdFx0XHRcdFx0bGV0IGhhc0NvbXAgPSBuZXdNZXRyaWNWYWx1ZXMuY29udGFpbnNLZXkoJ2NvbXAnKTtcblx0XHRcdFx0XHRsZXQgaGFzQ29tcEYgPSBuZXdNZXRyaWNWYWx1ZXMuY29udGFpbnNLZXkoJ2NvbXBfZicpO1xuXG5cdFx0XHRcdFx0aWYgKGhhc0NvbXAgfHwgaGFzQ29tcEYpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGNNZXRyaWMgPSBtQ29udGFpbmVyLmdldENvbXBhcmVNZXRyaWMobWV0cmljSWQpO1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlTWV0cmljKHZpZXdJZCwgY01ldHJpYywgc2RyLmNvbXBhcmVGcm9tLCBzZHIuY29tcGFyZVRvLCBmaWx0ZXIsIChoYXNDb21wID8gbmV3TWV0cmljVmFsdWVzLmdldCgnY29tcCcpIDogTmFOKSwgKGhhc0NvbXBGID8gbmV3TWV0cmljVmFsdWVzLmdldCgnY29tcF9mJykgOiBOYU4pKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVcGRhdGUgc3ViLW1ldHJpY3MgdXNpbmcgdmFsdWVzIG9mIHRoZSBtYWluIG1ldHJpY3Ncblx0XHRcdFx0dGhpcy5fdXBkYXRlU3ViTWV0cmljcyh2aWV3SWQsIHNkciwgZmlsdGVyKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZpZXdJZFxuXHQgKi9cblx0cmVzZXRNZXRyaWNzRmlsdGVyKHZpZXdJZClcblx0e1xuXHRcdGxldCBtQ29udGFpbmVyID0gdGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtQ29udGFpbmVyLm1ldHJpY0lkcy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgbWV0cmljSWQgPSBtQ29udGFpbmVyLm1ldHJpY0lkc1tpXTtcblxuXHRcdFx0Ly8gTUFJTiBNRVRSSUNcblx0XHRcdGxldCBtTWV0cmljID0gbUNvbnRhaW5lci5nZXRNYWluTWV0cmljKG1ldHJpY0lkKTtcblx0XHRcdG1NZXRyaWMucmVzZXRWYWx1ZUYoKTtcblxuXHRcdFx0Ly8gQ09NUEFSRSBNRVRSSUNcblx0XHRcdGxldCBjTWV0cmljID0gbUNvbnRhaW5lci5nZXRDb21wYXJlTWV0cmljKG1ldHJpY0lkKTtcblx0XHRcdGNNZXRyaWMucmVzZXRWYWx1ZUYoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7c3RyaW5nfSB2aWV3SWRcblx0ICogQHBhcmFtICB7TWV0cmljfSBtZXRyaWNcblx0ICogQHBhcmFtICB7bW9tZW50fSBuZXdSYW5nZUZyb21cblx0ICogQHBhcmFtICB7bW9tZW50fSBuZXdSYW5nZVRvXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqIEBwYXJhbSAge251bWJlcn0gdmFsdWVcblx0ICogQHBhcmFtICB7bnVtYmVyfSB2YWx1ZUZcblx0ICovXG5cdF91cGRhdGVNZXRyaWModmlld0lkLCBtZXRyaWMsIG5ld1JhbmdlRnJvbSwgbmV3UmFuZ2VUbywgZmlsdGVyLCB2YWx1ZSA9IE5hTiwgdmFsdWVGID0gTmFOKVxuXHR7XG5cdFx0bGV0IHJhbmdlQ2hhbmdlZCA9ICghRGF0ZUhlbHBlci5hcmVEYXRlVGltZXNFcXVhbChtZXRyaWMucmFuZ2VGcm9tLCBuZXdSYW5nZUZyb20pIHx8ICFEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKG1ldHJpYy5yYW5nZVRvLCBuZXdSYW5nZVRvKSk7XG5cblx0XHQvLyBJZiByYW5nZSBoYXMgY2hhbmdlZCB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBmaWx0ZXJlZCB2YWx1ZSB0b28sXG5cdFx0Ly8gdG8gbWFrZSBzdXJlIGl0IHdpbGwgYmUgdXBkYXRlZCBpbiB0aGUgbmV4dCBzdGVwIG9yIGV2ZW4gbGF0ZXJcblx0XHRpZiAocmFuZ2VDaGFuZ2VkKVxuXHRcdHtcblx0XHRcdG1ldHJpYy5yYW5nZUZyb20gPSBtb21lbnQobmV3UmFuZ2VGcm9tKTtcblx0XHRcdG1ldHJpYy5yYW5nZVRvID0gbW9tZW50KG5ld1JhbmdlVG8pO1xuXHRcdFx0bWV0cmljLnJlc2V0VmFsdWVGKCk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgcmFuZ2UgZGlkbid0IGNoYW5nZSwgYnV0IHRoZSBmaWx0ZXIgZGlkLCB3ZSBoYXZlIHRvIHJlc2V0IHRoZSB2YWx1ZSB0b28sXG5cdFx0Ly8gc28gaW4gY2FzZSB0aGUgZmlsdGVyIHdhcyByZW1vdmVkIHRoZSBvdmVyYWxsIHZhbHVlIHdpbGwgYmUgZGlzcGxheWVkXG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIudmlld0lkID09IHZpZXdJZCAmJiAoZmlsdGVyLm5hbWUgIT0gbWV0cmljLmZpbHRlck5hbWUgfHwgZmlsdGVyLnZhbHVlICE9IG1ldHJpYy5maWx0ZXJWYWx1ZSkpXG5cdFx0XHRcdG1ldHJpYy5yZXNldFZhbHVlRigpO1xuXHRcdH1cblxuXHRcdC8vIFVwZGF0ZSBvdmVyYWxsIHZhbHVlXG5cdFx0aWYgKCFpc05hTih2YWx1ZSkpXG5cdFx0XHRtZXRyaWMuc2V0VmFsdWUodmFsdWUpO1xuXG5cdFx0Ly8gVXBkYXRlIGZpbHRlcmVkIHZhbHVlIGZvciB0aGUgY29ycmVzcG9uZGluZyB2aWV3IG9ubHlcblx0XHRpZiAoIWlzTmFOKHZhbHVlRikgJiYgZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLnZpZXdJZCA9PSB2aWV3SWQpXG5cdFx0XHRtZXRyaWMuc2V0VmFsdWVGKHZhbHVlRiwgZmlsdGVyLm5hbWUsIGZpbHRlci52YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7c3RyaW5nfSB2aWV3SWRcblx0ICogQHBhcmFtICB7c3RyaW5nfSBjaGlsZE1ldHJpY0lkXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gcGFyZW50TWV0cmljMUlkXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gcGFyZW50TWV0cmljMklkXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gb3BlcmF0aW9uXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YVJhbmdlfSBzZHJcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICovXG5cdF91cGRhdGVTdWJNZXRyaWModmlld0lkLCBjaGlsZE1ldHJpY0lkLCBwYXJlbnRNZXRyaWMxSWQsIHBhcmVudE1ldHJpYzJJZCwgb3BlcmF0aW9uLCBzZHIsIGZpbHRlcilcblx0e1xuXHRcdGxldCBtQ29udGFpbmVyID0gdGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdO1xuXG5cdFx0Ly8gUGFyZW50IG1ldHJpY3MgbXVzdCBiZSBhbHJlYWR5IHVwZGF0ZWQgdG8gcHJvY2VlZFxuXHRcdGlmIChtQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChwYXJlbnRNZXRyaWMxSWQsIHNkciwgZmlsdGVyKSAmJlxuXHRcdFx0bUNvbnRhaW5lci5pc01ldHJpY1VwZGF0ZWQocGFyZW50TWV0cmljMklkLCBzZHIsIGZpbHRlcikpXG5cdFx0e1xuXHRcdFx0Ly8gTUFJTiBWQUxVRVNcblx0XHRcdGxldCBtX3BhcmVudE1ldHJpYzEgPSBtQ29udGFpbmVyLmdldE1haW5NZXRyaWMocGFyZW50TWV0cmljMUlkKTtcblx0XHRcdGxldCBtX3BhcmVudE1ldHJpYzIgPSBtQ29udGFpbmVyLmdldE1haW5NZXRyaWMocGFyZW50TWV0cmljMklkKTtcblx0XHRcdGxldCBtX2NoaWxkTWV0cmljID0gbUNvbnRhaW5lci5nZXRNYWluTWV0cmljKGNoaWxkTWV0cmljSWQpO1xuXG5cdFx0XHQvLyBDT01QQVJFIFZBTFVFU1xuXHRcdFx0bGV0IGNfcGFyZW50TWV0cmljMSA9IG1Db250YWluZXIuZ2V0Q29tcGFyZU1ldHJpYyhwYXJlbnRNZXRyaWMxSWQpO1xuXHRcdFx0bGV0IGNfcGFyZW50TWV0cmljMiA9IG1Db250YWluZXIuZ2V0Q29tcGFyZU1ldHJpYyhwYXJlbnRNZXRyaWMySWQpO1xuXHRcdFx0bGV0IGNfY2hpbGRNZXRyaWMgPSBtQ29udGFpbmVyLmdldENvbXBhcmVNZXRyaWMoY2hpbGRNZXRyaWNJZCk7XG5cblx0XHRcdGxldCBtX3ZhbHVlO1xuXHRcdFx0bGV0IG1fdmFsdWVGO1xuXHRcdFx0bGV0IGNfdmFsdWU7XG5cdFx0XHRsZXQgY192YWx1ZUY7XG5cblx0XHRcdGlmIChvcGVyYXRpb24gPT0gdGhpcy5TVUJNRVRSSUNfRElGRilcblx0XHRcdHtcblx0XHRcdFx0bV92YWx1ZSA9IG1fcGFyZW50TWV0cmljMS5nZXRWYWx1ZSgpIC0gbV9wYXJlbnRNZXRyaWMyLmdldFZhbHVlKCk7XG5cdFx0XHRcdG1fdmFsdWVGID0gbV9wYXJlbnRNZXRyaWMxLmdldFZhbHVlRigpIC0gbV9wYXJlbnRNZXRyaWMyLmdldFZhbHVlRigpO1xuXG5cdFx0XHRcdGNfdmFsdWUgPSBjX3BhcmVudE1ldHJpYzEuZ2V0VmFsdWUoKSAtIGNfcGFyZW50TWV0cmljMi5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRjX3ZhbHVlRiA9IGNfcGFyZW50TWV0cmljMS5nZXRWYWx1ZUYoKSAtIGNfcGFyZW50TWV0cmljMi5nZXRWYWx1ZUYoKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG9wZXJhdGlvbiA9PSB0aGlzLlNVQk1FVFJJQ19QRVJDKVxuXHRcdFx0e1xuXHRcdFx0XHRtX3ZhbHVlID0gKG1fcGFyZW50TWV0cmljMi5nZXRWYWx1ZSgpID4gMCA/IChtX3BhcmVudE1ldHJpYzEuZ2V0VmFsdWUoKSAvIG1fcGFyZW50TWV0cmljMi5nZXRWYWx1ZSgpICogMTAwKSA6IC0xKTtcblx0XHRcdFx0bV92YWx1ZUYgPSAobV9wYXJlbnRNZXRyaWMyLmdldFZhbHVlRigpID4gMCA/IChtX3BhcmVudE1ldHJpYzEuZ2V0VmFsdWVGKCkgLyBtX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWVGKCkgKiAxMDApIDogLTEpO1xuXG5cdFx0XHRcdGNfdmFsdWUgPSAoY19wYXJlbnRNZXRyaWMyLmdldFZhbHVlKCkgPiAwID8gKGNfcGFyZW50TWV0cmljMS5nZXRWYWx1ZSgpIC8gY19wYXJlbnRNZXRyaWMyLmdldFZhbHVlKCkgKiAxMDApIDogLTEpO1xuXHRcdFx0XHRjX3ZhbHVlRiA9IChjX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWVGKCkgPiAwID8gKGNfcGFyZW50TWV0cmljMS5nZXRWYWx1ZUYoKSAvIGNfcGFyZW50TWV0cmljMi5nZXRWYWx1ZUYoKSAqIDEwMCkgOiAtMSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChvcGVyYXRpb24gPT0gdGhpcy5TVUJNRVRSSUNfRElWKVxuXHRcdFx0e1xuXHRcdFx0XHRtX3ZhbHVlID0gbV9wYXJlbnRNZXRyaWMyLmdldFZhbHVlKCkgPiAwID8gKG1fcGFyZW50TWV0cmljMS5nZXRWYWx1ZSgpIC8gbV9wYXJlbnRNZXRyaWMyLmdldFZhbHVlKCkpIDogMDtcblx0XHRcdFx0bV92YWx1ZUYgPSBtX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWVGKCkgPiAwID8gKG1fcGFyZW50TWV0cmljMS5nZXRWYWx1ZUYoKSAvIG1fcGFyZW50TWV0cmljMi5nZXRWYWx1ZUYoKSkgOiAwO1xuXG5cdFx0XHRcdGNfdmFsdWUgPSBjX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWUoKSA+IDAgPyAoY19wYXJlbnRNZXRyaWMxLmdldFZhbHVlKCkgLyBjX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWUoKSkgOiAwO1xuXHRcdFx0XHRjX3ZhbHVlRiA9IGNfcGFyZW50TWV0cmljMi5nZXRWYWx1ZUYoKSA+IDAgPyAoY19wYXJlbnRNZXRyaWMxLmdldFZhbHVlRigpIC8gY19wYXJlbnRNZXRyaWMyLmdldFZhbHVlRigpKSA6IDA7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3VwZGF0ZU1ldHJpYyh2aWV3SWQsIG1fY2hpbGRNZXRyaWMsIHNkci5tYWluRnJvbSwgc2RyLm1haW5UbywgZmlsdGVyLCBtX3ZhbHVlLCBtX3ZhbHVlRik7XG5cdFx0XHR0aGlzLl91cGRhdGVNZXRyaWModmlld0lkLCBjX2NoaWxkTWV0cmljLCBzZHIuY29tcGFyZUZyb20sIHNkci5jb21wYXJlVG8sIGZpbHRlciwgY192YWx1ZSwgY192YWx1ZUYpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IHZpZXdJZFxuXHQgKiBAcGFyYW0gIHtTdGF0c0RhdGFSYW5nZX0gc2RyXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqL1xuXHRfdXBkYXRlU3ViTWV0cmljcyh2aWV3SWQsIHNkciwgZmlsdGVyKVxuXHR7XG5cdFx0bGV0IG1Db250YWluZXIgPSB0aGlzLl9tZXRyaWNDb250YWluZXJzW3ZpZXdJZF07XG5cblx0XHQvLyBVcGRhdGUgc3ViLW1ldHJpY3MgdXNpbmcgdmFsdWVzIG9mIHRoZSBtYWluIG1ldHJpY3Ncblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1Db250YWluZXIubWV0cmljSWRzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBtZXRyaWNJZCA9IG1Db250YWluZXIubWV0cmljSWRzW2ldO1xuXHRcdFx0bGV0IGJhc2VNZXRyaWMgPSB0aGlzLmdldEJhc2VNZXRyaWModmlld0lkLCBtZXRyaWNJZCk7XG5cblx0XHRcdC8vIFNraXAgc3VibWV0cmljIGlmIGl0IHdhcyBhbHJlYWR5IHVwZGF0ZWRcblx0XHRcdGlmIChiYXNlTWV0cmljLmlzU3ViTWV0cmljICYmICFtQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChtZXRyaWNJZCwgc2RyLCBmaWx0ZXIpKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSRVRVUk5JTkcgVklTSVRPUlMgPSAoVU5JUVVFIFZJU0lUT1JTIC0gTkVXIFZJU0lUT1JTKVxuXHRcdFx0XHRpZiAobWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuUkVUX1ZJU0lUT1JTKVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVN1Yk1ldHJpYyh2aWV3SWQsIG1ldHJpY0lkLCBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsIE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUywgdGhpcy5TVUJNRVRSSUNfRElGRiwgc2RyLCBmaWx0ZXIpO1xuXG5cdFx0XHRcdC8vIFJFVFVSTklORyBWSVNJVE9SUycgVklTSVRTID0gKFZJU0lUUyAtIE5FVyBWSVNJVE9SUycgVklTSVRTKVxuXHRcdFx0XHRlbHNlIGlmIChtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5SRVRfVklTSVRPUlNfVklTSVRTKVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVN1Yk1ldHJpYyh2aWV3SWQsIG1ldHJpY0lkLCBNZXRyaWNzTWFuYWdlci5WSVNJVFMsIE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SU19WSVNJVFMsIHRoaXMuU1VCTUVUUklDX0RJRkYsIHNkciwgZmlsdGVyKTtcblxuXHRcdFx0XHQvLyBORVcgVklTSVRPUlMgJSA9IChORVcgVklTSVRPUlMgLyBVTklRVUUgVklTSVRPUlMgKiAxMDApXG5cdFx0XHRcdGVsc2UgaWYgKG1ldHJpY0lkID09IE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUT1JTKVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVN1Yk1ldHJpYyh2aWV3SWQsIG1ldHJpY0lkLCBNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMsIE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5TVUJNRVRSSUNfUEVSQywgc2RyLCBmaWx0ZXIpO1xuXG5cdFx0XHRcdC8vIFJFVFVSTklORyBWSVNJVE9SUyAlID0gKFJFVFVSTklORyBWSVNJVE9SUyAvIFVOSVFVRSBWSVNJVE9SUyAqIDEwMClcblx0XHRcdFx0ZWxzZSBpZiAobWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuUEVSQ19SRVRfVklTSVRPUlMpXG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3ViTWV0cmljKHZpZXdJZCwgbWV0cmljSWQsIE1ldHJpY3NNYW5hZ2VyLlJFVF9WSVNJVE9SUywgTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLlNVQk1FVFJJQ19QRVJDLCBzZHIsIGZpbHRlcik7XG5cblx0XHRcdFx0Ly8gTkVXIFZJU0lUUyAlID0gKE5FVyBWSVNJVE9SJ1MgVklTSVRTIC8gVklTSVRTICogMTAwKVxuXHRcdFx0XHRlbHNlIGlmIChtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSlcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVTdWJNZXRyaWModmlld0lkLCBtZXRyaWNJZCwgTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTX1ZJU0lUUywgTWV0cmljc01hbmFnZXIuVklTSVRTLCB0aGlzLlNVQk1FVFJJQ19QRVJDLCBzZHIsIGZpbHRlcik7XG5cblx0XHRcdFx0Ly8gQVZHIFJPT00gSk9JTlMgUEVSIFVTRVIgPSAoUk9PTSBKT0lOUyAvIFVOSVFVRSBVU0VSUylcblx0XHRcdFx0ZWxzZSBpZiAobWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuQVZHX1JPT01fSk9JTlMpXG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3ViTWV0cmljKHZpZXdJZCwgbWV0cmljSWQsIE1ldHJpY3NNYW5hZ2VyLlJPT01fSk9JTlMsIE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5TVUJNRVRSSUNfRElWLCBzZHIsIGZpbHRlcik7XG5cblx0XHRcdFx0Ly8gQVZHIEVYQ0VQVElPTiBPQ0NVUlJFTkNFID0gKEVYQ0VQVElPTlMgLyBVTklRVUUgRVhDRVBUSU9OUylcblx0XHRcdFx0ZWxzZSBpZiAobWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuQVZHX0VYQ0VQVF9PQ0NVUkVOQ0UpXG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3ViTWV0cmljKHZpZXdJZCwgbWV0cmljSWQsIE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMsIE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9FWENFUFRJT05TLCB0aGlzLlNVQk1FVFJJQ19ESVYsIHNkciwgZmlsdGVyKTtcblxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDb2RlIHRvIGNhbGN1bGF0ZSAnJHttZXRyaWNJZH0nIG1ldHJpYyBpcyBtaXNzaW5nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2RpdmlkZShkaXZpZGVuZCwgZGl2aWRlciwgcGVyY2VudCA9IHRydWUpXG5cdHtcblx0XHRpZiAoZGl2aWRlciA+IDApXG5cdFx0XHRyZXR1cm4gZGl2aWRlbmQgLyBkaXZpZGVyICogKHBlcmNlbnQgPyAxMDAgOiAxKTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gKHBlcmNlbnQgPyAtMSA6IDApO1xuXHR9XG59XG4iLCJpbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1hbmlwdWxhdGVzIGRhdGVzLiBBbGwgZGF0ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIG1vbWVudCgpIGludGFuY2VzLlxuICovXG5leHBvcnQgY2xhc3MgRGF0ZUhlbHBlclxue1xuXHRzdGF0aWMgZ2V0IERBVEVfTUFTSygpXG5cdHtcblx0XHRyZXR1cm4gJ0REIE1NTSBZWVlZJztcblx0fVxuXG5cdHN0YXRpYyBnZXQgREFURV9UUkFOU0ZFUl9NQVNLKClcblx0e1xuXHRcdHJldHVybiAnWVlZWS9NTS9ERCBISDptbTpzcyc7XG5cdH1cblxuXHRzdGF0aWMgZ2V0UHJldkRheShkYXRlKVxuXHR7XG5cdFx0Ly8gbW9tZW50KGRhdGUpIGNsb25lcyB0aGUgcGFzc2VkIGRhdGUsIGFzIG1vbWVudCgpIGluc3RhbmNlcyBhcmUgbXV0YWJsZVxuXHRcdHJldHVybiBtb21lbnQoZGF0ZSkuc3VidHJhY3QoMSwgJ2RheXMnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRGaXJzdERheU9mUHJldldlZWsoZGF0ZSlcblx0e1xuXHRcdC8vIG1vbWVudChkYXRlKSBjbG9uZXMgdGhlIHBhc3NlZCBkYXRlLCBhcyBtb21lbnQoKSBpbnN0YW5jZXMgYXJlIG11dGFibGVcblx0XHRyZXR1cm4gbW9tZW50KGRhdGUpLnN1YnRyYWN0KDEsICd3ZWVrJykuc3RhcnRPZignd2VlaycpO1xuXHR9XG5cblx0c3RhdGljIGdldExhc3REYXlPZlByZXZXZWVrKGRhdGUpXG5cdHtcblx0XHQvLyBtb21lbnQoZGF0ZSkgY2xvbmVzIHRoZSBwYXNzZWQgZGF0ZSwgYXMgbW9tZW50KCkgaW5zdGFuY2VzIGFyZSBtdXRhYmxlXG5cdFx0cmV0dXJuIG1vbWVudChkYXRlKS5zdWJ0cmFjdCgxLCAnd2VlaycpLmVuZE9mKCd3ZWVrJykuc3RhcnRPZignZGF5Jyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0Rmlyc3REYXlPZlByZXZNb250aChkYXRlKVxuXHR7XG5cdFx0Ly8gbW9tZW50KGRhdGUpIGNsb25lcyB0aGUgcGFzc2VkIGRhdGUsIGFzIG1vbWVudCgpIGluc3RhbmNlcyBhcmUgbXV0YWJsZVxuXHRcdHJldHVybiBtb21lbnQoZGF0ZSkuc3VidHJhY3QoMSwgJ21vbnRoJykuc3RhcnRPZignbW9udGgnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRMYXN0RGF5T2ZQcmV2TW9udGgoZGF0ZSlcblx0e1xuXHRcdC8vIG1vbWVudChkYXRlKSBjbG9uZXMgdGhlIHBhc3NlZCBkYXRlLCBhcyBtb21lbnQoKSBpbnN0YW5jZXMgYXJlIG11dGFibGVcblx0XHRyZXR1cm4gbW9tZW50KGRhdGUpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpLnN0YXJ0T2YoJ2RheScpO1xuXHR9XG5cblx0c3RhdGljIGFyZURhdGVzRXF1YWwoZGF0ZTEsIGRhdGUyKVxuXHR7XG5cdFx0cmV0dXJuIGRhdGUxLmlzU2FtZShkYXRlMiwgJ2RheScpO1xuXHR9XG5cblx0c3RhdGljIGFyZURhdGVUaW1lc0VxdWFsKGRhdGUxLCBkYXRlMilcblx0e1xuXHRcdGlmIChkYXRlMSA9PSBudWxsICYmIGRhdGUyID09IG51bGwpXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKGRhdGUxICE9IG51bGwgJiYgZGF0ZTIgIT0gbnVsbClcblx0XHRcdFx0cmV0dXJuIGRhdGUxLmlzU2FtZShkYXRlMiwgJ2hvdXInKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHN0YXRpYyBnZXRUcmFuc2ZlclN0cmluZ0Zyb21EYXRlKGRhdGUpXG5cdHtcblx0XHRyZXR1cm4gZGF0ZS5mb3JtYXQoRGF0ZUhlbHBlci5EQVRFX1RSQU5TRkVSX01BU0spO1xuXHR9XG5cblx0c3RhdGljIGdldERhdGVGcm9tVHJhbnNmZXJTdHJpbmcoZGF0ZVN0cmluZylcblx0e1xuXHRcdHJldHVybiBtb21lbnQoZGF0ZVN0cmluZywgRGF0ZUhlbHBlci5EQVRFX1RSQU5TRkVSX01BU0spO1xuXHR9XG5cblx0c3RhdGljIGZvcm1hdFRpbWUobWlsbGlzKVxuXHR7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSBtb21lbnQuZHVyYXRpb24obWlsbGlzKTtcblx0XHRyZXR1cm4gZHVyYXRpb24uYXNNaW51dGVzKCkudG9GaXhlZCgyKSArICcgbWlucyc7XG5cdH1cblxuXHRzdGF0aWMgZm9ybWF0VGltZU1zKG1pbGxpcylcblx0e1xuXHRcdGlmICghaXNOYU4obWlsbGlzKSlcblx0XHR7XG5cdFx0XHRjb25zdCBzZWNzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTtcblxuXHRcdFx0Y29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2VjcyAvIDYwKVxuXHRcdFx0Y29uc3Qgc2Vjb25kcyA9IHNlY3MgLSAobWludXRlcyAqIDYwKTtcblx0XHRcdGNvbnN0IG1pbGxpc2Vjb25kcyA9IG1pbGxpcyAtIChzZWNzICogMTAwMCk7XG5cblx0XHRcdGxldCBzdHIgPSAnJztcblxuXHRcdFx0aWYgKG1pbnV0ZXMgPiAwKVxuXHRcdFx0XHRzdHIgKz0gU3RyaW5nKG1pbnV0ZXMpICsgJ20gJztcblxuXHRcdFx0aWYgKG1pbnV0ZXMgPiAwIHx8IHNlY29uZHMgPiAwKVxuXHRcdFx0XHRzdHIgKz0gRGF0ZUhlbHBlci5wYWRUaW1lVmFsdWUoc2Vjb25kcywgMikgKyAncyAnO1xuXG5cdFx0XHRpZiAobWludXRlcyA+IDAgfHwgc2Vjb25kcyA+IDApXG5cdFx0XHRcdHN0ciArPSBEYXRlSGVscGVyLnBhZFRpbWVWYWx1ZShtaWxsaXNlY29uZHMsIDMpICsgJ21zJztcblx0XHRcdGVsc2Vcblx0XHRcdFx0c3RyID0gU3RyaW5nKG1pbGxpc2Vjb25kcykgKyAnbXMnO1xuXG5cdFx0XHRyZXR1cm4gc3RyO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gJyc7XG5cdH1cblxuXHRzdGF0aWMgcGFkVGltZVZhbHVlKHZhbHVlLCBudW1MZW5ndGgpXG5cdHtcblx0XHRsZXQgdmFsdWVTdHIgPSBTdHJpbmcodmFsdWUpO1xuXG5cdFx0d2hpbGUgKHZhbHVlU3RyLmxlbmd0aCA8IG51bUxlbmd0aClcblx0XHRcdHZhbHVlU3RyID0gJzAnICsgdmFsdWVTdHI7XG5cblx0XHRyZXR1cm4gdmFsdWVTdHI7XG5cdH1cbn1cbiIsImltcG9ydCB7TWV0cmljc01hbmFnZXJ9IGZyb20gJy4vbWV0cmljcy1tYW5hZ2VyJztcbmltcG9ydCB7U3RhdHNEYXRhRmlsdGVyfSBmcm9tICcuL2RhdGEvc3RhdHMtZGF0YS1maWx0ZXInO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBWaWV3TWFuYWdlclxue1xuXHRzdGF0aWMgZ2V0IE9WRVJWSUVXKCkgeyByZXR1cm4gJ292ZXJ2aWV3JzsgfVxuXHRzdGF0aWMgZ2V0IERFTU9HUkFQSElDUygpIHsgcmV0dXJuICdkZW1vZ3JhcGhpY3MnOyB9XG5cdHN0YXRpYyBnZXQgVEVDSE5PTE9HWSgpIHsgcmV0dXJuICd0ZWNobm9sb2d5JzsgfVxuXHRzdGF0aWMgZ2V0IEFQUExJQ0FUSU9OKCkgeyByZXR1cm4gJ2FwcGxpY2F0aW9uJzsgfVxuXHRzdGF0aWMgZ2V0IEVYQ0VQVElPTlMoKSB7IHJldHVybiAnZXhjZXB0aW9ucyc7IH1cblxuXHRzdGF0aWMgZ2V0IFZJRVdTKCkgeyByZXR1cm4gW1ZpZXdNYW5hZ2VyLk9WRVJWSUVXLCBWaWV3TWFuYWdlci5ERU1PR1JBUEhJQ1MsIFZpZXdNYW5hZ2VyLlRFQ0hOT0xPR1ksIFZpZXdNYW5hZ2VyLkFQUExJQ0FUSU9OLCBWaWV3TWFuYWdlci5FWENFUFRJT05TXTsgfVxuXG5cdGNvbnN0cnVjdG9yKG1haW5DdHJsLCB2aWV3LCBtZXRyaWNzTWFuYWdlcilcblx0e1xuXHRcdHRoaXMuX21haW4gPSBtYWluQ3RybDtcblx0XHR0aGlzLl92aWV3ID0gdmlldztcblx0XHR0aGlzLl9tbSA9IG1ldHJpY3NNYW5hZ2VyO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBSZW1vdmUgY2xpY2sgbGlzdGVuZXJzIG9uIG1ldHJpYyBsaXN0IGl0ZW1zXG5cdFx0Zm9yIChsZXQgdmlld0lkIG9mIFZpZXdNYW5hZ2VyLlZJRVdTKVxuXHRcdHtcblx0XHRcdGxldCB0YWIgPSAkKCcjYW5sLWRhdGF2aWV3LScgKyB2aWV3SWQsIHRoaXMuX3ZpZXcpO1xuXG5cdFx0XHRpZiAodGFiLmxlbmd0aCkgLy8gZmFsc2UgaWYgZWxlbWVudCBkb2Vzbid0IGV4aXN0XG5cdFx0XHRcdHRhYlswXS5kZXN0cm95KCk7XG5cdFx0fVxuXHR9XG5cblx0aW5pdGlhbGl6ZSgpXG5cdHtcblx0XHRmb3IgKGxldCB2aWV3SWQgb2YgVmlld01hbmFnZXIuVklFV1MpXG5cdFx0e1xuXHRcdFx0bGV0IGNoYXJ0c0NvbnRhaW5lciA9IHRoaXMuX21tLmdldENoYXJ0RGF0YUNvbnRhaW5lcih2aWV3SWQpO1xuXHRcdFx0bGV0IG1ldHJpY3NDb250YWluZXIgPSB0aGlzLl9tbS5nZXRNZXRyaWNEYXRhQ29udGFpbmVyKHZpZXdJZCk7XG5cblx0XHRcdGxldCB0YWIgPSAkKCcjYW5sLWRhdGF2aWV3LScgKyB2aWV3SWQsIHRoaXMuX3ZpZXcpO1xuXG5cdFx0XHRpZiAodGFiLmxlbmd0aCkgLy8gZmFsc2UgaWYgZWxlbWVudCBkb2Vzbid0IGV4aXN0XG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkYXRhVmlld0VsZW0gPSB0YWJbMF07XG5cblx0XHRcdFx0Ly8gMCkgU2V0IHZpZXcgaWRcblx0XHRcdFx0ZGF0YVZpZXdFbGVtLnZpZXdJZCA9IHZpZXdJZDtcblxuXHRcdFx0XHQvLyAxKSBJbml0aWFsaXplIHRpbnkgdmlzaXRzIGNoYXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdcblx0XHRcdFx0ZGF0YVZpZXdFbGVtLnRpbnlWaXNpdHNDaGFydC5pbml0KHZpZXdJZCwgbWV0cmljc0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlZJU0lUUyksIG1ldHJpY3NDb250YWluZXIuZ2V0Q29tcGFyZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKTtcblxuXHRcdFx0XHQvLyAyKSBJbml0aWFsaXplIG1haW4gY2hhcnRcblx0XHRcdFx0ZGF0YVZpZXdFbGVtLm1haW5DaGFydC5pbml0KGNoYXJ0c0NvbnRhaW5lcik7XG5cblx0XHRcdFx0Ly8gMykgSW5pdGlhbGl6ZSBtZXRyaWNzIGxpc3Rcblx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBtZXRyaWNzQ29udGFpbmVyLm1ldHJpY0lkcy5sZW5ndGg7IGorKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IG1ldHJpY0lkID0gbWV0cmljc0NvbnRhaW5lci5tZXRyaWNJZHNbal07XG5cblx0XHRcdFx0XHRpZiAodGhpcy5fbW0uaXNNZXRyaWNJbkRpc3BsYXlMaXN0KHZpZXdJZCwgbWV0cmljSWQpKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBtTWFpbiA9IG1ldHJpY3NDb250YWluZXIubWFpbk1ldHJpY3NbbWV0cmljSWRdO1xuXHRcdFx0XHRcdFx0bGV0IG1Db21wYXJlID0gbWV0cmljc0NvbnRhaW5lci5jb21wTWV0cmljc1ttZXRyaWNJZF07XG5cdFx0XHRcdFx0XHRsZXQgYmFzZU1ldHJpYyA9IG1NYWluLmJhc2VNZXRyaWM7XG5cblx0XHRcdFx0XHRcdC8vIEFkZCBpdGVtIHRvIHZpZXdcblx0XHRcdFx0XHRcdGRhdGFWaWV3RWxlbS5hZGRNZXRyaWNMaXN0SXRlbShiYXNlTWV0cmljLmlkLCBjaGFydHNDb250YWluZXIuY2hhcnRJZHMuaW5kZXhPZihiYXNlTWV0cmljLmlkKSA+PSAwLCBtTWFpbiwgbUNvbXBhcmUsIHZpZXdJZCA9PSBWaWV3TWFuYWdlci5PVkVSVklFVyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gNCkgSW5pdGlhbGl6ZSBuZXcgdmlzaXRvcnMgcGllIGNoYXJ0cyAoaWYgbmVlZGVkKVxuXHRcdFx0XHRpZiAodGhpcy5fbW0uZ2V0QmFzZU1ldHJpYyh2aWV3SWQsIE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUT1JTKSAhPSBudWxsICYmXG5cdFx0XHRcdFx0dGhpcy5fbW0uZ2V0QmFzZU1ldHJpYyh2aWV3SWQsIE1ldHJpY3NNYW5hZ2VyLlBFUkNfUkVUX1ZJU0lUT1JTKSAhPSBudWxsICYmXG5cdFx0XHRcdFx0dGhpcy5fbW0uZ2V0QmFzZU1ldHJpYyh2aWV3SWQsIE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SU19WSVNJVFMpICE9IG51bGwgJiZcblx0XHRcdFx0XHR0aGlzLl9tbS5nZXRCYXNlTWV0cmljKHZpZXdJZCwgTWV0cmljc01hbmFnZXIuUkVUX1ZJU0lUT1JTX1ZJU0lUUykgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIE1BSU5cblx0XHRcdFx0XHRsZXQgbURhdGEgPSB7XG5cdFx0XHRcdFx0XHRwbnY6IG1ldHJpY3NDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVE9SUyksXG5cdFx0XHRcdFx0XHRwcnY6IG1ldHJpY3NDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX1JFVF9WSVNJVE9SUyksXG5cdFx0XHRcdFx0XHRudnY6IG1ldHJpY3NDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlNfVklTSVRTKSxcblx0XHRcdFx0XHRcdHJ2djogbWV0cmljc0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlJFVF9WSVNJVE9SU19WSVNJVFMpXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdC8vIENPTVBBUkVcblx0XHRcdFx0XHRsZXQgY0RhdGEgPSB7XG5cdFx0XHRcdFx0XHRwbnY6IG1ldHJpY3NDb250YWluZXIuZ2V0Q29tcGFyZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVE9SUyksXG5cdFx0XHRcdFx0XHRwcnY6IG1ldHJpY3NDb250YWluZXIuZ2V0Q29tcGFyZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX1JFVF9WSVNJVE9SUyksXG5cdFx0XHRcdFx0XHRudnY6IG1ldHJpY3NDb250YWluZXIuZ2V0Q29tcGFyZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlNfVklTSVRTKSxcblx0XHRcdFx0XHRcdHJ2djogbWV0cmljc0NvbnRhaW5lci5nZXRDb21wYXJlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlJFVF9WSVNJVE9SU19WSVNJVFMpXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGRhdGFWaWV3RWxlbS5pbml0VmlzaXRvcnNQaWVDaGFydHMobURhdGEsIGNEYXRhKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIDUpIEluaXRpYWxpemUgZGF0YSB0YWJsZXMgKG9ubHkgb25lIHBlciB2aWV3IGV4cGVjdGVkKVxuXHRcdFx0XHRjb25zdCB0YWJsZVZpZXcgPSB0aGlzLmdldFRhYmxlU3ViVmlldyhkYXRhVmlld0VsZW0pO1xuXHRcdFx0XHRpZiAodGFibGVWaWV3ICE9IG51bGwpXG5cdFx0XHRcdFx0dGFibGVWaWV3LmluaXQodGhpcy5fbW0uZ2V0VGFibGVEYXRhKHZpZXdJZCksIHRoaXMuX21tLmdldE1ldHJpY0RhdGFDb250YWluZXIodmlld0lkKSk7XG5cblx0XHRcdFx0Ly8gNikgSW5pdGlhbGl6ZSBkYXRhIGNoYXJ0cyAob25seSBvbmUgcGVyIHZpZXcgZXhwZWN0ZWQpXG5cdFx0XHRcdGNvbnN0IGNoYXJ0VmlldyA9IHRoaXMuZ2V0Q2hhcnRTdWJWaWV3KGRhdGFWaWV3RWxlbSk7XG5cdFx0XHRcdGlmIChjaGFydFZpZXcgIT0gbnVsbClcblx0XHRcdFx0XHRjaGFydFZpZXcuaW5pdCh0aGlzLl9tbS5nZXRUYWJsZURhdGEodmlld0lkKSwgdGhpcy5fbW0uZ2V0VGFibGVEYXRhTWV0cmljcygpKTtcblxuXHRcdFx0XHQvLyA3KSBDb25maWd1cmUgY29tcG9uZW50cyBzcGVjaWZpYyB0byB2aWV3c1xuXHRcdFx0XHRpZiAodmlld0lkID09IFZpZXdNYW5hZ2VyLkRFTU9HUkFQSElDUylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IG1hcFZpZXcgPSB0aGlzLmdldE1hcFN1YlZpZXcoZGF0YVZpZXdFbGVtKTtcblx0XHRcdFx0XHRpZiAobWFwVmlldyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bWFwVmlldy5pbml0KHRoaXMuX21tLmdldFRhYmxlRGF0YSh2aWV3SWQpLCB0aGlzLl9tbS5nZXRUYWJsZURhdGFNZXRyaWNzKCkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gOCkgSGlkZSByYW5nZSBub3RpY2Vcblx0XHRcdFx0JCgnLnJhbmdlLW5vdGljZScsIHRhYikuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGdldFNlbGVjdGVkVmlldygpXG5cdHtcblx0XHRyZXR1cm4gJCgnLnRhYi1wYW5lLmFjdGl2ZSBhbmFseXRpY3MtZGF0YS12aWV3JywgdGhpcy5fdmlldykuZ2V0KDApO1xuXHR9XG5cblx0Z2V0U2VsZWN0ZWRWaWV3SWQoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRWaWV3KCkudmlld0lkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YVJhbmdlfSAgc2RyXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YUZpbHRlcn0gIGZpbHRlclxuXHQgKiBAcGFyYW0gIHtib29sZWFufSBpc0xvYWRpbmdcblx0ICogQHBhcmFtICB7Ym9vbGVhbn0gIGRvRm9yY2Vcblx0ICovXG5cdHVwZGF0ZVZpZXcoc2RyLCBmaWx0ZXIsIGlzTG9hZGluZywgZG9Gb3JjZSA9IGZhbHNlKVxuXHR7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRWaWV3ID0gdGhpcy5nZXRTZWxlY3RlZFZpZXcoKTtcblx0XHRjb25zdCB2aWV3SWQgPSBzZWxlY3RlZFZpZXcudmlld0lkO1xuXHRcdGNvbnN0IG1ldHJpY3NDb250YWluZXIgPSB0aGlzLl9tbS5nZXRNZXRyaWNEYXRhQ29udGFpbmVyKHZpZXdJZCk7XG5cdFx0Y29uc3QgY2hhcnRDb250YWluZXIgPSB0aGlzLl9tbS5nZXRDaGFydERhdGFDb250YWluZXIodmlld0lkKTtcblxuXHRcdC8vIERlZmF1bHQgc3RhdGVcblx0XHRjb25zdCBzdGF0ZSA9IChpc0xvYWRpbmcgPyBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORyA6IE1ldHJpY0Rpc3BsYXlTdGF0ZS5NSVNTSU5HKTtcblxuXHRcdC8vIDEpIFVwZGF0ZSB2aXNpdHMgY2hhcnQgYXQgdGhlIHRvcCBvZiB0aGUgdmlld1xuXHRcdGlmIChtZXRyaWNzQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChNZXRyaWNzTWFuYWdlci5WSVNJVFMsIHNkciwgZmlsdGVyKSlcblx0XHR7XG5cdFx0XHRpZiAoc2RyLmRvQ29tcGFyZSlcblx0XHRcdFx0c2VsZWN0ZWRWaWV3LnRpbnlWaXNpdHNDaGFydC5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkU7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHNlbGVjdGVkVmlldy50aW55VmlzaXRzQ2hhcnQuc3RhdGUgPSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQTtcblxuXHRcdFx0Ly8gVGhlIGRvRm9yY2UgcGFyYW0gaXMgdHJ1ZSB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHZpZXcgdGFiXG5cdFx0XHQvLyBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBmb3JjZSByZWZyZXNoIGJlY2F1c2UgdGhlIHN0YXRlIHdhcyBhbHJlYWR5IHNldCB0byBEQVRBIG9yIERBVEFfQ09NUEFSRTtcblx0XHRcdC8vIGlmIHRoZSBkYXRhIHdhcyB1cGRhdGVkIGluIHRoZSBwcmV2aW91cyB2aWV3IGFuZCB3ZSBkb24ndCByZWZyZXNoIG5vdywgdGhlIG5ldyB2aWV3IHdpbGwgc3RpbGwgZGlzcGxheSB0aGUgb2xkIGRhdGFcblx0XHRcdC8vIChiZWNhdXNlIHNldHRpbmcgdGhlIHN0YXRlIHRvIHRoZSBzYW1lIHZhbHVlIChhYm92ZSkgZG9lc24ndCBjYXVzZSB0aGUgcmVmcmVzaCB0byBoYXBwZW4pXG5cdFx0XHRpZiAoZG9Gb3JjZSlcblx0XHRcdFx0c2VsZWN0ZWRWaWV3LnRpbnlWaXNpdHNDaGFydC5yZWZyZXNoKCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHNlbGVjdGVkVmlldy50aW55VmlzaXRzQ2hhcnQuc3RhdGUgPSBzdGF0ZTtcblxuXHRcdC8vIDIpIFVwZGF0ZSBtYWluIG1ldHJpYyBjaGFydFxuXHRcdGlmICghY2hhcnRDb250YWluZXIuaXNDaGFydE92ZXJhbGxPdXRkYXRlZChzZWxlY3RlZFZpZXcubWFpbkNoYXJ0LmdldFNlbGVjdGVkTWV0cmljSWQoKSwgc2RyLCBmaWx0ZXIsIHNlbGVjdGVkVmlldy5tYWluQ2hhcnQuZ2V0U2VsZWN0ZWRUaW1lVW5pdCgpKSlcblx0XHR7XG5cdFx0XHRpZiAoc2RyLmRvQ29tcGFyZSlcblx0XHRcdFx0c2VsZWN0ZWRWaWV3Lm1haW5DaGFydC5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkU7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHNlbGVjdGVkVmlldy5tYWluQ2hhcnQuc3RhdGUgPSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQTtcblxuXHRcdFx0Ly8gKHNlZSAxKVxuXHRcdFx0aWYgKGRvRm9yY2UpXG5cdFx0XHRcdHNlbGVjdGVkVmlldy5tYWluQ2hhcnQucmVmcmVzaCgpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRzZWxlY3RlZFZpZXcubWFpbkNoYXJ0LnN0YXRlID0gc3RhdGU7XG5cblx0XHQvLyAzKSBVcGRhdGUgbWV0cmljcyBsaXN0XG5cdFx0Zm9yIChsZXQgYmFzZU1ldHJpYyBvZiB0aGlzLl9tbS5nZXRCYXNlTWV0cmljc0Rpc3BsYXlMaXN0KHZpZXdJZCkpXG5cdFx0e1xuXHRcdFx0aWYgKG1ldHJpY3NDb250YWluZXIubWV0cmljSWRzLmluZGV4T2YoYmFzZU1ldHJpYy5pZCkgPiAtMSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gU2V0IG1ldHJpYyBpdGVtIHN0YXRlXG5cdFx0XHRcdGlmIChtZXRyaWNzQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChiYXNlTWV0cmljLmlkLCBzZHIsIGZpbHRlcikpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAoc2RyLmRvQ29tcGFyZSlcblx0XHRcdFx0XHRcdHNlbGVjdGVkVmlldy5zZXRNZXRyaWNJdGVtU3RhdGUoYmFzZU1ldHJpYy5pZCwgTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRWaWV3LnNldE1ldHJpY0l0ZW1TdGF0ZShiYXNlTWV0cmljLmlkLCBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSk7XG5cblx0XHRcdFx0XHQvLyAoc2VlIDEpXG5cdFx0XHRcdFx0aWYgKGRvRm9yY2UpXG5cdFx0XHRcdFx0XHRzZWxlY3RlZFZpZXcucmVmcmVzaE1ldHJpY0l0ZW0oYmFzZU1ldHJpYy5pZCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHNlbGVjdGVkVmlldy5zZXRNZXRyaWNJdGVtU3RhdGUoYmFzZU1ldHJpYy5pZCwgc3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDQpIFVwZGF0ZSB2aXNpdG9ycyBwaWUgY2hhcnQvc1xuXHRcdHNlbGVjdGVkVmlldy5zaG93VmlzaXRvcnNDb21wYXJlUGllQ2hhcnQoc2RyLmRvQ29tcGFyZSk7XG5cblx0XHRpZiAobWV0cmljc0NvbnRhaW5lci5pc01ldHJpY1VwZGF0ZWQoTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRPUlMsIHNkciwgZmlsdGVyKSAmJlxuXHRcdFx0bWV0cmljc0NvbnRhaW5lci5pc01ldHJpY1VwZGF0ZWQoTWV0cmljc01hbmFnZXIuUEVSQ19SRVRfVklTSVRPUlMsIHNkciwgZmlsdGVyKSAmJlxuXHRcdFx0bWV0cmljc0NvbnRhaW5lci5pc01ldHJpY1VwZGF0ZWQoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTX1ZJU0lUUywgc2RyLCBmaWx0ZXIpICYmXG5cdFx0XHRtZXRyaWNzQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChNZXRyaWNzTWFuYWdlci5SRVRfVklTSVRPUlNfVklTSVRTLCBzZHIsIGZpbHRlcikpXG5cdFx0e1xuXHRcdFx0c2VsZWN0ZWRWaWV3LnNldFZpc2l0b3JzUGllQ2hhcnRzU3RhdGUoTWV0cmljRGlzcGxheVN0YXRlLkRBVEEpO1xuXG5cdFx0XHQvLyAoc2VlIDEpXG5cdFx0XHRpZiAoZG9Gb3JjZSlcblx0XHRcdFx0c2VsZWN0ZWRWaWV3LnJlZnJlc2hWaXNpdG9yc1BpZUNoYXJ0cygpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRzZWxlY3RlZFZpZXcuc2V0VmlzaXRvcnNQaWVDaGFydHNTdGF0ZShzdGF0ZSk7XG5cblx0XHQvLyA1KSBVcGRhdGUgZGF0YSB0YWJsZVxuXHRcdGNvbnN0IHRhYmxlVmlldyA9IHRoaXMuZ2V0VGFibGVTdWJWaWV3KHNlbGVjdGVkVmlldyk7XG5cdFx0Y29uc3QgdGFibGVEYXRhID0gdGhpcy5fbW0uZ2V0VGFibGVEYXRhKHZpZXdJZCk7XG5cblx0XHRpZiAodGFibGVWaWV3ICE9IG51bGwgJiYgdGFibGVEYXRhICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRhYmxlRGF0YS5pc0RhdGFVcGRhdGVkKHNkci5tYWluRnJvbSwgc2RyLm1haW5UbykpXG5cdFx0XHR7XG5cdFx0XHRcdHRhYmxlVmlldy5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBO1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gZm9yY2UgcmVmcmVzaCwgYXMgZGF0YSBpcyBub3Qgc2hhcmVkIHdpdGggb3RoZXIgdmlld3Ncblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGFibGVWaWV3LnN0YXRlID0gc3RhdGU7XG5cdFx0fVxuXG5cdFx0Ly8gNikgVXBkYXRlIGRhdGEgY2hhcnRcblx0XHRjb25zdCBjaGFydFZpZXcgPSB0aGlzLmdldENoYXJ0U3ViVmlldyhzZWxlY3RlZFZpZXcpO1xuXHRcdGlmIChjaGFydFZpZXcgIT0gbnVsbCAmJiB0YWJsZURhdGEgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGFibGVEYXRhLmlzRGF0YVVwZGF0ZWQoc2RyLm1haW5Gcm9tLCBzZHIubWFpblRvKSlcblx0XHRcdHtcblx0XHRcdFx0Y2hhcnRWaWV3LnN0YXRlID0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEE7XG5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byBmb3JjZSByZWZyZXNoLCBhcyBkYXRhIGlzIG5vdCBzaGFyZWQgd2l0aCBvdGhlciB2aWV3c1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjaGFydFZpZXcuc3RhdGUgPSBzdGF0ZTtcblx0XHR9XG5cblx0XHQvLyA3KSBVcGRhdGUgbWFwIGNoYXJ0XG5cdFx0Y29uc3QgbWFwVmlldyA9IHRoaXMuZ2V0TWFwU3ViVmlldyhzZWxlY3RlZFZpZXcpO1xuXHRcdGlmIChtYXBWaWV3ICE9IG51bGwgJiYgdGFibGVEYXRhICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRhYmxlRGF0YS5pc0RhdGFVcGRhdGVkKHNkci5tYWluRnJvbSwgc2RyLm1haW5UbykpXG5cdFx0XHR7XG5cdFx0XHRcdG1hcFZpZXcuc3RhdGUgPSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIGZvcmNlIHJlZnJlc2gsIGFzIGRhdGEgaXMgbm90IHNoYXJlZCB3aXRoIG90aGVyIHZpZXdzXG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG1hcFZpZXcuc3RhdGUgPSBzdGF0ZTtcblx0XHR9XG5cblx0XHQvLyA4KSBTaG93L2hpZGUgcmFuZ2Ugbm90aWNlXG5cdFx0dGhpcy5fc2hvd1JhbmdlTm90aWNlKHNlbGVjdGVkVmlldywgc2RyLmRvQ29tcGFyZSlcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmFuZ2VMZW5cblx0ICovXG5cdHNldEF2YWlsYWJsZUNoYXJ0VGltZVVuaXQocmFuZ2VMZW4pXG5cdHtcblx0XHRjb25zdCB2aWV3cyA9IHRoaXMuX3ZpZXcuZmluZCgnYW5hbHl0aWNzLWRhdGEtdmlldycpO1xuXHRcdGZvciAobGV0IHZpZXcgb2Ygdmlld3MpXG5cdFx0XHR2aWV3LnNldE1haW5DaGFydEF2YWlsVGltZVVuaXRzKHJhbmdlTGVuKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpZXdzIHdoaWNoIGhhdmUgdGhlIHNhbWUgc2V0dGluZ3MgKGZpbHRlciBhbmQgdGltZSB1bml0KSBhcyB0aG9zZSBwYXNzZWQuXG5cdCAqIFRoaXMgaXMgbmVlZGVkIHRvIGtub3cgdG8gd2hpY2ggdmlld3MgdGhlIHNhbWUgY2hhcnQgZGF0YSBhcHBsaWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lVW5pdFxuXHQgKi9cblx0Z2V0VXBkYXRhYmxlVmlld3NGb3JDaGFydChmaWx0ZXIsIHRpbWVVbml0KVxuXHR7XG5cdFx0bGV0IHVwZGF0YWJsZVZpZXdzID0gW107XG5cblx0XHRjb25zdCB2aWV3cyA9IHRoaXMuX3ZpZXcuZmluZCgnYW5hbHl0aWNzLWRhdGEtdmlldycpO1xuXHRcdGZvciAobGV0IHZpZXcgb2Ygdmlld3MpXG5cdFx0e1xuXHRcdFx0aWYgKHZpZXcudmFsaWRhdGVWaWV3U2V0dGluZ3MoZmlsdGVyLCB0aW1lVW5pdCkpXG5cdFx0XHRcdHVwZGF0YWJsZVZpZXdzLnB1c2godmlldy52aWV3SWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB1cGRhdGFibGVWaWV3cztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAoY29udGFpbnMgZmlsdGVyTmFtZSwgZmlsdGVyVmFsdWUsIGNoZWNrU2VwYXJhdG9yLCBmaWx0ZXJEaXNwbGF5VmFsdWUpXG5cdCAqIEBwYXJhbSB7U3RhdHNEYXRhUmFuZ2V9IHNkclxuXHQgKi9cblx0c2V0RmlsdGVyT25TZWxlY3RlZFZpZXcoZGF0YSwgc2RyKVxuXHR7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRWaWV3ID0gdGhpcy5nZXRTZWxlY3RlZFZpZXcoKTtcblx0XHRjb25zdCB2aWV3SWQgPSBzZWxlY3RlZFZpZXcudmlld0lkO1xuXHRcdGNvbnN0IGZpbHRlciA9IG5ldyBTdGF0c0RhdGFGaWx0ZXIodmlld0lkLCBkYXRhLmZpbHRlck5hbWUsIGRhdGEuZmlsdGVyVmFsdWUpO1xuXG5cdFx0Ly8gU2V0IGZpbHRlciBvbiBzZWxlY3RlZCB2aWV3XG5cdFx0c2VsZWN0ZWRWaWV3LnNldERhdGFGaWx0ZXIoZmlsdGVyLCBkYXRhLmNoZWNrU2VwYXJhdG9yLCBkYXRhLmZpbHRlckRpc3BsYXlWYWx1ZSk7XG5cblx0XHQvLyBJZiB0aGUgZmlsdGVyIHZhbHVlIGhhcyBiZWVuIHNldCB0byBudWxsICg9IG5vIGZpbHRlcilcblx0XHQvLyB3ZSBoYXZlIHRvIHJlc2V0IHRoZSBtZXRyaWNzJyBmaWx0ZXJlZCB2YWx1ZSBhbmQgdXBkYXRlIHRoZSB2aWV3XG5cdFx0Ly8gVGhlIHJlYXNvbiBpcyB0aGF0IHdoZW4gc2V0dGluZyB0aGUgZmlsdGVyIHRvIGVtcHR5LCBubyByZXF1ZXN0IGlzIHNlbnQgdG8gdGhlIHNlcnZlclxuXHRcdC8vIChiZWNhdXNlIHRoZSBvdmVyYWxsIHZhbHVlIHdhcyBhbHJlYWR5IHJlY2VpdmVkIGJlZm9yZSksIHNvIHRoZSB1cGRhdGUgd29uJ3QgaGFwcGVuIGF1dG9tYXRpY2FsbHlcblxuXHRcdGlmIChmaWx0ZXIudmFsdWUgPT0gbnVsbClcblx0XHR7XG5cdFx0XHQvLyBSZXNldCBtZXRyaWNzJyBmaWx0ZXJlZCB2YWx1ZVxuXHRcdFx0dGhpcy5fbW0ucmVzZXRNZXRyaWNzRmlsdGVyKHZpZXdJZCk7XG5cblx0XHRcdC8vIERpc3BsYXkgY3VycmVudCBtZXRyaWMgZGF0YVxuXHRcdFx0dGhpcy51cGRhdGVWaWV3KHNkciwgZmlsdGVyLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gUmVmcmVzaCBkYXRhIHRhYmxlIHNvIHRoYXQgdGhlIGZpbHRlciBpcyBhcHBsaWVkXG5cdFx0Y29uc3QgdGFibGVWaWV3ID0gdGhpcy5nZXRUYWJsZVN1YlZpZXcoc2VsZWN0ZWRWaWV3KTtcblx0XHRpZiAodGFibGVWaWV3ICE9IG51bGwpXG5cdFx0XHR0YWJsZVZpZXcuc2V0RmlsdGVyKGZpbHRlcik7XG5cblx0XHQvLyBSZWZyZXNoIGNoYXJ0IHNvIHRoYXQgdGhlIGZpbHRlciBpcyBhcHBsaWVkXG5cdFx0Y29uc3QgY2hhcnRWaWV3ID0gdGhpcy5nZXRDaGFydFN1YlZpZXcoc2VsZWN0ZWRWaWV3KTtcblx0XHRpZiAoY2hhcnRWaWV3ICE9IG51bGwpXG5cdFx0XHRjaGFydFZpZXcuc2V0RmlsdGVyKGZpbHRlcik7XG5cblx0XHQvLyBSZWZyZXNoIG1hcCBzbyB0aGF0IHRoZSBmaWx0ZXIgaXMgYXBwbGllZFxuXHRcdGNvbnN0IG1hcFZpZXcgPSB0aGlzLmdldE1hcFN1YlZpZXcoc2VsZWN0ZWRWaWV3KTtcblx0XHRpZiAobWFwVmlldyAhPSBudWxsKVxuXHRcdFx0bWFwVmlldy5zZXRGaWx0ZXIoZmlsdGVyKTtcblx0fVxuXG5cdGdldFRhYmxlU3ViVmlldyh2aWV3ID0gbnVsbClcblx0e1xuXHRcdGlmICh2aWV3ID09IG51bGwpXG5cdFx0XHR2aWV3ID0gdGhpcy5nZXRTZWxlY3RlZFZpZXcoKTtcblxuXHRcdGNvbnN0IHRhYmxlVmlld3MgPSB2aWV3LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RhdGEtdGFibGUnKTtcblxuXHRcdGlmICh0YWJsZVZpZXdzLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gdGFibGVWaWV3c1swXTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldENoYXJ0U3ViVmlldyh2aWV3ID0gbnVsbClcblx0e1xuXHRcdGlmICh2aWV3ID09IG51bGwpXG5cdFx0XHR2aWV3ID0gdGhpcy5nZXRTZWxlY3RlZFZpZXcoKTtcblxuXHRcdGNvbnN0IGNoYXJ0Vmlld3MgPSB2aWV3LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RhdGEtY2hhcnQnKTtcblxuXHRcdGlmIChjaGFydFZpZXdzLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gY2hhcnRWaWV3c1swXTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldE1hcFN1YlZpZXcodmlldyA9IG51bGwpXG5cdHtcblx0XHRpZiAodmlldyA9PSBudWxsKVxuXHRcdFx0dmlldyA9IHRoaXMuZ2V0U2VsZWN0ZWRWaWV3KCk7XG5cblx0XHRjb25zdCBtYXBWaWV3cyA9IHZpZXcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZGF0YS1tYXAnKTtcblxuXHRcdGlmIChtYXBWaWV3cy5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIG1hcFZpZXdzWzBdO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0X3Nob3dSYW5nZU5vdGljZShzdWJ2aWV3LCBkb1Nob3cpXG5cdHtcblx0XHRpZiAoZG9TaG93KVxuXHRcdFx0JCgnLnJhbmdlLW5vdGljZScsIHN1YnZpZXcpLnNob3coKTtcblx0XHRlbHNlXG5cdFx0XHQkKCcucmFuZ2Utbm90aWNlJywgc3VidmlldykuaGlkZSgpO1xuXHR9XG59XG4iLCJpbXBvcnQge0Jhc2VNb2R1bGV9IGZyb20gJy4vYmFzZS1tb2R1bGUnO1xuaW1wb3J0IHtEYXRhUmFuZ2VNYW5hZ2VyLCBTdGF0c0RhdGFSYW5nZX0gZnJvbSAnLi4vbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9kYXRhLXJhbmdlLW1hbmFnZXInO1xuaW1wb3J0IHtNZXRyaWNzTWFuYWdlcn0gZnJvbSAnLi4vbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tZXRyaWNzLW1hbmFnZXInO1xuaW1wb3J0IHtWaWV3TWFuYWdlcn0gZnJvbSAnLi4vbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy92aWV3LW1hbmFnZXInO1xuaW1wb3J0IHtEYXRlSGVscGVyfSBmcm9tICcuLi9tYW5hZ2Vycy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3V0aWxzL2RhdGUtaGVscGVyJztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHtBbmFseXRpY3NEYXRhVmlld30gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2FuYWx5dGljcy1kYXRhLXZpZXcnO1xuaW1wb3J0IHtEZW1vZ3JhcGhpY3NUYWJsZVZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9kZW1vZ3JhcGhpY3MvZGVtb2dyYXBoaWNzLXRhYmxlLXZpZXcnO1xuaW1wb3J0IHtEZW1vZ3JhcGhpY3NDaGFydFZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9kZW1vZ3JhcGhpY3MvZGVtb2dyYXBoaWNzLWNoYXJ0LXZpZXcnO1xuaW1wb3J0IHtEZW1vZ3JhcGhpY3NNYXBWaWV3fSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGVtb2dyYXBoaWNzL2RlbW9ncmFwaGljcy1tYXAtdmlldyc7XG5pbXBvcnQge1RlY2hub2xvZ3lUYWJsZVZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy90ZWNobm9sb2d5L3RlY2hub2xvZ3ktdGFibGUtdmlldyc7XG5pbXBvcnQge1RlY2hub2xvZ3lDaGFydFZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy90ZWNobm9sb2d5L3RlY2hub2xvZ3ktY2hhcnQtdmlldyc7XG5pbXBvcnQge0FwcGxpY2F0aW9uVGFibGVWaWV3fSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYXBwbGljYXRpb24vYXBwbGljYXRpb24tdGFibGUtdmlldyc7XG5pbXBvcnQge0FwcGxpY2F0aW9uQ2hhcnRWaWV3fSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYXBwbGljYXRpb24vYXBwbGljYXRpb24tY2hhcnQtdmlldyc7XG5pbXBvcnQge0V4Y2VwdGlvbnNUYWJsZVZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9leGNlcHRpb25zL2V4Y2VwdGlvbnMtdGFibGUtdmlldyc7XG5pbXBvcnQge0V4Y2VwdGlvbnNDaGFydFZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9leGNlcHRpb25zL2V4Y2VwdGlvbnMtY2hhcnQtdmlldyc7XG5pbXBvcnQge0RlbW9ncmFwaGljc1Byb0Fkdn0gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2RlbW9ncmFwaGljcy9kZW1vZ3JhcGhpY3MtcHJvLWFkdic7XG5pbXBvcnQge1RlY2hub2xvZ3lQcm9BZHZ9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy90ZWNobm9sb2d5L3RlY2hub2xvZ3ktcHJvLWFkdic7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQW5hbHl0aWNzIGV4dGVuZHMgQmFzZU1vZHVsZVxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCdhbmFseXRpY3MnKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfSU5JVCA9ICdkb0luaXQnO1xuXHRcdHRoaXMuUkVRX0dFVF9EQVRBID0gJ2dldERhdGEnO1xuXHRcdHRoaXMuUkVRX0lOVEVSUlVQVCA9ICdzdG9wJztcblx0XHR0aGlzLlJFUV9TVEFSVF9MT0dfQU5BTFlTSVMgPSAnc3RhcnRMb2dBbic7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfSU5JVCA9ICdpbml0Jztcblx0XHR0aGlzLlJFU1BfUkFOR0UgPSAncmFuZ2UnO1xuXHRcdHRoaXMuUkVTUF9EQVRBX05PTkUgPSAnbm9uZSc7XG5cdFx0dGhpcy5SRVNQX0RBVEFfUFJPR1JFU1MgPSAncHJvZ3Jlc3MnO1xuXHRcdHRoaXMuUkVTUF9EQVRBX1JFQURZID0gJ2RhdGEnO1xuXHRcdHRoaXMuUkVTUF9EQVRBX0NPTVBMRVRFID0gJ2NvbXBsZXRlJztcblx0XHR0aGlzLlJFU1BfQlVTWV9JTklUID0gJ2lzQnVzeUluaXQnO1xuXHRcdHRoaXMuUkVTUF9CVVNZX0RBVEEgPSAnaXNCdXN5RGF0YSc7XG5cdFx0dGhpcy5SRVNQX0xPR19BTkFMWVNJU19JTklUX0VSUk9SID0gJ2xvZ0FuSW5pdEVycm9yJztcblx0XHR0aGlzLlJFU1BfTE9HX0FOQUxZU0lTX1NUQVRVUyA9ICdsb2dBblN0YXR1cyc7XG5cdFx0dGhpcy5SRVNQX0VSUk9SID0gJ2Vycm9yJztcblxuXHRcdHRoaXMuVkVSU0lPTl9ERU1PID0gJ2RlbW8nO1xuXHRcdHRoaXMuVkVSU0lPTl9CQVNJQyA9ICdiYXNpYyc7XG5cdFx0dGhpcy5WRVJTSU9OX1BSTyA9ICdwcm8nO1xuXG5cdFx0dGhpcy5WSUVXX0lOSVRfV0FJVCA9ICdhbmwtaW5pdC13YWl0Jztcblx0XHR0aGlzLlZJRVdfSU5JVF9CVVNZID0gJ2FubC1pbml0LWJ1c3knO1xuXHRcdHRoaXMuVklFV19JTklUX1JVTiA9ICdhbmwtaW5pdC1ydW4nO1xuXHRcdHRoaXMuVklFV19EQVRBID0gJ2FubC1kYXRhJztcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIENPTU1PTiBNT0RVTEUgSU5URVJGQUNFIE1FVEhPRFNcblx0Ly8gVGhpcyBtZW1iZXJzIGFyZSB1c2VkIGJ5IHRoZSBtYWluIGNvbnRyb2xsZXJcblx0Ly8gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgbW9kdWxlJ3MgY29udHJvbGxlci5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRpbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5pbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKTtcblxuXHRcdC8vIElOSVRJQUxJWkUgQ09NUE9ORU5UU1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJcblx0XHQkKCcjYW5sLXByb2dyZXNzQmFyJykua2VuZG9Qcm9ncmVzc0Jhcih7XG5cdFx0XHRtaW46IDAsXG4gICAgICAgICAgICBtYXg6IDEwMCxcblx0XHRcdHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsXG4gICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNDAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIGJ1dHRvbnNcblx0XHQkKCcjYW5sLXJlZnJlc2hJbml0QnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVmcmVzaEluaXRCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2FubC1pbml0QW5hbHl6ZUxvZ0J0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkluaXRTdGFydExvZ0FuYWx5c2lzQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNhbmwtcmVmcmVzaEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlZnJlc2hEYXRhQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNhbmwtY29uZmlnUmFuZ2VCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93Q29uZmlnUmFuZ2VNb2RhbEJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYW5sLXN0b3BCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TdG9wQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNhbmwtYW5hbHl6ZUxvZ0J0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblNob3dMb2dBbmFseXNpc01vZGFsQnRDbGljaywgdGhpcykpO1xuXG5cdFx0JCgnLnVwbG9hZC1zcGlubmVyJykuaGlkZSgpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBoZWxwIHRvb2x0aXBzXG5cdFx0JCh0aGlzKS5rZW5kb1Rvb2x0aXAoe1xuXHRcdFx0ZmlsdGVyOiAnaVt0aXRsZV0uaGVscCwgLnNob3ctdG9vbHRpcFt0aXRsZV0nLFxuXHRcdFx0cG9zaXRpb246ICdyaWdodCcsXG5cdFx0XHRjb250ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHJldHVybiBgPGRpdiBjbGFzcz0naGVscC10b29sdGlwJz4ke2UudGFyZ2V0LmRhdGEoJ3RpdGxlJyl9PC9kaXY+YDtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIENvbmZpZ3VyZSBsb2cgYW5hbHlzaXMgcGFuZWxcblx0XHQkKCcjYW5sLWxvZ0FuYWx5c2lzTW9kYWwnKS5tb2RhbCh7XG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogZmFsc2UsXG5cdFx0XHRzaG93OiBmYWxzZSxcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBTdGFydCBsb2cgYW5hbHlzaXMgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI2FubC1zdGFydExvZ0FuYWx5c2lzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uU3RhcnRMb2dBbmFseXNpc0J0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIENvbmZpZ3VyZSBkYXRhIHJhbmdlIHBhbmVsXG5cdFx0JCgnI2FubC1kYXRhUmFuZ2VNb2RhbCcpLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIFN0YXJ0IGxvZyBhbmFseXNpcyBidXR0b24gY2xpY2tcblx0XHQkKCcjYW5sLXNldERhdGFSYW5nZUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblNldERhdGFSYW5nZUJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgc2Nyb2xsaW5nIHRhYnNcblx0XHQkKCcjYW5sLXRhYk5hdmlnYXRvciA+ICN0YWJzJykuc2Nyb2xsaW5nVGFicyh7XG5cdFx0XHRib290c3RyYXBWZXJzaW9uOiA0LFxuXHRcdFx0c2Nyb2xsVG9UYWJFZGdlOiB0cnVlLFxuXHRcdFx0ZW5hYmxlU3dpcGluZzogdHJ1ZSxcblx0XHRcdGRpc2FibGVTY3JvbGxBcnJvd3NPbkZ1bGx5U2Nyb2xsZWQ6IHRydWUsXG5cdFx0XHRjc3NDbGFzc0xlZnRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tbGVmdCcsXG5cdFx0XHRjc3NDbGFzc1JpZ2h0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLXJpZ2h0J1xuXHRcdH0pO1xuXG5cdFx0JCgnI2FubC10YWJOYXZpZ2F0b3IgYVtkYXRhLXRvZ2dsZT1cInRhYlwiXScpLm9uKCdzaG93bi5icy50YWInLCAkLnByb3h5KHRoaXMuX29uVmlld0NoYW5nZSwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIFwiZmlsdGVyLXNldFwiIGV2ZW50IGRpc3BhdGNoZWQgYnkgZGF0YSB2aWV3c1xuXHRcdCQoJ2FuYWx5dGljcy1kYXRhLXZpZXcnKS5vbignZmlsdGVyLXNldCcsICQucHJveHkodGhpcy5fb25EYXRhRmlsdGVyU2V0LCB0aGlzKSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gcmVkcmF3IHdoYXQncyBuZWVkZWQgaW4gY2FzZSBvZiB3aW5kb3cgcmVzaXplXG5cdFx0JCh3aW5kb3cpLm9uKCdyZXNpemUnLCAkLnByb3h5KHRoaXMuX29uV2luZG93UmVzaXplLCB0aGlzKSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gcmVkcmF3IHdoYXQncyBuZWVkZWQgd2hlbiBhIHBpbGwgbmF2IHRhYiBpcyBjaGFuZ2VkXG5cdFx0JCgnYW5hbHl0aWNzLWRhdGEtdmlldyBhW2RhdGEtdG9nZ2xlPVwicGlsbFwiXScpLm9uKCdzaG93bi5icy50YWInLCAkLnByb3h5KHRoaXMuX29uV2luZG93UmVzaXplLCB0aGlzKSk7XG5cblx0XHQvLyBPVEhFUiBJTklUSUFMSVpBVElPTlNcblxuXHRcdHRoaXMuX2luaXRpYWxpemUoKTtcblx0fVxuXG5cdGRlc3Ryb3koKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cblx0XHQkKHdpbmRvdykub2ZmKCdyZXNpemUnKTtcblx0XHQkKCdhbmFseXRpY3MtZGF0YS12aWV3IGFbZGF0YS10b2dnbGU9XCJwaWxsXCJdJykub2ZmKCdzaG93bi5icy50YWInKTtcblxuXHRcdC8vIERlc3Ryb3kgc2Nyb2xsaW5nIHRhYnNcblx0XHQkKCcjYW5sLXRhYk5hdmlnYXRvciAjdGFicycpLnNjcm9sbGluZ1RhYnMoJ2Rlc3Ryb3knKTtcblx0XHQkKCcjYW5sLXRhYk5hdmlnYXRvciBhW2RhdGEtdG9nZ2xlPVwidGFiXCJdJykub2ZmKCdzaG93bi5icy50YWInKTtcblxuXHRcdC8vIFJlbW92ZSBpbnRlcmZhY2UgYnV0dG9ucyBjbGljayBsaXN0ZW5lcnNcblx0XHQkKCcjYW5sLXJlZnJlc2hJbml0QnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2FubC1pbml0QW5hbHl6ZUxvZ0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNhbmwtcmVmcmVzaEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNhbmwtY29uZmlnUmFuZ2VCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYW5sLXN0b3BCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYW5sLWFuYWx5emVMb2dCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYW5sLXN0YXJ0TG9nQW5hbHlzaXNCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYW5sLXNldERhdGFSYW5nZUJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0Ly8gUmVtb3ZlIGN1c3RvbSBldmVudCBsaXN0ZW5lcnNcblx0XHQkKCdhbmFseXRpY3MtZGF0YS12aWV3Jykub2ZmKCd0aW1lLXVuaXQtY2hhbmdlJyk7XG5cdFx0JCgnYW5hbHl0aWNzLWRhdGEtdmlldycpLm9mZignY2hhcnQtbWV0cmljLWNoYW5nZScpO1xuXHRcdCQoJ2FuYWx5dGljcy1kYXRhLXZpZXcnKS5vZmYoJ2ZpbHRlci1zZXQnKTtcblxuXHRcdC8vIEhpZGUgbW9kYWxzXG5cdFx0JCgnI2FubC1sb2dBbmFseXNpc01vZGFsJykubW9kYWwoJ2hpZGUnKTtcblx0XHQkKCcjYW5sLWRhdGFSYW5nZU1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblxuXHRcdC8vIERlc3Ryb3kgbWFuYWdlcnNcblx0XHR0aGlzLl9kcm0uZGVzdHJveSgpO1xuXHRcdHRoaXMuX2R2bS5kZXN0cm95KCk7XG5cdFx0dGhpcy5fbW0uZGVzdHJveSgpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBBIFNRTCBlcnJvciBvY2N1cnJlZFxuXHRcdGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoKTtcblxuXHRcdFx0Y29uc3Qgd2FybmluZyA9IGBVbmFibGUgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBkdWUgdG8gdGhlIGZvbGxvd2luZyBTUUwgZXJyb3I6ICR7ZGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJyl9LmA7XG5cblx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCh3YXJuaW5nKTtcblx0XHR9XG5cblx0XHQvKiAtLS0tLS0tLS0tIExPRyBBTkFMWVNJUyBSRUxBVEVEIFJFU1BPTlNFUyAtLS0tLS0tLS0tICovXG5cblx0XHQvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbml0aWFsaXppbmcgdGhlIGxvZyBhbmFseXNpcyBwcm9jZXNzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfTE9HX0FOQUxZU0lTX0lOSVRfRVJST1IpXG5cdFx0e1xuXHRcdFx0Y29uc3Qgd2FybmluZyA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpO1xuXG5cdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQod2FybmluZyk7XG5cblx0XHRcdC8vIEVuYWJsZSBidXR0b25zXG5cdFx0XHR0aGlzLl9lbmFibGVMb2dBbmFseXNpc0J1dHRvbih0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBMb2cgYW5hbHlzaXMgcHJvY2VzcyBzdGF0dXMgdXBkYXRlXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfTE9HX0FOQUxZU0lTX1NUQVRVUylcblx0XHR7XG5cdFx0XHRjb25zdCBpc1J1bm5pbmcgPSBkYXRhLmdldEJvb2woJ3J1bm5pbmcnKTtcblx0XHRcdGNvbnN0IHJlcXVlc3RlciA9IGRhdGEuY29udGFpbnNLZXkoJ3JlcXVlc3RlcicpID8gZGF0YS5nZXRVdGZTdHJpbmcoJ3JlcXVlc3RlcicpIDogJyc7XG5cdFx0XHRjb25zdCB3YXJuaW5nID0gZGF0YS5jb250YWluc0tleSgnZXJyb3InKSA/IGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpIDogJyc7XG5cblx0XHRcdC8vIERpc2FibGUvZW5hYmxlIGJ1dHRvblxuXHRcdFx0dGhpcy5fZW5hYmxlTG9nQW5hbHlzaXNCdXR0b24oIWlzUnVubmluZyk7XG5cblx0XHRcdGlmIChpc1J1bm5pbmcpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ0xvZyBhbmFseXNpcycsIGBQcm9jZXNzIHN0YXJ0ZWQgJHsocmVxdWVzdGVyICE9IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUgPyAnIGJ5IGFkbWluaXN0cmF0b3IgJyArIHJlcXVlc3RlciA6ICcnKX07IHVwZGF0ZWQgc3RhdHMgd2lsbCBiZSBhdmFpbGFibGUgb24gY29tcGxldGlvbmApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBDaGVjayBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgbG9nIGFuYWx5c2lzXG5cdFx0XHRcdC8vIElmIG5vdCwgdGhlbiBwcm9jZXNzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdFx0aWYgKHdhcm5pbmcgIT0gJycpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoYCR7d2FybmluZ307IHBsZWFzZSBjaGVjayB0aGUgU21hcnRGb3hTZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMgYW5kIHJlcG9ydCB0aGUgaXNzdWUgdG8gdGhlIFNtYXJ0Rm94U2VydmVyIHRlYW0gaWYgbmVlZGVkLmApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEdvIHRvIGRhdGEgZGlzcGxheSB2aWV3XG5cdFx0XHRcdFx0dGhpcy5fdG9EYXRhRGlzcGxheVZpZXcoKTtcblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBsYXN0IHByb2Nlc3NlZCBsb2cgZW50cnkgZGF0ZSBhbmQgZ2VvbG9jYXRpb24gZmxhZ1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUxvZ0FuYWx5c2lzSW5mbyhkYXRhLmdldFNGU09iamVjdCgnaW5mbycpKTtcblxuXHRcdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbignTG9nIGFuYWx5c2lzJywgJ1Byb2Nlc3MgY29tcGxldGVkOyB1cGRhdGVkIHN0YXRzIGFyZSBub3cgYXZhaWxhYmxlJyk7XG5cblx0XHRcdFx0XHRpZiAocmVxdWVzdGVyID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdFx0XHQkKCcjYW5sLWxvZ0FuYWx5c2lzTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHRcdFx0Ly8gUmVmcmVzaCBkYXRhXG5cdFx0XHRcdFx0dGhpcy5fcmVxdWVzdFN0YXRzRGF0YSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyogLS0tLS0tLS0tLSBJTklUIFJFTEFURUQgUkVTUE9OU0VTIC0tLS0tLS0tLS0gKi9cblxuXHRcdC8vIExvZyBhbmFseXNpcyBpcyBpbiBwcm9ncmVzczogY2FudCcgZ2V0IGluaXRpYWxpemF0aW9uIGRhdGFcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9CVVNZX0lOSVQpXG5cdFx0e1xuXHRcdFx0dGhpcy5fc3dpdGNoVmlldyh0aGlzLlZJRVdfSU5JVF9CVVNZKTtcblx0XHR9XG5cblx0XHQvLyBCYXNpYyBpbmZvIHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfSU5JVClcblx0XHR7XG5cdFx0XHQvLyBDb25maWd1cmUgbW9kdWxlIGJhc2VkIG9uIGxpY2Vuc2Vcblx0XHRcdHRoaXMuX2NvbmZpZ3VyZShkYXRhLmdldFV0ZlN0cmluZygndmVyc2lvbicpKTtcblxuXHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ2luZm8nKSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gVXBkYXRlIGxhc3QgcHJvY2Vzc2VkIGxvZyBlbnRyeSBkYXRlIGFuZCBnZW9sb2NhdGlvbiBmbGFnXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUxvZ0FuYWx5c2lzSW5mbyhkYXRhLmdldFNGU09iamVjdCgnaW5mbycpKTtcblxuXHRcdFx0XHQvLyBTaG93IGRhdGEgZGlzcGxheSB2aWV3XG5cdFx0XHRcdHRoaXMuX3RvRGF0YURpc3BsYXlWaWV3KCk7XG5cblx0XHRcdFx0Ly8gUmVxdWVzdCBkYXRhXG5cdFx0XHRcdHRoaXMuX3JlcXVlc3RTdGF0c0RhdGEoKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fc3dpdGNoVmlldyh0aGlzLlZJRVdfSU5JVF9SVU4pO1xuXHRcdH1cblxuXHRcdC8qIC0tLS0tLS0tLS0gREFUQSBSRVRSSUVWQUwgUkVMQVRFRCBSRVNQT05TRVMgLS0tLS0tLS0tLSAqL1xuXG5cdFx0Ly8gTG9nIGFuYWx5c2lzIGlzIGluIHByb2dyZXNzOiBjYW50JyBnZXQgc3RhdHMgZGF0YVxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JVU1lfREFUQSlcblx0XHR7XG5cdFx0XHQvLyBVcGRhdGUgdmlld1xuXHRcdFx0dGhpcy5fZHZtLnVwZGF0ZVZpZXcoZHJtLmdldFNlbGVjdGVkUmFuZ2UoKSwgdGhpcy5fZ2V0RGF0YUZpbHRlcigpLCBmYWxzZSk7XG5cblx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSgpO1xuXG5cdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoYFN0YXRzIGRhdGEgY2FuJ3QgYmUgcmV0cml2ZWQgYmVjYXVzZSB0aGUgdXBkYXRlIHByb2Nlc3MgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLiBQbGVhc2Ugd2FpdCBmb3IgbG9nIGFuYWx5c2lzIGNvbXBsZXRpb24gYW5kIGhpdCB0aGUgJ1JlZnJlc2gnIGJ1dHRvbi5gKTtcblx0XHR9XG5cblx0XHQvLyBEYXRhIHJhbmdlIHVwZGF0ZWQgYnkgdGhlIHNlcnZlclxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1JBTkdFKVxuXHRcdHtcblx0XHRcdC8vIFNldCBkYXRhIHJhbmdlLCBpbiBjYXNlIGl0IHdhcyBtb2RpZmllZCBieSB0aGUgc2VydmVyXG5cdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgncmFuZ2UnKSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IHNkciA9IFN0YXRzRGF0YVJhbmdlLm5ld0Zyb21TRlNPYmplY3QoZGF0YS5nZXRTRlNPYmplY3QoJ3JhbmdlJykpXG5cdFx0XHRcdHRoaXMuX2RybS5zZXROZXdSYW5nZShzZHIpO1xuXG5cdFx0XHRcdC8vIFNob3cgc2VsZWN0ZWQgZGF0YSByYW5nZVxuXHRcdFx0XHR0aGlzLl9kaXNwbGF5RGF0YVJhbmdlKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEVuYWJsZSBzdG9wIGJ1dHRvblxuXHRcdFx0JCgnI2FubC1zdG9wQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcblx0XHR9XG5cblx0XHQvLyBObyBzdGF0cyBkYXRhIGF2YWlsYWJsZVxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0RBVEFfTk9ORSlcblx0XHR7XG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoKTtcblxuXHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KCdUaGUgc3RhdHMgZGF0YWJhc2UgaXMgZW1wdHk7IHlvdSBzaG91bGQgcnVuIHRoZSBsb2cgYW5hbHlzaXMgcHJvY2Vzcy4nKTtcblx0XHR9XG5cblx0XHQvLyBTdGF0cyBkYXRhIHJldHJpZXZhbCBwcm9ncmVzcyB1cGRhdGVcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9EQVRBX1BST0dSRVNTKVxuXHRcdHtcblx0XHRcdHRoaXMuX2R2bS5nZXRTZWxlY3RlZFZpZXcoKS51cGRhdGVQcm9ncmVzcyhkYXRhLmdldEludCgnc3RlcHMnKSk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RhdHMgZGF0YSByZWNlaXZlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0RBVEFfUkVBRFkpXG5cdFx0e1xuXHRcdFx0Y29uc3QgcmFuZ2UgPSB0aGlzLl9kcm0uZ2V0U2VsZWN0ZWRSYW5nZSgpO1xuXHRcdFx0Y29uc3QgZmlsdGVyID0gdGhpcy5fZ2V0RGF0YUZpbHRlcigpO1xuXG5cdFx0XHQvLyBEaXNwbGF5IHJlY2VpdmVkIGRhdGFcblxuXHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ21ldHJpY3MnKSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IG1ldHJpY3NEYXRhID0gZGF0YS5nZXRTRlNPYmplY3QoJ21ldHJpY3MnKTtcblxuXHRcdFx0XHQvLyBVcGRhdGUgbWV0cmljc1xuXHRcdFx0XHR0aGlzLl9tbS51cGRhdGVNZXRyaWNzKG1ldHJpY3NEYXRhLCByYW5nZSwgZmlsdGVyKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ2NoYXJ0JykpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBjaGFydERhdGEgPSBkYXRhLmdldFNGU09iamVjdCgnY2hhcnQnKTtcblxuXHRcdFx0XHQvLyBHZXQgbGlzdCBvZiB2aWV3cyB3aXRoIHRoZSBzYW1lIHNldHRpbmdzIChmaWx0ZXIgYW5kIHRpbWV1bml0KSBvZiB0aGUgY3VycmVudCB2aWV3XG5cdFx0XHRcdC8vIFRoaXMgYWxsb3dzIHVwZGF0aW5nIHZpZXdzIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgd2l0aCB0aGUgcmVjZWl2ZWQgY2hhcnQgZGF0YSBpZjpcblx0XHRcdFx0Ly8gLSB0aGUgdmlldyBjb250YWlucyB0aGUgc2FtZSBjaGFydFxuXHRcdFx0XHQvLyAtIHRoZSBmaWx0ZXIgaXMgbnVsbFxuXHRcdFx0XHQvLyAtIHRoZSBzYW1lIHRpbWUgdW5pdCBpcyBzZWxlY3RlZCBmb3IgdGhlIGNoYXJ0XG5cblx0XHRcdFx0Y29uc3QgdGltZVVuaXQgPSB0aGlzLl9kdm0uZ2V0U2VsZWN0ZWRWaWV3KCkubWFpbkNoYXJ0LmdldFNlbGVjdGVkVGltZVVuaXQoKTtcblx0XHRcdFx0bGV0IHVwZGF0YWJsZVZpZXdzID0gdGhpcy5fZHZtLmdldFVwZGF0YWJsZVZpZXdzRm9yQ2hhcnQoZmlsdGVyLCB0aW1lVW5pdCk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIGNoYXJ0IGRhdGFcblx0XHRcdFx0dGhpcy5fbW0udXBkYXRlQ2hhcnQoY2hhcnREYXRhLCB1cGRhdGFibGVWaWV3cywgcmFuZ2UsIGZpbHRlciwgdGltZVVuaXQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgndGFibGUnKSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IHRhYmxlRGF0YSA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCd0YWJsZScpO1xuXHRcdFx0XHR0aGlzLl9tbS51cGRhdGVUYWJsZSh0YWJsZURhdGEuZ2V0U0ZTQXJyYXkoJ2RhdGEnKSwgdGFibGVEYXRhLmdldFV0ZlN0cmluZygndmlld0lkJyksIHJhbmdlLCBmaWx0ZXIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEaXNwbGF5IHVwZGF0ZWQgbWV0cmljc1xuXHRcdFx0dGhpcy5fZHZtLnVwZGF0ZVZpZXcodGhpcy5fZHJtLmdldFNlbGVjdGVkUmFuZ2UoKSwgZmlsdGVyLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBTdGF0cyBkYXRhIHJldHJpZXZhbCBjb21wbGV0ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9EQVRBX0NPTVBMRVRFKVxuXHRcdHtcblx0XHRcdHRoaXMuX2RhdGFSZXF1ZXN0Q250IC09IDE7XG5cblx0XHRcdGlmICh0aGlzLl9kYXRhUmVxdWVzdENudCA8PSAwKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBlbGFwc2VkID0gJ0xhc3QgcXVlcnk6ICcgKyBEYXRlSGVscGVyLmZvcm1hdFRpbWVNcyhkYXRhLmdldExvbmcoJ2VsYXBzZWQnKSk7XG5cblx0XHRcdFx0Ly8gRGlzcGxheSBhbGwgbWV0cmljc1xuXHRcdFx0XHQvLyBUaGlzIGlzIHJlcXVpcmVkIGluIGNhc2Ugc29tZSBtZXRyaWNzIHdlcmUgbm90IGxvYWRlZCBkdWUgdG8gdXNlciBpbnRlcnJ1cHRpb25cblx0XHRcdFx0dGhpcy5fZHZtLnVwZGF0ZVZpZXcodGhpcy5fZHJtLmdldFNlbGVjdGVkUmFuZ2UoKSwgdGhpcy5fZ2V0RGF0YUZpbHRlcigpLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdFx0Ly8gRW5hYmxlIGludGVyZmFjZVxuXHRcdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZWxhcHNlZCk7XG5cblx0XHRcdFx0dGhpcy5fZGF0YVJlcXVlc3RDbnQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGVsc2UgaWZcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9vblJlZnJlc2hJbml0QnRDbGljaygpXG5cdHtcblx0XHR0aGlzLl9zd2l0Y2hWaWV3KHRoaXMuVklFV19JTklUX1dBSVQpO1xuXG5cdFx0Ly8gUmVxdWVzdCBpbml0aWFsaXphdGlvbiBkYXRhXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9JTklUKTtcblx0fVxuXG5cdF9vbkluaXRTdGFydExvZ0FuYWx5c2lzQnRDbGljaygpXG5cdHtcblx0XHR0aGlzLl9zdGFydExvZ0FuYWx5c2lzKHRydWUpO1xuXHR9XG5cblx0X29uUmVmcmVzaERhdGFCdENsaWNrKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RTdGF0c0RhdGEoKTtcblx0fVxuXG5cdF9vblNob3dDb25maWdSYW5nZU1vZGFsQnRDbGljaygpXG5cdHtcblx0XHQvLyBTaG93IGRhdGEgcmFuZ2UgY29uZmlndXJhdGlvbiBtb2RhbFxuXHRcdCQoJyNhbmwtZGF0YVJhbmdlTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuXHR9XG5cblx0X29uU3RvcEJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBidXR0b25cblx0XHQkKCcjYW5sLXN0b3BCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9JTlRFUlJVUFQpO1xuXHR9XG5cblx0X29uU2hvd0xvZ0FuYWx5c2lzTW9kYWxCdENsaWNrKClcblx0e1xuXHRcdC8vIFNob3cgbG9nIGFuYWx5c2lzIG1vZGFsXG5cdFx0JCgnI2FubC1sb2dBbmFseXNpc01vZGFsJykubW9kYWwoJ3Nob3cnKTtcblx0fVxuXG5cdF9vblN0YXJ0TG9nQW5hbHlzaXNCdENsaWNrKClcblx0e1xuXHRcdC8vIFNob3cgY29uZmlybSB3YXJuaW5nIGlmIGRhdGEgcmVidWlsZCBpcyByZXF1ZXN0ZWRcblx0XHRpZiAoJCgnI2FubC1yZWJ1aWxkRGF0YUNiJykucHJvcCgnY2hlY2tlZCcpKVxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVidWlsZCB0aGUgZnVsbCBzdGF0cyBkYXRhYmFzZT8gVGhpcyBhY3Rpb24gY2FuIHRha2UgYSBsb25nIHRpbWUuJywgJC5wcm94eSh0aGlzLl9vblN0YXJ0TG9nQW5hbHlzaXNDb25maXJtLCB0aGlzKSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fc3RhcnRMb2dBbmFseXNpcyhmYWxzZSk7XG5cdH1cblxuXHRfb25TdGFydExvZ0FuYWx5c2lzQ29uZmlybSgpXG5cdHtcblx0XHQvLyBTdGFydCBsb2cgYW5hbHlzaXMgd2l0aCBkYXRhIHJlYnVpbGRcblx0XHR0aGlzLl9zdGFydExvZ0FuYWx5c2lzKHRydWUpO1xuXHR9XG5cblx0X29uU2V0RGF0YVJhbmdlQnRDbGljaygpXG5cdHtcblx0XHQvLyBIaWRlIG1vZGFsXG5cdFx0JCgnI2FubC1kYXRhUmFuZ2VNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cblx0XHQvLyBTZXQgYXZhaWxhYmxlIHRpbWUgdW5pdHMgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGRhdGEgcmFuZ2Vcblx0XHR0aGlzLl9kdm0uc2V0QXZhaWxhYmxlQ2hhcnRUaW1lVW5pdCh0aGlzLl9kcm0uZ2V0UmFuZ2VMZW5ndGgoKSk7XG5cblx0XHQvLyBSZXF1ZXN0IHN0YXRzIGRhdGFcblx0XHR0aGlzLl9yZXF1ZXN0U3RhdHNEYXRhKCk7XG5cdH1cblxuXHRfb25UaW1lVW5pdENoYW5nZSgpXG5cdHtcblx0XHQvLyBSZXF1ZXN0IGRhdGFcblx0XHR0aGlzLl9yZXF1ZXN0U3RhdHNEYXRhKHRydWUpO1xuXHR9XG5cblx0X29uQ2hhcnRNZXRyaWNDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gUmVxdWVzdCBkYXRhXG5cdFx0dGhpcy5fcmVxdWVzdFN0YXRzRGF0YSh0cnVlKTtcblx0fVxuXG5cdF9vblZpZXdDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRG8gbm90IGRpc3BsYXkgY2VydGFpbiB2aWV3IGRhdGEgaWYgdmVyc2lvbiBpcyBCQVNJQ1xuXHRcdGlmICghdGhpcy5faXNWYWxpZFZlcnNpb24oKSlcblx0XHRcdHJldHVybjtcblxuXHRcdC8vIERpc3BsYXkgY3VycmVudCBtZXRyaWMgZGF0YVxuXHRcdHRoaXMuX2R2bS51cGRhdGVWaWV3KHRoaXMuX2RybS5nZXRTZWxlY3RlZFJhbmdlKCksIHRoaXMuX2dldERhdGFGaWx0ZXIoKSwgZmFsc2UsIHRydWUpO1xuXG5cdFx0Ly8gUmVxdWVzdCBkYXRhXG5cdFx0dGhpcy5fcmVxdWVzdFN0YXRzRGF0YSgpO1xuXHR9XG5cblx0X29uRGF0YUZpbHRlclNldChlKVxuXHR7XG5cdFx0Ly8gU2V0IGZpbHRlciBvbiB2aWV3XG5cdFx0dGhpcy5fZHZtLnNldEZpbHRlck9uU2VsZWN0ZWRWaWV3KGUuZGV0YWlsLCB0aGlzLl9kcm0uZ2V0U2VsZWN0ZWRSYW5nZSgpKTtcblxuXHRcdC8vIFJlcXVlc3QgZGF0YVxuXHRcdHRoaXMuX3JlcXVlc3RTdGF0c0RhdGEoKTtcblx0fVxuXG5cdF9vbldpbmRvd1Jlc2l6ZSgpXG5cdHtcblx0XHQvLyBXZSBoYXZlIHRvIHJlc2l6ZSB0aGUgY3VzdG9tIHN1Yi12aWV3cyAodGFibGVzLCBjaGFydHMpIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHZpZXdcblx0XHRjb25zdCBzZWxWaWV3ID0gdGhpcy5fZHZtLmdldFNlbGVjdGVkVmlldygpO1xuXG5cdFx0JChzZWxWaWV3KS5maW5kKCcudGFiLXBhbmUuYWN0aXZlJykuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCQodGhpcylbMF0ucmVmcmVzaE9uV2luZG93UmVzaXplKVxuXHRcdFx0XHQkKHRoaXMpWzBdLnJlZnJlc2hPbldpbmRvd1Jlc2l6ZSgpO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X3N3aXRjaFZpZXcodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FubC12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X3RvRGF0YURpc3BsYXlWaWV3KClcblx0e1xuXHRcdHRoaXMuX3N3aXRjaFZpZXcodGhpcy5WSUVXX0RBVEEpO1xuXHRcdCQoJyNhbmwtdGFiTmF2aWdhdG9yICN0YWJzJykuc2Nyb2xsaW5nVGFicygncmVmcmVzaCcpO1xuXHR9XG5cblx0X2luaXRpYWxpemUoKVxuXHR7XG5cdFx0dGhpcy5fZGF0YVJlcXVlc3RDbnQgPSAwO1xuXG5cdFx0Ly8gU2V0IGRlZmF1bHQgZGF0YSByYW5nZVxuXHRcdHRoaXMuX2RybSA9IG5ldyBEYXRhUmFuZ2VNYW5hZ2VyKCQoJyNhbmwtZGF0YVJhbmdlTW9kYWwnKSwgJCgnI2FubC1kYXRhUmFuZ2UnKSk7XG5cdFx0dGhpcy5fZHJtLnNldERlZmF1bHRSYW5nZSgpO1xuXHRcdHRoaXMuX2RybS5zZXRQcmVkZWZpbmVkUmFuZ2UoJ1llc3RlcmRheScpO1xuXG5cdFx0Ly8tLS0tLS0tIFRFU1QgLS0tLS0tLVxuXHRcdC8vIGxldCB0ZW1wID0gbmV3IFN0YXRzRGF0YVJhbmdlKCk7XG5cdFx0Ly8gdGVtcC5tYWluRnJvbSA9IG1vbWVudChuZXcgRGF0ZSgxNTcyNTYyODAwMDAwKSk7XG5cdFx0Ly8gdGVtcC5tYWluVG8gPSBtb21lbnQobmV3IERhdGUoMTU4NzUwMjgwMDAwMCkpO1xuXHRcdC8vIHRoaXMuX2RybS5zZXROZXdSYW5nZSh0ZW1wKTtcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR0aGlzLl9kaXNwbGF5RGF0YVJhbmdlKCk7XG5cblx0XHQvLyBTZXR1cCBtZXRyaWNzXG5cdFx0dGhpcy5fbW0gPSBuZXcgTWV0cmljc01hbmFnZXIoKTtcblxuXHRcdC8vIFNldHVwIHZpZXdcblx0XHR0aGlzLl9kdm0gPSBuZXcgVmlld01hbmFnZXIodGhpcywgJCgnI2FubC10YWJOYXZpZ2F0b3IgI3RhYlBhbmVscycpLCB0aGlzLl9tbSk7XG5cdFx0dGhpcy5fZHZtLmluaXRpYWxpemUoKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNldCBhdmFpbGFibGUgdGltZSB1bml0cyBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgZGF0YSByYW5nZVxuXHRcdHRoaXMuX2R2bS5zZXRBdmFpbGFibGVDaGFydFRpbWVVbml0KHRoaXMuX2RybS5nZXRSYW5nZUxlbmd0aCgpKTtcblxuXHRcdC8vIEFkZCBjdXN0b20gZXZlbnQgbGlzdGVuZXJzXG5cdFx0JCgnYW5hbHl0aWNzLWRhdGEtdmlldycpLm9uKCd0aW1lLXVuaXQtY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vblRpbWVVbml0Q2hhbmdlLCB0aGlzKSk7XG5cdFx0JCgnYW5hbHl0aWNzLWRhdGEtdmlldycpLm9uKCdjaGFydC1tZXRyaWMtY2hhbmdlJywgJC5wcm94eSh0aGlzLl9vbkNoYXJ0TWV0cmljQ2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBSZXF1ZXN0IGluaXRpYWxpemF0aW9uIGRhdGEgdG8gc2VydmVyXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9JTklUKTtcblx0fVxuXG5cdF9jb25maWd1cmUodmVyc2lvbilcblx0e1xuXHRcdGlmICh2ZXJzaW9uICE9IHRoaXMuVkVSU0lPTl9CQVNJQyAmJiB2ZXJzaW9uICE9IHRoaXMuVkVSU0lPTl9QUk8pXG5cdFx0XHR2ZXJzaW9uID0gdGhpcy5WRVJTSU9OX0RFTU87XG5cblx0XHR0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcblxuXHRcdC8vIFVwZGF0ZSBtb2R1bGUgdGl0bGVcblx0XHR0aGlzLl9zaGVsbEN0cmwudXBkYXRlTW9kdWxlVGl0bGUoJyAnICsgdmVyc2lvbi50b1VwcGVyQ2FzZSgpLCB0cnVlKTtcblxuXHRcdGlmICh2ZXJzaW9uID09IHRoaXMuVkVSU0lPTl9ERU1PKVxuXHRcdHtcblx0XHRcdC8vIENvbmZpZ3VyZSBERU1PIHZlcnNpb25cblx0XHRcdC8vIEFsbCBmZWF0dXJlcyBhcmUgZW5hYmxlZCwgYnV0IHRoZSBzZXJ2ZXIgbGltaXRzIHRoZSBkYXRhIHJhbmdlIHRvIHRoZSBsYXN0IDMgZGF5c1xuXHRcdFx0Ly8gYW5kIHRoZSBjb21wYXJlIHNoaWZ0IHRvIC0xIG9ubHlcblxuXHRcdFx0Ly8gU2hvdy9oaWRlIHRoZSBsaWNlbnNlIHB1cmNoYXNlIGxpbmsgYm94XG5cdFx0XHQkKCcjYW5sLWxpY2Vuc2VBbGVydCcpLnNob3coKTtcblxuXHRcdFx0Ly8gRGlzYWJsZSBjb21wYXJlIHNoaWZ0XG5cdFx0XHR0aGlzLl9kcm0uZGlzYWJsZVNoaWZ0Rm9yRGVtbygpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh2ZXJzaW9uID09IHRoaXMuVkVSU0lPTl9CQVNJQylcblx0XHR7XG5cdFx0XHQvLyBDb25maWd1cmUgQkFTSUMgdmVyc2lvblxuXHRcdFx0Ly8gVGhlIHNlcnZlciBvbmx5IGFsbG93cyBab25lIGZpbHRlciB0byBiZSBhcHBsaWVkLCBhbmQgQXBwbGljYXRpb24gdGFibGUgZGF0YSB0byBiZSByZXRyaWV2ZWQ7XG5cdFx0XHQvLyBpbiBvdGhlciB3b3JkcyBEZW1vZ3JhcGhpY3MgYW5kIFRlY2hub2xvZ3kgdmlld3MgYXJlIG5vdCBuZWVkZWRcblx0XHRcdC8vIEFsc28gbm8gY29tcGFyaXNvbiBpcyBhdmFpbGFibGVcblxuXHRcdFx0Ly8gRGF0YSBjb21wYXJpc29uIG5vdCBhdmFpbGFibGVcblx0XHRcdHRoaXMuX2RybS5kaXNhYmxlQ29tcGFyZUZvckJhc2ljKCk7XG5cblx0XHRcdC8vIEhpZGUgRGVtb2dyYXBoaWNzIGFuZCBUZWNobm9sb2d5IHRhYnMgZGVmYXVsdCBjb250ZW50XG5cdFx0XHQkKCcjYW5sLWRhdGF2aWV3LWRlbW9ncmFwaGljcycpLmhpZGUoKTtcblx0XHRcdCQoJyNhbmwtZGF0YXZpZXctdGVjaG5vbG9neScpLmhpZGUoKTtcblxuXHRcdFx0Ly8gU2hvdyBhZHYgaW4gRGVtb2dyYXBoaWNzIGFuZCBUZWNobm9sb2d5IHRhYnNcblx0XHRcdHRoaXMucXVlcnlTZWxlY3RvcignI2FubC1kZW1vZ3JhcGhpY3MnKS5hcHBlbmRDaGlsZCggbmV3IERlbW9ncmFwaGljc1Byb0FkdigpICk7XG5cdFx0XHR0aGlzLnF1ZXJ5U2VsZWN0b3IoJyNhbmwtdGVjaG5vbG9neScpLmFwcGVuZENoaWxkKCBuZXcgVGVjaG5vbG9neVByb0FkdigpICk7XG5cdFx0XHQvKlxuXHRcdFx0Z2V0VmlldygpLnRhYl9kZW1vZ3JhcGhpY3MudmJfYWR2LmFkZENoaWxkKG5ldyBEZW1vZ3JhcGhpY3NQcm9BZHYoKSk7XG5cdFx0XHRnZXRWaWV3KCkudGFiX2RlbW9ncmFwaGljcy5zZWxlY3RlZEluZGV4ID0gMTtcblxuXHRcdFx0Z2V0VmlldygpLnRhYl90ZWNobm9sb2d5LnZiX2Fkdi5hZGRDaGlsZChuZXcgVGVjaG5vbG9neVByb0FkdigpKTtcblx0XHRcdGdldFZpZXcoKS50YWJfdGVjaG5vbG9neS5zZWxlY3RlZEluZGV4ID0gMTtcblx0XHRcdCovXG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvLyBDb25maWd1cmUgUFJPIHZlcnNpb25cblx0XHRcdC8vIEFsbCBmZWF0dXJlcyBhdmFpbGFibGVcblx0XHR9XG5cdH1cblxuXHRfaXNWYWxpZFZlcnNpb24oKVxuXHR7XG5cdFx0Ly8gRG8gbm90IGRpc3BsYXkgZGF0YSBmb3IgRGVtb2dyYXBoaWNzIGFuZCBUZWNobm9sb2d5IHZpZXdzIGlmIHZlcnNpb24gaXMgQkFTSUNcblx0XHRpZiAodGhpcy5fdmVyc2lvbiA9PSB0aGlzLlZFUlNJT05fQkFTSUMpXG5cdFx0e1xuXHRcdFx0Y29uc3Qgdmlld0lkID0gdGhpcy5fZHZtLmdldFNlbGVjdGVkVmlld0lkKCk7XG5cblx0XHRcdGlmICh2aWV3SWQgPT0gVmlld01hbmFnZXIuREVNT0dSQVBISUNTIHx8IHZpZXdJZCA9PSBWaWV3TWFuYWdlci5URUNITk9MT0dZKVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfdXBkYXRlTG9nQW5hbHlzaXNJbmZvKGluZm8pXG5cdHtcblx0XHQvLyBMYXN0IHByb2Nlc3NlZCBsb2cgZW50cnkgdGltZXN0YW1wXG5cdFx0Y29uc3QgbGFzdCA9IGluZm8uZ2V0VXRmU3RyaW5nKCdsYXN0Jyk7XG5cblx0XHRpZiAobGFzdCAhPSAnJylcblx0XHR7XG5cdFx0XHRsZXQgZGF0ZUFyciA9IGxhc3Quc3BsaXQoJy4nKTtcblx0XHRcdGxldCBzZXJ2ZXJEYXRlID0gRGF0ZUhlbHBlci5nZXREYXRlRnJvbVRyYW5zZmVyU3RyaW5nKGRhdGVBcnJbMF0pO1xuXHRcdFx0JCgnI2FubC1sYXRlc3RFbnRyeURhdGVMYicpLnRleHQoc2VydmVyRGF0ZS5mb3JtYXQoJ0REIE1NTSBZWVlZIEhIOm1tOnNzJykgKyAnLicgKyBkYXRlQXJyWzFdKTtcblx0XHRcdCQoJyNhbmwtbGF0ZXN0RW50cnlOb3RpY2UnKS5zaG93KCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQkKCcjYW5sLWxhdGVzdEVudHJ5RGF0ZUxiJykudGV4dCgnJyk7XG5cdFx0XHQkKCcjYW5sLWxhdGVzdEVudHJ5Tm90aWNlJykuaGlkZSgpO1xuXHRcdH1cblxuXHRcdC8vIEdlb2xvY2F0aW9uIGVuYWJsZWQgZmxhZ1xuXHRcdGlmIChpbmZvLmdldEJvb2woJ2dlbycpKVxuXHRcdFx0JCgnI2FubC1nZW9sb2NEaXNhYmxlZEFsZXJ0JykuaGlkZSgpO1xuXHRcdGVsc2Vcblx0XHRcdCQoJyNhbmwtZ2VvbG9jRGlzYWJsZWRBbGVydCcpLnNob3coKTtcblx0fVxuXG5cdF9nZXREYXRhRmlsdGVyKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kdm0uZ2V0U2VsZWN0ZWRWaWV3KCkuZmlsdGVyO1xuXHR9XG5cblx0X3JlcXVlc3RTdGF0c0RhdGEoY2hhcnRPbmx5ID0gZmFsc2UpXG5cdHtcblx0XHQvLyBEbyBub3QgZGlzcGxheSBjZXJ0YWluIHZpZXcgZGF0YSBpZiB2ZXJzaW9uIGlzIEJBU0lDXG5cdFx0aWYgKCF0aGlzLl9pc1ZhbGlkVmVyc2lvbigpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gS2VlcCBhIGNvdW50ZXIgb2YgdGhlIGV4cGVjdGVkIHByb2dyZXNzIHVwZGF0ZXNcblx0XHRsZXQgdXBkYXRlcyA9IDA7XG5cblx0XHQvLyBUaGUgcmVxdWVzdCBtdXN0IHRha2UgaW50byBhY2NvdW50OlxuXHRcdC8vIC0gc2VsZWN0ZWQgZGF0ZXMgcmFuZ2Vcblx0XHQvLyAtIGNoYXJ0IG1ldHJpYyBhbmQgc2VsZWN0ZWQgdGltZSB1bml0XG5cdFx0Ly8gLSBzZWxlY3RlZCB2aWV3IGFuZCBpdHMgbWV0cmljc1xuXHRcdC8vIC0gZmlsdGVyLCBmb3IgYm90aCBjaGFydCBhbmQgdmlldyAoaS5lLiB6b25lIG9yIGNvdW50cnksIGV0YylcblxuXHRcdC8vIEJ1aWxkIHJlcXVlc3QgcGFyYW1ldGVyc1xuXHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cblx0XHQvLyBEYXRlcyByYW5nZVxuXHRcdGNvbnN0IHJhbmdlID0gdGhpcy5fZHJtLmdldFNlbGVjdGVkUmFuZ2UoKTtcblx0XHRwYXJhbXMucHV0U0ZTT2JqZWN0KCdyYW5nZScsIHJhbmdlLnRvU0ZTT2JqZWN0KCkpO1xuXG5cdFx0Ly8gU2VsZWN0ZWQgdmlld1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLl9kdm0uZ2V0U2VsZWN0ZWRWaWV3KCk7XG5cdFx0Y29uc3Qgdmlld0lkID0gdmlldy52aWV3SWQ7XG5cblx0XHQvLyBGaWx0ZXJcblx0XHRjb25zdCBmaWx0ZXIgPSB0aGlzLl9nZXREYXRhRmlsdGVyKCk7XG5cdFx0aWYgKGZpbHRlciAhPSBudWxsICYmIGZpbHRlci52YWx1ZSAhPSBudWxsKVxuXHRcdFx0cGFyYW1zLnB1dFNGU09iamVjdCgnZmlsdGVyJywgZmlsdGVyLnRvU0ZTT2JqZWN0KCkpO1xuXG5cdFx0Ly8gQ0hBUlRcblxuXHRcdGlmICh2aWV3Lm1haW5DaGFydC5nZXRTZWxlY3RlZE1ldHJpY0lkKCkgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRjb25zdCB0aW1lVW5pdCA9IHZpZXcubWFpbkNoYXJ0LmdldFNlbGVjdGVkVGltZVVuaXQoKTtcblx0XHRcdGNvbnN0IGNoYXJ0SWQgPSB2aWV3Lm1haW5DaGFydC5nZXRTZWxlY3RlZE1ldHJpY0lkKCk7XG5cblx0XHRcdGNvbnN0IGNkYyA9IHRoaXMuX21tLmdldENoYXJ0RGF0YUNvbnRhaW5lcih2aWV3SWQpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBtYWluL2NvbXBhcmUgY2hhcnRzIG11c3QgYmUgcmVxdWVzdGVkXG5cdFx0XHRjb25zdCByZXFNYWluID0gY2RjLmlzTWFpbkNoYXJ0T3V0ZGF0ZWQoY2hhcnRJZCwgcmFuZ2UubWFpbkZyb20sIHJhbmdlLm1haW5UbywgZmlsdGVyLCB0aW1lVW5pdCk7XG5cdFx0XHRjb25zdCByZXFDb21wID0gKHJhbmdlLmRvQ29tcGFyZSA/IGNkYy5pc0NvbXBhcmVDaGFydE91dGRhdGVkKGNoYXJ0SWQsIHJhbmdlLmNvbXBhcmVGcm9tLCByYW5nZS5jb21wYXJlVG8sIGZpbHRlciwgdGltZVVuaXQpIDogZmFsc2UpO1xuXG5cdFx0XHRpZiAocmVxTWFpbiB8fCByZXFDb21wKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcmVxQ2hhcnRzID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHRcdHJlcUNoYXJ0cy5wdXRVdGZTdHJpbmcoJ2lkJywgY2hhcnRJZCk7XG5cdFx0XHRcdHJlcUNoYXJ0cy5wdXRCb29sKCdtYWluJywgcmVxTWFpbik7XG5cdFx0XHRcdHJlcUNoYXJ0cy5wdXRCb29sKCdjb21wJywgcmVxQ29tcCk7XG5cdFx0XHRcdHJlcUNoYXJ0cy5wdXRVdGZTdHJpbmcoJ3VuaXQnLCB0aW1lVW5pdCk7XG5cblx0XHRcdFx0cGFyYW1zLnB1dFNGU09iamVjdCgnY2hhcnQnLCByZXFDaGFydHMpO1xuXHRcdFx0XHR1cGRhdGVzICs9IChyZXFNYWluICYmIHJlcUNvbXAgPyAyIDogMSk7XG5cblx0XHRcdFx0Ly8gU2V0IGxvYWRpbmcgc3RhdGVcblx0XHRcdFx0dmlldy5tYWluQ2hhcnQuc3RhdGUgPSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIWNoYXJ0T25seSlcblx0XHR7XG5cdFx0XHQvLyBNRVRSSUNTIExJU1RcblxuXHRcdFx0bGV0IHJlcU1ldHJpY3MgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRjb25zdCBtZGMgPSB0aGlzLl9tbS5nZXRNZXRyaWNEYXRhQ29udGFpbmVyKHZpZXdJZCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWRjLm1ldHJpY0lkcy5sZW5ndGg7IGkrKylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgbWV0cmljSWQgPSBtZGMubWV0cmljSWRzW2ldO1xuXHRcdFx0XHRjb25zdCBiYXNlTWV0cmljID0gdGhpcy5fbW0uZ2V0QmFzZU1ldHJpYyh2aWV3SWQsIG1ldHJpY0lkKTtcblxuXHRcdFx0XHRpZiAoYmFzZU1ldHJpYyAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgbWV0cmljIHZhbHVlcyBtdXN0IGJlIHJlcXVlc3RlZFxuXHRcdFx0XHRcdGxldCBtaXNzaW5nID0gbWRjLmdldE1ldHJpY01pc3NpbmdWYWx1ZUZsYWdzKG1ldHJpY0lkLCByYW5nZSwgZmlsdGVyKTtcblx0XHRcdFx0XHRsZXQgbWlzc2luZ0NudCA9IDA7XG5cblx0XHRcdFx0XHQvLyBDb3VudCBtaXNzaW5nIHZhbHVlc1xuXHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgbWlzc2luZy5sZW5ndGg7IGorKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAobWlzc2luZ1tqXSlcblx0XHRcdFx0XHRcdFx0bWlzc2luZ0NudCsrO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChtaXNzaW5nQ250ID4gMClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoIWJhc2VNZXRyaWMuaXNTdWJNZXRyaWMpIC8vIE5vIG5lZWQgdG8gcmVxdWVzdCBzdWJtZXRyaWNzIGFzIHRoZXkgd2lsbCBiZSBldmFsdWF0ZWQgd2hlbiBvdGhlciBtZXRyaWNzIGFyZSByZWNlaXZlZFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR1cGRhdGVzICs9IG1pc3NpbmdDbnQ7XG5cdFx0XHRcdFx0XHRcdHJlcU1ldHJpY3MucHV0Qm9vbEFycmF5KG1ldHJpY0lkLCBtaXNzaW5nKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gU2V0IG1ldHJpYyBpdGVtIHZpZXcgdG8gbG9hZGluZyBzdGF0ZVxuXHRcdFx0XHRcdFx0dmlldy5zZXRNZXRyaWNJdGVtU3RhdGUoYmFzZU1ldHJpYy5pZCwgTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkcpO1xuXG5cdFx0XHRcdFx0XHQvLyBTZXQgb3RoZXIgdmlldyBpdGVtcyB0byBsb2FkaW5nIHN0YXRlXG5cblx0XHRcdFx0XHRcdC8vIEdsb2JhbCB2aXNpdHMgJVxuXHRcdFx0XHRcdFx0aWYgKG1ldHJpY0lkID09IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUylcblx0XHRcdFx0XHRcdFx0dmlldy50aW55VmlzaXRzQ2hhcnQuc3RhdGUgPSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORztcblxuXHRcdFx0XHRcdFx0Ly8gT3ZlcnZpZXcncyB2aXNpdHMgcGllIGNoYXJ0XG5cdFx0XHRcdFx0XHRpZiAobWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRPUlMgfHxcblx0XHRcdFx0XHRcdFx0bWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuUEVSQ19SRVRfVklTSVRPUlMgfHxcblx0XHRcdFx0XHRcdFx0bWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTX1ZJU0lUUyB8fFxuXHRcdFx0XHRcdFx0XHRtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5SRVRfVklTSVRPUlNfVklTSVRTKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR2aWV3LnNldFZpc2l0b3JzUGllQ2hhcnRzU3RhdGUoTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRwYXJhbXMucHV0U0ZTT2JqZWN0KCdtZXRyaWNzJywgcmVxTWV0cmljcyk7XG5cblx0XHRcdC8vIENVUlJFTlQgVklFVydTIFRBQkxFIERBVEFcblx0XHRcdGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX21tLmdldFRhYmxlRGF0YSh2aWV3SWQpO1xuXG5cdFx0XHRpZiAodGFibGVEYXRhICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENoZWNrIGlmIG1haW4gcmFuZ2UgY2hhbmdlZCAoaWYgbm90LCBubyBuZWVkIHRvIGxvYWQgZGF0YSlcblx0XHRcdFx0aWYgKCF0YWJsZURhdGEuaXNEYXRhVXBkYXRlZChyYW5nZS5tYWluRnJvbSwgcmFuZ2UubWFpblRvKSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3RhYmxlJywgdmlld0lkKTtcblx0XHRcdFx0XHR1cGRhdGVzICs9IDE7XG5cblx0XHRcdFx0XHQvLyBTZXQgdGFibGUgZGF0YSBsb2FkaW5nIHN0YXRlXG5cdFx0XHRcdFx0Y29uc3QgdGFibGVWaWV3ID0gdGhpcy5fZHZtLmdldFRhYmxlU3ViVmlldygpO1xuXHRcdFx0XHRcdGlmICh0YWJsZVZpZXcgIT0gbnVsbClcblx0XHRcdFx0XHRcdHRhYmxlVmlldy5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHRhYmxlIGRhdGEgY2hhcnQgbG9hZGluZyBzdGF0ZVxuXHRcdFx0XHRcdGNvbnN0IGNoYXJ0VmlldyA9IHRoaXMuX2R2bS5nZXRDaGFydFN1YlZpZXcoKTtcblx0XHRcdFx0XHRpZiAoY2hhcnRWaWV3ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRjaGFydFZpZXcuc3RhdGUgPSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORztcblxuXHRcdFx0XHRcdC8vIFNldCB0YWJsZSBtYXAgY2hhcnQgbG9hZGluZyBzdGF0ZVxuXHRcdFx0XHRcdGNvbnN0IG1hcFZpZXcgPSB0aGlzLl9kdm0uZ2V0TWFwU3ViVmlldygpO1xuXHRcdFx0XHRcdGlmIChtYXBWaWV3ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRtYXBWaWV3LnN0YXRlID0gTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBEaXNhYmxlIGludGVyZmFjZVxuXHRcdHRoaXMuX2Rpc2FibGVJbnRlcmZhY2UodXBkYXRlcyk7XG5cblx0XHR0aGlzLl9kYXRhUmVxdWVzdENudCArPSAxO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0RBVEEsIHBhcmFtcyk7XG5cdH1cblxuXHRfZGlzYWJsZUludGVyZmFjZShleHBlY3RlZFByb2dyZXNzVXBkYXRlcylcblx0e1xuXHRcdCQoJyNhbmwtcmVmcmVzaEJ0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHQkKCcjYW5sLWNvbmZpZ1JhbmdlQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdCQoJyNhbmwtYW5hbHl6ZUxvZ0J0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblxuXHRcdC8vIE5PVEU6IHN0b3AgYnV0dG9uIGlzIGVuYWJsZWQgd2hlbiB0aGUgZGF0YSByYW5nZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgb25seVxuXG5cdFx0Ly8gQmxvY2sgdGFiIG5hdmlnYXRvciBpbnRlcmFjdGlvblxuXHRcdCQoJyNhbmwtdGFiTmF2aWdhdG9yIGEubmF2LWxpbmsnKS5vbignY2xpY2snLCB0aGlzLl9wcmV2ZW50Q2xpY2tFdmVudCk7XG5cblx0XHQvLyBVcGRhdGUgc2VsZWN0ZWQgdmlld1xuXHRcdHRoaXMuX2R2bS5nZXRTZWxlY3RlZFZpZXcoKS5zZXRQcm9ncmVzcyh0cnVlLCBleHBlY3RlZFByb2dyZXNzVXBkYXRlcyk7XG5cdH1cblxuXHRfZW5hYmxlSW50ZXJmYWNlKGVsYXBzZWQgPSAnJylcblx0e1xuXHRcdCQoJyNhbmwtcmVmcmVzaEJ0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdFx0JCgnI2FubC1jb25maWdSYW5nZUJ0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdFx0JCgnI2FubC1zdG9wQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcblx0XHQkKCcjYW5sLWFuYWx5emVMb2dCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXG5cdFx0Ly8gVW5ibG9jayB0YWIgbmF2aWdhdG9yIGludGVyYWN0aW9uXG5cdFx0JCgnI2FubC10YWJOYXZpZ2F0b3IgYS5uYXYtbGluaycpLm9mZignY2xpY2snLCB0aGlzLl9wcmV2ZW50Q2xpY2tFdmVudCk7XG5cblx0XHQvLyBVcGRhdGUgc2VsZWN0ZWQgdmlld1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLl9kdm0uZ2V0U2VsZWN0ZWRWaWV3KCk7XG5cdFx0dmlldy5zZXRFbGFwc2VkKGVsYXBzZWQpO1xuXHRcdHZpZXcuc2V0UHJvZ3Jlc3MoZmFsc2UpO1xuXHR9XG5cblx0X3ByZXZlbnRDbGlja0V2ZW50KGUpXG5cdHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0fVxuXG5cdF9lbmFibGVMb2dBbmFseXNpc0J1dHRvbihlbmFibGVkKVxuXHR7XG5cdFx0JCgnI2FubC1pbml0QW5hbHl6ZUxvZ0J0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cdFx0JCgnI2FubC1zdGFydExvZ0FuYWx5c2lzQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblx0XHQkKCcjYW5sLXJlYnVpbGREYXRhQ2InKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblxuXHRcdGlmIChlbmFibGVkKVxuXHRcdHtcblx0XHRcdC8vIEhpZGUgc3Bpbm5pbmcgd2hlZWxcblx0XHRcdCQoJy51cGxvYWQtc3Bpbm5lcicpLmhpZGUoKTtcblxuXHRcdFx0Ly8gVW4tY2hlY2sgcmVidWlsZCBkYXRhIGNoZWNrYm94XG5cdFx0XHQkKCcjYW5sLXJlYnVpbGREYXRhQ2InKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Ly8gU2hvdyBzcGlubmluZyB3aGVlbFxuXHRcdFx0JCgnLnVwbG9hZC1zcGlubmVyJykuc2hvdygpO1xuXHRcdH1cblx0fVxuXG5cdF9zdGFydExvZ0FuYWx5c2lzKHJlYnVpbGQgPSB0cnVlKVxuXHR7XG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0Qm9vbCgncmVidWlsZCcsIHJlYnVpbGQpO1xuXG5cdFx0Ly8gRU5BQkxFIEZPUiBURVNUSU5HIFBVUlBPU0UgT05MWSwgV0hFTiBQUk9DRVNTSU5HIExPR1MgR0VORVJBVEVEIFdJVEggQSBESUZGRVJFTlQgTE9DQUxFXG5cdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnbG9jYWxlJywgJ2VuJyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1NUQVJUX0xPR19BTkFMWVNJUywgcGFyYW1zKTtcblxuXHRcdC8vIERpc2FibGUgYnV0dG9uXG5cdFx0dGhpcy5fZW5hYmxlTG9nQW5hbHlzaXNCdXR0b24oZmFsc2UpO1xuXHR9XG5cblx0X2Rpc3BsYXlEYXRhUmFuZ2UoKVxuXHR7XG5cdFx0JCgnI2FubC1tYWluUmFuZ2UnKS50ZXh0KHRoaXMuX2RybS5nZXRTZWxlY3RlZFJhbmdlKCkuZ2V0TWFpblJhbmdlU3RyaW5nKCkpO1xuXHRcdCQoJyNhbmwtY29tcGFyZWRSYW5nZScpLnRleHQodGhpcy5fZHJtLmdldFNlbGVjdGVkUmFuZ2UoKS5nZXRDb21wYXJlUmFuZ2VTdHJpbmcoJ0NvbXBhcmVkIHRvOiAnKSk7XG5cblx0XHRpZiAodGhpcy5fZHJtLmdldFNlbGVjdGVkUmFuZ2UoKS5tYWluRnJvbS5ob3VycygpID4gMCB8fCB0aGlzLl9kcm0uZ2V0U2VsZWN0ZWRSYW5nZSgpLm1haW5Uby5ob3VycygpIDwgMjMpXG5cdFx0XHQkKCcjYW5sLWhvdXJBbGVydCcpLnNob3coKTtcblx0XHRlbHNlXG5cdFx0XHQkKCcjYW5sLWhvdXJBbGVydCcpLmhpZGUoKTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNwREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2hIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNuTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUN0TUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNwT0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUN4TkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2pIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ2pRQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3BGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNuTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2hPQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDL0lBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDaGdCQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ1BBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDblBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUM3SEE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMzRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUN2UEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDdlFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3hPQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ25jQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ25UQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN2RkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDOWZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDdkhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDbFlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==
7662
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMC5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYW5hbHl0aWNzLWJhc2UtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYW5hbHl0aWNzLWRhdGEtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYXBwbGljYXRpb24vYXBwbGljYXRpb24tY2hhcnQtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYXBwbGljYXRpb24vYXBwbGljYXRpb24tdGFibGUtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYmFzZS1jaGFydC12aWV3LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9iYXNlLW1hcC12aWV3LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9iYXNlLXRhYmxlLXZpZXcuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2RlbW9ncmFwaGljcy9kZW1vZ3JhcGhpY3MtY2hhcnQtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGVtb2dyYXBoaWNzL2RlbW9ncmFwaGljcy1tYXAtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGVtb2dyYXBoaWNzL2RlbW9ncmFwaGljcy1wcm8tYWR2LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9kZW1vZ3JhcGhpY3MvZGVtb2dyYXBoaWNzLXRhYmxlLXZpZXcuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2V4Y2VwdGlvbnMvZXhjZXB0aW9ucy1jaGFydC12aWV3LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9leGNlcHRpb25zL2V4Y2VwdGlvbnMtdGFibGUtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZmlsdGVyLWV2ZW50LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tYWluLWNoYXJ0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tZXRyaWMtZGlzcGxheS1zdGF0ZS5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljLWxpc3QtaXRlbS5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvdGVjaG5vbG9neS90ZWNobm9sb2d5LWNoYXJ0LXZpZXcuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3RlY2hub2xvZ3kvdGVjaG5vbG9neS1wcm8tYWR2LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy90ZWNobm9sb2d5L3RlY2hub2xvZ3ktdGFibGUtdmlldy5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvdGlueS12aXNpdHMtY2hhcnQuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3Zpc2l0b3JzLWNoYXJ0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGF0YS1yYW5nZS1tYW5hZ2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGF0YS9jb250YWluZXJzLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGF0YS9tZXRyaWMuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9kYXRhL3N0YXRzLWRhdGEtZmlsdGVyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGF0YS90YWJsZS1kYXRhLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljcy1tYW5hZ2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvdXRpbHMvZGF0ZS1oZWxwZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy92aWV3LW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbW9kdWxlcy9hbmFseXRpY3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEFuYWx5dGljc0Jhc2VFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2hhZG93IHJvb3Rcblx0XHRjb25zdCBzaGFkb3dSb290ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGU6ICdvcGVuJ30pO1xuXHRcdHNoYWRvd1Jvb3QuaW5uZXJIVE1MID0gYFxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCJhc3NldHMvY3NzL2N1c3RvbS1ib290c3RyYXAubWluLmNzc1wiIC8+XG5cdFx0XHQ8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cImFzc2V0cy9jc3Mva2VuZG8uY3VzdG9tLWJvb3RzdHJhcC12NC5jc3NcIiAvPlxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCJhc3NldHMvY3NzL2ZvbnRhd2Vzb21lL2Nzcy9hbGwubWluLmNzc1wiIC8+XG5cblx0XHRcdDxzdHlsZT5cblx0XHRcdFx0Omhvc3Qge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5oZWxwLXRvb2x0aXAge1xuXHRcdFx0XHRcdHRleHQtYWxpZ246IGxlZnQ7XG5cdFx0XHRcdFx0d2hpdGUtc3BhY2U6IHByZS13cmFwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Lmljb24taW52aXNpYmxlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR2aXNpYmlsaXR5OiBoaWRkZW47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuc2hvdy1wb2ludGVyIHtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQubWV0cmljTWFpbiB7XG5cdFx0XHRcdFx0Y29sb3I6ICMzMzk5ZmY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQubWV0cmljQ29tcGFyZSB7XG5cdFx0XHRcdFx0Y29sb3I6ICNmZjk5MDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuY2hhcnQtdG9vbHRpcC1jYXRlZ29yeSB7XG5cdFx0XHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblx0XHRgO1xuXHR9XG5cblx0Z2V0JChzZWxlY3Rvcilcblx0e1xuXHRcdHJldHVybiAkKHNlbGVjdG9yLCB0aGlzLnNoYWRvd1Jvb3QpO1xuXHR9XG59XG4iLCJpbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuL2FuYWx5dGljcy1iYXNlLWVsZW1lbnQnO1xuaW1wb3J0IHtUaW55VmlzaXRzQ2hhcnR9IGZyb20gJy4vdGlueS12aXNpdHMtY2hhcnQnO1xuaW1wb3J0IHtNYWluQ2hhcnR9IGZyb20gJy4vbWFpbi1jaGFydCc7XG5pbXBvcnQge01ldHJpY0xpc3RJdGVtfSBmcm9tICcuL21ldHJpYy1saXN0LWl0ZW0nO1xuaW1wb3J0IHtWaXNpdG9yc0NoYXJ0fSBmcm9tICcuL3Zpc2l0b3JzLWNoYXJ0JztcblxuZXhwb3J0IGNsYXNzIEFuYWx5dGljc0RhdGFWaWV3IGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdC51bHRyYS1saWdodCB7XG5cdFx0XHRcdFx0b3BhY2l0eTogLjU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQjcHJvZ3Jlc3NCYXIge1xuXHRcdFx0XHRcdHdpZHRoOiAyMDBweDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCNwcm9ncmVzc0JhciAuay1wcm9ncmVzcy1zdGF0dXMge1xuXHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuY3VzdG9tLWNvbDo6c2xvdHRlZCgqKSB7XG5cblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1zdGFydCBtYi0zXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2xcIj5cblx0XHRcdFx0XHQ8dGlueS12aXNpdHMtY2hhcnQgaWQ9XCJ0aW55VmlzaXRzQ2hhcnRcIj48L3RpbnktdmlzaXRzLWNoYXJ0PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tYXV0byBvcmRlci1maXJzdCBvcmRlci1zbS1sYXN0IHRleHQtcmlnaHRcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwicHJvZ3Jlc3NcIiBjbGFzcz1cIlwiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIG1yLTFcIj5Mb2FkaW5nPC9zcGFuPlxuXHRcdFx0XHRcdFx0PGRpdiBpZD1cInByb2dyZXNzQmFyXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PHNtYWxsIGlkPVwiZWxhcHNlZFwiIGNsYXNzPVwidGV4dC1tdXRlZCB1bHRyYS1saWdodFwiPjwvc21hbGw+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cblx0XHRcdFx0XHQ8bWFpbi1jaGFydCBpZD1cIm1haW5DaGFydFwiPjwvbWFpbi1jaGFydD5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwibWV0cmljc0xpc3RcIiBjbGFzcz1cInJvdyBuby1ndXR0ZXJzXCI+PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLThcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwidmlzaXRvcnNQaWVDaGFydHNcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cblx0XHRcdFx0XHRcdFx0PGhyIGNsYXNzPVwidy0xMDAgZC1tZC1ub25lXCI+XG5cdFx0XHRcdFx0XHRcdDx2aXNpdG9ycy1jaGFydCBpZD1cInZpc2l0b3JzUGllTWFpblwiPjwvdmlzaXRvcnMtY2hhcnQ+XG5cdFx0XHRcdFx0XHRcdDx2aXNpdG9ycy1jaGFydCBpZD1cInZpc2l0b3JzUGllQ29tcFwiIGNvbXBhcmU9XCJ0cnVlXCI+PC92aXNpdG9ycy1jaGFydD5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxzbG90IGNsYXNzPVwiY3VzdG9tLWNvbFwiIG5hbWU9XCJjdXN0b20tY29sdW1uXCI+PC9zbG90PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cblx0XHR0aGlzLl9tZXRyaWNJdGVtc0J5SWQgPSBbXTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtZXRyaWMgbGlzdCBpdGVtIGNsaWNrXG5cdFx0dGhpcy5nZXQkKCcjbWV0cmljc0xpc3QnKS5vbignbWV0cmljLWNsaWNrJywgJC5wcm94eSh0aGlzLl9vbk1ldHJpY0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBIaWRlIHRoZSB2aXNpdG9ycyBwaWUgY2hhcnRzOyB3aWxsIGJlIHNob3duIGlmIGluaXRpYWxpemVkIG9ubHlcblx0XHR0aGlzLmdldCQoJyN2aXNpdG9yc1BpZUNoYXJ0cycpLmhpZGUoKTtcblxuXHRcdC8vIEhpZGUgdGhlIGNvbXBhcmUgdmlzaXRvcnMgcGllIGNoYXJ0OyB3aWxsIGJlIHNob3duIGlmIGNvbXBhcmUgaXMgYWN0aXZlXG5cdFx0dGhpcy5nZXQkKCcjdmlzaXRvcnNQaWVDb21wJykuaGlkZSgpO1xuXG5cdFx0Ly8gSGlkZSBlbGFwc2VkIGFuZCBwcm9ncmVzcyBiYXJcblx0XHR0aGlzLmdldCQoJyNwcm9ncmVzcycpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJyNlbGFwc2VkJykuaGlkZSgpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJcblx0XHR0aGlzLl9wcm9ncmVzc0JhciA9IHRoaXMuZ2V0JCgnI3Byb2dyZXNzQmFyJykua2VuZG9Qcm9ncmVzc0Jhcih7XG5cdFx0XHRtaW46IDAsXG4gICAgICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9Qcm9ncmVzc0JhcicpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHR0aGlzLmdldCQoJyNtZXRyaWNzTGlzdCcpLm9mZignbWV0cmljLWNsaWNrJyk7XG5cdFx0dGhpcy5nZXQkKCdzbG90Jykub2ZmKCdmaWx0ZXItc2V0Jyk7XG5cdH1cblxuXHRnZXQgdmlld0lkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl92aWV3SWQ7XG5cdH1cblxuXHRzZXQgdmlld0lkKHZhbHVlKVxuXHR7XG5cdFx0dGhpcy5fdmlld0lkID0gdmFsdWU7XG5cdH1cblxuXHRnZXQgZmlsdGVyKClcblx0e1xuXHRcdHJldHVybiAodGhpcy5fZmlsdGVyID8gdGhpcy5fZmlsdGVyIDogbnVsbCk7XG5cdH1cblxuXHRnZXQgbWFpbkNoYXJ0KClcblx0e1xuXHRcdHJldHVybiB0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ21haW5DaGFydCcpO1xuXHR9XG5cblx0Z2V0IHRpbnlWaXNpdHNDaGFydCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKCd0aW55VmlzaXRzQ2hhcnQnKTtcblx0fVxuXG5cdGFkZE1ldHJpY0xpc3RJdGVtKG5hbWUsIGhhc0NoYXJ0LCBtTWFpbiwgbUNvbXBhcmUsIGlzT3ZlcnZpZXcgPSBmYWxzZSlcblx0e1xuXHRcdGxldCBtaSA9IG5ldyBNZXRyaWNMaXN0SXRlbSgpO1xuXHRcdG1pLmluaXQodGhpcy5fdmlld0lkLCBuYW1lLCBoYXNDaGFydCwgbU1haW4sIG1Db21wYXJlLCBpc092ZXJ2aWV3KTtcblx0XHRtaS5jbGFzc0xpc3QuYWRkKCdjb2wtMTInKTtcblx0XHRtaS5jbGFzc0xpc3QuYWRkKCdjb2wtc20tNicpO1xuXHRcdG1pLmNsYXNzTGlzdC5hZGQoJ2NvbC1tZC0xMicpO1xuXG5cdFx0dGhpcy5fbWV0cmljSXRlbXNCeUlkW25hbWVdID0gbWk7XG5cblx0XHQvLyBBZGQgaXRlbSB0byBtZXRyaWNzIGxpc3Rcblx0XHR0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ21ldHJpY3NMaXN0JykuYXBwZW5kQ2hpbGQobWkpO1xuXHR9XG5cblx0c2V0TWV0cmljSXRlbVN0YXRlKG1ldHJpY0lkLCBzdGF0ZSlcblx0e1xuXHRcdGlmICh0aGlzLl9tZXRyaWNJdGVtc0J5SWRbbWV0cmljSWRdKVxuXHRcdFx0dGhpcy5fbWV0cmljSXRlbXNCeUlkW21ldHJpY0lkXS5zdGF0ZSA9IHN0YXRlO1xuXHR9XG5cblx0cmVmcmVzaE1ldHJpY0l0ZW0obWV0cmljSWQpXG5cdHtcblx0XHRpZiAodGhpcy5fbWV0cmljSXRlbXNCeUlkW21ldHJpY0lkXSlcblx0XHRcdHRoaXMuX21ldHJpY0l0ZW1zQnlJZFttZXRyaWNJZF0ucmVmcmVzaCgpO1xuXHR9XG5cblx0aW5pdFZpc2l0b3JzUGllQ2hhcnRzKG1EYXRhLCBjRGF0YSlcblx0e1xuXHRcdC8vIEluaXQgbWFpbiB2aXNpdG9ycyBwaWUgY2hhcnRcblx0XHR0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ3Zpc2l0b3JzUGllTWFpbicpLmluaXQodGhpcy5fdmlld0lkLCBtRGF0YS5wbnYsIG1EYXRhLnBydiwgbURhdGEubnZ2LCBtRGF0YS5ydnYpO1xuXG5cdFx0Ly8gSW5pdCBjb21wYXJlIHZpc2l0b3JzIHBpZSBjaGFydFxuXHRcdHRoaXMuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgndmlzaXRvcnNQaWVDb21wJykuaW5pdCh0aGlzLl92aWV3SWQsIGNEYXRhLnBudiwgY0RhdGEucHJ2LCBjRGF0YS5udnYsIGNEYXRhLnJ2dik7XG5cblx0XHQvLyBTaG93IHZpc2l0b3JzIHBpZSBjaGFydHNcblx0XHR0aGlzLmdldCQoJyN2aXNpdG9yc1BpZUNoYXJ0cycpLnNob3coKTtcblx0fVxuXG5cdHNldFZpc2l0b3JzUGllQ2hhcnRzU3RhdGUoc3RhdGUpXG5cdHtcblx0XHR0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ3Zpc2l0b3JzUGllTWFpbicpLnN0YXRlID0gc3RhdGU7XG5cdFx0dGhpcy5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKCd2aXNpdG9yc1BpZUNvbXAnKS5zdGF0ZSA9IHN0YXRlO1xuXHR9XG5cblx0c2hvd1Zpc2l0b3JzQ29tcGFyZVBpZUNoYXJ0KGRvU2hvdylcblx0e1xuXHRcdGlmIChkb1Nob3cpXG5cdFx0XHR0aGlzLmdldCQoJyN2aXNpdG9yc1BpZUNvbXAnKS5zaG93KCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5nZXQkKCcjdmlzaXRvcnNQaWVDb21wJykuaGlkZSgpO1xuXHR9XG5cblx0cmVmcmVzaFZpc2l0b3JzUGllQ2hhcnRzKClcblx0e1xuXHRcdHRoaXMuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgndmlzaXRvcnNQaWVNYWluJykucmVmcmVzaCgpO1xuXHRcdHRoaXMuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgndmlzaXRvcnNQaWVDb21wJykucmVmcmVzaCgpO1xuXHR9XG5cblx0c2V0TWFpbkNoYXJ0QXZhaWxUaW1lVW5pdHMocmFuZ2VMZW4pXG5cdHtcblx0XHRjb25zdCBob3VybHlFbmFibGVkID0gKHJhbmdlTGVuIDw9IDcpOyAvLyBPbmUgd2Vla1xuXHRcdGNvbnN0IGRhaWx5RW5hYmxlZCA9IChyYW5nZUxlbiA8PSA5Myk7IC8vIFRocmVlIG1vbnRocyAofilcblx0XHRjb25zdCB3ZWVrbHlFbmFibGVkID0gKHJhbmdlTGVuIDw9IDczMCk7IC8vIFR3byB5ZWFyc1xuXG5cdFx0bGV0IGN1cnJlbnRVbml0ID0gdGhpcy5tYWluQ2hhcnQuZ2V0U2VsZWN0ZWRUaW1lVW5pdCgpO1xuXG5cdFx0aWYgKGN1cnJlbnRVbml0ID09ICdISCcgJiYgIWhvdXJseUVuYWJsZWQpXG5cdFx0XHRjdXJyZW50VW5pdCA9ICdERCc7XG5cblx0XHRpZiAoY3VycmVudFVuaXQgPT0gJ0REJyAmJiAhZGFpbHlFbmFibGVkKVxuXHRcdFx0Y3VycmVudFVuaXQgPSAnV1cnO1xuXG5cdFx0aWYgKGN1cnJlbnRVbml0ID09ICdXVycgJiYgIXdlZWtseUVuYWJsZWQpXG5cdFx0XHRjdXJyZW50VW5pdCA9ICdNTSc7XG5cblx0XHR0aGlzLm1haW5DaGFydC5zZXRUaW1lVW5pdChjdXJyZW50VW5pdCwgaG91cmx5RW5hYmxlZCwgZGFpbHlFbmFibGVkLCB3ZWVrbHlFbmFibGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tTZXBhcmF0b3Jcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZpbHRlckRpc3BsYXlWYWx1ZVxuXHQgKi9cblx0c2V0RGF0YUZpbHRlcihmaWx0ZXIsIGNoZWNrU2VwYXJhdG9yLCBmaWx0ZXJEaXNwbGF5VmFsdWUgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5fZmlsdGVyID0gZmlsdGVyO1xuXG5cdFx0Ly8gRGlzcGxheSBmaWx0ZXJcblx0XHR0aGlzLm1haW5DaGFydC5kaXNwbGF5RmlsdGVyKHRoaXMuX2ZpbHRlciwgY2hlY2tTZXBhcmF0b3IsIGZpbHRlckRpc3BsYXlWYWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2RzIGNoZWNrcyBpZiB0aGUgY3VycmVudCB2aWV3IGhhcyB0aGUgc2FtZSBmaWx0ZXIgYW5kIHRpbWUgdW5pdCBzZXR0aW5ncyBjb21wYXJlZCB0byB0aG9zZSBwYXNzZWQgYXMgcGFyYW1zLlxuXHQgKiBUaGlzIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNoYXJ0IGRhdGEgYXBwbHkgdG8gdGhlIGN1cnJlbnQgdmlldyB0b28sIGFuZCB3ZSBjYW4gdXBkYXRlIGl0LlxuXHQgKiBJZiB0cnVlIGlzIHJldHVybmVkIHRoZW4gdGhpcyB2aWV3IGhhcyB0aGUgc2FtZSBzZXR0aW5ncy5cblx0ICpcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICogQHBhcmFtICB7c3RyaW5nfSB0aW1lVW5pdFxuXHQgKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0dmFsaWRhdGVWaWV3U2V0dGluZ3MoZmlsdGVyLCB0aW1lVW5pdClcblx0e1xuXHRcdC8vIENoZWNrIHRpbWUgdW5pdFxuXHRcdGlmICh0aGlzLm1haW5DaGFydC5nZXRTZWxlY3RlZFRpbWVVbml0KCkgIT0gdGltZVVuaXQpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBDaGVjayBmaWx0ZXJcblx0XHRpZiAoKGZpbHRlciA9PSBudWxsICYmIHRoaXMuX2ZpbHRlciAhPSBudWxsKSB8fCAoZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyID09IG51bGwpKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAoZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChmaWx0ZXIubmFtZSAhPSB0aGlzLl9maWx0ZXIubmFtZSB8fCBmaWx0ZXIudmFsdWUgIT0gdGhpcy5fZmlsdGVyLnZhbHVlKVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHNldEVsYXBzZWQoZWxhcHNlZClcblx0e1xuXHRcdHRoaXMuZ2V0JCgnI2VsYXBzZWQnKS50ZXh0KGVsYXBzZWQpO1xuXHR9XG5cblx0c2V0UHJvZ3Jlc3MoaXNMb2FkaW5nLCBleHBlY3RlZFByb2dyZXNzVXBkYXRlcyA9IC0xKVxuXHR7XG5cdFx0aWYgKGlzTG9hZGluZylcblx0XHR7XG5cdFx0XHR0aGlzLmdldCQoJyNlbGFwc2VkJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjcHJvZ3Jlc3MnKS5zaG93KCk7XG5cblx0XHRcdC8vIEluaXQgcHJvZ3Jlc3MgYmFyXG5cdFx0XHR0aGlzLl9wcm9ncmVzc0Jhci5zZXRPcHRpb25zKHttYXg6IGV4cGVjdGVkUHJvZ3Jlc3NVcGRhdGVzfSk7XG5cdFx0XHR0aGlzLl9wcm9ncmVzc0Jhci52YWx1ZSgwKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuZ2V0JCgnI3Byb2dyZXNzJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjZWxhcHNlZCcpLnNob3coKTtcblx0XHR9XG5cdH1cblxuXHR1cGRhdGVQcm9ncmVzcyhzdGVwcylcblx0e1xuXHRcdGxldCB2YWx1ZSA9IHRoaXMuX3Byb2dyZXNzQmFyLnZhbHVlKCkgKyBzdGVwcztcblx0XHR0aGlzLl9wcm9ncmVzc0Jhci52YWx1ZSh2YWx1ZSk7XG5cdH1cblxuXHRfb25NZXRyaWNDbGljayhlKVxuXHR7XG5cdFx0Y29uc3QgbWV0cmljSXRlbSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IG1ldHJpY0lkID0gbWV0cmljSXRlbS5uYW1lO1xuXHRcdHRoaXMubWFpbkNoYXJ0LnNldFNlbGVjdGVkTWV0cmljQnlJZChtZXRyaWNJZCk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdhbmFseXRpY3MtZGF0YS12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2FuYWx5dGljcy1kYXRhLXZpZXcnLCBBbmFseXRpY3NEYXRhVmlldyk7XG4iLCJpbXBvcnQge0Jhc2VDaGFydFZpZXd9IGZyb20gJy4uL2Jhc2UtY2hhcnQtdmlldyc7XG5pbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuLi9maWx0ZXItZXZlbnQnO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkNoYXJ0VmlldyBleHRlbmRzIEJhc2VDaGFydFZpZXdcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSlcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KHRoaXMuX3RhYmxlRGF0YS5kYXRhKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdF9kcmF3Q2hhcnQoY2hhcnREYXRhKVxuXHR7XG5cdFx0Y29uc3QgbWV0cmljID0gdGhpcy5nZXRTZWxlY3RlZE1ldHJpYygpO1xuXG5cdFx0aWYgKGNoYXJ0RGF0YSAhPSBudWxsICYmIGNoYXJ0RGF0YS5sZW5ndGggPiAwICYmIG1ldHJpYyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0Y2hhcnREYXRhID0gY2hhcnREYXRhLmZpbHRlcihvYmogPT4gb2JqLnpvbmUgPT0gdGhpcy5fZmlsdGVyLnZhbHVlKTtcblxuXHRcdFx0Ly8gU29ydCBhbmQgZXh0cmFjdCB0b3AgMTAgdmFsdWVzXG5cdFx0XHRsZXQgZGF0YSA9IGNoYXJ0RGF0YS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGJbbWV0cmljLmlkXSAtIGFbbWV0cmljLmlkXSB9KS5zbGljZSgwLCAxMCk7XG5cblx0XHRcdC8vIElTU1VFISEhISEhIVxuXHRcdFx0Ly8gSWYgdGhlIG1ldHJpYyBpZCBzdGFydHMgd2l0aCBcIiVcIiwgS2VuZG8gY2hhcnQgY3Jhc2hlc1xuXHRcdFx0Ly8gRm9yIHRoaXMgcmVhc29uIGluc3RlYWQgb2Ygc2ltcGx5IHNldHRpbmcgdGhlIHNlcmllcyBmaWVsZCBhbmQgY2F0ZWdvcnkgZmllbGQsIHdlIG5lZWQgdG8gcmVidWlsZCB0aGUgc2VyaWVzIGRhdGEgaXRlbXMgZnJvbSB0aGUgY2hhcnQgZGF0YVxuXHRcdFx0Ly8gKG5vdGU6IGZvciB0aW1lIG1ldHJpY3MsIHZhbHVlIGlzIGNvbnZlcnRlZCBmcm9tIG1pbGxpcyB0byBtaW51dGVzKVxuXG5cdFx0XHRkYXRhID0gZGF0YS5tYXAob2JqID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHR6b25lOiBvYmpbJ3pvbmUnXSxcblx0XHRcdFx0XHR2YWx1ZTogKCFtZXRyaWMuaXNUaW1lID8gb2JqW21ldHJpYy5pZF0gOiBtb21lbnQuZHVyYXRpb24ob2JqW21ldHJpYy5pZF0pLmFzTWludXRlcygpLnRvRml4ZWQoMikpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGRhdGEgc291cmNlXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBjaGFydFxuXHRcdFx0bGV0IHZhbHVlQXhpc1RlbXBsYXRlID0gJyM6IHZhbHVlICMnO1xuXHRcdFx0bGV0IHNlcmllc0Zvcm1hdCA9ICd7MH0nO1xuXG5cdFx0XHRpZiAobWV0cmljLmlzUGVyY2VudGFnZSlcblx0XHRcdHtcblx0XHRcdFx0dmFsdWVBeGlzVGVtcGxhdGUgPSAnIzogdmFsdWUgIyUnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9JSc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChtZXRyaWMuaXNUaW1lKVxuXHRcdFx0e1xuXHRcdFx0XHR2YWx1ZUF4aXNUZW1wbGF0ZSA9ICcjOiB2YWx1ZSAjIG1pbnMnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9IG1pbnMnO1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0T3B0aW9ucyh7XG5cdFx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRcdGhlaWdodDogKGRhdGEubGVuZ3RoICogNDUgKyA1MCksIC8vKCFpc0ZpbHRlcmVkID8gNTAwIDogMTAwKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlcmllczogW3tcblx0XHRcdFx0XHRuYW1lOiBtZXRyaWMubmFtZSxcblx0XHRcdFx0XHRmaWVsZDogJ3ZhbHVlJyxcblx0XHRcdFx0XHRjYXRlZ29yeUZpZWxkOiAnem9uZScsXG5cdFx0XHRcdFx0Zm9ybWF0OiBzZXJpZXNGb3JtYXRcblx0XHRcdFx0fV0sXG5cdFx0XHRcdHZhbHVlQXhpczoge1xuXHRcdFx0XHRcdG1heDogKG1ldHJpYy5pc1BlcmNlbnRhZ2UgPyAxMDAgOiB1bmRlZmluZWQpLFxuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IHZhbHVlQXhpc1RlbXBsYXRlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2F0ZWdvcnlBeGlzOiBbe1xuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9iai5kYXRhSXRlbS56b25lICE9ICcnID8gb2JqLmRhdGFJdGVtLnpvbmUgOiAnW3Vua25vd25dJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fV0sXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gU2V0IGNoYXJ0IGRhdGEgc291cmNlXG5cdFx0XHR0aGlzLl9jaGFydC5zZXREYXRhU291cmNlKGRzKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0RGF0YVNvdXJjZShbXSk7XG5cdH1cblxuXHRvblNlcmllc0NsaWNrKGUpXG5cdHtcblx0XHRpZiAodGhpcy5fZmlsdGVyID09IG51bGwgfHwgdGhpcy5fZmlsdGVyLnZhbHVlICE9IGUuZGF0YUl0ZW0uem9uZSlcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCd6b25lJywgZS5kYXRhSXRlbS56b25lLCBmYWxzZSkgKTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2FwcGxpY2F0aW9uLWNoYXJ0LXZpZXcnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnYXBwbGljYXRpb24tY2hhcnQtdmlldycsIEFwcGxpY2F0aW9uQ2hhcnRWaWV3KTtcbiIsImltcG9ydCB7QmFzZVRhYmxlVmlld30gZnJvbSAnLi4vYmFzZS10YWJsZS12aWV3JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge01ldHJpY3NNYW5hZ2VyfSBmcm9tICcuLi8uLi8uLi8uLi9tYW5hZ2Vycy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL21ldHJpY3MtbWFuYWdlcic7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuLi9maWx0ZXItZXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb25UYWJsZVZpZXcgZXh0ZW5kcyBCYXNlVGFibGVWaWV3XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEEpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRcdC8vIElmIGZpbHRlciBpcyBzZXQsIGRpc2FibGUgZ3JpZCBzZWxlY3Rpb25cblx0XHRcdFx0dGhpcy5zZXRUYWJsZVNlbGVjdGFibGUoIWlzRmlsdGVyZWQpO1xuXG5cdFx0XHRcdC8vIFNldCBmaWx0ZXJpbmdcblx0XHRcdFx0Y29uc3QgZHNGaWx0ZXIgPSBbXTtcblxuXHRcdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0XHRkc0ZpbHRlci5wdXNoKHtcblx0XHRcdFx0XHRcdGZpZWxkOiAnem9uZScsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogdGhpcy5fZmlsdGVyLnZhbHVlXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQXNzaWduIGRhdGFwcm92aWRlciB0byBncmlkXG5cdFx0XHRcdGxldCBkcyA9IG5ldyBrZW5kby5kYXRhLkRhdGFTb3VyY2Uoe1xuXHRcdFx0XHRcdGZpbHRlcjogZHNGaWx0ZXIsXG5cdFx0XHRcdFx0c29ydDoge1xuXHRcdFx0XHRcdFx0ZmllbGQ6ICd2aXNpdHMnLFxuXHRcdFx0XHRcdFx0ZGlyOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGRhdGE6IHRoaXMuX3RhYmxlRGF0YS5kYXRhXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMuX2dyaWQuc2V0RGF0YVNvdXJjZShkcyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuX2dyaWQuc2V0RGF0YVNvdXJjZShbXSk7XG5cdFx0fVxuXHR9XG5cblx0b25JdGVtQ2xpY2soKVxuXHR7XG5cdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fZ3JpZC5kYXRhSXRlbSh0aGlzLl9ncmlkLnNlbGVjdCgpKTtcblxuXHRcdGlmIChkYXRhSXRlbSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCd6b25lJywgZGF0YUl0ZW0uem9uZSwgZmFsc2UpICk7XG5cdFx0fVxuXHR9XG5cblx0Y29uZmlndXJlQ29sdW1ucygpXG5cdHtcblx0XHR0aGlzLl9ncmlkLnNldE9wdGlvbnMoe1xuXHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0ZmllbGQ6ICd6b25lJyxcblx0XHRcdFx0dGl0bGU6ICdab25lJyxcblx0XHRcdFx0d2lkdGg6IDIwMCxcblx0XHRcdFx0bG9ja2VkOiBmYWxzZSxcblx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFJdGVtLnpvbmUgPT0gJycpXG5cdFx0XHRcdFx0XHRyZXR1cm4gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLnpvbmU7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnVmlzaXRzJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVklTSVRTLFxuXHRcdFx0XHRcdHRpdGxlOiAnVG90YWwnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0VmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LHtcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVklTSVRTLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdVbmlxdWUgdmlzaXRvcnMnLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0se1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdPdmVyYWxsICUnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ05ldyB2aXNpdG9ycycsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnTmV3IHZpc2l0cyAlJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzEsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSkpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ0F2ZyB2aXNpdCBkdXJhdGlvbicsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH1dXG5cdFx0fSk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdhcHBsaWNhdGlvbi10YWJsZS12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2FwcGxpY2F0aW9uLXRhYmxlLXZpZXcnLCBBcHBsaWNhdGlvblRhYmxlVmlldyk7XG4iLCJpbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuL2FuYWx5dGljcy1iYXNlLWVsZW1lbnQnO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4vbWV0cmljLWRpc3BsYXktc3RhdGUnO1xuXG5leHBvcnQgY2xhc3MgQmFzZUNoYXJ0VmlldyBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJtYi0zXCI+XG5cdFx0XHRcdDxzZWxlY3QgaWQ9XCJtZXRyaWNzRERcIj48L3NlbGVjdD5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtY2lyY2xlLW5vdGNoIGZhLXNwaW4gdGV4dC1zZWNvbmRhcnkgYWxpZ24tbWlkZGxlIGxvYWRpbmctc3Bpbm5lciBtbC0xXCI+PC9pPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC13YXJuaW5nIG1pc3Npbmctd2FybmluZyBzaG93LXRvb2x0aXAgbWwtMVwiIHRpdGxlPVwiRGF0YSBsb2FkaW5nIGludGVycnVwdGVkXCI+PC9pPlxuXHRcdFx0PC9kaXY+XG5cblx0XHRcdDxkaXYgaWQ9XCJjaGFydFwiPjwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLyBIaWRlIGxvYWRpbmcgc3Bpbm5lciBhbmQgd2FybmluZ1xuXHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJy5taXNzaW5nLXdhcm5pbmcnKS5oaWRlKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIG1ldHJpYyBzZWxlY3RvciBkcm9wZG93blxuXHRcdHRoaXMuX21ldHJpY3NERCA9IHRoaXMuZ2V0JCgnI21ldHJpY3NERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICd0ZXh0JyxcbiAgICAgICAgICAgIGRhdGFWYWx1ZUZpZWxkOiAndmFsdWUnLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMub25NZXRyaWNDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9Ecm9wRG93bkxpc3QnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2hlYWRlcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjaGFydFxuXHRcdHRoaXMuX2NoYXJ0ID0gdGhpcy5nZXQkKCcjY2hhcnQnKS5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgICAgICAgIGxlZ2VuZDoge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcblx0XHRcdFx0Y29sb3I6ICcjMzM5OWZmJyxcblx0XHRcdFx0b3ZlcmxheToge1xuXHRcdFx0XHRcdGdyYWRpZW50OiAnbm9uZSdcblx0XHRcdFx0fSxcbiAgICAgICAgICAgIH0sXG5cdFx0XHRjYXRlZ29yeUF4aXM6IHtcblx0XHRcdFx0bWFqb3JHcmlkTGluZXM6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuICAgICAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG5cdFx0XHRcdHRlbXBsYXRlOiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY2F0ZWdvcnlcIj5cblx0XHRcdFx0XHRcdDxzdHJvbmc+XG5cdFx0XHRcdFx0XHRcdCMgaWYgKGNhdGVnb3J5ICE9ICcnKSB7ICNcblx0XHRcdFx0XHRcdFx0IzogY2F0ZWdvcnkgI1xuXHRcdFx0XHRcdFx0XHQjIH0gZWxzZSB7ICNcblx0XHRcdFx0XHRcdFx0W3Vua25vd25dXG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cdFx0XHRcdFx0XHQ8L3N0cm9uZz5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jYXRlZ29yeVwiPlxuXHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtc3F1YXJlXCIgc3R5bGU9XCJjb2xvcjogIzogc2VyaWVzLmNvbG9yICNcIj48L2k+XG5cdFx0XHRcdFx0XHQjOiBzZXJpZXMubmFtZSAjIDogIzoga2VuZG8uZm9ybWF0KHNlcmllcy5mb3JtYXQsIHZhbHVlKSAjXG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdGApLFxuXHRcdFx0XHRiYWNrZ3JvdW5kOiAnI2U0ZTRlNCdcbiAgICAgICAgICAgIH0sXG5cdFx0XHRzZXJpZXNDbGljazogJC5wcm94eSh0aGlzLm9uU2VyaWVzQ2xpY2ssIHRoaXMpXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvQ2hhcnQnKTtcblx0fVxuXG5cdGdldCBzdGF0ZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cdH1cblxuXHRzZXQgc3RhdGUodmFsdWUpXG5cdHtcblx0XHRpZiAodmFsdWUgIT0gdGhpcy5zdGF0ZSlcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUpXG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHZhbHVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZSBjaGFuZ2Vcblx0XHRcdHRoaXMuaGFuZGxlU3RhdGVDaGFuZ2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7VGFibGVEYXRhfSB0YWJsZURhdGFcbiBcdCAqIEBwYXJhbSAge2FycmF5fSBtZXRyaWNzRFBcblx0ICovXG5cdGluaXQodGFibGVEYXRhLCBtZXRyaWNzKVxuXHR7XG5cdFx0dGhpcy5fdGFibGVEYXRhID0gdGFibGVEYXRhO1xuXHRcdHRoaXMuX21ldHJpY3NCeUlkID0ge307XG5cblx0XHQvLyBDb25maWd1cmUgbWV0cmljcyBkcm9wZG93blxuXHRcdGxldCBtZXRyaWNzRFAgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWV0cmljcy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRjb25zdCBiYXNlTWV0cmljID0gbWV0cmljc1tpXTtcblxuXHRcdFx0bWV0cmljc0RQLnB1c2goe3ZhbHVlOiBiYXNlTWV0cmljLmlkLCB0ZXh0OiBiYXNlTWV0cmljLm5hbWV9KTtcblxuXHRcdFx0Ly8gQWRkIGVudHJ5IHRvIG1ldHJpY3NCeUlkIGFycmF5XG5cdFx0XHR0aGlzLl9tZXRyaWNzQnlJZFtiYXNlTWV0cmljLmlkXSA9IGJhc2VNZXRyaWM7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IG1ldHJpY3MgZHJvcGRvd24gZGF0YXByb3ZpZGVyXG5cdFx0dGhpcy5fbWV0cmljc0RELnNldERhdGFTb3VyY2UobWV0cmljc0RQKTtcblxuXHRcdC8vIFNldCBzZWxlY3RlZCBpbmRleFxuXHRcdHRoaXMuX21ldHJpY3NERC5zZWxlY3QoMCk7XG5cblx0XHR0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuXHRcdC8vIFJlZnJlc2hcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdGdldFNlbGVjdGVkTWV0cmljKClcblx0e1xuXHRcdC8vIFJldHVybiBCYXNlTWV0cmljIG9iamVjdFxuXHRcdHJldHVybiB0aGlzLl9tZXRyaWNzQnlJZFt0aGlzLl9tZXRyaWNzREQudmFsdWUoKV07XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtTdGF0c0RhdGFGaWx0ZXJ9IGZpbHRlclxuXHQgKi9cblx0c2V0RmlsdGVyKGZpbHRlcilcblx0e1xuXHRcdHRoaXMuX2ZpbHRlciA9IGZpbHRlcjtcblxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRoYW5kbGVTdGF0ZUNoYW5nZSgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5oaWRlKCk7XG5cdFx0XHR0aGlzLmdldCQoJy5taXNzaW5nLXdhcm5pbmcnKS5oaWRlKCk7XG5cblx0XHRcdHN3aXRjaCAodGhpcy5zdGF0ZSlcblx0XHRcdHtcblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORzpcblx0XHRcdFx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5zaG93KCk7IC8vIFNob3cgbG9hZGluZyBzcGlubmVyXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuTUlTU0lORzpcblx0XHRcdFx0XHR0aGlzLmdldCQoJy5taXNzaW5nLXdhcm5pbmcnKS5zaG93KCk7IC8vIFNob3cgbG9hZGluZyBpbnRlcnJ1cHRlZCB3YXJuaW5nXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQTpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0fVxuXHR9XG5cblx0b25NZXRyaWNDaGFuZ2UoKVxuXHR7XG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHRvblNlcmllc0NsaWNrKGUpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRyZWZyZXNoT25XaW5kb3dSZXNpemUoKVxuXHR7XG5cdFx0dGhpcy5fY2hhcnQucmVkcmF3KCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBCYXNlTWFwVmlldyBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXHRcdFx0XHQjbWFwIHtcblx0XHRcdFx0XHRoZWlnaHQ6IDUwMHB4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0I21hcDpmb2N1cyB7XG5cdFx0XHRcdFx0b3V0bGluZTogbm9uZTtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PHN2ZyBzdHlsZT1cIndpZHRoOiAwOyBoZWlnaHQ6IDA7IHBvc2l0aW9uOiBhYnNvbHV0ZTtcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBmb2N1c2FibGU9XCJmYWxzZVwiPlxuXHRcdFx0XHQ8bGluZWFyR3JhZGllbnQgaWQ9XCJnYXVnZUdyYWRpZW50XCIgeDI9XCIxXCIgeTI9XCIxXCI+XG5cdFx0XHRcdFx0PHN0b3Agb2Zmc2V0PVwiMCVcIiBzdG9wLWNvbG9yPVwiI2JmZGRmZVwiIC8+XG5cdFx0XHRcdFx0PHN0b3Agb2Zmc2V0PVwiMTAwJVwiIHN0b3AtY29sb3I9XCIjMzM5OWZmXCIgLz5cblx0XHRcdFx0PC9saW5lYXJHcmFkaWVudD5cblx0XHRcdDwvc3ZnPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0PHNlbGVjdCBpZD1cIm1ldHJpY3NERFwiPjwvc2VsZWN0PlxuXHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXIgbWwtMVwiPjwvaT5cblx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC13YXJuaW5nIG1pc3Npbmctd2FybmluZyBzaG93LXRvb2x0aXAgbWwtMVwiIHRpdGxlPVwiRGF0YSBsb2FkaW5nIGludGVycnVwdGVkXCI+PC9pPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1hdXRvIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwic2NhbGVNaW5cIiBjbGFzcz1cInRleHQtbXV0ZWQgbXQtMlwiPjwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgaWQ9XCJnYXVnZVwiPjwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgaWQ9XCJzY2FsZU1heFwiIGNsYXNzPVwidGV4dC1tdXRlZCBtdC0yXCI+VEJEPC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cblx0XHRcdDxkaXYgaWQ9XCJtYXBcIiBjbGFzcz1cImJvcmRlclwiPjwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLyBIaWRlIGxvYWRpbmcgc3Bpbm5lciBhbmQgd2FybmluZ1xuXHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJy5taXNzaW5nLXdhcm5pbmcnKS5oaWRlKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIG1ldHJpYyBzZWxlY3RvciBkcm9wZG93blxuXHRcdHRoaXMuX21ldHJpY3NERCA9IHRoaXMuZ2V0JCgnI21ldHJpY3NERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFUZXh0RmllbGQ6ICd0ZXh0JyxcbiAgICAgICAgICAgIGRhdGFWYWx1ZUZpZWxkOiAndmFsdWUnLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMub25NZXRyaWNDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9Ecm9wRG93bkxpc3QnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2hlYWRlcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBtYXBcblx0XHR0aGlzLl9tYXAgPSB0aGlzLmdldCQoJyNtYXAnKS5rZW5kb01hcCh7XG5cdFx0XHRjZW50ZXI6IFszMC43NTEyNzgsIC0yLjc0MTEzM10sXG5cdFx0XHR6b29tOiAyLFxuXHRcdFx0bGF5ZXJEZWZhdWx0czoge1xuXHRcdFx0XHRzaGFwZToge1xuXHRcdFx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdFx0XHRmaWxsOiB7XG5cdFx0XHRcdFx0XHRcdGNvbG9yOiAnI2VlZSdcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzaGFwZUNyZWF0ZWQ6ICQucHJveHkodGhpcy5vblNoYXBlQ3JlYXRlZCwgdGhpcyksXG5cdFx0XHRzaGFwZUZlYXR1cmVDcmVhdGVkOiAkLnByb3h5KHRoaXMub25TaGFwZUZlYXR1cmVDcmVhdGVkLCB0aGlzKSxcblx0XHRcdHNoYXBlTW91c2VFbnRlcjogJC5wcm94eSh0aGlzLm9uU2hhcGVNb3VzZUVudGVyLCB0aGlzKSxcblx0XHRcdHNoYXBlTW91c2VMZWF2ZTogJC5wcm94eSh0aGlzLm9uU2hhcGVNb3VzZUxlYXZlLCB0aGlzKSxcblx0XHRcdHNoYXBlQ2xpY2s6ICQucHJveHkodGhpcy5vblNoYXBlQ2xpY2ssIHRoaXMpLFxuXHRcdH0pLmRhdGEoJ2tlbmRvTWFwJyk7XG5cblx0XHQvLyBHYXVnZSBpbml0aWFsaXplZCBieSBjaGlsZCBjbGFzcywgaWYgbmVlZGVkXG5cdH1cblxuXHRnZXQgc3RhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuXHR9XG5cblx0c2V0IHN0YXRlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlICE9IHRoaXMuc3RhdGUpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlKVxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdGUnLCB2YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdGF0ZScpO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGUgY2hhbmdlXG5cdFx0XHR0aGlzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1RhYmxlRGF0YX0gdGFibGVEYXRhXG4gXHQgKiBAcGFyYW0gIHthcnJheX0gbWV0cmljc0RQXG5cdCAqL1xuXHRpbml0KHRhYmxlRGF0YSwgbWV0cmljcylcblx0e1xuXHRcdHRoaXMuX3RhYmxlRGF0YSA9IHRhYmxlRGF0YTtcblx0XHR0aGlzLl9tZXRyaWNzQnlJZCA9IHt9O1xuXG5cdFx0Ly8gQ29uZmlndXJlIG1ldHJpY3MgZHJvcGRvd25cblx0XHRsZXQgbWV0cmljc0RQID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1ldHJpY3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0Y29uc3QgYmFzZU1ldHJpYyA9IG1ldHJpY3NbaV07XG5cblx0XHRcdG1ldHJpY3NEUC5wdXNoKHt2YWx1ZTogYmFzZU1ldHJpYy5pZCwgdGV4dDogYmFzZU1ldHJpYy5uYW1lfSk7XG5cblx0XHRcdC8vIEFkZCBlbnRyeSB0byBtZXRyaWNzQnlJZCBhcnJheVxuXHRcdFx0dGhpcy5fbWV0cmljc0J5SWRbYmFzZU1ldHJpYy5pZF0gPSBiYXNlTWV0cmljO1xuXHRcdH1cblxuXHRcdC8vIFNldCBtZXRyaWNzIGRyb3Bkb3duIGRhdGFwcm92aWRlclxuXHRcdHRoaXMuX21ldHJpY3NERC5zZXREYXRhU291cmNlKG1ldHJpY3NEUCk7XG5cblx0XHQvLyBTZXQgc2VsZWN0ZWQgaW5kZXhcblx0XHR0aGlzLl9tZXRyaWNzREQuc2VsZWN0KDApO1xuXG5cdFx0dGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG5cblx0XHQvLyBSZWZyZXNoXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHRnZXRTZWxlY3RlZE1ldHJpYygpXG5cdHtcblx0XHQvLyBSZXR1cm4gQmFzZU1ldHJpYyBvYmplY3Rcblx0XHRyZXR1cm4gdGhpcy5fbWV0cmljc0J5SWRbdGhpcy5fbWV0cmljc0RELnZhbHVlKCldO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICovXG5cdHNldEZpbHRlcihmaWx0ZXIpXG5cdHtcblx0XHR0aGlzLl9maWx0ZXIgPSBmaWx0ZXI7XG5cblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0Ly8gVE8gQkUgT1ZFUlJJRERFTlxuXHR9XG5cblx0aGFuZGxlU3RhdGVDaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuaGlkZSgpO1xuXG5cdFx0XHRzd2l0Y2ggKHRoaXMuc3RhdGUpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgc3Bpbm5lclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgaW50ZXJydXB0ZWQgd2FybmluZ1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEE6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdG9uTWV0cmljQ2hhbmdlKClcblx0e1xuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0b25TZXJpZXNDbGljayhlKVxuXHR7XG5cdFx0Ly8gVE8gQkUgT1ZFUlJJRERFTlxuXHR9XG5cblx0cmVmcmVzaE9uV2luZG93UmVzaXplKClcblx0e1xuXHRcdGNvbnN0IGlzTWFwVmlzaWJsZSA9ICh0aGlzLm9mZnNldFBhcmVudCAhPSBudWxsKTtcblxuXHRcdGlmIChpc01hcFZpc2libGUpXG5cdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdG9uU2hhcGVDcmVhdGVkKGUpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRvblNoYXBlRmVhdHVyZUNyZWF0ZWQoZSlcblx0e1xuXHRcdC8vIFRPIEJFIE9WRVJSSURERU5cblx0fVxuXG5cdG9uU2hhcGVNb3VzZUVudGVyKGUpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRvblNoYXBlTW91c2VMZWF2ZShlKVxuXHR7XG5cdFx0Ly8gVE8gQkUgT1ZFUlJJRERFTlxuXHR9XG5cblx0b25TaGFwZUNsaWNrKGUpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cbn1cbiIsImltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBCYXNlVGFibGVWaWV3IGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdC5rLWdyaWQtY29udGVudCB7XG5cdFx0XHRcdFx0bWF4LWhlaWdodDogNTAwcHg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuay1ncmlkLWNvbnRlbnQgdHJbcm9sZT1yb3ddIHtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuay1mb290ZXItdGVtcGxhdGUge1xuXHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdH1cblx0XHRcdDwvc3R5bGU+XG5cblx0XHRcdDxkaXYgaWQ9XCJjb250YWluZXJcIj5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtY2lyY2xlLW5vdGNoIGZhLXNwaW4gdGV4dC1zZWNvbmRhcnkgYWxpZ24tbWlkZGxlIGxvYWRpbmctc3Bpbm5lclwiPjwvaT5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtd2FybmluZyBtaXNzaW5nLXdhcm5pbmcgc2hvdy10b29sdGlwIFwiIHRpdGxlPVwiRGF0YSBsb2FkaW5nIGludGVycnVwdGVkXCI+PC9pPlxuXHRcdFx0PC9kaXY+XG5cblx0XHRcdDxkaXYgaWQ9XCJncmlkXCI+PC9kaXY+XG5cdFx0YDtcblxuXHRcdC8vIEhpZGUgbG9hZGluZyBzcGlubmVyIGFuZCB3YXJuaW5nXG5cdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdHRoaXMuZ2V0JCgnLm1pc3Npbmctd2FybmluZycpLmhpZGUoKTtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2NvbnRhaW5lcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBkYXRhIGdyaWQgKEVYQ0VQVCBDT0xVTU5TLCBBUyBXRSBORUVEIE1FVFJJQ1MgVE8gQkUgQUNDRVNTSUJMRSlcblx0XHR0aGlzLl9ncmlkID0gdGhpcy5nZXQkKCcjZ3JpZCcpLmtlbmRvR3JpZCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG5cdFx0XHRzZWxlY3RhYmxlOiBmYWxzZSxcblx0XHRcdG5vUmVjb3Jkczoge1xuXHRcdFx0XHR0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJwLTJcIj5ObyBkYXRhLjwvZGl2Pidcblx0XHRcdH0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5vbkl0ZW1DbGljaywgdGhpcylcbiAgICAgICAgfSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cdH1cblxuXHRnZXQgc3RhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuXHR9XG5cblx0c2V0IHN0YXRlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlICE9IHRoaXMuc3RhdGUpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlKVxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdGUnLCB2YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdGF0ZScpO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGUgY2hhbmdlXG5cdFx0XHR0aGlzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1RhYmxlRGF0YX0gdGFibGVEYXRhXG4gXHQgKiBAcGFyYW0gIHtNZXRyaWNDb250YWluZXJ9IG1ldHJpY0NvbnRhaW5lclxuXHQgKi9cblx0aW5pdCh0YWJsZURhdGEsIG1ldHJpY0NvbnRhaW5lcilcblx0e1xuXHRcdHRoaXMuX3RhYmxlRGF0YSA9IHRhYmxlRGF0YTtcblx0XHR0aGlzLl9tZXRyaWNDb250YWluZXIgPSBtZXRyaWNDb250YWluZXI7XG5cblx0XHQvLyBDb25maWd1cmUgY29sdW1uc1xuXHRcdHRoaXMuY29uZmlndXJlQ29sdW1ucygpO1xuXG5cdFx0dGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG5cblx0XHQvLyBSZWZyZXNoXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtTdGF0c0RhdGFGaWx0ZXJ9IGZpbHRlclxuXHQgKi9cblx0c2V0RmlsdGVyKGZpbHRlcilcblx0e1xuXHRcdHRoaXMuX2ZpbHRlciA9IGZpbHRlcjtcblxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRvbkl0ZW1DbGljaygpXG5cdHtcblx0XHQvLyBUTyBCRSBPVkVSUklEREVOXG5cdH1cblxuXHRjb25maWd1cmVDb2x1bW5zKClcblx0e1xuXHRcdC8vIFRPIEJFIE9WRVJSSURERU5cblx0fVxuXG5cdGhhbmRsZVN0YXRlQ2hhbmdlKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnLm1pc3Npbmctd2FybmluZycpLmhpZGUoKTtcblxuXHRcdFx0c3dpdGNoICh0aGlzLnN0YXRlKVxuXHRcdFx0e1xuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HOlxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLnNob3coKTsgLy8gU2hvdyBsb2FkaW5nIHNwaW5uZXJcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5NSVNTSU5HOlxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnLm1pc3Npbmctd2FybmluZycpLnNob3coKTsgLy8gU2hvdyBsb2FkaW5nIGludGVycnVwdGVkIHdhcm5pbmdcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBOlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0XHR9XG5cdH1cblxuXHRzZXRUYWJsZVNlbGVjdGFibGUoc2VsZWN0YWJsZSlcblx0e1xuXHRcdGxldCBzZWwgPSBzZWxlY3RhYmxlID8gJ3JvdycgOiBmYWxzZTtcblx0XHR0aGlzLl9ncmlkLnNldE9wdGlvbnMoe1xuXHRcdFx0c2VsZWN0YWJsZTogc2VsXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7TWV0cmljfSBtZXRyaWNcblx0ICovXG5cdGdldFZhbHVlQ29sVGVtcGxhdGUobWV0cmljKVxuXHR7XG5cdFx0cmV0dXJuICQucHJveHkoZnVuY3Rpb24gKGRhdGFJdGVtKSB7XG5cdFx0XHRjb25zdCBtZXRyaWNJZCA9IHRoaXMubWV0cmljLmJhc2VNZXRyaWMuaWQ7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGRhdGFJdGVtW21ldHJpY0lkXTtcblxuXHRcdFx0aWYgKCFpc05hTih2YWx1ZSkpXG5cdFx0XHRcdHJldHVybiB0aGlzLm1ldHJpYy5iYXNlTWV0cmljLmdldFZhbHVlQXNTdHJpbmcodmFsdWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gJyc7IC8vcmV0dXJuICdbZXhwYW5kXSc7XG5cdFx0fSwgeyBtZXRyaWM6IG1ldHJpYyB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtNZXRyaWN9IG1ldHJpY1xuXHQgKi9cblx0Z2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKG1ldHJpYylcblx0e1xuXHRcdHJldHVybiAkLnByb3h5KGZ1bmN0aW9uIChkYXRhSXRlbSkge1xuXHRcdFx0Y29uc3QgbWV0cmljSWQgPSB0aGlzLm1ldHJpYy5iYXNlTWV0cmljLmlkO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBkYXRhSXRlbVttZXRyaWNJZF07XG5cblx0XHRcdGlmICghaXNOYU4odmFsdWUpKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBvdmVyYWxsID0gdGhpcy5tZXRyaWMuZ2V0VmFsdWUoKTtcblx0XHRcdFx0Y29uc3QgcGVyYyA9IChvdmVyYWxsID4gMCA/IHZhbHVlIC8gb3ZlcmFsbCAqIDEwMCA6IC0xKTtcblx0XHRcdFx0cmV0dXJuIChwZXJjID4gLTEgPyBwZXJjLnRvRml4ZWQoMikgKyBcIiVcIiA6IFwiLS1cIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiAnJzsgLy9yZXR1cm4gJ1tleHBhbmRdJztcblx0XHR9LCB7IG1ldHJpYzogbWV0cmljIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge01ldHJpY30gbWV0cmljXG5cdCAqL1xuXHRnZXRBZ2dyU3VtVmFsdWVDb2xUZW1wbGF0ZShtZXRyaWMpXG5cdHtcblx0XHRyZXR1cm4gJC5wcm94eShmdW5jdGlvbiAoZGF0YUl0ZW0pIHtcblx0XHRcdGNvbnN0IG1ldHJpY0lkID0gdGhpcy5tZXRyaWMuYmFzZU1ldHJpYy5pZDtcblx0XHRcdGNvbnN0IHZhbHVlID0gZGF0YUl0ZW1bbWV0cmljSWRdLnN1bTtcblx0XHRcdHJldHVybiB0aGlzLm1ldHJpYy5iYXNlTWV0cmljLmdldFZhbHVlQXNTdHJpbmcodmFsdWUpO1xuXHRcdH0sIHsgbWV0cmljOiBtZXRyaWMgfSk7XG5cdH1cblxuXHRnZXRBZ2dyU3VtUGVyY2VudGFnZUNvbFRlbXBsYXRlMShtZXRyaWMpXG5cdHtcblx0XHRyZXR1cm4gJC5wcm94eShmdW5jdGlvbiAoZGF0YUl0ZW0pIHtcblx0XHRcdGNvbnN0IG1ldHJpY0lkID0gdGhpcy5tZXRyaWMuYmFzZU1ldHJpYy5pZDtcblx0XHRcdGNvbnN0IHZhbHVlID0gZGF0YUl0ZW1bbWV0cmljSWRdLnN1bTtcblx0XHRcdGNvbnN0IG92ZXJhbGwgPSB0aGlzLm1ldHJpYy5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgcGVyYyA9IChvdmVyYWxsID4gMCA/IHZhbHVlIC8gb3ZlcmFsbCAqIDEwMCA6IC0xKTtcblx0XHRcdHJldHVybiAocGVyYyA+IC0xID8gcGVyYy50b0ZpeGVkKDIpICsgXCIlXCIgOiBcIi0tXCIpO1xuXHRcdH0sIHsgbWV0cmljOiBtZXRyaWMgfSk7XG5cdH1cblxuXHRyZWZyZXNoT25XaW5kb3dSZXNpemUoKVxuXHR7XG5cdFx0dGhpcy5fZ3JpZC5yZWZyZXNoKCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZUNoYXJ0Vmlld30gZnJvbSAnLi4vYmFzZS1jaGFydC12aWV3JztcbmltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4uL2FuYWx5dGljcy1iYXNlLWVsZW1lbnQnO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4uL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7RmlsdGVyU2V0RXZlbnR9IGZyb20gJy4uL2ZpbHRlci1ldmVudCc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGNsYXNzIERlbW9ncmFwaGljc0NoYXJ0VmlldyBleHRlbmRzIEJhc2VDaGFydFZpZXdcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSlcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KHRoaXMuX3RhYmxlRGF0YS5kYXRhKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdF9kcmF3Q2hhcnQoY2hhcnREYXRhKVxuXHR7XG5cdFx0Y29uc3QgbWV0cmljID0gdGhpcy5nZXRTZWxlY3RlZE1ldHJpYygpO1xuXG5cdFx0aWYgKGNoYXJ0RGF0YSAhPSBudWxsICYmIGNoYXJ0RGF0YS5sZW5ndGggPiAwICYmIG1ldHJpYyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0Y2hhcnREYXRhID0gY2hhcnREYXRhLmZpbHRlcihvYmogPT4gb2JqLmNvdW50cnlDb2RlID09IHRoaXMuX2ZpbHRlci52YWx1ZSk7XG5cblx0XHRcdC8vIFNvcnQgYW5kIGV4dHJhY3QgdG9wIDEwIHZhbHVlc1xuXHRcdFx0bGV0IGRhdGEgPSBjaGFydERhdGEuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBiW21ldHJpYy5pZF0gLSBhW21ldHJpYy5pZF0gfSkuc2xpY2UoMCwgMTApO1xuXG5cdFx0XHQvLyBJU1NVRSEhISEhISFcblx0XHRcdC8vIElmIHRoZSBtZXRyaWMgaWQgc3RhcnRzIHdpdGggXCIlXCIsIEtlbmRvIGNoYXJ0IGNyYXNoZXNcblx0XHRcdC8vIEZvciB0aGlzIHJlYXNvbiBpbnN0ZWFkIG9mIHNpbXBseSBzZXR0aW5nIHRoZSBzZXJpZXMgZmllbGQgYW5kIGNhdGVnb3J5IGZpZWxkLCB3ZSBuZWVkIHRvIHJlYnVpbGQgdGhlIHNlcmllcyBkYXRhIGl0ZW1zIGZyb20gdGhlIGNoYXJ0IGRhdGFcblx0XHRcdC8vIChub3RlOiBmb3IgdGltZSBtZXRyaWNzLCB2YWx1ZSBpcyBjb252ZXJ0ZWQgZnJvbSBtaWxsaXMgdG8gbWludXRlcylcblxuXHRcdFx0ZGF0YSA9IGRhdGEubWFwKG9iaiA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Y291bnRyeTogb2JqWydjb3VudHJ5TmFtZSddLFxuXHRcdFx0XHRcdGNvZGU6IG9ialsnY291bnRyeUNvZGUnXSxcblx0XHRcdFx0XHR2YWx1ZTogKCFtZXRyaWMuaXNUaW1lID8gb2JqW21ldHJpYy5pZF0gOiBtb21lbnQuZHVyYXRpb24ob2JqW21ldHJpYy5pZF0pLmFzTWludXRlcygpLnRvRml4ZWQoMikpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGRhdGEgc291cmNlXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBjaGFydFxuXHRcdFx0bGV0IHZhbHVlQXhpc1RlbXBsYXRlID0gJyM6IHZhbHVlICMnO1xuXHRcdFx0bGV0IHNlcmllc0Zvcm1hdCA9ICd7MH0nO1xuXG5cdFx0XHRpZiAobWV0cmljLmlzUGVyY2VudGFnZSlcblx0XHRcdHtcblx0XHRcdFx0dmFsdWVBeGlzVGVtcGxhdGUgPSAnIzogdmFsdWUgIyUnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9JSc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChtZXRyaWMuaXNUaW1lKVxuXHRcdFx0e1xuXHRcdFx0XHR2YWx1ZUF4aXNUZW1wbGF0ZSA9ICcjOiB2YWx1ZSAjIG1pbnMnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9IG1pbnMnO1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0T3B0aW9ucyh7XG5cdFx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRcdGhlaWdodDogKGRhdGEubGVuZ3RoICogNDUgKyA1MCksIC8vKCFpc0ZpbHRlcmVkID8gNTAwIDogMTAwKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlcmllczogW3tcblx0XHRcdFx0XHRuYW1lOiBtZXRyaWMubmFtZSxcblx0XHRcdFx0XHRmaWVsZDogJ3ZhbHVlJyxcblx0XHRcdFx0XHRjYXRlZ29yeUZpZWxkOiAnY291bnRyeScsXG5cdFx0XHRcdFx0Zm9ybWF0OiBzZXJpZXNGb3JtYXRcblx0XHRcdFx0fV0sXG5cdFx0XHRcdHZhbHVlQXhpczoge1xuXHRcdFx0XHRcdG1heDogKG1ldHJpYy5pc1BlcmNlbnRhZ2UgPyAxMDAgOiB1bmRlZmluZWQpLFxuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IHZhbHVlQXhpc1RlbXBsYXRlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2F0ZWdvcnlBeGlzOiBbe1xuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9iai5kYXRhSXRlbS5jb3VudHJ5ICE9ICcnID8gb2JqLmRhdGFJdGVtLmNvdW50cnkgOiAnW3Vua25vd25dJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fV0sXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gU2V0IGNoYXJ0IGRhdGEgc291cmNlXG5cdFx0XHR0aGlzLl9jaGFydC5zZXREYXRhU291cmNlKGRzKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0RGF0YVNvdXJjZShbXSk7XG5cdH1cblxuXHRvblNlcmllc0NsaWNrKGUpXG5cdHtcblx0XHRpZiAodGhpcy5fZmlsdGVyID09IG51bGwgfHwgdGhpcy5fZmlsdGVyLnZhbHVlICE9IGUuZGF0YUl0ZW0uY29kZSlcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCdjb3VudHJ5JywgZS5kYXRhSXRlbS5jb2RlLCBmYWxzZSwgZS5kYXRhSXRlbS5jb3VudHJ5KSApO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnZGVtb2dyYXBoaWNzLWNoYXJ0LXZpZXcnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZGVtb2dyYXBoaWNzLWNoYXJ0LXZpZXcnLCBEZW1vZ3JhcGhpY3NDaGFydFZpZXcpO1xuIiwiaW1wb3J0IHtCYXNlTWFwVmlld30gZnJvbSAnLi4vYmFzZS1tYXAtdmlldyc7XG5pbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuLi9maWx0ZXItZXZlbnQnO1xuaW1wb3J0ICogYXMgY2hyb21hIGZyb20gJ2Nocm9tYS1qcyc7XG5cbmV4cG9ydCBjbGFzcyBEZW1vZ3JhcGhpY3NNYXBWaWV3IGV4dGVuZHMgQmFzZU1hcFZpZXdcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5TSEFQRV9TVFJPS0VfQ09MT1IgPSAnI2FhYSc7XG5cdFx0dGhpcy5TSEFQRV9TVFJPS0VfV0lEVEggPSAwLjU7XG5cblx0XHQvLyBMb2FkIEdlb0pTT04gZmlsZSBjb250YWluaW5nIGNvdW50cmllcyBnZW9tZXRyeVxuXHRcdHRoaXMuX2xvYWRKU09OKCdhc3NldHMvZGF0YS9jb3VudHJpZXMuZ2VvLmpzb24nLCAkLnByb3h5KHRoaXMuX29uQ291bnRyaWVzRGF0YUxvYWRlZCwgdGhpcykpO1xuXG5cdFx0Lypcblx0XHROT1RFOiBIT1cgVE8gR0VORVJBVEUgVEhFIEdFT0pTT04gRklMRVxuXHRcdDEpIEdvIHRvIE5hdHVyYWwgRWFydGggd2Vic2l0ZSAoaHR0cHM6Ly93d3cubmF0dXJhbGVhcnRoZGF0YS5jb20vZG93bmxvYWRzLykgYW5kIGRvd25sb2FkIG1hcCBkYXRhXG5cdFx0ICAgKGN1bHR1cmFsLCBzbWFsbCBzY2FsZSBkYXRhIGlzIGVub3VnaCBmb3Igb3VyIHB1cnBvc2UpXG5cdFx0MikgR28gdG8gdGhpcyBNYXBTaGFwZXIgd2Vic2l0ZSAoaHR0cHM6Ly9tYXBzaGFwZXIub3JnLykgYW5kIGltcG9ydCAuZGJmLCAucHJqIGFuZCAuc2hwIGZpbGVzIGRvd25sb2FkZWQgYmVmb3JlXG5cdFx0MykgT3B0aW9uYWw6IHNlbGVjdCBhbmQgZGVsZXRlIEFuY3RhcnRpY2Fcblx0XHQ0KSBPcGVuIE1hcFNoYXBlciBjb25zb2xlIGFuZCBydW4gZmlsdGVyIGNvbW1hbmQ6XG5cdFx0ICAgbWFwc2hhcGVyIC1maWx0ZXItZmllbGRzIGZpZWxkcz1JU09fQTIsTkFNRVxuXHRcdCAgIChhY3R1YWxseSBOQU1FIGlzIG5vdCByZWFsbHkgbmVlZGVkKVxuXHRcdDUpIE9wZW4gTWFwU2hhcGVyIGV4cG9ydGVyIGFuZCBleHBvcnQgdG8gR2VvSlNPTiBmb3JtYXRcblx0XHQ2KSBjb3B5IGZpbGUgdG8gZGlzdC9hc3NldHMvZGF0YSBmb2xkZXIgYW5kIHJlbmFtZSBpdCB0byBjb3VudHJpZXMuZ2VvLmpzb25cblx0XHQqL1xuXG5cdFx0Ly8gSW5saXRpYWxpemUgZ2F1Z2Vcblx0XHR0aGlzLl9nYXVnZSA9IHRoaXMuZ2V0JCgnI2dhdWdlJykua2VuZG9MaW5lYXJHYXVnZSh7XG5cdFx0XHRwb2ludGVyOiB7XG5cdFx0XHRcdG9wYWNpdHk6IDAsXG5cdCAgICAgICAgICAgIHZhbHVlOiAwLFxuXHQgICAgICAgICAgICBzaGFwZTogJ2Fycm93Jyxcblx0ICAgICAgICAgIFx0c2l6ZTogMTAsXG5cdFx0XHRcdGNvbG9yOiAnIzIxMjUyOSdcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNjYWxlOiB7XG5cdFx0XHRcdHZlcnRpY2FsOiBmYWxzZSxcblx0ICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHRcdG1pbjogMCxcblx0ICAgICAgICAgICAgcmFuZ2VzOiBbe1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3VybCgjZ2F1Z2VHcmFkaWVudCknXG5cdCAgICAgICAgICAgIH1dLFxuXHRcdFx0XHRyYW5nZVNpemU6IDEwLFxuXHQgICAgICAgICAgXHRtYWpvclRpY2tzOiB7XG5cdCAgICAgICAgICAgIFx0dmlzaWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICBcdG1pbm9yVGlja3M6IHtcblx0ICAgICAgICAgICAgXHR2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgXHRsYWJlbHM6IHtcblx0ICAgICAgICAgICAgXHR2aXNpYmxlOiBmYWxzZVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgXHRsaW5lOiB7XG5cdCAgICAgICAgICAgIFx0dmlzaWJsZTogZmFsc2Vcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pLmRhdGEoJ2tlbmRvTGluZWFyR2F1Z2UnKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBKVxuXHRcdFx0XHRcdHRoaXMuX2RyYXdNYXAodGhpcy5fdGFibGVEYXRhLmRhdGEpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5fZHJhd01hcChudWxsKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZHJhd01hcChtYXBEYXRhKVxuXHR7XG5cdFx0Ly8gV0UgTkVFRCBUTyBDS0VDSyBWSVNJQklMSVRZIEFTIEEgV09SS0FST1VORCwgQkVDQVVTRSBXSEVOIEhJRERFTiBUSEUgTUFQIExBWUVSUyBDQU4nVCBDUkVBVEVEXG5cdFx0Y29uc3QgaXNNYXBWaXNpYmxlID0gKHRoaXMub2Zmc2V0UGFyZW50ICE9IG51bGwpO1xuXG5cdFx0aWYgKGlzTWFwVmlzaWJsZSAmJiBtYXBEYXRhICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Y29uc3QgaXNGaWx0ZXJlZCA9ICh0aGlzLl9maWx0ZXIgIT0gbnVsbCAmJiB0aGlzLl9maWx0ZXIudmFsdWUgIT0gbnVsbCk7XG5cblx0XHRcdGlmIChpc0ZpbHRlcmVkKVxuXHRcdFx0XHRtYXBEYXRhID0gbWFwRGF0YS5maWx0ZXIob2JqID0+IG9iai5jb3VudHJ5Q29kZSA9PSB0aGlzLl9maWx0ZXIudmFsdWUpO1xuXG5cdFx0XHQvLyBNYXAgdGFibGUgZGF0YSBieSBjb3VudHJ5IGlkXG5cdFx0XHRsZXQgbWV0cmljc0J5Q291bnRyeSA9IG1hcERhdGEucmVkdWNlKChvYmosIGl0ZW0pID0+IHtcblx0XHRcdFx0b2JqW2l0ZW0uY291bnRyeUNvZGVdID0gaXRlbVxuXHRcdFx0XHRyZXR1cm4gb2JqXG5cdFx0XHR9LCB7fSk7XG5cblx0XHRcdGxldCBtZXRyaWMgPSB0aGlzLmdldFNlbGVjdGVkTWV0cmljKCk7XG5cdFx0XHRsZXQgZG9tYWluTWluID0gMDtcblx0XHRcdGxldCBkb21haW5NYXggPSAxO1xuXG5cdFx0XHQvLyBNZXJnZSBtZXRyaWNzIGludG8gY291bnRyaWVzIGRhdGFcblx0XHRcdGZvciAobGV0IGNvdW50cnkgb2YgdGhpcy5fY291bnRyaWVzRGF0YS5mZWF0dXJlcylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNvdW50cnlDb2RlID0gY291bnRyeS5wcm9wZXJ0aWVzLklTT19BMjtcblx0XHRcdFx0bGV0IG1ldHJpY3NEYXRhID0gbWV0cmljc0J5Q291bnRyeVtjb3VudHJ5Q29kZV07XG5cdFx0XHRcdGxldCBkYXRhID0gbnVsbDtcblxuXHRcdFx0XHRpZiAobWV0cmljc0RhdGEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgdmFsID0gbWV0cmljc0RhdGFbbWV0cmljLmlkXTtcblx0XHRcdFx0XHRsZXQgdmFsU3RyaW5nID0gbWV0cmljLmdldFZhbHVlQXNTdHJpbmcodmFsKTtcblxuXHRcdFx0XHRcdGlmICh2YWwgPiBkb21haW5NYXgpXG5cdFx0XHRcdFx0XHRkb21haW5NYXggPSB2YWw7XG5cblx0XHRcdFx0XHRkYXRhID0ge1xuXHRcdFx0XHRcdFx0Y29kZTogY291bnRyeUNvZGUsXG5cdFx0XHRcdFx0XHRjb3VudHJ5OiBtZXRyaWNzRGF0YS5jb3VudHJ5TmFtZSxcblx0XHRcdFx0XHRcdG1ldHJpY0xhYmVsOiBtZXRyaWMubmFtZSxcblx0XHRcdFx0XHRcdG1ldHJpY1N0cmluZzogdmFsU3RyaW5nLFxuXHRcdFx0XHRcdFx0bWV0cmljVmFsdWU6IHZhbFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb3VudHJ5LmRhdGEgPSBkYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgY29sb3Igc2NhbGVcblx0XHRcdC8vIERvbWFpbiBpcyBzZXQgYmFzZWQgb24gdGhlIHRvcCB2YWx1ZVxuXHRcdFx0dGhpcy5fY29sb3JTY2FsZSA9IGNocm9tYS5zY2FsZShbJyNiZmRkZmUnLCAnIzMzOTlmZiddKS5kb21haW4oW2RvbWFpbk1pbiwgZG9tYWluTWF4XSk7XG5cblx0XHRcdC8vIFNob3cgZG9tYWluXG5cdFx0XHR0aGlzLmdldCQoJyNzY2FsZU1pbicpLnRleHQoZG9tYWluTWluKTtcblx0XHRcdHRoaXMuZ2V0JCgnI3NjYWxlTWF4JykudGV4dChkb21haW5NYXgpO1xuXG5cdFx0XHQvLyBTZWcgZ2F1Z2Ugc2NhbGUgbWF4XG5cdFx0XHR0aGlzLl9nYXVnZS5vcHRpb25zLnNjYWxlLm1pbiA9IGRvbWFpbk1pbjtcblx0XHRcdHRoaXMuX2dhdWdlLm9wdGlvbnMuc2NhbGUubWF4ID0gZG9tYWluTWF4O1xuXHRcdFx0dGhpcy5fZ2F1Z2Uub3B0aW9ucy5zY2FsZS5yYW5nZXNbMF0uZnJvbSA9IGRvbWFpbk1pbjtcblx0XHRcdHRoaXMuX2dhdWdlLm9wdGlvbnMuc2NhbGUucmFuZ2VzWzBdLnRvID0gZG9tYWluTWF4O1xuXHRcdFx0dGhpcy5fZ2F1Z2UucmVkcmF3KCk7XG5cblx0XHRcdC8vIERyYXcgbWFwIGxheWVyXG5cdFx0XHQvLyBJTVBPUlRBTlQgTk9URTogdGhpcyByZXF1aXJlcyBtYXAgdG8gYmUgZGVzdHJveWVkIGFuZCByZWNyZWF0ZWQsXG5cdFx0XHQvLyBhcyB0aGUgd2lkZ2V0IGRvZXNuJ3Qgc3VwcG9ydCBkeW5hbWljIGxheWVyIGNyZWF0aW9uXG5cblx0XHRcdGxldCBvcHRpb25zID0gdGhpcy5fbWFwLm9wdGlvbnM7XG4gICAgICAgICAgICBvcHRpb25zLmxheWVycyA9IFt7XG5cdFx0XHRcdHR5cGU6ICdzaGFwZScsXG5cdFx0XHRcdGRhdGFTb3VyY2U6IHtcblx0XHRcdFx0XHR0eXBlOiAnZ2VvanNvbicsXG5cdFx0XHRcdFx0ZGF0YTogdGhpcy5fY291bnRyaWVzRGF0YS5mZWF0dXJlc1xuXHRcdFx0XHR9XG5cdFx0XHR9XTtcblxuICAgICAgICAgICAgdGhpcy5fbWFwLmRlc3Ryb3koKTtcblxuICAgICAgICAgICAgdGhpcy5fbWFwID0gdGhpcy5nZXQkKCcjbWFwJykuZW1wdHkoKS5rZW5kb01hcChvcHRpb25zKS5kYXRhKCdrZW5kb01hcCcpO1xuXHRcdH1cblx0fVxuXG5cdG9uU2hhcGVDcmVhdGVkKGUpXG5cdHtcblx0XHRjb25zdCBzaGFwZSA9IGUuc2hhcGU7XG5cdFx0Y29uc3QgbWV0cmljVmFsdWUgPSBzaGFwZS5kYXRhSXRlbS5kYXRhID8gc2hhcGUuZGF0YUl0ZW0uZGF0YS5tZXRyaWNWYWx1ZSA6IG51bGw7XG5cblx0XHRpZiAobWV0cmljVmFsdWUpIHtcblx0XHRcdHZhciBjb2xvciA9IHRoaXMuX2NvbG9yU2NhbGUobWV0cmljVmFsdWUpLmhleCgpO1xuXHRcdFx0c2hhcGUub3B0aW9ucy5maWxsLnNldCgnY29sb3InLCBjb2xvcik7XG5cdFx0fVxuXHR9XG5cblx0b25TaGFwZUZlYXR1cmVDcmVhdGVkKGUpXG5cdHtcblx0XHRpZiAoZS5kYXRhSXRlbS5kYXRhKVxuXHRcdHtcblx0XHRcdGUuZ3JvdXAub3B0aW9ucy50b29sdGlwID0ge1xuXHRcdFx0XHRwb3NpdGlvbjogJ2N1cnNvcicsXG5cdFx0XHRcdG9mZnNldDogMTAsXG5cdFx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0XHRsZXQgZGF0YSA9IGUudGFyZ2V0LmRhdGFJdGVtLmRhdGE7XG5cdFx0XHRcdFx0cmV0dXJuIGBcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYXAtdG9vbHRpcFwiPlxuXHRcdFx0XHRcdFx0XHQ8c3Ryb25nPiR7ZGF0YS5jb3VudHJ5fTwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0XHQ8YnI+XG5cdFx0XHRcdFx0XHRcdDxzcGFuPiR7ZGF0YS5tZXRyaWNMYWJlbH08L3NwYW4+IDogPHNwYW4+JHtkYXRhLm1ldHJpY1N0cmluZ308L3NwYW4+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxzY3JpcHQ+XG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgYSB3b3JrYXJvdW5kIHRvIHN0eWxlIHRoZSB0b29sdGlwIHByb3Blcmx5OyBtYXAudG9vbHRpcCBjbGFzcyBpbiBkZWZpbmVkIGluIGdsb2JhbCBzdHlsZS5jc3Ncblx0XHRcdFx0XHRcdFx0JCgnLm1hcC10b29sdGlwJykuY2xvc2VzdCgnLmstdG9vbHRpcCcpLmNzcygncGFkZGluZycsICcwJyk7XG5cdFx0XHRcdFx0XHQ8L3NjcmlwdD5cblx0XHRcdFx0XHRgO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdG9uU2hhcGVNb3VzZUVudGVyKGUpXG5cdHtcblx0XHRpZiAoZS5zaGFwZS5kYXRhSXRlbS5kYXRhKVxuXHRcdHtcblx0XHRcdC8vIFNldCBzaGFwZSBzdHJva2Vcblx0XHRcdGUuc2hhcGUub3B0aW9ucy5zZXQoJ3N0cm9rZS5jb2xvcicsICcjZmY5OTAwJyk7XG5cdFx0XHRlLnNoYXBlLm9wdGlvbnMuc2V0KCdzdHJva2Uud2lkdGgnLCAyKTtcblxuXHRcdFx0Ly8gU2hvdyBnYXVnZSBwb2ludGVyXG5cdFx0XHR0aGlzLl9nYXVnZS5vcHRpb25zLnBvaW50ZXIub3BhY2l0eSA9IDE7XG5cdFx0XHR0aGlzLl9nYXVnZS5vcHRpb25zLnBvaW50ZXIudmFsdWUgPSBlLnNoYXBlLmRhdGFJdGVtLmRhdGEubWV0cmljVmFsdWU7XG5cdFx0XHR0aGlzLl9nYXVnZS5yZWRyYXcoKTtcblx0XHR9XG5cdH1cblxuXHRvblNoYXBlTW91c2VMZWF2ZShlKVxuXHR7XG5cdFx0Ly8gUmVzZWV0IHNoYXBlIHN0cm9rZVxuXHRcdGUuc2hhcGUub3B0aW9ucy5zZXQoJ3N0cm9rZS5jb2xvcicsIHRoaXMuU0hBUEVfU1RST0tFX0NPTE9SKTtcblx0XHRlLnNoYXBlLm9wdGlvbnMuc2V0KCdzdHJva2Uud2lkdGgnLCB0aGlzLlNIQVBFX1NUUk9LRV9XSURUSCk7XG5cblx0XHQvLyBIaWRlIGdhdWdlIHBvaW50ZXJcblx0XHR0aGlzLl9nYXVnZS5vcHRpb25zLnBvaW50ZXIub3BhY2l0eSA9IDA7XG5cdFx0dGhpcy5fZ2F1Z2UucmVkcmF3KCk7XG5cdH1cblxuXHRvblNoYXBlQ2xpY2soZSlcblx0e1xuXHRcdGxldCBkYXRhID0gZS5zaGFwZS5kYXRhSXRlbS5kYXRhO1xuXG4gICAgICAgIGlmIChkYXRhKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLl9maWx0ZXIgPT0gbnVsbCB8fCB0aGlzLl9maWx0ZXIudmFsdWUgIT0gZGF0YS5jb2RlKVxuXHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIG5ldyBGaWx0ZXJTZXRFdmVudCgnY291bnRyeScsIGRhdGEuY29kZSwgZmFsc2UsIGRhdGEuY291bnRyeSkgKTtcblx0XHR9XG4gICAgfVxuXG5cdF9sb2FkSlNPTihwYXRoLCBjYWxsYmFja0ZuKVxuXHR7XG5cdFx0bGV0IHhvYmogPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHR4b2JqLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKTtcblx0XHR4b2JqLm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpO1xuXHRcdHhvYmoub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHhvYmoucmVhZHlTdGF0ZSA9PSA0ICYmIHhvYmouc3RhdHVzID09IFwiMjAwXCIpIHtcblx0XHRcdFx0Ly8gUmVxdWlyZWQgdXNlIG9mIGFuIGFub255bW91cyBjYWxsYmFjayBhcyAub3BlbiB3aWxsIE5PVCByZXR1cm4gYSB2YWx1ZSBidXQgc2ltcGx5IHJldHVybnMgdW5kZWZpbmVkIGluIGFzeW5jaHJvbm91cyBtb2RlXG5cdFx0XHRcdGNhbGxiYWNrRm4oeG9iai5yZXNwb25zZVRleHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0eG9iai5zZW5kKG51bGwpO1xuXHR9XG5cblx0X29uQ291bnRyaWVzRGF0YUxvYWRlZChqc29uU3RyaW5nKVxuXHR7XG5cdFx0Ly8gUGFyc2UgSlNPTiBzdHJpbmcgaW50byBvYmplY3Rcblx0XHR0aGlzLl9jb3VudHJpZXNEYXRhID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ2RlbW9ncmFwaGljcy1tYXAtdmlldycpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkZW1vZ3JhcGhpY3MtbWFwLXZpZXcnLCBEZW1vZ3JhcGhpY3NNYXBWaWV3KTtcbiIsImltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4uL2FuYWx5dGljcy1iYXNlLWVsZW1lbnQnO1xuXG5leHBvcnQgY2xhc3MgRGVtb2dyYXBoaWNzUHJvQWR2IGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdC5jYXJkIHtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IDE4cmVtO1xuXHRcdFx0XHR9XG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2PlxuXHRcdFx0XHQ8aDUgY2xhc3M9XCJ0ZXh0LWNlbnRlciBteS0zXCI+VXBncmFkZSB0byA8c3Ryb25nPkFuYWx5dGljcyBQcm88L3N0cm9uZz4gdG8gZW5hYmxlIGRlbW9ncmFwaGljIHZpZXcgb24gdGhlIG1ldHJpY3MqIGFuZCBnZXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8L2g1PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC1sZy00XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0XHQ8aW1nIGNsYXNzPVwiY2FyZC1pbWctdG9wXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmFseXRpY3MtYWR2L2RlbW9ncmFwaGljc1RhYmxlLnBuZ1wiIGFsdD1cIlRhYnVsYXIgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+VmlldyBtZXRyaWNzIGluIHRhYnVsYXIgZm9ybSwgc3BsaXQgYnkgY291bnRyeTsgZmlsdGVyIGRhdGEgYnkgY291bnRyeSBpbiBvbmUgY2xpY2suPC9wPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLWxpZ2h0IG15LTMgbXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJjYXJkLWltZy10b3BcIiBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuYWx5dGljcy1hZHYvZGVtb2dyYXBoaWNzQ2hhcnQucG5nXCIgYWx0PVwiVG9wIGNvdW50cmllc1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+VmlldyB0b3AgY291bnRyaWVzIGNoYXJ0IGZvciBlYWNoIG1ldHJpYzsgZmlsdGVyIGRhdGEgYnkgY291bnRyeSBpbiBvbmUgY2xpY2suPC9wPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLWxpZ2h0IG15LTMgbXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJjYXJkLWltZy10b3BcIiBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuYWx5dGljcy1hZHYvZGVtb2dyYXBoaWNzTWFwLnBuZ1wiIGFsdD1cIldvcmxkIG1hcFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+VmlldyBtYXAgd2l0aCBjb3VudHJ5IHJhbmtpbmcgYmFzZWQgb24gdGhlIHNlbGVjdGVkIG1ldHJpYzsgZmlsdGVyIGRhdGEgYnkgY291bnRyeSBpbiBvbmUgY2xpY2suPC9wPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLWxpZ2h0IG15LTMgbXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJjYXJkLWltZy10b3BcIiBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuYWx5dGljcy1hZHYvZGVtb2dyYXBoaWNzRmlsdGVyLnBuZ1wiIGFsdD1cIkZpbHRlciBieSBjb3VudHJ5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5GaWx0ZXIgbWV0cmljcyBieSBjb3VudHJ5LCBnZXR0aW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhbmQgdGhlICUgd2l0aCByZXNwZWN0IHRvIHRoZSBvdmVyYWxsIHZhbHVlLjwvcD5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC1sZy00XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0XHQ8aW1nIGNsYXNzPVwiY2FyZC1pbWctdG9wXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmFseXRpY3MtYWR2L2NvbXBhcmUucG5nXCIgYWx0PVwiQ29tcGFyZSBkYXRhXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5Db21wYXJlIGRhdGEgcmFuZ2VzIGFuZCBnZXQgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVzZXIgYmVoYXZpb3IgaW4gZGlmZmVyZW50IHRpbWUgcGVyaW9kcywgb3ZlcmFsbCBhbmQgYnkgY291bnRyeS48L3A+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNiBjb2wtbGctNFwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItbGlnaHQgbXktMyBteC1hdXRvXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhcmQtaW1nLXRvcFwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5hbHl0aWNzLWFkdi9kZW1vZ3JhcGhpY3NDb21wYXJlLnBuZ1wiIGFsdD1cIkNvbXBhcmUgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+Q29tcGFyZSBkYXRhIHJhbmdlcyBhbmQgZ2V0IHBlci1tZXRyaWMgYmVoYXZpb3Igb3ZlciBkaWZmZXJlbnQgdGltZSBwZXJpb2RzLCBvdmVyYWxsIGFuZCBieSBjb3VudHJ5LjwvcD5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxoNSBjbGFzcz1cIm10LTIgbWItMyB0ZXh0LWNlbnRlclwiPjxhIGhyZWY9XCJodHRwczovL3d3dy5zbWFydGZveHNlcnZlci5jb20vc2hvcC9pbmRleC5waHA/ZGlzcGF0Y2g9cHJvZHVjdHMudmlldyZwcm9kdWN0X2lkPTMxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+Q2xpY2sgaGVyZSB0byB1cGdyYWRlPC9hPjwvaDU+XG5cdFx0XHRcdDxwIGNsYXNzPVwidGV4dC1jZW50ZXIgbXktMFwiPjxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj4qIEF2YWlsYWJsZSBtZXRyaWNzOiBWaXNpdHMgfCBVbmlxdWUgdmlzaXRvcnMgfCBOZXcgdmlzaXRvcnMgfCBOZXcgdmlzaXRzICUgfCBBdmcuIHZpc2l0IGR1cmF0aW9uPC9zbWFsbD48L3A+XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnZGVtb2dyYXBoaWNzLXByby1hZHYnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZGVtb2dyYXBoaWNzLXByby1hZHYnLCBEZW1vZ3JhcGhpY3NQcm9BZHYpO1xuIiwiaW1wb3J0IHtCYXNlVGFibGVWaWV3fSBmcm9tICcuLi9iYXNlLXRhYmxlLXZpZXcnO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4uL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7TWV0cmljc01hbmFnZXJ9IGZyb20gJy4uLy4uLy4uLy4uL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljcy1tYW5hZ2VyJztcbmltcG9ydCB7RmlsdGVyU2V0RXZlbnR9IGZyb20gJy4uL2ZpbHRlci1ldmVudCc7XG5cbmV4cG9ydCBjbGFzcyBEZW1vZ3JhcGhpY3NUYWJsZVZpZXcgZXh0ZW5kcyBCYXNlVGFibGVWaWV3XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEEpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRcdC8vIElmIGZpbHRlciBpcyBzZXQsIGRpc2FibGUgZ3JpZCBzZWxlY3Rpb25cblx0XHRcdFx0dGhpcy5zZXRUYWJsZVNlbGVjdGFibGUoIWlzRmlsdGVyZWQpO1xuXG5cdFx0XHRcdC8vIFNldCBmaWx0ZXJpbmdcblx0XHRcdFx0Y29uc3QgZHNGaWx0ZXIgPSBbXTtcblxuXHRcdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0XHRkc0ZpbHRlci5wdXNoKHtcblx0XHRcdFx0XHRcdGZpZWxkOiAnY291bnRyeUNvZGUnLCBvcGVyYXRvcjogJ2VxJywgdmFsdWU6IHRoaXMuX2ZpbHRlci52YWx1ZVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIEFzc2lnbiBkYXRhcHJvdmlkZXIgdG8gZ3JpZFxuXHRcdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0XHRmaWx0ZXI6IGRzRmlsdGVyLFxuXHRcdFx0XHRcdHNvcnQ6IHtcblx0XHRcdFx0XHRcdGZpZWxkOiAndmlzaXRzJyxcblx0XHRcdFx0XHRcdGRpcjogJ2Rlc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkYXRhOiB0aGlzLl90YWJsZURhdGEuZGF0YVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoW10pO1xuXHRcdH1cblx0fVxuXG5cdG9uSXRlbUNsaWNrKClcblx0e1xuXHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2dyaWQuZGF0YUl0ZW0odGhpcy5fZ3JpZC5zZWxlY3QoKSk7XG5cblx0XHRpZiAoZGF0YUl0ZW0gIT0gbnVsbClcblx0XHR7XG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIG5ldyBGaWx0ZXJTZXRFdmVudCgnY291bnRyeScsIGRhdGFJdGVtLmNvdW50cnlDb2RlLCBmYWxzZSwgZGF0YUl0ZW0uY291bnRyeU5hbWUpICk7XG5cdFx0fVxuXHR9XG5cblx0Y29uZmlndXJlQ29sdW1ucygpXG5cdHtcblx0XHR0aGlzLl9ncmlkLnNldE9wdGlvbnMoe1xuXHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0ZmllbGQ6ICdjb3VudHJ5TmFtZScsXG5cdFx0XHRcdHRpdGxlOiAnQ291bnRyeScsXG5cdFx0XHRcdHdpZHRoOiAyMDAsXG5cdFx0XHRcdGxvY2tlZDogZmFsc2UsXG5cdFx0XHRcdHRlbXBsYXRlOiBmdW5jdGlvbihkYXRhSXRlbSkge1xuXHRcdFx0XHRcdGlmIChkYXRhSXRlbS5jb3VudHJ5TmFtZSA9PSAnJylcblx0XHRcdFx0XHRcdHJldHVybiAnW3Vua25vd25dJztcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gZGF0YUl0ZW0uY291bnRyeU5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnVmlzaXRzJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVklTSVRTLFxuXHRcdFx0XHRcdHRpdGxlOiAnVG90YWwnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0VmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LHtcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVklTSVRTLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdVbmlxdWUgdmlzaXRvcnMnLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0se1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdPdmVyYWxsICUnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ05ldyB2aXNpdG9ycycsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnTmV3IHZpc2l0cyAlJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzEsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSkpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ0F2ZyB2aXNpdCBkdXJhdGlvbicsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH1dXG5cdFx0fSk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdkZW1vZ3JhcGhpY3MtdGFibGUtdmlldycpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkZW1vZ3JhcGhpY3MtdGFibGUtdmlldycsIERlbW9ncmFwaGljc1RhYmxlVmlldyk7XG4iLCJpbXBvcnQge0FuYWx5dGljc0Jhc2VFbGVtZW50fSBmcm9tICcuLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuLi9maWx0ZXItZXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRXhjZXB0aW9uc0NoYXJ0VmlldyBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJtYi0zXCI+XG5cdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXIgbWwtMVwiPjwvaT5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtd2FybmluZyBtaXNzaW5nLXdhcm5pbmcgc2hvdy10b29sdGlwIG1sLTFcIiB0aXRsZT1cIkRhdGEgbG9hZGluZyBpbnRlcnJ1cHRlZFwiPjwvaT5cblx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8ZGl2IGlkPVwiY2hhcnRcIj48L2Rpdj5cblx0XHRgO1xuXG5cdFx0Ly8gSGlkZSBsb2FkaW5nIHNwaW5uZXIgYW5kIHdhcm5pbmdcblx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5oaWRlKCk7XG5cdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuaGlkZSgpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBoZWxwIHRvb2x0aXBzXG5cdFx0dGhpcy5nZXQkKCcjaGVhZGVyJykua2VuZG9Ub29sdGlwKHtcblx0XHRcdGZpbHRlcjogJ2lbdGl0bGVdLmhlbHAsIC5zaG93LXRvb2x0aXBbdGl0bGVdJyxcblx0XHRcdHBvc2l0aW9uOiAncmlnaHQnLFxuXHRcdFx0Y29udGVudDogZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRyZXR1cm4gYDxkaXYgY2xhc3M9J2hlbHAtdG9vbHRpcCc+JHtlLnRhcmdldC5kYXRhKCd0aXRsZScpfTwvZGl2PmA7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGNoYXJ0XG5cdFx0dGhpcy5fY2hhcnQgPSB0aGlzLmdldCQoJyNjaGFydCcpLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgbGVnZW5kOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH0sXG5cdFx0XHRzZXJpZXNEZWZhdWx0czoge1xuXHRcdFx0XHRsYWJlbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IFwiIz0gY2F0ZWdvcnkgIzogXFxuICM9IHZhbHVlIyVcIlxuICAgICAgICAgICAgICAgIH0sXG5cdFx0XHRcdG92ZXJsYXk6IHtcblx0XHRcdFx0XHRncmFkaWVudDogJ25vbmUnXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICB9LFxuXHRcdFx0c2VyaWVzOiBbe1xuXHRcdFx0XHR0eXBlOiAncGllJyxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiAxNTAsXG5cdFx0XHRcdGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICdjYXRlZ29yeScsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHR0ZW1wbGF0ZToga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNhdGVnb3J5XCI+XG5cdFx0XHRcdFx0XHQ8c3Ryb25nPlxuXHRcdFx0XHRcdFx0XHQjIGlmIChjYXRlZ29yeSAhPSAnJykgeyAjXG5cdFx0XHRcdFx0XHRcdCM6IGNhdGVnb3J5ICNcblx0XHRcdFx0XHRcdFx0IyB9IGVsc2UgeyAjXG5cdFx0XHRcdFx0XHRcdFt1bmtub3duXVxuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0PC9zdHJvbmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY2F0ZWdvcnlcIj5cblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLXNxdWFyZVwiIHN0eWxlPVwiY29sb3I6ICM6IGRhdGFJdGVtLmNvbG9yICNcIj48L2k+XG5cdFx0XHRcdFx0XHQjOiB2YWx1ZSAjJSAoIzogZGF0YUl0ZW0udG90YWwgIylcblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0YCksXG5cdFx0XHRcdGJhY2tncm91bmQ6ICcjZTRlNGU0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0NoYXJ0Jyk7XG5cdH1cblxuXHRnZXQgc3RhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuXHR9XG5cblx0c2V0IHN0YXRlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlICE9IHRoaXMuc3RhdGUpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlKVxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdGUnLCB2YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdGF0ZScpO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGUgY2hhbmdlXG5cdFx0XHR0aGlzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1RhYmxlRGF0YX0gdGFibGVEYXRhXG4gXHQgKiBAcGFyYW0gIHthcnJheX0gbWV0cmljc0RQXG5cdCAqL1xuXHRpbml0KHRhYmxlRGF0YSwgbWV0cmljcylcblx0e1xuXHRcdHRoaXMuX3RhYmxlRGF0YSA9IHRhYmxlRGF0YTtcblx0XHR0aGlzLl9tZXRyaWNzQnlJZCA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtZXRyaWNzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGJhc2VNZXRyaWMgPSBtZXRyaWNzW2ldO1xuXG5cdFx0XHQvLyBBZGQgZW50cnkgdG8gbWV0cmljc0J5SWQgYXJyYXlcblx0XHRcdHRoaXMuX21ldHJpY3NCeUlkW2Jhc2VNZXRyaWMuaWRdID0gYmFzZU1ldHJpYztcblx0XHR9XG5cblx0XHR0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuXHRcdC8vIFJlZnJlc2hcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqL1xuXHRzZXRGaWx0ZXIoZmlsdGVyKVxuXHR7XG5cdFx0dGhpcy5fZmlsdGVyID0gZmlsdGVyO1xuXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHRyZWZyZXNoKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBKVxuXHRcdFx0XHR0aGlzLl9kcmF3Q2hhcnQodGhpcy5fdGFibGVEYXRhLmRhdGEpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl9kcmF3Q2hhcnQobnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlU3RhdGVDaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuaGlkZSgpO1xuXG5cdFx0XHRzd2l0Y2ggKHRoaXMuc3RhdGUpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgc3Bpbm5lclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgaW50ZXJydXB0ZWQgd2FybmluZ1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEE6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdHJlZnJlc2hPbldpbmRvd1Jlc2l6ZSgpXG5cdHtcblx0XHR0aGlzLl9jaGFydC5yZWRyYXcoKTtcblx0fVxuXG5cdF9kcmF3Q2hhcnQoY2hhcnREYXRhKVxuXHR7XG5cdFx0aWYgKGNoYXJ0RGF0YSAhPSBudWxsICYmIGNoYXJ0RGF0YS5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdHtcblx0XHRcdCBcdGNoYXJ0RGF0YSA9IGNoYXJ0RGF0YS5maWx0ZXIob2JqID0+IHtcblx0XHRcdFx0XHRsZXQgdmFsdWVzID0gdGhpcy5fZmlsdGVyLnZhbHVlLnNwbGl0KCc6Jyk7XG5cblx0XHRcdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9iai50eXBlICsgJzonICsgb2JqLmRlc2NyaXB0aW9uID09IHRoaXMuX2ZpbHRlci52YWx1ZSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50eXBlID09IHRoaXMuX2ZpbHRlci52YWx1ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCB0b3RhbCA9IDA7XG5cdFx0XHRsZXQgZXJyb3JzID0gMDtcblx0XHRcdGxldCB3YXJuaW5ncyA9IDA7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcnREYXRhLmxlbmd0aDsgaSsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgaXRlbSA9IGNoYXJ0RGF0YVtpXTtcblx0XHRcdFx0bGV0IHZhbHVlID0gaXRlbVsnZXhjZXB0aW9ucyddO1xuXG5cdFx0XHRcdHRvdGFsICs9IHZhbHVlO1xuXG5cdFx0XHRcdGlmIChpdGVtLnR5cGUgPT0gJ1dBUk4nKVxuXHRcdFx0XHRcdHdhcm5pbmdzICs9IHZhbHVlO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZXJyb3JzICs9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgd2FybmluZ3NQZXJjID0gd2FybmluZ3MgLyB0b3RhbCAqIDEwMDtcblx0XHRcdGxldCBlcnJvcnNQZXJjID0gZXJyb3JzIC8gdG90YWwgKiAxMDA7XG5cblx0XHRcdHRoaXMuX2NoYXJ0LnNldERhdGFTb3VyY2UoW1xuXHRcdFx0XHR7Y2F0ZWdvcnk6ICdXYXJuaW5ncycsIHZhbHVlOiB3YXJuaW5nc1BlcmMudG9GaXhlZCgyKSwgdG90YWw6IHdhcm5pbmdzLCBjb2xvcjogJyNmZmNjMzMnfSxcblx0XHRcdFx0e2NhdGVnb3J5OidFcnJvcnMnLCB2YWx1ZTogZXJyb3JzUGVyYy50b0ZpeGVkKDIpLCB0b3RhbDogZXJyb3JzLCBjb2xvcjogJyNmZjMzMDAnfVxuXHRcdFx0XSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX2NoYXJ0LnNldERhdGFTb3VyY2UoW10pO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnZXhjZXB0aW9ucy1jaGFydC12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2V4Y2VwdGlvbnMtY2hhcnQtdmlldycsIEV4Y2VwdGlvbnNDaGFydFZpZXcpO1xuIiwiaW1wb3J0IHtCYXNlVGFibGVWaWV3fSBmcm9tICcuLi9iYXNlLXRhYmxlLXZpZXcnO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4uL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7TWV0cmljc01hbmFnZXJ9IGZyb20gJy4uLy4uLy4uLy4uL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvbWV0cmljcy1tYW5hZ2VyJztcbmltcG9ydCB7RmlsdGVyU2V0RXZlbnR9IGZyb20gJy4uL2ZpbHRlci1ldmVudCc7XG5cbmV4cG9ydCBjbGFzcyBFeGNlcHRpb25zVGFibGVWaWV3IGV4dGVuZHMgQmFzZVRhYmxlVmlld1xue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cdH1cblxuXHRyZWZyZXNoKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBpc0ZpbHRlcmVkID0gKHRoaXMuX2ZpbHRlciAhPSBudWxsICYmIHRoaXMuX2ZpbHRlci52YWx1ZSAhPSBudWxsKTtcblx0XHRcdFx0Y29uc3QgZmlsdGVyVmFsdWVzID0gaXNGaWx0ZXJlZCA/IHRoaXMuX2ZpbHRlci52YWx1ZS5zcGxpdCgnOicpIDogW107XG5cblx0XHRcdFx0Ly8gSWYgZmlsdGVyIGlzIHNldCBhbmQgaGFzIG11bHRpcGxlIHZhbHVlcywgZGlzYWJsZSBncmlkIHNlbGVjdGlvblxuXHRcdFx0XHR0aGlzLnNldFRhYmxlU2VsZWN0YWJsZSghKGlzRmlsdGVyZWQgJiYgZmlsdGVyVmFsdWVzLmxlbmd0aCA+IDEpKTtcblxuXHRcdFx0XHQvLyBTZXQgZmlsdGVyaW5nXG5cdFx0XHRcdGNvbnN0IGRzRmlsdGVyID0gW107XG5cblx0XHRcdFx0aWYgKGlzRmlsdGVyZWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkc0ZpbHRlci5wdXNoKHtcblx0XHRcdFx0XHRcdGZpZWxkOiAndHlwZScsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogZmlsdGVyVmFsdWVzWzBdXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoZmlsdGVyVmFsdWVzLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0ZHNGaWx0ZXIucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGZpZWxkOiAnZGVzY3JpcHRpb24nLCBvcGVyYXRvcjogJ2VxJywgdmFsdWU6IGZpbHRlclZhbHVlc1sxXVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXNzaWduIGRhdGFwcm92aWRlciB0byBncmlkXG5cdFx0XHRcdGxldCBkcyA9IG5ldyBrZW5kby5kYXRhLkRhdGFTb3VyY2Uoe1xuXHRcdFx0XHRcdGZpbHRlcjogZHNGaWx0ZXIsXG5cdFx0XHRcdFx0c29ydDoge1xuXHRcdFx0XHRcdFx0ZmllbGQ6ICdkZXNjcmlwdGlvbicsXG5cdFx0XHRcdFx0XHRkaXI6ICdhc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkYXRhOiB0aGlzLl90YWJsZURhdGEuZGF0YSxcblx0XHRcdFx0XHRncm91cDoge1xuXHRcdFx0XHRcdFx0ZmllbGQ6ICd0eXBlJywgYWdncmVnYXRlczogW1xuXHRcdFx0XHRcdFx0XHR7ZmllbGQ6ICdkZXNjcmlwdGlvbicsIGFnZ3JlZ2F0ZTogJ2NvdW50J30sXG5cdFx0XHRcdFx0XHRcdHtmaWVsZDogTWV0cmljc01hbmFnZXIuRVhDRVBUSU9OUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHRdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogW1xuXHRcdFx0XHRcdFx0e2ZpZWxkOiAnZGVzY3JpcHRpb24nLCBhZ2dyZWdhdGU6ICdjb3VudCd9LFxuXHRcdFx0XHRcdFx0e2ZpZWxkOiBNZXRyaWNzTWFuYWdlci5FWENFUFRJT05TLCBhZ2dyZWdhdGU6ICdzdW0nfSxcblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMuX2dyaWQuc2V0RGF0YVNvdXJjZShkcyk7XG5cblx0XHRcdFx0Ly8gQWRkIGNsaWNrIGxpc3RlbmVyIHRvIGdyb3VwIGhlYWRlciByb3dzXG5cdFx0XHRcdHRoaXMuZ2V0JCgnI2dyaWQnKS5maW5kKCcuay1ncm91cGluZy1yb3cnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uR3JvdXBIZWFkZXJDbGljaywgdGhpcykpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoW10pO1xuXHRcdH1cblx0fVxuXG5cdF9vbkdyb3VwSGVhZGVyQ2xpY2soZSlcblx0e1xuXHRcdC8vIElmIGV4cGFuZC9jb2xsYXBzZSBpY29uIGlzIGNsaWNrZWQsIGRvIG5vdCBmaXJlIGV2ZW50XG5cdFx0aWYgKCEkKGUudGFyZ2V0KS5oYXNDbGFzcygnay1pY29uJykpXG5cdFx0e1xuXHRcdFx0Y29uc3QgaXNGaWx0ZXJlZCA9ICh0aGlzLl9maWx0ZXIgIT0gbnVsbCAmJiB0aGlzLl9maWx0ZXIudmFsdWUgIT0gbnVsbCk7XG5cdFx0XHRjb25zdCB0eXBlID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJy5ncm91cC1oZWFkZXInKS5hdHRyKCdkYXRhLXR5cGUnKTtcblxuXHRcdFx0aWYgKCFpc0ZpbHRlcmVkICYmIHR5cGUpXG5cdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCdleGNlcHRpb24nLCB0eXBlLCB0cnVlKSApO1xuXHRcdH1cblx0fVxuXG5cdG9uSXRlbUNsaWNrKClcblx0e1xuXHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2dyaWQuZGF0YUl0ZW0odGhpcy5fZ3JpZC5zZWxlY3QoKSk7XG5cblx0XHRpZiAoZGF0YUl0ZW0gIT0gbnVsbClcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KCdleGNlcHRpb24nLCBgJHtkYXRhSXRlbS50eXBlfToke2RhdGFJdGVtLmRlc2NyaXB0aW9ufWAsIHRydWUpICk7XG5cdH1cblxuXHRjb25maWd1cmVDb2x1bW5zKClcblx0e1xuXHRcdHRoaXMuX2dyaWQuc2V0T3B0aW9ucyh7XG5cdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRmaWVsZDogJ3R5cGUnLFxuXHRcdFx0XHR0aXRsZTogJ1R5cGUnLFxuXHRcdFx0XHRncm91cEhlYWRlclRlbXBsYXRlOiAnPHNwYW4gY2xhc3M9XCJncm91cC1oZWFkZXJcIiBkYXRhLXR5cGU9XCIjPXZhbHVlI1wiPiM9dmFsdWUjPC9zcGFuPicsXG5cdFx0XHRcdGhpZGRlbjogdHJ1ZSxcblx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFJdGVtLnR5cGUgPT0gJycpXG5cdFx0XHRcdFx0XHRyZXR1cm4gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLnR5cGU7XG5cdFx0XHRcdH1cblx0XHRcdH0se1xuXHRcdFx0XHRmaWVsZDogJ2Rlc2NyaXB0aW9uJyxcblx0XHRcdFx0dGl0bGU6ICdFeGNlcHRpb24nLFxuXHRcdFx0XHR3aWR0aDogNDAwLFxuXHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRpZiAoZGF0YUl0ZW0uZGVzY3JpcHRpb24gPT0gJycpXG5cdFx0XHRcdFx0XHRyZXR1cm4gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLmRlc2NyaXB0aW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9LHtcblx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMsXG5cdFx0XHRcdHRpdGxlOiAnVG90YWwnLFxuXHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMpKSxcblx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0fSxcblx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtVmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5FWENFUFRJT05TKSksXG5cdFx0XHR9LHtcblx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMsXG5cdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlMpKSxcblx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0fSxcblx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtUGVyY2VudGFnZUNvbFRlbXBsYXRlMSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5FWENFUFRJT05TKSlcblx0XHRcdH1dXG5cdFx0fSk7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCdleGNlcHRpb25zLXRhYmxlLXZpZXcnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZXhjZXB0aW9ucy10YWJsZS12aWV3JywgRXhjZXB0aW9uc1RhYmxlVmlldyk7XG4iLCJleHBvcnQgY2xhc3MgRmlsdGVyU2V0RXZlbnQgZXh0ZW5kcyBDdXN0b21FdmVudFxue1xuXHRjb25zdHJ1Y3RvcihmaWx0ZXJOYW1lLCBmaWx0ZXJWYWx1ZSwgY2hlY2tTZXBhcmF0b3IsIGZpbHRlckRpc3BsYXlWYWx1ZSA9IG51bGwpXG5cdHtcblx0XHRzdXBlcignZmlsdGVyLXNldCcsIHtcblx0XHRcdGJ1YmJsZXM6IHRydWUsXG5cdFx0XHRjb21wb3NlZDogdHJ1ZSwgLy8gQWxsb3dzIGV2ZW50IHRvIGJ1YmJsZSBvdXRzaWRlIG9mIEN1c3RvbSBFbGVtZW50XG5cdFx0XHRkZXRhaWw6IHtcblx0XHRcdFx0ZmlsdGVyTmFtZTogZmlsdGVyTmFtZSxcblx0XHRcdFx0ZmlsdGVyVmFsdWU6IGZpbHRlclZhbHVlLFxuXHRcdFx0XHRjaGVja1NlcGFyYXRvcjogY2hlY2tTZXBhcmF0b3IsXG5cdFx0XHRcdGZpbHRlckRpc3BsYXlWYWx1ZTogZmlsdGVyRGlzcGxheVZhbHVlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiIsImltcG9ydCB7QW5hbHl0aWNzQmFzZUVsZW1lbnR9IGZyb20gJy4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5pbXBvcnQge01ldHJpY3NNYW5hZ2VyfSBmcm9tICcuLi8uLi8uLi9tYW5hZ2Vycy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL21ldHJpY3MtbWFuYWdlcic7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0ZpbHRlclNldEV2ZW50fSBmcm9tICcuL2ZpbHRlci1ldmVudCc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGNsYXNzIE1haW5DaGFydCBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXHRcdFx0XHQudHJ1bmNhdGUge1xuXHRcdFx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdFx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdFx0XHR0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5jb250YWluZXItZml4IHtcblx0XHRcdFx0XHQvKiBUaGlzIGF2b2lkcyBmbGV4IGNoaWxkIGNvbnRhaW5pbmcgYSBwb3RlbnRpYWxseSB2ZXJ5IGxhcmdlIGNoaWxkIHRvIGJyZWFrIHRoZSBsYXlvdXQgKi9cblx0XHRcdFx0XHRtaW4td2lkdGg6IDA7XG5cdFx0XHRcdH1cblx0XHRcdDwvc3R5bGU+XG5cblx0XHRcdDxkaXYgaWQ9XCJoZWFkZXJcIiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMVwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC1hdXRvIG15LTFcIj5cblx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1jaGFydC1hcmVhIG1yLTFcIj48L2k+XG5cdFx0XHRcdFx0PHNlbGVjdCBpZD1cIm1ldHJpY3NERFwiIGNsYXNzPVwibXItMVwiPjwvc2VsZWN0PlxuXHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXJcIj48L2k+XG5cdFx0XHRcdFx0PGkgaWQ9XCJ3YXJuaW5nXCIgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtd2FybmluZyBzaG93LXRvb2x0aXAgbWwtMVwiIHRpdGxlPVwiRGF0YSBsb2FkaW5nIGludGVycnVwdGVkXCI+PC9pPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQgbXktMSBweC1tZC0wIGNvbnRhaW5lci1maXhcIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwiZmlsdGVyXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBkLWZsZXggbWItMCBweS0yIHB4LTMgYWxpZ24taXRlbXMtY2VudGVyXCIgcm9sZT1cImFsZXJ0XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgaWQ9XCJmaWx0ZXJOYW1lXCIgY2xhc3M9XCJ0ZXh0LW11dGVkIGZvbnQtd2VpZ2h0LWJvbGQgdGV4dC11cHBlcmNhc2UgbXItMlwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwiZmlsdGVyVmFsdWVcIiBjbGFzcz1cImZsZXgtZ3Jvdy0xIGZvbnQtd2VpZ2h0LWJvbGQgdHJ1bmNhdGVcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBpZD1cInJlZHVjZUZpbHRlckJ0XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtIG1sLTIgcHktMCBweC0xXCIgdGl0bGU9XCJSZW1vdmUgc3ViLWZpbHRlclwiPjxpIGNsYXNzPVwiZmFzIGZhLXN0ZXAtYmFja3dhcmRcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdDxidXR0b24gaWQ9XCJyZW1vdmVGaWx0ZXJCdFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbSBtbC0yIHB5LTAgcHgtMVwiIHRpdGxlPVwiUmVtb3ZlIGZpbHRlclwiPjxpIGNsYXNzPVwiZmFzIGZhLWVqZWN0XCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZmllbGRzZXQgaWQ9XCJ0aW1lVW5pdFNlbGVjdG9yXCIgY2xhc3M9XCJjb2wtMTIgY29sLW1kLWF1dG8gbXktMSBmbGV4LXJvd1wiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjdXN0b20tY29udHJvbCBjdXN0b20tcmFkaW8gZC1pbmxpbmUtYmxvY2sgbXItMiBzaG93LXRvb2x0aXBcIiB0aXRsZT1cIkhvdXJseSBjaGFydDxicj48c3BhbiBzdHlsZT0nd2hpdGUtc3BhY2U6IG5vd3JhcDsnPihyYW5nZSAmbHQ7PSA3IGRheXMpPC9zcGFuPlwiPlxuXHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ0aW1lVW5pdFwiIGlkPVwiaG91cmx5UkJcIiBjbGFzcz1cImN1c3RvbS1jb250cm9sLWlucHV0XCIgY2hlY2tlZCB2YWx1ZT1cIkhIXCI+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cImhvdXJseVJCXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2xvY2tcIj48L2k+PC9sYWJlbD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wgY3VzdG9tLXJhZGlvIGQtaW5saW5lLWJsb2NrIG1yLTIgc2hvdy10b29sdGlwXCIgdGl0bGU9XCJEYWlseSBjaGFydDxicj48c3BhbiBzdHlsZT0nd2hpdGUtc3BhY2U6IG5vd3JhcDsnPihyYW5nZSAmbHQ7PSAzIG1vbnRocyk8L3NwYW4+XCI+XG5cdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInRpbWVVbml0XCIgaWQ9XCJkYWlseVJCXCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1pbnB1dFwiIHZhbHVlPVwiRERcIj5cblx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jb250cm9sLWxhYmVsXCIgZm9yPVwiZGFpbHlSQlwiPjxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLWRheVwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjdXN0b20tY29udHJvbCBjdXN0b20tcmFkaW8gZC1pbmxpbmUtYmxvY2sgbXItMiBzaG93LXRvb2x0aXBcIiB0aXRsZT1cIldlZWtseSBjaGFydDxicj48c3BhbiBzdHlsZT0nd2hpdGUtc3BhY2U6IG5vd3JhcDsnPihyYW5nZSAmbHQ7PSAyIHllYXJzKTwvc3Bhbj5cIj5cblx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwidGltZVVuaXRcIiBpZD1cIndlZWtseVJCXCIgY2xhc3M9XCJjdXN0b20tY29udHJvbC1pbnB1dFwiIHZhbHVlPVwiV1dcIj5cblx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jb250cm9sLWxhYmVsXCIgZm9yPVwid2Vla2x5UkJcIj48aSBjbGFzcz1cImZhcyBmYS1jYWxlbmRhci13ZWVrXCI+PC9pPjwvbGFiZWw+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImN1c3RvbS1jb250cm9sIGN1c3RvbS1yYWRpbyBkLWlubGluZS1ibG9jayBzaG93LXRvb2x0aXBcIiB0aXRsZT1cIk1vbnRobHkgY2hhcnRcIj5cblx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwidGltZVVuaXRcIiBpZD1cIm1vbnRobHlSQlwiIGNsYXNzPVwiY3VzdG9tLWNvbnRyb2wtaW5wdXRcIiB2YWx1ZT1cIk1NXCI+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjdXN0b20tY29udHJvbC1sYWJlbFwiIGZvcj1cIm1vbnRobHlSQlwiPjxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLWFsdFwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2ZpZWxkc2V0PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGlkPVwiY2hhcnRcIj48L2Rpdj5cblx0XHRgO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBtZXRyaWMgc2VsZWN0b3IgZHJvcGRvd25cblx0XHR0aGlzLl9tZXRyaWNzREQgPSB0aGlzLmdldCQoJyNtZXRyaWNzREQnKS5rZW5kb0Ryb3BEb3duTGlzdCh7XG5cdFx0XHRkYXRhVGV4dEZpZWxkOiAndGV4dCcsXG4gICAgICAgICAgICBkYXRhVmFsdWVGaWVsZDogJ3ZhbHVlJyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbk1ldHJpY0NoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSGlkZSBsb2FkaW5nIHNwaW5uZXIgYW5kIHdhcm5pbmdcblx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5oaWRlKCk7XG5cdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLmhpZGUoKTtcblxuXHRcdC8vIEhpZGUgZmlsdGVyXG5cdFx0dGhpcy5nZXQkKCcjZmlsdGVyJykuaGlkZSgpO1xuXHRcdHRoaXMuZ2V0JCgnI3JlZHVjZUZpbHRlckJ0JykuaGlkZSgpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIGZpbHRlciBidXR0b25zXG5cdFx0dGhpcy5nZXQkKCcjcmVkdWNlRmlsdGVyQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVkdWNlRmlsdGVyQ2xpY2ssIHRoaXMpKTtcblx0XHR0aGlzLmdldCQoJyNyZW1vdmVGaWx0ZXJCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVGaWx0ZXJDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIHRpbWUgdW5pdCBjaGFuZ2Vcblx0XHR0aGlzLmdldCQoJ2lucHV0W25hbWU9XCJ0aW1lVW5pdFwiXScpLm9uKCdjaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uVGltZVVuaXRDaGFuZ2UsIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2hlYWRlcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW50aWFsaXplIG1haW4gY2hhcnRcblx0XHR0aGlzLl9jaGFydCA9IHRoaXMuZ2V0JCgnI2NoYXJ0Jykua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRjaGFydEFyZWE6IHtcblx0XHRcdFx0aGVpZ2h0OiAyNTAsXG5cdFx0XHRcdGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCdcblx0XHRcdH0sXG5cdCAgICAgICAgbGVnZW5kOiB7XG5cdCAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG5cdCAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcmllczogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJlYScsXG5cdFx0XHRcdG5hbWU6ICdtYWluJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICBjYXRlZ29yeUZpZWxkOiAndGltZScsXG5cdFx0XHRcdGNhdGVnb3J5QXhpczogJ21haW4nLFxuXHRcdFx0XHRjb2xvcjogJyMzMzk5ZmYnLFxuXHRcdFx0XHRsaW5lOiB7XG5cdFx0XHRcdFx0d2lkdGg6IDJcblx0XHRcdFx0fSxcblx0XHRcdFx0bWFya2Vyczoge1xuXHRcdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICB9LFxuXHRcdFx0e1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5lJyxcblx0XHRcdFx0bmFtZTogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICd0aW1lJyxcblx0XHRcdFx0Y2F0ZWdvcnlBeGlzOiAnY29tcGFyZScsXG5cdFx0XHRcdGNvbG9yOiAnI2ZmOTkwMCcsXG5cdFx0XHRcdGxpbmU6IHtcblx0XHRcdFx0XHR3aWR0aDogMlxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgfV0sXG5cdFx0XHRjYXRlZ29yeUF4aXM6IFt7XG5cdFx0XHRcdG5hbWU6ICdtYWluJyxcblx0XHRcdFx0dHlwZTogJ2RhdGUnLFxuXHRcdFx0XHRiYXNlVW5pdDogJycsXG5cdFx0XHRcdGp1c3RpZmllZDogdHJ1ZSxcblx0XHRcdFx0bWF4RGl2aXNpb25zOiB3aW5kb3cuaW5uZXJXaWR0aCA8IDkwMCA/IDEyIDogMjQsXG5cdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdGNvbG9yOiAnIzMzOTlmZicsXG5cdFx0XHRcdFx0ZGF0ZUZvcm1hdHM6XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bWludXRlczogJ0hIOm1tJyxcblx0XHRcdFx0XHRcdGhvdXJzOiAnSEg6bW0nLFxuXHRcdFx0XHRcdFx0ZGF5czogJ2RkIE1NTScsXG5cdFx0XHRcdFx0XHR3ZWVrczogJ2RkIE1NTScsXG5cdFx0XHRcdFx0XHRtb250aHM6ICdkZCBNTU0nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdGF4aXNDcm9zc2luZ1ZhbHVlOiAwXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiAnY29tcGFyZScsXG5cdFx0XHRcdHR5cGU6ICdkYXRlJyxcblx0XHRcdFx0YmFzZVVuaXQ6ICcnLFxuXHRcdFx0XHRqdXN0aWZpZWQ6IHRydWUsXG5cdFx0XHRcdG1heERpdmlzaW9uczogd2luZG93LmlubmVyV2lkdGggPCA5MDAgPyAxMiA6IDI0LFxuXHRcdFx0XHRsYWJlbHM6IHtcblx0XHRcdFx0XHRjb2xvcjogJyNmZjk5MDAnLFxuXHRcdFx0XHRcdGRhdGVGb3JtYXRzOlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG1pbnV0ZXM6ICdISDptbScsXG5cdFx0XHRcdFx0XHRob3VyczogJ0hIOm1tJyxcblx0XHRcdFx0XHRcdGRheXM6ICdkZCBNTU0nLFxuXHRcdFx0XHRcdFx0d2Vla3M6ICdkZCBNTU0nLFxuXHRcdFx0XHRcdFx0bW9udGhzOiAnZGQgTU1NJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0YXhpc0Nyb3NzaW5nVmFsdWU6IDI1XG5cdFx0XHR9XSxcblx0XHRcdHZhbHVlQXhpczoge1xuXHRcdFx0XHRheGlzQ3Jvc3NpbmdWYWx1ZXM6IFswLCA5OTk5OTk5OTk5OTk5XVxuXHRcdFx0fSxcblx0XHRcdHRvb2x0aXA6IHtcblx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0dGVtcGxhdGU6IGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jYXRlZ29yeVwiPlxuXHRcdFx0XHRcdFx0PHN0cm9uZz5cblx0XHRcdFx0XHRcdFx0Izoga2VuZG8udG9TdHJpbmcoY2F0ZWdvcnksICdkZCBNTU0geXl5eScpICNcblx0XHRcdFx0XHRcdFx0IyBpZiAoZGF0YUl0ZW0uc2hvd0hvdXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdGgjOiBrZW5kby50b1N0cmluZyhjYXRlZ29yeSwgJ0hIJykgI1xuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0PC9zdHJvbmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLXNxdWFyZVwiIHN0eWxlPVwiY29sb3I6ICM6IHNlcmllcy5jb2xvciAjXCI+PC9pPlxuXHRcdFx0XHRcdFx0IzogZGF0YUl0ZW0ubmFtZSAjIDogIzoga2VuZG8uZm9ybWF0KGRhdGFJdGVtLmZvcm1hdCwgdmFsdWUpICNcblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0YCksXG5cdFx0XHRcdGJhY2tncm91bmQ6ICcjZTRlNGU0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0NoYXJ0Jyk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gcmVkcmF3IHdoYXQncyBuZWVkZWQgaW4gY2FzZSBvZiB3aW5kb3cgcmVzaXplXG5cdFx0JCh3aW5kb3cpLm9uKCdyZXNpemUnLCAkLnByb3h5KHRoaXMuX29uV2luZG93UmVzaXplLCB0aGlzKSk7XG5cdH1cblxuXHRnZXQgc3RhdGUoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuXHR9XG5cblx0c2V0IHN0YXRlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlICE9IHRoaXMuc3RhdGUpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlKVxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdGUnLCB2YWx1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdGF0ZScpO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGUgY2hhbmdlXG5cdFx0XHR0aGlzLl9oYW5kbGVTdGF0ZUNoYW5nZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtDaGFydENvbnRhaW5lcn0gY2hhcnRDb250YWluZXJcblx0ICovXG5cdGluaXQoY2hhcnRDb250YWluZXIpXG5cdHtcblx0XHR0aGlzLl9jaGFydENvbnRhaW5lciA9IGNoYXJ0Q29udGFpbmVyO1xuXHRcdHRoaXMuX21ldHJpY3NCeUlkID0ge307XG5cblx0XHQvLyBDb25maWd1cmUgbWV0cmljcyBkcm9wZG93blxuXHRcdGxldCBtZXRyaWNzRFAgPSBbXTtcblx0XHRsZXQgaW5kZXggPSAwXG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJ0Q29udGFpbmVyLmNoYXJ0SWRzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGNoYXJ0SWQgPSBjaGFydENvbnRhaW5lci5jaGFydElkc1tpXTtcblx0XHRcdGNvbnN0IGJhc2VNZXRyaWMgPSBjaGFydENvbnRhaW5lci5tYWluQ2hhcnRzW2NoYXJ0SWRdLmJhc2VNZXRyaWM7XG5cblx0XHRcdG1ldHJpY3NEUC5wdXNoKHt2YWx1ZTogYmFzZU1ldHJpYy5pZCwgdGV4dDogYmFzZU1ldHJpYy5uYW1lfSk7XG5cblx0XHRcdGlmIChjaGFydElkID09IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUylcblx0XHRcdFx0aW5kZXggPSBpO1xuXG5cdFx0XHQvLyBBZGQgZW50cnkgdG8gbWV0cmljc0J5SWQgYXJyYXlcblx0XHRcdHRoaXMuX21ldHJpY3NCeUlkW2Jhc2VNZXRyaWMuaWRdID0gYmFzZU1ldHJpYztcblx0XHR9XG5cblx0XHQvLyBTZXQgbWV0cmljcyBkcm9wZG93biBkYXRhcHJvdmlkZXJcblx0XHR0aGlzLl9tZXRyaWNzREQuc2V0RGF0YVNvdXJjZShtZXRyaWNzRFApO1xuXG5cdFx0Ly8gU2V0IHNlbGVjdGVkIGluZGV4XG5cdFx0dGhpcy5fbWV0cmljc0RELnNlbGVjdChpbmRleCk7XG5cblx0XHR0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuXHRcdC8vIFJlZnJlc2hcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdGdldFNlbGVjdGVkTWV0cmljSWQoKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkID0gdGhpcy5fZ2V0U2VsZWN0ZWRNZXRyaWMoKTtcblx0XHRyZXR1cm4gKHNlbGVjdGVkICE9IG51bGwgPyBzZWxlY3RlZC5pZCA6IG51bGwpO1xuXHR9XG5cblx0c2V0U2VsZWN0ZWRNZXRyaWNCeUlkKG1ldHJpY0lkKVxuXHR7XG5cdFx0aWYgKG1ldHJpY0lkICE9IHRoaXMuZ2V0U2VsZWN0ZWRNZXRyaWNJZCgpKVxuXHRcdHtcblx0XHRcdHRoaXMuX21ldHJpY3NERC5zZWxlY3QoZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLnZhbHVlID09PSBtZXRyaWNJZDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBGaXJlIG1ldHJpYyBjaGFuZ2UgZXZlbnRcblx0XHRcdHRoaXMuX29uTWV0cmljQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0U2VsZWN0ZWRUaW1lVW5pdCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXQkKCdpbnB1dFtuYW1lPVwidGltZVVuaXRcIl06Y2hlY2tlZCcpLnZhbCgpO1xuXHR9XG5cblx0c2V0VGltZVVuaXQodGltZVVuaXQsIGhvdXJseUVuYWJsZWQsIGRhaWx5RW5hYmxlZCwgd2Vla2x5RW5hYmxlZClcblx0e1xuXHRcdHRoaXMuZ2V0JChgaW5wdXRbbmFtZT1cInRpbWVVbml0XCJdW3ZhbHVlPVwiJHt0aW1lVW5pdH1cIl1gKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cblx0XHR0aGlzLmdldCQoJyNob3VybHlSQicpLmF0dHIoJ2Rpc2FibGVkJywgIWhvdXJseUVuYWJsZWQpO1xuXHRcdHRoaXMuZ2V0JCgnI2RhaWx5UkInKS5hdHRyKCdkaXNhYmxlZCcsICFkYWlseUVuYWJsZWQpO1xuXHRcdHRoaXMuZ2V0JCgnI3dlZWtseVJCJykuYXR0cignZGlzYWJsZWQnLCAhd2Vla2x5RW5hYmxlZCk7XG5cdH1cblxuXHRfb25NZXRyaWNDaGFuZ2UoKVxuXHR7XG5cdFx0Y29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NoYXJ0LW1ldHJpYy1jaGFuZ2UnLCB7XG5cdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUgLy8gQWxsb3dzIGV2ZW50IHRvIGJ1YmJsZSBvdXRzaWRlIG9mIEN1c3RvbSBFbGVtZW50XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0X29uVGltZVVuaXRDaGFuZ2UoKVxuXHR7XG5cdFx0Y29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3RpbWUtdW5pdC1jaGFuZ2UnLCB7XG5cdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUgLy8gQWxsb3dzIGV2ZW50IHRvIGJ1YmJsZSBvdXRzaWRlIG9mIEN1c3RvbSBFbGVtZW50XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0X2dldFNlbGVjdGVkTWV0cmljKClcblx0e1xuXHRcdC8vIFJldHVybiBCYXNlTWV0cmljIG9iamVjdFxuXHRcdHJldHVybiB0aGlzLl9tZXRyaWNzQnlJZFt0aGlzLl9tZXRyaWNzREQudmFsdWUoKV07XG5cdH1cblxuXHRfaGFuZGxlU3RhdGVDaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnI3RpbWVVbml0U2VsZWN0b3InKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcblx0XHRcdHRoaXMuX21ldHJpY3NERC5lbmFibGUodHJ1ZSk7XG5cblx0XHRcdHN3aXRjaCAodGhpcy5zdGF0ZSlcblx0XHRcdHtcblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORzpcblx0XHRcdFx0XHR0aGlzLl9tZXRyaWNzREQuZW5hYmxlKGZhbHNlKTsgLy8gRGlzYWJsZSBtZXRyaWMgZG9ycGRvd25cblx0XHRcdFx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5zaG93KCk7IC8vIFNob3cgbG9hZGluZyBzcGlubmVyXG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjdGltZVVuaXRTZWxlY3RvcicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7IC8vIERpc2FibGUgdGltZSBzZWxlY3RvclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLnNob3coKTsgLy8gU2hvdyBsb2FkaW5nIGludGVycnVwdGVkIHdhcm5pbmdcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0fVxuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHRjb25zdCBtZXRyaWMgPSB0aGlzLl9nZXRTZWxlY3RlZE1ldHJpYygpO1xuXG5cdFx0XHQvLyBSZXNldCBjaGFydCBkYXRhcHJvdmlkZXJcblx0XHRcdHRoaXMuX2NoYXJ0LmZpbmRTZXJpZXNCeU5hbWUoJ21haW4nKS5kYXRhKG51bGwpO1xuXHRcdFx0dGhpcy5fY2hhcnQuZmluZFNlcmllc0J5TmFtZSgnY29tcGFyZScpLmRhdGEobnVsbCk7XG5cblx0XHRcdC8vIEhpZGUgY2F0ZWdvcnkgYXhpcyBmb3IgXCJjb21wYXJlXCIgc2VyaWVzXG5cdFx0XHR0aGlzLl9jaGFydC5vcHRpb25zLmNhdGVnb3J5QXhpc1sxXS52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBheGlzIGJhc2VkIG9uIHNlbGVjdGVkIHRpbWUgdW5pdFxuXHRcdFx0Y29uc3QgdGltZVVuaXQgPSB0aGlzLmdldFNlbGVjdGVkVGltZVVuaXQoKTtcblx0XHRcdHRoaXMuX2NoYXJ0Lm9wdGlvbnMuY2F0ZWdvcnlBeGlzWzBdLmJhc2VVbml0ID0gdGhpcy5fZ2V0Q2hhcnRCYXNlVW5pdCh0aW1lVW5pdCk7XG5cdFx0XHR0aGlzLl9jaGFydC5vcHRpb25zLmNhdGVnb3J5QXhpc1sxXS5iYXNlVW5pdCA9IHRoaXMuX2dldENoYXJ0QmFzZVVuaXQodGltZVVuaXQpO1xuXG5cdFx0XHQvLyBSZXNldCB2ZXJ0aWNhbCBheGlzXG5cdFx0XHR0aGlzLl9jaGFydC5zZXRPcHRpb25zKHtcblx0XHRcdFx0dmFsdWVBeGlzOiB7XG5cdFx0XHRcdFx0bWluOiAobWV0cmljICE9IG51bGwgJiYgbWV0cmljLmlzUGVyY2VudGFnZSA/IDAgOiB1bmRlZmluZWQpLFxuXHRcdCAgICBcdFx0bWF4OiAobWV0cmljICE9IG51bGwgJiYgbWV0cmljLmlzUGVyY2VudGFnZSA/IDEwMCA6IHVuZGVmaW5lZCksXG5cdFx0XHRcdFx0bGFiZWxzOiB7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiAobWV0cmljICE9IG51bGwgJiYgbWV0cmljLmlzUGVyY2VudGFnZSA/ICd7MH0lJyA6ICd7MH0nKVxuXHQgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSB8fCB0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkUpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGNoYXJ0SWQgPSBtZXRyaWMuaWQ7XG5cblx0XHRcdFx0Ly8gQnVpbGQgbWFpbiBjaGFydCBkYXRhXG5cdFx0XHRcdGNvbnN0IG1haW5DaGFydCA9IHRoaXMuX2NoYXJ0Q29udGFpbmVyLmdldE1haW5DaGFydChjaGFydElkKTtcblx0XHRcdFx0bGV0IG1haW5EUyA9IFtdO1xuXG5cdFx0XHRcdGZvciAobGV0IG10ID0gMDsgbXQgPCBtYWluQ2hhcnQuZGF0YVgubGVuZ3RoOyBtdCsrKVxuXHRcdFx0XHRcdG1haW5EUy5wdXNoKHRoaXMuX2dldENoYXJ0SXRlbShtYWluQ2hhcnQsIG10KSk7XG5cblx0XHRcdFx0Ly8gQXNzaWduIGNoYXJ0IGRhdGEgdG8gY2hhcnRcblx0XHRcdFx0bGV0IHNlcmllcyA9IHRoaXMuX2NoYXJ0LmZpbmRTZXJpZXNCeU5hbWUoJ21haW4nKTtcblx0XHRcdFx0c2VyaWVzLmRhdGEobWFpbkRTKTtcblxuXHRcdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQV9DT01QQVJFKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQnVpbGQgY29tcGFyZSBjaGFydCBkYXRhXG5cdFx0XHRcdFx0Y29uc3QgY29tcENoYXJ0ID0gdGhpcy5fY2hhcnRDb250YWluZXIuZ2V0Q29tcGFyZUNoYXJ0KGNoYXJ0SWQpO1xuXHRcdFx0XHRcdGxldCBjb21wRFMgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAobGV0IG10ID0gMDsgbXQgPCBjb21wQ2hhcnQuZGF0YVgubGVuZ3RoOyBtdCsrKVxuXHRcdFx0XHRcdFx0Y29tcERTLnB1c2godGhpcy5fZ2V0Q2hhcnRJdGVtKGNvbXBDaGFydCwgbXQpKTtcblxuXHRcdFx0XHRcdC8vIFNob3cgY2F0ZWdvcnkgYXhpc1xuXHRcdFx0XHRcdHRoaXMuX2NoYXJ0Lm9wdGlvbnMuY2F0ZWdvcnlBeGlzWzFdLnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly8gQXNzaWduIGNoYXJ0IGRhdGEgdG8gY2hhcnRcblx0XHRcdFx0XHRsZXQgc2VyaWVzID0gdGhpcy5fY2hhcnQuZmluZFNlcmllc0J5TmFtZSgnY29tcGFyZScpO1xuXHRcdFx0XHRcdHNlcmllcy5kYXRhKGNvbXBEUyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY2hhcnQucmVkcmF3KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqIEBwYXJhbSAge2Jvb2xlYW59IGNoZWNrU2VwYXJhdG9yXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gZmlsdGVyRGlzcGxheVZhbHVlMFxuXHQgKi9cblx0ZGlzcGxheUZpbHRlcihmaWx0ZXIsIGNoZWNrU2VwYXJhdG9yLCBmaWx0ZXJEaXNwbGF5VmFsdWUwKVxuXHR7XG5cdFx0dGhpcy5fZmlsdGVyID0gZmlsdGVyO1xuXG5cdFx0aWYgKGZpbHRlci52YWx1ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHRoaXMuZ2V0JCgnI2ZpbHRlck5hbWUnKS50ZXh0KGZpbHRlci5uYW1lKTtcblxuXHRcdFx0bGV0IHZhbHVlcyA9IGNoZWNrU2VwYXJhdG9yID8gZmlsdGVyLnZhbHVlLnNwbGl0KCc6JykgOiBbZmlsdGVyLnZhbHVlXTtcblxuXHRcdFx0aWYgKGZpbHRlckRpc3BsYXlWYWx1ZTAgIT0gbnVsbClcblx0XHRcdFx0dmFsdWVzWzBdID0gZmlsdGVyRGlzcGxheVZhbHVlMDtcblxuXHRcdFx0bGV0IHZhbHVlVHh0ID0gKHZhbHVlc1swXSAhPSAnJyA/IHZhbHVlc1swXSA6ICdbdW5rbm93bl0nKTtcblxuXHRcdFx0aWYgKHZhbHVlcy5sZW5ndGggPiAxKVxuXHRcdFx0XHR2YWx1ZVR4dCArPSAnIDogJyArICh2YWx1ZXNbMV0gIT0gJycgPyB2YWx1ZXNbMV0gOiAnW3Vua25vd25dJyk7XG5cblx0XHRcdHRoaXMuZ2V0JCgnI2ZpbHRlclZhbHVlJykudGV4dCh2YWx1ZVR4dCk7XG5cblx0XHRcdGlmICh2YWx1ZXMubGVuZ3RoID4gMSlcblx0XHRcdFx0dGhpcy5nZXQkKCcjcmVkdWNlRmlsdGVyQnQnKS5zaG93KCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuZ2V0JCgnI3JlZHVjZUZpbHRlckJ0JykuaGlkZSgpO1xuXG5cdFx0XHR0aGlzLmdldCQoJyNmaWx0ZXInKS5zaG93KCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvL2J0X3JlZHVjZUZpbHRlci52aXNpYmxlID0gYnRfcmVkdWNlRmlsdGVyLmluY2x1ZGVJbkxheW91dCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5nZXQkKCcjcmVkdWNlRmlsdGVyQnQnKS5oaWRlKCk7XG5cdFx0XHR0aGlzLmdldCQoJyNmaWx0ZXJOYW1lJykudGV4dCgnJyk7XG5cdFx0XHR0aGlzLmdldCQoJyNmaWx0ZXJWYWx1ZScpLnRleHQoJycpO1xuXHRcdFx0dGhpcy5nZXQkKCcjZmlsdGVyJykuaGlkZSgpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRDaGFydEl0ZW0oY2hhcnRJdGVtRGF0YSwgaW5kZXgpXG5cdHtcblx0XHRsZXQgdmFsdWU7XG5cdFx0bGV0IGZvcm1hdCA9ICcnO1xuXG5cdFx0aWYgKGNoYXJ0SXRlbURhdGEuYmFzZU1ldHJpYy5pc1RpbWUpXG5cdFx0e1xuXHRcdFx0dmFsdWUgPSBtb21lbnQuZHVyYXRpb24oY2hhcnRJdGVtRGF0YS5kYXRhWVtpbmRleF0pLmFzTWludXRlcygpLnRvRml4ZWQoMik7XG5cdFx0XHRmb3JtYXQgPSAnIG1pbnMnO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dmFsdWUgPSBjaGFydEl0ZW1EYXRhLmRhdGFZW2luZGV4XTtcblxuXHRcdFx0aWYgKGNoYXJ0SXRlbURhdGEuYmFzZU1ldHJpYy5pc1BlcmNlbnRhZ2UpXG5cdFx0XHRcdGZvcm1hdCA9ICclJztcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGltZTogY2hhcnRJdGVtRGF0YS5kYXRhWFtpbmRleF0sXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRuYW1lOiBjaGFydEl0ZW1EYXRhLmJhc2VNZXRyaWMubmFtZSxcblx0XHRcdHNob3dIb3VyOiBjaGFydEl0ZW1EYXRhLnRpbWVVbml0ID09ICdISCcsXG5cdFx0XHRmb3JtYXQ6ICd7MH0nICsgZm9ybWF0XG5cdFx0fVxuXHR9XG5cblx0X2dldENoYXJ0QmFzZVVuaXQodGltZVVuaXQpXG5cdHtcblx0XHRzd2l0Y2ggKHRpbWVVbml0KSB7XG5cdFx0XHRjYXNlICdISCc6XG5cdFx0XHRcdHJldHVybiAnaG91cnMnXG5cdFx0XHRjYXNlICdERCc6XG5cdFx0XHRcdHJldHVybiAnZGF5cydcblx0XHRcdGNhc2UgJ1dXJzpcblx0XHRcdFx0cmV0dXJuICd3ZWVrcydcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiAnbW9udGhzJ1xuXHRcdH1cblx0fVxuXG5cdF9vblJlZHVjZUZpbHRlckNsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9maWx0ZXIgIT0gbnVsbCAmJiB0aGlzLl9maWx0ZXIudmFsdWUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLl9maWx0ZXIudmFsdWUuc3BsaXQoJzonKTtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KHRoaXMuX2ZpbHRlci5uYW1lLCB2YWx1ZXNbMF0sIGZhbHNlKSApO1xuXHRcdH1cblx0fVxuXG5cdF9vblJlbW92ZUZpbHRlckNsaWNrKClcblx0e1xuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggbmV3IEZpbHRlclNldEV2ZW50KG51bGwsIG51bGwsIGZhbHNlKSApO1xuXHR9XG5cblx0X29uV2luZG93UmVzaXplKClcblx0e1xuXHRcdHRoaXMuX2NoYXJ0LnJlZHJhdygpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnbWFpbi1jaGFydCcpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdtYWluLWNoYXJ0JywgTWFpbkNoYXJ0KTtcbiIsImV4cG9ydCBjbGFzcyBNZXRyaWNEaXNwbGF5U3RhdGVcbntcblx0c3RhdGljIGdldCBFTVBUWSgpIHsgcmV0dXJuICdlbXB0eScgfVxuXHRzdGF0aWMgZ2V0IE1JU1NJTkcoKSB7IHJldHVybiAnbWlzc2luZycgfVxuXHRzdGF0aWMgZ2V0IExPQURJTkcoKSB7IHJldHVybiAnbG9hZGluZycgfVxuXHRzdGF0aWMgZ2V0IERBVEEoKSB7IHJldHVybiAnZGF0YScgfVxuXHRzdGF0aWMgZ2V0IERBVEFfQ09NUEFSRSgpIHsgcmV0dXJuICdkYXRhQ29tcGFyZScgfVxufVxuIiwiaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcblxuZXhwb3J0IGNsYXNzIE1ldHJpY0xpc3RJdGVtIGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdC52YWx1ZSB7XG5cdFx0XHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PGRpdiBpZD1cImNvbnRhaW5lclwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IG15LTFcIj5cblx0XHRcdFx0PGkgaWQ9XCJpY29uXCIgY2xhc3M9XCJmYXMgZmEtY2hhcnQtYXJlYSBtci0xIG10LTEgaWNvbi1pbnZpc2libGVcIj48L2k+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwiaGVhZGVyXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBpZD1cIm5hbWVcIiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgc2hvdy10b29sdGlwXCIgdGl0bGU9XCJcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUtbm90Y2ggZmEtc3BpbiB0ZXh0LXNlY29uZGFyeSBhbGlnbi1taWRkbGUgbG9hZGluZy1zcGlubmVyIG1sLTJcIj48L2k+XG5cdFx0XHRcdFx0XHQ8aSBpZD1cIndhcm5pbmdcIiBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC13YXJuaW5nIHNob3ctdG9vbHRpcCBtbC0yXCIgdGl0bGU9XCJEYXRhIGxvYWRpbmcgaW50ZXJydXB0ZWRcIj48L2k+XG5cdFx0XHRcdFx0XHQ8c3Ryb25nIGNsYXNzPVwibWwtMlwiPjxzcGFuIGlkPVwidmFsdWVcIj48L3NwYW4+PC9zdHJvbmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwib3ZlcmFsbFwiPlxuXHRcdFx0XHRcdFx0PHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPk92ZXJhbGw6IDxzdHJvbmcgaWQ9b3ZlcmFsbFZhbHVlPjwvc3Ryb25nPiA8c3BhbiBpZD1cIm92ZXJhbGxQZXJjXCI+PC9zcGFuPjwvc21hbGw+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGlkPVwidmVyc3VzXCI+XG5cdFx0XHRcdFx0XHQ8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmcgaWQ9XCJ2YWx1ZTNcIiBjbGFzcz1cIm1ldHJpY01haW5cIj48L3N0cm9uZz5cblx0XHRcdFx0XHRcdFx0PHNwYW4+dnM8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmcgaWQ9XCJ2YWx1ZTRcIiBjbGFzcz1cIm1ldHJpY0NvbXBhcmVcIj48L3N0cm9uZz5cblx0XHRcdFx0XHRcdDwvc21hbGw+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblxuXHRcdC8vIEhpZGUgbG9hZGluZyBzcGlubmVyIGFuZCB3YXJuaW5nXG5cdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdHRoaXMuZ2V0JCgnI3dhcm5pbmcnKS5oaWRlKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIGhlbHAgdG9vbHRpcHNcblx0XHR0aGlzLmdldCQoJyNoZWFkZXInKS5rZW5kb1Rvb2x0aXAoe1xuXHRcdFx0ZmlsdGVyOiAnaVt0aXRsZV0uaGVscCwgLnNob3ctdG9vbHRpcFt0aXRsZV0nLFxuXHRcdFx0cG9zaXRpb246ICdyaWdodCcsXG5cdFx0XHRjb250ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHJldHVybiBgPGRpdiBjbGFzcz0naGVscC10b29sdGlwJz4ke2UudGFyZ2V0LmRhdGEoJ3RpdGxlJyl9PC9kaXY+YDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGdldCBuYW1lKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9uYW1lO1xuXHR9XG5cblx0Z2V0IGhhc0NoYXJ0KClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9oYXNDaGFydDtcblx0fVxuXG5cdGdldCBzdGF0ZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cdH1cblxuXHRzZXQgc3RhdGUodmFsdWUpXG5cdHtcblx0XHRpZiAodmFsdWUgIT0gdGhpcy5zdGF0ZSlcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUpXG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHZhbHVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZSBjaGFuZ2Vcblx0XHRcdHRoaXMuX2hhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gdmlld0lkXG4gXHQgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiBcdCAqIEBwYXJhbSAge2Jvb2xlYW59IGhhc0NoYXJ0XG5cdCAqIEBwYXJhbSAge01ldHJpY30gbU1haW5cblx0ICogQHBhcmFtICB7TWV0cmljfSBtQ29tcGFyZVxuIFx0ICogQHBhcmFtICB7Ym9vbGVhbn0gaXNPdmVydmlld1xuXHQgKi9cblx0aW5pdCh2aWV3SWQsIG5hbWUsIGhhc0NoYXJ0LCBtTWFpbiwgbUNvbXBhcmUsIGlzT3ZlcnZpZXcpXG5cdHtcblx0XHR0aGlzLl92aWV3SWQgPSB2aWV3SWQ7XG5cdFx0dGhpcy5fbmFtZSA9IG5hbWU7XG5cdFx0dGhpcy5faGFzQ2hhcnQgPSBoYXNDaGFydDtcblx0XHR0aGlzLl9tTWFpbiA9IG1NYWluO1xuXHRcdHRoaXMuX21Db21wYXJlID0gbUNvbXBhcmU7XG5cdFx0dGhpcy5pc092ZXJ2aWV3ID0gaXNPdmVydmlldztcblxuXHRcdGNvbnN0IGJhc2VNZXRyaWMgPSBtTWFpbi5iYXNlTWV0cmljO1xuXG5cdFx0Ly8gU2hvdyBpY29uXG5cdFx0aWYgKGhhc0NoYXJ0KVxuXHRcdFx0dGhpcy5nZXQkKCcjaWNvbicpLnJlbW92ZUNsYXNzKCdpY29uLWludmlzaWJsZScpO1xuXG5cdFx0Ly8gU2V0IG5hbWVcblx0XHR0aGlzLmdldCQoJyNuYW1lJykudGV4dChiYXNlTWV0cmljLm5hbWUgKyAnOicpO1xuXG5cdFx0Ly8gU2V0IHRvb2x0aXBcblx0XHR0aGlzLmdldCQoJyNuYW1lJykuYXR0cigndGl0bGUnLCBgPHN0cm9uZz4ke2Jhc2VNZXRyaWMubmFtZX08L3N0cm9uZz48YnIvPiR7YmFzZU1ldHJpYy5kZXNjcmlwdGlvbn1gKTtcblxuXHRcdHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG5cdFx0Ly8gUmVmcmVzaFxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHR0aGlzLmdldCQoJyN2YWx1ZScpLnRleHQoJycpO1xuXHRcdFx0dGhpcy5nZXQkKCcjdmFsdWUnKS5yZW1vdmVDbGFzcygpO1xuXG5cdFx0XHR0aGlzLmdldCQoJyNvdmVyYWxsJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjdmVyc3VzJykuaGlkZSgpO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSB8fCB0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkUpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IHNob3dDb21wYXJlID0gKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRSk7XG5cblx0XHRcdFx0aWYgKHNob3dDb21wYXJlKVxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZlcnN1cycpLnNob3coKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI292ZXJhbGwnKS5zaG93KCk7XG5cblx0XHRcdFx0aWYgKCFzaG93Q29tcGFyZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIFNldCBtYWluIHZhbHVlXG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjdmFsdWUnKS50ZXh0KHRoaXMuX21NYWluLmdldFZhbHVlRlN0cmluZygpKTtcblxuXHRcdFx0XHRcdC8vIFNob3cgcGVyY2VudGFnZSBvZiBvdmVyYWxsIHZhbHVlIChleGNlcHQgaWYgY3VycmVudCB2aWV3IGlzIE92ZXJ2aWV3KVxuXHRcdFx0XHRcdGlmICghdGhpcy5pc092ZXJ2aWV3KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0JCgnI292ZXJhbGxWYWx1ZScpLnRleHQodGhpcy5fbU1haW4uZ2V0VmFsdWVTdHJpbmcoKSk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHBlcmMgPSB0aGlzLl9tTWFpbi5nZXRWYWx1ZUYoKSAvIHRoaXMuX21NYWluLmdldFZhbHVlKCkgKiAxMDA7XG5cdFx0XHRcdFx0XHR0aGlzLmdldCQoJyNvdmVyYWxsUGVyYycpLnRleHQodGhpcy5fbU1haW4uZ2V0VmFsdWUoKSA+IDAgPyBgKCR7cGVyYy50b0ZpeGVkKDIpfSUpYCA6ICcnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5nZXQkKCcjb3ZlcmFsbCcpLmhpZGUoKTtcblxuXHRcdFx0XHRcdC8vIFNldCBzdHlsZVxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlJykuYWRkQ2xhc3MoJ21ldHJpY01haW4gdmFsdWUnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBMYWJlbDogKy8tICUgKHZhbHVlMyB2cyB2YWx1ZTQpXG5cblx0XHRcdFx0XHQvLyBTZXQgbWFpbiB2YWx1ZVxuXHRcdFx0XHRcdGNvbnN0IHZhbE1haW4gPSBNYXRoLm1heCh0aGlzLl9tTWFpbi5nZXRWYWx1ZUYoKSwgMCk7XG5cdFx0XHRcdFx0Y29uc3QgdmFsQ29tcCA9IE1hdGgubWF4KHRoaXMuX21Db21wYXJlLmdldFZhbHVlRigpLCAwKTtcblxuXHRcdFx0XHRcdGxldCBwZXJjMTtcblxuXHRcdFx0XHRcdGlmICh2YWxNYWluID4gMCAmJiB2YWxDb21wID09IDApXG5cdFx0XHRcdFx0XHRwZXJjMSA9IDEwMDtcblx0XHRcdFx0XHRlbHNlIGlmICh2YWxNYWluID09IDAgJiYgdmFsQ29tcCA+IDApXG5cdFx0XHRcdFx0XHRwZXJjMSA9IC0xMDA7XG5cdFx0XHRcdFx0ZWxzZSBpZiAodmFsTWFpbiA9PSAwICYmIHZhbENvbXAgPT0gMClcblx0XHRcdFx0XHRcdHBlcmMxID0gMDtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRwZXJjMSA9ICh2YWxNYWluIC8gdmFsQ29tcCAqIDEwMCkgLSAxMDA7XG5cblx0XHRcdFx0XHR0aGlzLmdldCQoJyN2YWx1ZScpLnRleHQoKHBlcmMxID4gMCA/ICcrJyA6ICcnKSArIHBlcmMxLnRvRml4ZWQoMikgKyAnJScpO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHZlcnN1c1xuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlMycpLnRleHQodGhpcy5fbU1haW4uZ2V0VmFsdWVGU3RyaW5nKCkpO1xuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlNCcpLnRleHQodGhpcy5fbUNvbXBhcmUuZ2V0VmFsdWVGU3RyaW5nKCkpO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHN0eWxlXG5cdFx0XHRcdFx0aWYgKHBlcmMxID4gMClcblx0XHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlJykuYWRkQ2xhc3MoJ3RleHQtc3VjY2VzcyB2YWx1ZScpO1xuXHRcdFx0XHRcdGVsc2UgaWYgKHBlcmMxIDwgMClcblx0XHRcdFx0XHRcdHRoaXMuZ2V0JCgnI3ZhbHVlJykuYWRkQ2xhc3MoJ3RleHQtZGFuZ2VyIHZhbHVlJyk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5nZXQkKCcjdmFsdWUnKS5hZGRDbGFzcygndGV4dC1kYXJrIHZhbHVlJyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfaGFuZGxlU3RhdGVDaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLmhpZGUoKTtcblxuXHRcdFx0dGhpcy5nZXQkKCcjY29udGFpbmVyJykucmVtb3ZlQ2xhc3MoJ3Nob3ctcG9pbnRlcicpO1xuXHRcdFx0JCh0aGlzKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHRcdHN3aXRjaCAodGhpcy5zdGF0ZSlcblx0XHRcdHtcblx0XHRcdFx0Y2FzZSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORzpcblx0XHRcdFx0XHR0aGlzLmdldCQoJy5sb2FkaW5nLXNwaW5uZXInKS5zaG93KCk7IC8vIFNob3cgbG9hZGluZyBzcGlubmVyXG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjY29udGFpbmVyJykucmVtb3ZlQ2xhc3MoJ3Nob3ctcG9pbnRlcicpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLnNob3coKTsgLy8gU2hvdyBsb2FkaW5nIGludGVycnVwdGVkIHdhcm5pbmdcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBOlxuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkU6XG5cdFx0XHRcdFx0aWYgKHRoaXMuaGFzQ2hhcnQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGhpcy5nZXQkKCcjY29udGFpbmVyJykuYWRkQ2xhc3MoJ3Nob3ctcG9pbnRlcicpO1xuXHRcdFx0XHRcdFx0JCh0aGlzKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uTWV0cmljQ2xpY2ssIHRoaXMpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vbk1ldHJpY0NsaWNrKClcblx0e1xuXHRcdGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdtZXRyaWMtY2xpY2snLCB7XG5cdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUgLy8gQWxsb3dzIGV2ZW50IHRvIGJ1YmJsZSBvdXRzaWRlIG9mIEN1c3RvbSBFbGVtZW50XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnbWV0cmljLWxpc3QtaXRlbScpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdtZXRyaWMtbGlzdC1pdGVtJywgTWV0cmljTGlzdEl0ZW0pO1xuIiwiaW1wb3J0IHtCYXNlQ2hhcnRWaWV3fSBmcm9tICcuLi9iYXNlLWNoYXJ0LXZpZXcnO1xuaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi4vbWV0cmljLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHtGaWx0ZXJTZXRFdmVudH0gZnJvbSAnLi4vZmlsdGVyLWV2ZW50JztcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgY2xhc3MgVGVjaG5vbG9neUNoYXJ0VmlldyBleHRlbmRzIEJhc2VDaGFydFZpZXdcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSlcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KHRoaXMuX3RhYmxlRGF0YS5kYXRhKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fZHJhd0NoYXJ0KG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdF9kcmF3Q2hhcnQoY2hhcnREYXRhKVxuXHR7XG5cdFx0Y29uc3QgbWV0cmljID0gdGhpcy5nZXRTZWxlY3RlZE1ldHJpYygpO1xuXG5cdFx0aWYgKGNoYXJ0RGF0YSAhPSBudWxsICYmIGNoYXJ0RGF0YS5sZW5ndGggPiAwICYmIG1ldHJpYyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXG5cdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdHtcblx0XHRcdCBcdGNoYXJ0RGF0YSA9IGNoYXJ0RGF0YS5maWx0ZXIob2JqID0+IHtcblx0XHRcdFx0XHRsZXQgdmFsdWVzID0gdGhpcy5fZmlsdGVyLnZhbHVlLnNwbGl0KCc6Jyk7XG5cblx0XHRcdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9iai5wbGF0Zm9ybSArICc6JyArIG9iai52ZXJzaW9uID09IHRoaXMuX2ZpbHRlci52YWx1ZSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai5wbGF0Zm9ybSA9PSB0aGlzLl9maWx0ZXIudmFsdWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTb3J0IGFuZCBleHRyYWN0IHRvcCAxMCB2YWx1ZXNcblx0XHRcdGxldCBkYXRhID0gY2hhcnREYXRhLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYlttZXRyaWMuaWRdIC0gYVttZXRyaWMuaWRdIH0pLnNsaWNlKDAsIDEwKTtcblxuXHRcdFx0Ly8gSVNTVUUhISEhISEhXG5cdFx0XHQvLyBJZiB0aGUgbWV0cmljIGlkIHN0YXJ0cyB3aXRoIFwiJVwiLCBLZW5kbyBjaGFydCBjcmFzaGVzXG5cdFx0XHQvLyBGb3IgdGhpcyByZWFzb24gaW5zdGVhZCBvZiBzaW1wbHkgc2V0dGluZyB0aGUgc2VyaWVzIGZpZWxkIGFuZCBjYXRlZ29yeSBmaWVsZCwgd2UgbmVlZCB0byByZWJ1aWxkIHRoZSBzZXJpZXMgZGF0YSBpdGVtcyBmcm9tIHRoZSBjaGFydCBkYXRhXG5cdFx0XHQvLyAobm90ZTogZm9yIHRpbWUgbWV0cmljcywgdmFsdWUgaXMgY29udmVydGVkIGZyb20gbWlsbGlzIHRvIG1pbnV0ZXMpXG5cblx0XHRcdGRhdGEgPSBkYXRhLm1hcChvYmogPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHBsYXRmb3JtOiBvYmpbJ3BsYXRmb3JtJ10sXG5cdFx0XHRcdFx0dmVyc2lvbjogb2JqWyd2ZXJzaW9uJ10sXG5cdFx0XHRcdFx0aXRlbTogb2JqWydwbGF0Zm9ybSddICsgKG9ialsndmVyc2lvbiddICE9ICcnID8gJyB8ICcgKyBvYmpbJ3ZlcnNpb24nXSA6ICcnKSxcblx0XHRcdFx0XHR2YWx1ZTogKCFtZXRyaWMuaXNUaW1lID8gb2JqW21ldHJpYy5pZF0gOiBtb21lbnQuZHVyYXRpb24ob2JqW21ldHJpYy5pZF0pLmFzTWludXRlcygpLnRvRml4ZWQoMikpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGRhdGEgc291cmNlXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBjaGFydFxuXHRcdFx0bGV0IHZhbHVlQXhpc1RlbXBsYXRlID0gJyM6IHZhbHVlICMnO1xuXHRcdFx0bGV0IHNlcmllc0Zvcm1hdCA9ICd7MH0nO1xuXG5cdFx0XHRpZiAobWV0cmljLmlzUGVyY2VudGFnZSlcblx0XHRcdHtcblx0XHRcdFx0dmFsdWVBeGlzVGVtcGxhdGUgPSAnIzogdmFsdWUgIyUnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9JSc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChtZXRyaWMuaXNUaW1lKVxuXHRcdFx0e1xuXHRcdFx0XHR2YWx1ZUF4aXNUZW1wbGF0ZSA9ICcjOiB2YWx1ZSAjIG1pbnMnO1xuXHRcdFx0XHRzZXJpZXNGb3JtYXQgPSAnezB9IG1pbnMnO1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5fY2hhcnQuc2V0T3B0aW9ucyh7XG5cdFx0XHRcdGNoYXJ0QXJlYToge1xuXHRcdFx0XHRcdGhlaWdodDogKGRhdGEubGVuZ3RoICogNDUgKyA1MCksIC8vKCFpc0ZpbHRlcmVkID8gNTAwIDogMTAwKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlcmllczogW3tcblx0XHRcdFx0XHRuYW1lOiBtZXRyaWMubmFtZSxcblx0XHRcdFx0XHRmaWVsZDogJ3ZhbHVlJyxcblx0XHRcdFx0XHRjYXRlZ29yeUZpZWxkOiAnaXRlbScsXG5cdFx0XHRcdFx0Zm9ybWF0OiBzZXJpZXNGb3JtYXRcblx0XHRcdFx0fV0sXG5cdFx0XHRcdHZhbHVlQXhpczoge1xuXHRcdFx0XHRcdG1heDogKG1ldHJpYy5pc1BlcmNlbnRhZ2UgPyAxMDAgOiB1bmRlZmluZWQpLFxuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IHZhbHVlQXhpc1RlbXBsYXRlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2F0ZWdvcnlBeGlzOiBbe1xuXHRcdFx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb2JqLmRhdGFJdGVtLnBsYXRmb3JtICsgJ1xcblZlcnNpb246ICcgKyAob2JqLmRhdGFJdGVtLnZlcnNpb24gIT0gJycgPyBvYmouZGF0YUl0ZW0udmVyc2lvbiA6ICdbdW5rbm93bl0nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9XSxcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBTZXQgY2hhcnQgZGF0YSBzb3VyY2Vcblx0XHRcdHRoaXMuX2NoYXJ0LnNldERhdGFTb3VyY2UoZHMpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aGlzLl9jaGFydC5zZXREYXRhU291cmNlKFtdKTtcblx0fVxuXG5cdG9uU2VyaWVzQ2xpY2soZSlcblx0e1xuXHRcdGxldCBwdiA9IGAke2UuZGF0YUl0ZW0ucGxhdGZvcm19OiR7ZS5kYXRhSXRlbS52ZXJzaW9ufWA7XG5cblx0XHRpZiAodGhpcy5fZmlsdGVyID09IG51bGwgfHwgdGhpcy5fZmlsdGVyLnZhbHVlICE9IHB2KVxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCBuZXcgRmlsdGVyU2V0RXZlbnQoJ2NsaWVudCcsIHB2LCB0cnVlKSApO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndGVjaG5vbG9neS1jaGFydC12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3RlY2hub2xvZ3ktY2hhcnQtdmlldycsIFRlY2hub2xvZ3lDaGFydFZpZXcpO1xuIiwiaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi4vYW5hbHl0aWNzLWJhc2UtZWxlbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBUZWNobm9sb2d5UHJvQWR2IGV4dGVuZHMgQW5hbHl0aWNzQmFzZUVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQWRkIGh0bWwgdG8gc2hhZG93Um9vdCBkZWZpbmVkIGluIHBhcmVudCBjbGFzcyAoQW5hbHl0aWNzQmFzZUVsZW1lbnQpXG5cdFx0dGhpcy5zaGFkb3dSb290LmlubmVySFRNTCArPSBgXG5cdFx0PHN0eWxlPlxuXHRcdFx0LmNhcmQge1xuXHRcdFx0XHRtYXgtd2lkdGg6IDE4cmVtO1xuXHRcdFx0fVxuXHRcdDwvc3R5bGU+XG5cblx0XHQ8ZGl2PlxuXHRcdFx0PGg1IGNsYXNzPVwidGV4dC1jZW50ZXIgbXktM1wiPlVwZ3JhZGUgdG8gPHN0cm9uZz5BbmFseXRpY3MgUHJvPC9zdHJvbmc+IHRvIGVuYWJsZSB0ZWNobm9sb2dpY2FsIHZpZXcgb24gdGhlIG1ldHJpY3MqIGFuZCBnZXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8L2g1PlxuXHRcdFx0PGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC1sZy00XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItbGlnaHQgbXktMyBteC1hdXRvXCI+XG5cdFx0XHRcdFx0XHRcdDxpbWcgY2xhc3M9XCJjYXJkLWltZy10b3BcIiBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuYWx5dGljcy1hZHYvdGVjaG5vbG9neVRhYmxlLnBuZ1wiIGFsdD1cIlRhYnVsYXIgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5WaWV3IG1ldHJpY3MgaW4gdGFidWxhciBmb3JtLCBzcGxpdCBieSBjbGllbnQgcGxhdGZvcm07IGRyaWxsIGRvd24gdG8gY2xpZW50IHZlcnNpb24gYW5kIGZpbHRlciBkYXRhIGluIG9uZSBjbGljay48L3A+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhcmQtaW1nLXRvcFwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5hbHl0aWNzLWFkdi90ZWNobm9sb2d5Q2hhcnQucG5nXCIgYWx0PVwiVG9wIGNsaWVudHNcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FyZC10ZXh0XCI+VmlldyB0b3AgY2xpZW50IHBsYXRmb3JtcyBjaGFydCBmb3IgZWFjaCBtZXRyaWM7IGRyaWxsIGRvd24gdG8gY2xpZW50IHZlcnNpb24gYW5kIGZpbHRlciBkYXRhIGluIG9uZSBjbGljay48L3A+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhcmQtaW1nLXRvcFwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5hbHl0aWNzLWFkdi90ZWNobm9sb2d5RmlsdGVyLnBuZ1wiIGFsdD1cIkZpbHRlciBieSBjbGllbnQgdHlwZVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5GaWx0ZXIgbWV0cmljcyBieSBjbGllbnQgdHlwZSwgZ2V0dGluZyB0aGUgYWJzb2x1dGUgdmFsdWUgYW5kIHRoZSAlIHdpdGggcmVzcGVjdCB0byB0aGUgb3ZlcmFsbCB2YWx1ZS48L3A+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLWxnLTRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1saWdodCBteS0zIG14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhcmQtaW1nLXRvcFwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5hbHl0aWNzLWFkdi9jb21wYXJlLnBuZ1wiIGFsdD1cIkNvbXBhcmUgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5Db21wYXJlIGRhdGEgcmFuZ2VzIGFuZCBnZXQgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVzZXJzIGJlaGF2aW9yIGluIGRpZmZlcmVudCB0aW1lIHBlcmlvZHMsIG92ZXJhbGwgYW5kIGJ5IGNsaWVudCBwbGF0Zm9ybS92ZXJzaW9uLjwvcD5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNiBjb2wtbGctNFwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLWxpZ2h0IG15LTMgbXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHQ8aW1nIGNsYXNzPVwiY2FyZC1pbWctdG9wXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmFseXRpY3MtYWR2L3RlY2hub2xvZ3lDb21wYXJlLnBuZ1wiIGFsdD1cIkNvbXBhcmUgZGF0YVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJjYXJkLXRleHRcIj5Db21wYXJlIGRhdGEgcmFuZ2VzIGFuZCBnZXQgcGVyIG1ldHJpYyBiZWhhdmlvciBvdmVyIGRpZmZlcmVudCB0aW1lIHBlcmlvZHMsIG92ZXJhbGwgYW5kIGJ5IGNsaWVudCBwbGF0Zm9ybS92ZXJzaW9uLjwvcD5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxoNSBjbGFzcz1cIm10LTIgbWItMyB0ZXh0LWNlbnRlclwiPjxhIGhyZWY9XCJodHRwczovL3d3dy5zbWFydGZveHNlcnZlci5jb20vc2hvcC9pbmRleC5waHA/ZGlzcGF0Y2g9cHJvZHVjdHMudmlldyZwcm9kdWN0X2lkPTMxXCIgdGFyZ2V0PVwiX2JsYW5rXCI+Q2xpY2sgaGVyZSB0byB1cGdyYWRlPC9hPjwvaDU+XG5cdFx0XHQ8cCBjbGFzcz1cInRleHQtY2VudGVyIG15LTBcIj48c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+KiBBdmFpbGFibGUgbWV0cmljczogVmlzaXRzIHwgVW5pcXVlIHZpc2l0b3JzIHwgTmV3IHZpc2l0b3JzIHwgTmV3IHZpc2l0cyAlIHwgQXZnLiB2aXNpdCBkdXJhdGlvbjwvc21hbGw+PC9wPlxuXHRcdDwvZGl2PlxuXHRcdGA7XG5cdH1cbn1cblxuLy8gREVGSU5FIENPTVBPTkVOVFxuaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KCd0ZWNobm9sb2d5LXByby1hZHYnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgndGVjaG5vbG9neS1wcm8tYWR2JywgVGVjaG5vbG9neVByb0Fkdik7XG4iLCJpbXBvcnQge0Jhc2VUYWJsZVZpZXd9IGZyb20gJy4uL2Jhc2UtdGFibGUtdmlldyc7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi4vbWV0cmljLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHtNZXRyaWNzTWFuYWdlcn0gZnJvbSAnLi4vLi4vLi4vLi4vbWFuYWdlcnMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tZXRyaWNzLW1hbmFnZXInO1xuaW1wb3J0IHtGaWx0ZXJTZXRFdmVudH0gZnJvbSAnLi4vZmlsdGVyLWV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRlY2hub2xvZ3lUYWJsZVZpZXcgZXh0ZW5kcyBCYXNlVGFibGVWaWV3XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblx0fVxuXG5cdHJlZnJlc2goKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEEpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJWYWx1ZXMgPSBpc0ZpbHRlcmVkID8gdGhpcy5fZmlsdGVyLnZhbHVlLnNwbGl0KCc6JykgOiBbXTtcblxuXHRcdFx0XHQvLyBJZiBmaWx0ZXIgaXMgc2V0IGFuZCBoYXMgbXVsdGlwbGUgdmFsdWVzLCBkaXNhYmxlIGdyaWQgc2VsZWN0aW9uXG5cdFx0XHRcdHRoaXMuc2V0VGFibGVTZWxlY3RhYmxlKCEoaXNGaWx0ZXJlZCAmJiBmaWx0ZXJWYWx1ZXMubGVuZ3RoID4gMSkpO1xuXG5cdFx0XHRcdC8vIFNldCBmaWx0ZXJpbmdcblx0XHRcdFx0Y29uc3QgZHNGaWx0ZXIgPSBbXTtcblxuXHRcdFx0XHRpZiAoaXNGaWx0ZXJlZClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRzRmlsdGVyLnB1c2goe1xuXHRcdFx0XHRcdFx0ZmllbGQ6ICdwbGF0Zm9ybScsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogZmlsdGVyVmFsdWVzWzBdXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoZmlsdGVyVmFsdWVzLmxlbmd0aCA+IDEpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0ZHNGaWx0ZXIucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGZpZWxkOiAndmVyc2lvbicsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogZmlsdGVyVmFsdWVzWzFdXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBc3NpZ24gZGF0YXByb3ZpZGVyIHRvIGdyaWRcblx0XHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdFx0ZmlsdGVyOiBkc0ZpbHRlcixcblx0XHRcdFx0XHRzb3J0OiB7XG5cdFx0XHRcdFx0XHRmaWVsZDogJ3Zpc2l0cycsXG5cdFx0XHRcdFx0XHRkaXI6ICdkZXNjJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZGF0YTogdGhpcy5fdGFibGVEYXRhLmRhdGEsXG5cdFx0XHRcdFx0Z3JvdXA6IHtcblx0XHRcdFx0XHRcdGZpZWxkOiAncGxhdGZvcm0nLCBhZ2dyZWdhdGVzOiBbXG5cdFx0XHRcdFx0XHRcdHtmaWVsZDogJ3ZlcnNpb24nLCBhZ2dyZWdhdGU6ICdjb3VudCd9LFxuXHRcdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHRcdHtmaWVsZDogTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLCBhZ2dyZWdhdGU6ICdzdW0nfSxcblx0XHRcdFx0XHRcdFx0e2ZpZWxkOiBNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMsIGFnZ3JlZ2F0ZTogJ3N1bSd9LFxuXHRcdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTiwgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHRdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogW1xuXHRcdFx0XHRcdFx0e2ZpZWxkOiAndmVyc2lvbicsIGFnZ3JlZ2F0ZTogJ2NvdW50J30sXG5cdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUywgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XHR7ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTiwgYWdncmVnYXRlOiAnc3VtJ30sXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLl9ncmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdFx0XHRcdC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBncm91cCBoZWFkZXIgcm93c1xuXHRcdFx0XHR0aGlzLmdldCQoJyNncmlkJykuZmluZCgnLmstZ3JvdXBpbmctcm93Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkdyb3VwSGVhZGVyQ2xpY2ssIHRoaXMpKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5fZ3JpZC5zZXREYXRhU291cmNlKFtdKTtcblx0XHR9XG5cdH1cblxuXHRfb25Hcm91cEhlYWRlckNsaWNrKGUpXG5cdHtcblx0XHQvLyBJZiBleHBhbmQvY29sbGFwc2UgaWNvbiBpcyBjbGlja2VkLCBkbyBub3QgZmlyZSBldmVudFxuXHRcdGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2staWNvbicpKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzRmlsdGVyZWQgPSAodGhpcy5fZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fZmlsdGVyLnZhbHVlICE9IG51bGwpO1xuXHRcdFx0Y29uc3QgcGxhdGZvcm0gPSAkKGUuY3VycmVudFRhcmdldCkuZmluZCgnLmdyb3VwLWhlYWRlcicpLmF0dHIoJ2RhdGEtcGxhdGZvcm0nKTtcblxuXHRcdFx0aWYgKCFpc0ZpbHRlcmVkICYmIHBsYXRmb3JtKVxuXHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIG5ldyBGaWx0ZXJTZXRFdmVudCgnY2xpZW50JywgcGxhdGZvcm0sIHRydWUpICk7XG5cdFx0fVxuXHR9XG5cblx0b25JdGVtQ2xpY2soKVxuXHR7XG5cdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fZ3JpZC5kYXRhSXRlbSh0aGlzLl9ncmlkLnNlbGVjdCgpKTtcblxuXHRcdGlmIChkYXRhSXRlbSAhPSBudWxsKVxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCBuZXcgRmlsdGVyU2V0RXZlbnQoJ2NsaWVudCcsIGAke2RhdGFJdGVtLnBsYXRmb3JtfToke2RhdGFJdGVtLnZlcnNpb259YCwgdHJ1ZSkgKTtcblx0fVxuXG5cdGNvbmZpZ3VyZUNvbHVtbnMoKVxuXHR7XG5cdFx0dGhpcy5fZ3JpZC5zZXRPcHRpb25zKHtcblx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdGZpZWxkOiAncGxhdGZvcm0nLFxuXHRcdFx0XHR0aXRsZTogJ1BsYXRmb3JtJyxcblx0XHRcdFx0Z3JvdXBIZWFkZXJUZW1wbGF0ZTogJzxzcGFuIGNsYXNzPVwiZ3JvdXAtaGVhZGVyXCIgZGF0YS1wbGF0Zm9ybT1cIiM9dmFsdWUjXCI+Iz12YWx1ZSM8L3NwYW4+Jyxcblx0XHRcdFx0aGlkZGVuOiB0cnVlLFxuXHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRpZiAoZGF0YUl0ZW0ucGxhdGZvcm0gPT0gJycpXG5cdFx0XHRcdFx0XHRyZXR1cm4gJ1t1bmtub3duXSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGRhdGFJdGVtLnBsYXRmb3JtO1xuXHRcdFx0XHR9XG5cdFx0XHR9LHtcblx0XHRcdFx0ZmllbGQ6ICd2ZXJzaW9uJyxcblx0XHRcdFx0dGl0bGU6ICdQbGF0Zm9ybSAvIFZlcnNpb24nLFxuXHRcdFx0XHR3aWR0aDogMjAwLFxuXHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRpZiAoZGF0YUl0ZW0udmVyc2lvbiA9PSAnJylcblx0XHRcdFx0XHRcdHJldHVybiAnW3Vua25vd25dJztcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gZGF0YUl0ZW0udmVyc2lvbjtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdWaXNpdHMnLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5WSVNJVFMsXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlZJU0lUUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFnZ3JlZ2F0ZXM6IFsnc3VtJ10sXG5cdFx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtVmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMpKSxcblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlZJU0lUUyxcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuVklTSVRTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0XHRncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiB0aGlzLmdldEFnZ3JTdW1QZXJjZW50YWdlQ29sVGVtcGxhdGUxKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlZJU0lUUykpXG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZTogJ1VuaXF1ZSB2aXNpdG9ycycsXG5cdFx0XHRcdGNvbHVtbnM6IFt7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUyxcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0XHRncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiB0aGlzLmdldEFnZ3JTdW1WYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUykpLFxuXHRcdFx0XHR9LHtcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhZ2dyZWdhdGVzOiBbJ3N1bSddLFxuXHRcdFx0XHRcdGdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGU6IHRoaXMuZ2V0QWdnclN1bVBlcmNlbnRhZ2VDb2xUZW1wbGF0ZTEodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTKSlcblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiAnTmV3IHZpc2l0b3JzJyxcblx0XHRcdFx0Y29sdW1uczogW3tcblx0XHRcdFx0XHRmaWVsZDogTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTLFxuXHRcdFx0XHRcdHRpdGxlOiAnVG90YWwnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0VmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhZ2dyZWdhdGVzOiBbJ3N1bSddLFxuXHRcdFx0XHRcdGdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGU6IHRoaXMuZ2V0QWdnclN1bVZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTKSksXG5cdFx0XHRcdH0se1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMsXG5cdFx0XHRcdFx0dGl0bGU6ICdPdmVyYWxsICUnLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMuZ2V0UGVyY2VudGFnZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUykpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFnZ3JlZ2F0ZXM6IFsnc3VtJ10sXG5cdFx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtUGVyY2VudGFnZUNvbFRlbXBsYXRlMSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlMpKVxuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdOZXcgdmlzaXRzICUnLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSxcblx0XHRcdFx0XHR0aXRsZTogJ1RvdGFsJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFZhbHVlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzEpKSxcblx0XHRcdFx0XHRzb3J0YWJsZToge1xuXHRcdFx0XHRcdFx0aW5pdGlhbERpcmVjdGlvbjogJ2Rlc2MnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiAnJm1kYXNoOydcblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xLFxuXHRcdFx0XHRcdHRpdGxlOiAnT3ZlcmFsbCAlJyxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmdldFBlcmNlbnRhZ2VDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVFNfMSkpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdyb3VwSGVhZGVyQ29sdW1uVGVtcGxhdGU6ICcmbWRhc2g7J1xuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGU6ICdBdmcgdmlzaXQgZHVyYXRpb24nLFxuXHRcdFx0XHRjb2x1bW5zOiBbe1xuXHRcdFx0XHRcdGZpZWxkOiBNZXRyaWNzTWFuYWdlci5BVkdfVklTSVRfRFVSQVRJT04sXG5cdFx0XHRcdFx0dGl0bGU6ICdUb3RhbCcsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRWYWx1ZUNvbFRlbXBsYXRlKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTikpLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiB7XG5cdFx0XHRcdFx0XHRpbml0aWFsRGlyZWN0aW9uOiAnZGVzYydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGFnZ3JlZ2F0ZXM6IFsnc3VtJ10sXG5cdFx0XHRcdFx0Z3JvdXBIZWFkZXJDb2x1bW5UZW1wbGF0ZTogdGhpcy5nZXRBZ2dyU3VtVmFsdWVDb2xUZW1wbGF0ZSh0aGlzLl9tZXRyaWNDb250YWluZXIuZ2V0TWFpbk1ldHJpYyhNZXRyaWNzTWFuYWdlci5BVkdfVklTSVRfRFVSQVRJT04pKSxcblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0ZmllbGQ6IE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTixcblx0XHRcdFx0XHR0aXRsZTogJ092ZXJhbGwgJScsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5nZXRQZXJjZW50YWdlQ29sVGVtcGxhdGUodGhpcy5fbWV0cmljQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1ZJU0lUX0RVUkFUSU9OKSksXG5cdFx0XHRcdFx0c29ydGFibGU6IHtcblx0XHRcdFx0XHRcdGluaXRpYWxEaXJlY3Rpb246ICdkZXNjJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YWdncmVnYXRlczogWydzdW0nXSxcblx0XHRcdFx0XHRncm91cEhlYWRlckNvbHVtblRlbXBsYXRlOiB0aGlzLmdldEFnZ3JTdW1QZXJjZW50YWdlQ29sVGVtcGxhdGUxKHRoaXMuX21ldHJpY0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTikpXG5cdFx0XHRcdH1dXG5cdFx0XHR9XVxuXHRcdH0pO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndGVjaG5vbG9neS10YWJsZS12aWV3JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3RlY2hub2xvZ3ktdGFibGUtdmlldycsIFRlY2hub2xvZ3lUYWJsZVZpZXcpO1xuIiwiaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcblxuZXhwb3J0IGNsYXNzIFRpbnlWaXNpdHNDaGFydCBleHRlbmRzIEFuYWx5dGljc0Jhc2VFbGVtZW50XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoKTtcblxuXHRcdC8vIEFkZCBodG1sIHRvIHNoYWRvd1Jvb3QgZGVmaW5lZCBpbiBwYXJlbnQgY2xhc3MgKEFuYWx5dGljc0Jhc2VFbGVtZW50KVxuXHRcdHRoaXMuc2hhZG93Um9vdC5pbm5lckhUTUwgKz0gYFxuXHRcdFx0PHN0eWxlPlxuXG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiY29udGFpbmVyXCI+XG5cdFx0XHRcdDxkaXYgaWQ9XCJsb2FkaW5nXCI+XG5cdFx0XHRcdFx0PHNwYW4+JSBvZiB2aXNpdHM6PC9zcGFuPlxuXHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXIgbWwtMlwiPjwvaT5cblx0XHRcdFx0XHQ8aSBpZD1cIndhcm5pbmdcIiBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC13YXJuaW5nIHNob3ctdG9vbHRpcCBtbC0yXCIgdGl0bGU9XCJEYXRhIGxvYWRpbmcgaW50ZXJydXB0ZWRcIj48L2k+XG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDxkaXYgaWQ9XCJjaGFydHNcIiBjbGFzcz1cInNob3ctcG9pbnRlclwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWFpblBpZVwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBpZD1cIm1haW5WaXNpdHNcIiBjbGFzcz1cIm1sLTFcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4+JSBvZiB2aXNpdHM6IDxzdHJvbmcgaWQ9XCJtYWluVmFsdWVcIiBjbGFzcz1cIm1ldHJpY01haW5cIj48L3N0cm9uZz48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgaWQ9XCJjb21wVmlzaXRzXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBpZD1cImNvbXBQaWVcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1sLTFcIj5DaGFuZ2UgaW4gJSBvZiB2aXNpdHM6IDxzdHJvbmcgaWQ9XCJjb21wVmFsdWVcIj48L3N0cm9uZz48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdDxkaXYgaWQ9XCJkZXRhaWxzXCI+XG5cdFx0XHRcdFx0PHNtYWxsIGlkPVwibWFpbkRldGFpbHNcIj5cblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZSBmYS14cyBtZXRyaWNNYWluXCI+PC9pPlxuXHRcdFx0XHRcdFx0PHNwYW4gaWQ9XCJtYWluUmFuZ2VcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIj5cblx0XHRcdFx0XHRcdFx0PHN0cm9uZyBpZD1cIm1haW5QZXJjXCIgY2xhc3M9XCJtZXRyaWNNYWluXCI+PC9zdHJvbmc+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIGlkPVwibWFpblZhbHVlc1wiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvc21hbGw+XG5cdFx0XHRcdFx0PGJyPlxuXHRcdFx0XHRcdDxzbWFsbCBpZD1cImNvbXBEZXRhaWxzXCI+XG5cdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUgZmEteHMgbWV0cmljQ29tcGFyZVwiPjwvaT5cblx0XHRcdFx0XHRcdDxzcGFuIGlkPVwiY29tcFJhbmdlXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCI+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmcgaWQ9XCJjb21wUGVyY1wiIGNsYXNzPVwibWV0cmljQ29tcGFyZVwiPjwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBpZD1cImNvbXBWYWx1ZXNcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L3NtYWxsPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLyBIaWRlIGxvYWRpbmcgc3Bpbm5lciBhbmQgd2FybmluZ1xuXHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJyN3YXJuaW5nJykuaGlkZSgpO1xuXG5cdFx0Ly8gSGlkZSBjaGFydHMgYW5kIGRldGFpbHMgc2VjdGlvblxuXHRcdHRoaXMuZ2V0JCgnI2NoYXJ0cycpLmhpZGUoKTtcblx0XHR0aGlzLmdldCQoJyNkZXRhaWxzJykuaGlkZSgpO1xuXG5cdFx0Ly8gQWRkIGNsaWNrIGxpc3RlbmVyXG5cdFx0dGhpcy5nZXQkKCcjY2hhcnRzJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIHBpZSBjaGFydHNcblx0XHR0aGlzLl9tYWluUGllID0gdGhpcy5nZXQkKCcjbWFpblBpZScpLmtlbmRvQ2hhcnQoe1xuXHRcdFx0dHJhbnNpdGlvbnM6IGZhbHNlLFxuXHRcdFx0bGVnZW5kOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFydEFyZWE6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogMjQsXG5cdFx0XHRcdGhlaWdodDogMjRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXJpZXNEZWZhdWx0czoge1xuICAgICAgICAgICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG5cdFx0XHRcdGhpZ2hsaWdodDoge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG92ZXJsYXk6IHtcblx0XHRcdFx0XHRncmFkaWVudDogJ25vbmUnXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyaWVzOiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwaWUnLFxuXHRcdFx0XHRwYWRkaW5nOiAtNCxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiA5MCxcblx0XHRcdFx0ZmllbGQ6ICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ25hbWUnLFxuICAgICAgICAgICAgfV0sXG5cdFx0XHRzZXJpZXNDb2xvcnM6IFsnIzMzOTlmZicsICcjY2NjJ10sXG4gICAgICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXG5cdFx0dGhpcy5fY29tcFBpZSA9IHRoaXMuZ2V0JCgnI2NvbXBQaWUnKS5rZW5kb0NoYXJ0KHtcblx0XHRcdHRyYW5zaXRpb25zOiBmYWxzZSxcblx0XHRcdGxlZ2VuZDoge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhcnRBcmVhOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDI0LFxuXHRcdFx0XHRoZWlnaHQ6IDI0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHtcbiAgICAgICAgICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuXHRcdFx0XHRoaWdobGlnaHQ6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyaWVzOiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwaWUnLFxuXHRcdFx0XHRwYWRkaW5nOiAtNCxcbiAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiA5MCxcblx0XHRcdFx0ZmllbGQ6ICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRvdmVybGF5OiB7XG5cdFx0XHRcdFx0Z3JhZGllbnQ6ICdub25lJ1xuXHRcdFx0XHR9LFxuICAgICAgICAgICAgfV0sXG5cdFx0XHRzZXJpZXNDb2xvcnM6IFsnI2ZmOTkwMCcsICcjY2NjJ10sXG4gICAgICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXHR9XG5cblx0Z2V0IHN0YXRlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnc3RhdGUnKTtcblx0fVxuXG5cdHNldCBzdGF0ZSh2YWx1ZSlcblx0e1xuXHRcdGlmICh2YWx1ZSAhPSB0aGlzLnN0YXRlKVxuXHRcdHtcblx0XHRcdGlmICh2YWx1ZSlcblx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoJ3N0YXRlJywgdmFsdWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnc3RhdGUnKTtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlIGNoYW5nZVxuXHRcdFx0dGhpcy5faGFuZGxlU3RhdGVDaGFuZ2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7c3RyaW5nfSB2aWV3SWRcblx0ICogQHBhcmFtICB7TWV0cmljfSBtTWFpblxuXHQgKiBAcGFyYW0gIHtNZXRyaWN9IG1Db21wYXJlXG5cdCAqL1xuXHRpbml0KHZpZXdJZCwgbU1haW4sIG1Db21wYXJlKVxuXHR7XG5cdFx0dGhpcy5fdmlld0lkID0gdmlld0lkO1xuXHRcdHRoaXMuX21NYWluID0gbU1haW47XG5cdFx0dGhpcy5fbUNvbXBhcmUgPSBtQ29tcGFyZTtcblxuXHRcdHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG5cdFx0Ly8gUmVmcmVzaFxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9XG5cblx0cmVmcmVzaCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHQvLyBBbHdheXMgaGlkZSBkZXRhaWxzXG5cdFx0XHR0aGlzLmdldCQoJyNkZXRhaWxzJykuaGlkZSgpO1xuXG5cdFx0XHR0aGlzLmdldCQoJyNtYWluVmlzaXRzJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjY29tcFZpc2l0cycpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnI2NvbXBEZXRhaWxzJykuaGlkZSgpO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSB8fCB0aGlzLnN0YXRlID09IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBX0NPTVBBUkUpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IHNob3dDb21wYXJlID0gKHRoaXMuc3RhdGUgPT0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRSk7XG5cblx0XHRcdFx0Ly8gU2V0dXAgaW50ZXJmYWNlXG5cdFx0XHRcdGlmIChzaG93Q29tcGFyZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI2NvbXBWaXNpdHMnKS5zaG93KCk7XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjY29tcERldGFpbHMnKS5zaG93KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI21haW5WaXNpdHMnKS5zaG93KCk7XG5cblx0XHRcdFx0Ly8gU2hvdyBtYWluIHJhbmdlXG5cdFx0XHRcdGNvbnN0IG1haW5QZXJjID0gKHRoaXMuX21NYWluLmdldFZhbHVlKCkgPT0gMCA/IDEwMCA6ICh0aGlzLl9tTWFpbi5nZXRWYWx1ZUYoKSAvIHRoaXMuX21NYWluLmdldFZhbHVlKCkgKiAxMDApKTtcblx0XHRcdFx0dGhpcy5fbWFpblBpZS5zZXREYXRhU291cmNlKFt7bmFtZTonc2VsZWN0ZCcsIHZhbHVlOm1haW5QZXJjfSwge25hbWU6J290aGVyJywgdmFsdWU6KDEwMCAtIG1haW5QZXJjKX1dKTtcblx0XHRcdFx0dGhpcy5nZXQkKCcjbWFpblZhbHVlJykudGV4dChtYWluUGVyYy50b0ZpeGVkKDIpICsgJyUnKTtcblx0XHRcdFx0dGhpcy5nZXQkKCcjbWFpblBlcmMnKS50ZXh0KG1haW5QZXJjLnRvRml4ZWQoMikgKyAnJScpO1xuXHRcdFx0XHR0aGlzLmdldCQoJyNtYWluUmFuZ2UnKS50ZXh0KHRoaXMuX21NYWluLmdldFJhbmdlU3RyaW5nKCkpO1xuXHRcdFx0XHR0aGlzLmdldCQoJyNtYWluVmFsdWVzJykudGV4dChgKCR7dGhpcy5fbU1haW4uZ2V0VmFsdWVGKCl9IG9mICR7dGhpcy5fbU1haW4uZ2V0VmFsdWUoKX0pYCk7XG5cblx0XHRcdFx0Ly8gU2hvdyBjb21wYXJlZCByYW5nZVxuXHRcdFx0XHRpZiAoc2hvd0NvbXBhcmUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBjb21wYXJlUGVyYyA9ICh0aGlzLl9tQ29tcGFyZS5nZXRWYWx1ZSgpID09IDAgPyAxMDAgOiAodGhpcy5fbUNvbXBhcmUuZ2V0VmFsdWVGKCkgLyB0aGlzLl9tQ29tcGFyZS5nZXRWYWx1ZSgpICogMTAwKSk7XG5cdFx0XHRcdFx0dGhpcy5fY29tcFBpZS5zZXREYXRhU291cmNlKFt7bmFtZTonc2VsZWN0ZCcsIHZhbHVlOmNvbXBhcmVQZXJjfSwge25hbWU6J290aGVyJywgdmFsdWU6KDEwMCAtIGNvbXBhcmVQZXJjKX1dKTtcblxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gbWFpblBlcmMgLSBjb21wYXJlUGVyYztcblx0XHRcdFx0XHR0aGlzLmdldCQoJyNjb21wVmFsdWUnKS50ZXh0KCh2YWx1ZSA+IDAgPyAnKycgOiAnJykgKyB2YWx1ZS50b0ZpeGVkKDIpICsgJyUnKTtcblxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI2NvbXBSYW5nZScpLnRleHQodGhpcy5fbUNvbXBhcmUuZ2V0UmFuZ2VTdHJpbmcoKSk7XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjY29tcFBlcmMnKS50ZXh0KGNvbXBhcmVQZXJjLnRvRml4ZWQoMikgKyAnJScpO1xuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI2NvbXBWYWx1ZXMnKS50ZXh0KGAoJHt0aGlzLl9tQ29tcGFyZS5nZXRWYWx1ZUYoKX0gb2YgJHt0aGlzLl9tQ29tcGFyZS5nZXRWYWx1ZSgpfSlgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdGF0ZUNoYW5nZSgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNJbml0aWFsaXplZClcblx0XHR7XG5cdFx0XHR0aGlzLmdldCQoJyNsb2FkaW5nJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0dGhpcy5nZXQkKCcjd2FybmluZycpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnI2NoYXJ0cycpLmhpZGUoKTtcblxuXHRcdFx0c3dpdGNoICh0aGlzLnN0YXRlKVxuXHRcdFx0e1xuXHRcdFx0XHRjYXNlIE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HOlxuXHRcdFx0XHRcdHRoaXMuZ2V0JCgnI2xvYWRpbmcnKS5zaG93KCk7XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgc3Bpbm5lclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjbG9hZGluZycpLnNob3coKTtcblx0XHRcdFx0XHR0aGlzLmdldCQoJyN3YXJuaW5nJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgaW50ZXJydXB0ZWQgd2FybmluZ1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEE6XG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRTpcblx0XHRcdFx0XHR0aGlzLmdldCQoJyNjaGFydHMnKS5zaG93KCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNsaWNrKClcblx0e1xuXHRcdC8vIFNob3cvaGlkZSBkZXRhaWxzXG5cdFx0dGhpcy5nZXQkKCcjZGV0YWlscycpLnRvZ2dsZSgpO1xuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgndGlueS12aXNpdHMtY2hhcnQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgndGlueS12aXNpdHMtY2hhcnQnLCBUaW55VmlzaXRzQ2hhcnQpO1xuIiwiaW1wb3J0IHtBbmFseXRpY3NCYXNlRWxlbWVudH0gZnJvbSAnLi9hbmFseXRpY3MtYmFzZS1lbGVtZW50JztcbmltcG9ydCB7TWV0cmljRGlzcGxheVN0YXRlfSBmcm9tICcuL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcblxuZXhwb3J0IGNsYXNzIFZpc2l0b3JzQ2hhcnQgZXh0ZW5kcyBBbmFseXRpY3NCYXNlRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHQvLyBBZGQgaHRtbCB0byBzaGFkb3dSb290IGRlZmluZWQgaW4gcGFyZW50IGNsYXNzIChBbmFseXRpY3NCYXNlRWxlbWVudClcblx0XHR0aGlzLnNoYWRvd1Jvb3QuaW5uZXJIVE1MICs9IGBcblx0XHRcdDxzdHlsZT5cblx0XHRcdFx0LmRvdCB7XG5cdFx0XHRcdFx0dmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuXHRcdFx0XHRcdGNvbG9yOiAjY2NjO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LnZpc2l0cyB7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IC44cmVtO1xuXHRcdFx0XHR9XG5cdFx0XHQ8L3N0eWxlPlxuXG5cdFx0XHQ8ZGl2IGlkPVwiY29udGFpbmVyXCIgY2xhc3M9XCJyb3cgbm8tZ3V0dGVycyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG5cdFx0XHRcdFx0PGRpdiBpZD1cInBpZUNoYXJ0XCIgY2xhc3M9XCJtci0yXCI+PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sXCI+XG5cdFx0XHRcdFx0PGRpdiBpZD1cIm5ld1Zpc2l0b3JzXCIgY2xhc3M9XCJkLWlubGluZS1ibG9jayBtci0yXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdFx0XHQ8c21hbGwgY2xhc3M9XCJkb3RcIj48aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUgZmEteHMgdG8tYmUtc3R5bGVkXCI+PC9pPjwvc21hbGw+XG5cdFx0XHRcdFx0XHRcdDxzcGFuIGlkPVwibmV3VmlzaXRvcnNMYWJlbFwiIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCBzaG93LXRvb2x0aXBcIiB0aXRsZT1cIlwiPk5ldyB2aXNpdG9yczo8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1ub3RjaCBmYS1zcGluIHRleHQtc2Vjb25kYXJ5IGFsaWduLW1pZGRsZSBsb2FkaW5nLXNwaW5uZXIgbWwtMlwiPjwvaT5cblx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtd2FybmluZyBtaXNzaW5nLXdhcm5pbmcgc2hvdy10b29sdGlwIG1sLTJcIiB0aXRsZT1cIkRhdGEgbG9hZGluZyBpbnRlcnJ1cHRlZFwiPjwvaT5cblx0XHRcdFx0XHRcdFx0PHN0cm9uZyBjbGFzcz1cIm1sLTJcIj48c3BhbiBpZD1cIm5ld1Zpc2l0b3JzUGVyY1wiIGNsYXNzPVwidG8tYmUtc3R5bGVkXCI+PC9zcGFuPjwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidmlzaXRzXCI+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZSBmYS14cyBpY29uLWludmlzaWJsZVwiPjwvaT5cblx0XHRcdFx0XHRcdFx0PHNtYWxsIGlkPVwibmV3VmlzVmlzaXRzVmFsdWVNYWluXCI+PC9zbWFsbD5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgaWQ9XCJyZXRWaXNpdG9yc1wiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIj5cblx0XHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHRcdDxzbWFsbCBjbGFzcz1cImRvdFwiPjxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZSBmYS14c1wiPjwvaT48L3NtYWxsPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBpZD1cInJldFZpc2l0b3JzTGFiZWxcIiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgc2hvdy10b29sdGlwXCIgdGl0bGU9XCJcIj5SZXR1cm5pbmcgdmlzaXRvcnM6PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUtbm90Y2ggZmEtc3BpbiB0ZXh0LXNlY29uZGFyeSBhbGlnbi1taWRkbGUgbG9hZGluZy1zcGlubmVyIG1sLTJcIj48L2k+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZSB0ZXh0LXdhcm5pbmcgbWlzc2luZy13YXJuaW5nIHNob3ctdG9vbHRpcCBtbC0yXCIgdGl0bGU9XCJEYXRhIGxvYWRpbmcgaW50ZXJydXB0ZWRcIj48L2k+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmcgY2xhc3M9XCJtbC0yXCI+PHNwYW4gaWQ9XCJyZXRWaXNpdG9yc1BlcmNcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj48L3NwYW4+PC9zdHJvbmc+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ2aXNpdHNcIj5cblx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtY2lyY2xlIGZhLXhzIGljb24taW52aXNpYmxlXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHQ8c21hbGwgaWQ9XCJyZXRWaXNWaXNpdHNWYWx1ZU1haW5cIj48L3NtYWxsPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblxuXHRcdC8vIEluaXRpYWxpemUgaGVscCB0b29sdGlwc1xuXHRcdHRoaXMuZ2V0JCgnI2NvbnRhaW5lcicpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwaWUgY2hhcnRcblx0XHR0aGlzLl9waWVDaGFydCA9IHRoaXMuZ2V0JCgnI3BpZUNoYXJ0Jykua2VuZG9DaGFydCh7XG5cdFx0XHR0cmFuc2l0aW9uczogZmFsc2UsXG5cdFx0XHRsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoYXJ0QXJlYToge1xuICAgICAgICAgICAgICAgIHdpZHRoOiA1MCxcblx0XHRcdFx0aGVpZ2h0OiA1MFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcmllc0RlZmF1bHRzOiB7XG4gICAgICAgICAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcblx0XHRcdFx0aGlnaGxpZ2h0OiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0b3ZlcmxheToge1xuXHRcdFx0XHRcdGdyYWRpZW50OiAnbm9uZSdcblx0XHRcdFx0fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXJpZXM6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3BpZScsXG5cdFx0XHRcdHBhZGRpbmc6IC00LFxuICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGU6IDAsXG5cdFx0XHRcdGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5RmllbGQ6ICd0eXBlJyxcbiAgICAgICAgICAgIH1dLFxuXHRcdFx0c2VyaWVzQ29sb3JzOiBbKCF0aGlzLmNvbXBhcmUgPyAnIzMzOTlmZicgOiAnI2ZmOTkwMCcpLCAnI2NjYyddLCAvLyBDb25kaXRpb25hbCBzdHlsaW5nXG4gICAgICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZGF0YSgna2VuZG9DaGFydCcpO1xuXG5cdFx0Ly8gU2V0IGNvbmRpdGlvbmFsIHN0eWxpbmdcblx0XHR0aGlzLmdldCQoJy50by1iZS1zdHlsZWQnKS5hZGRDbGFzcyghdGhpcy5jb21wYXJlID8gJ21ldHJpY01haW4nIDogJ21ldHJpY0NvbXBhcmUnKTtcblx0fVxuXG5cdGdldCBjb21wYXJlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnY29tcGFyZScpID09ICd0cnVlJztcblx0fVxuXG5cdHNldCBjb21wYXJlKHZhbHVlKVxuXHR7XG5cdFx0aWYgKHZhbHVlKVxuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoJ2NvbXBhcmUnLCB2YWx1ZSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2NvbXBhcmUnKTtcblx0fVxuXG5cdGdldCBzdGF0ZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cdH1cblxuXHRzZXQgc3RhdGUodmFsdWUpXG5cdHtcblx0XHRpZiAodmFsdWUgIT0gdGhpcy5zdGF0ZSlcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUpXG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHZhbHVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0YXRlJyk7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZSBjaGFuZ2Vcblx0XHRcdHRoaXMuX2hhbmRsZVN0YXRlQ2hhbmdlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gdmlld0lkXG5cdCAqIEBwYXJhbSAge01ldHJpY30gbmV3VmlzaXRvcnNQZXJjXG5cdCAqIEBwYXJhbSAge01ldHJpY30gcmV0VmlzaXRvcnNQZXJjXG5cdCAqIEBwYXJhbSAge01ldHJpY30gbmV3VmlzVmlzaXRzXG5cdCAqIEBwYXJhbSAge01ldHJpY30gcmV0VmlzVmlzaXRzXG5cdCAqL1xuXHRpbml0KHZpZXdJZCwgbmV3VmlzaXRvcnNQZXJjLCByZXRWaXNpdG9yc1BlcmMsIG5ld1Zpc1Zpc2l0cywgcmV0VmlzVmlzaXRzKVxuXHR7XG5cdFx0dGhpcy5fdmlld0lkID0gdmlld0lkO1xuXHRcdHRoaXMuX25ld1Zpc2l0b3JzUGVyYyA9IG5ld1Zpc2l0b3JzUGVyYztcblx0XHR0aGlzLl9yZXRWaXNpdG9yc1BlcmMgPSByZXRWaXNpdG9yc1BlcmM7XG5cdFx0dGhpcy5fbmV3VmlzVmlzaXRzID0gbmV3VmlzVmlzaXRzO1xuXHRcdHRoaXMuX3JldFZpc1Zpc2l0cyA9IHJldFZpc1Zpc2l0cztcblxuXHRcdC8vIFNldCB0b29sdGlwIGNvbnRlbnRcblx0XHRjb25zdCBtMSA9IHRoaXMuX3JldFZpc2l0b3JzUGVyYy5iYXNlTWV0cmljO1xuXHRcdGNvbnN0IG0yID0gdGhpcy5fcmV0VmlzVmlzaXRzLmJhc2VNZXRyaWM7XG5cdFx0dGhpcy5nZXQkKCcjcmV0VmlzaXRvcnNMYWJlbCcpLmF0dHIoJ3RpdGxlJywgYDxzdHJvbmc+JHttMS5uYW1lfTwvc3Ryb25nPjxicj48c3Bhbj4ke20xLmRlc2NyaXB0aW9ufTxzcGFuPjxicj48YnI+PHN0cm9uZz4ke20yLm5hbWV9PC9zdHJvbmc+PGJyPjxzcGFuPiR7bTIuZGVzY3JpcHRpb259PHNwYW4+PGJyPjxicj5gKTtcblxuXHRcdGNvbnN0IG0zID0gdGhpcy5fbmV3VmlzaXRvcnNQZXJjLmJhc2VNZXRyaWM7XG5cdFx0Y29uc3QgbTQgPSB0aGlzLl9uZXdWaXNWaXNpdHMuYmFzZU1ldHJpYztcblx0XHR0aGlzLmdldCQoJyNuZXdWaXNpdG9yc0xhYmVsJykuYXR0cigndGl0bGUnLCBgPHN0cm9uZz4ke20zLm5hbWV9PC9zdHJvbmc+PGJyPjxzcGFuPiR7bTMuZGVzY3JpcHRpb259PHNwYW4+PGJyPjxicj48c3Ryb25nPiR7bTQubmFtZX08L3N0cm9uZz48YnI+PHNwYW4+JHttNC5kZXNjcmlwdGlvbn08c3Bhbj48YnI+PGJyPmApO1xuXG5cdFx0dGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG5cblx0XHQvLyBSZWZyZXNoXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdH1cblxuXHRyZWZyZXNoKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdC8vIFJlc2V0XG5cdFx0XHR0aGlzLl9waWVDaGFydC5zZXREYXRhU291cmNlKFtdKTtcblx0XHRcdHRoaXMuZ2V0JCgnI25ld1Zpc2l0b3JzUGVyYycpLnRleHQoJycpO1xuXHRcdFx0dGhpcy5nZXQkKCcjcmV0VmlzaXRvcnNQZXJjJykudGV4dCgnJyk7XG5cdFx0XHR0aGlzLmdldCQoJyNuZXdWaXNWaXNpdHNWYWx1ZU1haW4nKS50ZXh0KCcnKTtcblx0XHRcdHRoaXMuZ2V0JCgnI3JldFZpc1Zpc2l0c1ZhbHVlTWFpbicpLnRleHQoJycpO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZSA9PSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSlcblx0XHRcdFx0dGhpcy5fZGlzcGxheURhdGEoKTtcblx0XHR9XG5cdH1cblxuXHRfZGlzcGxheURhdGEoKVxuXHR7XG5cdFx0Y29uc3QgbmV3VmlzaXRvcnNQZXJjVmFsdWUgPSB0aGlzLl9uZXdWaXNpdG9yc1BlcmMuZ2V0VmFsdWVGKCk7XG5cdFx0Y29uc3QgcmV0VmlzaXRvcnNQZXJjVmFsdWUgPSB0aGlzLl9yZXRWaXNpdG9yc1BlcmMuZ2V0VmFsdWVGKCk7XG5cblx0XHRjb25zdCBuZXdWaXNpdG9yc1BlcmNTdHJpbmcgPSB0aGlzLl9uZXdWaXNpdG9yc1BlcmMuZ2V0VmFsdWVGU3RyaW5nKCk7XG5cdFx0Y29uc3QgcmV0VmlzaXRvcnNQZXJjU3RyaW5nID0gdGhpcy5fcmV0VmlzaXRvcnNQZXJjLmdldFZhbHVlRlN0cmluZygpO1xuXG5cdFx0Y29uc3QgbmV3VmlzaXRzU3RyaW5nID0gdGhpcy5fbmV3VmlzVmlzaXRzLmdldFZhbHVlRlN0cmluZygpICsgJyB2aXNpdHMnO1xuXHRcdGNvbnN0IHJldFZpc2l0c1N0cmluZyA9IHRoaXMuX3JldFZpc1Zpc2l0cy5nZXRWYWx1ZUZTdHJpbmcoKSArICcgdmlzaXRzJztcblxuXHRcdHRoaXMuX3BpZUNoYXJ0LnNldERhdGFTb3VyY2UoW3t0eXBlOiduZXcnLCB2YWx1ZTpuZXdWaXNpdG9yc1BlcmNWYWx1ZX0sIHtuYW1lOidyZXQnLCB2YWx1ZTpyZXRWaXNpdG9yc1BlcmNWYWx1ZX1dKTtcblxuXHRcdHRoaXMuZ2V0JCgnI25ld1Zpc2l0b3JzUGVyYycpLnRleHQobmV3VmlzaXRvcnNQZXJjU3RyaW5nKTtcblx0XHR0aGlzLmdldCQoJyNyZXRWaXNpdG9yc1BlcmMnKS50ZXh0KHJldFZpc2l0b3JzUGVyY1N0cmluZyk7XG5cblx0XHR0aGlzLmdldCQoJyNuZXdWaXNWaXNpdHNWYWx1ZU1haW4nKS50ZXh0KG5ld1Zpc2l0c1N0cmluZyk7XG5cdFx0dGhpcy5nZXQkKCcjcmV0VmlzVmlzaXRzVmFsdWVNYWluJykudGV4dChyZXRWaXNpdHNTdHJpbmcpO1xuXHR9XG5cblx0X2hhbmRsZVN0YXRlQ2hhbmdlKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0luaXRpYWxpemVkKVxuXHRcdHtcblx0XHRcdHRoaXMuZ2V0JCgnLmxvYWRpbmctc3Bpbm5lcicpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnLm1pc3Npbmctd2FybmluZycpLmhpZGUoKTtcblx0XHRcdHRoaXMuZ2V0JCgnI3BpZUNoYXJ0JykuaGlkZSgpO1xuXG5cdFx0XHRzd2l0Y2ggKHRoaXMuc3RhdGUpXG5cdFx0XHR7XG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubG9hZGluZy1zcGlubmVyJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgc3Bpbm5lclxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkc6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcubWlzc2luZy13YXJuaW5nJykuc2hvdygpOyAvLyBTaG93IGxvYWRpbmcgaW50ZXJydXB0ZWQgd2FybmluZ1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWV0cmljRGlzcGxheVN0YXRlLkRBVEE6XG5cdFx0XHRcdFx0dGhpcy5nZXQkKCcjcGllQ2hhcnQnKS5zaG93KCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ3Zpc2l0b3JzLWNoYXJ0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3Zpc2l0b3JzLWNoYXJ0JywgVmlzaXRvcnNDaGFydCk7XG4iLCJpbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7RGF0ZUhlbHBlcn0gZnJvbSAnLi91dGlscy9kYXRlLWhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBEYXRhUmFuZ2VNYW5hZ2VyXG57XG5cdGNvbnN0cnVjdG9yKHJhbmdlU2VsZWN0b3JNb2RhbClcblx0e1xuXHRcdHRoaXMuVE9EQVkgPSAnVG9kYXknO1xuXHRcdHRoaXMuWUVTVEVSREFZID0gJ1llc3RlcmRheSc7XG5cdFx0dGhpcy5MQVNUX1dFRUsgPSAnTGFzdCB3ZWVrJztcblx0XHR0aGlzLkxBU1RfTU9OVEggPSAnTGFzdCBtb250aCc7XG5cdFx0dGhpcy5DVVNUT00gPSAnQ3VzdG9tJztcblxuXHRcdHRoaXMuUFJFREVGSU5FRF9SQU5HRVMgPSBbdGhpcy5UT0RBWSwgdGhpcy5ZRVNURVJEQVksIHRoaXMuTEFTVF9XRUVLLCB0aGlzLkxBU1RfTU9OVEgsIHRoaXMuQ1VTVE9NXTtcblxuXHRcdHRoaXMuX3JhbmdlTW9kYWwgPSByYW5nZVNlbGVjdG9yTW9kYWw7XG5cblx0XHQvLyBJbml0aWFsaXplIHdpZGdldHNcblx0XHR0aGlzLl9pbml0V2lkZ2V0cygpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHR0aGlzLl9jb21wYXJlQ2Iub2ZmKCdjaGFuZ2UnKTtcblx0fVxuXG5cdHNldERlZmF1bHRSYW5nZSgpXG5cdHtcblx0XHQvLyBEZWZhdWx0IGRhdGEgcmFuZ2UgaXMgbGFzdCB3ZWVrICh0aGUgd2VlayBiZWZvcmUgdGhlIGN1cnJlbnQgb25lKVxuXHRcdHRoaXMuc2V0UHJlZGVmaW5lZFJhbmdlKHRoaXMuTEFTVF9XRUVLKTtcblx0fVxuXG5cdHNldFByZWRlZmluZWRSYW5nZShzZWxlY3RlZFJhbmdlVGV4dClcblx0e1xuXHRcdGNvbnN0IHRvZGF5MCA9IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpO1xuXHRcdGNvbnN0IHRvZGF5MjMgPSBtb21lbnQoKS5ob3VycygyMykuc3RhcnRPZignaG91cicpO1xuXG5cdFx0bGV0IGZyb207XG5cdFx0bGV0IHRvO1xuXG5cdFx0c3dpdGNoIChzZWxlY3RlZFJhbmdlVGV4dClcblx0XHR7XG5cdFx0XHRjYXNlIHRoaXMuVE9EQVk6XG5cdFx0XHRcdGZyb20gPSB0b2RheTA7XG5cdFx0XHRcdHRvID0gdG9kYXkyMztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgdGhpcy5ZRVNURVJEQVk6XG5cdFx0XHRcdGZyb20gPSB0b2RheTAuc3VidHJhY3QoMSwgJ2RheXMnKTtcblx0XHRcdFx0dG8gPSB0b2RheTIzLnN1YnRyYWN0KDEsICdkYXlzJyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIHRoaXMuTEFTVF9XRUVLOlxuXHRcdFx0XHRmcm9tID0gdG9kYXkwLnN1YnRyYWN0KDcsICdkYXlzJykuc3RhcnRPZignd2VlaycpO1xuXHRcdFx0XHR0byA9IHRvZGF5MjMuc3VidHJhY3QoNywgJ2RheXMnKS5lbmRPZignd2VlaycpLmhvdXIoMjMpLnN0YXJ0T2YoJ2hvdXInKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgdGhpcy5MQVNUX01PTlRIOlxuXHRcdFx0XHRmcm9tID0gdG9kYXkwLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJyk7XG5cdFx0XHRcdHRvID0gdG9kYXkyMy5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS5ob3VyKDIzKS5zdGFydE9mKCdob3VyJyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIHRoaXMuQ1VTVE9NOlxuXHRcdFx0XHQvLyBLZWVwIHByZXZpb3VzIHZhbHVlcyBmcm9tIHNlbGVjdGVkUmFuZ2Ugb2JqZWN0XG5cdFx0XHRcdGZyb20gPSB0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tO1xuXHRcdFx0XHR0byA9IHRoaXMuX3NlbGVjdGVkUmFuZ2UubWFpblRvO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyBTZXQgc2VsZWN0ZWQgcmFuZ2Vcblx0XHR0aGlzLl9zZXRSYW5nZShmcm9tLCB0bywgdGhpcy5QUkVERUZJTkVEX1JBTkdFUy5pbmRleE9mKHNlbGVjdGVkUmFuZ2VUZXh0KSk7XG5cdH1cblxuXHRzZXRDdXN0b21SYW5nZSgpXG5cdHtcblx0XHRsZXQgZnJvbSA9IG1vbWVudCh0aGlzLl9mcm9tRGF0ZURQLnZhbHVlKCkpO1xuXHRcdGZyb20uaG91cnModGhpcy5fZnJvbUhvdXJOUy52YWx1ZSgpKS5zdGFydE9mKCdob3VyJyk7XG5cblx0XHRsZXQgdG8gPSBtb21lbnQodGhpcy5fdG9EYXRlRFAudmFsdWUoKSk7XG5cdFx0dG8uaG91cnModGhpcy5fdG9Ib3VyTlMudmFsdWUoKSAtIDEpLnN0YXJ0T2YoJ2hvdXInKTtcblxuXHRcdC8vIENoZWNrIGlmICd0bycgZGF0ZSBpcyBiZWZvcmUgJ2Zyb20nIGRhdGVcblx0XHRpZiAodG8uaXNCZWZvcmUoZnJvbSkpXG5cdFx0XHR0byA9IG1vbWVudChmcm9tKTtcblxuXHRcdC8vIFNldCBzZWxlY3RlZCByYW5nZVxuXHRcdHRoaXMuX3NldFJhbmdlKGZyb20sIHRvLCB0aGlzLlBSRURFRklORURfUkFOR0VTLmluZGV4T2YodGhpcy5DVVNUT00pKTtcblx0fVxuXG5cdHNldE5ld1JhbmdlKHJhbmdlKVxuXHR7XG5cdFx0Ly8gU2V0IHByZWRlZmluZWQgcmFuZ2VzIHNlbGVjdG9yXG5cdFx0Y29uc3QgdG9kYXkgPSBtb21lbnQoKTtcblx0XHRsZXQgaW5kZXggPSB0aGlzLlBSRURFRklORURfUkFOR0VTLmluZGV4T2YodGhpcy5DVVNUT00pO1xuXG5cdFx0aWYgKHJhbmdlLm1haW5Gcm9tLmhvdXJzKCkgPT0gMCAmJiByYW5nZS5tYWluVG8uaG91cnMoKSA9PSAyMylcblx0XHR7XG5cdFx0XHRpZiAoRGF0ZUhlbHBlci5hcmVEYXRlc0VxdWFsKHJhbmdlLm1haW5Gcm9tLCByYW5nZS5tYWluVG8pKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBUT0RBWVxuXHRcdFx0XHRpZiAoRGF0ZUhlbHBlci5hcmVEYXRlc0VxdWFsKHJhbmdlLm1haW5Gcm9tLCB0b2RheSkpXG5cdFx0XHRcdFx0aW5kZXggPSB0aGlzLlBSRURFRklORURfUkFOR0VTLmluZGV4T2YodGhpcy5UT0RBWSk7XG5cblx0XHRcdFx0Ly8gWUVTVEVSREFZXG5cdFx0XHRcdGVsc2UgaWYgKERhdGVIZWxwZXIuYXJlRGF0ZXNFcXVhbChyYW5nZS5tYWluRnJvbSwgRGF0ZUhlbHBlci5nZXRQcmV2RGF5KHRvZGF5KSkpXG5cdFx0XHRcdFx0aW5kZXggPSB0aGlzLlBSRURFRklORURfUkFOR0VTLmluZGV4T2YodGhpcy5ZRVNURVJEQVkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMQVNUIFdFRUtcblx0XHRcdGVsc2UgaWYgKERhdGVIZWxwZXIuYXJlRGF0ZXNFcXVhbChyYW5nZS5tYWluRnJvbSwgRGF0ZUhlbHBlci5nZXRGaXJzdERheU9mUHJldldlZWsodG9kYXkpKSAmJiBEYXRlSGVscGVyLmFyZURhdGVzRXF1YWwocmFuZ2UubWFpblRvLCBEYXRlSGVscGVyLmdldExhc3REYXlPZlByZXZXZWVrKHRvZGF5KSkpXG5cdFx0XHRcdGluZGV4ID0gdGhpcy5QUkVERUZJTkVEX1JBTkdFUy5pbmRleE9mKHRoaXMuTEFTVF9XRUVLKTtcblxuXHRcdFx0Ly8gTEFTVCBNT05USFxuXHRcdFx0ZWxzZSBpZiAoRGF0ZUhlbHBlci5hcmVEYXRlc0VxdWFsKHJhbmdlLm1haW5Gcm9tLCBEYXRlSGVscGVyLmdldEZpcnN0RGF5T2ZQcmV2TW9udGgodG9kYXkpKSAmJiBEYXRlSGVscGVyLmFyZURhdGVzRXF1YWwocmFuZ2UubWFpblRvLCBEYXRlSGVscGVyLmdldExhc3REYXlPZlByZXZNb250aCh0b2RheSkpKVxuXHRcdFx0XHRpbmRleCA9IHRoaXMuUFJFREVGSU5FRF9SQU5HRVMuaW5kZXhPZih0aGlzLkxBU1RfTU9OVEgpO1xuXHRcdH1cblxuXHRcdC8vIEVuYWJsZSBjb21wYXJlOyBjb21wYXJlIGRhdGVzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBzaGl0ICh0aGV5IGFyZSBub3QgdGFrZW4gZnJvbSB0aGUgcmFuZ2Ugb2JqZWN0KVxuXHRcdHRoaXMuX2NvbXBhcmVDYi5wcm9wKCdjaGVja2VkJywgKHJhbmdlLmNvbXBhcmVGcm9tICE9IG51bGwgJiYgcmFuZ2UuY29tcGFyZVRvICE9IG51bGwpKTtcblxuXHRcdC8vIFNldCBzZWxlY3RlZCByYW5nZVxuXHRcdHRoaXMuX3NldFJhbmdlKHJhbmdlLm1haW5Gcm9tLCByYW5nZS5tYWluVG8sIGluZGV4KTtcblx0fVxuXG5cdGdldFNlbGVjdGVkUmFuZ2UoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkUmFuZ2U7XG5cdH1cblxuXHRnZXRSYW5nZUxlbmd0aCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8uZGlmZih0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tLCAnZGF5cycpICsgMTtcblx0fVxuXG5cdGRpc2FibGVTaGlmdEZvckRlbW8oKVxuXHR7XG5cdFx0dGhpcy5fc2hpZnROUy5lbmFibGUoZmFsc2UpO1xuXHRcdHRoaXMuX3NoaWZ0TlMud3JhcHBlci5hZGRDbGFzcygnc2hvdy10b29sdGlwJyk7XG5cdFx0dGhpcy5fc2hpZnROUy53cmFwcGVyLmF0dHIoJ3RpdGxlJywgJ0NvbXBhcmUgcmFuZ2Ugc2hpZnQgYXZhaWxhYmxlIGluIGxpY2Vuc2VkIHZlcnNpb24gb25seScpO1xuXHR9XG5cblx0ZGlzYWJsZUNvbXBhcmVGb3JCYXNpYygpXG5cdHtcblx0XHR0aGlzLl9jb21wYXJlQ2IuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHQkKCcjYW5sLWNvbXBhcmVMYicsIHRoaXMuX3JhbmdlTW9kYWwpLnRleHQoJ0NvbXBhcmUgKFBSTyBPTkxZKScpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgd2lkZ2V0cy5cblx0ICovXG5cdF9pbml0V2lkZ2V0cygpXG5cdHtcblx0XHQvLyBJbml0aWFsaXplIHJhbmdlIGRyb3Bkb3duXG5cdFx0dGhpcy5fcmFuZ2VERCA9ICQoJyNhbmwtcmFuZ2VQcmVzZWxlY3RERCcsIHRoaXMuX3JhbmdlTW9kYWwpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFTb3VyY2U6IHRoaXMuUFJFREVGSU5FRF9SQU5HRVMsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25QcmVkZWZpbmVkUmFuZ2VDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9Ecm9wRG93bkxpc3QnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgY29tcGFyZSBjaGVja2JveFxuXHRcdHRoaXMuX2NvbXBhcmVDYiA9ICQoJyNhbmwtY29tcGFyZUNiJywgdGhpcy5fcmFuZ2VNb2RhbCk7XG5cdFx0dGhpcy5fY29tcGFyZUNiLm9uKCdjaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uUHJlZGVmaW5lZFJhbmdlQ2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0IGZyb20gZGF0ZSBwaWNrZXJcblx0XHR0aGlzLl9mcm9tRGF0ZURQID0gJCgnI2FubC1mcm9tRGF0ZURQJywgdGhpcy5fcmFuZ2VNb2RhbCkua2VuZG9EYXRlUGlja2VyKHtcblx0XHRcdG1heDogbmV3IERhdGUoKSxcblx0XHRcdGZvb3RlcjogZmFsc2UsXG5cdFx0XHRmb3JtYXQ6ICdkZCBNTU0geXl5eScsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25SYW5nZUNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0RhdGVQaWNrZXInKTtcblxuXHRcdC8vIEluaXQgZnJvbSBob3VyIGlucHV0XG5cdFx0dGhpcy5fZnJvbUhvdXJOUyA9ICQoJyNhbmwtZnJvbUhvdXJOUycsIHRoaXMuX3JhbmdlTW9kYWwpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDAsXG5cdFx0XHRtYXg6IDIzLFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vblJhbmdlQ2hhbmdlLCB0aGlzKVxuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdC8vIEluaXQgdG8gZGF0ZSBwaWNrZXJcblx0XHR0aGlzLl90b0RhdGVEUCA9ICQoJyNhbmwtdG9EYXRlRFAnLCB0aGlzLl9yYW5nZU1vZGFsKS5rZW5kb0RhdGVQaWNrZXIoe1xuXHRcdFx0bWF4OiBuZXcgRGF0ZSgpLFxuXHRcdFx0Zm9vdGVyOiBmYWxzZSxcblx0XHRcdGZvcm1hdDogJ2RkIE1NTSB5eXl5Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vblJhbmdlQ2hhbmdlLCB0aGlzKVxuXHRcdH0pLmRhdGEoJ2tlbmRvRGF0ZVBpY2tlcicpO1xuXG5cdFx0Ly8gSW5pdCB0byBob3VyIGlucHV0XG5cdFx0dGhpcy5fdG9Ib3VyTlMgPSAkKCcjYW5sLXRvSG91ck5TJywgdGhpcy5fcmFuZ2VNb2RhbCkua2VuZG9OdW1lcmljVGV4dEJveCh7XG5cdFx0ICAgIG1pbjogMSxcblx0XHRcdG1heDogMjQsXG5cdFx0ICAgIHN0ZXA6IDEsXG5cdFx0ICAgIGZvcm1hdDogJyMnLFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uUmFuZ2VDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXG5cdFx0Ly8gSW5pdCBzaGlmdCBpbnB1dFxuXHRcdHRoaXMuX3NoaWZ0TlMgPSAkKCcjYW5sLXNoaWZ0TlMnLCB0aGlzLl9yYW5nZU1vZGFsKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAtMTAwLFxuXHRcdFx0bWF4OiAtMSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIycsXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25QcmVkZWZpbmVkUmFuZ2VDaGFuZ2UsIHRoaXMpXG5cdFx0fSkuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXHR9XG5cblx0X29uUmFuZ2VDaGFuZ2UoKVxuXHR7XG5cdFx0dGhpcy5zZXRDdXN0b21SYW5nZSgpO1xuXHR9XG5cblx0X29uUHJlZGVmaW5lZFJhbmdlQ2hhbmdlKClcblx0e1xuXHRcdHRoaXMuc2V0UHJlZGVmaW5lZFJhbmdlKHRoaXMuX3JhbmdlREQudmFsdWUoKSk7XG5cdH1cblxuXHRfc2V0UmFuZ2UoZnJvbSwgdG8sIHByZWRlZkluZGV4KVxuXHR7XG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZSA9IG5ldyBTdGF0c0RhdGFSYW5nZSgpO1xuXG5cdFx0Ly8gU2V0IHNlbGVjdGVkIHJhbmdlXG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluRnJvbSA9IGZyb207XG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8gPSB0bztcblxuXHRcdC8vIFNldCBjb21wYXJlZCByYW5nZVxuXHRcdHRoaXMuX3NldENvbXBhcmVkUmFuZ2UoKTtcblxuXHRcdC8vIFVwZGF0ZSB2aWV3XG5cdFx0dGhpcy5fdXBkYXRlVmlldyhwcmVkZWZJbmRleCk7XG5cdH1cblxuXHRfc2V0Q29tcGFyZWRSYW5nZSgpXG5cdHtcblx0XHRjb25zdCBjb21wYXJlU2hpZnQgPSB0aGlzLl9nZXRDb21wYXJlU2hpZnQoKTtcblxuXHRcdGlmIChjb21wYXJlU2hpZnQgPCAwKVxuXHRcdHtcblx0XHRcdGNvbnN0IHJhbmdlRGlmZiA9IHRoaXMuX3NlbGVjdGVkUmFuZ2UubWFpblRvLmRpZmYodGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluRnJvbSwgJ2RheXMnKTtcblxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZS5jb21wYXJlRnJvbSA9IG1vbWVudCh0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tKS5hZGQoY29tcGFyZVNoaWZ0ICogKHJhbmdlRGlmZiArIDEpLCAnZGF5cycpO1xuXHRcdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZS5jb21wYXJlVG8gPSBtb21lbnQodGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8pLmFkZChjb21wYXJlU2hpZnQgKiAocmFuZ2VEaWZmICsgMSksICdkYXlzJyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLl9zZWxlY3RlZFJhbmdlLmNvbXBhcmVGcm9tID0gbnVsbDtcblx0XHRcdHRoaXMuX3NlbGVjdGVkUmFuZ2UuY29tcGFyZVRvID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Q29tcGFyZVNoaWZ0KClcblx0e1xuXHRcdHJldHVybiAodGhpcy5fY29tcGFyZUNiLnByb3AoJ2NoZWNrZWQnKSA/IHRoaXMuX3NoaWZ0TlMudmFsdWUoKSA6IDApO1xuXHR9XG5cblx0X3VwZGF0ZVZpZXcoaW5kZXgpXG5cdHtcblx0XHQvLyBQcmVkZWZpbmVkIHJhbmdlIHNlbGVjdG9yXG5cdFx0dGhpcy5fcmFuZ2VERC5zZWxlY3QoaW5kZXgpO1xuXG5cdFx0Y29uc3QgaXNDdXN0b20gPSAoaW5kZXggPT0gdGhpcy5QUkVERUZJTkVEX1JBTkdFUy5pbmRleE9mKHRoaXMuQ1VTVE9NKSk7XG5cdFx0dGhpcy5fZnJvbURhdGVEUC5lbmFibGUoaXNDdXN0b20pO1xuXHRcdHRoaXMuX2Zyb21Ib3VyTlMuZW5hYmxlKGlzQ3VzdG9tKTtcblx0XHR0aGlzLl90b0RhdGVEUC5lbmFibGUoaXNDdXN0b20pO1xuXHRcdHRoaXMuX3RvSG91ck5TLmVuYWJsZShpc0N1c3RvbSk7XG5cblx0XHQvLyBBbHdheXMgc2V0IHRvIHJlYWRvbmx5IHRvIGRpc2FibGUgbWFudWFsIGlucHV0XG5cdFx0aWYgKGlzQ3VzdG9tKVxuXHRcdHtcblx0XHRcdCQoJyNhbmwtZnJvbURhdGVEUCcsIHRoaXMuX3JhbmdlTW9kYWwpLmF0dHIoJ3JlYWRvbmx5JywgdHJ1ZSk7XG5cdFx0XHQkKCcjYW5sLXRvRGF0ZURQJywgdGhpcy5fcmFuZ2VNb2RhbCkuYXR0cigncmVhZG9ubHknLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBGcm9tXG5cdFx0dGhpcy5fZnJvbURhdGVEUC52YWx1ZSh0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tLnRvRGF0ZSgpKTtcblx0XHR0aGlzLl9mcm9tSG91ck5TLnZhbHVlKHRoaXMuX3NlbGVjdGVkUmFuZ2UubWFpbkZyb20uaG91cnMoKSk7XG5cdFx0dGhpcy5fdG9EYXRlRFAubWluKHRoaXMuX3NlbGVjdGVkUmFuZ2UubWFpbkZyb20udG9EYXRlKCkpO1xuXG5cdFx0Ly8gVG9cblx0XHR0aGlzLl90b0RhdGVEUC52YWx1ZSh0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Uby50b0RhdGUoKSk7XG5cdFx0dGhpcy5fdG9Ib3VyTlMudmFsdWUodGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8uaG91cnMoKSArIDEpO1xuXG5cdFx0Ly8gQ29tcGFyZWQgcmFuZ2UgaW4gdGV4dGZpZWxkc1xuXHRcdCQoJyNhbmwtY29tcGFyZUZyb21EYXRlTGInLCB0aGlzLl9yYW5nZU1vZGFsKS50ZXh0KHRoaXMuX3NlbGVjdGVkUmFuZ2UuZ2V0Q29tcGFyZUZyb21TdHJpbmcoKSk7XG5cdFx0JCgnI2FubC1jb21wYXJlVG9EYXRlTGInLCB0aGlzLl9yYW5nZU1vZGFsKS50ZXh0KHRoaXMuX3NlbGVjdGVkUmFuZ2UuZ2V0Q29tcGFyZVRvU3RyaW5nKCkpO1xuXG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkUmFuZ2UuY29tcGFyZUZyb20gIT0gbnVsbCAmJiB0aGlzLl9zZWxlY3RlZFJhbmdlLmNvbXBhcmVUbyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHRoaXMuX2NvbXBhcmVDYi5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cblx0XHRcdGNvbnN0IGRpZmYxID0gdGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluVG8uZGlmZih0aGlzLl9zZWxlY3RlZFJhbmdlLm1haW5Gcm9tLCAnZGF5cycpICsgMTtcblx0XHRcdGNvbnN0IGRpZmYyID0gdGhpcy5fc2VsZWN0ZWRSYW5nZS5tYWluRnJvbS5kaWZmKHRoaXMuX3NlbGVjdGVkUmFuZ2UuY29tcGFyZUZyb20sICdkYXlzJyk7XG5cblx0XHRcdHRoaXMuX3NoaWZ0TlMudmFsdWUoLShkaWZmMi9kaWZmMSkpO1xuXHRcdFx0bGV0IHNoaWZ0TGFiZWwgPSAkKCcjYW5sLXNoaWZ0TGInLCB0aGlzLl9yYW5nZU1vZGFsKTtcblxuXHRcdFx0aWYgKGRpZmYxID09IDEpXG5cdFx0XHRcdHNoaWZ0TGFiZWwudGV4dCgnZGF5JyArICh0aGlzLl9zaGlmdE5TLnZhbHVlKCkgPCAtMSA/ICdzJyA6ICcnKSk7XG5cdFx0XHRlbHNlIGlmIChkaWZmMSA9PSA3KVxuXHRcdFx0XHRzaGlmdExhYmVsLnRleHQoJ3dlZWsnICsgKHRoaXMuX3NoaWZ0TlMudmFsdWUoKSA8IC0xID8gJ3MnIDogJycpKTtcblx0XHRcdGVsc2UgaWYgKGRpZmYxIDw9IDMxICYmIGRpZmYxID49IDI4KVxuXHRcdFx0XHRzaGlmdExhYmVsLnRleHQoJ21vbnRoJyArICh0aGlzLl9zaGlmdE5TLnZhbHVlKCkgPCAtMSA/ICdzJyA6ICcnKSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHNoaWZ0TGFiZWwudGV4dCgnKGN1c3RvbSBzcGFuKScpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5fY29tcGFyZUNiLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHR0aGlzLl9zaGlmdE5TLnZhbHVlKC0xKTtcblx0XHR9XG5cdH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbmV4cG9ydCBjbGFzcyBTdGF0c0RhdGFSYW5nZVxue1xuXHRzdGF0aWMgZ2V0IFNFUEFSQVRPUigpIHsgcmV0dXJuICcgwrsgJzsgfVxuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHRoaXMubWFpbkZyb20gPSBudWxsO1xuXHRcdHRoaXMubWFpblRvID0gbnVsbDtcblx0XHR0aGlzLmNvbXBhcmVGcm9tID0gbnVsbDtcblx0XHR0aGlzLmNvbXBhcmVUbyA9IG51bGw7XG5cdH1cblxuXHRzdGF0aWMgbmV3RnJvbVNGU09iamVjdChvYmopXG5cdHtcblx0XHRsZXQgc2RyID0gbmV3IFN0YXRzRGF0YVJhbmdlKCk7XG5cblx0XHRzZHIubWFpbkZyb20gPSBEYXRlSGVscGVyLmdldERhdGVGcm9tVHJhbnNmZXJTdHJpbmcob2JqLmdldFV0ZlN0cmluZygnbWZyb20nKSk7XG5cdFx0c2RyLm1haW5UbyA9IERhdGVIZWxwZXIuZ2V0RGF0ZUZyb21UcmFuc2ZlclN0cmluZyhvYmouZ2V0VXRmU3RyaW5nKCdtdG8nKSk7XG5cblx0XHRpZiAob2JqLmNvbnRhaW5zS2V5KCdjZnJvbScpICYmIG9iai5jb250YWluc0tleSgnY3RvJykpXG5cdFx0e1xuXHRcdFx0c2RyLmNvbXBhcmVGcm9tID0gRGF0ZUhlbHBlci5nZXREYXRlRnJvbVRyYW5zZmVyU3RyaW5nKG9iai5nZXRVdGZTdHJpbmcoJ2Nmcm9tJykpO1xuXHRcdFx0c2RyLmNvbXBhcmVUbyA9ICBEYXRlSGVscGVyLmdldERhdGVGcm9tVHJhbnNmZXJTdHJpbmcob2JqLmdldFV0ZlN0cmluZygnY3RvJykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzZHI7XG5cdH1cblxuXHRnZXQgZG9Db21wYXJlKClcblx0e1xuXHRcdHJldHVybiAodGhpcy5jb21wYXJlRnJvbSAhPSBudWxsICYmIHRoaXMuY29tcGFyZVRvICE9IG51bGwpO1xuXHR9XG5cblx0ZHVtcCgpXG5cdHtcblx0XHRjb25zb2xlLmxvZygnLS0tLS0gUkFOR0UgLS0tLScpXG5cdFx0Y29uc29sZS5sb2coJ0Zyb206JywgdGhpcy5tYWluRnJvbS50b1N0cmluZygpKTtcblx0XHRjb25zb2xlLmxvZygnVG86JywgdGhpcy5tYWluVG8udG9TdHJpbmcoKSk7XG5cblx0XHRpZiAodGhpcy5jb21wYXJlRnJvbSAhPSBudWxsICYmIHRoaXMuY29tcGFyZVRvICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5sb2coJy0tLS0gQ09NUEFSRSAtLS0tJylcblx0XHRcdGNvbnNvbGUubG9nKCdGcm9tOicsIHRoaXMuY29tcGFyZUZyb20udG9TdHJpbmcoKSk7XG5cdFx0XHRjb25zb2xlLmxvZygnVG86JywgdGhpcy5jb21wYXJlVG8udG9TdHJpbmcoKSk7XG5cdFx0fVxuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0nKVxuXHR9XG5cblx0dG9TRlNPYmplY3QoKVxuXHR7XG5cdFx0bGV0IG9iaiA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblxuXHRcdG9iai5wdXRVdGZTdHJpbmcoJ21mcm9tJywgRGF0ZUhlbHBlci5nZXRUcmFuc2ZlclN0cmluZ0Zyb21EYXRlKHRoaXMubWFpbkZyb20pKTtcblx0XHRvYmoucHV0VXRmU3RyaW5nKCdtdG8nLCBEYXRlSGVscGVyLmdldFRyYW5zZmVyU3RyaW5nRnJvbURhdGUodGhpcy5tYWluVG8pKTtcblxuXHRcdGlmICh0aGlzLmRvQ29tcGFyZSlcblx0XHR7XG5cdFx0XHRvYmoucHV0VXRmU3RyaW5nKCdjZnJvbScsIERhdGVIZWxwZXIuZ2V0VHJhbnNmZXJTdHJpbmdGcm9tRGF0ZSh0aGlzLmNvbXBhcmVGcm9tKSk7XG5cdFx0XHRvYmoucHV0VXRmU3RyaW5nKCdjdG8nLCBEYXRlSGVscGVyLmdldFRyYW5zZmVyU3RyaW5nRnJvbURhdGUodGhpcy5jb21wYXJlVG8pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9XG5cblx0bWFpbkVxdWFsc1RvKG90aGVyUmFuZ2UpXG5cdHtcblx0XHRpZiAob3RoZXJSYW5nZSA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gTWFpbiBmcm9tXG5cdFx0aWYgKCFEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKHRoaXMubWFpbkZyb20sIG90aGVyUmFuZ2UubWFpbkZyb20pKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gTWFpbiB0b1xuXHRcdGlmICghRGF0ZUhlbHBlci5hcmVEYXRlVGltZXNFcXVhbCh0aGlzLm1haW5Ubywgb3RoZXJSYW5nZS5tYWluVG8pKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRjb21wYXJlRXF1YWxzVG8ob3RoZXJSYW5nZSlcblx0e1xuXHRcdGlmIChvdGhlclJhbmdlID09IG51bGwpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBDb21wYXJlIGZyb21cblx0XHRpZiAoIURhdGVIZWxwZXIuYXJlRGF0ZVRpbWVzRXF1YWwodGhpcy5jb21wYXJlRnJvbSwgb3RoZXJSYW5nZS5jb21wYXJlRnJvbSkpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBDb21wYXJlIHRvXG5cdFx0aWYgKCFEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKHRoaXMuY29tcGFyZVRvLCBvdGhlclJhbmdlLmNvbXBhcmVUbykpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF90b1N0cmluZyhkYXRlKVxuXHR7XG5cdFx0cmV0dXJuIGRhdGUuZm9ybWF0KERhdGVIZWxwZXIuREFURV9NQVNLKTtcblx0fVxuXG5cdF90b1N0cmluZ1dpdGhIb3VyKGRhdGUsIGFkZDEpXG5cdHtcblx0XHRyZXR1cm4gYCR7dGhpcy5fdG9TdHJpbmcoZGF0ZSl9ICR7ZGF0ZS5ob3VycygpICsgKGFkZDEgPyAxIDogMCl9aGA7XG5cdH1cblxuXHRnZXRNYWluUmFuZ2VTdHJpbmcoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3RvU3RyaW5nKHRoaXMubWFpbkZyb20pICsgU3RhdHNEYXRhUmFuZ2UuU0VQQVJBVE9SICsgdGhpcy5fdG9TdHJpbmcodGhpcy5tYWluVG8pO1xuXHR9XG5cblx0Z2V0Q29tcGFyZVJhbmdlU3RyaW5nKHByZWZpeCA9ICcnKVxuXHR7XG5cdFx0aWYgKHRoaXMuZG9Db21wYXJlKVxuXHRcdFx0cmV0dXJuIHByZWZpeCArIHRoaXMuX3RvU3RyaW5nKHRoaXMuY29tcGFyZUZyb20pICsgU3RhdHNEYXRhUmFuZ2UuU0VQQVJBVE9SICsgdGhpcy5fdG9TdHJpbmcodGhpcy5jb21wYXJlVG8pO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAnJztcblx0fVxuXG5cdGdldENvbXBhcmVGcm9tU3RyaW5nKClcblx0e1xuXHRcdGlmICh0aGlzLmNvbXBhcmVGcm9tICE9IG51bGwpXG5cdFx0XHRyZXR1cm4gdGhpcy5fdG9TdHJpbmdXaXRoSG91cih0aGlzLmNvbXBhcmVGcm9tLCBmYWxzZSk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuICcnO1xuXHR9XG5cblx0Z2V0Q29tcGFyZVRvU3RyaW5nKClcblx0e1xuXHRcdGlmICh0aGlzLmNvbXBhcmVUbyAhPSBudWxsKVxuXHRcdFx0cmV0dXJuIHRoaXMuX3RvU3RyaW5nV2l0aEhvdXIodGhpcy5jb21wYXJlVG8sIHRydWUpO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAnJztcblx0fVxufVxuIiwiaW1wb3J0IHtCYXNlTWV0cmljfSBmcm9tICcuL21ldHJpYyc7XG5pbXBvcnQge0RhdGVIZWxwZXJ9IGZyb20gJy4uL3V0aWxzL2RhdGUtaGVscGVyJztcbmltcG9ydCB7U3RhdHNEYXRhUmFuZ2V9IGZyb20gJy4uL2RhdGEtcmFuZ2UtbWFuYWdlcic7XG5cbmV4cG9ydCBjbGFzcyBNZXRyaWNDb250YWluZXJcbntcblx0Y29uc3RydWN0b3Iodmlld0lkLCBiYXNlTWV0cmljcylcblx0e1xuXHRcdHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcblxuXHRcdHRoaXMubWFpbk1ldHJpY3MgPSBbXTtcblx0XHR0aGlzLmNvbXBNZXRyaWNzID0gW107XG5cdFx0dGhpcy5tZXRyaWNJZHMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZU1ldHJpY3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0aWYgKGJhc2VNZXRyaWNzW2ldIGluc3RhbmNlb2YgQmFzZU1ldHJpYylcblx0XHRcdFx0dGhpcy5fYWRkTWV0cmljKGJhc2VNZXRyaWNzW2ldKTtcblx0XHR9XG5cdH1cblxuXHRnZXRQYXJlbnRWaWV3KClcblx0e1xuXHRcdHJldHVybiB0aGlzLl92aWV3SWQ7XG5cdH1cblxuXHRjb250YWluc01ldHJpYyhpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLm1ldHJpY0lkcy5pbmRleE9mKGlkKSA+IC0xO1xuXHR9XG5cblx0Z2V0TWFpbk1ldHJpYyhpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLm1haW5NZXRyaWNzW2lkXTtcblx0fVxuXG5cdGdldENvbXBhcmVNZXRyaWMoaWQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5jb21wTWV0cmljc1tpZF07XG5cdH1cblxuXHRpc01ldHJpY1VwZGF0ZWQoaWQsIHNkciwgZmlsdGVyKVxuXHR7XG5cdFx0bGV0IG1pc3NpbmdWYWx1ZXMgPSB0aGlzLmdldE1ldHJpY01pc3NpbmdWYWx1ZUZsYWdzKGlkLCBzZHIsIGZpbHRlcik7XG5cblx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG1pc3NpbmdWYWx1ZXMubGVuZ3RoOyBqKyspXG5cdFx0e1xuXHRcdFx0aWYgKG1pc3NpbmdWYWx1ZXNbal0pXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGdldE1ldHJpY01pc3NpbmdWYWx1ZUZsYWdzKGlkLCBzZHIsIGZpbHRlcilcblx0e1xuXHRcdGxldCBtYWluTWlzc2luZ0ZsYWdzID0gdGhpcy5fZ2V0TWV0cmljTWlzc2luZ1ZhbHVlRmxhZ3MxKGlkLCBmYWxzZSwgc2RyLm1haW5Gcm9tLCBzZHIubWFpblRvLCBmaWx0ZXIpO1xuXHRcdGxldCBjb21wTWlzc2luZ0ZsYWdzO1xuXG5cdFx0aWYgKHNkci5kb0NvbXBhcmUpXG5cdFx0XHRjb21wTWlzc2luZ0ZsYWdzID0gdGhpcy5fZ2V0TWV0cmljTWlzc2luZ1ZhbHVlRmxhZ3MxKGlkLCB0cnVlLCBzZHIuY29tcGFyZUZyb20sIHNkci5jb21wYXJlVG8sIGZpbHRlcik7XG5cdFx0ZWxzZVxuXHRcdFx0Y29tcE1pc3NpbmdGbGFncyA9IFtmYWxzZSwgZmFsc2VdO1xuXG5cdFx0cmV0dXJuIG1haW5NaXNzaW5nRmxhZ3MuY29uY2F0KGNvbXBNaXNzaW5nRmxhZ3MpO1xuXHR9XG5cblx0X2FkZE1ldHJpYyhiYXNlTWV0cmljKVxuXHR7XG5cdFx0bGV0IG1haW4gPSBuZXcgTWV0cmljKGJhc2VNZXRyaWMpO1xuXHRcdGxldCBjb21wID0gbmV3IE1ldHJpYyhiYXNlTWV0cmljKTtcblxuXHRcdHRoaXMubWFpbk1ldHJpY3NbYmFzZU1ldHJpYy5pZF0gPSBtYWluO1xuXHRcdHRoaXMuY29tcE1ldHJpY3NbYmFzZU1ldHJpYy5pZF0gPSBjb21wO1xuXG5cdFx0dGhpcy5tZXRyaWNJZHMucHVzaChiYXNlTWV0cmljLmlkKTtcblx0fVxuXG5cdF9nZXRNZXRyaWNNaXNzaW5nVmFsdWVGbGFnczEoaWQsIGlzQ29tcGFyZSwgcmFuZ2VGcm9tLCByYW5nZVRvLCBmaWx0ZXIpXG5cdHtcblx0XHRsZXQgbWV0cmljID0gKCFpc0NvbXBhcmUgPyB0aGlzLm1haW5NZXRyaWNzW2lkXSA6IHRoaXMuY29tcE1ldHJpY3NbaWRdKTtcblxuXHRcdGxldCBpc092ZXJhbGxNaXNzaW5nID0gZmFsc2U7XG5cdFx0bGV0IGlzRmlsdGVyZWRNaXNzaW5nID0gZmFsc2U7XG5cblx0XHQvLyBNZXRyaWMgY2FuJ3QgYmUgbnVsbDsgaWYgaXQgaXMsIHdlIGFyZSBsb29raW5nIHVwIHRoZSB3cm9uZyBpZFxuXHRcdGlmIChtZXRyaWMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgcmFuZ2VDaGFuZ2VkID0gIURhdGVIZWxwZXIuYXJlRGF0ZVRpbWVzRXF1YWwobWV0cmljLnJhbmdlRnJvbSwgcmFuZ2VGcm9tKSB8fCAhRGF0ZUhlbHBlci5hcmVEYXRlVGltZXNFcXVhbChtZXRyaWMucmFuZ2VUbywgcmFuZ2VUbyk7XG5cblx0XHRcdC8vIE9WRVJBTEwgVkFMVUVcblx0XHRcdGlzT3ZlcmFsbE1pc3NpbmcgPSByYW5nZUNoYW5nZWQ7XG5cblx0XHRcdC8vIEZJTFRFUkVEIFZBTFVFXG5cdFx0XHRpZiAoZmlsdGVyICE9IG51bGwgJiYgdGhpcy5fdmlld0lkID09IGZpbHRlci52aWV3SWQpXG5cdFx0XHR7XG5cdFx0XHRcdGlzRmlsdGVyZWRNaXNzaW5nID0gIChyYW5nZUNoYW5nZWQgJiYgbWV0cmljLmZpbHRlclZhbHVlICE9IG51bGwpIHx8IChmaWx0ZXIudmFsdWUgIT0gbnVsbCAmJiBmaWx0ZXIudmFsdWUgIT0gbWV0cmljLmZpbHRlclZhbHVlKTtcblxuXHRcdFx0XHQvKlxuXHRcdFx0XHQvLyBJZiBmaWx0ZXIgaXMgbm90IGFwcGxpZWQgd2UgY2FuIHNraXAgdGhlIGZpbHRlcmVkIHZhbHVlIChhc3N1bWUgaXQgaXMgdXBkYXRlZCAtIHdlIHdvbid0IHVzZSBpdCBhbnl3YXkpXG5cdFx0XHRcdGlmIChmaWx0ZXIudmFsdWUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIENoZWNrIGZpbHRlcjogaWYgaXQgZGlkbid0IGNoYW5nZSwgdGhlbiB0aGUgZmlsdGVyZWQgdmFsdWUgaXMgdXBkYXRlZFxuXHRcdFx0XHRcdGlmIChtZXRyaWMuZmlsdGVyVmFsdWUgPT0gZmlsdGVyLnZhbHVlKVxuXHRcdFx0XHRcdFx0aXNGaWx0ZXJlZE1pc3NpbmcgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0aXNGaWx0ZXJlZE1pc3NpbmcgPSBmYWxzZTtcblx0XHRcdFx0Ki9cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gW2lzT3ZlcmFsbE1pc3NpbmcsIGlzRmlsdGVyZWRNaXNzaW5nXTtcblx0fVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuZXhwb3J0IGNsYXNzIE1ldHJpY1xue1xuXHRjb25zdHJ1Y3RvcihiYXNlTWV0cmljKVxuXHR7XG5cdFx0dGhpcy5iYXNlTWV0cmljID0gYmFzZU1ldHJpYztcblxuXHRcdHRoaXMuX3ZhbHVlO1xuXHRcdHRoaXMuX3ZhbHVlRiA9IE5hTjtcblxuXHRcdC8vIG1vbWVudC5qc1xuXHRcdHRoaXMucmFuZ2VGcm9tO1xuXHRcdHRoaXMucmFuZ2VUbztcblxuXHRcdHRoaXMuZmlsdGVyTmFtZTtcblx0XHR0aGlzLmZpbHRlclZhbHVlO1xuXHR9XG5cblx0Z2V0UmFuZ2VTdHJpbmcoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMucmFuZ2VGcm9tLmZvcm1hdChEYXRlSGVscGVyLkRBVEVfTUFTSykgKyBTdGF0c0RhdGFSYW5nZS5TRVBBUkFUT1IgKyB0aGlzLnJhbmdlVG8uZm9ybWF0KERhdGVIZWxwZXIuREFURV9NQVNLKTtcblx0fVxuXG5cdGdldFZhbHVlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl92YWx1ZTtcblx0fVxuXG5cdGdldFZhbHVlU3RyaW5nKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9nZXRWYWx1ZUFzU3RyaW5nKHRoaXMuX3ZhbHVlKTtcblx0fVxuXG5cdHNldFZhbHVlKHZhbClcblx0e1xuXHRcdHRoaXMuX3ZhbHVlID0gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbHVlIEYgaXMgdGhlIGZpbHRlcmVkIG1ldHJpYyB2YWx1ZVxuXHQgKiBJZiBubyBmaWx0ZXIgaXMgc2V0LCB2YWx1ZSAxIGlzIHJldHVybmVkLlxuXHQgKi9cblx0Z2V0VmFsdWVGKClcblx0e1xuXHRcdGlmICh0aGlzLmZpbHRlck5hbWUgIT0gbnVsbCB8fCB0aGlzLmZpbHRlclZhbHVlICE9IG51bGwpXG5cdFx0XHRyZXR1cm4gdGhpcy5fdmFsdWVGO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0aGlzLl92YWx1ZTtcblx0fVxuXG5cdGdldFZhbHVlRlN0cmluZygpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0VmFsdWVBc1N0cmluZyh0aGlzLmdldFZhbHVlRigpKTtcblx0fVxuXG5cdHNldFZhbHVlRih2YWwsIGZpbHRlck5hbWUsIGZpbHRlclZhbHVlKVxuXHR7XG5cdFx0aWYgKGZpbHRlclZhbHVlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0dGhpcy5maWx0ZXJOYW1lID0gZmlsdGVyTmFtZTtcblx0XHRcdHRoaXMuZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZTtcblx0XHRcdHRoaXMuX3ZhbHVlRiA9IHZhbDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5yZXNldFZhbHVlRigpO1xuXHR9XG5cblx0cmVzZXRWYWx1ZUYoKVxuXHR7XG5cdFx0dGhpcy5maWx0ZXJOYW1lID0gbnVsbDtcblx0XHR0aGlzLmZpbHRlclZhbHVlID0gbnVsbDtcblx0XHR0aGlzLl92YWx1ZUYgPSBOYU47XG5cdH1cblxuXHR0b1N0cmluZygpXG5cdHtcblx0XHRyZXR1cm4gYCR7YmFzZU1ldHJpYy5pZH0gW292ZXJhbGw6ICR7dGhpcy5nZXRWYWx1ZVN0cmluZygpfSB8IGZpbHRlcmVkICgke3RoaXMuZmlsdGVyTmFtZX06JHt0aGlzLmZpbHRlclZhbHVlfSk6ICR7dGhpcy5nZXRWYWx1ZUZTdHJpbmcoKX1dYDtcblx0fVxuXG5cdF9nZXRWYWx1ZUFzU3RyaW5nKHZhbClcblx0e1xuXHRcdHJldHVybiB0aGlzLmJhc2VNZXRyaWMuZ2V0VmFsdWVBc1N0cmluZyh2YWwpO1xuXHR9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5leHBvcnQgY2xhc3MgQ2hhcnRDb250YWluZXJcbntcblx0Y29uc3RydWN0b3Iodmlld0lkLCBiYXNlTWV0cmljcylcblx0e1xuXHRcdHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcblxuXHRcdHRoaXMubWFpbkNoYXJ0cyA9IFtdO1xuXHRcdHRoaXMuY29tcENoYXJ0cyA9IFtdO1xuXHRcdHRoaXMuY2hhcnRJZHMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZU1ldHJpY3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0aWYgKGJhc2VNZXRyaWNzW2ldIGluc3RhbmNlb2YgQmFzZU1ldHJpYylcblx0XHRcdFx0dGhpcy5fYWRkQ2hhcnQoYmFzZU1ldHJpY3NbaV0pO1xuXHRcdH1cblx0fVxuXG5cdGdldFBhcmVudFZpZXcoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdJZDtcblx0fVxuXG5cdGdldE1haW5DaGFydChpZClcblx0e1xuXHRcdHJldHVybiB0aGlzLm1haW5DaGFydHNbaWRdO1xuXHR9XG5cblx0Z2V0Q29tcGFyZUNoYXJ0KGlkKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuY29tcENoYXJ0c1tpZF07XG5cdH1cblxuXHRpc0NoYXJ0T3ZlcmFsbE91dGRhdGVkKGlkLCBzZHIsIGZpbHRlciwgdGltZVVuaXQpXG5cdHtcblx0XHRpZiAoc2RyLmRvQ29tcGFyZSlcblx0XHRcdHJldHVybiB0aGlzLmlzTWFpbkNoYXJ0T3V0ZGF0ZWQoaWQsIHNkci5tYWluRnJvbSwgc2RyLm1haW5UbywgZmlsdGVyLCB0aW1lVW5pdCkgfHwgdGhpcy5pc0NvbXBhcmVDaGFydE91dGRhdGVkKGlkLCBzZHIuY29tcGFyZUZyb20sIHNkci5jb21wYXJlVG8sIGZpbHRlciwgdGltZVVuaXQpO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0aGlzLmlzTWFpbkNoYXJ0T3V0ZGF0ZWQoaWQsIHNkci5tYWluRnJvbSwgc2RyLm1haW5UbywgZmlsdGVyLCB0aW1lVW5pdCk7XG5cdH1cblxuXHRpc01haW5DaGFydE91dGRhdGVkKGlkLCByYW5nZUZyb20sIHJhbmdlVG8sIGZpbHRlciwgdGltZVVuaXQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faXNDaGFydE91dGRhdGVkKGlkLCBmYWxzZSwgcmFuZ2VGcm9tLCByYW5nZVRvLCBmaWx0ZXIsIHRpbWVVbml0KTtcblx0fVxuXG5cdGlzQ29tcGFyZUNoYXJ0T3V0ZGF0ZWQoaWQsIHJhbmdlRnJvbSwgcmFuZ2VUbywgZmlsdGVyLCB0aW1lVW5pdClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pc0NoYXJ0T3V0ZGF0ZWQoaWQsIHRydWUsIHJhbmdlRnJvbSwgcmFuZ2VUbywgZmlsdGVyLCB0aW1lVW5pdCk7XG5cdH1cblxuXHRfYWRkQ2hhcnQoYmFzZU1ldHJpYylcblx0e1xuXHRcdGxldCBtYWluID0gbmV3IENoYXJ0KGJhc2VNZXRyaWMpO1xuXHRcdGxldCBjb21wID0gbmV3IENoYXJ0KGJhc2VNZXRyaWMpO1xuXG5cdFx0dGhpcy5tYWluQ2hhcnRzW2Jhc2VNZXRyaWMuaWRdID0gbWFpbjtcblx0XHR0aGlzLmNvbXBDaGFydHNbYmFzZU1ldHJpYy5pZF0gPSBjb21wO1xuXG5cdFx0dGhpcy5jaGFydElkcy5wdXNoKGJhc2VNZXRyaWMuaWQpO1xuXHR9XG5cblx0X2lzQ2hhcnRPdXRkYXRlZChpZCwgaXNDb21wYXJlLCByYW5nZUZyb20sIHJhbmdlVG8sIGZpbHRlciwgdGltZVVuaXQpXG5cdHtcblx0XHRsZXQgZmlsdGVyTmFtZSA9IGZpbHRlciAhPSBudWxsID8gZmlsdGVyLm5hbWUgOiBudWxsO1xuXHRcdGxldCBmaWx0ZXJWYWx1ZSA9IGZpbHRlciAhPSBudWxsID8gZmlsdGVyLnZhbHVlIDogbnVsbDtcblxuXHRcdGxldCBjaGFydE9iaiA9ICghaXNDb21wYXJlID8gdGhpcy5tYWluQ2hhcnRzW2lkXSA6IHRoaXMuY29tcENoYXJ0c1tpZF0pO1xuXG5cdFx0aWYgKGNoYXJ0T2JqICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gQ2hlY2sgcmFuZ2Vcblx0XHRcdGlmIChEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKGNoYXJ0T2JqLnJhbmdlRnJvbSwgcmFuZ2VGcm9tKSAmJlxuXHRcdFx0XHREYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKGNoYXJ0T2JqLnJhbmdlVG8sIHJhbmdlVG8pKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBDaGVjayBmaWx0ZXJcblx0XHRcdFx0aWYgKGNoYXJ0T2JqLmZpbHRlck5hbWUgPT0gZmlsdGVyTmFtZSAmJiBjaGFydE9iai5maWx0ZXJWYWx1ZSA9PSBmaWx0ZXJWYWx1ZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIENoZWNrIHRpbWUgdW5pdFxuXHRcdFx0XHRcdGlmIChjaGFydE9iai50aW1lVW5pdCA9PSB0aW1lVW5pdClcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5leHBvcnQgY2xhc3MgQ2hhcnRcbntcblx0Y29uc3RydWN0b3IoYmFzZU1ldHJpYylcblx0e1xuXHRcdHRoaXMuYmFzZU1ldHJpYyA9IGJhc2VNZXRyaWM7XG5cdFx0dGhpcy5kYXRhWCA9IFtdO1xuXHRcdHRoaXMuZGF0YVkgPSBbXTtcblx0XHR0aGlzLnJhbmdlRnJvbTtcblx0XHR0aGlzLnJhbmdlVG87XG5cdFx0dGhpcy50aW1lVW5pdDtcblx0XHR0aGlzLmZpbHRlck5hbWU7XG5cdFx0dGhpcy5maWx0ZXJWYWx1ZTtcblx0fVxufVxuIiwiaW1wb3J0IHtEYXRlSGVscGVyfSBmcm9tICcuLi91dGlscy9kYXRlLWhlbHBlcic7XG5pbXBvcnQge1N0YXRzRGF0YVJhbmdlfSBmcm9tICcuLi9kYXRhLXJhbmdlLW1hbmFnZXInO1xuXG5leHBvcnQgY2xhc3MgTWV0cmljVHlwZVxue1xuXHRzdGF0aWMgZ2V0IE5VTUJFUigpIHsgcmV0dXJuICdudW1iZXInIH1cblx0c3RhdGljIGdldCBQRVJDRU5UQUdFKCkgeyByZXR1cm4gJ3BlcmNlbnRhZ2UnIH1cblx0c3RhdGljIGdldCBUSU1FKCkgeyByZXR1cm4gJ3RpbWUnIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbmV4cG9ydCBjbGFzcyBCYXNlTWV0cmljXG57XG5cdGNvbnN0cnVjdG9yKGlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgdHlwZSwgaXNTdWJNZXRyaWMgPSBmYWxzZSlcblx0e1xuXHRcdHRoaXMuX2lkID0gaWQ7XG5cdFx0dGhpcy5fbmFtZSA9IG5hbWU7XG5cdFx0dGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblx0XHR0aGlzLl90eXBlID0gdHlwZTtcblx0XHR0aGlzLl9pc1N1Yk1ldHJpYyA9IGlzU3ViTWV0cmljO1xuXHR9XG5cblx0Z2V0IGlkKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pZDtcblx0fVxuXG5cdGdldCBuYW1lKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9uYW1lO1xuXHR9XG5cblx0Z2V0IGRlc2NyaXB0aW9uKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcblx0fVxuXG5cdGdldCB0eXBlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl90eXBlO1xuXHR9XG5cblx0Z2V0IGlzU3ViTWV0cmljKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pc1N1Yk1ldHJpYztcblx0fVxuXG5cdGdldCBpc1BlcmNlbnRhZ2UoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3R5cGUgPT0gTWV0cmljVHlwZS5QRVJDRU5UQUdFO1xuXHR9XG5cblx0Z2V0IGlzVGltZSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdHlwZSA9PSBNZXRyaWNUeXBlLlRJTUU7XG5cdH1cblxuXHRnZXRWYWx1ZUFzU3RyaW5nKHZhbClcblx0e1xuXHRcdGlmICghaXNOYU4odmFsKSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5pc1BlcmNlbnRhZ2UpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh2YWwgPj0gMClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh2YWwgJSAxID09IDApXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsLnRvU3RyaW5nKCkgKyAnJSc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbC50b0ZpeGVkKDIpICsgJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gJy0tJztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHRoaXMuaXNUaW1lKVxuXHRcdFx0XHRyZXR1cm4gRGF0ZUhlbHBlci5mb3JtYXRUaW1lKHZhbCk7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh2YWwgJSAxID09IDApXG5cdFx0XHRcdFx0cmV0dXJuIHZhbC50b1N0cmluZygpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmV0dXJuIHZhbC50b0ZpeGVkKDIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gJyc7XG5cdH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTdGF0c0RhdGFGaWx0ZXJcbntcblx0Y29uc3RydWN0b3Iodmlld0lkLCBuYW1lLCB2YWx1ZSlcblx0e1xuXHRcdHRoaXMudmlld0lkID0gdmlld0lkO1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0dG9TRlNPYmplY3QoKVxuXHR7XG5cdFx0bGV0IG9iaiA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRvYmoucHV0VXRmU3RyaW5nKCduYW1lJywgdGhpcy5uYW1lKTtcblx0XHRvYmoucHV0VXRmU3RyaW5nKCd2YWx1ZScsIHRoaXMudmFsdWUpO1xuXG5cdFx0cmV0dXJuIG9iajtcblx0fVxufVxuIiwiaW1wb3J0IHtEYXRlSGVscGVyfSBmcm9tICcuLi91dGlscy9kYXRlLWhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZURhdGFcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5yYW5nZUZyb207XG5cdFx0dGhpcy5yYW5nZVRvO1xuXHRcdHRoaXMuZGF0YTtcblx0fVxuXG5cdGlzRGF0YVVwZGF0ZWQobmV3UmFuZ2VGcm9tLCBuZXdSYW5nZVRvKVxuXHR7XG5cdFx0cmV0dXJuIChEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKHRoaXMucmFuZ2VGcm9tLCBuZXdSYW5nZUZyb20pICYmIERhdGVIZWxwZXIuYXJlRGF0ZVRpbWVzRXF1YWwodGhpcy5yYW5nZVRvLCBuZXdSYW5nZVRvKSk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1ldHJpYywgTWV0cmljVHlwZX0gZnJvbSAnLi9kYXRhL21ldHJpYyc7XG5pbXBvcnQge0RhdGVIZWxwZXJ9IGZyb20gJy4vdXRpbHMvZGF0ZS1oZWxwZXInO1xuaW1wb3J0IHtNZXRyaWNDb250YWluZXIsIENoYXJ0Q29udGFpbmVyfSBmcm9tICcuL2RhdGEvY29udGFpbmVycyc7XG5pbXBvcnQge1RhYmxlRGF0YX0gZnJvbSAnLi9kYXRhL3RhYmxlLWRhdGEnO1xuaW1wb3J0IHtWaWV3TWFuYWdlcn0gZnJvbSAnLi92aWV3LW1hbmFnZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBNZXRyaWNzTWFuYWdlclxue1xuXHRzdGF0aWMgZ2V0IENPTlRBQ1RTKCkgeyByZXR1cm4gJ2NvbnRhY3RzJyB9XG5cdHN0YXRpYyBnZXQgVklTSVRTKCkgeyByZXR1cm4gJ3Zpc2l0cycgfVxuXHRzdGF0aWMgZ2V0IFVOSVFVRV9WSVNJVE9SUygpIHsgcmV0dXJuICd1VmlzaXRvcnMnIH1cblx0c3RhdGljIGdldCBORVdfVklTSVRPUlMoKSB7IHJldHVybiAnblZpc2l0b3JzJyB9XG5cdHN0YXRpYyBnZXQgTkVXX1ZJU0lUT1JTX1ZJU0lUUygpIHsgcmV0dXJuICduVmlzaXRvcnNWaXNpdHMnIH1cblx0c3RhdGljIGdldCBSRVRfVklTSVRPUlMoKSB7IHJldHVybiAnclZpc2l0b3JzJyB9XG5cdHN0YXRpYyBnZXQgUkVUX1ZJU0lUT1JTX1ZJU0lUUygpIHsgcmV0dXJuICdyVmlzaXRvcnNWaXNpdHMnIH1cblx0c3RhdGljIGdldCBQRVJDX05FV19WSVNJVE9SUygpIHsgcmV0dXJuICclbmV3VmlzaXRvcnMnIH1cblx0c3RhdGljIGdldCBQRVJDX1JFVF9WSVNJVE9SUygpIHsgcmV0dXJuICclcmV0VmlzaXRvcnMnIH1cblx0c3RhdGljIGdldCBQRVJDX05FV19WSVNJVFNfMSgpIHsgcmV0dXJuICclbmV3VmlzaXRzMScgfVxuXHQvL3N0YXRpYyBnZXQgUEVSQ19ORVdfVklTSVRTXzIoKSB7IHJldHVybiAnJW5ld1Zpc2l0czInIH1cblx0c3RhdGljIGdldCBBVkdfVklTSVRfRFVSQVRJT04oKSB7IHJldHVybiAnYXZnVmlzaXREdXInIH1cblx0c3RhdGljIGdldCBBVkdfQ0NVKCkgeyByZXR1cm4gJ2F2Z0NjdScgfVxuXHRzdGF0aWMgZ2V0IFBFQUtfQ0NVKCkgeyByZXR1cm4gJ3BlYWtDY3UnIH1cblx0c3RhdGljIGdldCBST09NU19DUkVBVEVEKCkgeyByZXR1cm4gJ3Jvb21zJyB9XG5cdHN0YXRpYyBnZXQgQVZHX1JPT01fRFVSQVRJT04oKSB7IHJldHVybiAnYXZnUm9vbUR1cicgfVxuXHRzdGF0aWMgZ2V0IFBFUkNfR0FNRV9ST09NUygpIHsgcmV0dXJuICclZ2FtZXMnIH1cblx0c3RhdGljIGdldCBST09NX0pPSU5TKCkgeyByZXR1cm4gJ2pvaW5zJyB9XG5cdHN0YXRpYyBnZXQgQVZHX1JPT01fSk9JTlMoKSB7IHJldHVybiAnYXZnSm9pbnMnIH1cblx0c3RhdGljIGdldCBFWENFUFRJT05TKCkgeyByZXR1cm4gJ2V4Y2VwdGlvbnMnIH1cblx0c3RhdGljIGdldCBVTklRVUVfRVhDRVBUSU9OUygpIHsgcmV0dXJuICd1RXhjZXB0aW9ucycgfVxuXHRzdGF0aWMgZ2V0IEFWR19FWENFUFRfT0NDVVJFTkNFKCkgeyByZXR1cm4gJ2F2Z0V4Y09jY3VycicgfVxuXG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5TVUJNRVRSSUNfRElGRiA9ICdkaWZmJztcblx0XHR0aGlzLlNVQk1FVFJJQ19QRVJDID0gJ3BlcmMnO1xuXHRcdHRoaXMuU1VCTUVUUklDX0RJViA9ICdkaXYnO1xuXG5cdFx0dGhpcy5DT05UQUNUUyA9XHRcdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5DT05UQUNUUywgJ0NvbnRhY3RzJywgJ1RvdGFsIG51bWJlciBvZiBjb25uZWN0aW9uc1xcbjxpPkEgY29ubmVjdGlvbiBpcyByZWNvcmRlZCBlYWNoIHRpbWUgYSBzb2NrZXQvQmx1ZUJveCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGJ5IGEgY2xpZW50PC9pPicsIE1ldHJpY1R5cGUuTlVNQkVSKTtcblx0XHR0aGlzLlZJU0lUUyA9XHRcdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5WSVNJVFMsICdWaXNpdHMnLCAnVG90YWwgbnVtYmVyIG9mIHZpc2l0c1xcbjxpPkEgdmlzaXQgaXMgcmVjb3JkZWQgZWFjaCB0aW1lIGEgdXNlciBwZXJmb3JtcyBhIHN1Y2Nlc3NmdWwgbG9naW48L2k+JywgTWV0cmljVHlwZS5OVU1CRVIpO1xuXHRcdHRoaXMuVU5JUVVFX1ZJU0lUT1JTID1cdFx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLCAnVW5pcXVlIHZpc2l0b3JzJywgJ051bWJlciBvZiB1bmR1cGxpY2F0ZWQgKGNvdW50ZWQgb25seSBvbmNlKSB2aXNpdG9ycyBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kXFxuPGk+VGhlIHZpc2l0b3IgdW5pcXVlbmVzcyBpcyBiYXNlZCBvbiB0aGUgdXNlcm5hbWUgYW5kIGxvZ2luIFpvbmU6IHRoZSBzYW1lIHVzZXJuYW1lIHVzZWQgaW4gZGlmZmVyZW50IFpvbmVzIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBkaWZmZXJlbnQgdmlzaXRvcjwvaT4nLCBNZXRyaWNUeXBlLk5VTUJFUik7XG5cdFx0dGhpcy5ORVdfVklTSVRPUlMgPVx0XHRcdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUywgJ05ldyB2aXNpdG9ycycsICdOdW1iZXIgb2YgZmlyc3QgdGltZSB2aXNpdG9ycywgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZFxcbjxpPkEgdmlzaXRvciBpcyByZWNvcmRlZCBhcyBcXCduZXdcXCcgaWYgdGhlaXIgdXNlcm5hbWUgaGFzIG5ldmVyIGJlZW4gdXNlZCBiZWZvcmUgaW4gdGhlIHNhbWUgWm9uZSAoYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBkYXRhKTwvaT4nLCBNZXRyaWNUeXBlLk5VTUJFUik7XG5cdFx0dGhpcy5ORVdfVklTSVRPUlNfVklTSVRTID1cdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SU19WSVNJVFMsICdWaXNpdHMgb2YgbmV3IHZpc2l0b3JzJywgJ1RvdGFsIG51bWJlciBvZiB2aXNpdHMgb2YgZmlyc3QgdGltZSB2aXNpdG9ycyBvdmVyIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZFxcbjxpPkEgdmlzaXQgaXMgcmVjb3JkZWQgYSBcXCduZXdcXCcgb3ZlciB0aGUgdGltZSBwZXJpb2QgaWYgdGhlIHVzZXIgaXMgcmVjb3JkZWQgYXMgbmV3IHZpc2l0b3IgaW4gdGhhdCBwZXJpb2Q8L2k+JywgTWV0cmljVHlwZS5OVU1CRVIpO1xuXHRcdHRoaXMuUkVUX1ZJU0lUT1JTID1cdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5SRVRfVklTSVRPUlMsICdSZXR1cm5pbmcgdmlzaXRvcnMnLCAnTnVtYmVyIG9mIHZpc2l0b3JzIHdob3NlIGZpcnN0IHZpc2l0IGhhcHBlbmVkIGJlZm9yZSB0aGUgc2VsZWN0ZWQgdGltZSBwZXJpb2RcXG48aT5BIHZpc2l0b3IgaXMgcmVjb3JkZWQgYXMgXFwncmV0dXJuaW5nXFwnIGlmIHRoZWlyIHVzZXJuYW1lIHdhcyBhbHJlYWR5IHVzZWQgYmVmb3JlIGluIHRoZSBzYW1lIFpvbmUgKGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZGF0YSk8L2k+JywgTWV0cmljVHlwZS5OVU1CRVIsIHRydWUpO1xuXHRcdHRoaXMuUkVUX1ZJU0lUT1JTX1ZJU0lUUyA9XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5SRVRfVklTSVRPUlNfVklTSVRTLCAnVmlzaXRzIG9mIHJldHVybmluZyB2aXNpdG9ycycsICdUb3RhbCBudW1iZXIgb2YgdmlzaXRzIG9mIHVzZXJzIHdob3NlIGZpcnN0IHZpc2l0IGhhcHBlbmVkIGJlZm9yZSB0aGUgc2VsZWN0ZWQgdGltZSBwZXJpb2RcXG48aT5BIHZpc2l0IGlzIHJlY29yZGVkIGFzIFxcJ3JldHVyblxcJyBvdmVyIHRoZSB0aW1lIHBlcmlvZCBpZiB0aGUgdXNlciBpcyByZWNvcmRlZCBhcyBhIHJldHVybmluZyB2aXNpdG9yIGluIHRoYXQgcGVyaW9kPC9pPicsIE1ldHJpY1R5cGUuTlVNQkVSLCB0cnVlKTtcblx0XHR0aGlzLlBFUkNfTkVXX1ZJU0lUT1JTID1cdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUT1JTLCAnTmV3IHZpc2l0b3JzICUnLCAnUGVyY2VudGFnZSBvZiBmaXJzdCB0aW1lIHZpc2l0b3JzIG92ZXIgdGhlIG51bWJlciBvZiB1bmlxdWUgdmlzaXRvcnMgaW4gdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kJywgTWV0cmljVHlwZS5QRVJDRU5UQUdFLCB0cnVlKTtcblx0XHR0aGlzLlBFUkNfUkVUX1ZJU0lUT1JTID1cdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfUkVUX1ZJU0lUT1JTLCAnUmV0dXJuaW5nIHZpc2l0b3JzICUnLCAnUGVyY2VudGFnZSBvZiByZXR1cm5pbmcgdmlzaXRvcnMgb3ZlciB0aGUgbnVtYmVyIG9mIHVuaXF1ZSB2aXNpdG9ycyBpbiB0aGUgc2VsZWN0ZWQgdGltZSBwZXJpb2QnLCBNZXRyaWNUeXBlLlBFUkNFTlRBR0UsIHRydWUpO1xuXHRcdHRoaXMuUEVSQ19ORVdfVklTSVRTXzEgPVx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzEsICdOZXcgdmlzaXRzICUnLCAnUGVyY2VudGFnZSBvZiBmaXJzdCB0aW1lIHZpc2l0cyBvdmVyIHRoZSB0b3RhbCB2aXNpdHMgaW4gdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kJywgTWV0cmljVHlwZS5QRVJDRU5UQUdFLCB0cnVlKTtcblx0XHQvL3RoaXMuUEVSQ19ORVdfVklTSVRTXzIgPVx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzIsICdOZXcgdmlzaXRzICUnLCAnVEJEJywgTWV0cmljVHlwZS5QRVJDRU5UQUdFLCB0cnVlKTtcblx0XHR0aGlzLkFWR19WSVNJVF9EVVJBVElPTiA9XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5BVkdfVklTSVRfRFVSQVRJT04sICdBdmcuIHZpc2l0IGR1cmF0aW9uJywgJ0F2ZXJhZ2UgdGltZSBkdXJhdGlvbiBvZiBhIHZpc2l0IG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgc2VsZWN0ZWQgdGltZSBwZXJpb2RcXG48aT5UaGUgZHVyYXRpb24gb2YgYSB2aXNpdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvZ2luIHRpbWUgYW5kIGxvZ291dCAob3IgZGlzY29ubmVjdGlvbikgdGltZTwvaT4nLCBNZXRyaWNUeXBlLlRJTUUpO1xuXHRcdHRoaXMuQVZHX0NDVSA9XHRcdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5BVkdfQ0NVLCAnQXZnLiBjb25jdXJyZW50IHVzZXJzJywgJ0F2ZXJhZ2UgbnVtYmVyIG9mIGNvbmN1cnJlbnQgdXNlcnMgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZCcsIE1ldHJpY1R5cGUuTlVNQkVSKTtcblx0XHR0aGlzLlBFQUtfQ0NVID1cdFx0XHRcdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFQUtfQ0NVLCAnUGVhayBjb25jdXJyZW50IHVzZXJzJywgJ1BlYWsgbnVtYmVyIG9mIGNvbmN1cnJlbnQgdXNlcnMgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBzZWxlY3RlZCB0aW1lIHBlcmlvZCcsIE1ldHJpY1R5cGUuTlVNQkVSKTtcblx0XHR0aGlzLlJPT01TX0NSRUFURUQgPVx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5ST09NU19DUkVBVEVELCAnUm9vbXMgY3JlYXRlZCcsICdUb3RhbCBudW1iZXIgb2YgUm9vbXMgY3JlYXRlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kJywgTWV0cmljVHlwZS5OVU1CRVIpO1xuXHRcdHRoaXMuQVZHX1JPT01fRFVSQVRJT04gPVx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX1JPT01fRFVSQVRJT04sICdBdmcuIFJvb20gZHVyYXRpb24nLCAnQXZlcmFnZSB0aW1lIGR1cmF0aW9uIG9mIGR5bmFtaWMgUm9vbXNcXG48aT5UaGUgZHVyYXRpb24gb2YgYSBSb29tIGlzIHRoZSB0aW1lIHRoYXQgb2NjdXJzIGJldHdlZW4gaXRzIGNyZWF0aW9uIGFuZCBpdHMgZGVzdHJ1Y3Rpb24sIGJhc2VkIG9uIHRoZSByZW1vdmFsIHBvbGljeSBzZXQgZm9yIHRoZSBSb29tPC9pPicsIE1ldHJpY1R5cGUuVElNRSk7XG5cdFx0dGhpcy5QRVJDX0dBTUVfUk9PTVMgPVx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5QRVJDX0dBTUVfUk9PTVMsICdHYW1lIFJvb21zICUnLCAnUGVyY2VudGFnZSBvZiBHYW1lIFJvb21zIG92ZXIgdGhlIHRvdGFsIG51bWJlciBvZiBSb29tcyBjcmVhdGVkXFxuPGk+QSBSb29tIGlzIG9mIHR5cGUgR2FtZSBpZiB0aGUgXFwnaXNHYW1lXFwnIGZsYWcgaXMgc2V0IHRvIHRydWUgZHVyaW5nIHRoZSBSb29tIGNyZWF0aW9uPC9pPicsIE1ldHJpY1R5cGUuUEVSQ0VOVEFHRSk7XG5cdFx0dGhpcy5ST09NX0pPSU5TID1cdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5ST09NX0pPSU5TLCAnUm9vbSBqb2lucycsICdOdW1iZXIgb2YgUm9vbSBqb2lucyByZWdpc3RlcmVkIGR1cmluZyB0aGUgc2VsZWN0ZWQgdGltZSBwZXJpb2QnLCBNZXRyaWNUeXBlLk5VTUJFUik7XG5cdFx0dGhpcy5BVkdfUk9PTV9KT0lOUyA9XHRcdG5ldyBCYXNlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLkFWR19ST09NX0pPSU5TLCAnQXZnLiBSb29tIGpvaW5zIHBlciB1c2VyJywgJ0F2ZXJhZ2UgbnVtYmVyIG9mIFJvb20gam9pbnMgb3ZlciB0aGUgbnVtYmVyIG9mIHVuaXF1ZSB2aXNpdG9yc1xcbjxpPklmIHRoZSBSb29tcyBjcmVhdGVkIGFyZSBtb3N0bHkgR2FtZSBSb29tcywgdGhpcyBtZXRyaWMgc2hvd3MgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1hdGNoZXMgcGxheWVkIGJ5IGVhY2ggdmlzaXRvcjwvaT4nLCBNZXRyaWNUeXBlLk5VTUJFUiwgdHJ1ZSk7XG5cdFx0dGhpcy5FWENFUFRJT05TID1cdFx0XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5FWENFUFRJT05TLCAnRXhjZXB0aW9ucycsICdUb3RhbCBudW1iZXIgb2YgZXhjZXB0aW9uc1xcbjxpPkFuIGV4Y2VwdGlvbiBjYW4gYmUgZWl0aGVyIGFuIEVSUk9SIG9yIGEgV0FSTklORzwvaT4nLCBNZXRyaWNUeXBlLk5VTUJFUik7XG5cdFx0dGhpcy5VTklRVUVfRVhDRVBUSU9OUyA9XHRuZXcgQmFzZU1ldHJpYyhNZXRyaWNzTWFuYWdlci5VTklRVUVfRVhDRVBUSU9OUywgJ1VuaXF1ZSBleGNlcHRpb25zJywgJ051bWJlciBvZiB1bmR1cGxpY2F0ZWQgKGNvdW50ZWQgb25seSBvbmNlKSBleGNlcHRpb25zIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgc2VsZWN0ZWQgdGltZSBwZXJpb2RcXG48aT5UaGUgZXhjZXB0aW9uIHVuaXF1ZW5lc3MgaXMgYmFzZWQgb24gdGhlIGVycm9yL3dhcm5pbmcgZGVzY3JpcHRpb248L2k+JywgTWV0cmljVHlwZS5OVU1CRVIpO1xuXHRcdHRoaXMuQVZHX0VYQ0VQVF9PQ0NVUkVOQ0UgPVx0bmV3IEJhc2VNZXRyaWMoTWV0cmljc01hbmFnZXIuQVZHX0VYQ0VQVF9PQ0NVUkVOQ0UsICdBdmcuIGV4Y2VwdGlvbiBvY2N1cnJlbmNlJywgJ0F2ZXJhZ2UgbnVtYmVyIG9mIHRpbWVzIGEgdW5pcXVlIGV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kJywgTWV0cmljVHlwZS5OVU1CRVIsIHRydWUpO1xuXG5cdFx0Ly8gQ29uZmlndXJlIG1ldHJpY3MgYW5kIHRhYmxlIGRhdGFcblxuXHRcdHRoaXMuX21ldHJpY0NvbnRhaW5lcnMgPSBbXTtcblx0XHR0aGlzLl9jaGFydENvbnRhaW5lcnMgPSBbXTtcblx0XHR0aGlzLl9saXN0TWV0cmljcyA9IFtdO1xuXHRcdHRoaXMuX3RhYmxlRGF0YUNvbnRhaW5lciA9IFtdO1xuXHRcdHRoaXMuX3RhYmxlRGF0YU1ldHJpY3MgPSBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5QRVJDX05FV19WSVNJVFNfMSwgdGhpcy5BVkdfVklTSVRfRFVSQVRJT05dO1xuXG5cdFx0bGV0IHZpZXdJZDtcblxuXHRcdC8vIE92ZXJ2aWV3XG5cdFx0dmlld0lkID0gVmlld01hbmFnZXIuT1ZFUlZJRVc7XG5cdFx0dGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdID0gbmV3IE1ldHJpY0NvbnRhaW5lcih2aWV3SWQsIFt0aGlzLkNPTlRBQ1RTLCB0aGlzLlZJU0lUUywgdGhpcy5VTklRVUVfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTLCB0aGlzLlJFVF9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlNfVklTSVRTLCB0aGlzLlJFVF9WSVNJVE9SU19WSVNJVFMsIHRoaXMuUEVSQ19ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19SRVRfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OLCB0aGlzLkFWR19DQ1UsIHRoaXMuUEVBS19DQ1UsIHRoaXMuRVhDRVBUSU9OU10pO1xuXHRcdHRoaXMuX2NoYXJ0Q29udGFpbmVyc1t2aWV3SWRdID0gbmV3IENoYXJ0Q29udGFpbmVyKHZpZXdJZCwgW3RoaXMuQ09OVEFDVFMsIHRoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OLCB0aGlzLkFWR19DQ1VdKTtcblx0XHR0aGlzLl9saXN0TWV0cmljc1t2aWV3SWRdID0gW3RoaXMuQ09OVEFDVFMsIHRoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OLCB0aGlzLkFWR19DQ1UsIHRoaXMuUEVBS19DQ1UsIHRoaXMuRVhDRVBUSU9OU107XG5cblx0XHQvLyBEZW1vZ3JhcGhpY3Ncblx0XHR2aWV3SWQgPSBWaWV3TWFuYWdlci5ERU1PR1JBUEhJQ1M7XG5cdFx0dGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdID0gbmV3IE1ldHJpY0NvbnRhaW5lcih2aWV3SWQsIFt0aGlzLlZJU0lUUywgdGhpcy5VTklRVUVfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTLCB0aGlzLlJFVF9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlNfVklTSVRTLCB0aGlzLlJFVF9WSVNJVE9SU19WSVNJVFMsIHRoaXMuUEVSQ19ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19SRVRfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OXSk7XG5cdFx0dGhpcy5fY2hhcnRDb250YWluZXJzW3ZpZXdJZF0gPSBuZXcgQ2hhcnRDb250YWluZXIodmlld0lkLCBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5QRVJDX05FV19WSVNJVFNfMV0pO1xuXHRcdHRoaXMuX2xpc3RNZXRyaWNzW3ZpZXdJZF0gPSBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5QRVJDX05FV19WSVNJVFNfMSwgdGhpcy5BVkdfVklTSVRfRFVSQVRJT05dO1xuXHRcdHRoaXMuX3RhYmxlRGF0YUNvbnRhaW5lclt2aWV3SWRdID0gbmV3IFRhYmxlRGF0YSgpO1xuXG5cdFx0Ly8gVGVjaG5vbG9neVxuXHRcdHZpZXdJZCA9IFZpZXdNYW5hZ2VyLlRFQ0hOT0xPR1k7XG5cdFx0dGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdID0gbmV3IE1ldHJpY0NvbnRhaW5lcih2aWV3SWQsIFt0aGlzLlZJU0lUUywgdGhpcy5VTklRVUVfVklTSVRPUlMsIHRoaXMuTkVXX1ZJU0lUT1JTLCB0aGlzLlJFVF9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlNfVklTSVRTLCB0aGlzLlJFVF9WSVNJVE9SU19WSVNJVFMsIHRoaXMuUEVSQ19ORVdfVklTSVRPUlMsIHRoaXMuUEVSQ19SRVRfVklTSVRPUlMsIHRoaXMuUEVSQ19ORVdfVklTSVRTXzEsIHRoaXMuQVZHX1ZJU0lUX0RVUkFUSU9OXSk7XG5cdFx0dGhpcy5fY2hhcnRDb250YWluZXJzW3ZpZXdJZF0gPSBuZXcgQ2hhcnRDb250YWluZXIodmlld0lkLCBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5QRVJDX05FV19WSVNJVFNfMV0pO1xuXHRcdHRoaXMuX2xpc3RNZXRyaWNzW3ZpZXdJZF0gPSBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5QRVJDX05FV19WSVNJVFNfMSwgdGhpcy5BVkdfVklTSVRfRFVSQVRJT05dO1xuXHRcdHRoaXMuX3RhYmxlRGF0YUNvbnRhaW5lclt2aWV3SWRdID0gbmV3IFRhYmxlRGF0YSgpO1xuXG5cdFx0Ly8gQXBwbGljYXRpb25cblx0XHR2aWV3SWQgPSBWaWV3TWFuYWdlci5BUFBMSUNBVElPTjtcblx0XHR0aGlzLl9tZXRyaWNDb250YWluZXJzW3ZpZXdJZF0gPSBuZXcgTWV0cmljQ29udGFpbmVyKHZpZXdJZCwgW3RoaXMuVklTSVRTLCB0aGlzLlVOSVFVRV9WSVNJVE9SUywgdGhpcy5ORVdfVklTSVRPUlMsIHRoaXMuUkVUX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SU19WSVNJVFMsIHRoaXMuUkVUX1ZJU0lUT1JTX1ZJU0lUUywgdGhpcy5QRVJDX05FV19WSVNJVE9SUywgdGhpcy5QRVJDX1JFVF9WSVNJVE9SUywgdGhpcy5QRVJDX05FV19WSVNJVFNfMSwgdGhpcy5BVkdfVklTSVRfRFVSQVRJT04sIHRoaXMuQVZHX0NDVSwgdGhpcy5QRUFLX0NDVSwgdGhpcy5ST09NU19DUkVBVEVELCB0aGlzLkFWR19ST09NX0RVUkFUSU9OLCB0aGlzLlBFUkNfR0FNRV9ST09NUywgdGhpcy5ST09NX0pPSU5TLCB0aGlzLkFWR19ST09NX0pPSU5TXSk7XG5cdFx0dGhpcy5fY2hhcnRDb250YWluZXJzW3ZpZXdJZF0gPSBuZXcgQ2hhcnRDb250YWluZXIodmlld0lkLCBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5QRVJDX05FV19WSVNJVFNfMSwgdGhpcy5BVkdfVklTSVRfRFVSQVRJT04sIHRoaXMuQVZHX0NDVV0pO1xuXHRcdHRoaXMuX2xpc3RNZXRyaWNzW3ZpZXdJZF0gPSBbdGhpcy5WSVNJVFMsIHRoaXMuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLk5FV19WSVNJVE9SUywgdGhpcy5QRVJDX05FV19WSVNJVFNfMSwgdGhpcy5BVkdfVklTSVRfRFVSQVRJT04sIHRoaXMuQVZHX0NDVSwgdGhpcy5QRUFLX0NDVSwgdGhpcy5ST09NU19DUkVBVEVELCB0aGlzLkFWR19ST09NX0RVUkFUSU9OLCB0aGlzLlBFUkNfR0FNRV9ST09NUywgdGhpcy5ST09NX0pPSU5TLCB0aGlzLkFWR19ST09NX0pPSU5TXTtcblx0XHR0aGlzLl90YWJsZURhdGFDb250YWluZXJbdmlld0lkXSA9IG5ldyBUYWJsZURhdGEoKTtcblxuXHRcdC8vIEV4Y2VwdGlvblxuXHRcdHZpZXdJZCA9IFZpZXdNYW5hZ2VyLkVYQ0VQVElPTlM7XG5cdFx0dGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdID0gbmV3IE1ldHJpY0NvbnRhaW5lcih2aWV3SWQsIFt0aGlzLlZJU0lUUywgdGhpcy5FWENFUFRJT05TLCB0aGlzLlVOSVFVRV9FWENFUFRJT05TLCB0aGlzLkFWR19FWENFUFRfT0NDVVJFTkNFXSk7XG5cdFx0dGhpcy5fY2hhcnRDb250YWluZXJzW3ZpZXdJZF0gPSBuZXcgQ2hhcnRDb250YWluZXIodmlld0lkLCBbdGhpcy5FWENFUFRJT05TLCB0aGlzLlVOSVFVRV9FWENFUFRJT05TXSk7XG5cdFx0dGhpcy5fbGlzdE1ldHJpY3Nbdmlld0lkXSA9IFt0aGlzLkVYQ0VQVElPTlMsIHRoaXMuVU5JUVVFX0VYQ0VQVElPTlMsIHRoaXMuQVZHX0VYQ0VQVF9PQ0NVUkVOQ0VdO1xuXHRcdHRoaXMuX3RhYmxlRGF0YUNvbnRhaW5lclt2aWV3SWRdID0gbmV3IFRhYmxlRGF0YSgpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBOb3RoaW5nIHRvIGRvP1xuXHR9XG5cblx0Z2V0QmFzZU1ldHJpYyh2aWV3SWQsIG1ldHJpY0lkKVxuXHR7XG5cdFx0bGV0IGNvbnRhaW5lciA9IHRoaXMuX21ldHJpY0NvbnRhaW5lcnNbdmlld0lkXTtcblxuXHRcdGlmIChjb250YWluZXIgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgbWV0cmljID0gY29udGFpbmVyLm1haW5NZXRyaWNzW21ldHJpY0lkXTtcblxuXHRcdFx0aWYgKG1ldHJpYyAhPSBudWxsKVxuXHRcdFx0XHRyZXR1cm4gbWV0cmljLmJhc2VNZXRyaWM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRnZXRCYXNlTWV0cmljc0Rpc3BsYXlMaXN0KHZpZXdJZClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9saXN0TWV0cmljc1t2aWV3SWRdO1xuXHR9XG5cblx0Z2V0TWV0cmljRGF0YUNvbnRhaW5lcih2aWV3SWQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdO1xuXHR9XG5cblx0Z2V0Q2hhcnREYXRhQ29udGFpbmVyKHZpZXdJZClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9jaGFydENvbnRhaW5lcnNbdmlld0lkXTtcblx0fVxuXG5cdGdldFRhYmxlRGF0YU1ldHJpY3MoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3RhYmxlRGF0YU1ldHJpY3M7XG5cdH1cblxuXHRnZXRUYWJsZURhdGEodmlld0lkKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3RhYmxlRGF0YUNvbnRhaW5lclt2aWV3SWRdO1xuXHR9XG5cblx0aXNNZXRyaWNJbkRpc3BsYXlMaXN0KHZpZXdJZCwgbWV0cmljSWQpXG5cdHtcblx0XHRsZXQgYmFzZU1ldHJpYyA9IHRoaXMuZ2V0QmFzZU1ldHJpYyh2aWV3SWQsIG1ldHJpY0lkKTtcblxuXHRcdGlmIChiYXNlTWV0cmljICE9IG51bGwpXG5cdFx0XHRyZXR1cm4gdGhpcy5fbGlzdE1ldHJpY3Nbdmlld0lkXS5pbmRleE9mKGJhc2VNZXRyaWMpID4gLTE7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1NGU09iamVjdH0gY2hhcnREYXRhXG5cdCAqIEBwYXJhbSAge2FycmF5fSB1cGRhdGFibGVWaWV3c1xuXHQgKiBAcGFyYW0gIHtTdGF0c0RhdGFSYW5nZX0gc2RyXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YUZpbHRlcn0gZmlsdGVyXG5cdCAqIEBwYXJhbSAge3RpbWVVbml0fSB0aW1lVW5pdFxuXHQgKi9cblx0dXBkYXRlQ2hhcnQoY2hhcnREYXRhLCB1cGRhdGFibGVWaWV3cywgc2RyLCBmaWx0ZXIsIHRpbWVVbml0KVxuXHR7XG5cdFx0bGV0IGNoYXJ0SWQgPSBjaGFydERhdGEuZ2V0VXRmU3RyaW5nKCdpZCcpO1xuXHRcdGxldCBpc01haW4gPSAoY2hhcnREYXRhLmdldFV0ZlN0cmluZygndHlwZScpID09ICdtYWluJyk7XG5cdFx0bGV0IGRhdGFYWCA9IGNoYXJ0RGF0YS5nZXRTRlNBcnJheSgneCcpO1xuXHRcdGxldCBkYXRhWVkgPSBjaGFydERhdGEuZ2V0U0ZTQXJyYXkoJ3knKTtcblxuXHRcdC8vIENvbnZlcnQgZGF0YVxuXHRcdGxldCBkYXRhWCA9IFtdO1xuXHRcdGxldCBkYXRhWSA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgZCA9IDA7IGQgPCBkYXRhWFguc2l6ZSgpOyBkKyspXG5cdFx0e1xuXHRcdFx0bGV0IHggPSBkYXRhWFguZ2V0VXRmU3RyaW5nKGQpO1xuXHRcdFx0bGV0IHkgPSBkYXRhWVkuZ2V0KGQpO1xuXG5cdFx0XHRkYXRhWC5wdXNoKHgpO1xuXHRcdFx0ZGF0YVkucHVzaCh5KTtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0YWJsZVZpZXdzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCB2aWV3SWQgPSB1cGRhdGFibGVWaWV3c1tpXTtcblx0XHRcdGxldCBjYyA9IHRoaXMuZ2V0Q2hhcnREYXRhQ29udGFpbmVyKHZpZXdJZCk7XG5cdFx0XHRsZXQgY2hhcnRPYmogPSBpc01haW4gPyBjYy5nZXRNYWluQ2hhcnQoY2hhcnRJZCkgOiBjYy5nZXRDb21wYXJlQ2hhcnQoY2hhcnRJZCk7XG5cblx0XHRcdC8vIENoYXJ0IG9iaiBtaWdodCBiZSBudWxsIGlmIHRoYXQgY2hhcnQgaWQgaXMgbm90IGF2YWlhbGJsZSBmb3IgdGhlIHNlbGVjdGVkIHZpZXdcblx0XHRcdGlmIChjaGFydE9iaiAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRjaGFydE9iai5kYXRhWCA9IGRhdGFYO1xuXHRcdFx0XHRjaGFydE9iai5kYXRhWSA9IGRhdGFZO1xuXHRcdFx0XHRjaGFydE9iai5yYW5nZUZyb20gPSBtb21lbnQoaXNNYWluID8gc2RyLm1haW5Gcm9tIDogc2RyLmNvbXBhcmVGcm9tKTtcblx0XHRcdFx0Y2hhcnRPYmoucmFuZ2VUbyA9IG1vbWVudChpc01haW4gPyBzZHIubWFpblRvIDogc2RyLmNvbXBhcmVUbyk7XG5cdFx0XHRcdGNoYXJ0T2JqLnRpbWVVbml0ID0gdGltZVVuaXQ7XG5cdFx0XHRcdGNoYXJ0T2JqLmZpbHRlck5hbWUgPSAoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIubmFtZSA6IG51bGwpO1xuXHRcdFx0XHRjaGFydE9iai5maWx0ZXJWYWx1ZSA9IChmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci52YWx1ZSA6IG51bGwpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtTRlNBcnJheX0gdGFibGVEYXRhXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gdmlld0lkXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YVJhbmdlfSBzZHJcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICovXG5cdHVwZGF0ZVRhYmxlKHRhYmxlRGF0YSwgdmlld0lkLCBzZHIsIGZpbHRlcilcblx0e1xuXHRcdGxldCB0ZCA9IHRoaXMuX3RhYmxlRGF0YUNvbnRhaW5lclt2aWV3SWRdO1xuXG5cdFx0aWYgKHRkICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0dGQucmFuZ2VGcm9tID0gbW9tZW50KHNkci5tYWluRnJvbSk7XG5cdFx0XHR0ZC5yYW5nZVRvID0gbW9tZW50KHNkci5tYWluVG8pO1xuXG5cdFx0XHRsZXQgZGF0YSA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlRGF0YS5zaXplKCk7IGkrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRhdGFBcnIgPSB0YWJsZURhdGEuZ2V0U0ZTQXJyYXkoaSk7XG5cdFx0XHRcdGxldCBvYmogPSB7fTtcblx0XHRcdFx0bGV0IGluZGV4ID0gMDtcblxuXHRcdFx0XHRpZiAodmlld0lkID09IFZpZXdNYW5hZ2VyLkRFTU9HUkFQSElDUylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9iai5jb3VudHJ5Q29kZSA9IGRhdGFBcnIuZ2V0VXRmU3RyaW5nKGluZGV4KyspO1xuXHRcdFx0XHRcdG9iai5jb3VudHJ5TmFtZSA9IGRhdGFBcnIuZ2V0VXRmU3RyaW5nKGluZGV4KyspO1xuXG5cdFx0XHRcdFx0Ly8gaWYgKG9iai5jb3VudHJ5TmFtZSA9PSAnJylcblx0XHRcdFx0XHQvLyBcdG9iai5jb3VudHJ5TmFtZSA9ICdbdW5rbm93bl0nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHZpZXdJZCA9PSBWaWV3TWFuYWdlci5URUNITk9MT0dZKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2JqLnBsYXRmb3JtID0gZGF0YUFyci5nZXRVdGZTdHJpbmcoaW5kZXgrKyk7XG5cdFx0XHRcdFx0b2JqLnZlcnNpb24gPSBkYXRhQXJyLmdldFV0ZlN0cmluZyhpbmRleCsrKTtcblxuXHRcdFx0XHRcdC8vIGlmIChvYmoucGxhdGZvcm0gPT0gJycpXG5cdFx0XHRcdFx0Ly8gXHRvYmoucGxhdGZvcm0gPSAnW3Vua25vd25dJztcblx0XHRcdFx0XHQvL1xuXHRcdFx0XHRcdC8vIGlmIChvYmoudmVyc2lvbiA9PSAnJylcblx0XHRcdFx0XHQvLyBcdG9iai52ZXJzaW9uID0gJ1t1bmtub3duXSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAodmlld0lkID09IFZpZXdNYW5hZ2VyLkFQUExJQ0FUSU9OKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2JqLnpvbmUgPSBkYXRhQXJyLmdldFV0ZlN0cmluZyhpbmRleCsrKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh2aWV3SWQgPT0gVmlld01hbmFnZXIuRVhDRVBUSU9OUylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9iai50eXBlID0gZGF0YUFyci5nZXRVdGZTdHJpbmcoaW5kZXgrKyk7XG5cdFx0XHRcdFx0b2JqLmRlc2NyaXB0aW9uID0gZGF0YUFyci5nZXRVdGZTdHJpbmcoaW5kZXgrKyk7XG5cdFx0XHRcdFx0b2JqW01ldHJpY3NNYW5hZ2VyLkVYQ0VQVElPTlNdID0gZGF0YUFyci5nZXRMb25nKGluZGV4KyspO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gR2V0IGRhdGEgY29tbW9uIHRvIChhbG1vc3QpIGFsbCB2aWV3c1xuXHRcdFx0XHRpZiAodmlld0lkICE9IFZpZXdNYW5hZ2VyLkVYQ0VQVElPTlMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvYmpbTWV0cmljc01hbmFnZXIuVklTSVRTXSA9IGRhdGFBcnIuZ2V0TG9uZyhpbmRleCsrKTtcblx0XHRcdFx0XHRvYmpbTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTXSA9IGRhdGFBcnIuZ2V0TG9uZyhpbmRleCsrKTtcblx0XHRcdFx0XHRvYmpbTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTXSA9IGRhdGFBcnIuZ2V0TG9uZyhpbmRleCsrKTtcblx0XHRcdFx0XHRvYmpbTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRTXzFdID0gZGF0YUFyci5nZXREb3VibGUoaW5kZXgrKyk7XG5cdFx0XHRcdFx0b2JqW01ldHJpY3NNYW5hZ2VyLkFWR19WSVNJVF9EVVJBVElPTl0gPSBkYXRhQXJyLmdldExvbmcoaW5kZXgrKyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkYXRhLnB1c2gob2JqKTtcblx0XHRcdH1cblxuXHRcdFx0dGQuZGF0YSA9IGRhdGE7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge1NGU09iamVjdH0gbWV0cmljc0RhdGFcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhUmFuZ2V9IHNkclxuXHQgKiBAcGFyYW0gIHtTdGF0c0RhdGFGaWx0ZXJ9IGZpbHRlclxuXHQgKi9cblx0dXBkYXRlTWV0cmljcyhtZXRyaWNzRGF0YSwgc2RyLCBmaWx0ZXIpXG5cdHtcblx0XHRsZXQgbWV0cmljS2V5c0FycmF5ID0gbWV0cmljc0RhdGEuZ2V0S2V5c0FycmF5KCk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtZXRyaWNLZXlzQXJyYXkubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IG1ldHJpY0lkID0gbWV0cmljS2V5c0FycmF5W2ldO1xuXHRcdFx0bGV0IG5ld01ldHJpY1ZhbHVlcyA9IG1ldHJpY3NEYXRhLmdldFNGU09iamVjdChtZXRyaWNJZCk7XG5cblx0XHRcdC8vIEN5Y2xlIHRocm91Z2ggYWxsIHZpZXdzIHVwZGF0aW5nIG1ldHJpY3Mgd2l0aCB2YWx1ZXMgc2VudCBieSB0aGUgc2VydmVyXG5cdFx0XHRmb3IgKGxldCB2ID0gMDsgdiA8IFZpZXdNYW5hZ2VyLlZJRVdTLmxlbmd0aDsgdisrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdmlld0lkID0gVmlld01hbmFnZXIuVklFV1Nbdl07XG5cdFx0XHRcdGxldCBtQ29udGFpbmVyID0gdGhpcy5fbWV0cmljQ29udGFpbmVyc1t2aWV3SWRdO1xuXG5cdFx0XHRcdGlmIChtQ29udGFpbmVyLmNvbnRhaW5zTWV0cmljKG1ldHJpY0lkKSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIE1BSU4gTUVUUklDXG5cblx0XHRcdFx0XHRsZXQgaGFzTWFpbiA9IG5ld01ldHJpY1ZhbHVlcy5jb250YWluc0tleSgnbWFpbicpO1xuXHRcdFx0XHRcdGxldCBoYXNNYWluRiA9IG5ld01ldHJpY1ZhbHVlcy5jb250YWluc0tleSgnbWFpbl9mJyk7XG5cblx0XHRcdFx0XHRpZiAoaGFzTWFpbiB8fCBoYXNNYWluRilcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbU1ldHJpYyA9IG1Db250YWluZXIuZ2V0TWFpbk1ldHJpYyhtZXRyaWNJZCk7XG5cdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVNZXRyaWModmlld0lkLCBtTWV0cmljLCBzZHIubWFpbkZyb20sIHNkci5tYWluVG8sIGZpbHRlciwgKGhhc01haW4gPyBuZXdNZXRyaWNWYWx1ZXMuZ2V0KCdtYWluJykgOiBOYU4pLCAoaGFzTWFpbkYgPyBuZXdNZXRyaWNWYWx1ZXMuZ2V0KCdtYWluX2YnKSA6IE5hTikpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIENPTVBBUkUgTUVUUklDXG5cblx0XHRcdFx0XHRsZXQgaGFzQ29tcCA9IG5ld01ldHJpY1ZhbHVlcy5jb250YWluc0tleSgnY29tcCcpO1xuXHRcdFx0XHRcdGxldCBoYXNDb21wRiA9IG5ld01ldHJpY1ZhbHVlcy5jb250YWluc0tleSgnY29tcF9mJyk7XG5cblx0XHRcdFx0XHRpZiAoaGFzQ29tcCB8fCBoYXNDb21wRilcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgY01ldHJpYyA9IG1Db250YWluZXIuZ2V0Q29tcGFyZU1ldHJpYyhtZXRyaWNJZCk7XG5cdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVNZXRyaWModmlld0lkLCBjTWV0cmljLCBzZHIuY29tcGFyZUZyb20sIHNkci5jb21wYXJlVG8sIGZpbHRlciwgKGhhc0NvbXAgPyBuZXdNZXRyaWNWYWx1ZXMuZ2V0KCdjb21wJykgOiBOYU4pLCAoaGFzQ29tcEYgPyBuZXdNZXRyaWNWYWx1ZXMuZ2V0KCdjb21wX2YnKSA6IE5hTikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVwZGF0ZSBzdWItbWV0cmljcyB1c2luZyB2YWx1ZXMgb2YgdGhlIG1haW4gbWV0cmljc1xuXHRcdFx0XHR0aGlzLl91cGRhdGVTdWJNZXRyaWNzKHZpZXdJZCwgc2RyLCBmaWx0ZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmlld0lkXG5cdCAqL1xuXHRyZXNldE1ldHJpY3NGaWx0ZXIodmlld0lkKVxuXHR7XG5cdFx0bGV0IG1Db250YWluZXIgPSB0aGlzLl9tZXRyaWNDb250YWluZXJzW3ZpZXdJZF07XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1Db250YWluZXIubWV0cmljSWRzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBtZXRyaWNJZCA9IG1Db250YWluZXIubWV0cmljSWRzW2ldO1xuXG5cdFx0XHQvLyBNQUlOIE1FVFJJQ1xuXHRcdFx0bGV0IG1NZXRyaWMgPSBtQ29udGFpbmVyLmdldE1haW5NZXRyaWMobWV0cmljSWQpO1xuXHRcdFx0bU1ldHJpYy5yZXNldFZhbHVlRigpO1xuXG5cdFx0XHQvLyBDT01QQVJFIE1FVFJJQ1xuXHRcdFx0bGV0IGNNZXRyaWMgPSBtQ29udGFpbmVyLmdldENvbXBhcmVNZXRyaWMobWV0cmljSWQpO1xuXHRcdFx0Y01ldHJpYy5yZXNldFZhbHVlRigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IHZpZXdJZFxuXHQgKiBAcGFyYW0gIHtNZXRyaWN9IG1ldHJpY1xuXHQgKiBAcGFyYW0gIHttb21lbnR9IG5ld1JhbmdlRnJvbVxuXHQgKiBAcGFyYW0gIHttb21lbnR9IG5ld1JhbmdlVG9cblx0ICogQHBhcmFtICB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICogQHBhcmFtICB7bnVtYmVyfSB2YWx1ZVxuXHQgKiBAcGFyYW0gIHtudW1iZXJ9IHZhbHVlRlxuXHQgKi9cblx0X3VwZGF0ZU1ldHJpYyh2aWV3SWQsIG1ldHJpYywgbmV3UmFuZ2VGcm9tLCBuZXdSYW5nZVRvLCBmaWx0ZXIsIHZhbHVlID0gTmFOLCB2YWx1ZUYgPSBOYU4pXG5cdHtcblx0XHRsZXQgcmFuZ2VDaGFuZ2VkID0gKCFEYXRlSGVscGVyLmFyZURhdGVUaW1lc0VxdWFsKG1ldHJpYy5yYW5nZUZyb20sIG5ld1JhbmdlRnJvbSkgfHwgIURhdGVIZWxwZXIuYXJlRGF0ZVRpbWVzRXF1YWwobWV0cmljLnJhbmdlVG8sIG5ld1JhbmdlVG8pKTtcblxuXHRcdC8vIElmIHJhbmdlIGhhcyBjaGFuZ2VkIHdlIG5lZWQgdG8gY2xlYXIgdGhlIGZpbHRlcmVkIHZhbHVlIHRvbyxcblx0XHQvLyB0byBtYWtlIHN1cmUgaXQgd2lsbCBiZSB1cGRhdGVkIGluIHRoZSBuZXh0IHN0ZXAgb3IgZXZlbiBsYXRlclxuXHRcdGlmIChyYW5nZUNoYW5nZWQpXG5cdFx0e1xuXHRcdFx0bWV0cmljLnJhbmdlRnJvbSA9IG1vbWVudChuZXdSYW5nZUZyb20pO1xuXHRcdFx0bWV0cmljLnJhbmdlVG8gPSBtb21lbnQobmV3UmFuZ2VUbyk7XG5cdFx0XHRtZXRyaWMucmVzZXRWYWx1ZUYoKTtcblx0XHR9XG5cblx0XHQvLyBJZiByYW5nZSBkaWRuJ3QgY2hhbmdlLCBidXQgdGhlIGZpbHRlciBkaWQsIHdlIGhhdmUgdG8gcmVzZXQgdGhlIHZhbHVlIHRvbyxcblx0XHQvLyBzbyBpbiBjYXNlIHRoZSBmaWx0ZXIgd2FzIHJlbW92ZWQgdGhlIG92ZXJhbGwgdmFsdWUgd2lsbCBiZSBkaXNwbGF5ZWRcblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKGZpbHRlciAhPSBudWxsICYmIGZpbHRlci52aWV3SWQgPT0gdmlld0lkICYmIChmaWx0ZXIubmFtZSAhPSBtZXRyaWMuZmlsdGVyTmFtZSB8fCBmaWx0ZXIudmFsdWUgIT0gbWV0cmljLmZpbHRlclZhbHVlKSlcblx0XHRcdFx0bWV0cmljLnJlc2V0VmFsdWVGKCk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlIG92ZXJhbGwgdmFsdWVcblx0XHRpZiAoIWlzTmFOKHZhbHVlKSlcblx0XHRcdG1ldHJpYy5zZXRWYWx1ZSh2YWx1ZSk7XG5cblx0XHQvLyBVcGRhdGUgZmlsdGVyZWQgdmFsdWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHZpZXcgb25seVxuXHRcdGlmICghaXNOYU4odmFsdWVGKSAmJiBmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIudmlld0lkID09IHZpZXdJZClcblx0XHRcdG1ldHJpYy5zZXRWYWx1ZUYodmFsdWVGLCBmaWx0ZXIubmFtZSwgZmlsdGVyLnZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IHZpZXdJZFxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IGNoaWxkTWV0cmljSWRcblx0ICogQHBhcmFtICB7c3RyaW5nfSBwYXJlbnRNZXRyaWMxSWRcblx0ICogQHBhcmFtICB7c3RyaW5nfSBwYXJlbnRNZXRyaWMySWRcblx0ICogQHBhcmFtICB7c3RyaW5nfSBvcGVyYXRpb25cblx0ICogQHBhcmFtICB7U3RhdHNEYXRhUmFuZ2V9IHNkclxuXHQgKiBAcGFyYW0gIHtTdGF0c0RhdGFGaWx0ZXJ9IGZpbHRlclxuXHQgKi9cblx0X3VwZGF0ZVN1Yk1ldHJpYyh2aWV3SWQsIGNoaWxkTWV0cmljSWQsIHBhcmVudE1ldHJpYzFJZCwgcGFyZW50TWV0cmljMklkLCBvcGVyYXRpb24sIHNkciwgZmlsdGVyKVxuXHR7XG5cdFx0bGV0IG1Db250YWluZXIgPSB0aGlzLl9tZXRyaWNDb250YWluZXJzW3ZpZXdJZF07XG5cblx0XHQvLyBQYXJlbnQgbWV0cmljcyBtdXN0IGJlIGFscmVhZHkgdXBkYXRlZCB0byBwcm9jZWVkXG5cdFx0aWYgKG1Db250YWluZXIuaXNNZXRyaWNVcGRhdGVkKHBhcmVudE1ldHJpYzFJZCwgc2RyLCBmaWx0ZXIpICYmXG5cdFx0XHRtQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChwYXJlbnRNZXRyaWMySWQsIHNkciwgZmlsdGVyKSlcblx0XHR7XG5cdFx0XHQvLyBNQUlOIFZBTFVFU1xuXHRcdFx0bGV0IG1fcGFyZW50TWV0cmljMSA9IG1Db250YWluZXIuZ2V0TWFpbk1ldHJpYyhwYXJlbnRNZXRyaWMxSWQpO1xuXHRcdFx0bGV0IG1fcGFyZW50TWV0cmljMiA9IG1Db250YWluZXIuZ2V0TWFpbk1ldHJpYyhwYXJlbnRNZXRyaWMySWQpO1xuXHRcdFx0bGV0IG1fY2hpbGRNZXRyaWMgPSBtQ29udGFpbmVyLmdldE1haW5NZXRyaWMoY2hpbGRNZXRyaWNJZCk7XG5cblx0XHRcdC8vIENPTVBBUkUgVkFMVUVTXG5cdFx0XHRsZXQgY19wYXJlbnRNZXRyaWMxID0gbUNvbnRhaW5lci5nZXRDb21wYXJlTWV0cmljKHBhcmVudE1ldHJpYzFJZCk7XG5cdFx0XHRsZXQgY19wYXJlbnRNZXRyaWMyID0gbUNvbnRhaW5lci5nZXRDb21wYXJlTWV0cmljKHBhcmVudE1ldHJpYzJJZCk7XG5cdFx0XHRsZXQgY19jaGlsZE1ldHJpYyA9IG1Db250YWluZXIuZ2V0Q29tcGFyZU1ldHJpYyhjaGlsZE1ldHJpY0lkKTtcblxuXHRcdFx0bGV0IG1fdmFsdWU7XG5cdFx0XHRsZXQgbV92YWx1ZUY7XG5cdFx0XHRsZXQgY192YWx1ZTtcblx0XHRcdGxldCBjX3ZhbHVlRjtcblxuXHRcdFx0aWYgKG9wZXJhdGlvbiA9PSB0aGlzLlNVQk1FVFJJQ19ESUZGKVxuXHRcdFx0e1xuXHRcdFx0XHRtX3ZhbHVlID0gbV9wYXJlbnRNZXRyaWMxLmdldFZhbHVlKCkgLSBtX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWUoKTtcblx0XHRcdFx0bV92YWx1ZUYgPSBtX3BhcmVudE1ldHJpYzEuZ2V0VmFsdWVGKCkgLSBtX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWVGKCk7XG5cblx0XHRcdFx0Y192YWx1ZSA9IGNfcGFyZW50TWV0cmljMS5nZXRWYWx1ZSgpIC0gY19wYXJlbnRNZXRyaWMyLmdldFZhbHVlKCk7XG5cdFx0XHRcdGNfdmFsdWVGID0gY19wYXJlbnRNZXRyaWMxLmdldFZhbHVlRigpIC0gY19wYXJlbnRNZXRyaWMyLmdldFZhbHVlRigpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAob3BlcmF0aW9uID09IHRoaXMuU1VCTUVUUklDX1BFUkMpXG5cdFx0XHR7XG5cdFx0XHRcdG1fdmFsdWUgPSAobV9wYXJlbnRNZXRyaWMyLmdldFZhbHVlKCkgPiAwID8gKG1fcGFyZW50TWV0cmljMS5nZXRWYWx1ZSgpIC8gbV9wYXJlbnRNZXRyaWMyLmdldFZhbHVlKCkgKiAxMDApIDogLTEpO1xuXHRcdFx0XHRtX3ZhbHVlRiA9IChtX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWVGKCkgPiAwID8gKG1fcGFyZW50TWV0cmljMS5nZXRWYWx1ZUYoKSAvIG1fcGFyZW50TWV0cmljMi5nZXRWYWx1ZUYoKSAqIDEwMCkgOiAtMSk7XG5cblx0XHRcdFx0Y192YWx1ZSA9IChjX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWUoKSA+IDAgPyAoY19wYXJlbnRNZXRyaWMxLmdldFZhbHVlKCkgLyBjX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWUoKSAqIDEwMCkgOiAtMSk7XG5cdFx0XHRcdGNfdmFsdWVGID0gKGNfcGFyZW50TWV0cmljMi5nZXRWYWx1ZUYoKSA+IDAgPyAoY19wYXJlbnRNZXRyaWMxLmdldFZhbHVlRigpIC8gY19wYXJlbnRNZXRyaWMyLmdldFZhbHVlRigpICogMTAwKSA6IC0xKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG9wZXJhdGlvbiA9PSB0aGlzLlNVQk1FVFJJQ19ESVYpXG5cdFx0XHR7XG5cdFx0XHRcdG1fdmFsdWUgPSBtX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWUoKSA+IDAgPyAobV9wYXJlbnRNZXRyaWMxLmdldFZhbHVlKCkgLyBtX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWUoKSkgOiAwO1xuXHRcdFx0XHRtX3ZhbHVlRiA9IG1fcGFyZW50TWV0cmljMi5nZXRWYWx1ZUYoKSA+IDAgPyAobV9wYXJlbnRNZXRyaWMxLmdldFZhbHVlRigpIC8gbV9wYXJlbnRNZXRyaWMyLmdldFZhbHVlRigpKSA6IDA7XG5cblx0XHRcdFx0Y192YWx1ZSA9IGNfcGFyZW50TWV0cmljMi5nZXRWYWx1ZSgpID4gMCA/IChjX3BhcmVudE1ldHJpYzEuZ2V0VmFsdWUoKSAvIGNfcGFyZW50TWV0cmljMi5nZXRWYWx1ZSgpKSA6IDA7XG5cdFx0XHRcdGNfdmFsdWVGID0gY19wYXJlbnRNZXRyaWMyLmdldFZhbHVlRigpID4gMCA/IChjX3BhcmVudE1ldHJpYzEuZ2V0VmFsdWVGKCkgLyBjX3BhcmVudE1ldHJpYzIuZ2V0VmFsdWVGKCkpIDogMDtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fdXBkYXRlTWV0cmljKHZpZXdJZCwgbV9jaGlsZE1ldHJpYywgc2RyLm1haW5Gcm9tLCBzZHIubWFpblRvLCBmaWx0ZXIsIG1fdmFsdWUsIG1fdmFsdWVGKTtcblx0XHRcdHRoaXMuX3VwZGF0ZU1ldHJpYyh2aWV3SWQsIGNfY2hpbGRNZXRyaWMsIHNkci5jb21wYXJlRnJvbSwgc2RyLmNvbXBhcmVUbywgZmlsdGVyLCBjX3ZhbHVlLCBjX3ZhbHVlRik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gdmlld0lkXG5cdCAqIEBwYXJhbSAge1N0YXRzRGF0YVJhbmdlfSBzZHJcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICovXG5cdF91cGRhdGVTdWJNZXRyaWNzKHZpZXdJZCwgc2RyLCBmaWx0ZXIpXG5cdHtcblx0XHRsZXQgbUNvbnRhaW5lciA9IHRoaXMuX21ldHJpY0NvbnRhaW5lcnNbdmlld0lkXTtcblxuXHRcdC8vIFVwZGF0ZSBzdWItbWV0cmljcyB1c2luZyB2YWx1ZXMgb2YgdGhlIG1haW4gbWV0cmljc1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbUNvbnRhaW5lci5tZXRyaWNJZHMubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IG1ldHJpY0lkID0gbUNvbnRhaW5lci5tZXRyaWNJZHNbaV07XG5cdFx0XHRsZXQgYmFzZU1ldHJpYyA9IHRoaXMuZ2V0QmFzZU1ldHJpYyh2aWV3SWQsIG1ldHJpY0lkKTtcblxuXHRcdFx0Ly8gU2tpcCBzdWJtZXRyaWMgaWYgaXQgd2FzIGFscmVhZHkgdXBkYXRlZFxuXHRcdFx0aWYgKGJhc2VNZXRyaWMuaXNTdWJNZXRyaWMgJiYgIW1Db250YWluZXIuaXNNZXRyaWNVcGRhdGVkKG1ldHJpY0lkLCBzZHIsIGZpbHRlcikpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJFVFVSTklORyBWSVNJVE9SUyA9IChVTklRVUUgVklTSVRPUlMgLSBORVcgVklTSVRPUlMpXG5cdFx0XHRcdGlmIChtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5SRVRfVklTSVRPUlMpXG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3ViTWV0cmljKHZpZXdJZCwgbWV0cmljSWQsIE1ldHJpY3NNYW5hZ2VyLlVOSVFVRV9WSVNJVE9SUywgTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTLCB0aGlzLlNVQk1FVFJJQ19ESUZGLCBzZHIsIGZpbHRlcik7XG5cblx0XHRcdFx0Ly8gUkVUVVJOSU5HIFZJU0lUT1JTJyBWSVNJVFMgPSAoVklTSVRTIC0gTkVXIFZJU0lUT1JTJyBWSVNJVFMpXG5cdFx0XHRcdGVsc2UgaWYgKG1ldHJpY0lkID09IE1ldHJpY3NNYW5hZ2VyLlJFVF9WSVNJVE9SU19WSVNJVFMpXG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3ViTWV0cmljKHZpZXdJZCwgbWV0cmljSWQsIE1ldHJpY3NNYW5hZ2VyLlZJU0lUUywgTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTX1ZJU0lUUywgdGhpcy5TVUJNRVRSSUNfRElGRiwgc2RyLCBmaWx0ZXIpO1xuXG5cdFx0XHRcdC8vIE5FVyBWSVNJVE9SUyAlID0gKE5FVyBWSVNJVE9SUyAvIFVOSVFVRSBWSVNJVE9SUyAqIDEwMClcblx0XHRcdFx0ZWxzZSBpZiAobWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRPUlMpXG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3ViTWV0cmljKHZpZXdJZCwgbWV0cmljSWQsIE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SUywgTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLlNVQk1FVFJJQ19QRVJDLCBzZHIsIGZpbHRlcik7XG5cblx0XHRcdFx0Ly8gUkVUVVJOSU5HIFZJU0lUT1JTICUgPSAoUkVUVVJOSU5HIFZJU0lUT1JTIC8gVU5JUVVFIFZJU0lUT1JTICogMTAwKVxuXHRcdFx0XHRlbHNlIGlmIChtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5QRVJDX1JFVF9WSVNJVE9SUylcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVTdWJNZXRyaWModmlld0lkLCBtZXRyaWNJZCwgTWV0cmljc01hbmFnZXIuUkVUX1ZJU0lUT1JTLCBNZXRyaWNzTWFuYWdlci5VTklRVUVfVklTSVRPUlMsIHRoaXMuU1VCTUVUUklDX1BFUkMsIHNkciwgZmlsdGVyKTtcblxuXHRcdFx0XHQvLyBORVcgVklTSVRTICUgPSAoTkVXIFZJU0lUT1InUyBWSVNJVFMgLyBWSVNJVFMgKiAxMDApXG5cdFx0XHRcdGVsc2UgaWYgKG1ldHJpY0lkID09IE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUU18xKVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVN1Yk1ldHJpYyh2aWV3SWQsIG1ldHJpY0lkLCBNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlNfVklTSVRTLCBNZXRyaWNzTWFuYWdlci5WSVNJVFMsIHRoaXMuU1VCTUVUUklDX1BFUkMsIHNkciwgZmlsdGVyKTtcblxuXHRcdFx0XHQvLyBBVkcgUk9PTSBKT0lOUyBQRVIgVVNFUiA9IChST09NIEpPSU5TIC8gVU5JUVVFIFVTRVJTKVxuXHRcdFx0XHRlbHNlIGlmIChtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5BVkdfUk9PTV9KT0lOUylcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVTdWJNZXRyaWModmlld0lkLCBtZXRyaWNJZCwgTWV0cmljc01hbmFnZXIuUk9PTV9KT0lOUywgTWV0cmljc01hbmFnZXIuVU5JUVVFX1ZJU0lUT1JTLCB0aGlzLlNVQk1FVFJJQ19ESVYsIHNkciwgZmlsdGVyKTtcblxuXHRcdFx0XHQvLyBBVkcgRVhDRVBUSU9OIE9DQ1VSUkVOQ0UgPSAoRVhDRVBUSU9OUyAvIFVOSVFVRSBFWENFUFRJT05TKVxuXHRcdFx0XHRlbHNlIGlmIChtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5BVkdfRVhDRVBUX09DQ1VSRU5DRSlcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVTdWJNZXRyaWModmlld0lkLCBtZXRyaWNJZCwgTWV0cmljc01hbmFnZXIuRVhDRVBUSU9OUywgTWV0cmljc01hbmFnZXIuVU5JUVVFX0VYQ0VQVElPTlMsIHRoaXMuU1VCTUVUUklDX0RJViwgc2RyLCBmaWx0ZXIpO1xuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENvZGUgdG8gY2FsY3VsYXRlICcke21ldHJpY0lkfScgbWV0cmljIGlzIG1pc3NpbmdgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZGl2aWRlKGRpdmlkZW5kLCBkaXZpZGVyLCBwZXJjZW50ID0gdHJ1ZSlcblx0e1xuXHRcdGlmIChkaXZpZGVyID4gMClcblx0XHRcdHJldHVybiBkaXZpZGVuZCAvIGRpdmlkZXIgKiAocGVyY2VudCA/IDEwMCA6IDEpO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAocGVyY2VudCA/IC0xIDogMCk7XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgbWFuaXB1bGF0ZXMgZGF0ZXMuIEFsbCBkYXRlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgbW9tZW50KCkgaW50YW5jZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRlSGVscGVyXG57XG5cdHN0YXRpYyBnZXQgREFURV9NQVNLKClcblx0e1xuXHRcdHJldHVybiAnREQgTU1NIFlZWVknO1xuXHR9XG5cblx0c3RhdGljIGdldCBEQVRFX1RSQU5TRkVSX01BU0soKVxuXHR7XG5cdFx0cmV0dXJuICdZWVlZL01NL0REIEhIOm1tOnNzJztcblx0fVxuXG5cdHN0YXRpYyBnZXRQcmV2RGF5KGRhdGUpXG5cdHtcblx0XHQvLyBtb21lbnQoZGF0ZSkgY2xvbmVzIHRoZSBwYXNzZWQgZGF0ZSwgYXMgbW9tZW50KCkgaW5zdGFuY2VzIGFyZSBtdXRhYmxlXG5cdFx0cmV0dXJuIG1vbWVudChkYXRlKS5zdWJ0cmFjdCgxLCAnZGF5cycpO1xuXHR9XG5cblx0c3RhdGljIGdldEZpcnN0RGF5T2ZQcmV2V2VlayhkYXRlKVxuXHR7XG5cdFx0Ly8gbW9tZW50KGRhdGUpIGNsb25lcyB0aGUgcGFzc2VkIGRhdGUsIGFzIG1vbWVudCgpIGluc3RhbmNlcyBhcmUgbXV0YWJsZVxuXHRcdHJldHVybiBtb21lbnQoZGF0ZSkuc3VidHJhY3QoMSwgJ3dlZWsnKS5zdGFydE9mKCd3ZWVrJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TGFzdERheU9mUHJldldlZWsoZGF0ZSlcblx0e1xuXHRcdC8vIG1vbWVudChkYXRlKSBjbG9uZXMgdGhlIHBhc3NlZCBkYXRlLCBhcyBtb21lbnQoKSBpbnN0YW5jZXMgYXJlIG11dGFibGVcblx0XHRyZXR1cm4gbW9tZW50KGRhdGUpLnN1YnRyYWN0KDEsICd3ZWVrJykuZW5kT2YoJ3dlZWsnKS5zdGFydE9mKCdkYXknKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRGaXJzdERheU9mUHJldk1vbnRoKGRhdGUpXG5cdHtcblx0XHQvLyBtb21lbnQoZGF0ZSkgY2xvbmVzIHRoZSBwYXNzZWQgZGF0ZSwgYXMgbW9tZW50KCkgaW5zdGFuY2VzIGFyZSBtdXRhYmxlXG5cdFx0cmV0dXJuIG1vbWVudChkYXRlKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5zdGFydE9mKCdtb250aCcpO1xuXHR9XG5cblx0c3RhdGljIGdldExhc3REYXlPZlByZXZNb250aChkYXRlKVxuXHR7XG5cdFx0Ly8gbW9tZW50KGRhdGUpIGNsb25lcyB0aGUgcGFzc2VkIGRhdGUsIGFzIG1vbWVudCgpIGluc3RhbmNlcyBhcmUgbXV0YWJsZVxuXHRcdHJldHVybiBtb21lbnQoZGF0ZSkuc3VidHJhY3QoMSwgJ21vbnRoJykuZW5kT2YoJ21vbnRoJykuc3RhcnRPZignZGF5Jyk7XG5cdH1cblxuXHRzdGF0aWMgYXJlRGF0ZXNFcXVhbChkYXRlMSwgZGF0ZTIpXG5cdHtcblx0XHRyZXR1cm4gZGF0ZTEuaXNTYW1lKGRhdGUyLCAnZGF5Jyk7XG5cdH1cblxuXHRzdGF0aWMgYXJlRGF0ZVRpbWVzRXF1YWwoZGF0ZTEsIGRhdGUyKVxuXHR7XG5cdFx0aWYgKGRhdGUxID09IG51bGwgJiYgZGF0ZTIgPT0gbnVsbClcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAoZGF0ZTEgIT0gbnVsbCAmJiBkYXRlMiAhPSBudWxsKVxuXHRcdFx0XHRyZXR1cm4gZGF0ZTEuaXNTYW1lKGRhdGUyLCAnaG91cicpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0c3RhdGljIGdldFRyYW5zZmVyU3RyaW5nRnJvbURhdGUoZGF0ZSlcblx0e1xuXHRcdHJldHVybiBkYXRlLmZvcm1hdChEYXRlSGVscGVyLkRBVEVfVFJBTlNGRVJfTUFTSyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RGF0ZUZyb21UcmFuc2ZlclN0cmluZyhkYXRlU3RyaW5nKVxuXHR7XG5cdFx0cmV0dXJuIG1vbWVudChkYXRlU3RyaW5nLCBEYXRlSGVscGVyLkRBVEVfVFJBTlNGRVJfTUFTSyk7XG5cdH1cblxuXHRzdGF0aWMgZm9ybWF0VGltZShtaWxsaXMpXG5cdHtcblx0XHRjb25zdCBkdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbihtaWxsaXMpO1xuXHRcdHJldHVybiBkdXJhdGlvbi5hc01pbnV0ZXMoKS50b0ZpeGVkKDIpICsgJyBtaW5zJztcblx0fVxuXG5cdHN0YXRpYyBmb3JtYXRUaW1lTXMobWlsbGlzKVxuXHR7XG5cdFx0aWYgKCFpc05hTihtaWxsaXMpKVxuXHRcdHtcblx0XHRcdGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKG1pbGxpcyAvIDEwMDApO1xuXG5cdFx0XHRjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNzIC8gNjApXG5cdFx0XHRjb25zdCBzZWNvbmRzID0gc2VjcyAtIChtaW51dGVzICogNjApO1xuXHRcdFx0Y29uc3QgbWlsbGlzZWNvbmRzID0gbWlsbGlzIC0gKHNlY3MgKiAxMDAwKTtcblxuXHRcdFx0bGV0IHN0ciA9ICcnO1xuXG5cdFx0XHRpZiAobWludXRlcyA+IDApXG5cdFx0XHRcdHN0ciArPSBTdHJpbmcobWludXRlcykgKyAnbSAnO1xuXG5cdFx0XHRpZiAobWludXRlcyA+IDAgfHwgc2Vjb25kcyA+IDApXG5cdFx0XHRcdHN0ciArPSBEYXRlSGVscGVyLnBhZFRpbWVWYWx1ZShzZWNvbmRzLCAyKSArICdzICc7XG5cblx0XHRcdGlmIChtaW51dGVzID4gMCB8fCBzZWNvbmRzID4gMClcblx0XHRcdFx0c3RyICs9IERhdGVIZWxwZXIucGFkVGltZVZhbHVlKG1pbGxpc2Vjb25kcywgMykgKyAnbXMnO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzdHIgPSBTdHJpbmcobWlsbGlzZWNvbmRzKSArICdtcyc7XG5cblx0XHRcdHJldHVybiBzdHI7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAnJztcblx0fVxuXG5cdHN0YXRpYyBwYWRUaW1lVmFsdWUodmFsdWUsIG51bUxlbmd0aClcblx0e1xuXHRcdGxldCB2YWx1ZVN0ciA9IFN0cmluZyh2YWx1ZSk7XG5cblx0XHR3aGlsZSAodmFsdWVTdHIubGVuZ3RoIDwgbnVtTGVuZ3RoKVxuXHRcdFx0dmFsdWVTdHIgPSAnMCcgKyB2YWx1ZVN0cjtcblxuXHRcdHJldHVybiB2YWx1ZVN0cjtcblx0fVxufVxuIiwiaW1wb3J0IHtNZXRyaWNzTWFuYWdlcn0gZnJvbSAnLi9tZXRyaWNzLW1hbmFnZXInO1xuaW1wb3J0IHtTdGF0c0RhdGFGaWx0ZXJ9IGZyb20gJy4vZGF0YS9zdGF0cy1kYXRhLWZpbHRlcic7XG5pbXBvcnQge01ldHJpY0Rpc3BsYXlTdGF0ZX0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL21ldHJpYy1kaXNwbGF5LXN0YXRlJztcblxuZXhwb3J0IGNsYXNzIFZpZXdNYW5hZ2VyXG57XG5cdHN0YXRpYyBnZXQgT1ZFUlZJRVcoKSB7IHJldHVybiAnb3ZlcnZpZXcnOyB9XG5cdHN0YXRpYyBnZXQgREVNT0dSQVBISUNTKCkgeyByZXR1cm4gJ2RlbW9ncmFwaGljcyc7IH1cblx0c3RhdGljIGdldCBURUNITk9MT0dZKCkgeyByZXR1cm4gJ3RlY2hub2xvZ3knOyB9XG5cdHN0YXRpYyBnZXQgQVBQTElDQVRJT04oKSB7IHJldHVybiAnYXBwbGljYXRpb24nOyB9XG5cdHN0YXRpYyBnZXQgRVhDRVBUSU9OUygpIHsgcmV0dXJuICdleGNlcHRpb25zJzsgfVxuXG5cdHN0YXRpYyBnZXQgVklFV1MoKSB7IHJldHVybiBbVmlld01hbmFnZXIuT1ZFUlZJRVcsIFZpZXdNYW5hZ2VyLkRFTU9HUkFQSElDUywgVmlld01hbmFnZXIuVEVDSE5PTE9HWSwgVmlld01hbmFnZXIuQVBQTElDQVRJT04sIFZpZXdNYW5hZ2VyLkVYQ0VQVElPTlNdOyB9XG5cblx0Y29uc3RydWN0b3IobWFpbkN0cmwsIHZpZXcsIG1ldHJpY3NNYW5hZ2VyKVxuXHR7XG5cdFx0dGhpcy5fbWFpbiA9IG1haW5DdHJsO1xuXHRcdHRoaXMuX3ZpZXcgPSB2aWV3O1xuXHRcdHRoaXMuX21tID0gbWV0cmljc01hbmFnZXI7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIFJlbW92ZSBjbGljayBsaXN0ZW5lcnMgb24gbWV0cmljIGxpc3QgaXRlbXNcblx0XHRmb3IgKGxldCB2aWV3SWQgb2YgVmlld01hbmFnZXIuVklFV1MpXG5cdFx0e1xuXHRcdFx0bGV0IHRhYiA9ICQoJyNhbmwtZGF0YXZpZXctJyArIHZpZXdJZCwgdGhpcy5fdmlldyk7XG5cblx0XHRcdGlmICh0YWIubGVuZ3RoKSAvLyBmYWxzZSBpZiBlbGVtZW50IGRvZXNuJ3QgZXhpc3Rcblx0XHRcdFx0dGFiWzBdLmRlc3Ryb3koKTtcblx0XHR9XG5cdH1cblxuXHRpbml0aWFsaXplKClcblx0e1xuXHRcdGZvciAobGV0IHZpZXdJZCBvZiBWaWV3TWFuYWdlci5WSUVXUylcblx0XHR7XG5cdFx0XHRsZXQgY2hhcnRzQ29udGFpbmVyID0gdGhpcy5fbW0uZ2V0Q2hhcnREYXRhQ29udGFpbmVyKHZpZXdJZCk7XG5cdFx0XHRsZXQgbWV0cmljc0NvbnRhaW5lciA9IHRoaXMuX21tLmdldE1ldHJpY0RhdGFDb250YWluZXIodmlld0lkKTtcblxuXHRcdFx0bGV0IHRhYiA9ICQoJyNhbmwtZGF0YXZpZXctJyArIHZpZXdJZCwgdGhpcy5fdmlldyk7XG5cblx0XHRcdGlmICh0YWIubGVuZ3RoKSAvLyBmYWxzZSBpZiBlbGVtZW50IGRvZXNuJ3QgZXhpc3Rcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRhdGFWaWV3RWxlbSA9IHRhYlswXTtcblxuXHRcdFx0XHQvLyAwKSBTZXQgdmlldyBpZFxuXHRcdFx0XHRkYXRhVmlld0VsZW0udmlld0lkID0gdmlld0lkO1xuXG5cdFx0XHRcdC8vIDEpIEluaXRpYWxpemUgdGlueSB2aXNpdHMgY2hhcnQgYXQgdGhlIHRvcCBvZiB0aGUgdmlld1xuXHRcdFx0XHRkYXRhVmlld0VsZW0udGlueVZpc2l0c0NoYXJ0LmluaXQodmlld0lkLCBtZXRyaWNzQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuVklTSVRTKSwgbWV0cmljc0NvbnRhaW5lci5nZXRDb21wYXJlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlZJU0lUUykpO1xuXG5cdFx0XHRcdC8vIDIpIEluaXRpYWxpemUgbWFpbiBjaGFydFxuXHRcdFx0XHRkYXRhVmlld0VsZW0ubWFpbkNoYXJ0LmluaXQoY2hhcnRzQ29udGFpbmVyKTtcblxuXHRcdFx0XHQvLyAzKSBJbml0aWFsaXplIG1ldHJpY3MgbGlzdFxuXHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG1ldHJpY3NDb250YWluZXIubWV0cmljSWRzLmxlbmd0aDsgaisrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgbWV0cmljSWQgPSBtZXRyaWNzQ29udGFpbmVyLm1ldHJpY0lkc1tqXTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLl9tbS5pc01ldHJpY0luRGlzcGxheUxpc3Qodmlld0lkLCBtZXRyaWNJZCkpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG1NYWluID0gbWV0cmljc0NvbnRhaW5lci5tYWluTWV0cmljc1ttZXRyaWNJZF07XG5cdFx0XHRcdFx0XHRsZXQgbUNvbXBhcmUgPSBtZXRyaWNzQ29udGFpbmVyLmNvbXBNZXRyaWNzW21ldHJpY0lkXTtcblx0XHRcdFx0XHRcdGxldCBiYXNlTWV0cmljID0gbU1haW4uYmFzZU1ldHJpYztcblxuXHRcdFx0XHRcdFx0Ly8gQWRkIGl0ZW0gdG8gdmlld1xuXHRcdFx0XHRcdFx0ZGF0YVZpZXdFbGVtLmFkZE1ldHJpY0xpc3RJdGVtKGJhc2VNZXRyaWMuaWQsIGNoYXJ0c0NvbnRhaW5lci5jaGFydElkcy5pbmRleE9mKGJhc2VNZXRyaWMuaWQpID49IDAsIG1NYWluLCBtQ29tcGFyZSwgdmlld0lkID09IFZpZXdNYW5hZ2VyLk9WRVJWSUVXKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyA0KSBJbml0aWFsaXplIG5ldyB2aXNpdG9ycyBwaWUgY2hhcnRzIChpZiBuZWVkZWQpXG5cdFx0XHRcdGlmICh0aGlzLl9tbS5nZXRCYXNlTWV0cmljKHZpZXdJZCwgTWV0cmljc01hbmFnZXIuUEVSQ19ORVdfVklTSVRPUlMpICE9IG51bGwgJiZcblx0XHRcdFx0XHR0aGlzLl9tbS5nZXRCYXNlTWV0cmljKHZpZXdJZCwgTWV0cmljc01hbmFnZXIuUEVSQ19SRVRfVklTSVRPUlMpICE9IG51bGwgJiZcblx0XHRcdFx0XHR0aGlzLl9tbS5nZXRCYXNlTWV0cmljKHZpZXdJZCwgTWV0cmljc01hbmFnZXIuTkVXX1ZJU0lUT1JTX1ZJU0lUUykgIT0gbnVsbCAmJlxuXHRcdFx0XHRcdHRoaXMuX21tLmdldEJhc2VNZXRyaWModmlld0lkLCBNZXRyaWNzTWFuYWdlci5SRVRfVklTSVRPUlNfVklTSVRTKSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gTUFJTlxuXHRcdFx0XHRcdGxldCBtRGF0YSA9IHtcblx0XHRcdFx0XHRcdHBudjogbWV0cmljc0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUT1JTKSxcblx0XHRcdFx0XHRcdHBydjogbWV0cmljc0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfUkVUX1ZJU0lUT1JTKSxcblx0XHRcdFx0XHRcdG52djogbWV0cmljc0NvbnRhaW5lci5nZXRNYWluTWV0cmljKE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SU19WSVNJVFMpLFxuXHRcdFx0XHRcdFx0cnZ2OiBtZXRyaWNzQ29udGFpbmVyLmdldE1haW5NZXRyaWMoTWV0cmljc01hbmFnZXIuUkVUX1ZJU0lUT1JTX1ZJU0lUUylcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gQ09NUEFSRVxuXHRcdFx0XHRcdGxldCBjRGF0YSA9IHtcblx0XHRcdFx0XHRcdHBudjogbWV0cmljc0NvbnRhaW5lci5nZXRDb21wYXJlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfTkVXX1ZJU0lUT1JTKSxcblx0XHRcdFx0XHRcdHBydjogbWV0cmljc0NvbnRhaW5lci5nZXRDb21wYXJlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLlBFUkNfUkVUX1ZJU0lUT1JTKSxcblx0XHRcdFx0XHRcdG52djogbWV0cmljc0NvbnRhaW5lci5nZXRDb21wYXJlTWV0cmljKE1ldHJpY3NNYW5hZ2VyLk5FV19WSVNJVE9SU19WSVNJVFMpLFxuXHRcdFx0XHRcdFx0cnZ2OiBtZXRyaWNzQ29udGFpbmVyLmdldENvbXBhcmVNZXRyaWMoTWV0cmljc01hbmFnZXIuUkVUX1ZJU0lUT1JTX1ZJU0lUUylcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0ZGF0YVZpZXdFbGVtLmluaXRWaXNpdG9yc1BpZUNoYXJ0cyhtRGF0YSwgY0RhdGEpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gNSkgSW5pdGlhbGl6ZSBkYXRhIHRhYmxlcyAob25seSBvbmUgcGVyIHZpZXcgZXhwZWN0ZWQpXG5cdFx0XHRcdGNvbnN0IHRhYmxlVmlldyA9IHRoaXMuZ2V0VGFibGVTdWJWaWV3KGRhdGFWaWV3RWxlbSk7XG5cdFx0XHRcdGlmICh0YWJsZVZpZXcgIT0gbnVsbClcblx0XHRcdFx0XHR0YWJsZVZpZXcuaW5pdCh0aGlzLl9tbS5nZXRUYWJsZURhdGEodmlld0lkKSwgdGhpcy5fbW0uZ2V0TWV0cmljRGF0YUNvbnRhaW5lcih2aWV3SWQpKTtcblxuXHRcdFx0XHQvLyA2KSBJbml0aWFsaXplIGRhdGEgY2hhcnRzIChvbmx5IG9uZSBwZXIgdmlldyBleHBlY3RlZClcblx0XHRcdFx0Y29uc3QgY2hhcnRWaWV3ID0gdGhpcy5nZXRDaGFydFN1YlZpZXcoZGF0YVZpZXdFbGVtKTtcblx0XHRcdFx0aWYgKGNoYXJ0VmlldyAhPSBudWxsKVxuXHRcdFx0XHRcdGNoYXJ0Vmlldy5pbml0KHRoaXMuX21tLmdldFRhYmxlRGF0YSh2aWV3SWQpLCB0aGlzLl9tbS5nZXRUYWJsZURhdGFNZXRyaWNzKCkpO1xuXG5cdFx0XHRcdC8vIDcpIENvbmZpZ3VyZSBjb21wb25lbnRzIHNwZWNpZmljIHRvIHZpZXdzXG5cdFx0XHRcdGlmICh2aWV3SWQgPT0gVmlld01hbmFnZXIuREVNT0dSQVBISUNTKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgbWFwVmlldyA9IHRoaXMuZ2V0TWFwU3ViVmlldyhkYXRhVmlld0VsZW0pO1xuXHRcdFx0XHRcdGlmIChtYXBWaWV3ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRtYXBWaWV3LmluaXQodGhpcy5fbW0uZ2V0VGFibGVEYXRhKHZpZXdJZCksIHRoaXMuX21tLmdldFRhYmxlRGF0YU1ldHJpY3MoKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyA4KSBIaWRlIHJhbmdlIG5vdGljZVxuXHRcdFx0XHQkKCcucmFuZ2Utbm90aWNlJywgdGFiKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Z2V0U2VsZWN0ZWRWaWV3KClcblx0e1xuXHRcdHJldHVybiAkKCcudGFiLXBhbmUuYWN0aXZlIGFuYWx5dGljcy1kYXRhLXZpZXcnLCB0aGlzLl92aWV3KS5nZXQoMCk7XG5cdH1cblxuXHRnZXRTZWxlY3RlZFZpZXdJZCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTZWxlY3RlZFZpZXcoKS52aWV3SWQ7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhUmFuZ2V9ICBzZHJcblx0ICogQHBhcmFtICB7U3RhdHNEYXRhRmlsdGVyfSAgZmlsdGVyXG5cdCAqIEBwYXJhbSAge2Jvb2xlYW59IGlzTG9hZGluZ1xuXHQgKiBAcGFyYW0gIHtib29sZWFufSAgZG9Gb3JjZVxuXHQgKi9cblx0dXBkYXRlVmlldyhzZHIsIGZpbHRlciwgaXNMb2FkaW5nLCBkb0ZvcmNlID0gZmFsc2UpXG5cdHtcblx0XHRjb25zdCBzZWxlY3RlZFZpZXcgPSB0aGlzLmdldFNlbGVjdGVkVmlldygpO1xuXHRcdGNvbnN0IHZpZXdJZCA9IHNlbGVjdGVkVmlldy52aWV3SWQ7XG5cdFx0Y29uc3QgbWV0cmljc0NvbnRhaW5lciA9IHRoaXMuX21tLmdldE1ldHJpY0RhdGFDb250YWluZXIodmlld0lkKTtcblx0XHRjb25zdCBjaGFydENvbnRhaW5lciA9IHRoaXMuX21tLmdldENoYXJ0RGF0YUNvbnRhaW5lcih2aWV3SWQpO1xuXG5cdFx0Ly8gRGVmYXVsdCBzdGF0ZVxuXHRcdGNvbnN0IHN0YXRlID0gKGlzTG9hZGluZyA/IE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HIDogTWV0cmljRGlzcGxheVN0YXRlLk1JU1NJTkcpO1xuXG5cdFx0Ly8gMSkgVXBkYXRlIHZpc2l0cyBjaGFydCBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3XG5cdFx0aWYgKG1ldHJpY3NDb250YWluZXIuaXNNZXRyaWNVcGRhdGVkKE1ldHJpY3NNYW5hZ2VyLlZJU0lUUywgc2RyLCBmaWx0ZXIpKVxuXHRcdHtcblx0XHRcdGlmIChzZHIuZG9Db21wYXJlKVxuXHRcdFx0XHRzZWxlY3RlZFZpZXcudGlueVZpc2l0c0NoYXJ0LnN0YXRlID0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0c2VsZWN0ZWRWaWV3LnRpbnlWaXNpdHNDaGFydC5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBO1xuXG5cdFx0XHQvLyBUaGUgZG9Gb3JjZSBwYXJhbSBpcyB0cnVlIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyB0aGUgdmlldyB0YWJcblx0XHRcdC8vIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGZvcmNlIHJlZnJlc2ggYmVjYXVzZSB0aGUgc3RhdGUgd2FzIGFscmVhZHkgc2V0IHRvIERBVEEgb3IgREFUQV9DT01QQVJFO1xuXHRcdFx0Ly8gaWYgdGhlIGRhdGEgd2FzIHVwZGF0ZWQgaW4gdGhlIHByZXZpb3VzIHZpZXcgYW5kIHdlIGRvbid0IHJlZnJlc2ggbm93LCB0aGUgbmV3IHZpZXcgd2lsbCBzdGlsbCBkaXNwbGF5IHRoZSBvbGQgZGF0YVxuXHRcdFx0Ly8gKGJlY2F1c2Ugc2V0dGluZyB0aGUgc3RhdGUgdG8gdGhlIHNhbWUgdmFsdWUgKGFib3ZlKSBkb2Vzbid0IGNhdXNlIHRoZSByZWZyZXNoIHRvIGhhcHBlbilcblx0XHRcdGlmIChkb0ZvcmNlKVxuXHRcdFx0XHRzZWxlY3RlZFZpZXcudGlueVZpc2l0c0NoYXJ0LnJlZnJlc2goKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0c2VsZWN0ZWRWaWV3LnRpbnlWaXNpdHNDaGFydC5zdGF0ZSA9IHN0YXRlO1xuXG5cdFx0Ly8gMikgVXBkYXRlIG1haW4gbWV0cmljIGNoYXJ0XG5cdFx0aWYgKCFjaGFydENvbnRhaW5lci5pc0NoYXJ0T3ZlcmFsbE91dGRhdGVkKHNlbGVjdGVkVmlldy5tYWluQ2hhcnQuZ2V0U2VsZWN0ZWRNZXRyaWNJZCgpLCBzZHIsIGZpbHRlciwgc2VsZWN0ZWRWaWV3Lm1haW5DaGFydC5nZXRTZWxlY3RlZFRpbWVVbml0KCkpKVxuXHRcdHtcblx0XHRcdGlmIChzZHIuZG9Db21wYXJlKVxuXHRcdFx0XHRzZWxlY3RlZFZpZXcubWFpbkNoYXJ0LnN0YXRlID0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEFfQ09NUEFSRTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0c2VsZWN0ZWRWaWV3Lm1haW5DaGFydC5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBO1xuXG5cdFx0XHQvLyAoc2VlIDEpXG5cdFx0XHRpZiAoZG9Gb3JjZSlcblx0XHRcdFx0c2VsZWN0ZWRWaWV3Lm1haW5DaGFydC5yZWZyZXNoKCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHNlbGVjdGVkVmlldy5tYWluQ2hhcnQuc3RhdGUgPSBzdGF0ZTtcblxuXHRcdC8vIDMpIFVwZGF0ZSBtZXRyaWNzIGxpc3Rcblx0XHRmb3IgKGxldCBiYXNlTWV0cmljIG9mIHRoaXMuX21tLmdldEJhc2VNZXRyaWNzRGlzcGxheUxpc3Qodmlld0lkKSlcblx0XHR7XG5cdFx0XHRpZiAobWV0cmljc0NvbnRhaW5lci5tZXRyaWNJZHMuaW5kZXhPZihiYXNlTWV0cmljLmlkKSA+IC0xKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTZXQgbWV0cmljIGl0ZW0gc3RhdGVcblx0XHRcdFx0aWYgKG1ldHJpY3NDb250YWluZXIuaXNNZXRyaWNVcGRhdGVkKGJhc2VNZXRyaWMuaWQsIHNkciwgZmlsdGVyKSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChzZHIuZG9Db21wYXJlKVxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRWaWV3LnNldE1ldHJpY0l0ZW1TdGF0ZShiYXNlTWV0cmljLmlkLCBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQV9DT01QQVJFKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRzZWxlY3RlZFZpZXcuc2V0TWV0cmljSXRlbVN0YXRlKGJhc2VNZXRyaWMuaWQsIE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBKTtcblxuXHRcdFx0XHRcdC8vIChzZWUgMSlcblx0XHRcdFx0XHRpZiAoZG9Gb3JjZSlcblx0XHRcdFx0XHRcdHNlbGVjdGVkVmlldy5yZWZyZXNoTWV0cmljSXRlbShiYXNlTWV0cmljLmlkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0c2VsZWN0ZWRWaWV3LnNldE1ldHJpY0l0ZW1TdGF0ZShiYXNlTWV0cmljLmlkLCBzdGF0ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNCkgVXBkYXRlIHZpc2l0b3JzIHBpZSBjaGFydC9zXG5cdFx0c2VsZWN0ZWRWaWV3LnNob3dWaXNpdG9yc0NvbXBhcmVQaWVDaGFydChzZHIuZG9Db21wYXJlKTtcblxuXHRcdGlmIChtZXRyaWNzQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVE9SUywgc2RyLCBmaWx0ZXIpICYmXG5cdFx0XHRtZXRyaWNzQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChNZXRyaWNzTWFuYWdlci5QRVJDX1JFVF9WSVNJVE9SUywgc2RyLCBmaWx0ZXIpICYmXG5cdFx0XHRtZXRyaWNzQ29udGFpbmVyLmlzTWV0cmljVXBkYXRlZChNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlNfVklTSVRTLCBzZHIsIGZpbHRlcikgJiZcblx0XHRcdG1ldHJpY3NDb250YWluZXIuaXNNZXRyaWNVcGRhdGVkKE1ldHJpY3NNYW5hZ2VyLlJFVF9WSVNJVE9SU19WSVNJVFMsIHNkciwgZmlsdGVyKSlcblx0XHR7XG5cdFx0XHRzZWxlY3RlZFZpZXcuc2V0VmlzaXRvcnNQaWVDaGFydHNTdGF0ZShNZXRyaWNEaXNwbGF5U3RhdGUuREFUQSk7XG5cblx0XHRcdC8vIChzZWUgMSlcblx0XHRcdGlmIChkb0ZvcmNlKVxuXHRcdFx0XHRzZWxlY3RlZFZpZXcucmVmcmVzaFZpc2l0b3JzUGllQ2hhcnRzKCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHNlbGVjdGVkVmlldy5zZXRWaXNpdG9yc1BpZUNoYXJ0c1N0YXRlKHN0YXRlKTtcblxuXHRcdC8vIDUpIFVwZGF0ZSBkYXRhIHRhYmxlXG5cdFx0Y29uc3QgdGFibGVWaWV3ID0gdGhpcy5nZXRUYWJsZVN1YlZpZXcoc2VsZWN0ZWRWaWV3KTtcblx0XHRjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tbS5nZXRUYWJsZURhdGEodmlld0lkKTtcblxuXHRcdGlmICh0YWJsZVZpZXcgIT0gbnVsbCAmJiB0YWJsZURhdGEgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGFibGVEYXRhLmlzRGF0YVVwZGF0ZWQoc2RyLm1haW5Gcm9tLCBzZHIubWFpblRvKSlcblx0XHRcdHtcblx0XHRcdFx0dGFibGVWaWV3LnN0YXRlID0gTWV0cmljRGlzcGxheVN0YXRlLkRBVEE7XG5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byBmb3JjZSByZWZyZXNoLCBhcyBkYXRhIGlzIG5vdCBzaGFyZWQgd2l0aCBvdGhlciB2aWV3c1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0YWJsZVZpZXcuc3RhdGUgPSBzdGF0ZTtcblx0XHR9XG5cblx0XHQvLyA2KSBVcGRhdGUgZGF0YSBjaGFydFxuXHRcdGNvbnN0IGNoYXJ0VmlldyA9IHRoaXMuZ2V0Q2hhcnRTdWJWaWV3KHNlbGVjdGVkVmlldyk7XG5cdFx0aWYgKGNoYXJ0VmlldyAhPSBudWxsICYmIHRhYmxlRGF0YSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0YWJsZURhdGEuaXNEYXRhVXBkYXRlZChzZHIubWFpbkZyb20sIHNkci5tYWluVG8pKVxuXHRcdFx0e1xuXHRcdFx0XHRjaGFydFZpZXcuc3RhdGUgPSBNZXRyaWNEaXNwbGF5U3RhdGUuREFUQTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIGZvcmNlIHJlZnJlc2gsIGFzIGRhdGEgaXMgbm90IHNoYXJlZCB3aXRoIG90aGVyIHZpZXdzXG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNoYXJ0Vmlldy5zdGF0ZSA9IHN0YXRlO1xuXHRcdH1cblxuXHRcdC8vIDcpIFVwZGF0ZSBtYXAgY2hhcnRcblx0XHRjb25zdCBtYXBWaWV3ID0gdGhpcy5nZXRNYXBTdWJWaWV3KHNlbGVjdGVkVmlldyk7XG5cdFx0aWYgKG1hcFZpZXcgIT0gbnVsbCAmJiB0YWJsZURhdGEgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGFibGVEYXRhLmlzRGF0YVVwZGF0ZWQoc2RyLm1haW5Gcm9tLCBzZHIubWFpblRvKSlcblx0XHRcdHtcblx0XHRcdFx0bWFwVmlldy5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5EQVRBO1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gZm9yY2UgcmVmcmVzaCwgYXMgZGF0YSBpcyBub3Qgc2hhcmVkIHdpdGggb3RoZXIgdmlld3Ncblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0bWFwVmlldy5zdGF0ZSA9IHN0YXRlO1xuXHRcdH1cblxuXHRcdC8vIDgpIFNob3cvaGlkZSByYW5nZSBub3RpY2Vcblx0XHR0aGlzLl9zaG93UmFuZ2VOb3RpY2Uoc2VsZWN0ZWRWaWV3LCBzZHIuZG9Db21wYXJlKVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZUxlblxuXHQgKi9cblx0c2V0QXZhaWxhYmxlQ2hhcnRUaW1lVW5pdChyYW5nZUxlbilcblx0e1xuXHRcdGNvbnN0IHZpZXdzID0gdGhpcy5fdmlldy5maW5kKCdhbmFseXRpY3MtZGF0YS12aWV3Jyk7XG5cdFx0Zm9yIChsZXQgdmlldyBvZiB2aWV3cylcblx0XHRcdHZpZXcuc2V0TWFpbkNoYXJ0QXZhaWxUaW1lVW5pdHMocmFuZ2VMZW4pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygdmlld3Mgd2hpY2ggaGF2ZSB0aGUgc2FtZSBzZXR0aW5ncyAoZmlsdGVyIGFuZCB0aW1lIHVuaXQpIGFzIHRob3NlIHBhc3NlZC5cblx0ICogVGhpcyBpcyBuZWVkZWQgdG8ga25vdyB0byB3aGljaCB2aWV3cyB0aGUgc2FtZSBjaGFydCBkYXRhIGFwcGxpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RhdHNEYXRhRmlsdGVyfSBmaWx0ZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRpbWVVbml0XG5cdCAqL1xuXHRnZXRVcGRhdGFibGVWaWV3c0ZvckNoYXJ0KGZpbHRlciwgdGltZVVuaXQpXG5cdHtcblx0XHRsZXQgdXBkYXRhYmxlVmlld3MgPSBbXTtcblxuXHRcdGNvbnN0IHZpZXdzID0gdGhpcy5fdmlldy5maW5kKCdhbmFseXRpY3MtZGF0YS12aWV3Jyk7XG5cdFx0Zm9yIChsZXQgdmlldyBvZiB2aWV3cylcblx0XHR7XG5cdFx0XHRpZiAodmlldy52YWxpZGF0ZVZpZXdTZXR0aW5ncyhmaWx0ZXIsIHRpbWVVbml0KSlcblx0XHRcdFx0dXBkYXRhYmxlVmlld3MucHVzaCh2aWV3LnZpZXdJZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVwZGF0YWJsZVZpZXdzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIChjb250YWlucyBmaWx0ZXJOYW1lLCBmaWx0ZXJWYWx1ZSwgY2hlY2tTZXBhcmF0b3IsIGZpbHRlckRpc3BsYXlWYWx1ZSlcblx0ICogQHBhcmFtIHtTdGF0c0RhdGFSYW5nZX0gc2RyXG5cdCAqL1xuXHRzZXRGaWx0ZXJPblNlbGVjdGVkVmlldyhkYXRhLCBzZHIpXG5cdHtcblx0XHRjb25zdCBzZWxlY3RlZFZpZXcgPSB0aGlzLmdldFNlbGVjdGVkVmlldygpO1xuXHRcdGNvbnN0IHZpZXdJZCA9IHNlbGVjdGVkVmlldy52aWV3SWQ7XG5cdFx0Y29uc3QgZmlsdGVyID0gbmV3IFN0YXRzRGF0YUZpbHRlcih2aWV3SWQsIGRhdGEuZmlsdGVyTmFtZSwgZGF0YS5maWx0ZXJWYWx1ZSk7XG5cblx0XHQvLyBTZXQgZmlsdGVyIG9uIHNlbGVjdGVkIHZpZXdcblx0XHRzZWxlY3RlZFZpZXcuc2V0RGF0YUZpbHRlcihmaWx0ZXIsIGRhdGEuY2hlY2tTZXBhcmF0b3IsIGRhdGEuZmlsdGVyRGlzcGxheVZhbHVlKTtcblxuXHRcdC8vIElmIHRoZSBmaWx0ZXIgdmFsdWUgaGFzIGJlZW4gc2V0IHRvIG51bGwgKD0gbm8gZmlsdGVyKVxuXHRcdC8vIHdlIGhhdmUgdG8gcmVzZXQgdGhlIG1ldHJpY3MnIGZpbHRlcmVkIHZhbHVlIGFuZCB1cGRhdGUgdGhlIHZpZXdcblx0XHQvLyBUaGUgcmVhc29uIGlzIHRoYXQgd2hlbiBzZXR0aW5nIHRoZSBmaWx0ZXIgdG8gZW1wdHksIG5vIHJlcXVlc3QgaXMgc2VudCB0byB0aGUgc2VydmVyXG5cdFx0Ly8gKGJlY2F1c2UgdGhlIG92ZXJhbGwgdmFsdWUgd2FzIGFscmVhZHkgcmVjZWl2ZWQgYmVmb3JlKSwgc28gdGhlIHVwZGF0ZSB3b24ndCBoYXBwZW4gYXV0b21hdGljYWxseVxuXG5cdFx0aWYgKGZpbHRlci52YWx1ZSA9PSBudWxsKVxuXHRcdHtcblx0XHRcdC8vIFJlc2V0IG1ldHJpY3MnIGZpbHRlcmVkIHZhbHVlXG5cdFx0XHR0aGlzLl9tbS5yZXNldE1ldHJpY3NGaWx0ZXIodmlld0lkKTtcblxuXHRcdFx0Ly8gRGlzcGxheSBjdXJyZW50IG1ldHJpYyBkYXRhXG5cdFx0XHR0aGlzLnVwZGF0ZVZpZXcoc2RyLCBmaWx0ZXIsIGZhbHNlLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBSZWZyZXNoIGRhdGEgdGFibGUgc28gdGhhdCB0aGUgZmlsdGVyIGlzIGFwcGxpZWRcblx0XHRjb25zdCB0YWJsZVZpZXcgPSB0aGlzLmdldFRhYmxlU3ViVmlldyhzZWxlY3RlZFZpZXcpO1xuXHRcdGlmICh0YWJsZVZpZXcgIT0gbnVsbClcblx0XHRcdHRhYmxlVmlldy5zZXRGaWx0ZXIoZmlsdGVyKTtcblxuXHRcdC8vIFJlZnJlc2ggY2hhcnQgc28gdGhhdCB0aGUgZmlsdGVyIGlzIGFwcGxpZWRcblx0XHRjb25zdCBjaGFydFZpZXcgPSB0aGlzLmdldENoYXJ0U3ViVmlldyhzZWxlY3RlZFZpZXcpO1xuXHRcdGlmIChjaGFydFZpZXcgIT0gbnVsbClcblx0XHRcdGNoYXJ0Vmlldy5zZXRGaWx0ZXIoZmlsdGVyKTtcblxuXHRcdC8vIFJlZnJlc2ggbWFwIHNvIHRoYXQgdGhlIGZpbHRlciBpcyBhcHBsaWVkXG5cdFx0Y29uc3QgbWFwVmlldyA9IHRoaXMuZ2V0TWFwU3ViVmlldyhzZWxlY3RlZFZpZXcpO1xuXHRcdGlmIChtYXBWaWV3ICE9IG51bGwpXG5cdFx0XHRtYXBWaWV3LnNldEZpbHRlcihmaWx0ZXIpO1xuXHR9XG5cblx0Z2V0VGFibGVTdWJWaWV3KHZpZXcgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHZpZXcgPT0gbnVsbClcblx0XHRcdHZpZXcgPSB0aGlzLmdldFNlbGVjdGVkVmlldygpO1xuXG5cdFx0Y29uc3QgdGFibGVWaWV3cyA9IHZpZXcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZGF0YS10YWJsZScpO1xuXG5cdFx0aWYgKHRhYmxlVmlld3MubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiB0YWJsZVZpZXdzWzBdO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0Q2hhcnRTdWJWaWV3KHZpZXcgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHZpZXcgPT0gbnVsbClcblx0XHRcdHZpZXcgPSB0aGlzLmdldFNlbGVjdGVkVmlldygpO1xuXG5cdFx0Y29uc3QgY2hhcnRWaWV3cyA9IHZpZXcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZGF0YS1jaGFydCcpO1xuXG5cdFx0aWYgKGNoYXJ0Vmlld3MubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiBjaGFydFZpZXdzWzBdO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0TWFwU3ViVmlldyh2aWV3ID0gbnVsbClcblx0e1xuXHRcdGlmICh2aWV3ID09IG51bGwpXG5cdFx0XHR2aWV3ID0gdGhpcy5nZXRTZWxlY3RlZFZpZXcoKTtcblxuXHRcdGNvbnN0IG1hcFZpZXdzID0gdmlldy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkYXRhLW1hcCcpO1xuXG5cdFx0aWYgKG1hcFZpZXdzLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gbWFwVmlld3NbMF07XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRfc2hvd1JhbmdlTm90aWNlKHN1YnZpZXcsIGRvU2hvdylcblx0e1xuXHRcdGlmIChkb1Nob3cpXG5cdFx0XHQkKCcucmFuZ2Utbm90aWNlJywgc3Vidmlldykuc2hvdygpO1xuXHRcdGVsc2Vcblx0XHRcdCQoJy5yYW5nZS1ub3RpY2UnLCBzdWJ2aWV3KS5oaWRlKCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0RhdGFSYW5nZU1hbmFnZXIsIFN0YXRzRGF0YVJhbmdlfSBmcm9tICcuLi9tYW5hZ2Vycy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2RhdGEtcmFuZ2UtbWFuYWdlcic7XG5pbXBvcnQge01ldHJpY3NNYW5hZ2VyfSBmcm9tICcuLi9tYW5hZ2Vycy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL21ldHJpY3MtbWFuYWdlcic7XG5pbXBvcnQge1ZpZXdNYW5hZ2VyfSBmcm9tICcuLi9tYW5hZ2Vycy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3ZpZXctbWFuYWdlcic7XG5pbXBvcnQge0RhdGVIZWxwZXJ9IGZyb20gJy4uL21hbmFnZXJzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvdXRpbHMvZGF0ZS1oZWxwZXInO1xuaW1wb3J0IHtNZXRyaWNEaXNwbGF5U3RhdGV9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9tZXRyaWMtZGlzcGxheS1zdGF0ZSc7XG5pbXBvcnQge0FuYWx5dGljc0RhdGFWaWV3fSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvYW5hbHl0aWNzLWRhdGEtdmlldyc7XG5pbXBvcnQge0RlbW9ncmFwaGljc1RhYmxlVmlld30gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2RlbW9ncmFwaGljcy9kZW1vZ3JhcGhpY3MtdGFibGUtdmlldyc7XG5pbXBvcnQge0RlbW9ncmFwaGljc0NoYXJ0Vmlld30gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2RlbW9ncmFwaGljcy9kZW1vZ3JhcGhpY3MtY2hhcnQtdmlldyc7XG5pbXBvcnQge0RlbW9ncmFwaGljc01hcFZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9kZW1vZ3JhcGhpY3MvZGVtb2dyYXBoaWNzLW1hcC12aWV3JztcbmltcG9ydCB7VGVjaG5vbG9neVRhYmxlVmlld30gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3RlY2hub2xvZ3kvdGVjaG5vbG9neS10YWJsZS12aWV3JztcbmltcG9ydCB7VGVjaG5vbG9neUNoYXJ0Vmlld30gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3RlY2hub2xvZ3kvdGVjaG5vbG9neS1jaGFydC12aWV3JztcbmltcG9ydCB7QXBwbGljYXRpb25UYWJsZVZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi10YWJsZS12aWV3JztcbmltcG9ydCB7QXBwbGljYXRpb25DaGFydFZpZXd9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL2FuYWx5dGljcy9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi1jaGFydC12aWV3JztcbmltcG9ydCB7RXhjZXB0aW9uc1RhYmxlVmlld30gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2V4Y2VwdGlvbnMvZXhjZXB0aW9ucy10YWJsZS12aWV3JztcbmltcG9ydCB7RXhjZXB0aW9uc0NoYXJ0Vmlld30gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL2V4Y2VwdGlvbnMvZXhjZXB0aW9ucy1jaGFydC12aWV3JztcbmltcG9ydCB7RGVtb2dyYXBoaWNzUHJvQWR2fSBmcm9tICcuLi9jb21wb25lbnRzL21vZHVsZS1zcGVjaWZpYy9hbmFseXRpY3MvZGVtb2dyYXBoaWNzL2RlbW9ncmFwaGljcy1wcm8tYWR2JztcbmltcG9ydCB7VGVjaG5vbG9neVByb0Fkdn0gZnJvbSAnLi4vY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvYW5hbHl0aWNzL3RlY2hub2xvZ3kvdGVjaG5vbG9neS1wcm8tYWR2JztcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbmFseXRpY3MgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2FuYWx5dGljcycpO1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9JTklUID0gJ2RvSW5pdCc7XG5cdFx0dGhpcy5SRVFfR0VUX0RBVEEgPSAnZ2V0RGF0YSc7XG5cdFx0dGhpcy5SRVFfSU5URVJSVVBUID0gJ3N0b3AnO1xuXHRcdHRoaXMuUkVRX1NUQVJUX0xPR19BTkFMWVNJUyA9ICdzdGFydExvZ0FuJztcblxuXHRcdC8vIEluY29taW5nIHJlc3BvbnNlc1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9SQU5HRSA9ICdyYW5nZSc7XG5cdFx0dGhpcy5SRVNQX0RBVEFfTk9ORSA9ICdub25lJztcblx0XHR0aGlzLlJFU1BfREFUQV9QUk9HUkVTUyA9ICdwcm9ncmVzcyc7XG5cdFx0dGhpcy5SRVNQX0RBVEFfUkVBRFkgPSAnZGF0YSc7XG5cdFx0dGhpcy5SRVNQX0RBVEFfQ09NUExFVEUgPSAnY29tcGxldGUnO1xuXHRcdHRoaXMuUkVTUF9CVVNZX0lOSVQgPSAnaXNCdXN5SW5pdCc7XG5cdFx0dGhpcy5SRVNQX0JVU1lfREFUQSA9ICdpc0J1c3lEYXRhJztcblx0XHR0aGlzLlJFU1BfTE9HX0FOQUxZU0lTX0lOSVRfRVJST1IgPSAnbG9nQW5Jbml0RXJyb3InO1xuXHRcdHRoaXMuUkVTUF9MT0dfQU5BTFlTSVNfU1RBVFVTID0gJ2xvZ0FuU3RhdHVzJztcblx0XHR0aGlzLlJFU1BfRVJST1IgPSAnZXJyb3InO1xuXG5cdFx0dGhpcy5WRVJTSU9OX0RFTU8gPSAnZGVtbyc7XG5cdFx0dGhpcy5WRVJTSU9OX0JBU0lDID0gJ2Jhc2ljJztcblx0XHR0aGlzLlZFUlNJT05fUFJPID0gJ3Bybyc7XG5cblx0XHR0aGlzLlZJRVdfSU5JVF9XQUlUID0gJ2FubC1pbml0LXdhaXQnO1xuXHRcdHRoaXMuVklFV19JTklUX0JVU1kgPSAnYW5sLWluaXQtYnVzeSc7XG5cdFx0dGhpcy5WSUVXX0lOSVRfUlVOID0gJ2FubC1pbml0LXJ1bic7XG5cdFx0dGhpcy5WSUVXX0RBVEEgPSAnYW5sLWRhdGEnO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpO1xuXG5cdFx0Ly8gSU5JVElBTElaRSBDT01QT05FTlRTXG5cblx0XHQvLyBJbml0aWFsaXplIHByb2dyZXNzIGJhclxuXHRcdCQoJyNhbmwtcHJvZ3Jlc3NCYXInKS5rZW5kb1Byb2dyZXNzQmFyKHtcblx0XHRcdG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMTAwLFxuXHRcdFx0dmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA0MDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gYnV0dG9uc1xuXHRcdCQoJyNhbmwtcmVmcmVzaEluaXRCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoSW5pdEJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYW5sLWluaXRBbmFseXplTG9nQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uSW5pdFN0YXJ0TG9nQW5hbHlzaXNCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2FubC1yZWZyZXNoQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVmcmVzaERhdGFCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2FubC1jb25maWdSYW5nZUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblNob3dDb25maWdSYW5nZU1vZGFsQnRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNhbmwtc3RvcEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblN0b3BCdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2FubC1hbmFseXplTG9nQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uU2hvd0xvZ0FuYWx5c2lzTW9kYWxCdENsaWNrLCB0aGlzKSk7XG5cblx0XHQkKCcudXBsb2FkLXNwaW5uZXInKS5oaWRlKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIGhlbHAgdG9vbHRpcHNcblx0XHQkKHRoaXMpLmtlbmRvVG9vbHRpcCh7XG5cdFx0XHRmaWx0ZXI6ICdpW3RpdGxlXS5oZWxwLCAuc2hvdy10b29sdGlwW3RpdGxlXScsXG5cdFx0XHRwb3NpdGlvbjogJ3JpZ2h0Jyxcblx0XHRcdGNvbnRlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIGA8ZGl2IGNsYXNzPSdoZWxwLXRvb2x0aXAnPiR7ZS50YXJnZXQuZGF0YSgndGl0bGUnKX08L2Rpdj5gO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gQ29uZmlndXJlIGxvZyBhbmFseXNpcyBwYW5lbFxuXHRcdCQoJyNhbmwtbG9nQW5hbHlzaXNNb2RhbCcpLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIFN0YXJ0IGxvZyBhbmFseXNpcyBidXR0b24gY2xpY2tcblx0XHQkKCcjYW5sLXN0YXJ0TG9nQW5hbHlzaXNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TdGFydExvZ0FuYWx5c2lzQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQ29uZmlndXJlIGRhdGEgcmFuZ2UgcGFuZWxcblx0XHQkKCcjYW5sLWRhdGFSYW5nZU1vZGFsJykubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2UsXG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gU3RhcnQgbG9nIGFuYWx5c2lzIGJ1dHRvbiBjbGlja1xuXHRcdCQoJyNhbmwtc2V0RGF0YVJhbmdlQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uU2V0RGF0YVJhbmdlQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNhbmwtdGFiTmF2aWdhdG9yID4gI3RhYnMnKS5zY3JvbGxpbmdUYWJzKHtcblx0XHRcdGJvb3RzdHJhcFZlcnNpb246IDQsXG5cdFx0XHRzY3JvbGxUb1RhYkVkZ2U6IHRydWUsXG5cdFx0XHRlbmFibGVTd2lwaW5nOiB0cnVlLFxuXHRcdFx0ZGlzYWJsZVNjcm9sbEFycm93c09uRnVsbHlTY3JvbGxlZDogdHJ1ZSxcblx0XHRcdGNzc0NsYXNzTGVmdEFycm93OiAnZmEgZmEtY2hldnJvbi1sZWZ0Jyxcblx0XHRcdGNzc0NsYXNzUmlnaHRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnXG5cdFx0fSk7XG5cblx0XHQkKCcjYW5sLXRhYk5hdmlnYXRvciBhW2RhdGEtdG9nZ2xlPVwidGFiXCJdJykub24oJ3Nob3duLmJzLnRhYicsICQucHJveHkodGhpcy5fb25WaWV3Q2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gXCJmaWx0ZXItc2V0XCIgZXZlbnQgZGlzcGF0Y2hlZCBieSBkYXRhIHZpZXdzXG5cdFx0JCgnYW5hbHl0aWNzLWRhdGEtdmlldycpLm9uKCdmaWx0ZXItc2V0JywgJC5wcm94eSh0aGlzLl9vbkRhdGFGaWx0ZXJTZXQsIHRoaXMpKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byByZWRyYXcgd2hhdCdzIG5lZWRlZCBpbiBjYXNlIG9mIHdpbmRvdyByZXNpemVcblx0XHQkKHdpbmRvdykub24oJ3Jlc2l6ZScsICQucHJveHkodGhpcy5fb25XaW5kb3dSZXNpemUsIHRoaXMpKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byByZWRyYXcgd2hhdCdzIG5lZWRlZCB3aGVuIGEgcGlsbCBuYXYgdGFiIGlzIGNoYW5nZWRcblx0XHQkKCdhbmFseXRpY3MtZGF0YS12aWV3IGFbZGF0YS10b2dnbGU9XCJwaWxsXCJdJykub24oJ3Nob3duLmJzLnRhYicsICQucHJveHkodGhpcy5fb25XaW5kb3dSZXNpemUsIHRoaXMpKTtcblxuXHRcdC8vIE9USEVSIElOSVRJQUxJWkFUSU9OU1xuXG5cdFx0dGhpcy5faW5pdGlhbGl6ZSgpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblxuXHRcdCQod2luZG93KS5vZmYoJ3Jlc2l6ZScpO1xuXHRcdCQoJ2FuYWx5dGljcy1kYXRhLXZpZXcgYVtkYXRhLXRvZ2dsZT1cInBpbGxcIl0nKS5vZmYoJ3Nob3duLmJzLnRhYicpO1xuXG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNhbmwtdGFiTmF2aWdhdG9yICN0YWJzJykuc2Nyb2xsaW5nVGFicygnZGVzdHJveScpO1xuXHRcdCQoJyNhbmwtdGFiTmF2aWdhdG9yIGFbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKS5vZmYoJ3Nob3duLmJzLnRhYicpO1xuXG5cdFx0Ly8gUmVtb3ZlIGludGVyZmFjZSBidXR0b25zIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyNhbmwtcmVmcmVzaEluaXRCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYW5sLWluaXRBbmFseXplTG9nQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2FubC1yZWZyZXNoQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2FubC1jb25maWdSYW5nZUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNhbmwtc3RvcEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNhbmwtYW5hbHl6ZUxvZ0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNhbmwtc3RhcnRMb2dBbmFseXNpc0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNhbmwtc2V0RGF0YVJhbmdlQnQnKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHQvLyBSZW1vdmUgY3VzdG9tIGV2ZW50IGxpc3RlbmVyc1xuXHRcdCQoJ2FuYWx5dGljcy1kYXRhLXZpZXcnKS5vZmYoJ3RpbWUtdW5pdC1jaGFuZ2UnKTtcblx0XHQkKCdhbmFseXRpY3MtZGF0YS12aWV3Jykub2ZmKCdjaGFydC1tZXRyaWMtY2hhbmdlJyk7XG5cdFx0JCgnYW5hbHl0aWNzLWRhdGEtdmlldycpLm9mZignZmlsdGVyLXNldCcpO1xuXG5cdFx0Ly8gSGlkZSBtb2RhbHNcblx0XHQkKCcjYW5sLWxvZ0FuYWx5c2lzTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXHRcdCQoJyNhbmwtZGF0YVJhbmdlTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXG5cdFx0Ly8gRGVzdHJveSBtYW5hZ2Vyc1xuXHRcdHRoaXMuX2RybS5kZXN0cm95KCk7XG5cdFx0dGhpcy5fZHZtLmRlc3Ryb3koKTtcblx0XHR0aGlzLl9tbS5kZXN0cm95KCk7XG5cdH1cblxuXHRvbkV4dGVuc2lvbkNvbW1hbmQoY29tbWFuZCwgZGF0YSlcblx0e1xuXHRcdC8vIEEgU1FMIGVycm9yIG9jY3VycmVkXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0VSUk9SKVxuXHRcdHtcblx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSgpO1xuXG5cdFx0XHRjb25zdCB3YXJuaW5nID0gYFVuYWJsZSB0byBleGVjdXRlIHRoZSByZXF1ZXN0IGR1ZSB0byB0aGUgZm9sbG93aW5nIFNRTCBlcnJvcjogJHtkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKX0uYDtcblxuXHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KHdhcm5pbmcpO1xuXHRcdH1cblxuXHRcdC8qIC0tLS0tLS0tLS0gTE9HIEFOQUxZU0lTIFJFTEFURUQgUkVTUE9OU0VTIC0tLS0tLS0tLS0gKi9cblxuXHRcdC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGluaXRpYWxpemluZyB0aGUgbG9nIGFuYWx5c2lzIHByb2Nlc3Ncblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9MT0dfQU5BTFlTSVNfSU5JVF9FUlJPUilcblx0XHR7XG5cdFx0XHRjb25zdCB3YXJuaW5nID0gZGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJyk7XG5cblx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCh3YXJuaW5nKTtcblxuXHRcdFx0Ly8gRW5hYmxlIGJ1dHRvbnNcblx0XHRcdHRoaXMuX2VuYWJsZUxvZ0FuYWx5c2lzQnV0dG9uKHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIExvZyBhbmFseXNpcyBwcm9jZXNzIHN0YXR1cyB1cGRhdGVcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9MT0dfQU5BTFlTSVNfU1RBVFVTKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlzUnVubmluZyA9IGRhdGEuZ2V0Qm9vbCgncnVubmluZycpO1xuXHRcdFx0Y29uc3QgcmVxdWVzdGVyID0gZGF0YS5jb250YWluc0tleSgncmVxdWVzdGVyJykgPyBkYXRhLmdldFV0ZlN0cmluZygncmVxdWVzdGVyJykgOiAnJztcblx0XHRcdGNvbnN0IHdhcm5pbmcgPSBkYXRhLmNvbnRhaW5zS2V5KCdlcnJvcicpID8gZGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJykgOiAnJztcblxuXHRcdFx0Ly8gRGlzYWJsZS9lbmFibGUgYnV0dG9uXG5cdFx0XHR0aGlzLl9lbmFibGVMb2dBbmFseXNpc0J1dHRvbighaXNSdW5uaW5nKTtcblxuXHRcdFx0aWYgKGlzUnVubmluZylcblx0XHRcdHtcblx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbignTG9nIGFuYWx5c2lzJywgYFByb2Nlc3Mgc3RhcnRlZCAkeyhyZXF1ZXN0ZXIgIT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSA/ICcgYnkgYWRtaW5pc3RyYXRvciAnICsgcmVxdWVzdGVyIDogJycpfTsgdXBkYXRlZCBzdGF0cyB3aWxsIGJlIGF2YWlsYWJsZSBvbiBjb21wbGV0aW9uYCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIENoZWNrIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBsb2cgYW5hbHlzaXNcblx0XHRcdFx0Ly8gSWYgbm90LCB0aGVuIHByb2Nlc3MgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0XHRpZiAod2FybmluZyAhPSAnJylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChgJHt3YXJuaW5nfTsgcGxlYXNlIGNoZWNrIHRoZSBTbWFydEZveFNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscyBhbmQgcmVwb3J0IHRoZSBpc3N1ZSB0byB0aGUgU21hcnRGb3hTZXJ2ZXIgdGVhbSBpZiBuZWVkZWQuYCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gR28gdG8gZGF0YSBkaXNwbGF5IHZpZXdcblx0XHRcdFx0XHR0aGlzLl90b0RhdGFEaXNwbGF5VmlldygpO1xuXG5cdFx0XHRcdFx0Ly8gVXBkYXRlIGxhc3QgcHJvY2Vzc2VkIGxvZyBlbnRyeSBkYXRlIGFuZCBnZW9sb2NhdGlvbiBmbGFnXG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlTG9nQW5hbHlzaXNJbmZvKGRhdGEuZ2V0U0ZTT2JqZWN0KCdpbmZvJykpO1xuXG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdMb2cgYW5hbHlzaXMnLCAnUHJvY2VzcyBjb21wbGV0ZWQ7IHVwZGF0ZWQgc3RhdHMgYXJlIG5vdyBhdmFpbGFibGUnKTtcblxuXHRcdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0XHRcdCQoJyNhbmwtbG9nQW5hbHlzaXNNb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cblx0XHRcdFx0XHQvLyBSZWZyZXNoIGRhdGFcblx0XHRcdFx0XHR0aGlzLl9yZXF1ZXN0U3RhdHNEYXRhKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKiAtLS0tLS0tLS0tIElOSVQgUkVMQVRFRCBSRVNQT05TRVMgLS0tLS0tLS0tLSAqL1xuXG5cdFx0Ly8gTG9nIGFuYWx5c2lzIGlzIGluIHByb2dyZXNzOiBjYW50JyBnZXQgaW5pdGlhbGl6YXRpb24gZGF0YVxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JVU1lfSU5JVClcblx0XHR7XG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KHRoaXMuVklFV19JTklUX0JVU1kpO1xuXHRcdH1cblxuXHRcdC8vIEJhc2ljIGluZm8gcmVjZWl2ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9JTklUKVxuXHRcdHtcblx0XHRcdC8vIENvbmZpZ3VyZSBtb2R1bGUgYmFzZWQgb24gbGljZW5zZVxuXHRcdFx0dGhpcy5fY29uZmlndXJlKGRhdGEuZ2V0VXRmU3RyaW5nKCd2ZXJzaW9uJykpO1xuXG5cdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgnaW5mbycpKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBVcGRhdGUgbGFzdCBwcm9jZXNzZWQgbG9nIGVudHJ5IGRhdGUgYW5kIGdlb2xvY2F0aW9uIGZsYWdcblx0XHRcdFx0dGhpcy5fdXBkYXRlTG9nQW5hbHlzaXNJbmZvKGRhdGEuZ2V0U0ZTT2JqZWN0KCdpbmZvJykpO1xuXG5cdFx0XHRcdC8vIFNob3cgZGF0YSBkaXNwbGF5IHZpZXdcblx0XHRcdFx0dGhpcy5fdG9EYXRhRGlzcGxheVZpZXcoKTtcblxuXHRcdFx0XHQvLyBSZXF1ZXN0IGRhdGFcblx0XHRcdFx0dGhpcy5fcmVxdWVzdFN0YXRzRGF0YSgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KHRoaXMuVklFV19JTklUX1JVTik7XG5cdFx0fVxuXG5cdFx0LyogLS0tLS0tLS0tLSBEQVRBIFJFVFJJRVZBTCBSRUxBVEVEIFJFU1BPTlNFUyAtLS0tLS0tLS0tICovXG5cblx0XHQvLyBMb2cgYW5hbHlzaXMgaXMgaW4gcHJvZ3Jlc3M6IGNhbnQnIGdldCBzdGF0cyBkYXRhXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfQlVTWV9EQVRBKVxuXHRcdHtcblx0XHRcdC8vIFVwZGF0ZSB2aWV3XG5cdFx0XHR0aGlzLl9kdm0udXBkYXRlVmlldyhkcm0uZ2V0U2VsZWN0ZWRSYW5nZSgpLCB0aGlzLl9nZXREYXRhRmlsdGVyKCksIGZhbHNlKTtcblxuXHRcdFx0Ly8gRW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlSW50ZXJmYWNlKCk7XG5cblx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChgU3RhdHMgZGF0YSBjYW4ndCBiZSByZXRyaXZlZCBiZWNhdXNlIHRoZSB1cGRhdGUgcHJvY2VzcyBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuIFBsZWFzZSB3YWl0IGZvciBsb2cgYW5hbHlzaXMgY29tcGxldGlvbiBhbmQgaGl0IHRoZSAnUmVmcmVzaCcgYnV0dG9uLmApO1xuXHRcdH1cblxuXHRcdC8vIERhdGEgcmFuZ2UgdXBkYXRlZCBieSB0aGUgc2VydmVyXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUkFOR0UpXG5cdFx0e1xuXHRcdFx0Ly8gU2V0IGRhdGEgcmFuZ2UsIGluIGNhc2UgaXQgd2FzIG1vZGlmaWVkIGJ5IHRoZSBzZXJ2ZXJcblx0XHRcdGlmIChkYXRhLmNvbnRhaW5zS2V5KCdyYW5nZScpKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgc2RyID0gU3RhdHNEYXRhUmFuZ2UubmV3RnJvbVNGU09iamVjdChkYXRhLmdldFNGU09iamVjdCgncmFuZ2UnKSlcblx0XHRcdFx0dGhpcy5fZHJtLnNldE5ld1JhbmdlKHNkcik7XG5cblx0XHRcdFx0Ly8gU2hvdyBzZWxlY3RlZCBkYXRhIHJhbmdlXG5cdFx0XHRcdHRoaXMuX2Rpc3BsYXlEYXRhUmFuZ2UoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRW5hYmxlIHN0b3AgYnV0dG9uXG5cdFx0XHQkKCcjYW5sLXN0b3BCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXHRcdH1cblxuXHRcdC8vIE5vIHN0YXRzIGRhdGEgYXZhaWxhYmxlXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfREFUQV9OT05FKVxuXHRcdHtcblx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSgpO1xuXG5cdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1RoZSBzdGF0cyBkYXRhYmFzZSBpcyBlbXB0eTsgeW91IHNob3VsZCBydW4gdGhlIGxvZyBhbmFseXNpcyBwcm9jZXNzLicpO1xuXHRcdH1cblxuXHRcdC8vIFN0YXRzIGRhdGEgcmV0cmlldmFsIHByb2dyZXNzIHVwZGF0ZVxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0RBVEFfUFJPR1JFU1MpXG5cdFx0e1xuXHRcdFx0dGhpcy5fZHZtLmdldFNlbGVjdGVkVmlldygpLnVwZGF0ZVByb2dyZXNzKGRhdGEuZ2V0SW50KCdzdGVwcycpKTtcblx0XHR9XG5cblx0XHQvLyBTdGF0cyBkYXRhIHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfREFUQV9SRUFEWSlcblx0XHR7XG5cdFx0XHRjb25zdCByYW5nZSA9IHRoaXMuX2RybS5nZXRTZWxlY3RlZFJhbmdlKCk7XG5cdFx0XHRjb25zdCBmaWx0ZXIgPSB0aGlzLl9nZXREYXRhRmlsdGVyKCk7XG5cblx0XHRcdC8vIERpc3BsYXkgcmVjZWl2ZWQgZGF0YVxuXG5cdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgnbWV0cmljcycpKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbWV0cmljc0RhdGEgPSBkYXRhLmdldFNGU09iamVjdCgnbWV0cmljcycpO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSBtZXRyaWNzXG5cdFx0XHRcdHRoaXMuX21tLnVwZGF0ZU1ldHJpY3MobWV0cmljc0RhdGEsIHJhbmdlLCBmaWx0ZXIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgnY2hhcnQnKSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNoYXJ0RGF0YSA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdjaGFydCcpO1xuXG5cdFx0XHRcdC8vIEdldCBsaXN0IG9mIHZpZXdzIHdpdGggdGhlIHNhbWUgc2V0dGluZ3MgKGZpbHRlciBhbmQgdGltZXVuaXQpIG9mIHRoZSBjdXJyZW50IHZpZXdcblx0XHRcdFx0Ly8gVGhpcyBhbGxvd3MgdXBkYXRpbmcgdmlld3Mgb3RoZXIgdGhhbiB0aGUgY3VycmVudCB3aXRoIHRoZSByZWNlaXZlZCBjaGFydCBkYXRhIGlmOlxuXHRcdFx0XHQvLyAtIHRoZSB2aWV3IGNvbnRhaW5zIHRoZSBzYW1lIGNoYXJ0XG5cdFx0XHRcdC8vIC0gdGhlIGZpbHRlciBpcyBudWxsXG5cdFx0XHRcdC8vIC0gdGhlIHNhbWUgdGltZSB1bml0IGlzIHNlbGVjdGVkIGZvciB0aGUgY2hhcnRcblxuXHRcdFx0XHRjb25zdCB0aW1lVW5pdCA9IHRoaXMuX2R2bS5nZXRTZWxlY3RlZFZpZXcoKS5tYWluQ2hhcnQuZ2V0U2VsZWN0ZWRUaW1lVW5pdCgpO1xuXHRcdFx0XHRsZXQgdXBkYXRhYmxlVmlld3MgPSB0aGlzLl9kdm0uZ2V0VXBkYXRhYmxlVmlld3NGb3JDaGFydChmaWx0ZXIsIHRpbWVVbml0KTtcblxuXHRcdFx0XHQvLyBVcGRhdGUgY2hhcnQgZGF0YVxuXHRcdFx0XHR0aGlzLl9tbS51cGRhdGVDaGFydChjaGFydERhdGEsIHVwZGF0YWJsZVZpZXdzLCByYW5nZSwgZmlsdGVyLCB0aW1lVW5pdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhLmNvbnRhaW5zS2V5KCd0YWJsZScpKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGFibGVEYXRhID0gZGF0YS5nZXRTRlNPYmplY3QoJ3RhYmxlJyk7XG5cdFx0XHRcdHRoaXMuX21tLnVwZGF0ZVRhYmxlKHRhYmxlRGF0YS5nZXRTRlNBcnJheSgnZGF0YScpLCB0YWJsZURhdGEuZ2V0VXRmU3RyaW5nKCd2aWV3SWQnKSwgcmFuZ2UsIGZpbHRlcik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERpc3BsYXkgdXBkYXRlZCBtZXRyaWNzXG5cdFx0XHR0aGlzLl9kdm0udXBkYXRlVmlldyh0aGlzLl9kcm0uZ2V0U2VsZWN0ZWRSYW5nZSgpLCBmaWx0ZXIsIHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIFN0YXRzIGRhdGEgcmV0cmlldmFsIGNvbXBsZXRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0RBVEFfQ09NUExFVEUpXG5cdFx0e1xuXHRcdFx0dGhpcy5fZGF0YVJlcXVlc3RDbnQgLT0gMTtcblxuXHRcdFx0aWYgKHRoaXMuX2RhdGFSZXF1ZXN0Q250IDw9IDApXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGVsYXBzZWQgPSAnTGFzdCBxdWVyeTogJyArIERhdGVIZWxwZXIuZm9ybWF0VGltZU1zKGRhdGEuZ2V0TG9uZygnZWxhcHNlZCcpKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IGFsbCBtZXRyaWNzXG5cdFx0XHRcdC8vIFRoaXMgaXMgcmVxdWlyZWQgaW4gY2FzZSBzb21lIG1ldHJpY3Mgd2VyZSBub3QgbG9hZGVkIGR1ZSB0byB1c2VyIGludGVycnVwdGlvblxuXHRcdFx0XHR0aGlzLl9kdm0udXBkYXRlVmlldyh0aGlzLl9kcm0uZ2V0U2VsZWN0ZWRSYW5nZSgpLCB0aGlzLl9nZXREYXRhRmlsdGVyKCksIGZhbHNlLCB0cnVlKTtcblxuXHRcdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZShlbGFwc2VkKTtcblxuXHRcdFx0XHR0aGlzLl9kYXRhUmVxdWVzdENudCA9IDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gZWxzZSBpZlxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gVUkgRVZFTlQgTElTVEVORVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X29uUmVmcmVzaEluaXRCdENsaWNrKClcblx0e1xuXHRcdHRoaXMuX3N3aXRjaFZpZXcodGhpcy5WSUVXX0lOSVRfV0FJVCk7XG5cblx0XHQvLyBSZXF1ZXN0IGluaXRpYWxpemF0aW9uIGRhdGFcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOSVQpO1xuXHR9XG5cblx0X29uSW5pdFN0YXJ0TG9nQW5hbHlzaXNCdENsaWNrKClcblx0e1xuXHRcdHRoaXMuX3N0YXJ0TG9nQW5hbHlzaXModHJ1ZSk7XG5cdH1cblxuXHRfb25SZWZyZXNoRGF0YUJ0Q2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fcmVxdWVzdFN0YXRzRGF0YSgpO1xuXHR9XG5cblx0X29uU2hvd0NvbmZpZ1JhbmdlTW9kYWxCdENsaWNrKClcblx0e1xuXHRcdC8vIFNob3cgZGF0YSByYW5nZSBjb25maWd1cmF0aW9uIG1vZGFsXG5cdFx0JCgnI2FubC1kYXRhUmFuZ2VNb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG5cdH1cblxuXHRfb25TdG9wQnRDbGljaygpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGJ1dHRvblxuXHRcdCQoJyNhbmwtc3RvcEJ0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblxuXHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOVEVSUlVQVCk7XG5cdH1cblxuXHRfb25TaG93TG9nQW5hbHlzaXNNb2RhbEJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gU2hvdyBsb2cgYW5hbHlzaXMgbW9kYWxcblx0XHQkKCcjYW5sLWxvZ0FuYWx5c2lzTW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuXHR9XG5cblx0X29uU3RhcnRMb2dBbmFseXNpc0J0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gU2hvdyBjb25maXJtIHdhcm5pbmcgaWYgZGF0YSByZWJ1aWxkIGlzIHJlcXVlc3RlZFxuXHRcdGlmICgkKCcjYW5sLXJlYnVpbGREYXRhQ2InKS5wcm9wKCdjaGVja2VkJykpXG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZWJ1aWxkIHRoZSBmdWxsIHN0YXRzIGRhdGFiYXNlPyBUaGlzIGFjdGlvbiBjYW4gdGFrZSBhIGxvbmcgdGltZS4nLCAkLnByb3h5KHRoaXMuX29uU3RhcnRMb2dBbmFseXNpc0NvbmZpcm0sIHRoaXMpKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLl9zdGFydExvZ0FuYWx5c2lzKGZhbHNlKTtcblx0fVxuXG5cdF9vblN0YXJ0TG9nQW5hbHlzaXNDb25maXJtKClcblx0e1xuXHRcdC8vIFN0YXJ0IGxvZyBhbmFseXNpcyB3aXRoIGRhdGEgcmVidWlsZFxuXHRcdHRoaXMuX3N0YXJ0TG9nQW5hbHlzaXModHJ1ZSk7XG5cdH1cblxuXHRfb25TZXREYXRhUmFuZ2VCdENsaWNrKClcblx0e1xuXHRcdC8vIEhpZGUgbW9kYWxcblx0XHQkKCcjYW5sLWRhdGFSYW5nZU1vZGFsJykubW9kYWwoJ2hpZGUnKTtcblxuXHRcdC8vIFNldCBhdmFpbGFibGUgdGltZSB1bml0cyBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgZGF0YSByYW5nZVxuXHRcdHRoaXMuX2R2bS5zZXRBdmFpbGFibGVDaGFydFRpbWVVbml0KHRoaXMuX2RybS5nZXRSYW5nZUxlbmd0aCgpKTtcblxuXHRcdC8vIFJlcXVlc3Qgc3RhdHMgZGF0YVxuXHRcdHRoaXMuX3JlcXVlc3RTdGF0c0RhdGEoKTtcblx0fVxuXG5cdF9vblRpbWVVbml0Q2hhbmdlKClcblx0e1xuXHRcdC8vIFJlcXVlc3QgZGF0YVxuXHRcdHRoaXMuX3JlcXVlc3RTdGF0c0RhdGEodHJ1ZSk7XG5cdH1cblxuXHRfb25DaGFydE1ldHJpY0NoYW5nZSgpXG5cdHtcblx0XHQvLyBSZXF1ZXN0IGRhdGFcblx0XHR0aGlzLl9yZXF1ZXN0U3RhdHNEYXRhKHRydWUpO1xuXHR9XG5cblx0X29uVmlld0NoYW5nZSgpXG5cdHtcblx0XHQvLyBEbyBub3QgZGlzcGxheSBjZXJ0YWluIHZpZXcgZGF0YSBpZiB2ZXJzaW9uIGlzIEJBU0lDXG5cdFx0aWYgKCF0aGlzLl9pc1ZhbGlkVmVyc2lvbigpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gRGlzcGxheSBjdXJyZW50IG1ldHJpYyBkYXRhXG5cdFx0dGhpcy5fZHZtLnVwZGF0ZVZpZXcodGhpcy5fZHJtLmdldFNlbGVjdGVkUmFuZ2UoKSwgdGhpcy5fZ2V0RGF0YUZpbHRlcigpLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHQvLyBSZXF1ZXN0IGRhdGFcblx0XHR0aGlzLl9yZXF1ZXN0U3RhdHNEYXRhKCk7XG5cdH1cblxuXHRfb25EYXRhRmlsdGVyU2V0KGUpXG5cdHtcblx0XHQvLyBTZXQgZmlsdGVyIG9uIHZpZXdcblx0XHR0aGlzLl9kdm0uc2V0RmlsdGVyT25TZWxlY3RlZFZpZXcoZS5kZXRhaWwsIHRoaXMuX2RybS5nZXRTZWxlY3RlZFJhbmdlKCkpO1xuXG5cdFx0Ly8gUmVxdWVzdCBkYXRhXG5cdFx0dGhpcy5fcmVxdWVzdFN0YXRzRGF0YSgpO1xuXHR9XG5cblx0X29uV2luZG93UmVzaXplKClcblx0e1xuXHRcdC8vIFdlIGhhdmUgdG8gcmVzaXplIHRoZSBjdXN0b20gc3ViLXZpZXdzICh0YWJsZXMsIGNoYXJ0cykgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdmlld1xuXHRcdGNvbnN0IHNlbFZpZXcgPSB0aGlzLl9kdm0uZ2V0U2VsZWN0ZWRWaWV3KCk7XG5cblx0XHQkKHNlbFZpZXcpLmZpbmQoJy50YWItcGFuZS5hY3RpdmUnKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoJCh0aGlzKVswXS5yZWZyZXNoT25XaW5kb3dSZXNpemUpXG5cdFx0XHRcdCQodGhpcylbMF0ucmVmcmVzaE9uV2luZG93UmVzaXplKCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfc3dpdGNoVmlldyh2aWV3SWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW5sLXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfdG9EYXRhRGlzcGxheVZpZXcoKVxuXHR7XG5cdFx0dGhpcy5fc3dpdGNoVmlldyh0aGlzLlZJRVdfREFUQSk7XG5cdFx0JCgnI2FubC10YWJOYXZpZ2F0b3IgI3RhYnMnKS5zY3JvbGxpbmdUYWJzKCdyZWZyZXNoJyk7XG5cdH1cblxuXHRfaW5pdGlhbGl6ZSgpXG5cdHtcblx0XHR0aGlzLl9kYXRhUmVxdWVzdENudCA9IDA7XG5cblx0XHQvLyBTZXQgZGVmYXVsdCBkYXRhIHJhbmdlXG5cdFx0dGhpcy5fZHJtID0gbmV3IERhdGFSYW5nZU1hbmFnZXIoJCgnI2FubC1kYXRhUmFuZ2VNb2RhbCcpLCAkKCcjYW5sLWRhdGFSYW5nZScpKTtcblx0XHR0aGlzLl9kcm0uc2V0RGVmYXVsdFJhbmdlKCk7XG5cdFx0dGhpcy5fZHJtLnNldFByZWRlZmluZWRSYW5nZSgnWWVzdGVyZGF5Jyk7XG5cblx0XHQvLy0tLS0tLS0gVEVTVCAtLS0tLS0tXG5cdFx0Ly8gbGV0IHRlbXAgPSBuZXcgU3RhdHNEYXRhUmFuZ2UoKTtcblx0XHQvLyB0ZW1wLm1haW5Gcm9tID0gbW9tZW50KG5ldyBEYXRlKDE1NzI1NjI4MDAwMDApKTtcblx0XHQvLyB0ZW1wLm1haW5UbyA9IG1vbWVudChuZXcgRGF0ZSgxNTg3NTAyODAwMDAwKSk7XG5cdFx0Ly8gdGhpcy5fZHJtLnNldE5ld1JhbmdlKHRlbXApO1xuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdHRoaXMuX2Rpc3BsYXlEYXRhUmFuZ2UoKTtcblxuXHRcdC8vIFNldHVwIG1ldHJpY3Ncblx0XHR0aGlzLl9tbSA9IG5ldyBNZXRyaWNzTWFuYWdlcigpO1xuXG5cdFx0Ly8gU2V0dXAgdmlld1xuXHRcdHRoaXMuX2R2bSA9IG5ldyBWaWV3TWFuYWdlcih0aGlzLCAkKCcjYW5sLXRhYk5hdmlnYXRvciAjdGFiUGFuZWxzJyksIHRoaXMuX21tKTtcblx0XHR0aGlzLl9kdm0uaW5pdGlhbGl6ZSgpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gU2V0IGF2YWlsYWJsZSB0aW1lIHVuaXRzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBkYXRhIHJhbmdlXG5cdFx0dGhpcy5fZHZtLnNldEF2YWlsYWJsZUNoYXJ0VGltZVVuaXQodGhpcy5fZHJtLmdldFJhbmdlTGVuZ3RoKCkpO1xuXG5cdFx0Ly8gQWRkIGN1c3RvbSBldmVudCBsaXN0ZW5lcnNcblx0XHQkKCdhbmFseXRpY3MtZGF0YS12aWV3Jykub24oJ3RpbWUtdW5pdC1jaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uVGltZVVuaXRDaGFuZ2UsIHRoaXMpKTtcblx0XHQkKCdhbmFseXRpY3MtZGF0YS12aWV3Jykub24oJ2NoYXJ0LW1ldHJpYy1jaGFuZ2UnLCAkLnByb3h5KHRoaXMuX29uQ2hhcnRNZXRyaWNDaGFuZ2UsIHRoaXMpKTtcblxuXHRcdC8vIFJlcXVlc3QgaW5pdGlhbGl6YXRpb24gZGF0YSB0byBzZXJ2ZXJcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0lOSVQpO1xuXHR9XG5cblx0X2NvbmZpZ3VyZSh2ZXJzaW9uKVxuXHR7XG5cdFx0aWYgKHZlcnNpb24gIT0gdGhpcy5WRVJTSU9OX0JBU0lDICYmIHZlcnNpb24gIT0gdGhpcy5WRVJTSU9OX1BSTylcblx0XHRcdHZlcnNpb24gPSB0aGlzLlZFUlNJT05fREVNTztcblxuXHRcdHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuXG5cdFx0Ly8gVXBkYXRlIG1vZHVsZSB0aXRsZVxuXHRcdHRoaXMuX3NoZWxsQ3RybC51cGRhdGVNb2R1bGVUaXRsZSgnICcgKyB2ZXJzaW9uLnRvVXBwZXJDYXNlKCksIHRydWUpO1xuXG5cdFx0aWYgKHZlcnNpb24gPT0gdGhpcy5WRVJTSU9OX0RFTU8pXG5cdFx0e1xuXHRcdFx0Ly8gQ29uZmlndXJlIERFTU8gdmVyc2lvblxuXHRcdFx0Ly8gQWxsIGZlYXR1cmVzIGFyZSBlbmFibGVkLCBidXQgdGhlIHNlcnZlciBsaW1pdHMgdGhlIGRhdGEgcmFuZ2UgdG8gdGhlIGxhc3QgMyBkYXlzXG5cdFx0XHQvLyBhbmQgdGhlIGNvbXBhcmUgc2hpZnQgdG8gLTEgb25seVxuXG5cdFx0XHQvLyBTaG93L2hpZGUgdGhlIGxpY2Vuc2UgcHVyY2hhc2UgbGluayBib3hcblx0XHRcdCQoJyNhbmwtbGljZW5zZUFsZXJ0Jykuc2hvdygpO1xuXG5cdFx0XHQvLyBEaXNhYmxlIGNvbXBhcmUgc2hpZnRcblx0XHRcdHRoaXMuX2RybS5kaXNhYmxlU2hpZnRGb3JEZW1vKCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHZlcnNpb24gPT0gdGhpcy5WRVJTSU9OX0JBU0lDKVxuXHRcdHtcblx0XHRcdC8vIENvbmZpZ3VyZSBCQVNJQyB2ZXJzaW9uXG5cdFx0XHQvLyBUaGUgc2VydmVyIG9ubHkgYWxsb3dzIFpvbmUgZmlsdGVyIHRvIGJlIGFwcGxpZWQsIGFuZCBBcHBsaWNhdGlvbiB0YWJsZSBkYXRhIHRvIGJlIHJldHJpZXZlZDtcblx0XHRcdC8vIGluIG90aGVyIHdvcmRzIERlbW9ncmFwaGljcyBhbmQgVGVjaG5vbG9neSB2aWV3cyBhcmUgbm90IG5lZWRlZFxuXHRcdFx0Ly8gQWxzbyBubyBjb21wYXJpc29uIGlzIGF2YWlsYWJsZVxuXG5cdFx0XHQvLyBEYXRhIGNvbXBhcmlzb24gbm90IGF2YWlsYWJsZVxuXHRcdFx0dGhpcy5fZHJtLmRpc2FibGVDb21wYXJlRm9yQmFzaWMoKTtcblxuXHRcdFx0Ly8gSGlkZSBEZW1vZ3JhcGhpY3MgYW5kIFRlY2hub2xvZ3kgdGFicyBkZWZhdWx0IGNvbnRlbnRcblx0XHRcdCQoJyNhbmwtZGF0YXZpZXctZGVtb2dyYXBoaWNzJykuaGlkZSgpO1xuXHRcdFx0JCgnI2FubC1kYXRhdmlldy10ZWNobm9sb2d5JykuaGlkZSgpO1xuXG5cdFx0XHQvLyBTaG93IGFkdiBpbiBEZW1vZ3JhcGhpY3MgYW5kIFRlY2hub2xvZ3kgdGFic1xuXHRcdFx0dGhpcy5xdWVyeVNlbGVjdG9yKCcjYW5sLWRlbW9ncmFwaGljcycpLmFwcGVuZENoaWxkKCBuZXcgRGVtb2dyYXBoaWNzUHJvQWR2KCkgKTtcblx0XHRcdHRoaXMucXVlcnlTZWxlY3RvcignI2FubC10ZWNobm9sb2d5JykuYXBwZW5kQ2hpbGQoIG5ldyBUZWNobm9sb2d5UHJvQWR2KCkgKTtcblx0XHRcdC8qXG5cdFx0XHRnZXRWaWV3KCkudGFiX2RlbW9ncmFwaGljcy52Yl9hZHYuYWRkQ2hpbGQobmV3IERlbW9ncmFwaGljc1Byb0FkdigpKTtcblx0XHRcdGdldFZpZXcoKS50YWJfZGVtb2dyYXBoaWNzLnNlbGVjdGVkSW5kZXggPSAxO1xuXG5cdFx0XHRnZXRWaWV3KCkudGFiX3RlY2hub2xvZ3kudmJfYWR2LmFkZENoaWxkKG5ldyBUZWNobm9sb2d5UHJvQWR2KCkpO1xuXHRcdFx0Z2V0VmlldygpLnRhYl90ZWNobm9sb2d5LnNlbGVjdGVkSW5kZXggPSAxO1xuXHRcdFx0Ki9cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIENvbmZpZ3VyZSBQUk8gdmVyc2lvblxuXHRcdFx0Ly8gQWxsIGZlYXR1cmVzIGF2YWlsYWJsZVxuXHRcdH1cblx0fVxuXG5cdF9pc1ZhbGlkVmVyc2lvbigpXG5cdHtcblx0XHQvLyBEbyBub3QgZGlzcGxheSBkYXRhIGZvciBEZW1vZ3JhcGhpY3MgYW5kIFRlY2hub2xvZ3kgdmlld3MgaWYgdmVyc2lvbiBpcyBCQVNJQ1xuXHRcdGlmICh0aGlzLl92ZXJzaW9uID09IHRoaXMuVkVSU0lPTl9CQVNJQylcblx0XHR7XG5cdFx0XHRjb25zdCB2aWV3SWQgPSB0aGlzLl9kdm0uZ2V0U2VsZWN0ZWRWaWV3SWQoKTtcblxuXHRcdFx0aWYgKHZpZXdJZCA9PSBWaWV3TWFuYWdlci5ERU1PR1JBUEhJQ1MgfHwgdmlld0lkID09IFZpZXdNYW5hZ2VyLlRFQ0hOT0xPR1kpXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF91cGRhdGVMb2dBbmFseXNpc0luZm8oaW5mbylcblx0e1xuXHRcdC8vIExhc3QgcHJvY2Vzc2VkIGxvZyBlbnRyeSB0aW1lc3RhbXBcblx0XHRjb25zdCBsYXN0ID0gaW5mby5nZXRVdGZTdHJpbmcoJ2xhc3QnKTtcblxuXHRcdGlmIChsYXN0ICE9ICcnKVxuXHRcdHtcblx0XHRcdGxldCBkYXRlQXJyID0gbGFzdC5zcGxpdCgnLicpO1xuXHRcdFx0bGV0IHNlcnZlckRhdGUgPSBEYXRlSGVscGVyLmdldERhdGVGcm9tVHJhbnNmZXJTdHJpbmcoZGF0ZUFyclswXSk7XG5cdFx0XHQkKCcjYW5sLWxhdGVzdEVudHJ5RGF0ZUxiJykudGV4dChzZXJ2ZXJEYXRlLmZvcm1hdCgnREQgTU1NIFlZWVkgSEg6bW06c3MnKSArICcuJyArIGRhdGVBcnJbMV0pO1xuXHRcdFx0JCgnI2FubC1sYXRlc3RFbnRyeU5vdGljZScpLnNob3coKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdCQoJyNhbmwtbGF0ZXN0RW50cnlEYXRlTGInKS50ZXh0KCcnKTtcblx0XHRcdCQoJyNhbmwtbGF0ZXN0RW50cnlOb3RpY2UnKS5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gR2VvbG9jYXRpb24gZW5hYmxlZCBmbGFnXG5cdFx0aWYgKGluZm8uZ2V0Qm9vbCgnZ2VvJykpXG5cdFx0XHQkKCcjYW5sLWdlb2xvY0Rpc2FibGVkQWxlcnQnKS5oaWRlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0JCgnI2FubC1nZW9sb2NEaXNhYmxlZEFsZXJ0Jykuc2hvdygpO1xuXHR9XG5cblx0X2dldERhdGFGaWx0ZXIoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2R2bS5nZXRTZWxlY3RlZFZpZXcoKS5maWx0ZXI7XG5cdH1cblxuXHRfcmVxdWVzdFN0YXRzRGF0YShjaGFydE9ubHkgPSBmYWxzZSlcblx0e1xuXHRcdC8vIERvIG5vdCBkaXNwbGF5IGNlcnRhaW4gdmlldyBkYXRhIGlmIHZlcnNpb24gaXMgQkFTSUNcblx0XHRpZiAoIXRoaXMuX2lzVmFsaWRWZXJzaW9uKCkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHQvLyBLZWVwIGEgY291bnRlciBvZiB0aGUgZXhwZWN0ZWQgcHJvZ3Jlc3MgdXBkYXRlc1xuXHRcdGxldCB1cGRhdGVzID0gMDtcblxuXHRcdC8vIFRoZSByZXF1ZXN0IG11c3QgdGFrZSBpbnRvIGFjY291bnQ6XG5cdFx0Ly8gLSBzZWxlY3RlZCBkYXRlcyByYW5nZVxuXHRcdC8vIC0gY2hhcnQgbWV0cmljIGFuZCBzZWxlY3RlZCB0aW1lIHVuaXRcblx0XHQvLyAtIHNlbGVjdGVkIHZpZXcgYW5kIGl0cyBtZXRyaWNzXG5cdFx0Ly8gLSBmaWx0ZXIsIGZvciBib3RoIGNoYXJ0IGFuZCB2aWV3IChpLmUuIHpvbmUgb3IgY291bnRyeSwgZXRjKVxuXG5cdFx0Ly8gQnVpbGQgcmVxdWVzdCBwYXJhbWV0ZXJzXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblxuXHRcdC8vIERhdGVzIHJhbmdlXG5cdFx0Y29uc3QgcmFuZ2UgPSB0aGlzLl9kcm0uZ2V0U2VsZWN0ZWRSYW5nZSgpO1xuXHRcdHBhcmFtcy5wdXRTRlNPYmplY3QoJ3JhbmdlJywgcmFuZ2UudG9TRlNPYmplY3QoKSk7XG5cblx0XHQvLyBTZWxlY3RlZCB2aWV3XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuX2R2bS5nZXRTZWxlY3RlZFZpZXcoKTtcblx0XHRjb25zdCB2aWV3SWQgPSB2aWV3LnZpZXdJZDtcblxuXHRcdC8vIEZpbHRlclxuXHRcdGNvbnN0IGZpbHRlciA9IHRoaXMuX2dldERhdGFGaWx0ZXIoKTtcblx0XHRpZiAoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLnZhbHVlICE9IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0U0ZTT2JqZWN0KCdmaWx0ZXInLCBmaWx0ZXIudG9TRlNPYmplY3QoKSk7XG5cblx0XHQvLyBDSEFSVFxuXG5cdFx0aWYgKHZpZXcubWFpbkNoYXJ0LmdldFNlbGVjdGVkTWV0cmljSWQoKSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGNvbnN0IHRpbWVVbml0ID0gdmlldy5tYWluQ2hhcnQuZ2V0U2VsZWN0ZWRUaW1lVW5pdCgpO1xuXHRcdFx0Y29uc3QgY2hhcnRJZCA9IHZpZXcubWFpbkNoYXJ0LmdldFNlbGVjdGVkTWV0cmljSWQoKTtcblxuXHRcdFx0Y29uc3QgY2RjID0gdGhpcy5fbW0uZ2V0Q2hhcnREYXRhQ29udGFpbmVyKHZpZXdJZCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIG1haW4vY29tcGFyZSBjaGFydHMgbXVzdCBiZSByZXF1ZXN0ZWRcblx0XHRcdGNvbnN0IHJlcU1haW4gPSBjZGMuaXNNYWluQ2hhcnRPdXRkYXRlZChjaGFydElkLCByYW5nZS5tYWluRnJvbSwgcmFuZ2UubWFpblRvLCBmaWx0ZXIsIHRpbWVVbml0KTtcblx0XHRcdGNvbnN0IHJlcUNvbXAgPSAocmFuZ2UuZG9Db21wYXJlID8gY2RjLmlzQ29tcGFyZUNoYXJ0T3V0ZGF0ZWQoY2hhcnRJZCwgcmFuZ2UuY29tcGFyZUZyb20sIHJhbmdlLmNvbXBhcmVUbywgZmlsdGVyLCB0aW1lVW5pdCkgOiBmYWxzZSk7XG5cblx0XHRcdGlmIChyZXFNYWluIHx8IHJlcUNvbXApXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXFDaGFydHMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cblx0XHRcdFx0cmVxQ2hhcnRzLnB1dFV0ZlN0cmluZygnaWQnLCBjaGFydElkKTtcblx0XHRcdFx0cmVxQ2hhcnRzLnB1dEJvb2woJ21haW4nLCByZXFNYWluKTtcblx0XHRcdFx0cmVxQ2hhcnRzLnB1dEJvb2woJ2NvbXAnLCByZXFDb21wKTtcblx0XHRcdFx0cmVxQ2hhcnRzLnB1dFV0ZlN0cmluZygndW5pdCcsIHRpbWVVbml0KTtcblxuXHRcdFx0XHRwYXJhbXMucHV0U0ZTT2JqZWN0KCdjaGFydCcsIHJlcUNoYXJ0cyk7XG5cdFx0XHRcdHVwZGF0ZXMgKz0gKHJlcU1haW4gJiYgcmVxQ29tcCA/IDIgOiAxKTtcblxuXHRcdFx0XHQvLyBTZXQgbG9hZGluZyBzdGF0ZVxuXHRcdFx0XHR2aWV3Lm1haW5DaGFydC5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghY2hhcnRPbmx5KVxuXHRcdHtcblx0XHRcdC8vIE1FVFJJQ1MgTElTVFxuXG5cdFx0XHRsZXQgcmVxTWV0cmljcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdGNvbnN0IG1kYyA9IHRoaXMuX21tLmdldE1ldHJpY0RhdGFDb250YWluZXIodmlld0lkKTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtZGMubWV0cmljSWRzLmxlbmd0aDsgaSsrKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBtZXRyaWNJZCA9IG1kYy5tZXRyaWNJZHNbaV07XG5cdFx0XHRcdGNvbnN0IGJhc2VNZXRyaWMgPSB0aGlzLl9tbS5nZXRCYXNlTWV0cmljKHZpZXdJZCwgbWV0cmljSWQpO1xuXG5cdFx0XHRcdGlmIChiYXNlTWV0cmljICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBDaGVjayBpZiBtZXRyaWMgdmFsdWVzIG11c3QgYmUgcmVxdWVzdGVkXG5cdFx0XHRcdFx0bGV0IG1pc3NpbmcgPSBtZGMuZ2V0TWV0cmljTWlzc2luZ1ZhbHVlRmxhZ3MobWV0cmljSWQsIHJhbmdlLCBmaWx0ZXIpO1xuXHRcdFx0XHRcdGxldCBtaXNzaW5nQ250ID0gMDtcblxuXHRcdFx0XHRcdC8vIENvdW50IG1pc3NpbmcgdmFsdWVzXG5cdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBtaXNzaW5nLmxlbmd0aDsgaisrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChtaXNzaW5nW2pdKVxuXHRcdFx0XHRcdFx0XHRtaXNzaW5nQ250Kys7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG1pc3NpbmdDbnQgPiAwKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICghYmFzZU1ldHJpYy5pc1N1Yk1ldHJpYykgLy8gTm8gbmVlZCB0byByZXF1ZXN0IHN1Ym1ldHJpY3MgYXMgdGhleSB3aWxsIGJlIGV2YWx1YXRlZCB3aGVuIG90aGVyIG1ldHJpY3MgYXJlIHJlY2VpdmVkXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHVwZGF0ZXMgKz0gbWlzc2luZ0NudDtcblx0XHRcdFx0XHRcdFx0cmVxTWV0cmljcy5wdXRCb29sQXJyYXkobWV0cmljSWQsIG1pc3NpbmcpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBTZXQgbWV0cmljIGl0ZW0gdmlldyB0byBsb2FkaW5nIHN0YXRlXG5cdFx0XHRcdFx0XHR2aWV3LnNldE1ldHJpY0l0ZW1TdGF0ZShiYXNlTWV0cmljLmlkLCBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORyk7XG5cblx0XHRcdFx0XHRcdC8vIFNldCBvdGhlciB2aWV3IGl0ZW1zIHRvIGxvYWRpbmcgc3RhdGVcblxuXHRcdFx0XHRcdFx0Ly8gR2xvYmFsIHZpc2l0cyAlXG5cdFx0XHRcdFx0XHRpZiAobWV0cmljSWQgPT0gTWV0cmljc01hbmFnZXIuVklTSVRTKVxuXHRcdFx0XHRcdFx0XHR2aWV3LnRpbnlWaXNpdHNDaGFydC5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HO1xuXG5cdFx0XHRcdFx0XHQvLyBPdmVydmlldydzIHZpc2l0cyBwaWUgY2hhcnRcblx0XHRcdFx0XHRcdGlmIChtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5QRVJDX05FV19WSVNJVE9SUyB8fFxuXHRcdFx0XHRcdFx0XHRtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5QRVJDX1JFVF9WSVNJVE9SUyB8fFxuXHRcdFx0XHRcdFx0XHRtZXRyaWNJZCA9PSBNZXRyaWNzTWFuYWdlci5ORVdfVklTSVRPUlNfVklTSVRTIHx8XG5cdFx0XHRcdFx0XHRcdG1ldHJpY0lkID09IE1ldHJpY3NNYW5hZ2VyLlJFVF9WSVNJVE9SU19WSVNJVFMpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHZpZXcuc2V0VmlzaXRvcnNQaWVDaGFydHNTdGF0ZShNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHBhcmFtcy5wdXRTRlNPYmplY3QoJ21ldHJpY3MnLCByZXFNZXRyaWNzKTtcblxuXHRcdFx0Ly8gQ1VSUkVOVCBWSUVXJ1MgVEFCTEUgREFUQVxuXHRcdFx0Y29uc3QgdGFibGVEYXRhID0gdGhpcy5fbW0uZ2V0VGFibGVEYXRhKHZpZXdJZCk7XG5cblx0XHRcdGlmICh0YWJsZURhdGEgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgbWFpbiByYW5nZSBjaGFuZ2VkIChpZiBub3QsIG5vIG5lZWQgdG8gbG9hZCBkYXRhKVxuXHRcdFx0XHRpZiAoIXRhYmxlRGF0YS5pc0RhdGFVcGRhdGVkKHJhbmdlLm1haW5Gcm9tLCByYW5nZS5tYWluVG8pKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygndGFibGUnLCB2aWV3SWQpO1xuXHRcdFx0XHRcdHVwZGF0ZXMgKz0gMTtcblxuXHRcdFx0XHRcdC8vIFNldCB0YWJsZSBkYXRhIGxvYWRpbmcgc3RhdGVcblx0XHRcdFx0XHRjb25zdCB0YWJsZVZpZXcgPSB0aGlzLl9kdm0uZ2V0VGFibGVTdWJWaWV3KCk7XG5cdFx0XHRcdFx0aWYgKHRhYmxlVmlldyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGFibGVWaWV3LnN0YXRlID0gTWV0cmljRGlzcGxheVN0YXRlLkxPQURJTkc7XG5cblx0XHRcdFx0XHQvLyBTZXQgdGFibGUgZGF0YSBjaGFydCBsb2FkaW5nIHN0YXRlXG5cdFx0XHRcdFx0Y29uc3QgY2hhcnRWaWV3ID0gdGhpcy5fZHZtLmdldENoYXJ0U3ViVmlldygpO1xuXHRcdFx0XHRcdGlmIChjaGFydFZpZXcgIT0gbnVsbClcblx0XHRcdFx0XHRcdGNoYXJ0Vmlldy5zdGF0ZSA9IE1ldHJpY0Rpc3BsYXlTdGF0ZS5MT0FESU5HO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHRhYmxlIG1hcCBjaGFydCBsb2FkaW5nIHN0YXRlXG5cdFx0XHRcdFx0Y29uc3QgbWFwVmlldyA9IHRoaXMuX2R2bS5nZXRNYXBTdWJWaWV3KCk7XG5cdFx0XHRcdFx0aWYgKG1hcFZpZXcgIT0gbnVsbClcblx0XHRcdFx0XHRcdG1hcFZpZXcuc3RhdGUgPSBNZXRyaWNEaXNwbGF5U3RhdGUuTE9BRElORztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIERpc2FibGUgaW50ZXJmYWNlXG5cdFx0dGhpcy5fZGlzYWJsZUludGVyZmFjZSh1cGRhdGVzKTtcblxuXHRcdHRoaXMuX2RhdGFSZXF1ZXN0Q250ICs9IDE7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfREFUQSwgcGFyYW1zKTtcblx0fVxuXG5cdF9kaXNhYmxlSW50ZXJmYWNlKGV4cGVjdGVkUHJvZ3Jlc3NVcGRhdGVzKVxuXHR7XG5cdFx0JCgnI2FubC1yZWZyZXNoQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdCQoJyNhbmwtY29uZmlnUmFuZ2VCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0JCgnI2FubC1hbmFseXplTG9nQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXG5cdFx0Ly8gTk9URTogc3RvcCBidXR0b24gaXMgZW5hYmxlZCB3aGVuIHRoZSBkYXRhIHJhbmdlIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBvbmx5XG5cblx0XHQvLyBCbG9jayB0YWIgbmF2aWdhdG9yIGludGVyYWN0aW9uXG5cdFx0JCgnI2FubC10YWJOYXZpZ2F0b3IgYS5uYXYtbGluaycpLm9uKCdjbGljaycsIHRoaXMuX3ByZXZlbnRDbGlja0V2ZW50KTtcblxuXHRcdC8vIFVwZGF0ZSBzZWxlY3RlZCB2aWV3XG5cdFx0dGhpcy5fZHZtLmdldFNlbGVjdGVkVmlldygpLnNldFByb2dyZXNzKHRydWUsIGV4cGVjdGVkUHJvZ3Jlc3NVcGRhdGVzKTtcblx0fVxuXG5cdF9lbmFibGVJbnRlcmZhY2UoZWxhcHNlZCA9ICcnKVxuXHR7XG5cdFx0JCgnI2FubC1yZWZyZXNoQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcblx0XHQkKCcjYW5sLWNvbmZpZ1JhbmdlQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcblx0XHQkKCcjYW5sLXN0b3BCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXHRcdCQoJyNhbmwtYW5hbHl6ZUxvZ0J0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHQvLyBVbmJsb2NrIHRhYiBuYXZpZ2F0b3IgaW50ZXJhY3Rpb25cblx0XHQkKCcjYW5sLXRhYk5hdmlnYXRvciBhLm5hdi1saW5rJykub2ZmKCdjbGljaycsIHRoaXMuX3ByZXZlbnRDbGlja0V2ZW50KTtcblxuXHRcdC8vIFVwZGF0ZSBzZWxlY3RlZCB2aWV3XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuX2R2bS5nZXRTZWxlY3RlZFZpZXcoKTtcblx0XHR2aWV3LnNldEVsYXBzZWQoZWxhcHNlZCk7XG5cdFx0dmlldy5zZXRQcm9ncmVzcyhmYWxzZSk7XG5cdH1cblxuXHRfcHJldmVudENsaWNrRXZlbnQoZSlcblx0e1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9XG5cblx0X2VuYWJsZUxvZ0FuYWx5c2lzQnV0dG9uKGVuYWJsZWQpXG5cdHtcblx0XHQkKCcjYW5sLWluaXRBbmFseXplTG9nQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblx0XHQkKCcjYW5sLXN0YXJ0TG9nQW5hbHlzaXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXHRcdCQoJyNhbmwtcmVidWlsZERhdGFDYicpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXG5cdFx0aWYgKGVuYWJsZWQpXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBzcGlubmluZyB3aGVlbFxuXHRcdFx0JCgnLnVwbG9hZC1zcGlubmVyJykuaGlkZSgpO1xuXG5cdFx0XHQvLyBVbi1jaGVjayByZWJ1aWxkIGRhdGEgY2hlY2tib3hcblx0XHRcdCQoJyNhbmwtcmVidWlsZERhdGFDYicpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvLyBTaG93IHNwaW5uaW5nIHdoZWVsXG5cdFx0XHQkKCcudXBsb2FkLXNwaW5uZXInKS5zaG93KCk7XG5cdFx0fVxuXHR9XG5cblx0X3N0YXJ0TG9nQW5hbHlzaXMocmVidWlsZCA9IHRydWUpXG5cdHtcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdHBhcmFtcy5wdXRCb29sKCdyZWJ1aWxkJywgcmVidWlsZCk7XG5cblx0XHQvLyBFTkFCTEUgRk9SIFRFU1RJTkcgUFVSUE9TRSBPTkxZLCBXSEVOIFBST0NFU1NJTkcgTE9HUyBHRU5FUkFURUQgV0lUSCBBIERJRkZFUkVOVCBMT0NBTEVcblx0XHQvL3BhcmFtcy5wdXRVdGZTdHJpbmcoJ2xvY2FsZScsICdlbicpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9TVEFSVF9MT0dfQU5BTFlTSVMsIHBhcmFtcyk7XG5cblx0XHQvLyBEaXNhYmxlIGJ1dHRvblxuXHRcdHRoaXMuX2VuYWJsZUxvZ0FuYWx5c2lzQnV0dG9uKGZhbHNlKTtcblx0fVxuXG5cdF9kaXNwbGF5RGF0YVJhbmdlKClcblx0e1xuXHRcdCQoJyNhbmwtbWFpblJhbmdlJykudGV4dCh0aGlzLl9kcm0uZ2V0U2VsZWN0ZWRSYW5nZSgpLmdldE1haW5SYW5nZVN0cmluZygpKTtcblx0XHQkKCcjYW5sLWNvbXBhcmVkUmFuZ2UnKS50ZXh0KHRoaXMuX2RybS5nZXRTZWxlY3RlZFJhbmdlKCkuZ2V0Q29tcGFyZVJhbmdlU3RyaW5nKCdDb21wYXJlZCB0bzogJykpO1xuXG5cdFx0aWYgKHRoaXMuX2RybS5nZXRTZWxlY3RlZFJhbmdlKCkubWFpbkZyb20uaG91cnMoKSA+IDAgfHwgdGhpcy5fZHJtLmdldFNlbGVjdGVkUmFuZ2UoKS5tYWluVG8uaG91cnMoKSA8IDIzKVxuXHRcdFx0JCgnI2FubC1ob3VyQWxlcnQnKS5zaG93KCk7XG5cdFx0ZWxzZVxuXHRcdFx0JCgnI2FubC1ob3VyQWxlcnQnKS5oaWRlKCk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDcERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUMzUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDbkxBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDdE1BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDcE9BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDeE5BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNqSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNqUUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNwRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDbkxBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoT0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQy9JQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ2hnQkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ25QQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDN0hBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDM0VBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDdlBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ3ZRQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN4T0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNuY0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNuVEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDdkZBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzlmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3ZIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ2xZQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0EiLCJzb3VyY2VSb290IjoiIn0=