rubyfox-server 2.16.0.3 → 2.17.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rubyfox/server/data/config/admin/admintool.xml +0 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +0 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +0 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +0 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_game.txt +0 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_mmo.txt +0 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +0 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +0 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_zone.txt +0 -0
- data/lib/rubyfox/server/data/config/admin/gmc/gmc.py +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Analytics.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/BanManager.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Console.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Dashboard.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/LogViewer.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ServletManager.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ServletManager.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.svg +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.svg +0 -0
- data/lib/rubyfox/server/data/config/logParser.properties +17 -28
- data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +1 -1
- data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +2 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +2 -2
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.bat +2 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +4 -6
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +6 -1
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +1 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.20.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-compress-1.19.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
- data/lib/rubyfox/server/data/sfs2x-service +294 -159
- data/lib/rubyfox/server/data/sfs2x.sh +1 -1
- data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/_changes-to-default-themes_.txt +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/bootstrap.min.css +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/custom-bootstrap.min.css +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/css/all.min.css +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.eot +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.svg +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.eot +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.svg +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.eot +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.svg +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fonts.css +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/jquery.scrolling-tabs.min.css +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/kendo.custom-bootstrap-v4.css +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/reset.css +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +3 -1
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/data/countries.geo.json +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.otf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.ttf +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff2 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/compare.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsChart.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsCompare.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsFilter.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsMap.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsTable.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyChart.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyCompare.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyFilter.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyTable.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/apple-touch-icon-180x180.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-16x16.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-32x32.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-64x64.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/logo.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +4 -3
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +96 -4
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +9 -11
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +604 -2
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +18 -2
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +19 -2
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-3.bundle.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +10 -12
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +4 -6
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0.bundle.js +0 -0
- 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 +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-1.bundle.js +983 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/bootstrap.min.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery-3.3.1.min.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery.scrolling-tabs.min.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/js.cookie.min.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/kendo.all.min.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/popper.min.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/sfs2x-api-1.7.15.js +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/versions-readme.txt +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/index.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/manifest.json +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/analytics.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/ban-manager.html +6 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/blue-box-monitor.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/console.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/dashboard.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-manager.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/license-manager.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/log-viewer.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/server-configurator.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/servlet-manager.html +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/template.html +5 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html +11 -1
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +8 -0
- data/lib/rubyfox/server/data/zones/BasicExamples.zone.xml +147 -0
- data/lib/rubyfox/server/version.rb +1 -1
- metadata +9 -7
- data/lib/rubyfox/server/data/lib/apache-tomcat/.RELEASE-NOTES.swp +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.15.jar +0 -0
@@ -1,6 +1,475 @@
|
|
1
1
|
/*! (c) gotoAndPlay | All rights reserved */
|
2
2
|
(window["webpackJsonpapplication"] = window["webpackJsonpapplication"] || []).push([["module-12"],{
|
3
3
|
|
4
|
+
/***/ "./src/components/module-specific/words-files-manager.js":
|
5
|
+
/*!***************************************************************!*\
|
6
|
+
!*** ./src/components/module-specific/words-files-manager.js ***!
|
7
|
+
\***************************************************************/
|
8
|
+
/*! exports provided: WordsFilesManager */
|
9
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
10
|
+
|
11
|
+
"use strict";
|
12
|
+
__webpack_require__.r(__webpack_exports__);
|
13
|
+
/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WordsFilesManager", function() { return WordsFilesManager; });
|
14
|
+
/* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/utilities */ "./src/utils/utilities.js");
|
15
|
+
|
16
|
+
|
17
|
+
class WordsFilesManager extends HTMLElement
|
18
|
+
{
|
19
|
+
constructor()
|
20
|
+
{
|
21
|
+
super();
|
22
|
+
|
23
|
+
this.REFRESH_WORDS_FILES_CLICK_EVENT = 'refreshWordsFilesClick';
|
24
|
+
this.EDIT_WORDS_FILE_CLICK_EVENT = 'editWordsFileClick';
|
25
|
+
this.SAVE_WORDS_FILE_CLICK_EVENT = 'saveWordsFileClick';
|
26
|
+
this.REMOVE_WORDS_FILE_CLICK_EVENT = 'removeWordsFileClick';
|
27
|
+
this.ASSIGN_WORDS_FILE_CLICK_EVENT = 'assingWordsFileClick';
|
28
|
+
|
29
|
+
this.CONFIG_FOLDER = 'config/';
|
30
|
+
this.WORDS_FILE_EXT = '.words.txt';
|
31
|
+
|
32
|
+
this._modalHtml = `
|
33
|
+
<div class="modal" id="editModal" tabindex="-1" role="dialog" aria-labelledby="editModalTitle" aria-hidden="true">
|
34
|
+
<div class="modal-dialog modal-dialog-centered" role="document">
|
35
|
+
<div class="modal-content">
|
36
|
+
<div class="modal-header">
|
37
|
+
<h5 class="modal-title text-primary" id="editModalTitle">Word File Editor</h5>
|
38
|
+
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
39
|
+
<span aria-hidden="true">×</span>
|
40
|
+
</button>
|
41
|
+
</div>
|
42
|
+
<div class="modal-body in-flow-invalid-msg">
|
43
|
+
<fieldset id="editFieldset">
|
44
|
+
<div class="form-group">
|
45
|
+
<div class="col-form-label form-label-container">
|
46
|
+
<label for="filename" class="form-label">Filename <i class="fas fa-question-circle text-muted help" title="Name of the words file. The file will be saved in server's <em>config</em> folder."></i></label>
|
47
|
+
</div>
|
48
|
+
<div class="inner-widget">
|
49
|
+
<div class="input-group">
|
50
|
+
<input type="text" id="filename" name="filename" class="form-control k-textbox" autocomplete="off" required data-required-msg="Required" aria-describedby="extension" />
|
51
|
+
<div class="input-group-append">
|
52
|
+
<span class="input-group-text" id="extension">.words.txt</span>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
<span class="k-invalid-msg position-static" data-for="filename"></span>
|
56
|
+
</div>
|
57
|
+
</div>
|
58
|
+
<div class="form-group">
|
59
|
+
<div class="col-form-label form-label-container">
|
60
|
+
<label for="content" class="form-label">Content <i class="fas fa-question-circle text-muted help" title="Enter a word or a valid regular expression per line. See configuration's <em>Words file</em> field description for additional information."></i></label>
|
61
|
+
</div>
|
62
|
+
<div class="inner-widget">
|
63
|
+
<textarea id="content" name="content" class="form-control k-textarea w-100" rows="10"></textarea>
|
64
|
+
<span class="k-invalid-msg position-static" data-for="content"></span>
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
</fieldset>
|
68
|
+
</div>
|
69
|
+
<div class="modal-footer flex-column">
|
70
|
+
<div class="d-flex w-100">
|
71
|
+
<div class="flex-grow-1 text-left">
|
72
|
+
<button id="saveWordFileButton" type="button" class="k-button k-primary"><i class="fas fa-save mr-1"></i>Save word file</button>
|
73
|
+
<i id="saveSpinner" class="fas fa-circle-notch fa-spin text-primary align-middle ml-1"></i>
|
74
|
+
</div>
|
75
|
+
<div class="flex-grow-1 text-right">
|
76
|
+
<button type="button" class="k-button k-secondary" data-dismiss="modal">Cancel</button>
|
77
|
+
</div>
|
78
|
+
</div>
|
79
|
+
</div>
|
80
|
+
</div>
|
81
|
+
</div>
|
82
|
+
</div>
|
83
|
+
`;
|
84
|
+
|
85
|
+
//-------------------------------------------
|
86
|
+
|
87
|
+
$(this).append(`
|
88
|
+
<div class="col-sm-5 col-lg-4 col-form-label form-label-container">
|
89
|
+
<label class="form-label">Available words files <i class="fas fa-question-circle text-muted help" title="The list of words files found in server's <em>config</em> folder. Click on the Assign button to set the <strong>Words file</strong> field to the selected file. Configuration submission is then required to save the new value."></i></label>
|
90
|
+
</div>
|
91
|
+
<div class="inner-widget align-self-center col-sm">
|
92
|
+
<div>
|
93
|
+
<div id="wordsFiles" class="limited-height"></div>
|
94
|
+
<div id="actionButtons" class="mt-2 text-right" disabled>
|
95
|
+
<i id="actionSpinner" class="fas fa-circle-notch fa-spin text-primary align-middle"></i>
|
96
|
+
<button id="refreshButton" type="button" class="k-button k-secondary ml-2" title="Refresh"><i class="fas fa-redo-alt"></i></button>
|
97
|
+
<button id="addButton" type="button" class="k-button k-secondary ml-2" title="Add"><i class="fas fa-plus"></i></button>
|
98
|
+
<button id="editButton" type="button" class="k-button k-secondary ml-2" title="Edit" disabled><i class="fas fa-pen"></i></button>
|
99
|
+
<button id="removeButton" type="button" class="k-button k-secondary ml-2" title="Remove" disabled><i class="fas fa-times"></i></button>
|
100
|
+
<button id="assignButton" type="button" class="k-button k-secondary ml-2" title="Assign" disabled><i class="fas fa-compress-arrows-alt"></i></button>
|
101
|
+
</div>
|
102
|
+
</div>
|
103
|
+
</div>
|
104
|
+
`);
|
105
|
+
|
106
|
+
//-------------------------------------------
|
107
|
+
|
108
|
+
// Initialize grid
|
109
|
+
this._wordsFilesGrid = $('#wordsFiles', $(this)).kendoGrid({
|
110
|
+
resizable: true,
|
111
|
+
selectable: 'row',
|
112
|
+
change: $.proxy(this._onWordsFilesGridSelectionChange, this),
|
113
|
+
columns: [
|
114
|
+
{
|
115
|
+
field: 'name',
|
116
|
+
title: 'Filename',
|
117
|
+
width: 120
|
118
|
+
},
|
119
|
+
{
|
120
|
+
field: 'date',
|
121
|
+
title: 'Date',
|
122
|
+
width: 80
|
123
|
+
},
|
124
|
+
{
|
125
|
+
field: 'size',
|
126
|
+
title: 'Size',
|
127
|
+
width: 80
|
128
|
+
}
|
129
|
+
],
|
130
|
+
noRecords: {
|
131
|
+
template: 'No files.'
|
132
|
+
}
|
133
|
+
}).data('kendoGrid');
|
134
|
+
|
135
|
+
// Add listeners to button clicks
|
136
|
+
$('#refreshButton', $(this)).on('click', $.proxy(this._onReloadClick, this));
|
137
|
+
$('#addButton', $(this)).on('click', $.proxy(this._onAddClick, this));
|
138
|
+
$('#editButton', $(this)).on('click', $.proxy(this._onEditClick, this));
|
139
|
+
$('#removeButton', $(this)).on('click', $.proxy(this._onRemoveClick, this));
|
140
|
+
$('#assignButton', $(this)).on('click', $.proxy(this._onAssignClick, this));
|
141
|
+
}
|
142
|
+
|
143
|
+
destroy()
|
144
|
+
{
|
145
|
+
// Destroy grid
|
146
|
+
this._wordsFilesGrid.destroy();
|
147
|
+
|
148
|
+
// Remove event listeners
|
149
|
+
$('#refreshButton', $(this)).off('click');
|
150
|
+
$('#addButton', $(this)).off('click');
|
151
|
+
$('#editButton', $(this)).off('click');
|
152
|
+
$('#removeButton', $(this)).off('click');
|
153
|
+
$('#assignButton', $(this)).off('click');
|
154
|
+
|
155
|
+
// Hide modal (which in turn destroys it)
|
156
|
+
let modalElement = $('#editModal', $(this));
|
157
|
+
|
158
|
+
if (modalElement)
|
159
|
+
modalElement.modal('hide');
|
160
|
+
}
|
161
|
+
|
162
|
+
get enabled()
|
163
|
+
{
|
164
|
+
return this._isEnabled;
|
165
|
+
}
|
166
|
+
|
167
|
+
set enabled(value)
|
168
|
+
{
|
169
|
+
this._isEnabled = value;
|
170
|
+
|
171
|
+
// Enable/disable buttons
|
172
|
+
$('#actionButtons', this).attr('disabled', !value);
|
173
|
+
|
174
|
+
// Hide spinner
|
175
|
+
if (value)
|
176
|
+
this.actionSpinnerVisible = false;
|
177
|
+
|
178
|
+
// Enable/disable modal
|
179
|
+
let modalElement = $('#editModal', $(this));
|
180
|
+
|
181
|
+
if (modalElement)
|
182
|
+
{
|
183
|
+
// Disable modal close buttons
|
184
|
+
$('button[data-dismiss="modal"]', modalElement).attr('disabled', !value);
|
185
|
+
|
186
|
+
// Disable save button
|
187
|
+
$('#saveWordFileButton', modalElement).attr('disabled', !value);
|
188
|
+
|
189
|
+
// Disable fieldset
|
190
|
+
$('#editFieldset', modalElement).attr('disabled', !value);
|
191
|
+
|
192
|
+
// Hide spinner
|
193
|
+
if (value)
|
194
|
+
this.saveSpinnerVisible = false;
|
195
|
+
}
|
196
|
+
}
|
197
|
+
|
198
|
+
set actionSpinnerVisible(value)
|
199
|
+
{
|
200
|
+
if (value)
|
201
|
+
$('#actionSpinner', $(this)).show();
|
202
|
+
else
|
203
|
+
$('#actionSpinner', $(this)).hide();
|
204
|
+
}
|
205
|
+
|
206
|
+
set saveSpinnerVisible(value)
|
207
|
+
{
|
208
|
+
let modalElement = $('#editModal', $(this));
|
209
|
+
|
210
|
+
if (modalElement)
|
211
|
+
{
|
212
|
+
if (value)
|
213
|
+
$('#saveSpinner', modalElement).show();
|
214
|
+
else
|
215
|
+
$('#saveSpinner', modalElement).hide();
|
216
|
+
}
|
217
|
+
}
|
218
|
+
|
219
|
+
refreshWordsFilesList(wordsFilesList, hideEditModal)
|
220
|
+
{
|
221
|
+
if (hideEditModal)
|
222
|
+
{
|
223
|
+
let modalElement = $('#editModal', $(this));
|
224
|
+
|
225
|
+
if (modalElement)
|
226
|
+
modalElement.modal('hide');
|
227
|
+
}
|
228
|
+
|
229
|
+
let files = [];
|
230
|
+
this._existingFilenames = [];
|
231
|
+
|
232
|
+
for (let f = 0; f < wordsFilesList.size(); f++)
|
233
|
+
{
|
234
|
+
const file = wordsFilesList.getSFSObject(f);
|
235
|
+
|
236
|
+
const fileObj = {};
|
237
|
+
fileObj.name = file.getUtfString('name');
|
238
|
+
fileObj.date = file.getUtfString('date') + ' ' + file.getUtfString('time');
|
239
|
+
fileObj.size = Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_0__["bytesToSize"])(file.getLong('size'), 2);
|
240
|
+
|
241
|
+
// Populate files list
|
242
|
+
files.push(fileObj);
|
243
|
+
|
244
|
+
// Save ref to existing filenames, to check them when a new file is created
|
245
|
+
this._existingFilenames.push(fileObj.name);
|
246
|
+
}
|
247
|
+
|
248
|
+
// Assign data source to grid
|
249
|
+
this._setWordsFilesGridDataSource(files);
|
250
|
+
this._onWordsFilesGridSelectionChange();
|
251
|
+
|
252
|
+
// Enable
|
253
|
+
this.enabled = true;
|
254
|
+
}
|
255
|
+
|
256
|
+
getSelectedWordsFileName()
|
257
|
+
{
|
258
|
+
if (this._wordsFilesGrid.select() != null)
|
259
|
+
{
|
260
|
+
let selectedIndex = this._wordsFilesGrid.select().index();
|
261
|
+
return this._wordsFilesGrid.dataSource.at(selectedIndex).name;
|
262
|
+
}
|
263
|
+
else
|
264
|
+
return null;
|
265
|
+
}
|
266
|
+
|
267
|
+
editWordsFile(filename, content)
|
268
|
+
{
|
269
|
+
this._isNewFile = false;
|
270
|
+
|
271
|
+
this.enabled = true;
|
272
|
+
|
273
|
+
// Show modal
|
274
|
+
this._showModal();
|
275
|
+
|
276
|
+
// Remove default extension from filename
|
277
|
+
filename = filename.substring(0, filename.lastIndexOf(this.WORDS_FILE_EXT));
|
278
|
+
|
279
|
+
// Enter content filename and content in modal form
|
280
|
+
$('#editModal #filename', $(this)).val(filename);
|
281
|
+
$('#editModal #content', $(this)).val(content);
|
282
|
+
|
283
|
+
// Set filename field as not editable and hide note
|
284
|
+
$('#editModal #filename', $(this)).attr('disabled', true);
|
285
|
+
$('#editModal #filenameNote', $(this)).hide();
|
286
|
+
}
|
287
|
+
|
288
|
+
getExistingFilenames()
|
289
|
+
{
|
290
|
+
return this._existingFilenames;
|
291
|
+
}
|
292
|
+
|
293
|
+
_setWordsFilesGridDataSource(ds)
|
294
|
+
{
|
295
|
+
// Read current horizontal scroll value
|
296
|
+
const scrollLeft = $('#wordsFiles .k-grid-content', this._wordsFilesGrid.wrapper).scrollLeft();
|
297
|
+
|
298
|
+
// Assign data source to grid
|
299
|
+
this._wordsFilesGrid.setDataSource(ds);
|
300
|
+
|
301
|
+
// Set horizontal scroll
|
302
|
+
$('#wordsFiles .k-grid-content', this._wordsFilesGrid.wrapper).scrollLeft(scrollLeft);
|
303
|
+
}
|
304
|
+
|
305
|
+
_onWordsFilesGridSelectionChange()
|
306
|
+
{
|
307
|
+
// Enable/disable buttons
|
308
|
+
const selectedRows = this._wordsFilesGrid.select();
|
309
|
+
$('#editButton').attr('disabled', selectedRows.length == 0);
|
310
|
+
$('#removeButton').attr('disabled', selectedRows.length == 0);
|
311
|
+
$('#assignButton').attr('disabled', selectedRows.length == 0);
|
312
|
+
}
|
313
|
+
|
314
|
+
_onReloadClick()
|
315
|
+
{
|
316
|
+
// Fire event to request file content to server
|
317
|
+
let evt = new CustomEvent(this.REFRESH_WORDS_FILES_CLICK_EVENT, {
|
318
|
+
detail: null,
|
319
|
+
bubbles: false,
|
320
|
+
cancelable: false
|
321
|
+
});
|
322
|
+
|
323
|
+
this.dispatchEvent(evt);
|
324
|
+
}
|
325
|
+
|
326
|
+
_onAddClick()
|
327
|
+
{
|
328
|
+
this._isNewFile = true;
|
329
|
+
|
330
|
+
// Show modal
|
331
|
+
this._showModal();
|
332
|
+
}
|
333
|
+
|
334
|
+
_onEditClick()
|
335
|
+
{
|
336
|
+
// Disable buttons
|
337
|
+
this.enabled = false;
|
338
|
+
this.actionSpinnerVisible = true;
|
339
|
+
|
340
|
+
// Fire event to request file content to server
|
341
|
+
let evt = new CustomEvent(this.EDIT_WORDS_FILE_CLICK_EVENT, {
|
342
|
+
detail: this.getSelectedWordsFileName(),
|
343
|
+
bubbles: false,
|
344
|
+
cancelable: false
|
345
|
+
});
|
346
|
+
|
347
|
+
this.dispatchEvent(evt);
|
348
|
+
}
|
349
|
+
|
350
|
+
_onRemoveClick()
|
351
|
+
{
|
352
|
+
// Fire event to request file removal to server
|
353
|
+
let evt = new CustomEvent(this.REMOVE_WORDS_FILE_CLICK_EVENT, {
|
354
|
+
detail: this.getSelectedWordsFileName(),
|
355
|
+
bubbles: false,
|
356
|
+
cancelable: false
|
357
|
+
});
|
358
|
+
|
359
|
+
this.dispatchEvent(evt);
|
360
|
+
}
|
361
|
+
|
362
|
+
_onAssignClick()
|
363
|
+
{
|
364
|
+
// Fire event to substitute path in configuration
|
365
|
+
let evt = new CustomEvent(this.ASSIGN_WORDS_FILE_CLICK_EVENT, {
|
366
|
+
detail: this.CONFIG_FOLDER + this.getSelectedWordsFileName(),
|
367
|
+
bubbles: false,
|
368
|
+
cancelable: false
|
369
|
+
});
|
370
|
+
|
371
|
+
this.dispatchEvent(evt);
|
372
|
+
}
|
373
|
+
|
374
|
+
_onSaveWordFileClick()
|
375
|
+
{
|
376
|
+
if (this._validator.validate())
|
377
|
+
{
|
378
|
+
// Show spinner
|
379
|
+
$('#editModal #saveSpinner', $(this)).show();
|
380
|
+
|
381
|
+
// Fire event to request file to be saved by server
|
382
|
+
let evt = new CustomEvent(this.SAVE_WORDS_FILE_CLICK_EVENT, {
|
383
|
+
detail: {
|
384
|
+
filename: $('#editModal #filename', $(this)).val() + this.WORDS_FILE_EXT,
|
385
|
+
isNew: this._isNewFile,
|
386
|
+
content: $('#editModal #content', $(this)).val()
|
387
|
+
},
|
388
|
+
bubbles: false,
|
389
|
+
cancelable: false
|
390
|
+
});
|
391
|
+
|
392
|
+
this.dispatchEvent(evt);
|
393
|
+
}
|
394
|
+
}
|
395
|
+
|
396
|
+
_showModal()
|
397
|
+
{
|
398
|
+
// Append modal html
|
399
|
+
$(this).append(this._modalHtml);
|
400
|
+
|
401
|
+
let modalElement = $('#editModal', $(this));
|
402
|
+
|
403
|
+
// Initialize kendo validation
|
404
|
+
this._validator = modalElement.find('#editFieldset').kendoValidator({
|
405
|
+
validateOnBlur: true,
|
406
|
+
rules: {
|
407
|
+
requiredFilename: $.proxy(function(input) {
|
408
|
+
let valid = true;
|
409
|
+
if (input.is('[name=filename]'))
|
410
|
+
valid = input.val() !== '';
|
411
|
+
return valid;
|
412
|
+
}, this),
|
413
|
+
validFilename: $.proxy(function(input) {
|
414
|
+
let valid = true;
|
415
|
+
if (input.is('[name=filename]'))
|
416
|
+
valid = (!input.val().includes('\\') && !input.val().includes('/'));
|
417
|
+
return valid;
|
418
|
+
}, this)
|
419
|
+
},
|
420
|
+
messages: {
|
421
|
+
requiredFilename: 'Required',
|
422
|
+
validFilename: 'Contains invalid characters (slash, backslash)'
|
423
|
+
}
|
424
|
+
}).data('kendoValidator');
|
425
|
+
|
426
|
+
// Hide save spinner
|
427
|
+
$('#saveSpinner', modalElement).hide();
|
428
|
+
|
429
|
+
// Add listener to Save button click
|
430
|
+
$('#saveWordFileButton', modalElement).on('click', $.proxy(this._onSaveWordFileClick, this));
|
431
|
+
|
432
|
+
// Add listener to modal hide event
|
433
|
+
modalElement.on('hidden.bs.modal', $.proxy(this._destroyModal, this));
|
434
|
+
|
435
|
+
// Initialize bootstrap modal
|
436
|
+
modalElement.modal({
|
437
|
+
backdrop: 'static',
|
438
|
+
keyboard: false,
|
439
|
+
});
|
440
|
+
}
|
441
|
+
|
442
|
+
_destroyModal()
|
443
|
+
{
|
444
|
+
let modalElement = $('#editModal', $(this));
|
445
|
+
|
446
|
+
if (modalElement)
|
447
|
+
{
|
448
|
+
// Remove listeners
|
449
|
+
$('#saveWordFileButton', modalElement).off('click');
|
450
|
+
modalElement.off('hidden.bs.modal');
|
451
|
+
|
452
|
+
// Destroy everything Kendo
|
453
|
+
kendo.destroy(modalElement);
|
454
|
+
|
455
|
+
// Dispose modal
|
456
|
+
modalElement.modal('dispose');
|
457
|
+
|
458
|
+
// Remove html
|
459
|
+
modalElement.remove();
|
460
|
+
modalElement = null;
|
461
|
+
}
|
462
|
+
}
|
463
|
+
}
|
464
|
+
|
465
|
+
// DEFINE COMPONENT
|
466
|
+
if (!window.customElements.get('words-files-manager'))
|
467
|
+
window.customElements.define('words-files-manager', WordsFilesManager);
|
468
|
+
|
469
|
+
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
|
470
|
+
|
471
|
+
/***/ }),
|
472
|
+
|
4
473
|
/***/ "./src/components/sidebar-layout.js":
|
5
474
|
/*!******************************************!*\
|
6
475
|
!*** ./src/components/sidebar-layout.js ***!
|
@@ -150,6 +619,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
150
619
|
/* harmony import */ var _components_sidebar_layout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/sidebar-layout */ "./src/components/sidebar-layout.js");
|
151
620
|
/* harmony import */ var _utils_uibuilder_config_interface_builder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/uibuilder/config-interface-builder */ "./src/utils/uibuilder/config-interface-builder.js");
|
152
621
|
/* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/utilities */ "./src/utils/utilities.js");
|
622
|
+
/* harmony import */ var _components_module_specific_words_files_manager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/module-specific/words-files-manager */ "./src/components/module-specific/words-files-manager.js");
|
623
|
+
|
153
624
|
|
154
625
|
|
155
626
|
|
@@ -179,6 +650,11 @@ class ZoneConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
|
|
179
650
|
this.REQ_NEW_ROOM_CONFIG = 'newRoomConfig';
|
180
651
|
this.REQ_DELETE_ROOM_CONFIG = 'delRoomConfig';
|
181
652
|
|
653
|
+
this.REQ_REFRESH_WORDS_FILE = 'refreshWordsFiles';
|
654
|
+
this.REQ_EDIT_WORDS_FILE = 'editWordsFile';
|
655
|
+
this.REQ_SAVE_WORDS_FILE = 'saveWordsFile';
|
656
|
+
this.REQ_DELETE_WORDS_FILE = 'delWordsFile';
|
657
|
+
|
182
658
|
// Incoming responses
|
183
659
|
this.RESP_ZONES = 'zones';
|
184
660
|
|
@@ -195,6 +671,10 @@ class ZoneConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
|
|
195
671
|
this.RESP_ROOM_ADDED = 'roomAdded';
|
196
672
|
this.RESP_ROOM_REFUSED = 'roomRefused';
|
197
673
|
this.RESP_ROOM_DELETED = 'roomDel';
|
674
|
+
|
675
|
+
this.RESP_REFRESH_WORDS_FILES = 'refreshWordsFiles';
|
676
|
+
this.RESP_WORDS_FILE_CONTENT = 'wordsFile';
|
677
|
+
this.RESP_WORDS_FILE_ERROR = 'wordsFileErr';
|
198
678
|
}
|
199
679
|
|
200
680
|
//------------------------------------
|
@@ -223,7 +703,7 @@ class ZoneConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
|
|
223
703
|
change: $.proxy(this._onZoneRoomChange, this),
|
224
704
|
}).data('kendoTreeView');
|
225
705
|
|
226
|
-
//
|
706
|
+
// Listen to treeview double-click event
|
227
707
|
$('#znc-treeView').on('dblclick', $.proxy(this._onTreeItemDoubleClick, this));
|
228
708
|
|
229
709
|
// Request zones & rooms list to server instance
|
@@ -251,6 +731,14 @@ class ZoneConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
|
|
251
731
|
$('#znc-cancelButton').on('click', $.proxy(this._onCancelClick, this));
|
252
732
|
$('#znc-reloadButton').on('click', $.proxy(this._onReloadClick, this));
|
253
733
|
$('#znc-submitButton').on('click', $.proxy(this._onSubmitClick, this));
|
734
|
+
|
735
|
+
// Save ref to words files manager and add custom event listeners
|
736
|
+
this._wordsFilesManager = document.getElementById('znc-wordsFilesManager');
|
737
|
+
$(this._wordsFilesManager).on(this._wordsFilesManager.REFRESH_WORDS_FILES_CLICK_EVENT, $.proxy(this._onWordsFileReloadClick, this));
|
738
|
+
$(this._wordsFilesManager).on(this._wordsFilesManager.EDIT_WORDS_FILE_CLICK_EVENT, $.proxy(this._onWordsFileEditClick, this));
|
739
|
+
$(this._wordsFilesManager).on(this._wordsFilesManager.SAVE_WORDS_FILE_CLICK_EVENT, $.proxy(this._onWordsFileSaveClick, this));
|
740
|
+
$(this._wordsFilesManager).on(this._wordsFilesManager.REMOVE_WORDS_FILE_CLICK_EVENT, $.proxy(this._onWordsFileRemoveClick, this));
|
741
|
+
$(this._wordsFilesManager).on(this._wordsFilesManager.ASSIGN_WORDS_FILE_CLICK_EVENT, $.proxy(this._onWordsFileAssignClick, this));
|
254
742
|
}
|
255
743
|
|
256
744
|
destroy()
|
@@ -276,6 +764,13 @@ class ZoneConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
|
|
276
764
|
$('#znc-reloadButton').off('click');
|
277
765
|
$('#znc-submitButton').off('click');
|
278
766
|
|
767
|
+
// Remove listeners to words files manager
|
768
|
+
$(this._wordsFilesManager).off(this._wordsFilesManager.REFRESH_WORDS_FILES_CLICK_EVENT);
|
769
|
+
$(this._wordsFilesManager).off(this._wordsFilesManager.EDIT_WORDS_FILE_CLICK_EVENT);
|
770
|
+
$(this._wordsFilesManager).off(this._wordsFilesManager.SAVE_WORDS_FILE_CLICK_EVENT);
|
771
|
+
$(this._wordsFilesManager).off(this._wordsFilesManager.REMOVE_WORDS_FILE_CLICK_EVENT);
|
772
|
+
$(this._wordsFilesManager).off(this._wordsFilesManager.ASSIGN_WORDS_FILE_CLICK_EVENT);
|
773
|
+
|
279
774
|
// Clear tabs container
|
280
775
|
this._clearTabs();
|
281
776
|
}
|
@@ -598,6 +1093,34 @@ class ZoneConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
|
|
598
1093
|
this._treeview.dataSource.sync();
|
599
1094
|
}
|
600
1095
|
|
1096
|
+
/****** WORDS FILES ******/
|
1097
|
+
|
1098
|
+
// Words files list received
|
1099
|
+
else if (command == this.RESP_REFRESH_WORDS_FILES)
|
1100
|
+
{
|
1101
|
+
this._wordsFilesManager.refreshWordsFilesList(data.getSFSArray('wf'), username == this.smartFox.mySelf.name);
|
1102
|
+
|
1103
|
+
// If another user caused a refresh (for example deleting a file, or adding a new one) show a notification
|
1104
|
+
if (username != null && username != this.smartFox.mySelf.name && this._editedZoneId > -1)
|
1105
|
+
this.shellCtrl.showNotification('Words files modified', `Administrator ${username} has added, modified or deleted a words file.`);
|
1106
|
+
}
|
1107
|
+
|
1108
|
+
// Words file content received
|
1109
|
+
else if (command == this.RESP_WORDS_FILE_CONTENT)
|
1110
|
+
{
|
1111
|
+
this._wordsFilesManager.editWordsFile(data.getUtfString('filename'), data.getText('content'));
|
1112
|
+
}
|
1113
|
+
|
1114
|
+
// Words file error (edit/save)
|
1115
|
+
else if (command == this.RESP_WORDS_FILE_ERROR)
|
1116
|
+
{
|
1117
|
+
// Enable buttons
|
1118
|
+
this._wordsFilesManager.enabled = true;
|
1119
|
+
|
1120
|
+
// Show alert
|
1121
|
+
this.shellCtrl.showSimpleAlert(data.getUtfString('error'), true);
|
1122
|
+
}
|
1123
|
+
|
601
1124
|
// else if ()
|
602
1125
|
}
|
603
1126
|
|
@@ -832,6 +1355,85 @@ class ZoneConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
|
|
832
1355
|
}
|
833
1356
|
}
|
834
1357
|
|
1358
|
+
_onWordsFileReloadClick(evt)
|
1359
|
+
{
|
1360
|
+
// Send request to server
|
1361
|
+
this.sendExtensionRequest(this.REQ_REFRESH_WORDS_FILE);
|
1362
|
+
}
|
1363
|
+
|
1364
|
+
_onWordsFileEditClick(evt)
|
1365
|
+
{
|
1366
|
+
// Send request to server
|
1367
|
+
let params = new SFS2X.SFSObject();
|
1368
|
+
params.putUtfString('filename', evt.detail);
|
1369
|
+
this.sendExtensionRequest(this.REQ_EDIT_WORDS_FILE, params);
|
1370
|
+
}
|
1371
|
+
|
1372
|
+
_onWordsFileSaveClick(evt)
|
1373
|
+
{
|
1374
|
+
this._tempWordsFileData = evt.detail;
|
1375
|
+
|
1376
|
+
// Check if a new file is being created
|
1377
|
+
if (this._tempWordsFileData.isNew)
|
1378
|
+
{
|
1379
|
+
// If yes, check if name already exists
|
1380
|
+
if (this._wordsFilesManager.getExistingFilenames().includes(this._tempWordsFileData.filename))
|
1381
|
+
{
|
1382
|
+
// Show confirm dialog
|
1383
|
+
this.shellCtrl.showConfirmWarning('A words file with the entered name already exists; do you want to proceed anyway? The existing file will be overwritten.', $.proxy(this._onWordsFileSaveConfirm, this));
|
1384
|
+
return;
|
1385
|
+
}
|
1386
|
+
}
|
1387
|
+
|
1388
|
+
// Proceed
|
1389
|
+
this._onWordsFileSaveConfirm();
|
1390
|
+
}
|
1391
|
+
|
1392
|
+
_onWordsFileSaveConfirm()
|
1393
|
+
{
|
1394
|
+
// Disable words files manager buttons
|
1395
|
+
this._wordsFilesManager.enabled = false;
|
1396
|
+
this._wordsFilesManager.saveSpinnerVisible = true;
|
1397
|
+
|
1398
|
+
// Send request to server
|
1399
|
+
let params = new SFS2X.SFSObject();
|
1400
|
+
params.putUtfString('filename', this._tempWordsFileData.filename);
|
1401
|
+
params.putText('content', this._tempWordsFileData.content);
|
1402
|
+
this.sendExtensionRequest(this.REQ_SAVE_WORDS_FILE, params);
|
1403
|
+
}
|
1404
|
+
|
1405
|
+
_onWordsFileRemoveClick(evt)
|
1406
|
+
{
|
1407
|
+
this.shellCtrl.showConfirmWarning('Are you sure you want to delete the selected words file?', $.proxy(this._onWordsFileRemoveConfirm, this));
|
1408
|
+
}
|
1409
|
+
|
1410
|
+
_onWordsFileRemoveConfirm()
|
1411
|
+
{
|
1412
|
+
let wordsFile = this._wordsFilesManager.getSelectedWordsFileName();
|
1413
|
+
|
1414
|
+
if (wordsFile != null)
|
1415
|
+
{
|
1416
|
+
// Disable words files manager buttons
|
1417
|
+
this._wordsFilesManager.enabled = false;
|
1418
|
+
this._wordsFilesManager.actionSpinnerVisible = true;
|
1419
|
+
|
1420
|
+
// Send request to server
|
1421
|
+
let params = new SFS2X.SFSObject();
|
1422
|
+
params.putUtfString('filename', wordsFile);
|
1423
|
+
this.sendExtensionRequest(this.REQ_DELETE_WORDS_FILE, params);
|
1424
|
+
}
|
1425
|
+
}
|
1426
|
+
|
1427
|
+
_onWordsFileAssignClick(evt)
|
1428
|
+
{
|
1429
|
+
let path = evt.detail;
|
1430
|
+
|
1431
|
+
// Write path of the selected words file in "wordsFilter.wordsFile" dynamically created field
|
1432
|
+
const wordsFileFormItem = this._interfaceBuilder.getConfigFormItem('wordsFilter.wordsFile');
|
1433
|
+
wordsFileFormItem.data.value = path;
|
1434
|
+
wordsFileFormItem._setWidgetValue();
|
1435
|
+
}
|
1436
|
+
|
835
1437
|
//---------------------------------
|
836
1438
|
// PRIVATE METHODS
|
837
1439
|
//---------------------------------
|
@@ -1181,4 +1783,4 @@ class ZoneConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseMo
|
|
1181
1783
|
/***/ })
|
1182
1784
|
|
1183
1785
|
}]);
|
1184
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTIuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyLWxheW91dC5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL3pvbmUtY29uZmlndXJhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTaWRlYmFyTGF5b3V0IGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2hhZG93IHJvb3Rcblx0XHRjb25zdCBzaGFkb3dSb290ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGU6ICdvcGVuJ30pO1xuXHRcdHNoYWRvd1Jvb3QuaW5uZXJIVE1MID0gYFxuXHRcdFx0PHN0eWxlPlxuXHRcdFx0XHQ6aG9zdCB7XG5cdFx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdFx0XHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0QG1lZGlhIChtYXgtd2lkdGg6IDU3NS45OHB4KSB7XG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LXhzKSA6OnNsb3R0ZWQoOm5vdChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdCAgICB9XG5cblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQteHMpIDo6c2xvdHRlZChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pIHtcblx0XHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0ICAgIH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdEBtZWRpYSAobWF4LXdpZHRoOiA3NjcuOThweCkge1xuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC1zbSkgOjpzbG90dGVkKDpub3QoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0XHQgICAgfVxuXG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LXNtKSA6OnNsb3R0ZWQoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSB7XG5cdFx0XHRcdFx0XHRmbGV4LWdyb3c6IDE7XG5cdFx0XHRcdCAgICB9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRAbWVkaWEgKG1heC13aWR0aDogOTkxLjk4cHgpIHtcblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQtbWQpIDo6c2xvdHRlZCg6bm90KFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdFx0ICAgIH1cblxuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC1tZCkgOjpzbG90dGVkKFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkge1xuXHRcdFx0XHRcdFx0ZmxleC1ncm93OiAxO1xuXHRcdFx0XHQgICAgfVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0QG1lZGlhIChtYXgtd2lkdGg6IDExOTkuOThweCkge1xuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC1sZykgOjpzbG90dGVkKDpub3QoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0XHQgICAgfVxuXG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LWxnKSA6OnNsb3R0ZWQoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSB7XG5cdFx0XHRcdFx0XHRmbGV4LWdyb3c6IDE7XG5cdFx0XHRcdCAgICB9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuc2lkZS1jb2w6OnNsb3R0ZWQoKikge1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Lm1haW4tY29sOjpzbG90dGVkKCopIHtcblx0XHRcdFx0XHRmbGV4LWdyb3c6IDE7XG5cdFx0XHRcdH1cblx0XHRcdDwvc3R5bGU+XG5cblx0XHRcdDxzbG90IGNsYXNzPVwic2lkZS1jb2xcIiBuYW1lPVwic2lkZS1jb2x1bW5cIj48L3Nsb3Q+XG5cdFx0XHQ8c2xvdCBjbGFzcz1cIm1haW4tY29sXCIgbmFtZT1cIm1haW4tY29sdW1uXCI+PC9zbG90PlxuXHRcdGA7XG5cblx0XHQvLyBTZXQgaW5pdGlhbCBzZWxlY3Rpb25cblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xuXHR9XG5cblx0Z2V0IHNlbGVjdGVkUGFuZWwoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkUGFuZWw7XG5cdH1cblxuXHRzZXQgc2VsZWN0ZWRQYW5lbChlbGVtZW50KSAvLyAnc2lkZScgb3IgJ21haW4nXG5cdHtcblx0XHRpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQucGFyZW50Tm9kZSA9PSB0aGlzKVxuXHRcdHtcblx0XHRcdHRoaXMuX3NlbGVjdGVkUGFuZWwgPSBlbGVtZW50O1xuXG5cdFx0XHRmb3IgKGxldCBlbGVtZW50IG9mIHRoaXMuY2hpbGRyZW4pXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChlbGVtZW50ID09IHRoaXMuX3NlbGVjdGVkUGFuZWwpXG5cdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ0VsZW1lbnQgaXMgbm90IGEgY2hpbGQgb2YgU2lkZWJhckxheW91dCcpO1xuXHRcdH1cblx0fVxuXG5cdGdldCBzZWxlY3RlZEluZGV4KClcblx0e1xuXHRcdHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLmluZGV4T2YodGhpcy5fc2VsZWN0ZWRQYW5lbCk7XG5cdH1cblxuXHRzZXQgc2VsZWN0ZWRJbmRleChpbmRleClcblx0e1xuXHRcdGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuY2hpbGRyZW5baW5kZXhdID09IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgU2lkZWJhckxheW91dCBpbmRleCcpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxldCBlbGVtZW50ID0gdGhpcy5jaGlsZHJlbltpbmRleF07XG5cdFx0XHR0aGlzLnNlbGVjdGVkUGFuZWwgPSBlbGVtZW50O1xuXHRcdH1cblx0fVxufVxuXG4vLyBERUZJTkUgQ09NUE9ORU5UXG5pZiAoIXdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoJ3NpZGViYXItbGF5b3V0JykpXG5cdHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3NpZGViYXItbGF5b3V0JywgU2lkZWJhckxheW91dCk7XG4iLCJpbXBvcnQge0Jhc2VNb2R1bGV9IGZyb20gJy4vYmFzZS1tb2R1bGUnO1xuaW1wb3J0IHtWaWV3U3RhY2t9IGZyb20gJy4uL2NvbXBvbmVudHMvdmlldy1zdGFjayc7XG5pbXBvcnQge1NpZGViYXJMYXlvdXR9IGZyb20gJy4uL2NvbXBvbmVudHMvc2lkZWJhci1sYXlvdXQnO1xuaW1wb3J0IHtDb25maWdJbnRlcmZhY2VCdWlsZGVyfSBmcm9tICcuLi91dGlscy91aWJ1aWxkZXIvY29uZmlnLWludGVyZmFjZS1idWlsZGVyJztcbmltcG9ydCB7Y2FwaXRhbGl6ZUZpcnN0LCBmaWx0ZXJDbGFzc05hbWV9IGZyb20gJy4uL3V0aWxzL3V0aWxpdGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFpvbmVDb25maWd1cmF0b3IgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ3pvbmVDb25maWcnKTtcblxuXHRcdHRoaXMuSVRFTV9UWVBFX1pPTkUgPSAnem9uZSc7XG5cdFx0dGhpcy5JVEVNX1RZUEVfUk9PTSA9ICdyb29tJztcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfR0VUX1pPTkVTID0gJ2dldFpvbmVzJztcblxuXHRcdHRoaXMuUkVRX0dFVF9aT05FX0NPTkZJRyA9ICdnZXRab25lQ29uZmlnJztcblx0XHR0aGlzLlJFUV9TQVZFX1pPTkVfQ09ORklHID0gJ3NhdmVab25lQ29uZmlnJztcblx0XHR0aGlzLlJFUV9ORVdfWk9ORV9DT05GSUcgPSAnbmV3Wm9uZUNvbmZpZyc7XG5cdFx0dGhpcy5SRVFfREVMRVRFX1pPTkVfQ09ORklHID0gJ2RlbFpvbmVDb25maWcnO1xuXHRcdHRoaXMuUkVRX0FDVElWQVRFX1pPTkUgPSAnYWN0Wm9uZSc7XG5cblx0XHR0aGlzLlJFUV9HRVRfUk9PTV9DT05GSUcgPSAnZ2V0Um9vbUNvbmZpZyc7XG5cdFx0dGhpcy5SRVFfU0FWRV9ST09NX0NPTkZJRyA9ICdzYXZlUm9vbUNvbmZpZyc7XG5cdFx0dGhpcy5SRVFfTkVXX1JPT01fQ09ORklHID0gJ25ld1Jvb21Db25maWcnO1xuXHRcdHRoaXMuUkVRX0RFTEVURV9ST09NX0NPTkZJRyA9ICdkZWxSb29tQ29uZmlnJztcblxuXHRcdC8vIEluY29taW5nIHJlc3BvbnNlc1xuXHRcdHRoaXMuUkVTUF9aT05FUyA9ICd6b25lcyc7XG5cblx0XHR0aGlzLlJFU1BfWk9ORV9DT05GSUcgPSAnem9uZUNvbmZpZyc7XG5cdFx0dGhpcy5SRVNQX1pPTkVfQ09ORklHX1VQREFURV9DT05GSVJNID0gJ3pvbmVDZmdVcGQnO1xuXHRcdHRoaXMuUkVTUF9aT05FX0FEREVEID0gJ3pvbmVBZGRlZCc7XG5cdFx0dGhpcy5SRVNQX1pPTkVfUkVGVVNFRCA9ICd6b25lUmVmdXNlZCc7XG5cdFx0dGhpcy5SRVNQX1pPTkVfREVMRVRFRCA9ICd6b25lRGVsJztcblx0XHR0aGlzLlJFU1BfWk9ORV9BQ1RJVkFURUQgPSAnem9uZUFjdCc7XG5cdFx0dGhpcy5SRVNQX1pPTkVfQUNUSVZBVElPTl9FUlJPUiA9ICd6b25lQWN0RXJyJztcblxuXHRcdHRoaXMuUkVTUF9ST09NX0NPTkZJRyA9ICdyb29tQ29uZmlnJztcblx0XHR0aGlzLlJFU1BfUk9PTV9DT05GSUdfVVBEQVRFX0NPTkZJUk0gPSAncm9vbUNmZ1VwZCc7XG5cdFx0dGhpcy5SRVNQX1JPT01fQURERUQgPSAncm9vbUFkZGVkJztcblx0XHR0aGlzLlJFU1BfUk9PTV9SRUZVU0VEID0gJ3Jvb21SZWZ1c2VkJztcblx0XHR0aGlzLlJFU1BfUk9PTV9ERUxFVEVEID0gJ3Jvb21EZWwnO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLyBUaGlzIG1ldGhvZHMgb3ZlcnJpZGUgdGhvc2UgaW4gQmFzZU1vZHVsZSBjbGFzcy5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRpbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5pbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKTtcblxuXHRcdC8vIENyZWF0ZSBpbnRlcmZhY2UgYnVpbGRlciBpbnN0YW5jZVxuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIgPSBuZXcgQ29uZmlnSW50ZXJmYWNlQnVpbGRlcigpO1xuXG5cdFx0Ly8gU2V0IGxpc3RlbmVyIGZvciBjdXN0b20gYWN0aW9ucyB0cmlnZ2VyZWQgYnkgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHQkKCcjem5jLXRhYk5hdmlnYXRvcicpLm9uKCd2YWx1ZS1zZXQnLCAkLnByb3h5KHRoaXMuX29uQ29uZmlnVmFsdWVTZXQsIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgWm9uZXMvUm9vbXMgdHJlZXZpZXdcblx0XHR0aGlzLl90cmVldmlldyA9ICQoJyN6bmMtdHJlZVZpZXcnKS5rZW5kb1RyZWVWaWV3KHtcblx0XHRcdGxvYWRPbkRlbWFuZDogZmFsc2UsXG5cdFx0XHRkYXRhVGV4dEZpZWxkOiAnbmFtZScsXG5cdFx0XHR0ZW1wbGF0ZToga2VuZG8udGVtcGxhdGUoJzxzcGFuIGNsYXNzPVwiIyBpZiAoIWl0ZW0uYWN0aXZlKSB7ICMgaW5hY3RpdmUtbGlzdC1pdGVtICMgfSAjXCI+IzogaXRlbS5uYW1lICM8L3NwYW4+JyksXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25ab25lUm9vbUNoYW5nZSwgdGhpcyksXG5cdFx0fSkuZGF0YSgna2VuZG9UcmVlVmlldycpO1xuXG5cdFx0Ly8gTGVzdGVuZCB0byB0cmVldmlldyBkb3VibGUtY2xpY2sgZXZlbnRcblx0XHQkKCcjem5jLXRyZWVWaWV3Jykub24oJ2RibGNsaWNrJywgJC5wcm94eSh0aGlzLl9vblRyZWVJdGVtRG91YmxlQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIFJlcXVlc3Qgem9uZXMgJiByb29tcyBsaXN0IHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1pPTkVTKTtcblxuXHRcdC8vIEluaXRpYWxpemUgcHJvZ3Jlc3MgYmFyXG5cdFx0JCgnI3puYy1wcm9ncmVzc0JhcicpLmtlbmRvUHJvZ3Jlc3NCYXIoe1xuXHRcdFx0bWluOiAwLFxuICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHR2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDQwMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lcnMgdG8gdXRpbGl0eSBidXR0b25zXG5cdFx0JCgnI3puYy1hZGRab25lQnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZFpvbmVDbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bmMtYWRkUm9vbUJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25BZGRSb29tQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5jLWVkaXRCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uRWRpdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3puYy1yZW1vdmVCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5jLWFjdGl2YXRlQnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFjdGl2YXRlQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBpbnRlcmZhY2UgYnV0dG9uc1xuXHRcdCQoJyN6bmMtY2FuY2VsQnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkNhbmNlbENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3puYy1yZWxvYWRCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVsb2FkQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TdWJtaXRDbGljaywgdGhpcykpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblxuXHRcdC8vIFJlbW92ZSB0cmVlIHZpZXcgZG91YmxlY2xpY2sgbGlzdGVuZXJcblx0XHQkKCcjem5jLXRyZWVWaWV3Jykub2ZmKCdkYmxjbGljaycpO1xuXG5cdFx0Ly8gUmVtb3ZlIGxpc3RlbmVyIGZvciBjdXN0b20gYWN0aW9ucyB0cmlnZ2VyZWQgYnkgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHQkKCcjem5jLXRhYk5hdmlnYXRvcicpLm9mZigndmFsdWUtc2V0Jyk7XG5cblx0XHQvLyBSZW1vdmUgbGlzdGVuZXIgZm9yIHpvbmUvcm9vbSBhY3RpdmF0aW9uIGV2ZW50XG5cdFx0JCgnI3puYy1hZGRab25lQnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bmMtYWRkUm9vbUJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5jLWVkaXRCdXR0b24nKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3puYy1yZW1vdmVCdXR0b24nKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3puYy1hY3RpdmF0ZUJ1dHRvbicpLm9mZignY2xpY2snKTtcblxuXHRcdC8vIFJlbW92ZSBpbnRlcmZhY2UgYnV0dG9ucyBjbGljayBsaXN0ZW5lcnNcblx0XHQkKCcjem5jLWNhbmNlbEJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5jLXJlbG9hZEJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLm9mZignY2xpY2snKTtcblxuXHRcdC8vIENsZWFyIHRhYnMgY29udGFpbmVyXG5cdFx0dGhpcy5fY2xlYXJUYWJzKCk7XG5cdH1cblxuXHRvbkV4dGVuc2lvbkNvbW1hbmQoY29tbWFuZCwgZGF0YSlcblx0e1xuXHRcdGNvbnN0IHVzZXJuYW1lID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdC8qKioqKiogWk9ORVMgJiBST09NUyAqKioqKiovXG5cblx0XHQvLyBab25lcyAmIHJvb21zIGxpc3QgcmVjZWl2ZWRcblx0XHRpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfWk9ORVMpXG5cdFx0XHR0aGlzLl9wb3B1bGF0ZVRyZWUoZGF0YSk7XG5cblx0XHQvLyBab25lIG9yIHJvb20gY29uZmlndXJhdGlvbiBkYXRhIHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfWk9ORV9DT05GSUcgfHwgY29tbWFuZCA9PSB0aGlzLlJFU1BfUk9PTV9DT05GSUcpXG5cdFx0e1xuXHRcdFx0Ly8gQnVpbGQgdXNlciBpbnRlcmZhY2UgYmFzZWQgb24gcmVjZWl2ZWQgZGF0YVxuXHRcdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5idWlsZEludGVyZmFjZShkYXRhLmdldFNGU0FycmF5KCdzZXR0aW5ncycpLCAnem5jLXRhYk5hdmlnYXRvcicsIGZhbHNlKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHNjcm9sbGluZyB0YWJzIChpZiBuZWVkZWQpXG5cdFx0XHRpZiAodGhpcy5fcmVpbml0VGFicylcblx0XHRcdHtcblx0XHRcdFx0JCgnI3puYy10YWJOYXZpZ2F0b3IgI3RhYnMnKS5zY3JvbGxpbmdUYWJzKHtcblx0XHRcdFx0XHRib290c3RyYXBWZXJzaW9uOiA0LFxuXHRcdFx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdFx0XHRlbmFibGVTd2lwaW5nOiB0cnVlLFxuXHRcdFx0XHRcdGRpc2FibGVTY3JvbGxBcnJvd3NPbkZ1bGx5U2Nyb2xsZWQ6IHRydWUsXG5cdFx0XHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0XHRcdGNzc0NsYXNzUmlnaHRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVDb25maWdJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0LyoqKioqKiBaT05FUyAqKioqKiovXG5cblx0XHQvLyBab25lIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGNvbmZpcm1hdGlvblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVfQ09ORklHX1VQREFURV9DT05GSVJNKVxuXHRcdHtcblx0XHRcdC8vIElmIGEgJ25hbWUnIHBhcmFtZXRlciBpcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHpvbmUgbmFtZSBjaGFuZ2VkLCBhbmQgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIHpvbmVzIGxpc3Rcblx0XHRcdGlmIChkYXRhLmdldFV0ZlN0cmluZygnek5hbWUnKSAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLl91cGRhdGVab25lTmFtZUluTGlzdChkYXRhLmdldEludCgneklkJyksIGRhdGEuZ2V0VXRmU3RyaW5nKCd6TmFtZScpKTtcblxuXHRcdFx0Ly8gSWYgdGhlIGN1cnJlbnQgdXNlciBpcyB0aGUgdXBkYXRlciwgc2hvdyBhIG5vdGlmaWNhdGlvbjsgb3RoZXJ3aXNlLCBzaG93IGEgZGlhbG9nIGJveCBzdWdnZXN0aW5nIHRvIHJlbG9hZFxuXHRcdFx0aWYgKHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdFx0dGhpcy5fZW5hYmxlQ29uZmlnSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgbW9kaWZpZWQnLCBgWm9uZSBzZXR0aW5ncyB1cGRhdGVkIHN1Y2Nlc3NmdWxseTsgY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQgb24gbmV4dCA8c3Ryb25nPnNlcnZlciByZXN0YXJ0PC9zdHJvbmc+YCk7XG5cblx0XHRcdFx0Ly8gUmVzZXQgdGhlICdtb2RpZmllZCcgZmxhZ1xuXHRcdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0SXNNb2RpZmllZCgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBbiBhbGVydCBib3ggaXMgZGlzcGxheWVkIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBlZGl0aW5nIHRoZSBzYW1lIHpvbmVcblx0XHRcdFx0aWYgKGRhdGEuZ2V0SW50KCd6SWQnKSA9PSB0aGlzLl9lZGl0ZWRab25lSWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBtb2RpZmllZCB0aGUgWm9uZSB5b3UgYXJlIGN1cnJlbnRseSBlZGl0aW5nOyBwbGVhc2UgcmVsb2FkIHRvIHVwZGF0ZSB5b3VyIHZpZXcuYCk7XG5cblx0XHRcdFx0XHQvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b25cblx0XHRcdFx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHRpZiAoZGF0YS5nZXRVdGZTdHJpbmcoJ3pOYW1lJykgIT0gbnVsbClcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgcmVuYW1lZCcsIGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBjaGFuZ2VkIHRoZSBuYW1lIG9uIG9uZSBvZiB0aGUgWm9uZXNgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE5ldyB6b25lIGFkZGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfWk9ORV9BRERFRClcblx0XHR7XG5cdFx0XHRjb25zdCB6b25lTmFtZSA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCd6b25lJykuZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHVzZXIgaXMgdGhlIHVwZGF0ZXIsIHJlc2V0IHRoZSBpbnRlcmZhY2U7IG90aGVyd2lzZSwganVzdCBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAodXNlcm5hbWUgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmVzZXQgaW50ZXJmYWNlXG5cdFx0XHRcdHRoaXMuX29uQ2FuY2VsQ2xpY2soKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdab25lIGFkZGVkJywgYFpvbmUgJyR7em9uZU5hbWV9JyBjcmVhdGVkIHN1Y2Nlc3NmdWxseWApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdab25lIGFkZGVkJywgYEFkbWluaXN0cmF0b3IgJHt1c2VybmFtZX0gY3JlYXRlZCBab25lICcke3pvbmVOYW1lfSdgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG5ldyB6b25lIHRvIHRyZWVcblx0XHRcdGxldCB6b25lc0RTID0gdGhpcy5fdHJlZXZpZXcuZGF0YVNvdXJjZTtcblx0XHRcdHpvbmVzRFMuYWRkKHRoaXMuX2NyZWF0ZVpvbmVPYmplY3QoZGF0YS5nZXRTRlNPYmplY3QoJ3pvbmUnKSkpO1xuXHRcdFx0em9uZXNEUy5zeW5jKCk7XG5cdFx0fVxuXG5cdFx0Ly8gTmV3IHpvbmUgY3JlYXRpb24gcmVmdXNlZCBkdWUgdG8gaW52YWxpZCB6b25lIG5hbWVcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9aT05FX1JFRlVTRUQpXG5cdFx0e1xuXHRcdFx0Ly8gUmUtZW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlQ29uZmlnSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHQvLyBTaG93IHdhcm5pbmdcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnWm9uZSBjb25maWd1cmF0aW9uIGNhblxcJ3QgYmUgc2F2ZWQgYmVjYXVzZSBhbm90aGVyIFpvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLicsIHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIEV4aXN0aW5nIHpvbmUgZGVsZXRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVfREVMRVRFRClcblx0XHR7XG5cdFx0XHQvLyBJZiB0aGUgY3VycmVudCB1c2VyIGlzIHRoZSBkZWxldGVyLCByZXNldCB0aGUgaW50ZXJmYWNlOyBvdGhlcndpc2UsIGp1c3Qgc2hvdyBhIG5vdGlmaWNhdGlvblxuXHRcdFx0aWYgKHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJlLWVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdFx0dGhpcy5fZW5hYmxlTGlzdEludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdab25lIHJlbW92ZWQnLCBgWm9uZSAnJHtkYXRhLmdldFV0ZlN0cmluZygnek5hbWUnKX0nIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEFuIGFsZXJ0IGJveCBpcyBkaXNwbGF5ZWQgaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IGVkaXRpbmcgdGhlIHNhbWUgem9uZVxuXHRcdFx0XHRpZiAoZGF0YS5nZXRJbnQoJ3pJZCcpID09IHRoaXMuX2VkaXRlZFpvbmVJZClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoYEFkbWluaXN0cmF0b3IgJHt1c2VybmFtZX0gaGFzIGRlbGV0ZWQgdGhlIFpvbmUgeW91IGFyZSBjdXJyZW50bHkgbW9kaWZ5aW5nOyB5b3UgaGF2ZSB0byBjYW5jZWwgeW91ciBlZGl0aW5nLmApO1xuXG5cdFx0XHRcdFx0Ly8gRGlzYWJsZSBzdWJtaXQgYW5kIHJlbG9hZCBidXR0b25zXG5cdFx0XHRcdFx0JCgnI3puYy1yZWxvYWRCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdFx0XHRcdCQoJyN6bmMtc3VibWl0QnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgcmVtb3ZlZCcsIGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGRlbGV0ZWQgWm9uZSAnJHtkYXRhLmdldFV0ZlN0cmluZygnek5hbWUnKX0nYCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzZXQgc2VsZWN0aW9uIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBpdHMgcGFyZW50IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRcdGxldCBzZWxlY3RlZE5vZGUgPSB0aGlzLl90cmVldmlldy5zZWxlY3QoKTtcblx0XHRcdGxldCBzZWxlY3RlZERhdGFJdGVtID0gdGhpcy5fdHJlZXZpZXcuZGF0YUl0ZW0oc2VsZWN0ZWROb2RlKTtcblx0XHRcdGlmIChzZWxlY3RlZERhdGFJdGVtKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoc2VsZWN0ZWREYXRhSXRlbS50eXBlID09IHRoaXMuSVRFTV9UWVBFX1pPTkUgJiYgc2VsZWN0ZWREYXRhSXRlbS5pZCA9PSBkYXRhLmdldEludCgneklkJykpXG5cdFx0XHRcdFx0dGhpcy5fZGVzZWxlY3RUcmVlSXRlbSgpO1xuXG5cdFx0XHRcdGlmIChzZWxlY3RlZERhdGFJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfUk9PTSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBwYXJlbnREYXRhSXRlbSA9IHRoaXMuX3RyZWV2aWV3LmRhdGFJdGVtKHRoaXMuX3RyZWV2aWV3LnBhcmVudChzZWxlY3RlZE5vZGUpKTtcblxuXHRcdFx0XHRcdGlmIChwYXJlbnREYXRhSXRlbS5pZCA9PSBkYXRhLmdldEludCgneklkJykpXG5cdFx0XHRcdFx0XHR0aGlzLl9kZXNlbGVjdFRyZWVJdGVtKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIHpvbmUgZnJvbSB0cmVlXG5cdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl9nZXRab25lRGF0YUl0ZW1CeUlkKGRhdGEuZ2V0SW50KCd6SWQnKSk7XG5cdFx0XHRsZXQgem9uZXNEUyA9IHRoaXMuX3RyZWV2aWV3LmRhdGFTb3VyY2U7XG5cdFx0XHR6b25lc0RTLnJlbW92ZShkYXRhSXRlbSk7XG5cdFx0XHR6b25lc0RTLnN5bmMoKTtcblx0XHR9XG5cblx0XHQvLyBab25lIGFjdGl2YXRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVfQUNUSVZBVEVEKVxuXHRcdHtcblx0XHRcdC8vIFNldCB6b25lIGFjdGl2YXRpb24gc3RhdHVzXG5cdFx0XHRjb25zdCB6b25lTmFtZSA9IHRoaXMuX3NldFpvbmVBY3RpdmF0aW9uU3RhdHVzKGRhdGEuZ2V0SW50KCd6SWQnKSwgZGF0YS5nZXRVdGZTdHJpbmcoJ2FjdFJvb21zJyksIHRydWUpO1xuXG5cdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0aWYgKHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgYWN0aXZhdGVkJywgYFpvbmUgJyR7em9uZU5hbWV9JyBhY3RpdmF0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgYWN0aXZhdGVkJywgYEFkbWluaXN0cmF0b3IgJHt1c2VybmFtZX0gYWN0aXZhdGVkIFpvbmUgJyR7em9uZU5hbWV9J2ApO1xuXHRcdH1cblxuXHRcdC8vIFpvbmUgYWN0aXZhdGlvbiBlcnJvclxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVfQUNUSVZBVElPTl9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBTZXQgem9uZSBhY3RpdmF0aW9uIHN0YXR1c1xuXHRcdFx0dGhpcy5fc2V0Wm9uZUFjdGl2YXRpb25TdGF0dXMoZGF0YS5nZXRJbnQoJ3pJZCcpLCAnJywgZmFsc2UpO1xuXG5cdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoZGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJyksIHRydWUpO1xuXHRcdH1cblxuXHRcdC8qKioqKiogUk9PTVMgKioqKioqL1xuXG5cdFx0Ly8gUm9vbSBjb25maWd1cmF0aW9uIHVwZGF0ZSBjb25maXJtYXRpb25cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0NPTkZJR19VUERBVEVfQ09ORklSTSlcblx0XHR7XG5cdFx0XHRpZiAoZGF0YS5nZXRVdGZTdHJpbmcoJ3JOYW1lJykgIT0gbnVsbClcblx0XHRcdFx0dGhpcy5fdXBkYXRlUm9vbU5hbWVJbkxpc3QoZGF0YS5nZXRJbnQoJ3pJZCcpLCBkYXRhLmdldEludCgncklkJyksIGRhdGEuZ2V0VXRmU3RyaW5nKCdyTmFtZScpKTtcblxuXHRcdFx0Ly8gSWYgdGhlIGN1cnJlbnQgdXNlciBpcyB0aGUgdXBkYXRlciwgc2hvdyBhIG5vdGlmaWNhdGlvbjsgb3RoZXJ3aXNlLCBzaG93IGEgZGlhbG9nIGJveCBzdWdnZXN0aW5nIHRvIHJlbG9hZFxuXHRcdFx0aWYgKHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdFx0dGhpcy5fZW5hYmxlQ29uZmlnSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1Jvb20gbW9kaWZpZWQnLCBgUm9vbSBzZXR0aW5ncyB1cGRhdGVkIHN1Y2Nlc3NmdWxseTsgY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQgb24gbmV4dCA8c3Ryb25nPnNlcnZlciByZXN0YXJ0PC9zdHJvbmc+YCk7XG5cblx0XHRcdFx0Ly8gUmVzZXQgdGhlICdtb2RpZmllZCcgZmxhZ1xuXHRcdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0SXNNb2RpZmllZCgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBbiBhbGVydCBib3ggaXMgZGlzcGxheWVkIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBlZGl0aW5nIHRoZSBzYW1lIHJvb21cblx0XHRcdFx0aWYgKGRhdGEuZ2V0SW50KCdySWQnKSA9PSB0aGlzLl9lZGl0ZWRSb29tSWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBtb2RpZmllZCB0aGUgUm9vbSB5b3UgYXJlIGN1cnJlbnRseSBlZGl0aW5nOyBwbGVhc2UgcmVsb2FkIHRvIHVwZGF0ZSB5b3VyIHZpZXcuYCk7XG5cblx0XHRcdFx0XHQvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b25cblx0XHRcdFx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHRpZiAoZGF0YS5nZXRVdGZTdHJpbmcoJ3JOYW1lJykgIT0gbnVsbClcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1Jvb20gcmVuYW1lZCcsIGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBjaGFuZ2VkIHRoZSBuYW1lIG9uIG9uZSBvZiB0aGUgUm9vbXNgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE5ldyByb29tIGFkZGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUk9PTV9BRERFRClcblx0XHR7XG5cdFx0XHRjb25zdCByb29tRGF0YSA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdyb29tJyk7XG5cdFx0XHRjb25zdCB6b25lSWQgPSBkYXRhLmdldEludCgneklkJyk7XG5cblx0XHRcdGxldCB6b25lc0RTID0gdGhpcy5fdHJlZXZpZXcuZGF0YVNvdXJjZTtcblx0XHRcdGxldCB6b25lSXRlbSA9IHpvbmVzRFMuZ2V0KHpvbmVJZCk7XG5cblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHVzZXIgaXMgdGhlIHVwZGF0ZXIsIHJlc2V0IHRoZSBpbnRlcmZhY2U7IG90aGVyd2lzZSwganVzdCBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAodXNlcm5hbWUgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmVzZXQgaW50ZXJmYWNlXG5cdFx0XHRcdHRoaXMuX29uQ2FuY2VsQ2xpY2soKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdSb29tIGFkZGVkJywgYFJvb20gJyR7cm9vbURhdGEuZ2V0VXRmU3RyaW5nKCduYW1lJyl9JyBjcmVhdGVkIHN1Y2Nlc3NmdWxseWApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdSb29tIGFkZGVkJywgYEFkbWluaXN0cmF0b3IgJHt1c2VybmFtZX0gY3JlYXRlZCBSb29tICcke3Jvb21EYXRhLmdldFV0ZlN0cmluZygnbmFtZScpfScgaW4gWm9uZSAnJHt6b25lSXRlbS5uYW1lfSdgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG5ldyByb29tIHRvIHRyZWVcblx0XHRcdHpvbmVJdGVtLmFwcGVuZCh0aGlzLl9jcmVhdGVSb29tT2JqZWN0KHJvb21EYXRhLCB6b25lSWQpKTtcblx0XHRcdHpvbmVzRFMuc3luYygpO1xuXG5cdFx0XHQvLyBFeHBhbmQgem9uZSBub2RlIHdoZXJlIHJvb20gd2FzIGFkZGVkXG5cdFx0XHR0aGlzLl90cmVldmlldy5leHBhbmQodGhpcy5fdHJlZXZpZXcuc2VsZWN0KCkpO1xuXHRcdH1cblxuXHRcdC8vIE5ldyByb29tIGNyZWF0aW9uIHJlZnVzZWQgZHVlIHRvIGludmFsaWQgcm9vbSBuYW1lXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUk9PTV9SRUZVU0VEKVxuXHRcdHtcblx0XHRcdC8vIFJlLWVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUNvbmZpZ0ludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0Ly8gU2hvdyB3YXJuaW5nXG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1Jvb20gY29uZmlndXJhdGlvbiBjYW5cXCd0IGJlIHNhdmVkIGJlY2F1c2UgYW5vdGhlciBSb29tIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBFeGlzdGluZyByb29tIGRlbGV0ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0RFTEVURUQpXG5cdFx0e1xuXHRcdFx0bGV0IHpvbmVJdGVtID0gdGhpcy5fZ2V0Wm9uZURhdGFJdGVtQnlJZChkYXRhLmdldEludCgneklkJykpO1xuXHRcdFx0bGV0IHJvb21JdGVtID0gdGhpcy5fZ2V0Um9vbURhdGFJdGVtQnlJZChkYXRhLmdldEludCgneklkJyksIGRhdGEuZ2V0SW50KCdySWQnKSk7XG5cblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHVzZXIgaXMgdGhlIGRlbGV0ZXIsIHJlc2V0IHRoZSBpbnRlcmZhY2U7IG90aGVyd2lzZSwganVzdCBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAodXNlcm5hbWUgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmUtZW5hYmxlIGludGVyZmFjZVxuXHRcdFx0XHR0aGlzLl9lbmFibGVMaXN0SW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1Jvb20gcmVtb3ZlZCcsIGBSb29tICcke3Jvb21JdGVtLm5hbWV9JyBkZWxldGVkIHN1Y2Nlc3NmdWxseWApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBbiBhbGVydCBib3ggaXMgZGlzcGxheWVkIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBlZGl0aW5nIHRoZSBzYW1lIHJvb21cblx0XHRcdFx0aWYgKGRhdGEuZ2V0SW50KCdySWQnKSA9PSB0aGlzLl9lZGl0ZWRSb29tSWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBkZWxldGVkIHRoZSBSb29tIHlvdSBhcmUgY3VycmVudGx5IG1vZGlmeWluZzsgeW91IGhhdmUgdG8gY2FuY2VsIHlvdXIgZWRpdGluZy5gKTtcblxuXHRcdFx0XHRcdC8vIERpc2FibGUgc3VibWl0IGFuZCByZWxvYWQgYnV0dG9uc1xuXHRcdFx0XHRcdCQoJyN6bmMtcmVsb2FkQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdFx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdSb29tIHJlbW92ZWQnLCBgQWRtaW5pc3RyYXRvciAke3VzZXJuYW1lfSBkZWxldGVkIFJvb20gJyR7cm9vbUl0ZW0ubmFtZX0nIGZyb20gWm9uZSAnJHt6b25lSXRlbS5uYW1lfSdgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNldCBzZWxlY3Rpb24gaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIGl0cyBwYXJlbnQgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0bGV0IHNlbGVjdGVkTm9kZSA9IHRoaXMuX3RyZWV2aWV3LnNlbGVjdCgpO1xuXHRcdFx0bGV0IHNlbGVjdGVkRGF0YUl0ZW0gPSB0aGlzLl90cmVldmlldy5kYXRhSXRlbShzZWxlY3RlZE5vZGUpO1xuXHRcdFx0aWYgKHNlbGVjdGVkRGF0YUl0ZW0pXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChzZWxlY3RlZERhdGFJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfUk9PTSAmJiBzZWxlY3RlZERhdGFJdGVtLmlkID09IGRhdGEuZ2V0SW50KCdySWQnKSlcblx0XHRcdFx0XHR0aGlzLl9kZXNlbGVjdFRyZWVJdGVtKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSByb29tIGZyb20gdHJlZVxuXHRcdFx0em9uZUl0ZW0uY2hpbGRyZW4ucmVtb3ZlKHJvb21JdGVtKTtcblx0XHRcdHRoaXMuX3RyZWV2aWV3LmRhdGFTb3VyY2Uuc3luYygpO1xuXHRcdH1cblxuXHRcdC8vIGVsc2UgaWYgKClcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9vblRyZWVJdGVtRG91YmxlQ2xpY2soZSlcblx0e1xuXHRcdC8vIEdldCBldmVudCB0YXJnZXQncyBjbG9zZXN0IHRyZWUgbm9kZVxuXHRcdGxldCB0cmVlTm9kZSA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJy5rLWl0ZW1bcm9sZT10cmVlaXRlbV0nKTtcblxuXHRcdC8vIEdldCBhc3NvY2lhdGVkIGRhdGEgaXRlbVxuXHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX3RyZWV2aWV3LmRhdGFJdGVtKHRyZWVOb2RlKTtcblxuXHRcdC8vIExvYWQgY29uZmlndXJhdGlvblxuXHRcdHRoaXMuX2xvYWRDb25maWd1cmF0aW9uKGRhdGFJdGVtLnR5cGUpO1xuXHR9XG5cblx0X29uWm9uZVJvb21DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gUmVzZXQgdXRpbGl0eSBidXR0b25zXG5cdFx0dGhpcy5fc2V0VXRpbGl0eUJ1dHRvbnNTdGF0ZSh0aGlzLl9zZWxlY3RlZEl0ZW0pO1xuXHR9XG5cblx0Ly8gVXRpbGl0eSBidXR0b25zIGxpc3RlbmVyc1xuXG5cdF9vbkFkZFpvbmVDbGljaygpXG5cdHtcblx0XHQvLyBEZXNlbGVjdCBsaXN0IGl0ZW1cblx0XHR0aGlzLl9kZXNlbGVjdFRyZWVJdGVtKCk7XG5cblx0XHQvLyBMb2FkIGNvbmZpZ3VyYXRpb25cblx0XHR0aGlzLl9sb2FkQ29uZmlndXJhdGlvbih0aGlzLklURU1fVFlQRV9aT05FKTtcblx0fVxuXG5cdF9vbkFkZFJvb21DbGljaygpXG5cdHtcblx0XHQvLyBTZWxlY3QgcGFyZW50IGxpc3QgaXRlbVxuXHRcdHRoaXMuX3NlbGVjdFBhcmVudFRyZWVJdGVtKCk7XG5cblx0XHQvLyBMb2FkIGNvbmZpZ3VyYXRpb25cblx0XHR0aGlzLl9sb2FkQ29uZmlndXJhdGlvbih0aGlzLklURU1fVFlQRV9ST09NKTtcblx0fVxuXG5cdF9vbkVkaXRDbGljaygpXG5cdHtcblx0XHQvLyBMb2FkIGNvbmZpZ3VyYXRpb25cblx0XHR0aGlzLl9sb2FkQ29uZmlndXJhdGlvbih0aGlzLl9zZWxlY3RlZEl0ZW0udHlwZSk7XG5cdH1cblxuXHRfb25SZW1vdmVDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHNlbGVjdGVkICR7dGhpcy5fc2VsZWN0ZWRJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfWk9ORSA/ICdab25lJyA6ICdSb29tJ30gY29uZmlndXJhdGlvbj9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlQ29uZmlybSgpXG5cdHtcblx0XHQvLyBEaXNhYmxlIHpvbmUvcm9vbSBzZWxlY3Rpb24gbGlzdFxuXHRcdHRoaXMuX2VuYWJsZUxpc3RJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblxuXHRcdC8vIFJlcXVlc3Qgem9uZSByZW1vdmFsXG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbS50eXBlID09IHRoaXMuSVRFTV9UWVBFX1pPTkUpXG5cdFx0e1xuXHRcdFx0cGFyYW1zLnB1dEludCgneklkJywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfREVMRVRFX1pPTkVfQ09ORklHLCBwYXJhbXMpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0cGFyYW1zLnB1dEludCgneklkJywgdGhpcy5fc2VsZWN0ZWRJdGVtUGFyZW50LmlkKTtcblx0XHRcdHBhcmFtcy5wdXRJbnQoJ3JJZCcsIHRoaXMuX3NlbGVjdGVkSXRlbS5pZCk7XG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0RFTEVURV9ST09NX0NPTkZJRywgcGFyYW1zKTtcblx0XHR9XG5cdH1cblxuXHRfb25BY3RpdmF0ZUNsaWNrKClcblx0e1xuXHRcdC8vIEdldCBzZWxlY3RlZCBkYXRhIGl0ZW1cblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfWk9ORSlcblx0XHR7XG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0cGFyYW1zLnB1dEludCgneklkJywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9BQ1RJVkFURV9aT05FLCBwYXJhbXMpO1xuXHRcdH1cblx0fVxuXG5cdC8vIENvbmZpZ3VyYXRpb24gYnV0dG9ucyBsaXN0ZW5lcnNcblxuXHRfb25DYW5jZWxDbGljaygpXG5cdHtcblx0XHQvLyBFbmFibGUgem9uZS9yb29tIHNlbGVjdGlvbiBsaXN0c1xuXHRcdHRoaXMuX2VuYWJsZUxpc3RJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHQvLyBEaXNhYmxlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlXG5cdFx0dGhpcy5fZW5hYmxlQ29uZmlnSW50ZXJmYWNlKGZhbHNlKTtcblxuXHRcdC8vIENsZWFyIG1haW4gY29udGFpbmVyXG5cdFx0dGhpcy5fcmVzZXRUYWJzQ29udGFpbmVyKGZhbHNlLCB0cnVlKTtcblxuXHRcdC8vIFNldCBpc0VkaXRpbmcgZmxhZ1xuXHRcdHRoaXMuX2lzRWRpdGluZyA9IGZhbHNlO1xuXHRcdHRoaXMuX2VkaXRlZEl0ZW1UeXBlID0gJyc7XG5cblx0XHQvLyBTd2l0Y2ggcGFuZWxcblx0XHR0aGlzLl9zd2l0Y2hQYW5lbCgnem5jLXNpZGViYXJQYW5lbCcpO1xuXHR9XG5cblx0X29uUmVsb2FkQ2xpY2soKVxuXHR7XG5cdFx0Ly8gSGlkZSB2YWxpZGF0aW9uIG1lc3NhZ2VzXG5cdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5yZXNldFZhbGlkYXRpb24oKTtcblxuXHRcdC8vIFJlbG9hZCBjb25maWd1cmF0aW9uXG5cdFx0dGhpcy5fbG9hZENvbmZpZ3VyYXRpb24odGhpcy5fZWRpdGVkSXRlbVR5cGUsIGZhbHNlKTtcblx0fVxuXG5cdF9vblN1Ym1pdENsaWNrKClcblx0e1xuXHRcdC8vIENoZWNrIHZhbGlkaXR5XG5cdFx0aWYgKHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuY2hlY2tJc1ZhbGlkKCkpXG5cdFx0e1xuXHRcdFx0bGV0IGNoYW5nZXMgPSB0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmdldENoYW5nZWREYXRhKCk7XG5cblx0XHRcdGlmIChjaGFuZ2VzLnNpemUoKSA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vY29uc29sZS5sb2coY2hhbmdlcy5nZXREdW1wKCkpXG5cblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgem9uZS9yb29tIG5hbWUgY2hhbmdlZCwgY2hlY2sgaXQgYWdhaW5zdCB0aGUgbGlzdCAoZHVwbGljYXRlIG5hbWVzIG5vdCBhbGxvd2VkISlcblx0XHRcdFx0aWYgKHRoaXMuX3ZhbGlkYXRlTmFtZShjaGFuZ2VzKSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIERpc2FibGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHRcdFx0XHR0aGlzLl9lbmFibGVDb25maWdJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0XHRcdFx0Ly8gU2VuZCBzZXR0aW5ncyB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHRcdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0XHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnc2V0dGluZ3MnLCBjaGFuZ2VzKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0Qm9vbCgnYmFja3VwJywgJCgnI3puYy1iYWNrdXBDaGVjaycpLnByb3AoJ2NoZWNrZWQnKSk7XG5cdFx0XHRcdFx0cGFyYW1zLnB1dEludCgneklkJywgdGhpcy5fZWRpdGVkWm9uZUlkKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0SW50KCdySWQnLCB0aGlzLl9lZGl0ZWRSb29tSWQpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuX2VkaXRlZEl0ZW1UeXBlID09IHRoaXMuSVRFTV9UWVBFX1pPTkUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gU3VibWl0IHpvbmUgc2V0dGluZ3Ncblx0XHRcdFx0XHRcdGlmICh0aGlzLl9lZGl0ZWRab25lSWQgPiAtMSlcblx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9TQVZFX1pPTkVfQ09ORklHLCBwYXJhbXMpO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX05FV19aT05FX0NPTkZJRywgcGFyYW1zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIFN1Ym1pdCByb29tIHNldHRpbmdzXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5fZWRpdGVkUm9vbUlkID4gLTEpXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfU0FWRV9ST09NX0NPTkZJRywgcGFyYW1zKTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ORVdfUk9PTV9DT05GSUcsIHBhcmFtcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoYFVuYWJsZSB0byBzdWJtaXQgY29uZmlndXJhdGlvbiBiZWNhdXNlIHRoZSAke2NhcGl0YWxpemVGaXJzdCh0aGlzLl9lZGl0ZWRJdGVtVHlwZSl9IG5hbWUgYWxyZWFkeSBleGlzdHM7IGR1cGxpY2F0ZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQuYCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnVW5hYmxlIHRvIHN1Ym1pdCBjb25maWd1cmF0aW9uIGNoYW5nZXMgZHVlIHRvIGFuIGludmFsaWQgdmFsdWU7IHBsZWFzZSB2ZXJpZnkgdGhlIGhpZ2hsaWdodGVkIGZvcm0gZmllbGRzIGluIGFsbCB0YWJzLicsIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkNvbmZpZ1ZhbHVlU2V0KGUpIC8vIFNBTUUgTUVUSE9EIERVUExJQ0FURUQgSU4gem9uZS1tb25pdG9yLmpzXG5cdHtcblx0XHRjb25zdCBjb25maWdQYXJhbSA9IGUudGFyZ2V0LmRhdGE7XG5cblx0XHQvLyBIYW5kbGUgZXh0ZW5zaW9uIG5hbWUvdHlwZSBkcm9wZG93bnMgdXBkYXRlIGFuZCB1cGRhdGUgdGhlIG1haW4gY2xhc3MgZHJvcGRvd24gZGF0YXNvdXJjZSBhY2NvcmRpbmdseVxuXHRcdGlmIChjb25maWdQYXJhbS5uYW1lID09ICdleHRlbnNpb24ubmFtZScgfHwgY29uZmlnUGFyYW0ubmFtZSA9PSAnZXh0ZW5zaW9uLnR5cGUnIHx8IGNvbmZpZ1BhcmFtLm5hbWUgPT0gJ2V4dGVuc2lvbi5maWx0ZXJDbGFzcycpXG5cdFx0e1xuXHRcdFx0Ly8gQWxsIGludm9sdmVkIENvbmZpZ0Zvcm1JdGVtcyBtdXN0IGJlIGF2YWlsYWJsZSBhbmQgaW5pdGlhbGl6ZWQgdG8gcHJvY2VlZFxuXHRcdFx0Y29uc3QgbmFtZUZvcm1JdGVtID0gdGhpcy5faW50ZXJmYWNlQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbSgnZXh0ZW5zaW9uLm5hbWUnKTtcblx0XHRcdGNvbnN0IHR5cGVGb3JtSXRlbSA9IHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZ2V0Q29uZmlnRm9ybUl0ZW0oJ2V4dGVuc2lvbi50eXBlJyk7XG5cdFx0XHRjb25zdCBjbGFzc0Zvcm1JdGVtID0gdGhpcy5faW50ZXJmYWNlQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbSgnZXh0ZW5zaW9uLmZpbGUnKTtcblx0XHRcdGNvbnN0IGZpbHRlckZvcm1JdGVtID0gdGhpcy5faW50ZXJmYWNlQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbSgnZXh0ZW5zaW9uLmZpbHRlckNsYXNzJyk7XG5cblx0XHRcdGlmIChuYW1lRm9ybUl0ZW0gIT0gbnVsbCAmJiB0eXBlRm9ybUl0ZW0gIT0gbnVsbCAmJiBjbGFzc0Zvcm1JdGVtICE9IG51bGwgJiYgZmlsdGVyRm9ybUl0ZW0gIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Y29uc3Qgc291cmNlID0gbmFtZUZvcm1JdGVtLmRhdGE7XG5cdFx0XHRcdGxldCBjbGFzc2VzTGlzdCA9IFtdO1xuXG5cdFx0XHRcdGxldCBkYXRhID0gc291cmNlLnRyaWdnZXJEYXRhO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgZXh0ID0gZGF0YS5nZXRTRlNPYmplY3QoaSk7XG5cblx0XHRcdFx0XHRpZiAoZXh0LmdldFV0ZlN0cmluZygnbmFtZScpID09IG5hbWVGb3JtSXRlbS5kYXRhLnZhbHVlICYmIGV4dC5nZXRVdGZTdHJpbmcoJ3R5cGUnKSA9PSB0eXBlRm9ybUl0ZW0uZGF0YS52YWx1ZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgY2xhc3NlcyA9IGV4dC5nZXRVdGZTdHJpbmcoJ2NsYXNzZXNTdHJpbmcnKS5zcGxpdCgnLCcpO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmlsdGVyRm9ybUl0ZW0uZGF0YS52YWx1ZSA9PSB0cnVlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZmlsdGVyZWRDbGFzc2VzID0gY2xhc3Nlcy5maWx0ZXIoZmlsdGVyQ2xhc3NOYW1lKTtcblx0XHRcdFx0XHRcdFx0Y2xhc3NlcyA9IGZpbHRlcmVkQ2xhc3Nlcztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y2xhc3Nlc0xpc3QgPSBjbGFzc2VzTGlzdC5jb25jYXQoY2xhc3Nlcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGN1cnJlbnRDbGFzcyA9IGNsYXNzRm9ybUl0ZW0uZGF0YS52YWx1ZTtcblxuXHRcdFx0XHQvLyBJZiB0aGUgY2xhc3NlcyBsaXN0IGRvZXNuJ3QgY29udGFpbiB0aGUgY3VycmVudCB2YWx1ZSwgY3JlYXRlIGFuIGVtcHR5IGVudHJ5IGFuZCByZXNldCB0aGUgdmFsdWVcblx0XHRcdFx0aWYgKGNsYXNzZXNMaXN0LmluZGV4T2YoY3VycmVudENsYXNzKSA8IDApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAoY2xhc3Nlc0xpc3QubGVuZ3RoID09IDApXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y2xhc3Nlc0xpc3QucHVzaCgnJyk7XG5cdFx0XHRcdFx0XHRjdXJyZW50Q2xhc3MgPSAnJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0Y3VycmVudENsYXNzID0gY2xhc3Nlc0xpc3RbMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgbWFpbkNsYXNzRHJvcERvd24gPSBjbGFzc0Zvcm1JdGVtLl9pbm5lcldpZGdldDtcblx0XHRcdFx0bWFpbkNsYXNzRHJvcERvd24uc2V0RGF0YVNvdXJjZShjbGFzc2VzTGlzdCk7XG5cblx0XHRcdFx0Y2xhc3NGb3JtSXRlbS5kYXRhLnZhbHVlID0gY3VycmVudENsYXNzO1xuXHRcdFx0XHRjbGFzc0Zvcm1JdGVtLl9zZXRXaWRnZXRWYWx1ZSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgTUVUSE9EU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9lbmFibGVMaXN0SW50ZXJmYWNlKGVuYWJsZWQpXG5cdHtcblx0XHQkKCcjem5jLXV0aWxCdXR0b25zJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cdFx0JCgnI3puYy10cmVlVmlldycpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXHR9XG5cblx0X3NldFV0aWxpdHlCdXR0b25zU3RhdGUoZGF0YUl0ZW0gPSBudWxsKVxuXHR7XG5cdFx0bGV0IGRpc2FibGUgPSB0cnVlO1xuXG5cdFx0aWYgKGRhdGFJdGVtKVxuXHRcdHtcblx0XHRcdC8vIEVuYWJsZSAnYWN0aXZhdGUgem9uZScgYnV0dG9uIGlmIHpvbmUgaXMgaW5hY3RpdmVcblx0XHRcdCQoJyN6bmMtYWN0aXZhdGVCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIChkYXRhSXRlbS50eXBlICE9IHRoaXMuSVRFTV9UWVBFX1pPTkUgfHwgZGF0YUl0ZW0uYWN0aXZlKSk7XG5cblx0XHRcdGRpc2FibGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIERpc2FibGUgJ2FjdGl2YXRlIHpvbmUnIGJ1dHRvblxuXHRcdFx0JCgnI3puYy1hY3RpdmF0ZUJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgb3RoZXIgdXRpbGl0eSBidXR0b25zXG5cdFx0JCgnI3puYy1hZGRab25lQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7IC8vIEFsd2F5cyBlbmFibGVkXG5cdFx0JCgnI3puYy1hZGRSb29tQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBkaXNhYmxlKTtcblx0XHQkKCcjem5jLWVkaXRCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIGRpc2FibGUpO1xuXHRcdCQoJyN6bmMtcmVtb3ZlQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBkaXNhYmxlKTtcblx0fVxuXG5cdF9lbmFibGVDb25maWdJbnRlcmZhY2UoZW5hYmxlZClcblx0e1xuXHRcdCQoJyN6bmMtY2FuY2VsQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cdFx0JCgnI3puYy1yZWxvYWRCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXHRcdCQoJyN6bmMtYmFja3VwQ2hlY2snKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblxuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZGlzYWJsZUludGVyZmFjZSghZW5hYmxlZCk7XG5cblx0XHQvLyBBbHNvIHN3aXRjaCB2aWV3IHdoZW4gZW5hYmxlZFxuXHRcdGlmIChlbmFibGVkKVxuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnem5jLW1haW4nKTtcblx0fVxuXG5cdF9zd2l0Y2hWaWV3KHZpZXdJZClcblx0e1xuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6bmMtdmlld3N0YWNrJykuc2VsZWN0ZWRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmlld0lkKTtcblx0fVxuXG5cdF9jbGVhclRhYnMoKVxuXHR7XG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyN6bmMtdGFiTmF2aWdhdG9yICN0YWJzJykuc2Nyb2xsaW5nVGFicygnZGVzdHJveScpO1xuXG5cdFx0Ly8gUmVtb3ZlIGFsbCB0YWIgbmF2aWdhdG9yIGNvbnRlbnRcblx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmRlc3Ryb3lJbnRlcmZhY2UoKTtcblxuXHRcdC8vIFNldCBmbGFnIHRvIHJlLWluaXRpYWxpemUgdGFicyBpZiBuZWVkZWRcblx0XHR0aGlzLl9yZWluaXRUYWJzID0gdHJ1ZTtcblx0fVxuXG5cdF9wb3B1bGF0ZVRyZWUoZGF0YSlcblx0e1xuXHRcdGxldCB6RGF0YSA9IGRhdGEuZ2V0U0ZTQXJyYXkoJ3pvbmVzJyk7XG5cblx0XHRsZXQgem9uZXNBcnIgPSBbXTtcblx0XHRmb3IgKGxldCB6ID0gMDsgeiA8IHpEYXRhLnNpemUoKTsgeisrKVxuXHRcdFx0em9uZXNBcnIucHVzaCggdGhpcy5fY3JlYXRlWm9uZU9iamVjdCh6RGF0YS5nZXRTRlNPYmplY3QoeikpICk7XG5cblx0XHQvLyBDcmVhdGUgZGF0YXNvdXJjZVxuXHRcdGxldCB6b25lcyA9IG5ldyBrZW5kby5kYXRhLkhpZXJhcmNoaWNhbERhdGFTb3VyY2Uoe1xuICAgICAgICAgICAgZGF0YTogem9uZXNBcnIsXG5cdFx0XHRzb3J0OiB7XG5cdFx0XHRcdGZpZWxkOiAnbmFtZScsXG5cdFx0XHRcdGRpcjogJ2FzYydcblx0XHRcdH0sXG4gICAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgICAgICBtb2RlbDoge1xuXHRcdFx0XHRcdGlkOiAnaWQnLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjoge1xuXHRcdFx0XHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGE6ICdyb29tcycsXG5cdFx0XHRcdFx0XHRcdHNvcnQ6IHtcblx0XHRcdFx0XHRcdFx0XHRmaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRcdFx0XHRcdGRpcjogJ2FzYydcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cdFx0Ly8gU2V0IHRyZWUgdmlldyBkYXRhcHJvdmlkZXJcblx0XHR0aGlzLl90cmVldmlldy5zZXREYXRhU291cmNlKHpvbmVzKTtcblxuXHRcdC8vIFNldCB1dGlsaXR5IGJ1dHRvbnMgc3RhdGUgKGFkZCwgcmVtb3ZlLCBlZGl0LCBldGMpXG5cdFx0dGhpcy5fc2V0VXRpbGl0eUJ1dHRvbnNTdGF0ZSgpO1xuXHR9XG5cblx0X2NyZWF0ZVpvbmVPYmplY3Qoem9uZURhdGEpXG5cdHtcblx0XHRsZXQgem9uZSA9IHtcblx0XHRcdHR5cGU6IHRoaXMuSVRFTV9UWVBFX1pPTkUsXG5cdFx0XHRuYW1lOiB6b25lRGF0YS5nZXRVdGZTdHJpbmcoJ25hbWUnKSxcblx0XHRcdGlkOiB6b25lRGF0YS5nZXRJbnQoJ2lkJyksXG5cdFx0XHRhY3RpdmU6IHpvbmVEYXRhLmdldEJvb2woJ2FjdCcpXG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIHJvb21zIGxpc3QgZGF0YXByb3ZpZGVyXG5cdFx0bGV0IHJEYXRhID0gem9uZURhdGEuZ2V0U0ZTQXJyYXkoJ3Jvb21zJyk7XG5cblx0XHRsZXQgcm9vbXNBcnIgPSBbXTtcblx0XHRmb3IgKGxldCByID0gMDsgciA8IHJEYXRhLnNpemUoKTsgcisrKVxuXHRcdFx0cm9vbXNBcnIucHVzaCggdGhpcy5fY3JlYXRlUm9vbU9iamVjdChyRGF0YS5nZXRTRlNPYmplY3QociksIHpvbmVEYXRhLmdldEludCgnaWQnKSkgKTtcblxuXHRcdHpvbmUucm9vbXMgPSByb29tc0FycjtcblxuXHRcdHJldHVybiB6b25lO1xuXHR9XG5cblx0X2NyZWF0ZVJvb21PYmplY3Qocm9vbURhdGEsIHpvbmVJZClcblx0e1xuXHRcdGxldCByb29tID0ge1xuXHRcdFx0dHlwZTogdGhpcy5JVEVNX1RZUEVfUk9PTSxcblx0XHRcdG5hbWU6IHJvb21EYXRhLmdldFV0ZlN0cmluZygnbmFtZScpLFxuXHRcdFx0aWQ6IHJvb21EYXRhLmdldEludCgnaWQnKSxcblx0XHRcdGFjdGl2ZTogcm9vbURhdGEuZ2V0Qm9vbCgnYWN0JyksXG5cdFx0XHRwYXJlbnRJZDogem9uZUlkLFxuXHRcdFx0c3ByaXRlQ3NzQ2xhc3M6IHRoaXMuX2dldFJvb21MaXN0SWNvbkNzc0NsYXNzKHJvb21EYXRhLmdldEJvb2woJ2FjdCcpKVxuXHRcdH07XG5cblx0XHRyZXR1cm4gcm9vbTtcblx0fVxuXG5cdF9nZXRSb29tTGlzdEljb25Dc3NDbGFzcyhpc0FjdGl2ZSlcblx0e1xuXHRcdHJldHVybiBpc0FjdGl2ZSA/ICdmYXMgZmEtZG9vci1vcGVuJyA6ICdmYXMgZmEtZG9vci1jbG9zZWQgaW5hY3RpdmUtbGlzdC1pdGVtJztcblx0fVxuXG5cdF9zZXRab25lQWN0aXZhdGlvblN0YXR1cyh6b25lSWQsIGFjdGl2ZVJvb21zLCBpc0FjdGl2ZSlcblx0e1xuXHRcdGxldCB6b25lREkgPSB0aGlzLl9nZXRab25lRGF0YUl0ZW1CeUlkKHpvbmVJZCk7XG5cblx0XHR6b25lREkuYWN0aXZlID0gaXNBY3RpdmU7XG5cblx0XHRsZXQgYWN0aXZlUm9vbXNBcnIgPSBhY3RpdmVSb29tcy5zcGxpdCgnLCcpO1xuXG5cdFx0aWYgKHpvbmVESS5oYXNDaGlsZHJlbilcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHpvbmVESS5jaGlsZHJlbi5kYXRhKCkubGVuZ3RoOyBpKyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb29tID0gem9uZURJLmNoaWxkcmVuLmRhdGEoKVtpXTtcblx0XHRcdFx0cm9vbS5hY3RpdmUgPSAoaXNBY3RpdmUgJiYgYWN0aXZlUm9vbXNBcnIuaW5kZXhPZihyb29tLm5hbWUpID4gLTEpO1xuXHRcdFx0XHRyb29tLnNwcml0ZUNzc0NsYXNzID0gdGhpcy5fZ2V0Um9vbUxpc3RJY29uQ3NzQ2xhc3Mocm9vbS5hY3RpdmUpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVmcmVzaCBsaXN0XG5cdFx0dGhpcy5fdHJlZXZpZXcuZGF0YVNvdXJjZS5zeW5jKCk7XG5cblx0XHQvLyBSZXR1cm4gem9uZSBuYW1lXG5cdFx0cmV0dXJuIHpvbmVESS5uYW1lO1xuXHR9XG5cblx0X2Rlc2VsZWN0VHJlZUl0ZW0oKVxuXHR7XG5cdFx0dGhpcy5fdHJlZXZpZXcuc2VsZWN0KCQoKSk7XG5cdH1cblxuXHRfc2VsZWN0UGFyZW50VHJlZUl0ZW0oKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkTm9kZSA9IHRoaXMuX3RyZWV2aWV3LnNlbGVjdCgpO1xuXHRcdGxldCBzZWxlY3RlZERhdGFJdGVtID0gdGhpcy5fdHJlZXZpZXcuZGF0YUl0ZW0oc2VsZWN0ZWROb2RlKTtcblxuXHRcdGlmIChzZWxlY3RlZERhdGFJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfUk9PTSlcblx0XHR7XG5cdFx0XHRsZXQgcGFyZW50Tm9kZSA9IHRoaXMuX3RyZWV2aWV3LnBhcmVudChzZWxlY3RlZE5vZGUpO1xuXHRcdFx0dGhpcy5fdHJlZXZpZXcuc2VsZWN0KHBhcmVudE5vZGUpO1xuXHRcdH1cblx0fVxuXG5cdF9sb2FkQ29uZmlndXJhdGlvbih0eXBlLCByZXNldFRhYnMgPSB0cnVlKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSB6b25lL3Jvb20gc2VsZWN0aW9uIGxpc3Rcblx0XHR0aGlzLl9lbmFibGVMaXN0SW50ZXJmYWNlKGZhbHNlKTtcblxuXHRcdC8vIERpc2FibGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVDb25maWdJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gQ2xlYXIgbWFpbiBjb250YWluZXJcblx0XHR0aGlzLl9yZXNldFRhYnNDb250YWluZXIodHJ1ZSwgcmVzZXRUYWJzKTtcblxuXHRcdC8vIFNldCBpc0VkaXRpbmcgZmxhZ1xuXHRcdHRoaXMuX2lzRWRpdGluZyA9IHRydWU7XG5cdFx0dGhpcy5fZWRpdGVkSXRlbVR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gUmVxdWVzdCB6b25lIG9yIHJvb20gY29uZmlndXJhdGlvbiBkYXRhIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0cGFyYW1zLnB1dEludCgneklkJywgdGhpcy5fZWRpdGVkWm9uZUlkKTtcblx0XHRwYXJhbXMucHV0SW50KCdySWQnLCB0aGlzLl9lZGl0ZWRSb29tSWQpO1xuXG5cdFx0Ly8gSWYgbm8gcm9vbSBpcyBzZWxlY3RlZCwgdGhlbiB3ZSBhcmUgZWRpdGluZyBhIHpvbmVcblx0XHRpZiAodGhpcy5fZWRpdGVkSXRlbVR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfWk9ORSlcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1pPTkVfQ09ORklHLCBwYXJhbXMpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1JPT01fQ09ORklHLCBwYXJhbXMpO1xuXG5cdFx0Ly8gU3dpdGNoIHBhbmVsXG5cdFx0dGhpcy5fc3dpdGNoUGFuZWwoJ3puYy1tYWluUGFuZWwnKTtcblx0fVxuXG5cdF9yZXNldFRhYnNDb250YWluZXIoaXNMb2FkaW5nLCByZXNldFRhYnMpXG5cdHtcblx0XHRpZiAocmVzZXRUYWJzKVxuXHRcdFx0dGhpcy5fY2xlYXJUYWJzKCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fcmVpbml0VGFicyA9IGZhbHNlO1xuXG5cdFx0aWYgKCFpc0xvYWRpbmcpXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCd6bmMtc2VsZWN0Jyk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fc3dpdGNoVmlldygnem5jLWxvYWRpbmcnKTtcblx0fVxuXG5cdF9zd2l0Y2hQYW5lbChwYW5lbElkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3puYy12aWV3Jykuc2VsZWN0ZWRQYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhbmVsSWQpO1xuXHR9XG5cblx0X2dldFpvbmVEYXRhSXRlbUJ5SWQoem9uZUlkKVxuXHR7XG5cdFx0bGV0IHpvbmVzRFMgPSB0aGlzLl90cmVldmlldy5kYXRhU291cmNlO1xuXHRcdHJldHVybiB6b25lc0RTLmdldCh6b25lSWQpO1xuXHR9XG5cblx0X2dldFJvb21EYXRhSXRlbUJ5SWQoem9uZUlkLCByb29tSWQpXG5cdHtcblx0XHRsZXQgem9uZURJID0gdGhpcy5fZ2V0Wm9uZURhdGFJdGVtQnlJZCh6b25lSWQpO1xuXG5cdFx0aWYgKHpvbmVESS5oYXNDaGlsZHJlbilcblx0XHRcdHJldHVybiB6b25lREkuY2hpbGRyZW4uZ2V0KHJvb21JZCk7XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdF91cGRhdGVab25lTmFtZUluTGlzdCh6b25lSWQsIHpvbmVOYW1lKVxuXHR7XG5cdFx0dGhpcy5fZ2V0Wm9uZURhdGFJdGVtQnlJZCh6b25lSWQpLm5hbWUgPSB6b25lTmFtZTtcblx0XHR0aGlzLl90cmVldmlldy5kYXRhU291cmNlLnN5bmMoKTtcblx0fVxuXG5cdF91cGRhdGVSb29tTmFtZUluTGlzdCh6b25lSWQsIHJvb21JZCwgcm9vbU5hbWUpXG5cdHtcblx0XHR0aGlzLl9nZXRSb29tRGF0YUl0ZW1CeUlkKHpvbmVJZCwgcm9vbUlkKS5uYW1lID0gcm9vbU5hbWU7XG5cdFx0dGhpcy5fdHJlZXZpZXcuZGF0YVNvdXJjZS5zeW5jKCk7XG5cdH1cblxuXHRfdmFsaWRhdGVOYW1lKGNoYW5nZXMpXG5cdHtcblx0XHRjb25zdCB6b25lSWQgPSB0aGlzLl9lZGl0ZWRab25lSWQ7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMuc2l6ZSgpOyBpKyspXG5cdFx0e1xuXHRcdFx0Y29uc3Qgc2V0dGluZyA9IGNoYW5nZXMuZ2V0U0ZTT2JqZWN0KGkpO1xuXG5cdFx0XHRpZiAoc2V0dGluZy5jb250YWluc0tleSgnbmFtZScpICYmIHNldHRpbmcuZ2V0VXRmU3RyaW5nKCduYW1lJykgPT0gJ25hbWUnKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBHZXQgbmFtZSB2YWx1ZVxuXHRcdFx0XHRjb25zdCBuYW1lID0gc2V0dGluZy5nZXRUZXh0KCd2YWx1ZScpO1xuXG5cdFx0XHRcdC8vIEdldCBkYXRhIHNvdXJjZVxuXHRcdFx0XHRsZXQgZHMgPSBbXTtcblxuXHRcdFx0XHRpZiAodGhpcy5fZWRpdGVkSXRlbVR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfWk9ORSlcblx0XHRcdFx0XHRkcyA9IHRoaXMuX3RyZWV2aWV3LmRhdGFTb3VyY2UuZGF0YSgpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5fZ2V0Wm9uZURhdGFJdGVtQnlJZCh6b25lSWQpLmhhc0NoaWxkcmVuKVxuXHRcdFx0XHRcdFx0ZHMgPSB0aGlzLl9nZXRab25lRGF0YUl0ZW1CeUlkKHpvbmVJZCkuY2hpbGRyZW4uZGF0YSgpO1xuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBuYW1lIGV4aXN0cyBpbiBkYXRhIHNvdXJjZVxuXHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGRzLmxlbmd0aDsgaisrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGRzW2pdLm5hbWUgPT0gbmFtZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIEdFVFRFUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRnZXQgX3NlbGVjdGVkSXRlbSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdHJlZXZpZXcuZGF0YUl0ZW0odGhpcy5fdHJlZXZpZXcuc2VsZWN0KCkpO1xuXHR9XG5cblx0Z2V0IF9zZWxlY3RlZEl0ZW1QYXJlbnQoKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkTm9kZSA9IHRoaXMuX3RyZWV2aWV3LnNlbGVjdCgpO1xuXHRcdGxldCBwYXJlbnROb2RlID0gdGhpcy5fdHJlZXZpZXcucGFyZW50KHNlbGVjdGVkTm9kZSk7XG5cblx0XHRyZXR1cm4gdGhpcy5fdHJlZXZpZXcuZGF0YUl0ZW0ocGFyZW50Tm9kZSk7XG5cdH1cblxuXHRnZXQgX2VkaXRlZFpvbmVJZCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNFZGl0aW5nICYmIHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfWk9ORSlcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbS5pZDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbVBhcmVudC5pZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gLTE7XG5cdH1cblxuXHRnZXQgX2VkaXRlZFJvb21JZCgpXG5cdHtcblx0XHRpZiAodGhpcy5faXNFZGl0aW5nICYmIHRoaXMuX3NlbGVjdGVkSXRlbSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfUk9PTSlcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbS5pZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gLTE7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDdkhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0EiLCJzb3VyY2VSb290IjoiIn0=
|
1786
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMTIuYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvY29tcG9uZW50cy9tb2R1bGUtc3BlY2lmaWMvd29yZHMtZmlsZXMtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9jb21wb25lbnRzL3NpZGViYXItbGF5b3V0LmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21vZHVsZXMvem9uZS1jb25maWd1cmF0b3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGNsYXNzIFdvcmRzRmlsZXNNYW5hZ2VyIGV4dGVuZHMgSFRNTEVsZW1lbnRcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdCAgICBzdXBlcigpO1xuXG5cdFx0dGhpcy5SRUZSRVNIX1dPUkRTX0ZJTEVTX0NMSUNLX0VWRU5UID0gJ3JlZnJlc2hXb3Jkc0ZpbGVzQ2xpY2snO1xuXHRcdHRoaXMuRURJVF9XT1JEU19GSUxFX0NMSUNLX0VWRU5UID0gJ2VkaXRXb3Jkc0ZpbGVDbGljayc7XG5cdFx0dGhpcy5TQVZFX1dPUkRTX0ZJTEVfQ0xJQ0tfRVZFTlQgPSAnc2F2ZVdvcmRzRmlsZUNsaWNrJztcblx0XHR0aGlzLlJFTU9WRV9XT1JEU19GSUxFX0NMSUNLX0VWRU5UID0gJ3JlbW92ZVdvcmRzRmlsZUNsaWNrJztcblx0XHR0aGlzLkFTU0lHTl9XT1JEU19GSUxFX0NMSUNLX0VWRU5UID0gJ2Fzc2luZ1dvcmRzRmlsZUNsaWNrJztcblxuXHRcdHRoaXMuQ09ORklHX0ZPTERFUiA9ICdjb25maWcvJztcblx0XHR0aGlzLldPUkRTX0ZJTEVfRVhUID0gJy53b3Jkcy50eHQnO1xuXG5cdFx0dGhpcy5fbW9kYWxIdG1sID0gYFxuXHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJlZGl0TW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cImVkaXRNb2RhbFRpdGxlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkXCIgcm9sZT1cImRvY3VtZW50XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cblx0XHRcdFx0XHRcdFx0PGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgdGV4dC1wcmltYXJ5XCIgaWQ9XCJlZGl0TW9kYWxUaXRsZVwiPldvcmQgRmlsZSBFZGl0b3I8L2g1PlxuXHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgaW4tZmxvdy1pbnZhbGlkLW1zZ1wiPlxuXHRcdFx0XHRcdFx0XHQ8ZmllbGRzZXQgaWQ9XCJlZGl0RmllbGRzZXRcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGZvcm0tbGFiZWwtY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCJmaWxlbmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkZpbGVuYW1lIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIk5hbWUgb2YgdGhlIHdvcmRzIGZpbGUuIFRoZSBmaWxlIHdpbGwgYmUgc2F2ZWQgaW4gc2VydmVyJ3MgPGVtPmNvbmZpZzwvZW0+IGZvbGRlci5cIj48L2k+PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImlubmVyLXdpZGdldFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJmaWxlbmFtZVwiIG5hbWU9XCJmaWxlbmFtZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGstdGV4dGJveFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIGRhdGEtcmVxdWlyZWQtbXNnPVwiUmVxdWlyZWRcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZXh0ZW5zaW9uXCIgLz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBpZD1cImV4dGVuc2lvblwiPi53b3Jkcy50eHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2cgcG9zaXRpb24tc3RhdGljXCIgZGF0YS1mb3I9XCJmaWxlbmFtZVwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLWZvcm0tbGFiZWwgZm9ybS1sYWJlbC1jb250YWluZXJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cImNvbnRlbnRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db250ZW50IDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIkVudGVyIGEgd29yZCBvciBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwZXIgbGluZS4gU2VlIGNvbmZpZ3VyYXRpb24ncyA8ZW0+V29yZHMgZmlsZTwvZW0+IGZpZWxkIGRlc2NyaXB0aW9uIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlwiPjwvaT48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5uZXItd2lkZ2V0XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0ZXh0YXJlYSBpZD1cImNvbnRlbnRcIiBuYW1lPVwiY29udGVudFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGstdGV4dGFyZWEgdy0xMDBcIiByb3dzPVwiMTBcIj48L3RleHRhcmVhPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstaW52YWxpZC1tc2cgcG9zaXRpb24tc3RhdGljXCIgZGF0YS1mb3I9XCJjb250ZW50XCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZmllbGRzZXQ+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXIgZmxleC1jb2x1bW5cIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSB0ZXh0LWxlZnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gaWQ9XCJzYXZlV29yZEZpbGVCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnlcIj48aSBjbGFzcz1cImZhcyBmYS1zYXZlIG1yLTFcIj48L2k+U2F2ZSB3b3JkIGZpbGU8L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHRcdDxpIGlkPVwic2F2ZVNwaW5uZXJcIiBjbGFzcz1cImZhcyBmYS1jaXJjbGUtbm90Y2ggZmEtc3BpbiB0ZXh0LXByaW1hcnkgYWxpZ24tbWlkZGxlIG1sLTFcIj48L2k+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIHRleHQtcmlnaHRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1zZWNvbmRhcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdCQodGhpcykuYXBwZW5kKGBcblx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtc20tNSBjb2wtbGctNCBjb2wtZm9ybS1sYWJlbCBmb3JtLWxhYmVsLWNvbnRhaW5lclwiPlxuXHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QXZhaWxhYmxlIHdvcmRzIGZpbGVzIDxpIGNsYXNzPVwiZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSB0ZXh0LW11dGVkIGhlbHBcIiB0aXRsZT1cIlRoZSBsaXN0IG9mIHdvcmRzIGZpbGVzIGZvdW5kIGluIHNlcnZlcidzIDxlbT5jb25maWc8L2VtPiBmb2xkZXIuIENsaWNrIG9uIHRoZSBBc3NpZ24gYnV0dG9uIHRvIHNldCB0aGUgPHN0cm9uZz5Xb3JkcyBmaWxlPC9zdHJvbmc+IGZpZWxkIHRvIHRoZSBzZWxlY3RlZCBmaWxlLiBDb25maWd1cmF0aW9uIHN1Ym1pc3Npb24gaXMgdGhlbiByZXF1aXJlZCB0byBzYXZlIHRoZSBuZXcgdmFsdWUuXCI+PC9pPjwvbGFiZWw+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJpbm5lci13aWRnZXQgYWxpZ24tc2VsZi1jZW50ZXIgY29sLXNtXCI+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0PGRpdiBpZD1cIndvcmRzRmlsZXNcIiBjbGFzcz1cImxpbWl0ZWQtaGVpZ2h0XCI+PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBpZD1cImFjdGlvbkJ1dHRvbnNcIiBjbGFzcz1cIm10LTIgdGV4dC1yaWdodFwiIGRpc2FibGVkPlxuXHRcdFx0XHRcdFx0PGkgaWQ9XCJhY3Rpb25TcGlubmVyXCIgY2xhc3M9XCJmYXMgZmEtY2lyY2xlLW5vdGNoIGZhLXNwaW4gdGV4dC1wcmltYXJ5IGFsaWduLW1pZGRsZVwiPjwvaT5cblx0XHRcdFx0XHRcdDxidXR0b24gaWQ9XCJyZWZyZXNoQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1zZWNvbmRhcnkgbWwtMlwiIHRpdGxlPVwiUmVmcmVzaFwiPjxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0PGJ1dHRvbiBpZD1cImFkZEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstc2Vjb25kYXJ5IG1sLTJcIiB0aXRsZT1cIkFkZFwiPjxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIGlkPVwiZWRpdEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstc2Vjb25kYXJ5IG1sLTJcIiB0aXRsZT1cIkVkaXRcIiBkaXNhYmxlZD48aSBjbGFzcz1cImZhcyBmYS1wZW5cIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIGlkPVwicmVtb3ZlQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1zZWNvbmRhcnkgbWwtMlwiIHRpdGxlPVwiUmVtb3ZlXCIgZGlzYWJsZWQ+PGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIGlkPVwiYXNzaWduQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1zZWNvbmRhcnkgbWwtMlwiIHRpdGxlPVwiQXNzaWduXCIgZGlzYWJsZWQ+PGkgY2xhc3M9XCJmYXMgZmEtY29tcHJlc3MtYXJyb3dzLWFsdFwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRgKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBncmlkXG5cdFx0dGhpcy5fd29yZHNGaWxlc0dyaWQgPSAkKCcjd29yZHNGaWxlcycsICQodGhpcykpLmtlbmRvR3JpZCh7XG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiAncm93Jyxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbldvcmRzRmlsZXNHcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGNvbHVtbnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZpZWxkOiAnbmFtZScsXG5cdFx0XHRcdFx0dGl0bGU6ICdGaWxlbmFtZScsXG5cdFx0XHRcdFx0d2lkdGg6IDEyMFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdkYXRlJyxcblx0XHRcdFx0XHR0aXRsZTogJ0RhdGUnLFxuXHRcdFx0XHRcdHdpZHRoOiA4MFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZmllbGQ6ICdzaXplJyxcblx0XHRcdFx0XHR0aXRsZTogJ1NpemUnLFxuXHRcdFx0XHRcdHdpZHRoOiA4MFxuXHRcdFx0XHR9XG5cdFx0XHRdLFxuXHRcdFx0bm9SZWNvcmRzOiB7XG5cdFx0XHRcdHRlbXBsYXRlOiAnTm8gZmlsZXMuJ1xuXHRcdFx0fVxuXHRcdH0pLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBidXR0b24gY2xpY2tzXG5cdFx0JCgnI3JlZnJlc2hCdXR0b24nLCAkKHRoaXMpKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVsb2FkQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYWRkQnV0dG9uJywgJCh0aGlzKSkub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2VkaXRCdXR0b24nLCAkKHRoaXMpKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uRWRpdENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3JlbW92ZUJ1dHRvbicsICQodGhpcykpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVDbGljaywgdGhpcykpO1xuXHRcdCQoJyNhc3NpZ25CdXR0b24nLCAkKHRoaXMpKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQXNzaWduQ2xpY2ssIHRoaXMpKTtcblx0fVxuXG5cdGRlc3Ryb3koKVxuXHR7XG5cdFx0Ly8gRGVzdHJveSBncmlkXG5cdFx0dGhpcy5fd29yZHNGaWxlc0dyaWQuZGVzdHJveSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xuXHRcdCQoJyNyZWZyZXNoQnV0dG9uJywgJCh0aGlzKSkub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNhZGRCdXR0b24nLCAkKHRoaXMpKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2VkaXRCdXR0b24nLCAkKHRoaXMpKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3JlbW92ZUJ1dHRvbicsICQodGhpcykpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYXNzaWduQnV0dG9uJywgJCh0aGlzKSkub2ZmKCdjbGljaycpO1xuXG5cdFx0Ly8gSGlkZSBtb2RhbCAod2hpY2ggaW4gdHVybiBkZXN0cm95cyBpdClcblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI2VkaXRNb2RhbCcsICQodGhpcykpO1xuXG5cdFx0aWYgKG1vZGFsRWxlbWVudClcblx0XHRcdG1vZGFsRWxlbWVudC5tb2RhbCgnaGlkZScpO1xuXHR9XG5cblx0Z2V0IGVuYWJsZWQoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2lzRW5hYmxlZDtcblx0fVxuXG5cdHNldCBlbmFibGVkKHZhbHVlKVxuXHR7XG5cdFx0dGhpcy5faXNFbmFibGVkID0gdmFsdWU7XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBidXR0b25zXG5cdFx0JCgnI2FjdGlvbkJ1dHRvbnMnLCB0aGlzKS5hdHRyKCdkaXNhYmxlZCcsICF2YWx1ZSk7XG5cblx0XHQvLyBIaWRlIHNwaW5uZXJcblx0XHRpZiAodmFsdWUpXG5cdFx0XHR0aGlzLmFjdGlvblNwaW5uZXJWaXNpYmxlID0gZmFsc2U7XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBtb2RhbFxuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjZWRpdE1vZGFsJywgJCh0aGlzKSk7XG5cblx0XHRpZiAobW9kYWxFbGVtZW50KVxuXHRcdHtcblx0XHRcdC8vIERpc2FibGUgbW9kYWwgY2xvc2UgYnV0dG9uc1xuXHRcdFx0JCgnYnV0dG9uW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJywgbW9kYWxFbGVtZW50KS5hdHRyKCdkaXNhYmxlZCcsICF2YWx1ZSk7XG5cblx0XHRcdC8vIERpc2FibGUgc2F2ZSBidXR0b25cblx0XHRcdCQoJyNzYXZlV29yZEZpbGVCdXR0b24nLCBtb2RhbEVsZW1lbnQpLmF0dHIoJ2Rpc2FibGVkJywgIXZhbHVlKTtcblxuXHRcdFx0Ly8gRGlzYWJsZSBmaWVsZHNldFxuXHRcdFx0JCgnI2VkaXRGaWVsZHNldCcsIG1vZGFsRWxlbWVudCkuYXR0cignZGlzYWJsZWQnLCAhdmFsdWUpO1xuXG5cdFx0XHQvLyBIaWRlIHNwaW5uZXJcblx0XHRcdGlmICh2YWx1ZSlcblx0XHRcdFx0dGhpcy5zYXZlU3Bpbm5lclZpc2libGUgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRzZXQgYWN0aW9uU3Bpbm5lclZpc2libGUodmFsdWUpXG5cdHtcblx0XHRpZiAodmFsdWUpXG5cdFx0XHQkKCcjYWN0aW9uU3Bpbm5lcicsICQodGhpcykpLnNob3coKTtcblx0XHRlbHNlXG5cdFx0XHQkKCcjYWN0aW9uU3Bpbm5lcicsICQodGhpcykpLmhpZGUoKTtcblx0fVxuXG5cdHNldCBzYXZlU3Bpbm5lclZpc2libGUodmFsdWUpXG5cdHtcblx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI2VkaXRNb2RhbCcsICQodGhpcykpO1xuXG5cdFx0aWYgKG1vZGFsRWxlbWVudClcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUpXG5cdFx0XHRcdCQoJyNzYXZlU3Bpbm5lcicsIG1vZGFsRWxlbWVudCkuc2hvdygpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHQkKCcjc2F2ZVNwaW5uZXInLCBtb2RhbEVsZW1lbnQpLmhpZGUoKTtcblx0XHR9XG5cdH1cblxuXHRyZWZyZXNoV29yZHNGaWxlc0xpc3Qod29yZHNGaWxlc0xpc3QsIGhpZGVFZGl0TW9kYWwpXG5cdHtcblx0XHRpZiAoaGlkZUVkaXRNb2RhbClcblx0XHR7XG5cdFx0XHRsZXQgbW9kYWxFbGVtZW50ID0gJCgnI2VkaXRNb2RhbCcsICQodGhpcykpO1xuXG5cdFx0XHRpZiAobW9kYWxFbGVtZW50KVxuXHRcdFx0XHRtb2RhbEVsZW1lbnQubW9kYWwoJ2hpZGUnKTtcblx0XHR9XG5cblx0XHRsZXQgZmlsZXMgPSBbXTtcblx0XHR0aGlzLl9leGlzdGluZ0ZpbGVuYW1lcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgZiA9IDA7IGYgPCB3b3Jkc0ZpbGVzTGlzdC5zaXplKCk7IGYrKylcblx0XHR7XG5cdFx0XHRjb25zdCBmaWxlID0gd29yZHNGaWxlc0xpc3QuZ2V0U0ZTT2JqZWN0KGYpO1xuXG5cdFx0XHRjb25zdCBmaWxlT2JqID0ge307XG5cdFx0XHRmaWxlT2JqLm5hbWUgPSBmaWxlLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdFx0ZmlsZU9iai5kYXRlID0gZmlsZS5nZXRVdGZTdHJpbmcoJ2RhdGUnKSArICcgJyArIGZpbGUuZ2V0VXRmU3RyaW5nKCd0aW1lJyk7XG5cdFx0XHRmaWxlT2JqLnNpemUgPSBieXRlc1RvU2l6ZShmaWxlLmdldExvbmcoJ3NpemUnKSwgMik7XG5cblx0XHRcdC8vIFBvcHVsYXRlIGZpbGVzIGxpc3Rcblx0XHRcdGZpbGVzLnB1c2goZmlsZU9iaik7XG5cblx0XHRcdC8vIFNhdmUgcmVmIHRvIGV4aXN0aW5nIGZpbGVuYW1lcywgdG8gY2hlY2sgdGhlbSB3aGVuIGEgbmV3IGZpbGUgaXMgY3JlYXRlZFxuXHRcdFx0dGhpcy5fZXhpc3RpbmdGaWxlbmFtZXMucHVzaChmaWxlT2JqLm5hbWUpO1xuXHRcdH1cblxuXHRcdC8vIEFzc2lnbiBkYXRhIHNvdXJjZSB0byBncmlkXG5cdFx0dGhpcy5fc2V0V29yZHNGaWxlc0dyaWREYXRhU291cmNlKGZpbGVzKTtcblx0XHR0aGlzLl9vbldvcmRzRmlsZXNHcmlkU2VsZWN0aW9uQ2hhbmdlKCk7XG5cblx0XHQvLyBFbmFibGVcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xuXHR9XG5cblx0Z2V0U2VsZWN0ZWRXb3Jkc0ZpbGVOYW1lKClcblx0e1xuXHRcdGlmICh0aGlzLl93b3Jkc0ZpbGVzR3JpZC5zZWxlY3QoKSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBzZWxlY3RlZEluZGV4ID0gdGhpcy5fd29yZHNGaWxlc0dyaWQuc2VsZWN0KCkuaW5kZXgoKTtcblx0XHRcdHJldHVybiB0aGlzLl93b3Jkc0ZpbGVzR3JpZC5kYXRhU291cmNlLmF0KHNlbGVjdGVkSW5kZXgpLm5hbWU7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0ZWRpdFdvcmRzRmlsZShmaWxlbmFtZSwgY29udGVudClcblx0e1xuXHRcdHRoaXMuX2lzTmV3RmlsZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdC8vIFNob3cgbW9kYWxcblx0XHR0aGlzLl9zaG93TW9kYWwoKTtcblxuXHRcdC8vIFJlbW92ZSBkZWZhdWx0IGV4dGVuc2lvbiBmcm9tIGZpbGVuYW1lXG5cdFx0ZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YodGhpcy5XT1JEU19GSUxFX0VYVCkpO1xuXG5cdFx0Ly8gRW50ZXIgY29udGVudCBmaWxlbmFtZSBhbmQgY29udGVudCBpbiBtb2RhbCBmb3JtXG5cdFx0JCgnI2VkaXRNb2RhbCAjZmlsZW5hbWUnLCAkKHRoaXMpKS52YWwoZmlsZW5hbWUpO1xuXHRcdCQoJyNlZGl0TW9kYWwgI2NvbnRlbnQnLCAkKHRoaXMpKS52YWwoY29udGVudCk7XG5cblx0XHQvLyBTZXQgZmlsZW5hbWUgZmllbGQgYXMgbm90IGVkaXRhYmxlIGFuZCBoaWRlIG5vdGVcblx0XHQkKCcjZWRpdE1vZGFsICNmaWxlbmFtZScsICQodGhpcykpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0JCgnI2VkaXRNb2RhbCAjZmlsZW5hbWVOb3RlJywgJCh0aGlzKSkuaGlkZSgpO1xuXHR9XG5cblx0Z2V0RXhpc3RpbmdGaWxlbmFtZXMoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2V4aXN0aW5nRmlsZW5hbWVzO1xuXHR9XG5cblx0X3NldFdvcmRzRmlsZXNHcmlkRGF0YVNvdXJjZShkcylcblx0e1xuXHRcdC8vIFJlYWQgY3VycmVudCBob3Jpem9udGFsIHNjcm9sbCB2YWx1ZVxuXHQgICBjb25zdCBzY3JvbGxMZWZ0ID0gJCgnI3dvcmRzRmlsZXMgLmstZ3JpZC1jb250ZW50JywgdGhpcy5fd29yZHNGaWxlc0dyaWQud3JhcHBlcikuc2Nyb2xsTGVmdCgpO1xuXG5cdCAgIC8vIEFzc2lnbiBkYXRhIHNvdXJjZSB0byBncmlkXG5cdCAgIHRoaXMuX3dvcmRzRmlsZXNHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdCAgIC8vIFNldCBob3Jpem9udGFsIHNjcm9sbFxuXHQgICAkKCcjd29yZHNGaWxlcyAuay1ncmlkLWNvbnRlbnQnLCB0aGlzLl93b3Jkc0ZpbGVzR3JpZC53cmFwcGVyKS5zY3JvbGxMZWZ0KHNjcm9sbExlZnQpO1xuXHR9XG5cblx0X29uV29yZHNGaWxlc0dyaWRTZWxlY3Rpb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgYnV0dG9uc1xuXHRcdGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX3dvcmRzRmlsZXNHcmlkLnNlbGVjdCgpO1xuXHRcdCQoJyNlZGl0QnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBzZWxlY3RlZFJvd3MubGVuZ3RoID09IDApO1xuXHRcdCQoJyNyZW1vdmVCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdFx0JCgnI2Fzc2lnbkJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PSAwKTtcblx0fVxuXG5cdF9vblJlbG9hZENsaWNrKClcblx0e1xuXHRcdC8vIEZpcmUgZXZlbnQgdG8gcmVxdWVzdCBmaWxlIGNvbnRlbnQgdG8gc2VydmVyXG5cdFx0bGV0IGV2dCA9IG5ldyBDdXN0b21FdmVudCh0aGlzLlJFRlJFU0hfV09SRFNfRklMRVNfQ0xJQ0tfRVZFTlQsIHtcblx0ICAgIFx0ZGV0YWlsOiBudWxsLFxuXHRcdFx0YnViYmxlczogZmFsc2UsXG5cdFx0XHRjYW5jZWxhYmxlOiBmYWxzZVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cdH1cblxuXHRfb25BZGRDbGljaygpXG5cdHtcblx0XHR0aGlzLl9pc05ld0ZpbGUgPSB0cnVlO1xuXG5cdFx0Ly8gU2hvdyBtb2RhbFxuXHRcdHRoaXMuX3Nob3dNb2RhbCgpO1xuXHR9XG5cblx0X29uRWRpdENsaWNrKClcblx0e1xuXHRcdC8vIERpc2FibGUgYnV0dG9uc1xuXHRcdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXHRcdHRoaXMuYWN0aW9uU3Bpbm5lclZpc2libGUgPSB0cnVlO1xuXG5cdFx0Ly8gRmlyZSBldmVudCB0byByZXF1ZXN0IGZpbGUgY29udGVudCB0byBzZXJ2ZXJcblx0XHRsZXQgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KHRoaXMuRURJVF9XT1JEU19GSUxFX0NMSUNLX0VWRU5ULCB7XG5cdCAgICBcdGRldGFpbDogdGhpcy5nZXRTZWxlY3RlZFdvcmRzRmlsZU5hbWUoKSxcblx0XHRcdGJ1YmJsZXM6IGZhbHNlLFxuXHRcdFx0Y2FuY2VsYWJsZTogZmFsc2Vcblx0XHR9KTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChldnQpO1xuXHR9XG5cblx0X29uUmVtb3ZlQ2xpY2soKVxuXHR7XG5cdFx0Ly8gRmlyZSBldmVudCB0byByZXF1ZXN0IGZpbGUgcmVtb3ZhbCB0byBzZXJ2ZXJcblx0XHRsZXQgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KHRoaXMuUkVNT1ZFX1dPUkRTX0ZJTEVfQ0xJQ0tfRVZFTlQsIHtcblx0ICAgIFx0ZGV0YWlsOiB0aGlzLmdldFNlbGVjdGVkV29yZHNGaWxlTmFtZSgpLFxuXHRcdFx0YnViYmxlczogZmFsc2UsXG5cdFx0XHRjYW5jZWxhYmxlOiBmYWxzZVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cdH1cblxuXHRfb25Bc3NpZ25DbGljaygpXG5cdHtcblx0XHQvLyBGaXJlIGV2ZW50IHRvIHN1YnN0aXR1dGUgcGF0aCBpbiBjb25maWd1cmF0aW9uXG5cdFx0bGV0IGV2dCA9IG5ldyBDdXN0b21FdmVudCh0aGlzLkFTU0lHTl9XT1JEU19GSUxFX0NMSUNLX0VWRU5ULCB7XG5cdCAgICBcdGRldGFpbDogdGhpcy5DT05GSUdfRk9MREVSICsgdGhpcy5nZXRTZWxlY3RlZFdvcmRzRmlsZU5hbWUoKSxcblx0XHRcdGJ1YmJsZXM6IGZhbHNlLFxuXHRcdFx0Y2FuY2VsYWJsZTogZmFsc2Vcblx0XHR9KTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChldnQpO1xuXHR9XG5cblx0X29uU2F2ZVdvcmRGaWxlQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSgpKVxuXHRcdHtcblx0XHRcdC8vIFNob3cgc3Bpbm5lclxuXHRcdFx0JCgnI2VkaXRNb2RhbCAjc2F2ZVNwaW5uZXInLCAkKHRoaXMpKS5zaG93KCk7XG5cblx0XHRcdC8vIEZpcmUgZXZlbnQgdG8gcmVxdWVzdCBmaWxlIHRvIGJlIHNhdmVkIGJ5IHNlcnZlclxuXHRcdFx0bGV0IGV2dCA9IG5ldyBDdXN0b21FdmVudCh0aGlzLlNBVkVfV09SRFNfRklMRV9DTElDS19FVkVOVCwge1xuXHRcdCAgICBcdGRldGFpbDoge1xuXHRcdFx0XHRcdGZpbGVuYW1lOiAkKCcjZWRpdE1vZGFsICNmaWxlbmFtZScsICQodGhpcykpLnZhbCgpICsgdGhpcy5XT1JEU19GSUxFX0VYVCxcblx0XHRcdFx0XHRpc05ldzogdGhpcy5faXNOZXdGaWxlLFxuXHRcdFx0XHRcdGNvbnRlbnQ6ICQoJyNlZGl0TW9kYWwgI2NvbnRlbnQnLCAkKHRoaXMpKS52YWwoKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRidWJibGVzOiBmYWxzZSxcblx0XHRcdFx0Y2FuY2VsYWJsZTogZmFsc2Vcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHR9XG5cdH1cblxuXHRfc2hvd01vZGFsKClcblx0e1xuXHRcdC8vIEFwcGVuZCBtb2RhbCBodG1sXG5cdFx0JCh0aGlzKS5hcHBlbmQodGhpcy5fbW9kYWxIdG1sKTtcblxuXHRcdGxldCBtb2RhbEVsZW1lbnQgPSAkKCcjZWRpdE1vZGFsJywgJCh0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb25cblx0XHR0aGlzLl92YWxpZGF0b3IgPSBtb2RhbEVsZW1lbnQuZmluZCgnI2VkaXRGaWVsZHNldCcpLmtlbmRvVmFsaWRhdG9yKHtcblx0XHRcdHZhbGlkYXRlT25CbHVyOiB0cnVlLFxuXHRcdFx0cnVsZXM6IHtcblx0XHRcdFx0cmVxdWlyZWRGaWxlbmFtZTogJC5wcm94eShmdW5jdGlvbihpbnB1dCkge1xuXHRcdFx0XHRcdGxldCB2YWxpZCA9IHRydWU7XG5cdFx0XHRcdFx0aWYgKGlucHV0LmlzKCdbbmFtZT1maWxlbmFtZV0nKSlcblx0XHRcdFx0XHRcdHZhbGlkID0gaW5wdXQudmFsKCkgIT09ICcnO1xuXHRcdFx0XHRcdHJldHVybiB2YWxpZDtcblx0XHRcdFx0fSwgdGhpcyksXG5cdFx0XHRcdHZhbGlkRmlsZW5hbWU6ICQucHJveHkoZnVuY3Rpb24oaW5wdXQpIHtcblx0XHRcdFx0XHRsZXQgdmFsaWQgPSB0cnVlO1xuXHRcdFx0XHRcdGlmIChpbnB1dC5pcygnW25hbWU9ZmlsZW5hbWVdJykpXG5cdFx0XHRcdFx0XHR2YWxpZCA9ICghaW5wdXQudmFsKCkuaW5jbHVkZXMoJ1xcXFwnKSAmJiAhaW5wdXQudmFsKCkuaW5jbHVkZXMoJy8nKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbGlkO1xuXHRcdFx0XHR9LCB0aGlzKVxuXHRcdFx0fSxcblx0XHRcdG1lc3NhZ2VzOiB7XG5cdFx0XHRcdHJlcXVpcmVkRmlsZW5hbWU6ICdSZXF1aXJlZCcsXG5cdFx0XHRcdHZhbGlkRmlsZW5hbWU6ICdDb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgKHNsYXNoLCBiYWNrc2xhc2gpJ1xuXHRcdFx0fVxuXHRcdH0pLmRhdGEoJ2tlbmRvVmFsaWRhdG9yJyk7XG5cblx0XHQvLyBIaWRlIHNhdmUgc3Bpbm5lclxuXHRcdCQoJyNzYXZlU3Bpbm5lcicsIG1vZGFsRWxlbWVudCkuaGlkZSgpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIFNhdmUgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI3NhdmVXb3JkRmlsZUJ1dHRvbicsIG1vZGFsRWxlbWVudCkub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblNhdmVXb3JkRmlsZUNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gbW9kYWwgaGlkZSBldmVudFxuXHRcdG1vZGFsRWxlbWVudC5vbignaGlkZGVuLmJzLm1vZGFsJywgJC5wcm94eSh0aGlzLl9kZXN0cm95TW9kYWwsIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgYm9vdHN0cmFwIG1vZGFsXG5cdFx0bW9kYWxFbGVtZW50Lm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHR9KTtcblx0fVxuXG5cdF9kZXN0cm95TW9kYWwoKVxuXHR7XG5cdFx0bGV0IG1vZGFsRWxlbWVudCA9ICQoJyNlZGl0TW9kYWwnLCAkKHRoaXMpKTtcblxuXHRcdGlmIChtb2RhbEVsZW1lbnQpXG5cdFx0e1xuXHRcdFx0Ly8gUmVtb3ZlIGxpc3RlbmVyc1xuXHRcdFx0JCgnI3NhdmVXb3JkRmlsZUJ1dHRvbicsIG1vZGFsRWxlbWVudCkub2ZmKCdjbGljaycpO1xuXHRcdFx0bW9kYWxFbGVtZW50Lm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cblx0XHRcdC8vIERlc3Ryb3kgZXZlcnl0aGluZyBLZW5kb1xuXHRcdFx0a2VuZG8uZGVzdHJveShtb2RhbEVsZW1lbnQpO1xuXG5cdFx0XHQvLyBEaXNwb3NlIG1vZGFsXG5cdFx0XHRtb2RhbEVsZW1lbnQubW9kYWwoJ2Rpc3Bvc2UnKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIGh0bWxcblx0XHRcdG1vZGFsRWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdG1vZGFsRWxlbWVudCA9IG51bGw7XG5cdFx0fVxuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnd29yZHMtZmlsZXMtbWFuYWdlcicpKVxuXHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd3b3Jkcy1maWxlcy1tYW5hZ2VyJywgV29yZHNGaWxlc01hbmFnZXIpO1xuIiwiZXhwb3J0IGNsYXNzIFNpZGViYXJMYXlvdXQgZXh0ZW5kcyBIVE1MRWxlbWVudFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCk7XG5cblx0XHQvLyBBdHRhY2ggYSBzaGFkb3cgcm9vdFxuXHRcdGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZTogJ29wZW4nfSk7XG5cdFx0c2hhZG93Um9vdC5pbm5lckhUTUwgPSBgXG5cdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdDpob3N0IHtcblx0XHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRcdGZsZXgtZGlyZWN0aW9uOiByb3c7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRAbWVkaWEgKG1heC13aWR0aDogNTc1Ljk4cHgpIHtcblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQteHMpIDo6c2xvdHRlZCg6bm90KFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdFx0ICAgIH1cblxuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC14cykgOjpzbG90dGVkKFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkge1xuXHRcdFx0XHRcdFx0ZmxleC1ncm93OiAxO1xuXHRcdFx0XHQgICAgfVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0QG1lZGlhIChtYXgtd2lkdGg6IDc2Ny45OHB4KSB7XG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LXNtKSA6OnNsb3R0ZWQoOm5vdChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdCAgICB9XG5cblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQtc20pIDo6c2xvdHRlZChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pIHtcblx0XHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0ICAgIH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdEBtZWRpYSAobWF4LXdpZHRoOiA5OTEuOThweCkge1xuXHRcdFx0XHRcdDpob3N0KC5zcGxpdC1tZCkgOjpzbG90dGVkKDpub3QoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0XHQgICAgfVxuXG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LW1kKSA6OnNsb3R0ZWQoW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSB7XG5cdFx0XHRcdFx0XHRmbGV4LWdyb3c6IDE7XG5cdFx0XHRcdCAgICB9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRAbWVkaWEgKG1heC13aWR0aDogMTE5OS45OHB4KSB7XG5cdFx0XHRcdFx0Omhvc3QoLnNwbGl0LWxnKSA6OnNsb3R0ZWQoOm5vdChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdCAgICB9XG5cblx0XHRcdFx0XHQ6aG9zdCguc3BsaXQtbGcpIDo6c2xvdHRlZChbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pIHtcblx0XHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0ICAgIH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5zaWRlLWNvbDo6c2xvdHRlZCgqKSB7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQubWFpbi1jb2w6OnNsb3R0ZWQoKikge1xuXHRcdFx0XHRcdGZsZXgtZ3JvdzogMTtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblxuXHRcdFx0PHNsb3QgY2xhc3M9XCJzaWRlLWNvbFwiIG5hbWU9XCJzaWRlLWNvbHVtblwiPjwvc2xvdD5cblx0XHRcdDxzbG90IGNsYXNzPVwibWFpbi1jb2xcIiBuYW1lPVwibWFpbi1jb2x1bW5cIj48L3Nsb3Q+XG5cdFx0YDtcblxuXHRcdC8vIFNldCBpbml0aWFsIHNlbGVjdGlvblxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG5cdH1cblxuXHRnZXQgc2VsZWN0ZWRQYW5lbCgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRQYW5lbDtcblx0fVxuXG5cdHNldCBzZWxlY3RlZFBhbmVsKGVsZW1lbnQpIC8vICdzaWRlJyBvciAnbWFpbidcblx0e1xuXHRcdGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5wYXJlbnROb2RlID09IHRoaXMpXG5cdFx0e1xuXHRcdFx0dGhpcy5fc2VsZWN0ZWRQYW5lbCA9IGVsZW1lbnQ7XG5cblx0XHRcdGZvciAobGV0IGVsZW1lbnQgb2YgdGhpcy5jaGlsZHJlbilcblx0XHRcdHtcblx0XHRcdFx0aWYgKGVsZW1lbnQgPT0gdGhpcy5fc2VsZWN0ZWRQYW5lbClcblx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5lcnJvcignRWxlbWVudCBpcyBub3QgYSBjaGlsZCBvZiBTaWRlYmFyTGF5b3V0Jyk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IHNlbGVjdGVkSW5kZXgoKVxuXHR7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuaW5kZXhPZih0aGlzLl9zZWxlY3RlZFBhbmVsKTtcblx0fVxuXG5cdHNldCBzZWxlY3RlZEluZGV4KGluZGV4KVxuXHR7XG5cdFx0aWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jaGlsZHJlbltpbmRleF0gPT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignSW52YWxpZCBTaWRlYmFyTGF5b3V0IGluZGV4Jyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGVsZW1lbnQgPSB0aGlzLmNoaWxkcmVuW2luZGV4XTtcblx0XHRcdHRoaXMuc2VsZWN0ZWRQYW5lbCA9IGVsZW1lbnQ7XG5cdFx0fVxuXHR9XG59XG5cbi8vIERFRklORSBDT01QT05FTlRcbmlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzLmdldCgnc2lkZWJhci1sYXlvdXQnKSlcblx0d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc2lkZWJhci1sYXlvdXQnLCBTaWRlYmFyTGF5b3V0KTtcbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge1ZpZXdTdGFja30gZnJvbSAnLi4vY29tcG9uZW50cy92aWV3LXN0YWNrJztcbmltcG9ydCB7U2lkZWJhckxheW91dH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaWRlYmFyLWxheW91dCc7XG5pbXBvcnQge0NvbmZpZ0ludGVyZmFjZUJ1aWxkZXJ9IGZyb20gJy4uL3V0aWxzL3VpYnVpbGRlci9jb25maWctaW50ZXJmYWNlLWJ1aWxkZXInO1xuaW1wb3J0IHtjYXBpdGFsaXplRmlyc3QsIGZpbHRlckNsYXNzTmFtZX0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcbmltcG9ydCB7V29yZHNGaWxlc01hbmFnZXJ9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kdWxlLXNwZWNpZmljL3dvcmRzLWZpbGVzLW1hbmFnZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBab25lQ29uZmlndXJhdG9yIGV4dGVuZHMgQmFzZU1vZHVsZVxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCd6b25lQ29uZmlnJyk7XG5cblx0XHR0aGlzLklURU1fVFlQRV9aT05FID0gJ3pvbmUnO1xuXHRcdHRoaXMuSVRFTV9UWVBFX1JPT00gPSAncm9vbSc7XG5cblx0XHQvLyBPdXRnb2luZyByZXF1ZXN0c1xuXHRcdHRoaXMuUkVRX0dFVF9aT05FUyA9ICdnZXRab25lcyc7XG5cblx0XHR0aGlzLlJFUV9HRVRfWk9ORV9DT05GSUcgPSAnZ2V0Wm9uZUNvbmZpZyc7XG5cdFx0dGhpcy5SRVFfU0FWRV9aT05FX0NPTkZJRyA9ICdzYXZlWm9uZUNvbmZpZyc7XG5cdFx0dGhpcy5SRVFfTkVXX1pPTkVfQ09ORklHID0gJ25ld1pvbmVDb25maWcnO1xuXHRcdHRoaXMuUkVRX0RFTEVURV9aT05FX0NPTkZJRyA9ICdkZWxab25lQ29uZmlnJztcblx0XHR0aGlzLlJFUV9BQ1RJVkFURV9aT05FID0gJ2FjdFpvbmUnO1xuXG5cdFx0dGhpcy5SRVFfR0VUX1JPT01fQ09ORklHID0gJ2dldFJvb21Db25maWcnO1xuXHRcdHRoaXMuUkVRX1NBVkVfUk9PTV9DT05GSUcgPSAnc2F2ZVJvb21Db25maWcnO1xuXHRcdHRoaXMuUkVRX05FV19ST09NX0NPTkZJRyA9ICduZXdSb29tQ29uZmlnJztcblx0XHR0aGlzLlJFUV9ERUxFVEVfUk9PTV9DT05GSUcgPSAnZGVsUm9vbUNvbmZpZyc7XG5cblx0XHR0aGlzLlJFUV9SRUZSRVNIX1dPUkRTX0ZJTEUgPSAncmVmcmVzaFdvcmRzRmlsZXMnO1xuXHRcdHRoaXMuUkVRX0VESVRfV09SRFNfRklMRSA9ICdlZGl0V29yZHNGaWxlJztcblx0XHR0aGlzLlJFUV9TQVZFX1dPUkRTX0ZJTEUgPSAnc2F2ZVdvcmRzRmlsZSc7XG5cdFx0dGhpcy5SRVFfREVMRVRFX1dPUkRTX0ZJTEUgPSAnZGVsV29yZHNGaWxlJztcblxuXHRcdC8vIEluY29taW5nIHJlc3BvbnNlc1xuXHRcdHRoaXMuUkVTUF9aT05FUyA9ICd6b25lcyc7XG5cblx0XHR0aGlzLlJFU1BfWk9ORV9DT05GSUcgPSAnem9uZUNvbmZpZyc7XG5cdFx0dGhpcy5SRVNQX1pPTkVfQ09ORklHX1VQREFURV9DT05GSVJNID0gJ3pvbmVDZmdVcGQnO1xuXHRcdHRoaXMuUkVTUF9aT05FX0FEREVEID0gJ3pvbmVBZGRlZCc7XG5cdFx0dGhpcy5SRVNQX1pPTkVfUkVGVVNFRCA9ICd6b25lUmVmdXNlZCc7XG5cdFx0dGhpcy5SRVNQX1pPTkVfREVMRVRFRCA9ICd6b25lRGVsJztcblx0XHR0aGlzLlJFU1BfWk9ORV9BQ1RJVkFURUQgPSAnem9uZUFjdCc7XG5cdFx0dGhpcy5SRVNQX1pPTkVfQUNUSVZBVElPTl9FUlJPUiA9ICd6b25lQWN0RXJyJztcblxuXHRcdHRoaXMuUkVTUF9ST09NX0NPTkZJRyA9ICdyb29tQ29uZmlnJztcblx0XHR0aGlzLlJFU1BfUk9PTV9DT05GSUdfVVBEQVRFX0NPTkZJUk0gPSAncm9vbUNmZ1VwZCc7XG5cdFx0dGhpcy5SRVNQX1JPT01fQURERUQgPSAncm9vbUFkZGVkJztcblx0XHR0aGlzLlJFU1BfUk9PTV9SRUZVU0VEID0gJ3Jvb21SZWZ1c2VkJztcblx0XHR0aGlzLlJFU1BfUk9PTV9ERUxFVEVEID0gJ3Jvb21EZWwnO1xuXG5cdFx0dGhpcy5SRVNQX1JFRlJFU0hfV09SRFNfRklMRVMgPSAncmVmcmVzaFdvcmRzRmlsZXMnO1xuXHRcdHRoaXMuUkVTUF9XT1JEU19GSUxFX0NPTlRFTlQgPSAnd29yZHNGaWxlJztcblx0XHR0aGlzLlJFU1BfV09SRFNfRklMRV9FUlJPUiA9ICd3b3Jkc0ZpbGVFcnInO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLyBUaGlzIG1ldGhvZHMgb3ZlcnJpZGUgdGhvc2UgaW4gQmFzZU1vZHVsZSBjbGFzcy5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRpbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5pbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKTtcblxuXHRcdC8vIENyZWF0ZSBpbnRlcmZhY2UgYnVpbGRlciBpbnN0YW5jZVxuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIgPSBuZXcgQ29uZmlnSW50ZXJmYWNlQnVpbGRlcigpO1xuXG5cdFx0Ly8gU2V0IGxpc3RlbmVyIGZvciBjdXN0b20gYWN0aW9ucyB0cmlnZ2VyZWQgYnkgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHQkKCcjem5jLXRhYk5hdmlnYXRvcicpLm9uKCd2YWx1ZS1zZXQnLCAkLnByb3h5KHRoaXMuX29uQ29uZmlnVmFsdWVTZXQsIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgWm9uZXMvUm9vbXMgdHJlZXZpZXdcblx0XHR0aGlzLl90cmVldmlldyA9ICQoJyN6bmMtdHJlZVZpZXcnKS5rZW5kb1RyZWVWaWV3KHtcblx0XHRcdGxvYWRPbkRlbWFuZDogZmFsc2UsXG5cdFx0XHRkYXRhVGV4dEZpZWxkOiAnbmFtZScsXG5cdFx0XHR0ZW1wbGF0ZToga2VuZG8udGVtcGxhdGUoJzxzcGFuIGNsYXNzPVwiIyBpZiAoIWl0ZW0uYWN0aXZlKSB7ICMgaW5hY3RpdmUtbGlzdC1pdGVtICMgfSAjXCI+IzogaXRlbS5uYW1lICM8L3NwYW4+JyksXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25ab25lUm9vbUNoYW5nZSwgdGhpcyksXG5cdFx0fSkuZGF0YSgna2VuZG9UcmVlVmlldycpO1xuXG5cdFx0Ly8gTGlzdGVuIHRvIHRyZWV2aWV3IGRvdWJsZS1jbGljayBldmVudFxuXHRcdCQoJyN6bmMtdHJlZVZpZXcnKS5vbignZGJsY2xpY2snLCAkLnByb3h5KHRoaXMuX29uVHJlZUl0ZW1Eb3VibGVDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gUmVxdWVzdCB6b25lcyAmIHJvb21zIGxpc3QgdG8gc2VydmVyIGluc3RhbmNlXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfWk9ORVMpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJcblx0XHQkKCcjem5jLXByb2dyZXNzQmFyJykua2VuZG9Qcm9ncmVzc0Jhcih7XG5cdFx0XHRtaW46IDAsXG4gICAgICAgICAgICBtYXg6IDEwMCxcblx0XHRcdHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsXG4gICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNDAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byB1dGlsaXR5IGJ1dHRvbnNcblx0XHQkKCcjem5jLWFkZFpvbmVCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQWRkWm9uZUNsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI3puYy1hZGRSb29tQnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZFJvb21DbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bmMtZWRpdEJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25FZGl0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5jLXJlbW92ZUJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVDbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bmMtYWN0aXZhdGVCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQWN0aXZhdGVDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIGludGVyZmFjZSBidXR0b25zXG5cdFx0JCgnI3puYy1jYW5jZWxCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2FuY2VsQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjem5jLXJlbG9hZEJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWxvYWRDbGljaywgdGhpcykpO1xuXHRcdCQoJyN6bmMtc3VibWl0QnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblN1Ym1pdENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBTYXZlIHJlZiB0byB3b3JkcyBmaWxlcyBtYW5hZ2VyIGFuZCBhZGQgY3VzdG9tIGV2ZW50IGxpc3RlbmVyc1xuXHRcdHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3puYy13b3Jkc0ZpbGVzTWFuYWdlcicpO1xuXHRcdCQodGhpcy5fd29yZHNGaWxlc01hbmFnZXIpLm9uKHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLlJFRlJFU0hfV09SRFNfRklMRVNfQ0xJQ0tfRVZFTlQsICQucHJveHkodGhpcy5fb25Xb3Jkc0ZpbGVSZWxvYWRDbGljaywgdGhpcykpO1xuXHRcdCQodGhpcy5fd29yZHNGaWxlc01hbmFnZXIpLm9uKHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLkVESVRfV09SRFNfRklMRV9DTElDS19FVkVOVCwgJC5wcm94eSh0aGlzLl9vbldvcmRzRmlsZUVkaXRDbGljaywgdGhpcykpO1xuXHRcdCQodGhpcy5fd29yZHNGaWxlc01hbmFnZXIpLm9uKHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLlNBVkVfV09SRFNfRklMRV9DTElDS19FVkVOVCwgJC5wcm94eSh0aGlzLl9vbldvcmRzRmlsZVNhdmVDbGljaywgdGhpcykpO1xuXHRcdCQodGhpcy5fd29yZHNGaWxlc01hbmFnZXIpLm9uKHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLlJFTU9WRV9XT1JEU19GSUxFX0NMSUNLX0VWRU5ULCAkLnByb3h5KHRoaXMuX29uV29yZHNGaWxlUmVtb3ZlQ2xpY2ssIHRoaXMpKTtcblx0XHQkKHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyKS5vbih0aGlzLl93b3Jkc0ZpbGVzTWFuYWdlci5BU1NJR05fV09SRFNfRklMRV9DTElDS19FVkVOVCwgJC5wcm94eSh0aGlzLl9vbldvcmRzRmlsZUFzc2lnbkNsaWNrLCB0aGlzKSk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIHRyZWUgdmlldyBkb3VibGVjbGljayBsaXN0ZW5lclxuXHRcdCQoJyN6bmMtdHJlZVZpZXcnKS5vZmYoJ2RibGNsaWNrJyk7XG5cblx0XHQvLyBSZW1vdmUgbGlzdGVuZXIgZm9yIGN1c3RvbSBhY3Rpb25zIHRyaWdnZXJlZCBieSBjb25maWd1cmF0aW9uIGludGVyZmFjZVxuXHRcdCQoJyN6bmMtdGFiTmF2aWdhdG9yJykub2ZmKCd2YWx1ZS1zZXQnKTtcblxuXHRcdC8vIFJlbW92ZSBsaXN0ZW5lciBmb3Igem9uZS9yb29tIGFjdGl2YXRpb24gZXZlbnRcblx0XHQkKCcjem5jLWFkZFpvbmVCdXR0b24nKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI3puYy1hZGRSb29tQnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bmMtZWRpdEJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5jLXJlbW92ZUJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjem5jLWFjdGl2YXRlQnV0dG9uJykub2ZmKCdjbGljaycpO1xuXG5cdFx0Ly8gUmVtb3ZlIGludGVyZmFjZSBidXR0b25zIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyN6bmMtY2FuY2VsQnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bmMtcmVsb2FkQnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyN6bmMtc3VibWl0QnV0dG9uJykub2ZmKCdjbGljaycpO1xuXG5cdFx0Ly8gUmVtb3ZlIGxpc3RlbmVycyB0byB3b3JkcyBmaWxlcyBtYW5hZ2VyXG5cdFx0JCh0aGlzLl93b3Jkc0ZpbGVzTWFuYWdlcikub2ZmKHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLlJFRlJFU0hfV09SRFNfRklMRVNfQ0xJQ0tfRVZFTlQpO1xuXHRcdCQodGhpcy5fd29yZHNGaWxlc01hbmFnZXIpLm9mZih0aGlzLl93b3Jkc0ZpbGVzTWFuYWdlci5FRElUX1dPUkRTX0ZJTEVfQ0xJQ0tfRVZFTlQpO1xuXHRcdCQodGhpcy5fd29yZHNGaWxlc01hbmFnZXIpLm9mZih0aGlzLl93b3Jkc0ZpbGVzTWFuYWdlci5TQVZFX1dPUkRTX0ZJTEVfQ0xJQ0tfRVZFTlQpO1xuXHRcdCQodGhpcy5fd29yZHNGaWxlc01hbmFnZXIpLm9mZih0aGlzLl93b3Jkc0ZpbGVzTWFuYWdlci5SRU1PVkVfV09SRFNfRklMRV9DTElDS19FVkVOVCk7XG5cdFx0JCh0aGlzLl93b3Jkc0ZpbGVzTWFuYWdlcikub2ZmKHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLkFTU0lHTl9XT1JEU19GSUxFX0NMSUNLX0VWRU5UKTtcblxuXHRcdC8vIENsZWFyIHRhYnMgY29udGFpbmVyXG5cdFx0dGhpcy5fY2xlYXJUYWJzKCk7XG5cdH1cblxuXHRvbkV4dGVuc2lvbkNvbW1hbmQoY29tbWFuZCwgZGF0YSlcblx0e1xuXHRcdGNvbnN0IHVzZXJuYW1lID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3VzZXInKTtcblxuXHRcdC8qKioqKiogWk9ORVMgJiBST09NUyAqKioqKiovXG5cblx0XHQvLyBab25lcyAmIHJvb21zIGxpc3QgcmVjZWl2ZWRcblx0XHRpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfWk9ORVMpXG5cdFx0XHR0aGlzLl9wb3B1bGF0ZVRyZWUoZGF0YSk7XG5cblx0XHQvLyBab25lIG9yIHJvb20gY29uZmlndXJhdGlvbiBkYXRhIHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfWk9ORV9DT05GSUcgfHwgY29tbWFuZCA9PSB0aGlzLlJFU1BfUk9PTV9DT05GSUcpXG5cdFx0e1xuXHRcdFx0Ly8gQnVpbGQgdXNlciBpbnRlcmZhY2UgYmFzZWQgb24gcmVjZWl2ZWQgZGF0YVxuXHRcdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5idWlsZEludGVyZmFjZShkYXRhLmdldFNGU0FycmF5KCdzZXR0aW5ncycpLCAnem5jLXRhYk5hdmlnYXRvcicsIGZhbHNlKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHNjcm9sbGluZyB0YWJzIChpZiBuZWVkZWQpXG5cdFx0XHRpZiAodGhpcy5fcmVpbml0VGFicylcblx0XHRcdHtcblx0XHRcdFx0JCgnI3puYy10YWJOYXZpZ2F0b3IgI3RhYnMnKS5zY3JvbGxpbmdUYWJzKHtcblx0XHRcdFx0XHRib290c3RyYXBWZXJzaW9uOiA0LFxuXHRcdFx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdFx0XHRlbmFibGVTd2lwaW5nOiB0cnVlLFxuXHRcdFx0XHRcdGRpc2FibGVTY3JvbGxBcnJvd3NPbkZ1bGx5U2Nyb2xsZWQ6IHRydWUsXG5cdFx0XHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0XHRcdGNzc0NsYXNzUmlnaHRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVDb25maWdJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0LyoqKioqKiBaT05FUyAqKioqKiovXG5cblx0XHQvLyBab25lIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGNvbmZpcm1hdGlvblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVfQ09ORklHX1VQREFURV9DT05GSVJNKVxuXHRcdHtcblx0XHRcdC8vIElmIGEgJ25hbWUnIHBhcmFtZXRlciBpcyByZWNlaXZlZCwgaXQgbWVhbnMgdGhlIHpvbmUgbmFtZSBjaGFuZ2VkLCBhbmQgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIHpvbmVzIGxpc3Rcblx0XHRcdGlmIChkYXRhLmdldFV0ZlN0cmluZygnek5hbWUnKSAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLl91cGRhdGVab25lTmFtZUluTGlzdChkYXRhLmdldEludCgneklkJyksIGRhdGEuZ2V0VXRmU3RyaW5nKCd6TmFtZScpKTtcblxuXHRcdFx0Ly8gSWYgdGhlIGN1cnJlbnQgdXNlciBpcyB0aGUgdXBkYXRlciwgc2hvdyBhIG5vdGlmaWNhdGlvbjsgb3RoZXJ3aXNlLCBzaG93IGEgZGlhbG9nIGJveCBzdWdnZXN0aW5nIHRvIHJlbG9hZFxuXHRcdFx0aWYgKHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdFx0dGhpcy5fZW5hYmxlQ29uZmlnSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgbW9kaWZpZWQnLCBgWm9uZSBzZXR0aW5ncyB1cGRhdGVkIHN1Y2Nlc3NmdWxseTsgY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQgb24gbmV4dCA8c3Ryb25nPnNlcnZlciByZXN0YXJ0PC9zdHJvbmc+YCk7XG5cblx0XHRcdFx0Ly8gUmVzZXQgdGhlICdtb2RpZmllZCcgZmxhZ1xuXHRcdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0SXNNb2RpZmllZCgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBbiBhbGVydCBib3ggaXMgZGlzcGxheWVkIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBlZGl0aW5nIHRoZSBzYW1lIHpvbmVcblx0XHRcdFx0aWYgKGRhdGEuZ2V0SW50KCd6SWQnKSA9PSB0aGlzLl9lZGl0ZWRab25lSWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBtb2RpZmllZCB0aGUgWm9uZSB5b3UgYXJlIGN1cnJlbnRseSBlZGl0aW5nOyBwbGVhc2UgcmVsb2FkIHRvIHVwZGF0ZSB5b3VyIHZpZXcuYCk7XG5cblx0XHRcdFx0XHQvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b25cblx0XHRcdFx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHRpZiAoZGF0YS5nZXRVdGZTdHJpbmcoJ3pOYW1lJykgIT0gbnVsbClcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgcmVuYW1lZCcsIGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBjaGFuZ2VkIHRoZSBuYW1lIG9uIG9uZSBvZiB0aGUgWm9uZXNgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE5ldyB6b25lIGFkZGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfWk9ORV9BRERFRClcblx0XHR7XG5cdFx0XHRjb25zdCB6b25lTmFtZSA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCd6b25lJykuZ2V0VXRmU3RyaW5nKCduYW1lJyk7XG5cblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHVzZXIgaXMgdGhlIHVwZGF0ZXIsIHJlc2V0IHRoZSBpbnRlcmZhY2U7IG90aGVyd2lzZSwganVzdCBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAodXNlcm5hbWUgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmVzZXQgaW50ZXJmYWNlXG5cdFx0XHRcdHRoaXMuX29uQ2FuY2VsQ2xpY2soKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdab25lIGFkZGVkJywgYFpvbmUgJyR7em9uZU5hbWV9JyBjcmVhdGVkIHN1Y2Nlc3NmdWxseWApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdab25lIGFkZGVkJywgYEFkbWluaXN0cmF0b3IgJHt1c2VybmFtZX0gY3JlYXRlZCBab25lICcke3pvbmVOYW1lfSdgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG5ldyB6b25lIHRvIHRyZWVcblx0XHRcdGxldCB6b25lc0RTID0gdGhpcy5fdHJlZXZpZXcuZGF0YVNvdXJjZTtcblx0XHRcdHpvbmVzRFMuYWRkKHRoaXMuX2NyZWF0ZVpvbmVPYmplY3QoZGF0YS5nZXRTRlNPYmplY3QoJ3pvbmUnKSkpO1xuXHRcdFx0em9uZXNEUy5zeW5jKCk7XG5cdFx0fVxuXG5cdFx0Ly8gTmV3IHpvbmUgY3JlYXRpb24gcmVmdXNlZCBkdWUgdG8gaW52YWxpZCB6b25lIG5hbWVcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9aT05FX1JFRlVTRUQpXG5cdFx0e1xuXHRcdFx0Ly8gUmUtZW5hYmxlIGludGVyZmFjZVxuXHRcdFx0dGhpcy5fZW5hYmxlQ29uZmlnSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHQvLyBTaG93IHdhcm5pbmdcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnWm9uZSBjb25maWd1cmF0aW9uIGNhblxcJ3QgYmUgc2F2ZWQgYmVjYXVzZSBhbm90aGVyIFpvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLicsIHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIEV4aXN0aW5nIHpvbmUgZGVsZXRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVfREVMRVRFRClcblx0XHR7XG5cdFx0XHQvLyBJZiB0aGUgY3VycmVudCB1c2VyIGlzIHRoZSBkZWxldGVyLCByZXNldCB0aGUgaW50ZXJmYWNlOyBvdGhlcndpc2UsIGp1c3Qgc2hvdyBhIG5vdGlmaWNhdGlvblxuXHRcdFx0aWYgKHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJlLWVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdFx0dGhpcy5fZW5hYmxlTGlzdEludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdab25lIHJlbW92ZWQnLCBgWm9uZSAnJHtkYXRhLmdldFV0ZlN0cmluZygnek5hbWUnKX0nIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEFuIGFsZXJ0IGJveCBpcyBkaXNwbGF5ZWQgaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IGVkaXRpbmcgdGhlIHNhbWUgem9uZVxuXHRcdFx0XHRpZiAoZGF0YS5nZXRJbnQoJ3pJZCcpID09IHRoaXMuX2VkaXRlZFpvbmVJZClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoYEFkbWluaXN0cmF0b3IgJHt1c2VybmFtZX0gaGFzIGRlbGV0ZWQgdGhlIFpvbmUgeW91IGFyZSBjdXJyZW50bHkgbW9kaWZ5aW5nOyB5b3UgaGF2ZSB0byBjYW5jZWwgeW91ciBlZGl0aW5nLmApO1xuXG5cdFx0XHRcdFx0Ly8gRGlzYWJsZSBzdWJtaXQgYW5kIHJlbG9hZCBidXR0b25zXG5cdFx0XHRcdFx0JCgnI3puYy1yZWxvYWRCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdFx0XHRcdCQoJyN6bmMtc3VibWl0QnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgcmVtb3ZlZCcsIGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGRlbGV0ZWQgWm9uZSAnJHtkYXRhLmdldFV0ZlN0cmluZygnek5hbWUnKX0nYCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzZXQgc2VsZWN0aW9uIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBpdHMgcGFyZW50IGlzIGJlaW5nIHJlbW92ZWRcblx0XHRcdGxldCBzZWxlY3RlZE5vZGUgPSB0aGlzLl90cmVldmlldy5zZWxlY3QoKTtcblx0XHRcdGxldCBzZWxlY3RlZERhdGFJdGVtID0gdGhpcy5fdHJlZXZpZXcuZGF0YUl0ZW0oc2VsZWN0ZWROb2RlKTtcblx0XHRcdGlmIChzZWxlY3RlZERhdGFJdGVtKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoc2VsZWN0ZWREYXRhSXRlbS50eXBlID09IHRoaXMuSVRFTV9UWVBFX1pPTkUgJiYgc2VsZWN0ZWREYXRhSXRlbS5pZCA9PSBkYXRhLmdldEludCgneklkJykpXG5cdFx0XHRcdFx0dGhpcy5fZGVzZWxlY3RUcmVlSXRlbSgpO1xuXG5cdFx0XHRcdGlmIChzZWxlY3RlZERhdGFJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfUk9PTSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBwYXJlbnREYXRhSXRlbSA9IHRoaXMuX3RyZWV2aWV3LmRhdGFJdGVtKHRoaXMuX3RyZWV2aWV3LnBhcmVudChzZWxlY3RlZE5vZGUpKTtcblxuXHRcdFx0XHRcdGlmIChwYXJlbnREYXRhSXRlbS5pZCA9PSBkYXRhLmdldEludCgneklkJykpXG5cdFx0XHRcdFx0XHR0aGlzLl9kZXNlbGVjdFRyZWVJdGVtKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIHpvbmUgZnJvbSB0cmVlXG5cdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl9nZXRab25lRGF0YUl0ZW1CeUlkKGRhdGEuZ2V0SW50KCd6SWQnKSk7XG5cdFx0XHRsZXQgem9uZXNEUyA9IHRoaXMuX3RyZWV2aWV3LmRhdGFTb3VyY2U7XG5cdFx0XHR6b25lc0RTLnJlbW92ZShkYXRhSXRlbSk7XG5cdFx0XHR6b25lc0RTLnN5bmMoKTtcblx0XHR9XG5cblx0XHQvLyBab25lIGFjdGl2YXRlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVfQUNUSVZBVEVEKVxuXHRcdHtcblx0XHRcdC8vIFNldCB6b25lIGFjdGl2YXRpb24gc3RhdHVzXG5cdFx0XHRjb25zdCB6b25lTmFtZSA9IHRoaXMuX3NldFpvbmVBY3RpdmF0aW9uU3RhdHVzKGRhdGEuZ2V0SW50KCd6SWQnKSwgZGF0YS5nZXRVdGZTdHJpbmcoJ2FjdFJvb21zJyksIHRydWUpO1xuXG5cdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0aWYgKHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgYWN0aXZhdGVkJywgYFpvbmUgJyR7em9uZU5hbWV9JyBhY3RpdmF0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1pvbmUgYWN0aXZhdGVkJywgYEFkbWluaXN0cmF0b3IgJHt1c2VybmFtZX0gYWN0aXZhdGVkIFpvbmUgJyR7em9uZU5hbWV9J2ApO1xuXHRcdH1cblxuXHRcdC8vIFpvbmUgYWN0aXZhdGlvbiBlcnJvclxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVfQUNUSVZBVElPTl9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBTZXQgem9uZSBhY3RpdmF0aW9uIHN0YXR1c1xuXHRcdFx0dGhpcy5fc2V0Wm9uZUFjdGl2YXRpb25TdGF0dXMoZGF0YS5nZXRJbnQoJ3pJZCcpLCAnJywgZmFsc2UpO1xuXG5cdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoZGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJyksIHRydWUpO1xuXHRcdH1cblxuXHRcdC8qKioqKiogUk9PTVMgKioqKioqL1xuXG5cdFx0Ly8gUm9vbSBjb25maWd1cmF0aW9uIHVwZGF0ZSBjb25maXJtYXRpb25cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0NPTkZJR19VUERBVEVfQ09ORklSTSlcblx0XHR7XG5cdFx0XHRpZiAoZGF0YS5nZXRVdGZTdHJpbmcoJ3JOYW1lJykgIT0gbnVsbClcblx0XHRcdFx0dGhpcy5fdXBkYXRlUm9vbU5hbWVJbkxpc3QoZGF0YS5nZXRJbnQoJ3pJZCcpLCBkYXRhLmdldEludCgncklkJyksIGRhdGEuZ2V0VXRmU3RyaW5nKCdyTmFtZScpKTtcblxuXHRcdFx0Ly8gSWYgdGhlIGN1cnJlbnQgdXNlciBpcyB0aGUgdXBkYXRlciwgc2hvdyBhIG5vdGlmaWNhdGlvbjsgb3RoZXJ3aXNlLCBzaG93IGEgZGlhbG9nIGJveCBzdWdnZXN0aW5nIHRvIHJlbG9hZFxuXHRcdFx0aWYgKHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdFx0dGhpcy5fZW5hYmxlQ29uZmlnSW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1Jvb20gbW9kaWZpZWQnLCBgUm9vbSBzZXR0aW5ncyB1cGRhdGVkIHN1Y2Nlc3NmdWxseTsgY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQgb24gbmV4dCA8c3Ryb25nPnNlcnZlciByZXN0YXJ0PC9zdHJvbmc+YCk7XG5cblx0XHRcdFx0Ly8gUmVzZXQgdGhlICdtb2RpZmllZCcgZmxhZ1xuXHRcdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0SXNNb2RpZmllZCgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBbiBhbGVydCBib3ggaXMgZGlzcGxheWVkIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBlZGl0aW5nIHRoZSBzYW1lIHJvb21cblx0XHRcdFx0aWYgKGRhdGEuZ2V0SW50KCdySWQnKSA9PSB0aGlzLl9lZGl0ZWRSb29tSWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBtb2RpZmllZCB0aGUgUm9vbSB5b3UgYXJlIGN1cnJlbnRseSBlZGl0aW5nOyBwbGVhc2UgcmVsb2FkIHRvIHVwZGF0ZSB5b3VyIHZpZXcuYCk7XG5cblx0XHRcdFx0XHQvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b25cblx0XHRcdFx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHRpZiAoZGF0YS5nZXRVdGZTdHJpbmcoJ3JOYW1lJykgIT0gbnVsbClcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1Jvb20gcmVuYW1lZCcsIGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBjaGFuZ2VkIHRoZSBuYW1lIG9uIG9uZSBvZiB0aGUgUm9vbXNgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE5ldyByb29tIGFkZGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUk9PTV9BRERFRClcblx0XHR7XG5cdFx0XHRjb25zdCByb29tRGF0YSA9IGRhdGEuZ2V0U0ZTT2JqZWN0KCdyb29tJyk7XG5cdFx0XHRjb25zdCB6b25lSWQgPSBkYXRhLmdldEludCgneklkJyk7XG5cblx0XHRcdGxldCB6b25lc0RTID0gdGhpcy5fdHJlZXZpZXcuZGF0YVNvdXJjZTtcblx0XHRcdGxldCB6b25lSXRlbSA9IHpvbmVzRFMuZ2V0KHpvbmVJZCk7XG5cblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHVzZXIgaXMgdGhlIHVwZGF0ZXIsIHJlc2V0IHRoZSBpbnRlcmZhY2U7IG90aGVyd2lzZSwganVzdCBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAodXNlcm5hbWUgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmVzZXQgaW50ZXJmYWNlXG5cdFx0XHRcdHRoaXMuX29uQ2FuY2VsQ2xpY2soKTtcblxuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdSb29tIGFkZGVkJywgYFJvb20gJyR7cm9vbURhdGEuZ2V0VXRmU3RyaW5nKCduYW1lJyl9JyBjcmVhdGVkIHN1Y2Nlc3NmdWxseWApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdSb29tIGFkZGVkJywgYEFkbWluaXN0cmF0b3IgJHt1c2VybmFtZX0gY3JlYXRlZCBSb29tICcke3Jvb21EYXRhLmdldFV0ZlN0cmluZygnbmFtZScpfScgaW4gWm9uZSAnJHt6b25lSXRlbS5uYW1lfSdgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG5ldyByb29tIHRvIHRyZWVcblx0XHRcdHpvbmVJdGVtLmFwcGVuZCh0aGlzLl9jcmVhdGVSb29tT2JqZWN0KHJvb21EYXRhLCB6b25lSWQpKTtcblx0XHRcdHpvbmVzRFMuc3luYygpO1xuXG5cdFx0XHQvLyBFeHBhbmQgem9uZSBub2RlIHdoZXJlIHJvb20gd2FzIGFkZGVkXG5cdFx0XHR0aGlzLl90cmVldmlldy5leHBhbmQodGhpcy5fdHJlZXZpZXcuc2VsZWN0KCkpO1xuXHRcdH1cblxuXHRcdC8vIE5ldyByb29tIGNyZWF0aW9uIHJlZnVzZWQgZHVlIHRvIGludmFsaWQgcm9vbSBuYW1lXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUk9PTV9SRUZVU0VEKVxuXHRcdHtcblx0XHRcdC8vIFJlLWVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUNvbmZpZ0ludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0Ly8gU2hvdyB3YXJuaW5nXG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1Jvb20gY29uZmlndXJhdGlvbiBjYW5cXCd0IGJlIHNhdmVkIGJlY2F1c2UgYW5vdGhlciBSb29tIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBFeGlzdGluZyByb29tIGRlbGV0ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9ST09NX0RFTEVURUQpXG5cdFx0e1xuXHRcdFx0bGV0IHpvbmVJdGVtID0gdGhpcy5fZ2V0Wm9uZURhdGFJdGVtQnlJZChkYXRhLmdldEludCgneklkJykpO1xuXHRcdFx0bGV0IHJvb21JdGVtID0gdGhpcy5fZ2V0Um9vbURhdGFJdGVtQnlJZChkYXRhLmdldEludCgneklkJyksIGRhdGEuZ2V0SW50KCdySWQnKSk7XG5cblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHVzZXIgaXMgdGhlIGRlbGV0ZXIsIHJlc2V0IHRoZSBpbnRlcmZhY2U7IG90aGVyd2lzZSwganVzdCBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAodXNlcm5hbWUgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmUtZW5hYmxlIGludGVyZmFjZVxuXHRcdFx0XHR0aGlzLl9lbmFibGVMaXN0SW50ZXJmYWNlKHRydWUpO1xuXG5cdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oJ1Jvb20gcmVtb3ZlZCcsIGBSb29tICcke3Jvb21JdGVtLm5hbWV9JyBkZWxldGVkIHN1Y2Nlc3NmdWxseWApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBbiBhbGVydCBib3ggaXMgZGlzcGxheWVkIGlmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBlZGl0aW5nIHRoZSBzYW1lIHJvb21cblx0XHRcdFx0aWYgKGRhdGEuZ2V0SW50KCdySWQnKSA9PSB0aGlzLl9lZGl0ZWRSb29tSWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBTaG93IGFsZXJ0XG5cdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBkZWxldGVkIHRoZSBSb29tIHlvdSBhcmUgY3VycmVudGx5IG1vZGlmeWluZzsgeW91IGhhdmUgdG8gY2FuY2VsIHlvdXIgZWRpdGluZy5gKTtcblxuXHRcdFx0XHRcdC8vIERpc2FibGUgc3VibWl0IGFuZCByZWxvYWQgYnV0dG9uc1xuXHRcdFx0XHRcdCQoJyN6bmMtcmVsb2FkQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdFx0XHQkKCcjem5jLXN1Ym1pdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdSb29tIHJlbW92ZWQnLCBgQWRtaW5pc3RyYXRvciAke3VzZXJuYW1lfSBkZWxldGVkIFJvb20gJyR7cm9vbUl0ZW0ubmFtZX0nIGZyb20gWm9uZSAnJHt6b25lSXRlbS5uYW1lfSdgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNldCBzZWxlY3Rpb24gaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIGl0cyBwYXJlbnQgaXMgYmVpbmcgcmVtb3ZlZFxuXHRcdFx0bGV0IHNlbGVjdGVkTm9kZSA9IHRoaXMuX3RyZWV2aWV3LnNlbGVjdCgpO1xuXHRcdFx0bGV0IHNlbGVjdGVkRGF0YUl0ZW0gPSB0aGlzLl90cmVldmlldy5kYXRhSXRlbShzZWxlY3RlZE5vZGUpO1xuXHRcdFx0aWYgKHNlbGVjdGVkRGF0YUl0ZW0pXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChzZWxlY3RlZERhdGFJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfUk9PTSAmJiBzZWxlY3RlZERhdGFJdGVtLmlkID09IGRhdGEuZ2V0SW50KCdySWQnKSlcblx0XHRcdFx0XHR0aGlzLl9kZXNlbGVjdFRyZWVJdGVtKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSByb29tIGZyb20gdHJlZVxuXHRcdFx0em9uZUl0ZW0uY2hpbGRyZW4ucmVtb3ZlKHJvb21JdGVtKTtcblx0XHRcdHRoaXMuX3RyZWV2aWV3LmRhdGFTb3VyY2Uuc3luYygpO1xuXHRcdH1cblxuXHRcdC8qKioqKiogV09SRFMgRklMRVMgKioqKioqL1xuXG5cdFx0Ly8gV29yZHMgZmlsZXMgbGlzdCByZWNlaXZlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1JFRlJFU0hfV09SRFNfRklMRVMpXG5cdFx0e1xuXHRcdFx0dGhpcy5fd29yZHNGaWxlc01hbmFnZXIucmVmcmVzaFdvcmRzRmlsZXNMaXN0KGRhdGEuZ2V0U0ZTQXJyYXkoJ3dmJyksIHVzZXJuYW1lID09IHRoaXMuc21hcnRGb3gubXlTZWxmLm5hbWUpO1xuXG5cdFx0XHQvLyBJZiBhbm90aGVyIHVzZXIgY2F1c2VkIGEgcmVmcmVzaCAoZm9yIGV4YW1wbGUgZGVsZXRpbmcgYSBmaWxlLCBvciBhZGRpbmcgYSBuZXcgb25lKSBzaG93IGEgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAodXNlcm5hbWUgIT0gbnVsbCAmJiB1c2VybmFtZSAhPSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lICYmIHRoaXMuX2VkaXRlZFpvbmVJZCA+IC0xKVxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKCdXb3JkcyBmaWxlcyBtb2RpZmllZCcsIGBBZG1pbmlzdHJhdG9yICR7dXNlcm5hbWV9IGhhcyBhZGRlZCwgbW9kaWZpZWQgb3IgZGVsZXRlZCBhIHdvcmRzIGZpbGUuYCk7XG5cdFx0fVxuXG5cdFx0Ly8gV29yZHMgZmlsZSBjb250ZW50IHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfV09SRFNfRklMRV9DT05URU5UKVxuXHRcdHtcblx0XHRcdHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLmVkaXRXb3Jkc0ZpbGUoZGF0YS5nZXRVdGZTdHJpbmcoJ2ZpbGVuYW1lJyksIGRhdGEuZ2V0VGV4dCgnY29udGVudCcpKTtcblx0XHR9XG5cblx0XHQvLyBXb3JkcyBmaWxlIGVycm9yIChlZGl0L3NhdmUpXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfV09SRFNfRklMRV9FUlJPUilcblx0XHR7XG5cdFx0XHQvLyBFbmFibGUgYnV0dG9uc1xuXHRcdFx0dGhpcy5fd29yZHNGaWxlc01hbmFnZXIuZW5hYmxlZCA9IHRydWU7XG5cblx0XHRcdC8vIFNob3cgYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gZWxzZSBpZiAoKVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gVUkgRVZFTlQgTElTVEVORVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X29uVHJlZUl0ZW1Eb3VibGVDbGljayhlKVxuXHR7XG5cdFx0Ly8gR2V0IGV2ZW50IHRhcmdldCdzIGNsb3Nlc3QgdHJlZSBub2RlXG5cdFx0bGV0IHRyZWVOb2RlID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLmstaXRlbVtyb2xlPXRyZWVpdGVtXScpO1xuXG5cdFx0Ly8gR2V0IGFzc29jaWF0ZWQgZGF0YSBpdGVtXG5cdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fdHJlZXZpZXcuZGF0YUl0ZW0odHJlZU5vZGUpO1xuXG5cdFx0Ly8gTG9hZCBjb25maWd1cmF0aW9uXG5cdFx0dGhpcy5fbG9hZENvbmZpZ3VyYXRpb24oZGF0YUl0ZW0udHlwZSk7XG5cdH1cblxuXHRfb25ab25lUm9vbUNoYW5nZSgpXG5cdHtcblx0XHQvLyBSZXNldCB1dGlsaXR5IGJ1dHRvbnNcblx0XHR0aGlzLl9zZXRVdGlsaXR5QnV0dG9uc1N0YXRlKHRoaXMuX3NlbGVjdGVkSXRlbSk7XG5cdH1cblxuXHQvLyBVdGlsaXR5IGJ1dHRvbnMgbGlzdGVuZXJzXG5cblx0X29uQWRkWm9uZUNsaWNrKClcblx0e1xuXHRcdC8vIERlc2VsZWN0IGxpc3QgaXRlbVxuXHRcdHRoaXMuX2Rlc2VsZWN0VHJlZUl0ZW0oKTtcblxuXHRcdC8vIExvYWQgY29uZmlndXJhdGlvblxuXHRcdHRoaXMuX2xvYWRDb25maWd1cmF0aW9uKHRoaXMuSVRFTV9UWVBFX1pPTkUpO1xuXHR9XG5cblx0X29uQWRkUm9vbUNsaWNrKClcblx0e1xuXHRcdC8vIFNlbGVjdCBwYXJlbnQgbGlzdCBpdGVtXG5cdFx0dGhpcy5fc2VsZWN0UGFyZW50VHJlZUl0ZW0oKTtcblxuXHRcdC8vIExvYWQgY29uZmlndXJhdGlvblxuXHRcdHRoaXMuX2xvYWRDb25maWd1cmF0aW9uKHRoaXMuSVRFTV9UWVBFX1JPT00pO1xuXHR9XG5cblx0X29uRWRpdENsaWNrKClcblx0e1xuXHRcdC8vIExvYWQgY29uZmlndXJhdGlvblxuXHRcdHRoaXMuX2xvYWRDb25maWd1cmF0aW9uKHRoaXMuX3NlbGVjdGVkSXRlbS50eXBlKTtcblx0fVxuXG5cdF9vblJlbW92ZUNsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgJHt0aGlzLl9zZWxlY3RlZEl0ZW0udHlwZSA9PSB0aGlzLklURU1fVFlQRV9aT05FID8gJ1pvbmUnIDogJ1Jvb20nfSBjb25maWd1cmF0aW9uP2AsICQucHJveHkodGhpcy5fb25SZW1vdmVDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25SZW1vdmVDb25maXJtKClcblx0e1xuXHRcdC8vIERpc2FibGUgem9uZS9yb29tIHNlbGVjdGlvbiBsaXN0XG5cdFx0dGhpcy5fZW5hYmxlTGlzdEludGVyZmFjZShmYWxzZSk7XG5cblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0Ly8gUmVxdWVzdCB6b25lIHJlbW92YWxcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtLnR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfWk9ORSlcblx0XHR7XG5cdFx0XHRwYXJhbXMucHV0SW50KCd6SWQnLCB0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpO1xuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ERUxFVEVfWk9ORV9DT05GSUcsIHBhcmFtcyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRwYXJhbXMucHV0SW50KCd6SWQnLCB0aGlzLl9zZWxlY3RlZEl0ZW1QYXJlbnQuaWQpO1xuXHRcdFx0cGFyYW1zLnB1dEludCgncklkJywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfREVMRVRFX1JPT01fQ09ORklHLCBwYXJhbXMpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkFjdGl2YXRlQ2xpY2soKVxuXHR7XG5cdFx0Ly8gR2V0IHNlbGVjdGVkIGRhdGEgaXRlbVxuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0udHlwZSA9PSB0aGlzLklURU1fVFlQRV9aT05FKVxuXHRcdHtcblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRwYXJhbXMucHV0SW50KCd6SWQnLCB0aGlzLl9zZWxlY3RlZEl0ZW0uaWQpO1xuXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0FDVElWQVRFX1pPTkUsIHBhcmFtcyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29uZmlndXJhdGlvbiBidXR0b25zIGxpc3RlbmVyc1xuXG5cdF9vbkNhbmNlbENsaWNrKClcblx0e1xuXHRcdC8vIEVuYWJsZSB6b25lL3Jvb20gc2VsZWN0aW9uIGxpc3RzXG5cdFx0dGhpcy5fZW5hYmxlTGlzdEludGVyZmFjZSh0cnVlKTtcblxuXHRcdC8vIERpc2FibGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVDb25maWdJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gQ2xlYXIgbWFpbiBjb250YWluZXJcblx0XHR0aGlzLl9yZXNldFRhYnNDb250YWluZXIoZmFsc2UsIHRydWUpO1xuXG5cdFx0Ly8gU2V0IGlzRWRpdGluZyBmbGFnXG5cdFx0dGhpcy5faXNFZGl0aW5nID0gZmFsc2U7XG5cdFx0dGhpcy5fZWRpdGVkSXRlbVR5cGUgPSAnJztcblxuXHRcdC8vIFN3aXRjaCBwYW5lbFxuXHRcdHRoaXMuX3N3aXRjaFBhbmVsKCd6bmMtc2lkZWJhclBhbmVsJyk7XG5cdH1cblxuXHRfb25SZWxvYWRDbGljaygpXG5cdHtcblx0XHQvLyBIaWRlIHZhbGlkYXRpb24gbWVzc2FnZXNcblx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLnJlc2V0VmFsaWRhdGlvbigpO1xuXG5cdFx0Ly8gUmVsb2FkIGNvbmZpZ3VyYXRpb25cblx0XHR0aGlzLl9sb2FkQ29uZmlndXJhdGlvbih0aGlzLl9lZGl0ZWRJdGVtVHlwZSwgZmFsc2UpO1xuXHR9XG5cblx0X29uU3VibWl0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gQ2hlY2sgdmFsaWRpdHlcblx0XHRpZiAodGhpcy5faW50ZXJmYWNlQnVpbGRlci5jaGVja0lzVmFsaWQoKSlcblx0XHR7XG5cdFx0XHRsZXQgY2hhbmdlcyA9IHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZ2V0Q2hhbmdlZERhdGEoKTtcblxuXHRcdFx0aWYgKGNoYW5nZXMuc2l6ZSgpID4gMClcblx0XHRcdHtcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhjaGFuZ2VzLmdldER1bXAoKSlcblxuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSB6b25lL3Jvb20gbmFtZSBjaGFuZ2VkLCBjaGVjayBpdCBhZ2FpbnN0IHRoZSBsaXN0IChkdXBsaWNhdGUgbmFtZXMgbm90IGFsbG93ZWQhKVxuXHRcdFx0XHRpZiAodGhpcy5fdmFsaWRhdGVOYW1lKGNoYW5nZXMpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzYWJsZSBjb25maWd1cmF0aW9uIGludGVyZmFjZVxuXHRcdFx0XHRcdHRoaXMuX2VuYWJsZUNvbmZpZ0ludGVyZmFjZShmYWxzZSk7XG5cblx0XHRcdFx0XHQvLyBTZW5kIHNldHRpbmdzIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdFx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRcdFx0cGFyYW1zLnB1dFNGU0FycmF5KCdzZXR0aW5ncycsIGNoYW5nZXMpO1xuXHRcdFx0XHRcdHBhcmFtcy5wdXRCb29sKCdiYWNrdXAnLCAkKCcjem5jLWJhY2t1cENoZWNrJykucHJvcCgnY2hlY2tlZCcpKTtcblx0XHRcdFx0XHRwYXJhbXMucHV0SW50KCd6SWQnLCB0aGlzLl9lZGl0ZWRab25lSWQpO1xuXHRcdFx0XHRcdHBhcmFtcy5wdXRJbnQoJ3JJZCcsIHRoaXMuX2VkaXRlZFJvb21JZCk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5fZWRpdGVkSXRlbVR5cGUgPT0gdGhpcy5JVEVNX1RZUEVfWk9ORSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBTdWJtaXQgem9uZSBzZXR0aW5nc1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuX2VkaXRlZFpvbmVJZCA+IC0xKVxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1NBVkVfWk9ORV9DT05GSUcsIHBhcmFtcyk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfTkVXX1pPTkVfQ09ORklHLCBwYXJhbXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gU3VibWl0IHJvb20gc2V0dGluZ3Ncblx0XHRcdFx0XHRcdGlmICh0aGlzLl9lZGl0ZWRSb29tSWQgPiAtMSlcblx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9TQVZFX1JPT01fQ09ORklHLCBwYXJhbXMpO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX05FV19ST09NX0NPTkZJRywgcGFyYW1zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChgVW5hYmxlIHRvIHN1Ym1pdCBjb25maWd1cmF0aW9uIGJlY2F1c2UgdGhlICR7Y2FwaXRhbGl6ZUZpcnN0KHRoaXMuX2VkaXRlZEl0ZW1UeXBlKX0gbmFtZSBhbHJlYWR5IGV4aXN0czsgZHVwbGljYXRlIG5hbWVzIGFyZSBub3QgYWxsb3dlZC5gLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KCdVbmFibGUgdG8gc3VibWl0IGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBkdWUgdG8gYW4gaW52YWxpZCB2YWx1ZTsgcGxlYXNlIHZlcmlmeSB0aGUgaGlnaGxpZ2h0ZWQgZm9ybSBmaWVsZHMgaW4gYWxsIHRhYnMuJywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0X29uQ29uZmlnVmFsdWVTZXQoZSkgLy8gU0FNRSBNRVRIT0QgRFVQTElDQVRFRCBJTiB6b25lLW1vbml0b3IuanNcblx0e1xuXHRcdGNvbnN0IGNvbmZpZ1BhcmFtID0gZS50YXJnZXQuZGF0YTtcblxuXHRcdC8vIEhhbmRsZSBleHRlbnNpb24gbmFtZS90eXBlIGRyb3Bkb3ducyB1cGRhdGUgYW5kIHVwZGF0ZSB0aGUgbWFpbiBjbGFzcyBkcm9wZG93biBkYXRhc291cmNlIGFjY29yZGluZ2x5XG5cdFx0aWYgKGNvbmZpZ1BhcmFtLm5hbWUgPT0gJ2V4dGVuc2lvbi5uYW1lJyB8fCBjb25maWdQYXJhbS5uYW1lID09ICdleHRlbnNpb24udHlwZScgfHwgY29uZmlnUGFyYW0ubmFtZSA9PSAnZXh0ZW5zaW9uLmZpbHRlckNsYXNzJylcblx0XHR7XG5cdFx0XHQvLyBBbGwgaW52b2x2ZWQgQ29uZmlnRm9ybUl0ZW1zIG11c3QgYmUgYXZhaWxhYmxlIGFuZCBpbml0aWFsaXplZCB0byBwcm9jZWVkXG5cdFx0XHRjb25zdCBuYW1lRm9ybUl0ZW0gPSB0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmdldENvbmZpZ0Zvcm1JdGVtKCdleHRlbnNpb24ubmFtZScpO1xuXHRcdFx0Y29uc3QgdHlwZUZvcm1JdGVtID0gdGhpcy5faW50ZXJmYWNlQnVpbGRlci5nZXRDb25maWdGb3JtSXRlbSgnZXh0ZW5zaW9uLnR5cGUnKTtcblx0XHRcdGNvbnN0IGNsYXNzRm9ybUl0ZW0gPSB0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmdldENvbmZpZ0Zvcm1JdGVtKCdleHRlbnNpb24uZmlsZScpO1xuXHRcdFx0Y29uc3QgZmlsdGVyRm9ybUl0ZW0gPSB0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmdldENvbmZpZ0Zvcm1JdGVtKCdleHRlbnNpb24uZmlsdGVyQ2xhc3MnKTtcblxuXHRcdFx0aWYgKG5hbWVGb3JtSXRlbSAhPSBudWxsICYmIHR5cGVGb3JtSXRlbSAhPSBudWxsICYmIGNsYXNzRm9ybUl0ZW0gIT0gbnVsbCAmJiBmaWx0ZXJGb3JtSXRlbSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBzb3VyY2UgPSBuYW1lRm9ybUl0ZW0uZGF0YTtcblx0XHRcdFx0bGV0IGNsYXNzZXNMaXN0ID0gW107XG5cblx0XHRcdFx0bGV0IGRhdGEgPSBzb3VyY2UudHJpZ2dlckRhdGE7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBleHQgPSBkYXRhLmdldFNGU09iamVjdChpKTtcblxuXHRcdFx0XHRcdGlmIChleHQuZ2V0VXRmU3RyaW5nKCduYW1lJykgPT0gbmFtZUZvcm1JdGVtLmRhdGEudmFsdWUgJiYgZXh0LmdldFV0ZlN0cmluZygndHlwZScpID09IHR5cGVGb3JtSXRlbS5kYXRhLnZhbHVlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBjbGFzc2VzID0gZXh0LmdldFV0ZlN0cmluZygnY2xhc3Nlc1N0cmluZycpLnNwbGl0KCcsJyk7XG5cblx0XHRcdFx0XHRcdGlmIChmaWx0ZXJGb3JtSXRlbS5kYXRhLnZhbHVlID09IHRydWUpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBmaWx0ZXJlZENsYXNzZXMgPSBjbGFzc2VzLmZpbHRlcihmaWx0ZXJDbGFzc05hbWUpO1xuXHRcdFx0XHRcdFx0XHRjbGFzc2VzID0gZmlsdGVyZWRDbGFzc2VzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjbGFzc2VzTGlzdCA9IGNsYXNzZXNMaXN0LmNvbmNhdChjbGFzc2VzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgY3VycmVudENsYXNzID0gY2xhc3NGb3JtSXRlbS5kYXRhLnZhbHVlO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBjbGFzc2VzIGxpc3QgZG9lc24ndCBjb250YWluIHRoZSBjdXJyZW50IHZhbHVlLCBjcmVhdGUgYW4gZW1wdHkgZW50cnkgYW5kIHJlc2V0IHRoZSB2YWx1ZVxuXHRcdFx0XHRpZiAoY2xhc3Nlc0xpc3QuaW5kZXhPZihjdXJyZW50Q2xhc3MpIDwgMClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChjbGFzc2VzTGlzdC5sZW5ndGggPT0gMClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjbGFzc2VzTGlzdC5wdXNoKCcnKTtcblx0XHRcdFx0XHRcdGN1cnJlbnRDbGFzcyA9ICcnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRjdXJyZW50Q2xhc3MgPSBjbGFzc2VzTGlzdFswXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBtYWluQ2xhc3NEcm9wRG93biA9IGNsYXNzRm9ybUl0ZW0uX2lubmVyV2lkZ2V0O1xuXHRcdFx0XHRtYWluQ2xhc3NEcm9wRG93bi5zZXREYXRhU291cmNlKGNsYXNzZXNMaXN0KTtcblxuXHRcdFx0XHRjbGFzc0Zvcm1JdGVtLmRhdGEudmFsdWUgPSBjdXJyZW50Q2xhc3M7XG5cdFx0XHRcdGNsYXNzRm9ybUl0ZW0uX3NldFdpZGdldFZhbHVlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X29uV29yZHNGaWxlUmVsb2FkQ2xpY2soZXZ0KVxuXHR7XG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfUkVGUkVTSF9XT1JEU19GSUxFKTtcblx0fVxuXG5cdF9vbldvcmRzRmlsZUVkaXRDbGljayhldnQpXG5cdHtcblx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdmaWxlbmFtZScsIGV2dC5kZXRhaWwpO1xuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfRURJVF9XT1JEU19GSUxFLCBwYXJhbXMpO1xuXHR9XG5cblx0X29uV29yZHNGaWxlU2F2ZUNsaWNrKGV2dClcblx0e1xuXHRcdHRoaXMuX3RlbXBXb3Jkc0ZpbGVEYXRhID0gZXZ0LmRldGFpbDtcblxuXHRcdC8vIENoZWNrIGlmIGEgbmV3IGZpbGUgaXMgYmVpbmcgY3JlYXRlZFxuXHRcdGlmICh0aGlzLl90ZW1wV29yZHNGaWxlRGF0YS5pc05ldylcblx0XHR7XG5cdFx0XHQvLyBJZiB5ZXMsIGNoZWNrIGlmIG5hbWUgYWxyZWFkeSBleGlzdHNcblx0XHRcdGlmICh0aGlzLl93b3Jkc0ZpbGVzTWFuYWdlci5nZXRFeGlzdGluZ0ZpbGVuYW1lcygpLmluY2x1ZGVzKHRoaXMuX3RlbXBXb3Jkc0ZpbGVEYXRhLmZpbGVuYW1lKSlcblx0XHRcdHtcblx0XHRcdFx0Ly8gU2hvdyBjb25maXJtIGRpYWxvZ1xuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoJ0Egd29yZHMgZmlsZSB3aXRoIHRoZSBlbnRlcmVkIG5hbWUgYWxyZWFkeSBleGlzdHM7IGRvIHlvdSB3YW50IHRvIHByb2NlZWQgYW55d2F5PyBUaGUgZXhpc3RpbmcgZmlsZSB3aWxsIGJlIG92ZXJ3cml0dGVuLicsICQucHJveHkodGhpcy5fb25Xb3Jkc0ZpbGVTYXZlQ29uZmlybSwgdGhpcykpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJvY2VlZFxuXHRcdHRoaXMuX29uV29yZHNGaWxlU2F2ZUNvbmZpcm0oKTtcblx0fVxuXG5cdF9vbldvcmRzRmlsZVNhdmVDb25maXJtKClcblx0e1xuXHRcdC8vIERpc2FibGUgd29yZHMgZmlsZXMgbWFuYWdlciBidXR0b25zXG5cdFx0dGhpcy5fd29yZHNGaWxlc01hbmFnZXIuZW5hYmxlZCA9IGZhbHNlO1xuXHRcdHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLnNhdmVTcGlubmVyVmlzaWJsZSA9IHRydWU7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdmaWxlbmFtZScsIHRoaXMuX3RlbXBXb3Jkc0ZpbGVEYXRhLmZpbGVuYW1lKTtcblx0XHRwYXJhbXMucHV0VGV4dCgnY29udGVudCcsIHRoaXMuX3RlbXBXb3Jkc0ZpbGVEYXRhLmNvbnRlbnQpO1xuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfU0FWRV9XT1JEU19GSUxFLCBwYXJhbXMpO1xuXHR9XG5cblx0X29uV29yZHNGaWxlUmVtb3ZlQ2xpY2soZXZ0KVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCB3b3JkcyBmaWxlPycsICQucHJveHkodGhpcy5fb25Xb3Jkc0ZpbGVSZW1vdmVDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25Xb3Jkc0ZpbGVSZW1vdmVDb25maXJtKClcblx0e1xuXHRcdGxldCB3b3Jkc0ZpbGUgPSB0aGlzLl93b3Jkc0ZpbGVzTWFuYWdlci5nZXRTZWxlY3RlZFdvcmRzRmlsZU5hbWUoKTtcblxuXHRcdGlmICh3b3Jkc0ZpbGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHQvLyBEaXNhYmxlIHdvcmRzIGZpbGVzIG1hbmFnZXIgYnV0dG9uc1xuIFx0XHRcdHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLmVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdHRoaXMuX3dvcmRzRmlsZXNNYW5hZ2VyLmFjdGlvblNwaW5uZXJWaXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ2ZpbGVuYW1lJywgd29yZHNGaWxlKTtcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfREVMRVRFX1dPUkRTX0ZJTEUsIHBhcmFtcyk7XG5cdFx0fVxuXHR9XG5cblx0X29uV29yZHNGaWxlQXNzaWduQ2xpY2soZXZ0KVxuXHR7XG5cdFx0bGV0IHBhdGggPSBldnQuZGV0YWlsO1xuXG5cdFx0Ly8gV3JpdGUgcGF0aCBvZiB0aGUgc2VsZWN0ZWQgd29yZHMgZmlsZSBpbiBcIndvcmRzRmlsdGVyLndvcmRzRmlsZVwiIGR5bmFtaWNhbGx5IGNyZWF0ZWQgZmllbGRcblx0XHRjb25zdCB3b3Jkc0ZpbGVGb3JtSXRlbSA9IHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZ2V0Q29uZmlnRm9ybUl0ZW0oJ3dvcmRzRmlsdGVyLndvcmRzRmlsZScpO1xuXHRcdHdvcmRzRmlsZUZvcm1JdGVtLmRhdGEudmFsdWUgPSBwYXRoO1xuXHRcdHdvcmRzRmlsZUZvcm1JdGVtLl9zZXRXaWRnZXRWYWx1ZSgpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X2VuYWJsZUxpc3RJbnRlcmZhY2UoZW5hYmxlZClcblx0e1xuXHRcdCQoJyN6bmMtdXRpbEJ1dHRvbnMnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblx0XHQkKCcjem5jLXRyZWVWaWV3JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cdH1cblxuXHRfc2V0VXRpbGl0eUJ1dHRvbnNTdGF0ZShkYXRhSXRlbSA9IG51bGwpXG5cdHtcblx0XHRsZXQgZGlzYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoZGF0YUl0ZW0pXG5cdFx0e1xuXHRcdFx0Ly8gRW5hYmxlICdhY3RpdmF0ZSB6b25lJyBidXR0b24gaWYgem9uZSBpcyBpbmFjdGl2ZVxuXHRcdFx0JCgnI3puYy1hY3RpdmF0ZUJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgKGRhdGFJdGVtLnR5cGUgIT0gdGhpcy5JVEVNX1RZUEVfWk9ORSB8fCBkYXRhSXRlbS5hY3RpdmUpKTtcblxuXHRcdFx0ZGlzYWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Ly8gRGlzYWJsZSAnYWN0aXZhdGUgem9uZScgYnV0dG9uXG5cdFx0XHQkKCcjem5jLWFjdGl2YXRlQnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBFbmFibGUvZGlzYWJsZSBvdGhlciB1dGlsaXR5IGJ1dHRvbnNcblx0XHQkKCcjem5jLWFkZFpvbmVCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTsgLy8gQWx3YXlzIGVuYWJsZWRcblx0XHQkKCcjem5jLWFkZFJvb21CdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIGRpc2FibGUpO1xuXHRcdCQoJyN6bmMtZWRpdEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgZGlzYWJsZSk7XG5cdFx0JCgnI3puYy1yZW1vdmVCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIGRpc2FibGUpO1xuXHR9XG5cblx0X2VuYWJsZUNvbmZpZ0ludGVyZmFjZShlbmFibGVkKVxuXHR7XG5cdFx0JCgnI3puYy1jYW5jZWxCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGVkKTtcblx0XHQkKCcjem5jLXJlbG9hZEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXHRcdCQoJyN6bmMtc3VibWl0QnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cdFx0JCgnI3puYy1iYWNrdXBDaGVjaycpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXG5cdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5kaXNhYmxlSW50ZXJmYWNlKCFlbmFibGVkKTtcblxuXHRcdC8vIEFsc28gc3dpdGNoIHZpZXcgd2hlbiBlbmFibGVkXG5cdFx0aWYgKGVuYWJsZWQpXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCd6bmMtbWFpbicpO1xuXHR9XG5cblx0X3N3aXRjaFZpZXcodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3puYy12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X2NsZWFyVGFicygpXG5cdHtcblx0XHQvLyBEZXN0cm95IHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI3puYy10YWJOYXZpZ2F0b3IgI3RhYnMnKS5zY3JvbGxpbmdUYWJzKCdkZXN0cm95Jyk7XG5cblx0XHQvLyBSZW1vdmUgYWxsIHRhYiBuYXZpZ2F0b3IgY29udGVudFxuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZGVzdHJveUludGVyZmFjZSgpO1xuXG5cdFx0Ly8gU2V0IGZsYWcgdG8gcmUtaW5pdGlhbGl6ZSB0YWJzIGlmIG5lZWRlZFxuXHRcdHRoaXMuX3JlaW5pdFRhYnMgPSB0cnVlO1xuXHR9XG5cblx0X3BvcHVsYXRlVHJlZShkYXRhKVxuXHR7XG5cdFx0bGV0IHpEYXRhID0gZGF0YS5nZXRTRlNBcnJheSgnem9uZXMnKTtcblxuXHRcdGxldCB6b25lc0FyciA9IFtdO1xuXHRcdGZvciAobGV0IHogPSAwOyB6IDwgekRhdGEuc2l6ZSgpOyB6KyspXG5cdFx0XHR6b25lc0Fyci5wdXNoKCB0aGlzLl9jcmVhdGVab25lT2JqZWN0KHpEYXRhLmdldFNGU09iamVjdCh6KSkgKTtcblxuXHRcdC8vIENyZWF0ZSBkYXRhc291cmNlXG5cdFx0bGV0IHpvbmVzID0gbmV3IGtlbmRvLmRhdGEuSGllcmFyY2hpY2FsRGF0YVNvdXJjZSh7XG4gICAgICAgICAgICBkYXRhOiB6b25lc0Fycixcblx0XHRcdHNvcnQ6IHtcblx0XHRcdFx0ZmllbGQ6ICduYW1lJyxcblx0XHRcdFx0ZGlyOiAnYXNjJ1xuXHRcdFx0fSxcbiAgICAgICAgICAgIHNjaGVtYToge1xuICAgICAgICAgICAgICAgIG1vZGVsOiB7XG5cdFx0XHRcdFx0aWQ6ICdpZCcsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiB7XG5cdFx0XHRcdFx0XHRzY2hlbWE6IHtcblx0XHRcdFx0XHRcdFx0ZGF0YTogJ3Jvb21zJyxcblx0XHRcdFx0XHRcdFx0c29ydDoge1xuXHRcdFx0XHRcdFx0XHRcdGZpZWxkOiAnbmFtZScsXG5cdFx0XHRcdFx0XHRcdFx0ZGlyOiAnYXNjJ1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBTZXQgdHJlZSB2aWV3IGRhdGFwcm92aWRlclxuXHRcdHRoaXMuX3RyZWV2aWV3LnNldERhdGFTb3VyY2Uoem9uZXMpO1xuXG5cdFx0Ly8gU2V0IHV0aWxpdHkgYnV0dG9ucyBzdGF0ZSAoYWRkLCByZW1vdmUsIGVkaXQsIGV0Yylcblx0XHR0aGlzLl9zZXRVdGlsaXR5QnV0dG9uc1N0YXRlKCk7XG5cdH1cblxuXHRfY3JlYXRlWm9uZU9iamVjdCh6b25lRGF0YSlcblx0e1xuXHRcdGxldCB6b25lID0ge1xuXHRcdFx0dHlwZTogdGhpcy5JVEVNX1RZUEVfWk9ORSxcblx0XHRcdG5hbWU6IHpvbmVEYXRhLmdldFV0ZlN0cmluZygnbmFtZScpLFxuXHRcdFx0aWQ6IHpvbmVEYXRhLmdldEludCgnaWQnKSxcblx0XHRcdGFjdGl2ZTogem9uZURhdGEuZ2V0Qm9vbCgnYWN0Jylcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgcm9vbXMgbGlzdCBkYXRhcHJvdmlkZXJcblx0XHRsZXQgckRhdGEgPSB6b25lRGF0YS5nZXRTRlNBcnJheSgncm9vbXMnKTtcblxuXHRcdGxldCByb29tc0FyciA9IFtdO1xuXHRcdGZvciAobGV0IHIgPSAwOyByIDwgckRhdGEuc2l6ZSgpOyByKyspXG5cdFx0XHRyb29tc0Fyci5wdXNoKCB0aGlzLl9jcmVhdGVSb29tT2JqZWN0KHJEYXRhLmdldFNGU09iamVjdChyKSwgem9uZURhdGEuZ2V0SW50KCdpZCcpKSApO1xuXG5cdFx0em9uZS5yb29tcyA9IHJvb21zQXJyO1xuXG5cdFx0cmV0dXJuIHpvbmU7XG5cdH1cblxuXHRfY3JlYXRlUm9vbU9iamVjdChyb29tRGF0YSwgem9uZUlkKVxuXHR7XG5cdFx0bGV0IHJvb20gPSB7XG5cdFx0XHR0eXBlOiB0aGlzLklURU1fVFlQRV9ST09NLFxuXHRcdFx0bmFtZTogcm9vbURhdGEuZ2V0VXRmU3RyaW5nKCduYW1lJyksXG5cdFx0XHRpZDogcm9vbURhdGEuZ2V0SW50KCdpZCcpLFxuXHRcdFx0YWN0aXZlOiByb29tRGF0YS5nZXRCb29sKCdhY3QnKSxcblx0XHRcdHBhcmVudElkOiB6b25lSWQsXG5cdFx0XHRzcHJpdGVDc3NDbGFzczogdGhpcy5fZ2V0Um9vbUxpc3RJY29uQ3NzQ2xhc3Mocm9vbURhdGEuZ2V0Qm9vbCgnYWN0JykpXG5cdFx0fTtcblxuXHRcdHJldHVybiByb29tO1xuXHR9XG5cblx0X2dldFJvb21MaXN0SWNvbkNzc0NsYXNzKGlzQWN0aXZlKVxuXHR7XG5cdFx0cmV0dXJuIGlzQWN0aXZlID8gJ2ZhcyBmYS1kb29yLW9wZW4nIDogJ2ZhcyBmYS1kb29yLWNsb3NlZCBpbmFjdGl2ZS1saXN0LWl0ZW0nO1xuXHR9XG5cblx0X3NldFpvbmVBY3RpdmF0aW9uU3RhdHVzKHpvbmVJZCwgYWN0aXZlUm9vbXMsIGlzQWN0aXZlKVxuXHR7XG5cdFx0bGV0IHpvbmVESSA9IHRoaXMuX2dldFpvbmVEYXRhSXRlbUJ5SWQoem9uZUlkKTtcblxuXHRcdHpvbmVESS5hY3RpdmUgPSBpc0FjdGl2ZTtcblxuXHRcdGxldCBhY3RpdmVSb29tc0FyciA9IGFjdGl2ZVJvb21zLnNwbGl0KCcsJyk7XG5cblx0XHRpZiAoem9uZURJLmhhc0NoaWxkcmVuKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgem9uZURJLmNoaWxkcmVuLmRhdGEoKS5sZW5ndGg7IGkrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHJvb20gPSB6b25lREkuY2hpbGRyZW4uZGF0YSgpW2ldO1xuXHRcdFx0XHRyb29tLmFjdGl2ZSA9IChpc0FjdGl2ZSAmJiBhY3RpdmVSb29tc0Fyci5pbmRleE9mKHJvb20ubmFtZSkgPiAtMSk7XG5cdFx0XHRcdHJvb20uc3ByaXRlQ3NzQ2xhc3MgPSB0aGlzLl9nZXRSb29tTGlzdEljb25Dc3NDbGFzcyhyb29tLmFjdGl2ZSlcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZWZyZXNoIGxpc3Rcblx0XHR0aGlzLl90cmVldmlldy5kYXRhU291cmNlLnN5bmMoKTtcblxuXHRcdC8vIFJldHVybiB6b25lIG5hbWVcblx0XHRyZXR1cm4gem9uZURJLm5hbWU7XG5cdH1cblxuXHRfZGVzZWxlY3RUcmVlSXRlbSgpXG5cdHtcblx0XHR0aGlzLl90cmVldmlldy5zZWxlY3QoJCgpKTtcblx0fVxuXG5cdF9zZWxlY3RQYXJlbnRUcmVlSXRlbSgpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWROb2RlID0gdGhpcy5fdHJlZXZpZXcuc2VsZWN0KCk7XG5cdFx0bGV0IHNlbGVjdGVkRGF0YUl0ZW0gPSB0aGlzLl90cmVldmlldy5kYXRhSXRlbShzZWxlY3RlZE5vZGUpO1xuXG5cdFx0aWYgKHNlbGVjdGVkRGF0YUl0ZW0udHlwZSA9PSB0aGlzLklURU1fVFlQRV9ST09NKVxuXHRcdHtcblx0XHRcdGxldCBwYXJlbnROb2RlID0gdGhpcy5fdHJlZXZpZXcucGFyZW50KHNlbGVjdGVkTm9kZSk7XG5cdFx0XHR0aGlzLl90cmVldmlldy5zZWxlY3QocGFyZW50Tm9kZSk7XG5cdFx0fVxuXHR9XG5cblx0X2xvYWRDb25maWd1cmF0aW9uKHR5cGUsIHJlc2V0VGFicyA9IHRydWUpXG5cdHtcblx0XHQvLyBEaXNhYmxlIHpvbmUvcm9vbSBzZWxlY3Rpb24gbGlzdFxuXHRcdHRoaXMuX2VuYWJsZUxpc3RJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gRGlzYWJsZSBjb25maWd1cmF0aW9uIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUNvbmZpZ0ludGVyZmFjZShmYWxzZSk7XG5cblx0XHQvLyBDbGVhciBtYWluIGNvbnRhaW5lclxuXHRcdHRoaXMuX3Jlc2V0VGFic0NvbnRhaW5lcih0cnVlLCByZXNldFRhYnMpO1xuXG5cdFx0Ly8gU2V0IGlzRWRpdGluZyBmbGFnXG5cdFx0dGhpcy5faXNFZGl0aW5nID0gdHJ1ZTtcblx0XHR0aGlzLl9lZGl0ZWRJdGVtVHlwZSA9IHR5cGU7XG5cblx0XHQvLyBSZXF1ZXN0IHpvbmUgb3Igcm9vbSBjb25maWd1cmF0aW9uIGRhdGEgdG8gc2VydmVyIGluc3RhbmNlXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0SW50KCd6SWQnLCB0aGlzLl9lZGl0ZWRab25lSWQpO1xuXHRcdHBhcmFtcy5wdXRJbnQoJ3JJZCcsIHRoaXMuX2VkaXRlZFJvb21JZCk7XG5cblx0XHQvLyBJZiBubyByb29tIGlzIHNlbGVjdGVkLCB0aGVuIHdlIGFyZSBlZGl0aW5nIGEgem9uZVxuXHRcdGlmICh0aGlzLl9lZGl0ZWRJdGVtVHlwZSA9PSB0aGlzLklURU1fVFlQRV9aT05FKVxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfWk9ORV9DT05GSUcsIHBhcmFtcyk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfUk9PTV9DT05GSUcsIHBhcmFtcyk7XG5cblx0XHQvLyBTd2l0Y2ggcGFuZWxcblx0XHR0aGlzLl9zd2l0Y2hQYW5lbCgnem5jLW1haW5QYW5lbCcpO1xuXHR9XG5cblx0X3Jlc2V0VGFic0NvbnRhaW5lcihpc0xvYWRpbmcsIHJlc2V0VGFicylcblx0e1xuXHRcdGlmIChyZXNldFRhYnMpXG5cdFx0XHR0aGlzLl9jbGVhclRhYnMoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLl9yZWluaXRUYWJzID0gZmFsc2U7XG5cblx0XHRpZiAoIWlzTG9hZGluZylcblx0XHRcdHRoaXMuX3N3aXRjaFZpZXcoJ3puYy1zZWxlY3QnKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCd6bmMtbG9hZGluZycpO1xuXHR9XG5cblx0X3N3aXRjaFBhbmVsKHBhbmVsSWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem5jLXZpZXcnKS5zZWxlY3RlZFBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFuZWxJZCk7XG5cdH1cblxuXHRfZ2V0Wm9uZURhdGFJdGVtQnlJZCh6b25lSWQpXG5cdHtcblx0XHRsZXQgem9uZXNEUyA9IHRoaXMuX3RyZWV2aWV3LmRhdGFTb3VyY2U7XG5cdFx0cmV0dXJuIHpvbmVzRFMuZ2V0KHpvbmVJZCk7XG5cdH1cblxuXHRfZ2V0Um9vbURhdGFJdGVtQnlJZCh6b25lSWQsIHJvb21JZClcblx0e1xuXHRcdGxldCB6b25lREkgPSB0aGlzLl9nZXRab25lRGF0YUl0ZW1CeUlkKHpvbmVJZCk7XG5cblx0XHRpZiAoem9uZURJLmhhc0NoaWxkcmVuKVxuXHRcdFx0cmV0dXJuIHpvbmVESS5jaGlsZHJlbi5nZXQocm9vbUlkKTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0X3VwZGF0ZVpvbmVOYW1lSW5MaXN0KHpvbmVJZCwgem9uZU5hbWUpXG5cdHtcblx0XHR0aGlzLl9nZXRab25lRGF0YUl0ZW1CeUlkKHpvbmVJZCkubmFtZSA9IHpvbmVOYW1lO1xuXHRcdHRoaXMuX3RyZWV2aWV3LmRhdGFTb3VyY2Uuc3luYygpO1xuXHR9XG5cblx0X3VwZGF0ZVJvb21OYW1lSW5MaXN0KHpvbmVJZCwgcm9vbUlkLCByb29tTmFtZSlcblx0e1xuXHRcdHRoaXMuX2dldFJvb21EYXRhSXRlbUJ5SWQoem9uZUlkLCByb29tSWQpLm5hbWUgPSByb29tTmFtZTtcblx0XHR0aGlzLl90cmVldmlldy5kYXRhU291cmNlLnN5bmMoKTtcblx0fVxuXG5cdF92YWxpZGF0ZU5hbWUoY2hhbmdlcylcblx0e1xuXHRcdGNvbnN0IHpvbmVJZCA9IHRoaXMuX2VkaXRlZFpvbmVJZDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlcy5zaXplKCk7IGkrKylcblx0XHR7XG5cdFx0XHRjb25zdCBzZXR0aW5nID0gY2hhbmdlcy5nZXRTRlNPYmplY3QoaSk7XG5cblx0XHRcdGlmIChzZXR0aW5nLmNvbnRhaW5zS2V5KCduYW1lJykgJiYgc2V0dGluZy5nZXRVdGZTdHJpbmcoJ25hbWUnKSA9PSAnbmFtZScpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEdldCBuYW1lIHZhbHVlXG5cdFx0XHRcdGNvbnN0IG5hbWUgPSBzZXR0aW5nLmdldFRleHQoJ3ZhbHVlJyk7XG5cblx0XHRcdFx0Ly8gR2V0IGRhdGEgc291cmNlXG5cdFx0XHRcdGxldCBkcyA9IFtdO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9lZGl0ZWRJdGVtVHlwZSA9PSB0aGlzLklURU1fVFlQRV9aT05FKVxuXHRcdFx0XHRcdGRzID0gdGhpcy5fdHJlZXZpZXcuZGF0YVNvdXJjZS5kYXRhKCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLl9nZXRab25lRGF0YUl0ZW1CeUlkKHpvbmVJZCkuaGFzQ2hpbGRyZW4pXG5cdFx0XHRcdFx0XHRkcyA9IHRoaXMuX2dldFpvbmVEYXRhSXRlbUJ5SWQoem9uZUlkKS5jaGlsZHJlbi5kYXRhKCk7XG5cdFx0XHRcdH1cblxuXG5cdFx0XHRcdC8vIENoZWNrIGlmIG5hbWUgZXhpc3RzIGluIGRhdGEgc291cmNlXG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZHMubGVuZ3RoOyBqKyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAoZHNbal0ubmFtZSA9PSBuYW1lKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGdldCBfc2VsZWN0ZWRJdGVtKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl90cmVldmlldy5kYXRhSXRlbSh0aGlzLl90cmVldmlldy5zZWxlY3QoKSk7XG5cdH1cblxuXHRnZXQgX3NlbGVjdGVkSXRlbVBhcmVudCgpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWROb2RlID0gdGhpcy5fdHJlZXZpZXcuc2VsZWN0KCk7XG5cdFx0bGV0IHBhcmVudE5vZGUgPSB0aGlzLl90cmVldmlldy5wYXJlbnQoc2VsZWN0ZWROb2RlKTtcblxuXHRcdHJldHVybiB0aGlzLl90cmVldmlldy5kYXRhSXRlbShwYXJlbnROb2RlKTtcblx0fVxuXG5cdGdldCBfZWRpdGVkWm9uZUlkKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0VkaXRpbmcgJiYgdGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0udHlwZSA9PSB0aGlzLklURU1fVFlQRV9aT05FKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRJdGVtLmlkO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRJdGVtUGFyZW50LmlkO1xuXHRcdH1cblxuXHRcdHJldHVybiAtMTtcblx0fVxuXG5cdGdldCBfZWRpdGVkUm9vbUlkKClcblx0e1xuXHRcdGlmICh0aGlzLl9pc0VkaXRpbmcgJiYgdGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0udHlwZSA9PSB0aGlzLklURU1fVFlQRV9ST09NKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRJdGVtLmlkO1xuXHRcdH1cblxuXHRcdHJldHVybiAtMTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNwY0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3ZIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0EiLCJzb3VyY2VSb290IjoiIn0=
|