rubyfox-server 2.13.6.2 → 2.16.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/README.md +19 -0
- data/lib/rubyfox/server/cli.rb +39 -5
- data/lib/rubyfox/server/data/config/UploadsLock.txt +1 -1
- data/lib/rubyfox/server/data/config/admin/admintool.xml +1 -0
- data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +97 -43
- data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +307 -93
- data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +311 -95
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_game.txt +5 -5
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_mmo.txt +6 -6
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +69 -44
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +55 -43
- data/lib/rubyfox/server/data/config/admin/descriptors/runtime_zone.txt +81 -36
- data/lib/rubyfox/server/data/config/admin/gmc/gmc.py +55 -18
- data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Analytics.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/BanManager.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Console.svg +9 -0
- data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/Dashboard.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/LogViewer.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/ServletManager.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.svg +1 -0
- data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
- data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.svg +1 -0
- data/lib/rubyfox/server/data/config/core.xml +2 -2
- data/lib/rubyfox/server/data/config/log4j.properties +7 -7
- data/lib/rubyfox/server/data/config/server.xml +9 -10
- data/lib/rubyfox/server/data/config/wordsFile.txt +0 -2
- data/lib/rubyfox/server/data/data/GeoLite2-Country.mmdb +0 -0
- data/lib/rubyfox/server/data/{config → data/buddylists/BasicExamples}/.keep +0 -0
- data/lib/rubyfox/server/data/data/{buddylists → uploads}/.keep +0 -0
- data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/.RELEASE-NOTES.swp +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/LICENSE +1061 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +68 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +79 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +174 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina-tasks.xml +39 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.bat +387 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +690 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.bat +58 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.sh +60 -0
- 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/configtest.bat +58 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.sh +60 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/daemon.sh +293 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.bat +58 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.sh +60 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.bat +114 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.sh +115 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.bat +94 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.sh +98 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.bat +58 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.sh +60 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.bat +58 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.sh +60 -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/bin/tool-wrapper.bat +110 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.sh +153 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.bat +58 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.sh +60 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/Catalina/localhost/rewrite.config +1 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +260 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +206 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/context.xml +31 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xml +23 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xsd +53 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/logging.properties +79 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/server.xml +161 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xml +41 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xsd +59 -0
- data/lib/rubyfox/server/data/lib/apache-tomcat/conf/web.xml +4737 -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.15.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/sfs2x-ws-helper.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/{extensions → lib/apache-tomcat/logs}/.keep +0 -0
- data/lib/rubyfox/server/data/lib/{jetty/lib/ext/.donotdelete → apache-tomcat/temp/safeToDelete.tmp} +0 -0
- data/lib/rubyfox/server/data/lib/{jetty/resources → apache-tomcat/work}/.keep +0 -0
- data/lib/rubyfox/server/data/lib/commons-collections-3.2.2.jar +0 -0
- data/lib/rubyfox/server/data/lib/commons-compress-1.19.jar +0 -0
- data/lib/rubyfox/server/data/lib/js/LibApi.js +48 -181
- 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-lib.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x-util.jar +0 -0
- data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
- data/lib/rubyfox/server/data/sfs2x-service +6 -6
- data/lib/rubyfox/server/data/sfs2x-service.vmoptions +1 -1
- 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/HelloServlet/index.jsp +1 -1
- data/lib/rubyfox/server/data/www/{root → ROOT}/_css_/default.css +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/_css_/reset.css +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/background_gradient.png +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/background_logo.png +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/favicon.png +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/logo_smartfoxserver.png +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/_changes-to-default-themes_.txt +15 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/bootstrap.min.css +7 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/custom-bootstrap.min.css +1 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/css/all.min.css +5 -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 +3459 -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 +803 -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 +4527 -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 +175 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/jquery.scrolling-tabs.min.css +8 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/kendo.custom-bootstrap-v4.css +15280 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/reset.css +54 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +1428 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/data/countries.geo.json +178 -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 +2208 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +7662 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +929 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +766 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +71 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +1184 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +2618 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +3315 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-3.bundle.js +280 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +1122 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +2624 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +801 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +607 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +1221 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +847 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0.bundle.js +3240 -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 +17357 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +807 -0
- data/lib/rubyfox/server/data/{lib/jetty/webapps → www/ROOT/admin/assets/js/custom-modules}/.keep +0 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/bootstrap.min.js +7 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery-3.3.1.min.js +2 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery.scrolling-tabs.min.js +8 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/js.cookie.min.js +8 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/kendo.all.min.js +136 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/popper.min.js +5 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/sfs2x-api-1.7.15.js +8 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/versions-readme.txt +16 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/index.html +244 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/manifest.json +25 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/analytics.html +328 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/ban-manager.html +160 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/blue-box-monitor.html +37 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/console.html +135 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/dashboard.html +368 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-manager.html +98 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/license-manager.html +117 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/log-viewer.html +194 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/server-configurator.html +55 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/servlet-manager.html +98 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html +62 -0
- data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +346 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/crossdomain.xml +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/examples/index.html +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/favicon.ico +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/favicon.png +0 -0
- data/lib/rubyfox/server/data/www/{root → ROOT}/index.html +0 -0
- data/lib/rubyfox/server/data/www/host-manager/META-INF/context.xml +24 -0
- data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/401.jsp +71 -0
- data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/403.jsp +90 -0
- data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/404.jsp +62 -0
- data/lib/rubyfox/server/data/www/host-manager/WEB-INF/web.xml +131 -0
- data/lib/rubyfox/server/data/www/host-manager/images/asf-logo.svg +226 -0
- data/lib/rubyfox/server/data/www/host-manager/images/tomcat.gif +0 -0
- data/lib/rubyfox/server/data/www/host-manager/index.jsp +18 -0
- data/lib/rubyfox/server/data/www/host-manager/manager.xml +26 -0
- data/lib/rubyfox/server/data/{logs → www/logsBackup}/.keep +0 -0
- data/lib/rubyfox/server/data/www/manager/META-INF/context.xml +24 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/401.jsp +80 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/403.jsp +100 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/404.jsp +63 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCerts.jsp +92 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCiphers.jsp +92 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorTrustedCerts.jsp +92 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionDetail.jsp +197 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionsList.jsp +170 -0
- data/lib/rubyfox/server/data/www/manager/WEB-INF/web.xml +195 -0
- data/lib/rubyfox/server/data/www/manager/images/asf-logo.svg +226 -0
- data/lib/rubyfox/server/data/www/manager/images/tomcat.gif +0 -0
- data/lib/rubyfox/server/data/www/manager/index.jsp +18 -0
- data/lib/rubyfox/server/data/www/manager/status.xsd +84 -0
- data/lib/rubyfox/server/data/www/manager/xform.xsl +125 -0
- data/lib/rubyfox/server/version.rb +1 -1
- metadata +257 -339
- data/lib/rubyfox/server/data/config/ExtensionManagerLock.txt +0 -2
- data/lib/rubyfox/server/data/lib/Lib/reindex$py.class +0 -0
- data/lib/rubyfox/server/data/lib/jetty/VERSION.txt +0 -9707
- data/lib/rubyfox/server/data/lib/jetty/etc/README.spnego +0 -62
- data/lib/rubyfox/server/data/lib/jetty/etc/example-quickstart.xml +0 -27
- data/lib/rubyfox/server/data/lib/jetty/etc/gcloud-memcached-session-context.xml +0 -33
- data/lib/rubyfox/server/data/lib/jetty/etc/gcloud-session-context.xml +0 -25
- data/lib/rubyfox/server/data/lib/jetty/etc/hawtio.xml +0 -16
- data/lib/rubyfox/server/data/lib/jetty/etc/home-base-warning.xml +0 -8
- data/lib/rubyfox/server/data/lib/jetty/etc/jamon.xml +0 -32
- data/lib/rubyfox/server/data/lib/jetty/etc/jdbcRealm.properties +0 -72
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-alpn.xml +0 -32
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-annotations.xml +0 -20
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-cdi.xml +0 -19
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debug.xml +0 -36
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debuglog.xml +0 -25
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-deploy.xml +0 -76
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-memcached-sessions.xml +0 -27
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-session-idmgr.xml +0 -19
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-sessions.xml +0 -27
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gzip-inflate.xml +0 -12
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gzip.xml +0 -67
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http-forwarded.xml +0 -20
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http.xml +0 -47
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2.xml +0 -25
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2c.xml +0 -17
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-https.xml +0 -29
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-infinispan.xml +0 -39
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ipaccess.xml +0 -28
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jaas.xml +0 -16
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jdbc-sessions.xml +0 -34
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx-remote.xml +0 -40
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx.xml +0 -32
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-logging.xml +0 -36
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-lowresources.xml +0 -22
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-monitor.xml +0 -30
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-nosql.xml +0 -19
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-plus.xml +0 -26
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol-ssl.xml +0 -10
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol.xml +0 -10
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy.xml +0 -35
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-requestlog.xml +0 -30
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite-customizer.xml +0 -17
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite.xml +0 -31
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-setuid.xml +0 -30
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-spring.xml +0 -61
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl-context.xml +0 -31
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl.xml +0 -58
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-started.xml +0 -15
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-stats.xml +0 -18
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-stop.xml +0 -6
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty-threadlimit.xml +0 -20
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty.conf +0 -12
- data/lib/rubyfox/server/data/lib/jetty/etc/jetty.xml +0 -195
- data/lib/rubyfox/server/data/lib/jetty/etc/jminix.xml +0 -12
- data/lib/rubyfox/server/data/lib/jetty/etc/jolokia.xml +0 -16
- data/lib/rubyfox/server/data/lib/jetty/etc/keystore +0 -0
- data/lib/rubyfox/server/data/lib/jetty/etc/krb5.ini +0 -23
- data/lib/rubyfox/server/data/lib/jetty/etc/rewrite-compactpath.xml +0 -10
- data/lib/rubyfox/server/data/lib/jetty/etc/sessions/hazelcast/default.xml +0 -19
- data/lib/rubyfox/server/data/lib/jetty/etc/sessions/hazelcast/remote.xml +0 -19
- data/lib/rubyfox/server/data/lib/jetty/etc/spnego.conf +0 -19
- data/lib/rubyfox/server/data/lib/jetty/etc/spnego.properties +0 -1
- data/lib/rubyfox/server/data/lib/jetty/etc/webdefault.xml +0 -539
- data/lib/rubyfox/server/data/lib/jetty/lib/alpn-api-1.1.3.v20160715.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.33.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.33.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-1.2.5.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-1.2.5.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/asm-6.0.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/asm-commons-6.0.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-client-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-server-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-common-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-hpack-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-server-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jaspi/javax.security.auth.message-1.0.0.v201108011116.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-client-impl-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-server-impl-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/javax.annotation-api-1.2.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/javax.websocket-api-1.0.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-alpn-java-server-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-alpn-server-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-annotations-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-client-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-continuation-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-deploy-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-memcached-session-manager-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-session-manager-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-hazelcast-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-http-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-infinispan-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-io-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaas-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaspi-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jmx-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jndi-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-nosql-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-plus-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-proxy-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-quickstart-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-rewrite-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-schemas-3.1.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-security-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-server-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlet-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlets-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-util-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-webapp-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jetty-xml-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.transaction-api-1.2.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/monitor/jetty-monitor-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/servlet-api-3.1.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/setuid/jetty-setuid-java-1.0.3.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-linux.so +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-osx.so +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/spring/jetty-spring-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/start.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/websocket-api-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/websocket-client-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/websocket-common-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/websocket-server-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/lib/websocket-servlet-9.3.27.v20190418.jar +0 -0
- data/lib/rubyfox/server/data/lib/jetty/license-eplv10-aslv20.html +0 -576
- data/lib/rubyfox/server/data/lib/jetty/modules/.donotdelete +0 -0
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_05.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_101.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_102.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_11.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_111.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_112.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_121.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_131.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_141.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_144.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_151.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_152.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_161.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_162.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_171.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_172.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_181.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_191.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_192.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_20.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_201.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_202.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_211.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_212.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_25.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_31.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_40.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_45.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_51.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_60.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_65.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_66.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_71.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_72.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_73.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_74.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_77.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_91.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_92.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-8.mod +0 -30
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-9.mod +0 -5
- data/lib/rubyfox/server/data/lib/jetty/modules/alpn.mod +0 -22
- data/lib/rubyfox/server/data/lib/jetty/modules/annotations.mod +0 -17
- data/lib/rubyfox/server/data/lib/jetty/modules/apache-jsp.mod +0 -10
- data/lib/rubyfox/server/data/lib/jetty/modules/apache-jstl.mod +0 -9
- data/lib/rubyfox/server/data/lib/jetty/modules/cdi.mod +0 -38
- data/lib/rubyfox/server/data/lib/jetty/modules/client.mod +0 -6
- data/lib/rubyfox/server/data/lib/jetty/modules/continuation.mod +0 -6
- data/lib/rubyfox/server/data/lib/jetty/modules/debug.mod +0 -29
- data/lib/rubyfox/server/data/lib/jetty/modules/debuglog.mod +0 -25
- data/lib/rubyfox/server/data/lib/jetty/modules/deploy.mod +0 -31
- data/lib/rubyfox/server/data/lib/jetty/modules/ext.mod +0 -11
- data/lib/rubyfox/server/data/lib/jetty/modules/fcgi.mod +0 -15
- data/lib/rubyfox/server/data/lib/jetty/modules/flight-recorder.mod +0 -13
- data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-memcached-sessions.mod +0 -26
- data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-session-idmgr.mod +0 -63
- data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-sessions.mod +0 -11
- data/lib/rubyfox/server/data/lib/jetty/modules/gzip-inflate.mod +0 -17
- data/lib/rubyfox/server/data/lib/jetty/modules/gzip.mod +0 -23
- data/lib/rubyfox/server/data/lib/jetty/modules/hawtio.mod +0 -28
- data/lib/rubyfox/server/data/lib/jetty/modules/hazelcast-embedded-sessions.mod +0 -26
- data/lib/rubyfox/server/data/lib/jetty/modules/hazelcast-remote-sessions.mod +0 -26
- data/lib/rubyfox/server/data/lib/jetty/modules/home-base-warning.mod +0 -7
- data/lib/rubyfox/server/data/lib/jetty/modules/http-forwarded.mod +0 -24
- data/lib/rubyfox/server/data/lib/jetty/modules/http.mod +0 -39
- data/lib/rubyfox/server/data/lib/jetty/modules/http2.mod +0 -20
- data/lib/rubyfox/server/data/lib/jetty/modules/http2c.mod +0 -22
- data/lib/rubyfox/server/data/lib/jetty/modules/https.mod +0 -14
- data/lib/rubyfox/server/data/lib/jetty/modules/infinispan.mod +0 -33
- data/lib/rubyfox/server/data/lib/jetty/modules/ipaccess.mod +0 -9
- data/lib/rubyfox/server/data/lib/jetty/modules/jaas.mod +0 -17
- data/lib/rubyfox/server/data/lib/jetty/modules/jamon.mod +0 -31
- data/lib/rubyfox/server/data/lib/jetty/modules/jaspi.mod +0 -10
- data/lib/rubyfox/server/data/lib/jetty/modules/jdbc-sessions.mod +0 -27
- data/lib/rubyfox/server/data/lib/jetty/modules/jminix.mod +0 -41
- data/lib/rubyfox/server/data/lib/jetty/modules/jmx-remote.mod +0 -16
- data/lib/rubyfox/server/data/lib/jetty/modules/jmx.mod +0 -13
- data/lib/rubyfox/server/data/lib/jetty/modules/jndi.mod +0 -11
- data/lib/rubyfox/server/data/lib/jetty/modules/jolokia.mod +0 -19
- data/lib/rubyfox/server/data/lib/jetty/modules/jsp.mod +0 -9
- data/lib/rubyfox/server/data/lib/jetty/modules/jstl.mod +0 -8
- data/lib/rubyfox/server/data/lib/jetty/modules/jvm.mod +0 -22
- data/lib/rubyfox/server/data/lib/jetty/modules/logging.mod +0 -36
- data/lib/rubyfox/server/data/lib/jetty/modules/lowresources.mod +0 -28
- data/lib/rubyfox/server/data/lib/jetty/modules/monitor.mod +0 -13
- data/lib/rubyfox/server/data/lib/jetty/modules/nosql.mod +0 -31
- data/lib/rubyfox/server/data/lib/jetty/modules/npn.mod +0 -4
- data/lib/rubyfox/server/data/lib/jetty/modules/plus.mod +0 -15
- data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol-ssl.mod +0 -9
- data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol.mod +0 -9
- data/lib/rubyfox/server/data/lib/jetty/modules/proxy.mod +0 -22
- data/lib/rubyfox/server/data/lib/jetty/modules/quickstart.mod +0 -11
- data/lib/rubyfox/server/data/lib/jetty/modules/requestlog.mod +0 -40
- data/lib/rubyfox/server/data/lib/jetty/modules/resources.mod +0 -10
- data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-compactpath.mod +0 -10
- data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-customizer.mod +0 -24
- data/lib/rubyfox/server/data/lib/jetty/modules/rewrite.mod +0 -23
- data/lib/rubyfox/server/data/lib/jetty/modules/security.mod +0 -9
- data/lib/rubyfox/server/data/lib/jetty/modules/server.mod +0 -82
- data/lib/rubyfox/server/data/lib/jetty/modules/servlet.mod +0 -9
- data/lib/rubyfox/server/data/lib/jetty/modules/servlets.mod +0 -11
- data/lib/rubyfox/server/data/lib/jetty/modules/setuid.mod +0 -19
- data/lib/rubyfox/server/data/lib/jetty/modules/spring.mod +0 -17
- data/lib/rubyfox/server/data/lib/jetty/modules/ssl.mod +0 -101
- data/lib/rubyfox/server/data/lib/jetty/modules/stats.mod +0 -9
- data/lib/rubyfox/server/data/lib/jetty/modules/threadlimit.mod +0 -22
- data/lib/rubyfox/server/data/lib/jetty/modules/webapp.mod +0 -10
- data/lib/rubyfox/server/data/lib/jetty/modules/websocket.mod +0 -12
- data/lib/rubyfox/server/data/lib/jetty/notice.html +0 -111
- data/lib/rubyfox/server/data/lib/jetty/start.d/README.TXT +0 -24
- data/lib/rubyfox/server/data/lib/jetty/start.d/http.ini +0 -7
- data/lib/rubyfox/server/data/lib/jetty/start.d/https.ini +0 -10
- data/lib/rubyfox/server/data/lib/jetty/start.d/ssl.ini +0 -19
- data/lib/rubyfox/server/data/lib/jetty/start.ini +0 -85
- data/lib/rubyfox/server/data/www/.keep +0 -0
- data/lib/rubyfox/server/data/www/HelloServlet/META-INF/context.xml +0 -2
- data/lib/rubyfox/server/data/www/PyServletExample/MyModule$py.class +0 -0
- data/lib/rubyfox/server/data/www/PyServletExample/MyModule.py +0 -5
- data/lib/rubyfox/server/data/www/PyServletExample/WEB-INF/web.xml +0 -37
- data/lib/rubyfox/server/data/www/PyServletExample/errors/404.htm +0 -20
- data/lib/rubyfox/server/data/www/PyServletExample/index.py +0 -42
- data/lib/rubyfox/server/data/www/root/admin/.keep +0 -0
- data/lib/rubyfox/server/data/www/root/admin/AdminTool.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/ReleaseNotes.txt +0 -201
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/advanced.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/analytics.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/banManager.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bookmarks.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bootLog.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyList.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/connection.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/databaseManager.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/floodFilter.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/gameSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/general.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/hTML5WebSockets.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPDiscovery.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPFilter.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/logsDownload.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mMOSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mailer.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomExtension.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomVariables.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsApplication.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsDemographics.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsExceptions.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsOverview.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsTechnology.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/threadPools.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userManagement.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userVariables.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/webServer.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneTraffic.png +0 -0
- data/lib/rubyfox/server/data/www/root/admin/expressInstall.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/index.html +0 -124
- data/lib/rubyfox/server/data/www/root/admin/modules/Analytics.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/BanManager.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/Console.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ExtensionManager.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ServletManager.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor.swf +0 -0
- data/lib/rubyfox/server/data/www/root/admin/swfobject.js +0 -4
- data/lib/rubyfox/server/data/www/root/examples/.keep +0 -0
- data/lib/rubyfox/server/data/www/sfs2x-ws.war +0 -0
- data/lib/rubyfox/server/data/www/sfs2x-ws.xml +0 -30
- data/lib/rubyfox/server/data/zones/BasicExamples.zone.xml +0 -147
@@ -0,0 +1,1221 @@
|
|
1
|
+
/*! (c) gotoAndPlay | All rights reserved */
|
2
|
+
(window["webpackJsonpapplication"] = window["webpackJsonpapplication"] || []).push([["module-8"],{
|
3
|
+
|
4
|
+
/***/ "./node_modules/file-saver/dist/FileSaver.min.js":
|
5
|
+
/*!*******************************************************!*\
|
6
|
+
!*** ./node_modules/file-saver/dist/FileSaver.min.js ***!
|
7
|
+
\*******************************************************/
|
8
|
+
/*! no static exports found */
|
9
|
+
/***/ (function(module, exports, __webpack_require__) {
|
10
|
+
|
11
|
+
/* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(a,b){if(true)!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (b),
|
12
|
+
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
|
13
|
+
(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
|
14
|
+
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else {}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(b,c,d){var e=new XMLHttpRequest;e.open("GET",b),e.responseType="blob",e.onload=function(){a(e.response,c,d)},e.onerror=function(){console.error("could not download file")},e.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(a,b,d,e){if(e=e||open("","_blank"),e&&(e.document.title=e.document.body.innerText="downloading..."),"string"==typeof a)return c(a,b,d);var g="application/octet-stream"===a.type,h=/constructor/i.test(f.HTMLElement)||f.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent);if((i||g&&h)&&"object"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),e?e.location.href=a:location=a,e=null},j.readAsDataURL(a)}else{var k=f.URL||f.webkitURL,l=k.createObjectURL(a);e?e.location=l:location.href=l,e=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}});f.saveAs=a.saveAs=a, true&&(module.exports=a)});
|
15
|
+
|
16
|
+
//# sourceMappingURL=FileSaver.min.js.map
|
17
|
+
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
|
18
|
+
|
19
|
+
/***/ }),
|
20
|
+
|
21
|
+
/***/ "./node_modules/moment/locale sync recursive ^\\.\\/.*$":
|
22
|
+
/*!**************************************************!*\
|
23
|
+
!*** ./node_modules/moment/locale sync ^\.\/.*$ ***!
|
24
|
+
\**************************************************/
|
25
|
+
/*! no static exports found */
|
26
|
+
/***/ (function(module, exports, __webpack_require__) {
|
27
|
+
|
28
|
+
var map = {
|
29
|
+
"./af": "./node_modules/moment/locale/af.js",
|
30
|
+
"./af.js": "./node_modules/moment/locale/af.js",
|
31
|
+
"./ar": "./node_modules/moment/locale/ar.js",
|
32
|
+
"./ar-dz": "./node_modules/moment/locale/ar-dz.js",
|
33
|
+
"./ar-dz.js": "./node_modules/moment/locale/ar-dz.js",
|
34
|
+
"./ar-kw": "./node_modules/moment/locale/ar-kw.js",
|
35
|
+
"./ar-kw.js": "./node_modules/moment/locale/ar-kw.js",
|
36
|
+
"./ar-ly": "./node_modules/moment/locale/ar-ly.js",
|
37
|
+
"./ar-ly.js": "./node_modules/moment/locale/ar-ly.js",
|
38
|
+
"./ar-ma": "./node_modules/moment/locale/ar-ma.js",
|
39
|
+
"./ar-ma.js": "./node_modules/moment/locale/ar-ma.js",
|
40
|
+
"./ar-sa": "./node_modules/moment/locale/ar-sa.js",
|
41
|
+
"./ar-sa.js": "./node_modules/moment/locale/ar-sa.js",
|
42
|
+
"./ar-tn": "./node_modules/moment/locale/ar-tn.js",
|
43
|
+
"./ar-tn.js": "./node_modules/moment/locale/ar-tn.js",
|
44
|
+
"./ar.js": "./node_modules/moment/locale/ar.js",
|
45
|
+
"./az": "./node_modules/moment/locale/az.js",
|
46
|
+
"./az.js": "./node_modules/moment/locale/az.js",
|
47
|
+
"./be": "./node_modules/moment/locale/be.js",
|
48
|
+
"./be.js": "./node_modules/moment/locale/be.js",
|
49
|
+
"./bg": "./node_modules/moment/locale/bg.js",
|
50
|
+
"./bg.js": "./node_modules/moment/locale/bg.js",
|
51
|
+
"./bm": "./node_modules/moment/locale/bm.js",
|
52
|
+
"./bm.js": "./node_modules/moment/locale/bm.js",
|
53
|
+
"./bn": "./node_modules/moment/locale/bn.js",
|
54
|
+
"./bn.js": "./node_modules/moment/locale/bn.js",
|
55
|
+
"./bo": "./node_modules/moment/locale/bo.js",
|
56
|
+
"./bo.js": "./node_modules/moment/locale/bo.js",
|
57
|
+
"./br": "./node_modules/moment/locale/br.js",
|
58
|
+
"./br.js": "./node_modules/moment/locale/br.js",
|
59
|
+
"./bs": "./node_modules/moment/locale/bs.js",
|
60
|
+
"./bs.js": "./node_modules/moment/locale/bs.js",
|
61
|
+
"./ca": "./node_modules/moment/locale/ca.js",
|
62
|
+
"./ca.js": "./node_modules/moment/locale/ca.js",
|
63
|
+
"./cs": "./node_modules/moment/locale/cs.js",
|
64
|
+
"./cs.js": "./node_modules/moment/locale/cs.js",
|
65
|
+
"./cv": "./node_modules/moment/locale/cv.js",
|
66
|
+
"./cv.js": "./node_modules/moment/locale/cv.js",
|
67
|
+
"./cy": "./node_modules/moment/locale/cy.js",
|
68
|
+
"./cy.js": "./node_modules/moment/locale/cy.js",
|
69
|
+
"./da": "./node_modules/moment/locale/da.js",
|
70
|
+
"./da.js": "./node_modules/moment/locale/da.js",
|
71
|
+
"./de": "./node_modules/moment/locale/de.js",
|
72
|
+
"./de-at": "./node_modules/moment/locale/de-at.js",
|
73
|
+
"./de-at.js": "./node_modules/moment/locale/de-at.js",
|
74
|
+
"./de-ch": "./node_modules/moment/locale/de-ch.js",
|
75
|
+
"./de-ch.js": "./node_modules/moment/locale/de-ch.js",
|
76
|
+
"./de.js": "./node_modules/moment/locale/de.js",
|
77
|
+
"./dv": "./node_modules/moment/locale/dv.js",
|
78
|
+
"./dv.js": "./node_modules/moment/locale/dv.js",
|
79
|
+
"./el": "./node_modules/moment/locale/el.js",
|
80
|
+
"./el.js": "./node_modules/moment/locale/el.js",
|
81
|
+
"./en-SG": "./node_modules/moment/locale/en-SG.js",
|
82
|
+
"./en-SG.js": "./node_modules/moment/locale/en-SG.js",
|
83
|
+
"./en-au": "./node_modules/moment/locale/en-au.js",
|
84
|
+
"./en-au.js": "./node_modules/moment/locale/en-au.js",
|
85
|
+
"./en-ca": "./node_modules/moment/locale/en-ca.js",
|
86
|
+
"./en-ca.js": "./node_modules/moment/locale/en-ca.js",
|
87
|
+
"./en-gb": "./node_modules/moment/locale/en-gb.js",
|
88
|
+
"./en-gb.js": "./node_modules/moment/locale/en-gb.js",
|
89
|
+
"./en-ie": "./node_modules/moment/locale/en-ie.js",
|
90
|
+
"./en-ie.js": "./node_modules/moment/locale/en-ie.js",
|
91
|
+
"./en-il": "./node_modules/moment/locale/en-il.js",
|
92
|
+
"./en-il.js": "./node_modules/moment/locale/en-il.js",
|
93
|
+
"./en-nz": "./node_modules/moment/locale/en-nz.js",
|
94
|
+
"./en-nz.js": "./node_modules/moment/locale/en-nz.js",
|
95
|
+
"./eo": "./node_modules/moment/locale/eo.js",
|
96
|
+
"./eo.js": "./node_modules/moment/locale/eo.js",
|
97
|
+
"./es": "./node_modules/moment/locale/es.js",
|
98
|
+
"./es-do": "./node_modules/moment/locale/es-do.js",
|
99
|
+
"./es-do.js": "./node_modules/moment/locale/es-do.js",
|
100
|
+
"./es-us": "./node_modules/moment/locale/es-us.js",
|
101
|
+
"./es-us.js": "./node_modules/moment/locale/es-us.js",
|
102
|
+
"./es.js": "./node_modules/moment/locale/es.js",
|
103
|
+
"./et": "./node_modules/moment/locale/et.js",
|
104
|
+
"./et.js": "./node_modules/moment/locale/et.js",
|
105
|
+
"./eu": "./node_modules/moment/locale/eu.js",
|
106
|
+
"./eu.js": "./node_modules/moment/locale/eu.js",
|
107
|
+
"./fa": "./node_modules/moment/locale/fa.js",
|
108
|
+
"./fa.js": "./node_modules/moment/locale/fa.js",
|
109
|
+
"./fi": "./node_modules/moment/locale/fi.js",
|
110
|
+
"./fi.js": "./node_modules/moment/locale/fi.js",
|
111
|
+
"./fo": "./node_modules/moment/locale/fo.js",
|
112
|
+
"./fo.js": "./node_modules/moment/locale/fo.js",
|
113
|
+
"./fr": "./node_modules/moment/locale/fr.js",
|
114
|
+
"./fr-ca": "./node_modules/moment/locale/fr-ca.js",
|
115
|
+
"./fr-ca.js": "./node_modules/moment/locale/fr-ca.js",
|
116
|
+
"./fr-ch": "./node_modules/moment/locale/fr-ch.js",
|
117
|
+
"./fr-ch.js": "./node_modules/moment/locale/fr-ch.js",
|
118
|
+
"./fr.js": "./node_modules/moment/locale/fr.js",
|
119
|
+
"./fy": "./node_modules/moment/locale/fy.js",
|
120
|
+
"./fy.js": "./node_modules/moment/locale/fy.js",
|
121
|
+
"./ga": "./node_modules/moment/locale/ga.js",
|
122
|
+
"./ga.js": "./node_modules/moment/locale/ga.js",
|
123
|
+
"./gd": "./node_modules/moment/locale/gd.js",
|
124
|
+
"./gd.js": "./node_modules/moment/locale/gd.js",
|
125
|
+
"./gl": "./node_modules/moment/locale/gl.js",
|
126
|
+
"./gl.js": "./node_modules/moment/locale/gl.js",
|
127
|
+
"./gom-latn": "./node_modules/moment/locale/gom-latn.js",
|
128
|
+
"./gom-latn.js": "./node_modules/moment/locale/gom-latn.js",
|
129
|
+
"./gu": "./node_modules/moment/locale/gu.js",
|
130
|
+
"./gu.js": "./node_modules/moment/locale/gu.js",
|
131
|
+
"./he": "./node_modules/moment/locale/he.js",
|
132
|
+
"./he.js": "./node_modules/moment/locale/he.js",
|
133
|
+
"./hi": "./node_modules/moment/locale/hi.js",
|
134
|
+
"./hi.js": "./node_modules/moment/locale/hi.js",
|
135
|
+
"./hr": "./node_modules/moment/locale/hr.js",
|
136
|
+
"./hr.js": "./node_modules/moment/locale/hr.js",
|
137
|
+
"./hu": "./node_modules/moment/locale/hu.js",
|
138
|
+
"./hu.js": "./node_modules/moment/locale/hu.js",
|
139
|
+
"./hy-am": "./node_modules/moment/locale/hy-am.js",
|
140
|
+
"./hy-am.js": "./node_modules/moment/locale/hy-am.js",
|
141
|
+
"./id": "./node_modules/moment/locale/id.js",
|
142
|
+
"./id.js": "./node_modules/moment/locale/id.js",
|
143
|
+
"./is": "./node_modules/moment/locale/is.js",
|
144
|
+
"./is.js": "./node_modules/moment/locale/is.js",
|
145
|
+
"./it": "./node_modules/moment/locale/it.js",
|
146
|
+
"./it-ch": "./node_modules/moment/locale/it-ch.js",
|
147
|
+
"./it-ch.js": "./node_modules/moment/locale/it-ch.js",
|
148
|
+
"./it.js": "./node_modules/moment/locale/it.js",
|
149
|
+
"./ja": "./node_modules/moment/locale/ja.js",
|
150
|
+
"./ja.js": "./node_modules/moment/locale/ja.js",
|
151
|
+
"./jv": "./node_modules/moment/locale/jv.js",
|
152
|
+
"./jv.js": "./node_modules/moment/locale/jv.js",
|
153
|
+
"./ka": "./node_modules/moment/locale/ka.js",
|
154
|
+
"./ka.js": "./node_modules/moment/locale/ka.js",
|
155
|
+
"./kk": "./node_modules/moment/locale/kk.js",
|
156
|
+
"./kk.js": "./node_modules/moment/locale/kk.js",
|
157
|
+
"./km": "./node_modules/moment/locale/km.js",
|
158
|
+
"./km.js": "./node_modules/moment/locale/km.js",
|
159
|
+
"./kn": "./node_modules/moment/locale/kn.js",
|
160
|
+
"./kn.js": "./node_modules/moment/locale/kn.js",
|
161
|
+
"./ko": "./node_modules/moment/locale/ko.js",
|
162
|
+
"./ko.js": "./node_modules/moment/locale/ko.js",
|
163
|
+
"./ku": "./node_modules/moment/locale/ku.js",
|
164
|
+
"./ku.js": "./node_modules/moment/locale/ku.js",
|
165
|
+
"./ky": "./node_modules/moment/locale/ky.js",
|
166
|
+
"./ky.js": "./node_modules/moment/locale/ky.js",
|
167
|
+
"./lb": "./node_modules/moment/locale/lb.js",
|
168
|
+
"./lb.js": "./node_modules/moment/locale/lb.js",
|
169
|
+
"./lo": "./node_modules/moment/locale/lo.js",
|
170
|
+
"./lo.js": "./node_modules/moment/locale/lo.js",
|
171
|
+
"./lt": "./node_modules/moment/locale/lt.js",
|
172
|
+
"./lt.js": "./node_modules/moment/locale/lt.js",
|
173
|
+
"./lv": "./node_modules/moment/locale/lv.js",
|
174
|
+
"./lv.js": "./node_modules/moment/locale/lv.js",
|
175
|
+
"./me": "./node_modules/moment/locale/me.js",
|
176
|
+
"./me.js": "./node_modules/moment/locale/me.js",
|
177
|
+
"./mi": "./node_modules/moment/locale/mi.js",
|
178
|
+
"./mi.js": "./node_modules/moment/locale/mi.js",
|
179
|
+
"./mk": "./node_modules/moment/locale/mk.js",
|
180
|
+
"./mk.js": "./node_modules/moment/locale/mk.js",
|
181
|
+
"./ml": "./node_modules/moment/locale/ml.js",
|
182
|
+
"./ml.js": "./node_modules/moment/locale/ml.js",
|
183
|
+
"./mn": "./node_modules/moment/locale/mn.js",
|
184
|
+
"./mn.js": "./node_modules/moment/locale/mn.js",
|
185
|
+
"./mr": "./node_modules/moment/locale/mr.js",
|
186
|
+
"./mr.js": "./node_modules/moment/locale/mr.js",
|
187
|
+
"./ms": "./node_modules/moment/locale/ms.js",
|
188
|
+
"./ms-my": "./node_modules/moment/locale/ms-my.js",
|
189
|
+
"./ms-my.js": "./node_modules/moment/locale/ms-my.js",
|
190
|
+
"./ms.js": "./node_modules/moment/locale/ms.js",
|
191
|
+
"./mt": "./node_modules/moment/locale/mt.js",
|
192
|
+
"./mt.js": "./node_modules/moment/locale/mt.js",
|
193
|
+
"./my": "./node_modules/moment/locale/my.js",
|
194
|
+
"./my.js": "./node_modules/moment/locale/my.js",
|
195
|
+
"./nb": "./node_modules/moment/locale/nb.js",
|
196
|
+
"./nb.js": "./node_modules/moment/locale/nb.js",
|
197
|
+
"./ne": "./node_modules/moment/locale/ne.js",
|
198
|
+
"./ne.js": "./node_modules/moment/locale/ne.js",
|
199
|
+
"./nl": "./node_modules/moment/locale/nl.js",
|
200
|
+
"./nl-be": "./node_modules/moment/locale/nl-be.js",
|
201
|
+
"./nl-be.js": "./node_modules/moment/locale/nl-be.js",
|
202
|
+
"./nl.js": "./node_modules/moment/locale/nl.js",
|
203
|
+
"./nn": "./node_modules/moment/locale/nn.js",
|
204
|
+
"./nn.js": "./node_modules/moment/locale/nn.js",
|
205
|
+
"./pa-in": "./node_modules/moment/locale/pa-in.js",
|
206
|
+
"./pa-in.js": "./node_modules/moment/locale/pa-in.js",
|
207
|
+
"./pl": "./node_modules/moment/locale/pl.js",
|
208
|
+
"./pl.js": "./node_modules/moment/locale/pl.js",
|
209
|
+
"./pt": "./node_modules/moment/locale/pt.js",
|
210
|
+
"./pt-br": "./node_modules/moment/locale/pt-br.js",
|
211
|
+
"./pt-br.js": "./node_modules/moment/locale/pt-br.js",
|
212
|
+
"./pt.js": "./node_modules/moment/locale/pt.js",
|
213
|
+
"./ro": "./node_modules/moment/locale/ro.js",
|
214
|
+
"./ro.js": "./node_modules/moment/locale/ro.js",
|
215
|
+
"./ru": "./node_modules/moment/locale/ru.js",
|
216
|
+
"./ru.js": "./node_modules/moment/locale/ru.js",
|
217
|
+
"./sd": "./node_modules/moment/locale/sd.js",
|
218
|
+
"./sd.js": "./node_modules/moment/locale/sd.js",
|
219
|
+
"./se": "./node_modules/moment/locale/se.js",
|
220
|
+
"./se.js": "./node_modules/moment/locale/se.js",
|
221
|
+
"./si": "./node_modules/moment/locale/si.js",
|
222
|
+
"./si.js": "./node_modules/moment/locale/si.js",
|
223
|
+
"./sk": "./node_modules/moment/locale/sk.js",
|
224
|
+
"./sk.js": "./node_modules/moment/locale/sk.js",
|
225
|
+
"./sl": "./node_modules/moment/locale/sl.js",
|
226
|
+
"./sl.js": "./node_modules/moment/locale/sl.js",
|
227
|
+
"./sq": "./node_modules/moment/locale/sq.js",
|
228
|
+
"./sq.js": "./node_modules/moment/locale/sq.js",
|
229
|
+
"./sr": "./node_modules/moment/locale/sr.js",
|
230
|
+
"./sr-cyrl": "./node_modules/moment/locale/sr-cyrl.js",
|
231
|
+
"./sr-cyrl.js": "./node_modules/moment/locale/sr-cyrl.js",
|
232
|
+
"./sr.js": "./node_modules/moment/locale/sr.js",
|
233
|
+
"./ss": "./node_modules/moment/locale/ss.js",
|
234
|
+
"./ss.js": "./node_modules/moment/locale/ss.js",
|
235
|
+
"./sv": "./node_modules/moment/locale/sv.js",
|
236
|
+
"./sv.js": "./node_modules/moment/locale/sv.js",
|
237
|
+
"./sw": "./node_modules/moment/locale/sw.js",
|
238
|
+
"./sw.js": "./node_modules/moment/locale/sw.js",
|
239
|
+
"./ta": "./node_modules/moment/locale/ta.js",
|
240
|
+
"./ta.js": "./node_modules/moment/locale/ta.js",
|
241
|
+
"./te": "./node_modules/moment/locale/te.js",
|
242
|
+
"./te.js": "./node_modules/moment/locale/te.js",
|
243
|
+
"./tet": "./node_modules/moment/locale/tet.js",
|
244
|
+
"./tet.js": "./node_modules/moment/locale/tet.js",
|
245
|
+
"./tg": "./node_modules/moment/locale/tg.js",
|
246
|
+
"./tg.js": "./node_modules/moment/locale/tg.js",
|
247
|
+
"./th": "./node_modules/moment/locale/th.js",
|
248
|
+
"./th.js": "./node_modules/moment/locale/th.js",
|
249
|
+
"./tl-ph": "./node_modules/moment/locale/tl-ph.js",
|
250
|
+
"./tl-ph.js": "./node_modules/moment/locale/tl-ph.js",
|
251
|
+
"./tlh": "./node_modules/moment/locale/tlh.js",
|
252
|
+
"./tlh.js": "./node_modules/moment/locale/tlh.js",
|
253
|
+
"./tr": "./node_modules/moment/locale/tr.js",
|
254
|
+
"./tr.js": "./node_modules/moment/locale/tr.js",
|
255
|
+
"./tzl": "./node_modules/moment/locale/tzl.js",
|
256
|
+
"./tzl.js": "./node_modules/moment/locale/tzl.js",
|
257
|
+
"./tzm": "./node_modules/moment/locale/tzm.js",
|
258
|
+
"./tzm-latn": "./node_modules/moment/locale/tzm-latn.js",
|
259
|
+
"./tzm-latn.js": "./node_modules/moment/locale/tzm-latn.js",
|
260
|
+
"./tzm.js": "./node_modules/moment/locale/tzm.js",
|
261
|
+
"./ug-cn": "./node_modules/moment/locale/ug-cn.js",
|
262
|
+
"./ug-cn.js": "./node_modules/moment/locale/ug-cn.js",
|
263
|
+
"./uk": "./node_modules/moment/locale/uk.js",
|
264
|
+
"./uk.js": "./node_modules/moment/locale/uk.js",
|
265
|
+
"./ur": "./node_modules/moment/locale/ur.js",
|
266
|
+
"./ur.js": "./node_modules/moment/locale/ur.js",
|
267
|
+
"./uz": "./node_modules/moment/locale/uz.js",
|
268
|
+
"./uz-latn": "./node_modules/moment/locale/uz-latn.js",
|
269
|
+
"./uz-latn.js": "./node_modules/moment/locale/uz-latn.js",
|
270
|
+
"./uz.js": "./node_modules/moment/locale/uz.js",
|
271
|
+
"./vi": "./node_modules/moment/locale/vi.js",
|
272
|
+
"./vi.js": "./node_modules/moment/locale/vi.js",
|
273
|
+
"./x-pseudo": "./node_modules/moment/locale/x-pseudo.js",
|
274
|
+
"./x-pseudo.js": "./node_modules/moment/locale/x-pseudo.js",
|
275
|
+
"./yo": "./node_modules/moment/locale/yo.js",
|
276
|
+
"./yo.js": "./node_modules/moment/locale/yo.js",
|
277
|
+
"./zh-cn": "./node_modules/moment/locale/zh-cn.js",
|
278
|
+
"./zh-cn.js": "./node_modules/moment/locale/zh-cn.js",
|
279
|
+
"./zh-hk": "./node_modules/moment/locale/zh-hk.js",
|
280
|
+
"./zh-hk.js": "./node_modules/moment/locale/zh-hk.js",
|
281
|
+
"./zh-tw": "./node_modules/moment/locale/zh-tw.js",
|
282
|
+
"./zh-tw.js": "./node_modules/moment/locale/zh-tw.js"
|
283
|
+
};
|
284
|
+
|
285
|
+
|
286
|
+
function webpackContext(req) {
|
287
|
+
var id = webpackContextResolve(req);
|
288
|
+
return __webpack_require__(id);
|
289
|
+
}
|
290
|
+
function webpackContextResolve(req) {
|
291
|
+
if(!__webpack_require__.o(map, req)) {
|
292
|
+
var e = new Error("Cannot find module '" + req + "'");
|
293
|
+
e.code = 'MODULE_NOT_FOUND';
|
294
|
+
throw e;
|
295
|
+
}
|
296
|
+
return map[req];
|
297
|
+
}
|
298
|
+
webpackContext.keys = function webpackContextKeys() {
|
299
|
+
return Object.keys(map);
|
300
|
+
};
|
301
|
+
webpackContext.resolve = webpackContextResolve;
|
302
|
+
module.exports = webpackContext;
|
303
|
+
webpackContext.id = "./node_modules/moment/locale sync recursive ^\\.\\/.*$";
|
304
|
+
|
305
|
+
/***/ }),
|
306
|
+
|
307
|
+
/***/ "./node_modules/webpack/buildin/global.js":
|
308
|
+
/*!***********************************!*\
|
309
|
+
!*** (webpack)/buildin/global.js ***!
|
310
|
+
\***********************************/
|
311
|
+
/*! no static exports found */
|
312
|
+
/***/ (function(module, exports) {
|
313
|
+
|
314
|
+
var g;
|
315
|
+
|
316
|
+
// This works in non-strict mode
|
317
|
+
g = (function() {
|
318
|
+
return this;
|
319
|
+
})();
|
320
|
+
|
321
|
+
try {
|
322
|
+
// This works if eval is allowed (see CSP)
|
323
|
+
g = g || new Function("return this")();
|
324
|
+
} catch (e) {
|
325
|
+
// This works if the window reference is available
|
326
|
+
if (typeof window === "object") g = window;
|
327
|
+
}
|
328
|
+
|
329
|
+
// g can still be undefined, but nothing to do about it...
|
330
|
+
// We return undefined, instead of nothing here, so it's
|
331
|
+
// easier to handle this case. if(!global) { ...}
|
332
|
+
|
333
|
+
module.exports = g;
|
334
|
+
|
335
|
+
|
336
|
+
/***/ }),
|
337
|
+
|
338
|
+
/***/ "./src/data/runtime-log-entry.js":
|
339
|
+
/*!***************************************!*\
|
340
|
+
!*** ./src/data/runtime-log-entry.js ***!
|
341
|
+
\***************************************/
|
342
|
+
/*! exports provided: RuntimeLogEntry */
|
343
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
344
|
+
|
345
|
+
"use strict";
|
346
|
+
__webpack_require__.r(__webpack_exports__);
|
347
|
+
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RuntimeLogEntry", function() { return RuntimeLogEntry; });
|
348
|
+
class RuntimeLogEntry
|
349
|
+
{
|
350
|
+
constructor(separator)
|
351
|
+
{
|
352
|
+
this.sep = separator
|
353
|
+
}
|
354
|
+
|
355
|
+
static fromArray(separator, logEntryData)
|
356
|
+
{
|
357
|
+
let rle = new RuntimeLogEntry(separator);
|
358
|
+
|
359
|
+
rle.date = logEntryData[0];
|
360
|
+
rle.time = logEntryData[1];
|
361
|
+
rle.dateTime = rle._getDateTime();
|
362
|
+
rle.level = logEntryData[2].trim();
|
363
|
+
rle.thread = logEntryData[3];
|
364
|
+
rle.clazz = logEntryData[4];
|
365
|
+
rle.message = logEntryData[6];
|
366
|
+
|
367
|
+
return rle;
|
368
|
+
}
|
369
|
+
|
370
|
+
_getDateTime()
|
371
|
+
{
|
372
|
+
return this.date + '\n' + this.time;
|
373
|
+
}
|
374
|
+
}
|
375
|
+
|
376
|
+
|
377
|
+
/***/ }),
|
378
|
+
|
379
|
+
/***/ "./src/modules/log-viewer.js":
|
380
|
+
/*!***********************************!*\
|
381
|
+
!*** ./src/modules/log-viewer.js ***!
|
382
|
+
\***********************************/
|
383
|
+
/*! exports provided: default */
|
384
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
385
|
+
|
386
|
+
"use strict";
|
387
|
+
__webpack_require__.r(__webpack_exports__);
|
388
|
+
/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LogViewer; });
|
389
|
+
/* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-module */ "./src/modules/base-module.js");
|
390
|
+
/* harmony import */ var _data_runtime_log_entry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data/runtime-log-entry */ "./src/data/runtime-log-entry.js");
|
391
|
+
/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! file-saver */ "./node_modules/file-saver/dist/FileSaver.min.js");
|
392
|
+
/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_2__);
|
393
|
+
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
|
394
|
+
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_3__);
|
395
|
+
/* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/utilities */ "./src/utils/utilities.js");
|
396
|
+
|
397
|
+
|
398
|
+
|
399
|
+
|
400
|
+
|
401
|
+
|
402
|
+
class LogViewer extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
|
403
|
+
{
|
404
|
+
constructor()
|
405
|
+
{
|
406
|
+
super('logViewer');
|
407
|
+
|
408
|
+
this.COMMANDS_PREFIX = 'logViewer';
|
409
|
+
this.HELP_URL = '/admintool-LogViewer';
|
410
|
+
|
411
|
+
this.ANY_LEVEL = '[any]';
|
412
|
+
this.LEVELS = ['TRACE','DEBUG','INFO','WARN','ERROR'];
|
413
|
+
this.ANY_CLASS = '[any]';
|
414
|
+
|
415
|
+
this.LOG_DATA_LABEL = 'lines';
|
416
|
+
|
417
|
+
this.BOOT_LOG_BACKUP_ID = 'SFS2X_BootLog';
|
418
|
+
this.RUNTIME_LOG_BACKUP_ID = 'SFS2X_RuntimeLog';
|
419
|
+
this.FULL_BACKUP_ID = 'SFS2X_Logs';
|
420
|
+
|
421
|
+
// Outgoing requests
|
422
|
+
this.REQ_GET_RUNTIME_LOG = 'getRunLog';
|
423
|
+
this.REQ_GET_BOOT_LOG = 'getBootLog';
|
424
|
+
this.REQ_GET_BACKUPS_STATUS = 'getBakStatus';
|
425
|
+
this.REQ_BACKUP_BOOT_LOG = 'bakBootLog';
|
426
|
+
this.REQ_BACKUP_RUNTIME_LOG = 'bakRunLog';
|
427
|
+
this.REQ_BACKUP_FULL_LOGS = 'bakFullLogs';
|
428
|
+
this.REQ_DELETE_BACKUP = 'delBackup';
|
429
|
+
|
430
|
+
// Incoming responses
|
431
|
+
this.RESP_INIT_ERROR = 'initErr';
|
432
|
+
this.RESP_RUNTIME_LOG_ERROR = 'runLogErr';
|
433
|
+
this.RESP_RUNTIME_LOG_INVALID = 'runLogInv';
|
434
|
+
this.RESP_RUNTIME_LOG = 'runLog';
|
435
|
+
this.RESP_BOOT_LOG_ERROR = 'bootLogErr';
|
436
|
+
this.RESP_BOOT_LOG = 'bootLog';
|
437
|
+
this.RESP_BACKUPS_STATUS = 'bakStatus';
|
438
|
+
this.RESP_DELETE_BACKUP_FAILED = 'delBakFail';
|
439
|
+
this.RESP_BACKUP_ERROR = 'bakError';
|
440
|
+
this.RESP_BACKUP_WARNING = 'bakWarn';
|
441
|
+
}
|
442
|
+
|
443
|
+
//------------------------------------
|
444
|
+
// COMMON MODULE INTERFACE METHODS
|
445
|
+
// This members are used by the main controller
|
446
|
+
// to communicate with the module's controller.
|
447
|
+
//------------------------------------
|
448
|
+
|
449
|
+
initialize(idData, shellController)
|
450
|
+
{
|
451
|
+
// Call super method
|
452
|
+
super.initialize(idData, shellController);
|
453
|
+
|
454
|
+
// Initialize scrolling tabs
|
455
|
+
$('#lgv-tabNavigator > #tabs').scrollingTabs({
|
456
|
+
bootstrapVersion: 4,
|
457
|
+
scrollToTabEdge: true,
|
458
|
+
enableSwiping: true,
|
459
|
+
disableScrollArrowsOnFullyScrolled: true,
|
460
|
+
cssClassLeftArrow: 'fa fa-chevron-left',
|
461
|
+
cssClassRightArrow: 'fa fa-chevron-right'
|
462
|
+
});
|
463
|
+
|
464
|
+
// Add listener to tab shown event
|
465
|
+
$('a[data-toggle="tab"]').on('shown.bs.tab', $.proxy(this._onTabShown, this));
|
466
|
+
|
467
|
+
// Initialize log lines dropdown
|
468
|
+
this._logLinesDD = $('#lgv-logLinesDD').kendoDropDownList({
|
469
|
+
valueTemplate: '<span class="text-muted pr-1">Log entries:</span><span>#:data.text#</span>',
|
470
|
+
}).data('kendoDropDownList');
|
471
|
+
|
472
|
+
// Initialize load button
|
473
|
+
$('#lgv-loadBt').on('click', $.proxy(this._onRuntimeLogLoadBtClick, this));
|
474
|
+
|
475
|
+
// Initialize progress bars
|
476
|
+
$('.progress-bar').kendoProgressBar({
|
477
|
+
min: 0,
|
478
|
+
max: 100,
|
479
|
+
value: false,
|
480
|
+
type: 'value',
|
481
|
+
animation: {
|
482
|
+
duration: 400
|
483
|
+
}
|
484
|
+
});
|
485
|
+
|
486
|
+
// Initialize level filter dropdown
|
487
|
+
this._levelFilterDD = $('#lgv-levelDD').kendoDropDownList({
|
488
|
+
dataSource: [this.ANY_LEVEL].concat(this.LEVELS),
|
489
|
+
change: $.proxy(this._onFilterChange, this)
|
490
|
+
}).data('kendoDropDownList');
|
491
|
+
|
492
|
+
// Initialize class filter dropdown
|
493
|
+
this._classFilterDD = $('#lgv-classDD').kendoDropDownList({
|
494
|
+
change: $.proxy(this._onFilterChange, this)
|
495
|
+
}).data('kendoDropDownList');
|
496
|
+
|
497
|
+
// Initialize message filter input
|
498
|
+
$('#lgv-messageIn').on('input', $.proxy(this._onFilterChange, this));
|
499
|
+
|
500
|
+
// Initialize clear button
|
501
|
+
$('#lgv-clearFilterBt').on('click', $.proxy(this._onClearFilterClick, this));
|
502
|
+
|
503
|
+
// Initialize export button
|
504
|
+
$('#lgv-exportRuntimeLogBt').on('click', $.proxy(this._onExportRuntimeLogBtClick, this));
|
505
|
+
|
506
|
+
// Initialize runtime log grid
|
507
|
+
this._runtimeLogGrid = $('#lgv-runtimeLogGrid').kendoGrid({
|
508
|
+
scrollable: true,
|
509
|
+
sortable: false,
|
510
|
+
//resizable: true,
|
511
|
+
selectable: false,
|
512
|
+
columns:
|
513
|
+
[
|
514
|
+
{
|
515
|
+
field: 'dateTime',
|
516
|
+
width: 150,
|
517
|
+
title: 'Date/Time',
|
518
|
+
},
|
519
|
+
{
|
520
|
+
field: 'level',
|
521
|
+
width: 100,
|
522
|
+
title: 'Level',
|
523
|
+
},
|
524
|
+
{
|
525
|
+
field: 'thread',
|
526
|
+
width: 150,
|
527
|
+
title: 'Thread',
|
528
|
+
},
|
529
|
+
{
|
530
|
+
field: 'clazz',
|
531
|
+
width: 250,
|
532
|
+
title: 'Class',
|
533
|
+
},
|
534
|
+
{
|
535
|
+
field: 'message',
|
536
|
+
width: 1000,
|
537
|
+
title: 'Message',
|
538
|
+
},
|
539
|
+
],
|
540
|
+
noRecords: {
|
541
|
+
template: 'No log entries to display.'
|
542
|
+
},
|
543
|
+
dataSource: []
|
544
|
+
}).data('kendoGrid');
|
545
|
+
|
546
|
+
// Initialize boot log view buttons
|
547
|
+
$('#lgv-exportBootLogBt').on('click', $.proxy(this._onExportBootLogBtClick, this));
|
548
|
+
$('#lgv-switchBootLogColorBt').on('click', $.proxy(this._onSwitchBootLogColorBtClick, this));
|
549
|
+
|
550
|
+
// Initialize generate backup buttons
|
551
|
+
$('#lgv-bootLogBackupCard .backup-button').on('click', $.proxy(this._onBootLogGenerateBtClick, this));
|
552
|
+
$('#lgv-runtimeLogBackupCard .backup-button').on('click', $.proxy(this._onRuntimeLogGenerateBtClick, this));
|
553
|
+
$('#lgv-fullLogBackupCard .backup-button').on('click', $.proxy(this._onFullLogsGenerateBtClick, this));
|
554
|
+
|
555
|
+
this._initBackupCard('#lgv-bootLogBackupCard');
|
556
|
+
this._initBackupCard('#lgv-runtimeLogBackupCard');
|
557
|
+
this._initBackupCard('#lgv-fullLogBackupCard');
|
558
|
+
|
559
|
+
// Initialize download grid
|
560
|
+
this._downloadGrid = $('#lgv-downloadGrid').kendoGrid({
|
561
|
+
scrollable: true,
|
562
|
+
sortable: true,
|
563
|
+
//resizable: true,
|
564
|
+
selectable: 'row',
|
565
|
+
columns:
|
566
|
+
[
|
567
|
+
{
|
568
|
+
field: 'date',
|
569
|
+
width: 100,
|
570
|
+
title: 'Date',
|
571
|
+
},
|
572
|
+
{
|
573
|
+
field: 'time',
|
574
|
+
width: 100,
|
575
|
+
title: 'Time',
|
576
|
+
},
|
577
|
+
{
|
578
|
+
field: 'name',
|
579
|
+
width: 300,
|
580
|
+
title: 'Filename',
|
581
|
+
},
|
582
|
+
{
|
583
|
+
field: 'size',
|
584
|
+
width: 100,
|
585
|
+
title: 'Size',
|
586
|
+
},
|
587
|
+
],
|
588
|
+
noRecords: {
|
589
|
+
template: 'No backups available.'
|
590
|
+
},
|
591
|
+
change: $.proxy(this._onDownloadGridSelectionChange, this),
|
592
|
+
dataSource: []
|
593
|
+
}).data('kendoGrid');
|
594
|
+
|
595
|
+
// Initialize delete button
|
596
|
+
$('#lgv-deleteBt').on('click', $.proxy(this._onDeleteBtClick, this));
|
597
|
+
}
|
598
|
+
|
599
|
+
destroy()
|
600
|
+
{
|
601
|
+
// Call super method
|
602
|
+
super.destroy();
|
603
|
+
|
604
|
+
// Remove listener to tab shown event
|
605
|
+
$('a[data-toggle="tab"]').off('shown.bs.tab');
|
606
|
+
|
607
|
+
// Destroy scrolling tabs
|
608
|
+
$('#lgv-tabNavigator #tabs').scrollingTabs('destroy');
|
609
|
+
|
610
|
+
// Remove click listeners
|
611
|
+
$('#lgv-loadBt').off('click');
|
612
|
+
$('#lgv-exportBootLogBt').off('click');
|
613
|
+
$('#lgv-switchBootLogColorBt').off('click');
|
614
|
+
$('#lgv-bootLogBackupCard .backup-button').off('click');
|
615
|
+
$('#lgv-runtimeLogBackupCard .backup-button').off('click');
|
616
|
+
$('#lgv-clearFilterBt').off('click');
|
617
|
+
$('#lgv-deleteBt').off('click');
|
618
|
+
|
619
|
+
$('#lgv-messageIn').off('input');
|
620
|
+
}
|
621
|
+
|
622
|
+
onExtensionCommand(command, data)
|
623
|
+
{
|
624
|
+
// Error during initialization (unable to access log4j configuration file)
|
625
|
+
if (command == this.RESP_INIT_ERROR)
|
626
|
+
{
|
627
|
+
const error = data.getUtfString('error');
|
628
|
+
|
629
|
+
// Show an alert
|
630
|
+
this.shellCtrl.showSimpleAlert(error, true);
|
631
|
+
|
632
|
+
// Set all tabs to show errors
|
633
|
+
this._switchBootViewStack('lgv-bootLogErrorView');
|
634
|
+
this._switchRuntimeViewStack('lgv-runtimeLogErrorView');
|
635
|
+
this._switchDownloadViewStack('lgv-downloadErrorView');
|
636
|
+
|
637
|
+
// Disable runtime log controls
|
638
|
+
this._enableRuntimeLogControls(false);
|
639
|
+
|
640
|
+
this._initFailed = true;
|
641
|
+
}
|
642
|
+
|
643
|
+
// Error responses
|
644
|
+
else if (command == this.RESP_BOOT_LOG_ERROR || command == this.RESP_RUNTIME_LOG_ERROR)
|
645
|
+
{
|
646
|
+
const error = data.getUtfString('error');
|
647
|
+
|
648
|
+
// Show an alert
|
649
|
+
this.shellCtrl.showSimpleAlert(error, true);
|
650
|
+
|
651
|
+
if (command == this.RESP_BOOT_LOG_ERROR)
|
652
|
+
{
|
653
|
+
// Set tab to show error
|
654
|
+
this._switchBootViewStack('lgv-bootLogErrorView');
|
655
|
+
|
656
|
+
// Disable boot log backup generation
|
657
|
+
this._bootLogBackupUnavailable = true;
|
658
|
+
this._disableBackupInterface(false);
|
659
|
+
|
660
|
+
this._bootLogRequested = true;
|
661
|
+
}
|
662
|
+
|
663
|
+
if (command == this.RESP_RUNTIME_LOG_ERROR)
|
664
|
+
{
|
665
|
+
// Disable controls
|
666
|
+
this._enableRuntimeLogControls(false);
|
667
|
+
|
668
|
+
// Remove loading bar (runtime log)
|
669
|
+
this._switchRuntimeViewStack('lgv-runtimeLogErrorView');
|
670
|
+
|
671
|
+
// Disable runtime log backup download
|
672
|
+
this._runtimeLogBackupUnavailable = true;
|
673
|
+
this._disableBackupInterface(false);
|
674
|
+
}
|
675
|
+
}
|
676
|
+
|
677
|
+
// Modified conversion pattern in the log4j properties file: unable to parse the log
|
678
|
+
else if (command == this.RESP_RUNTIME_LOG_INVALID)
|
679
|
+
{
|
680
|
+
// Disable controls
|
681
|
+
this._enableRuntimeLogControls(false);
|
682
|
+
|
683
|
+
// Fill in error message
|
684
|
+
$('#lgv-convPattName').text(data.getUtfString('param'));
|
685
|
+
$('#lgv-convPattVal').text(data.getUtfString('value'));
|
686
|
+
|
687
|
+
// Remove loading bar (runtime log)
|
688
|
+
this._switchRuntimeViewStack('lgv-invConvPattView');
|
689
|
+
}
|
690
|
+
|
691
|
+
// Runtime log received
|
692
|
+
else if (command == this.RESP_RUNTIME_LOG)
|
693
|
+
{
|
694
|
+
let classes = [];
|
695
|
+
classes.push(this.ANY_CLASS);
|
696
|
+
|
697
|
+
let logEntries = data.getUtfStringArray(this.LOG_DATA_LABEL);
|
698
|
+
let separator = data.getUtfString('sep');
|
699
|
+
let columns = data.getInt('cols');
|
700
|
+
let dsArr = [];
|
701
|
+
|
702
|
+
this._totalRuntimeLogEntries = logEntries.length;
|
703
|
+
|
704
|
+
// Parse log entries
|
705
|
+
// We can't use the split method because there could be instances of the separator in the log message too
|
706
|
+
for (let e = 0; e < logEntries.length; e++)
|
707
|
+
{
|
708
|
+
const logEntry = logEntries[e];
|
709
|
+
|
710
|
+
let logEntryData = [];
|
711
|
+
let startIndex = 0;
|
712
|
+
|
713
|
+
for (let c = 0; c < columns - 1; c++)
|
714
|
+
{
|
715
|
+
let endIndex = logEntry.indexOf(separator, startIndex);
|
716
|
+
logEntryData.push(logEntry.substring(startIndex, endIndex));
|
717
|
+
startIndex = endIndex + separator.length;
|
718
|
+
}
|
719
|
+
|
720
|
+
if (startIndex < logEntry.length)
|
721
|
+
logEntryData.push(logEntry.substring(startIndex));
|
722
|
+
|
723
|
+
// Fill datagrid's dataprovider
|
724
|
+
let rle = _data_runtime_log_entry__WEBPACK_IMPORTED_MODULE_1__["RuntimeLogEntry"].fromArray(separator, logEntryData);
|
725
|
+
dsArr.push(rle);
|
726
|
+
|
727
|
+
// Add class to filtering dropdown
|
728
|
+
if (classes.indexOf(rle.clazz) < 0)
|
729
|
+
classes.push(rle.clazz);
|
730
|
+
}
|
731
|
+
|
732
|
+
// Show classes list
|
733
|
+
classes.sort(function (a, b) {
|
734
|
+
return a.localeCompare(b);
|
735
|
+
});
|
736
|
+
|
737
|
+
this._classFilterDD.setDataSource(classes);
|
738
|
+
this._classFilterDD.select(0);
|
739
|
+
|
740
|
+
// Assign data source to grid
|
741
|
+
let ds = new kendo.data.DataSource({
|
742
|
+
data: dsArr
|
743
|
+
})
|
744
|
+
|
745
|
+
this._setRuntimeLogDataSource(ds);
|
746
|
+
|
747
|
+
// Re-enable log loading controls
|
748
|
+
this._enableRuntimeLogControls(true);
|
749
|
+
|
750
|
+
// Remove loading bar
|
751
|
+
this._switchRuntimeViewStack('lgv-runtimeLogView');
|
752
|
+
}
|
753
|
+
|
754
|
+
// Boot log received
|
755
|
+
else if (command == this.RESP_BOOT_LOG)
|
756
|
+
{
|
757
|
+
const bootLogEntries = data.getSFSArray(this.LOG_DATA_LABEL);
|
758
|
+
let text = '';
|
759
|
+
|
760
|
+
for (let i = 0; i < bootLogEntries.size(); i++)
|
761
|
+
text += bootLogEntries.getUtfString(i) + '\n';
|
762
|
+
|
763
|
+
$('#lgv-bootLogText').text(text);
|
764
|
+
|
765
|
+
// Remove loading bar
|
766
|
+
this._switchBootViewStack('lgv-bootLogView');
|
767
|
+
}
|
768
|
+
|
769
|
+
// Logs backups status received
|
770
|
+
else if (command == this.RESP_BACKUPS_STATUS)
|
771
|
+
{
|
772
|
+
// Show/hide operation in progress message
|
773
|
+
this._disableBackupInterface(data.getBool('running'), data.getUtfString('type'));
|
774
|
+
|
775
|
+
// Backup files list
|
776
|
+
if (data.containsKey('files'))
|
777
|
+
{
|
778
|
+
let files = data.getSFSArray('files');
|
779
|
+
|
780
|
+
let lastBootLogBackupFound = false;
|
781
|
+
let lastRuntimeLogBackupFound = false;
|
782
|
+
let lastFullBackupFound = false;
|
783
|
+
|
784
|
+
let backupsList = [];
|
785
|
+
|
786
|
+
const webServerProtocol = (data.containsKey('protocol') ? data.getUtfString('protocol') : 'http') + '://';
|
787
|
+
const webServerPort = (data.containsKey('port') ? ':' + data.getInt('port') : '');
|
788
|
+
|
789
|
+
let totalSize = 0;
|
790
|
+
|
791
|
+
for (let f = 0; f < files.size(); f++)
|
792
|
+
{
|
793
|
+
const file = files.getSFSObject(f);
|
794
|
+
|
795
|
+
const filePath = file.getUtfString('path');
|
796
|
+
|
797
|
+
const fileObj = {};
|
798
|
+
fileObj.path = filePath;
|
799
|
+
fileObj.url = webServerProtocol + this.smartFox.config.host + webServerPort + '/' + filePath;
|
800
|
+
fileObj.name = filePath.substr(filePath.lastIndexOf('/') + 1);
|
801
|
+
fileObj.date = file.getUtfString('date');
|
802
|
+
fileObj.time = file.getUtfString('time');
|
803
|
+
fileObj.size = Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_4__["bytesToSize"])(file.getLong('size'), 2);
|
804
|
+
|
805
|
+
totalSize += file.getLong('size');
|
806
|
+
|
807
|
+
// Check if this is a boot log backup
|
808
|
+
if (!lastBootLogBackupFound)
|
809
|
+
{
|
810
|
+
if (fileObj.name.startsWith(this.BOOT_LOG_BACKUP_ID))
|
811
|
+
{
|
812
|
+
this._fillBackupCard('#lgv-bootLogBackupCard', fileObj);
|
813
|
+
|
814
|
+
lastBootLogBackupFound = true;
|
815
|
+
}
|
816
|
+
}
|
817
|
+
|
818
|
+
// Check if this is a runtime log backup
|
819
|
+
if (!lastRuntimeLogBackupFound)
|
820
|
+
{
|
821
|
+
if (fileObj.name.startsWith(this.RUNTIME_LOG_BACKUP_ID))
|
822
|
+
{
|
823
|
+
this._fillBackupCard('#lgv-runtimeLogBackupCard', fileObj);
|
824
|
+
|
825
|
+
lastRuntimeLogBackupFound = true;
|
826
|
+
}
|
827
|
+
}
|
828
|
+
|
829
|
+
// Check if this is a full backup
|
830
|
+
if (!lastFullBackupFound)
|
831
|
+
{
|
832
|
+
if (fileObj.name.startsWith(this.FULL_BACKUP_ID))
|
833
|
+
{
|
834
|
+
this._fillBackupCard('#lgv-fullLogBackupCard', fileObj);
|
835
|
+
|
836
|
+
lastFullBackupFound = true;
|
837
|
+
}
|
838
|
+
}
|
839
|
+
|
840
|
+
// Populate logs list
|
841
|
+
backupsList.push(fileObj);
|
842
|
+
}
|
843
|
+
|
844
|
+
// Show total backups size
|
845
|
+
$('#lgv-logSizeLb').html(`Total size: <strong>${Object(_utils_utilities__WEBPACK_IMPORTED_MODULE_4__["bytesToSize"])(totalSize, 2, 'KB')}</strong>`);
|
846
|
+
|
847
|
+
// Assign data source to grid
|
848
|
+
this._setDownloadGridDataSource(backupsList);
|
849
|
+
this._onDownloadGridSelectionChange();
|
850
|
+
|
851
|
+
// Hide links to latest files if not available
|
852
|
+
if (!lastBootLogBackupFound)
|
853
|
+
this._fillBackupCard('#lgv-bootLogBackupCard', null);
|
854
|
+
|
855
|
+
if (!lastRuntimeLogBackupFound)
|
856
|
+
this._fillBackupCard('#lgv-runtimeLogBackupCard', null);
|
857
|
+
|
858
|
+
if (!lastFullBackupFound)
|
859
|
+
this._fillBackupCard('#lgv-fullLogBackupCard', null);
|
860
|
+
|
861
|
+
if (data.containsKey('message'))
|
862
|
+
{
|
863
|
+
// Display notification
|
864
|
+
this.shellCtrl.showNotification(`Log backup warning`, data.getUtfString('message'));
|
865
|
+
}
|
866
|
+
}
|
867
|
+
|
868
|
+
// Set download view to main
|
869
|
+
this._switchDownloadViewStack('lgv-downloadView');
|
870
|
+
}
|
871
|
+
|
872
|
+
// Logs backup deletion failed
|
873
|
+
else if (command == this.RESP_DELETE_BACKUP_FAILED)
|
874
|
+
{
|
875
|
+
const error = data.getUtfString('error');
|
876
|
+
|
877
|
+
// Show an alert
|
878
|
+
this.shellCtrl.showSimpleAlert(error, true);
|
879
|
+
}
|
880
|
+
|
881
|
+
// A blocking error occurred during backup operation
|
882
|
+
else if (command == this.RESP_BACKUP_ERROR)
|
883
|
+
{
|
884
|
+
const error = data.getUtfString('error');
|
885
|
+
|
886
|
+
// Show an alert
|
887
|
+
this.shellCtrl.showSimpleAlert(error, true);
|
888
|
+
}
|
889
|
+
|
890
|
+
// An non-blocking error occurred during backup operation
|
891
|
+
else if (command == this.RESP_BACKUP_WARNING)
|
892
|
+
{
|
893
|
+
let warn = data.getUtfString('warn');
|
894
|
+
|
895
|
+
// Display notification
|
896
|
+
this.shellCtrl.showNotification(`Log backup warning`, warn);
|
897
|
+
}
|
898
|
+
}
|
899
|
+
|
900
|
+
//---------------------------------
|
901
|
+
// UI EVENT LISTENERS
|
902
|
+
//---------------------------------
|
903
|
+
|
904
|
+
_onTabShown(e)
|
905
|
+
{
|
906
|
+
if (!this._initFailed)
|
907
|
+
{
|
908
|
+
// If boot log view was displayed...
|
909
|
+
if (e.target.id == 'lgv-bootLog-tab')
|
910
|
+
{
|
911
|
+
// Load boot log the first time the tab is selected
|
912
|
+
if (!this._bootLogRequested)
|
913
|
+
{
|
914
|
+
this.sendExtensionRequest(this.REQ_GET_BOOT_LOG);
|
915
|
+
this._bootLogRequested = true;
|
916
|
+
}
|
917
|
+
}
|
918
|
+
|
919
|
+
// If backup&dowload view was displayed...
|
920
|
+
else if (e.target.id == 'lgv-logsDownload-tab')
|
921
|
+
{
|
922
|
+
// Request logs backup status the first time the tab is selected
|
923
|
+
if (!this._backupStatusRequested)
|
924
|
+
{
|
925
|
+
this.sendExtensionRequest(this.REQ_GET_BACKUPS_STATUS);
|
926
|
+
this._backupStatusRequested = true;
|
927
|
+
}
|
928
|
+
}
|
929
|
+
}
|
930
|
+
}
|
931
|
+
|
932
|
+
_onRuntimeLogLoadBtClick()
|
933
|
+
{
|
934
|
+
// Request log
|
935
|
+
this._loadRuntimeLog();
|
936
|
+
}
|
937
|
+
|
938
|
+
_onExportBootLogBtClick()
|
939
|
+
{
|
940
|
+
// Export log to file
|
941
|
+
this._exportLog($('#lgv-bootLogText').text(), this.BOOT_LOG_BACKUP_ID);
|
942
|
+
}
|
943
|
+
|
944
|
+
_onSwitchBootLogColorBtClick()
|
945
|
+
{
|
946
|
+
if ($('#lgv-bootLogText').hasClass('invert'))
|
947
|
+
$('#lgv-bootLogText').removeClass('invert');
|
948
|
+
else
|
949
|
+
$('#lgv-bootLogText').addClass('invert');
|
950
|
+
}
|
951
|
+
|
952
|
+
_onBootLogGenerateBtClick()
|
953
|
+
{
|
954
|
+
// Show/hide operation in progress message
|
955
|
+
this._disableBackupInterface(true, this.BOOT_LOG_BACKUP_ID);
|
956
|
+
|
957
|
+
// Request backup generation
|
958
|
+
this.sendExtensionRequest(this.REQ_BACKUP_BOOT_LOG);
|
959
|
+
}
|
960
|
+
|
961
|
+
_onRuntimeLogGenerateBtClick()
|
962
|
+
{
|
963
|
+
// Show/hide operation in progress message
|
964
|
+
this._disableBackupInterface(true, this.RUNTIME_LOG_BACKUP_ID);
|
965
|
+
|
966
|
+
// Request backup generation
|
967
|
+
this.sendExtensionRequest(this.REQ_BACKUP_RUNTIME_LOG);
|
968
|
+
}
|
969
|
+
|
970
|
+
_onFullLogsGenerateBtClick()
|
971
|
+
{
|
972
|
+
// Show/hide operation in progress message
|
973
|
+
this._disableBackupInterface(true, this.FULL_BACKUP_ID);
|
974
|
+
|
975
|
+
// Request backup generation
|
976
|
+
this.sendExtensionRequest(this.REQ_BACKUP_FULL_LOGS);
|
977
|
+
}
|
978
|
+
|
979
|
+
_onFilterChange()
|
980
|
+
{
|
981
|
+
// Set filters
|
982
|
+
this._setRuntimeLogDataSource(this._runtimeLogGrid.dataSource);
|
983
|
+
}
|
984
|
+
|
985
|
+
_onClearFilterClick()
|
986
|
+
{
|
987
|
+
this._clearRuntimeLogFilters();
|
988
|
+
this._setRuntimeLogDataSource(this._runtimeLogGrid.dataSource);
|
989
|
+
}
|
990
|
+
|
991
|
+
_onExportRuntimeLogBtClick()
|
992
|
+
{
|
993
|
+
let log = '';
|
994
|
+
const entries = this._runtimeLogGrid.dataSource.view();
|
995
|
+
|
996
|
+
for (let i = 0; i < entries.length; i++)
|
997
|
+
{
|
998
|
+
const item = entries[i];
|
999
|
+
log += [item.date, item.time, item.level, item.thread, item.clazz, item.message].join(item.sep) + '\n';
|
1000
|
+
}
|
1001
|
+
|
1002
|
+
// Export log to file
|
1003
|
+
this._exportLog(log, this.RUNTIME_LOG_BACKUP_ID);
|
1004
|
+
}
|
1005
|
+
|
1006
|
+
_onDownloadGridSelectionChange()
|
1007
|
+
{
|
1008
|
+
// Enable/disable buttons
|
1009
|
+
const selectedRows = this._downloadGrid.select();
|
1010
|
+
$('#lgv-downloadBt').attr('disabled', selectedRows.length == 0);
|
1011
|
+
$('#lgv-deleteBt').attr('disabled', selectedRows.length == 0);
|
1012
|
+
|
1013
|
+
if (selectedRows.length > 0)
|
1014
|
+
{
|
1015
|
+
let dataItem = this._downloadGrid.dataItem(selectedRows[0]);
|
1016
|
+
$('#lgv-downloadBt').attr('href', dataItem.url);
|
1017
|
+
}
|
1018
|
+
else
|
1019
|
+
$('#lgv-downloadBt').attr('href', '#');
|
1020
|
+
}
|
1021
|
+
|
1022
|
+
_onDeleteBtClick()
|
1023
|
+
{
|
1024
|
+
let selectedRows = this._downloadGrid.select();
|
1025
|
+
|
1026
|
+
if (selectedRows.length > 0)
|
1027
|
+
{
|
1028
|
+
let dataItem = this._downloadGrid.dataItem(selectedRows[0]);
|
1029
|
+
|
1030
|
+
// Request backup deletion
|
1031
|
+
let params = new SFS2X.SFSObject();
|
1032
|
+
params.putUtfString('file', dataItem.name);
|
1033
|
+
|
1034
|
+
this.sendExtensionRequest(this.REQ_DELETE_BACKUP, params);
|
1035
|
+
}
|
1036
|
+
}
|
1037
|
+
|
1038
|
+
//------------------------------------
|
1039
|
+
// PRIVATE METHODS
|
1040
|
+
//------------------------------------
|
1041
|
+
|
1042
|
+
_switchRuntimeViewStack(viewId)
|
1043
|
+
{
|
1044
|
+
document.getElementById('lgv-runtime-viewstack').selectedElement = document.getElementById(viewId);
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
_switchBootViewStack(viewId)
|
1048
|
+
{
|
1049
|
+
document.getElementById('lgv-boot-viewstack').selectedElement = document.getElementById(viewId);
|
1050
|
+
}
|
1051
|
+
|
1052
|
+
_switchDownloadViewStack(viewId)
|
1053
|
+
{
|
1054
|
+
document.getElementById('lgv-download-viewstack').selectedElement = document.getElementById(viewId);
|
1055
|
+
}
|
1056
|
+
|
1057
|
+
_enableRuntimeLogControls(enable)
|
1058
|
+
{
|
1059
|
+
$('#lgv-loadBt').attr('disabled', !enable);
|
1060
|
+
$('#lgv-exportRuntimeLogBt').attr('disabled', !enable);
|
1061
|
+
$('#lgv-filterBt').attr('disabled', !enable);
|
1062
|
+
}
|
1063
|
+
|
1064
|
+
_loadRuntimeLog()
|
1065
|
+
{
|
1066
|
+
// Disable controls to load log, so that impatient users can't send multiple requests
|
1067
|
+
// (it will be enabled again when a response is received)
|
1068
|
+
this._enableRuntimeLogControls(false);
|
1069
|
+
|
1070
|
+
// Clear filters
|
1071
|
+
this._clearRuntimeLogFilters();
|
1072
|
+
|
1073
|
+
// Show loading bar
|
1074
|
+
this._switchRuntimeViewStack('lgv-runtimeLogLoadingView');
|
1075
|
+
|
1076
|
+
// Send request
|
1077
|
+
// (the number of lines to be retrieved is sent)
|
1078
|
+
let params = new SFS2X.SFSObject();
|
1079
|
+
params.putInt('numEntries', Number(this._logLinesDD.value()));
|
1080
|
+
|
1081
|
+
this.sendExtensionRequest(this.REQ_GET_RUNTIME_LOG, params);
|
1082
|
+
}
|
1083
|
+
|
1084
|
+
_clearRuntimeLogFilters()
|
1085
|
+
{
|
1086
|
+
this._levelFilterDD.select(0);
|
1087
|
+
this._classFilterDD.select(0);
|
1088
|
+
$('#lgv-messageIn').val('');
|
1089
|
+
}
|
1090
|
+
|
1091
|
+
_exportLog(log, name)
|
1092
|
+
{
|
1093
|
+
let blob = new Blob([log], {type: "text/plain;charset=utf-8"});
|
1094
|
+
let date = moment__WEBPACK_IMPORTED_MODULE_3__().format('YYYYMMDD_HHmmss');
|
1095
|
+
|
1096
|
+
file_saver__WEBPACK_IMPORTED_MODULE_2__["saveAs"](blob, `${name}_${date}.log`);
|
1097
|
+
}
|
1098
|
+
|
1099
|
+
_setRuntimeLogDataSource(ds)
|
1100
|
+
{
|
1101
|
+
// Read current horizontal scroll value
|
1102
|
+
const scrollLeft = $('#lgv-runtimeLogGrid .k-grid-content', this._runtimeLogGrid.wrapper).scrollLeft();
|
1103
|
+
|
1104
|
+
// Assign data source to grid
|
1105
|
+
this._runtimeLogGrid.setDataSource(ds);
|
1106
|
+
|
1107
|
+
// Set filters
|
1108
|
+
this._setFilters(ds);
|
1109
|
+
|
1110
|
+
// Set horizontal scroll
|
1111
|
+
$('#lgv-runtimeLogGrid .k-grid-content', this._runtimeLogGrid.wrapper).scrollLeft(scrollLeft);
|
1112
|
+
|
1113
|
+
// Update counter
|
1114
|
+
$('#lgv-runtimeLogEntriesLb').text(`Log entries: ${this._totalRuntimeLogEntries} (${ds.total()} displayed)`);
|
1115
|
+
}
|
1116
|
+
|
1117
|
+
_setFilters(ds)
|
1118
|
+
{
|
1119
|
+
let filters = [];
|
1120
|
+
|
1121
|
+
// Level filtering
|
1122
|
+
if (this._levelFilterDD.select() > 0)
|
1123
|
+
filters.push({
|
1124
|
+
field: 'level', operator: 'eq', value: this._levelFilterDD.value()
|
1125
|
+
});
|
1126
|
+
|
1127
|
+
// Class filtering
|
1128
|
+
if (this._classFilterDD.select() > 0)
|
1129
|
+
filters.push({
|
1130
|
+
field: 'clazz', operator: 'eq', value: this._classFilterDD.value()
|
1131
|
+
});
|
1132
|
+
|
1133
|
+
// Message filtering
|
1134
|
+
if ($('#lgv-messageIn').val() != '')
|
1135
|
+
filters.push({
|
1136
|
+
field: 'message', operator: 'contains', value: $('#lgv-messageIn').val()
|
1137
|
+
});
|
1138
|
+
|
1139
|
+
// Set filters
|
1140
|
+
ds.filter(filters);
|
1141
|
+
}
|
1142
|
+
|
1143
|
+
_disableBackupInterface(disable, backupId = null)
|
1144
|
+
{
|
1145
|
+
if (disable)
|
1146
|
+
{
|
1147
|
+
// Show proper progress bar
|
1148
|
+
if (backupId == this.BOOT_LOG_BACKUP_ID)
|
1149
|
+
$('#lgv-bootLogBackupCard .progress-bar').show();
|
1150
|
+
else if (backupId == this.RUNTIME_LOG_BACKUP_ID)
|
1151
|
+
$('#lgv-runtimeLogBackupCard .progress-bar').show();
|
1152
|
+
else if (backupId == this.FULL_BACKUP_ID)
|
1153
|
+
$('#lgv-fullLogBackupCard .progress-bar').show();
|
1154
|
+
|
1155
|
+
// Disable buttons
|
1156
|
+
$('#lgv-bootLogBackupCard .backup-button').attr('disabled', true);
|
1157
|
+
$('#lgv-runtimeLogBackupCard .backup-button').attr('disabled', true);
|
1158
|
+
$('#lgv-fullLogBackupCard .backup-button').attr('disabled', true);
|
1159
|
+
}
|
1160
|
+
else
|
1161
|
+
{
|
1162
|
+
// Hide all progress bar
|
1163
|
+
$('.card-body .progress-bar').hide();
|
1164
|
+
|
1165
|
+
// Enable buttons
|
1166
|
+
$('#lgv-fullLogBackupCard .backup-button').attr('disabled', false);
|
1167
|
+
|
1168
|
+
if (!this._bootLogBackupUnavailable)
|
1169
|
+
$('#lgv-bootLogBackupCard .backup-button').attr('disabled', false);
|
1170
|
+
|
1171
|
+
if (!this._runtimeLogBackupUnavailable)
|
1172
|
+
$('#lgv-runtimeLogBackupCard .backup-button').attr('disabled', false);
|
1173
|
+
}
|
1174
|
+
}
|
1175
|
+
|
1176
|
+
_initBackupCard(idSelector)
|
1177
|
+
{
|
1178
|
+
$(idSelector + ' .backup-details').hide();
|
1179
|
+
$(idSelector + ' .progress-bar').hide();
|
1180
|
+
}
|
1181
|
+
|
1182
|
+
_fillBackupCard(idSelector, detailsObj = null)
|
1183
|
+
{
|
1184
|
+
if (detailsObj == null)
|
1185
|
+
$(idSelector + ' .backup-details').hide();
|
1186
|
+
else
|
1187
|
+
{
|
1188
|
+
$(idSelector + ' .backup-details').show();
|
1189
|
+
|
1190
|
+
$(idSelector + ' .backup-link').attr('href', detailsObj.url);
|
1191
|
+
$(idSelector + ' .backup-date').text(detailsObj.date);
|
1192
|
+
$(idSelector + ' .backup-time').text(detailsObj.time);
|
1193
|
+
$(idSelector + ' .backup-size').text(detailsObj.size);
|
1194
|
+
}
|
1195
|
+
}
|
1196
|
+
|
1197
|
+
_setDownloadGridDataSource(ds)
|
1198
|
+
{
|
1199
|
+
// Read current horizontal scroll value
|
1200
|
+
const scrollLeft = $('#lgv-downloadGrid .k-grid-content', this._downloadGrid.wrapper).scrollLeft();
|
1201
|
+
|
1202
|
+
// Assign data source to grid
|
1203
|
+
this._downloadGrid.setDataSource(ds);
|
1204
|
+
|
1205
|
+
// Set horizontal scroll
|
1206
|
+
$('#lgv-downloadGrid .k-grid-content', this._downloadGrid.wrapper).scrollLeft(scrollLeft);
|
1207
|
+
}
|
1208
|
+
|
1209
|
+
//---------------------------------
|
1210
|
+
// PRIVATE GETTERS
|
1211
|
+
//---------------------------------
|
1212
|
+
|
1213
|
+
|
1214
|
+
}
|
1215
|
+
|
1216
|
+
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
|
1217
|
+
|
1218
|
+
/***/ })
|
1219
|
+
|
1220
|
+
}]);
|
1221
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtOC5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL25vZGVfbW9kdWxlcy9maWxlLXNhdmVyL2Rpc3QvRmlsZVNhdmVyLm1pbi5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvZGF0YS9ydW50aW1lLWxvZy1lbnRyeS5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL2xvZy12aWV3ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKGEsYil7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSxiKTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBleHBvcnRzKWIoKTtlbHNle2IoKSxhLkZpbGVTYXZlcj17ZXhwb3J0czp7fX0uZXhwb3J0c319KSh0aGlzLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihhLGIpe3JldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiBiP2I9e2F1dG9Cb206ITF9Olwib2JqZWN0XCIhPXR5cGVvZiBiJiYoY29uc29sZS53YXJuKFwiRGVwcmVjYXRlZDogRXhwZWN0ZWQgdGhpcmQgYXJndW1lbnQgdG8gYmUgYSBvYmplY3RcIiksYj17YXV0b0JvbTohYn0pLGIuYXV0b0JvbSYmL15cXHMqKD86dGV4dFxcL1xcUyp8YXBwbGljYXRpb25cXC94bWx8XFxTKlxcL1xcUypcXCt4bWwpXFxzKjsuKmNoYXJzZXRcXHMqPVxccyp1dGYtOC9pLnRlc3QoYS50eXBlKT9uZXcgQmxvYihbXCJcXHVGRUZGXCIsYV0se3R5cGU6YS50eXBlfSk6YX1mdW5jdGlvbiBjKGIsYyxkKXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKFwiR0VUXCIsYiksZS5yZXNwb25zZVR5cGU9XCJibG9iXCIsZS5vbmxvYWQ9ZnVuY3Rpb24oKXthKGUucmVzcG9uc2UsYyxkKX0sZS5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcihcImNvdWxkIG5vdCBkb3dubG9hZCBmaWxlXCIpfSxlLnNlbmQoKX1mdW5jdGlvbiBkKGEpe3ZhciBiPW5ldyBYTUxIdHRwUmVxdWVzdDtiLm9wZW4oXCJIRUFEXCIsYSwhMSk7dHJ5e2Iuc2VuZCgpfWNhdGNoKGEpe31yZXR1cm4gMjAwPD1iLnN0YXR1cyYmMjk5Pj1iLnN0YXR1c31mdW5jdGlvbiBlKGEpe3RyeXthLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiKSl9Y2F0Y2goYyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtiLmluaXRNb3VzZUV2ZW50KFwiY2xpY2tcIiwhMCwhMCx3aW5kb3csMCwwLDAsODAsMjAsITEsITEsITEsITEsMCxudWxsKSxhLmRpc3BhdGNoRXZlbnQoYil9fXZhciBmPVwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy53aW5kb3c9PT13aW5kb3c/d2luZG93Olwib2JqZWN0XCI9PXR5cGVvZiBzZWxmJiZzZWxmLnNlbGY9PT1zZWxmP3NlbGY6XCJvYmplY3RcIj09dHlwZW9mIGdsb2JhbCYmZ2xvYmFsLmdsb2JhbD09PWdsb2JhbD9nbG9iYWw6dm9pZCAwLGE9Zi5zYXZlQXN8fChcIm9iamVjdFwiIT10eXBlb2Ygd2luZG93fHx3aW5kb3chPT1mP2Z1bmN0aW9uKCl7fTpcImRvd25sb2FkXCJpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGU/ZnVuY3Rpb24oYixnLGgpe3ZhciBpPWYuVVJMfHxmLndlYmtpdFVSTCxqPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO2c9Z3x8Yi5uYW1lfHxcImRvd25sb2FkXCIsai5kb3dubG9hZD1nLGoucmVsPVwibm9vcGVuZXJcIixcInN0cmluZ1wiPT10eXBlb2YgYj8oai5ocmVmPWIsai5vcmlnaW49PT1sb2NhdGlvbi5vcmlnaW4/ZShqKTpkKGouaHJlZik/YyhiLGcsaCk6ZShqLGoudGFyZ2V0PVwiX2JsYW5rXCIpKTooai5ocmVmPWkuY3JlYXRlT2JqZWN0VVJMKGIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLnJldm9rZU9iamVjdFVSTChqLmhyZWYpfSw0RTQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKGopfSwwKSl9OlwibXNTYXZlT3JPcGVuQmxvYlwiaW4gbmF2aWdhdG9yP2Z1bmN0aW9uKGYsZyxoKXtpZihnPWd8fGYubmFtZXx8XCJkb3dubG9hZFwiLFwic3RyaW5nXCIhPXR5cGVvZiBmKW5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGIoZixoKSxnKTtlbHNlIGlmKGQoZikpYyhmLGcsaCk7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtpLmhyZWY9ZixpLnRhcmdldD1cIl9ibGFua1wiLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKGkpfSl9fTpmdW5jdGlvbihhLGIsZCxlKXtpZihlPWV8fG9wZW4oXCJcIixcIl9ibGFua1wiKSxlJiYoZS5kb2N1bWVudC50aXRsZT1lLmRvY3VtZW50LmJvZHkuaW5uZXJUZXh0PVwiZG93bmxvYWRpbmcuLi5cIiksXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuIGMoYSxiLGQpO3ZhciBnPVwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI9PT1hLnR5cGUsaD0vY29uc3RydWN0b3IvaS50ZXN0KGYuSFRNTEVsZW1lbnQpfHxmLnNhZmFyaSxpPS9DcmlPU1xcL1tcXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigoaXx8ZyYmaCkmJlwib2JqZWN0XCI9PXR5cGVvZiBGaWxlUmVhZGVyKXt2YXIgaj1uZXcgRmlsZVJlYWRlcjtqLm9ubG9hZGVuZD1mdW5jdGlvbigpe3ZhciBhPWoucmVzdWx0O2E9aT9hOmEucmVwbGFjZSgvXmRhdGE6W147XSo7LyxcImRhdGE6YXR0YWNobWVudC9maWxlO1wiKSxlP2UubG9jYXRpb24uaHJlZj1hOmxvY2F0aW9uPWEsZT1udWxsfSxqLnJlYWRBc0RhdGFVUkwoYSl9ZWxzZXt2YXIgaz1mLlVSTHx8Zi53ZWJraXRVUkwsbD1rLmNyZWF0ZU9iamVjdFVSTChhKTtlP2UubG9jYXRpb249bDpsb2NhdGlvbi5ocmVmPWwsZT1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtrLnJldm9rZU9iamVjdFVSTChsKX0sNEU0KX19KTtmLnNhdmVBcz1hLnNhdmVBcz1hLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJihtb2R1bGUuZXhwb3J0cz1hKX0pO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlU2F2ZXIubWluLmpzLm1hcCIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsImV4cG9ydCBjbGFzcyBSdW50aW1lTG9nRW50cnlcbntcblx0Y29uc3RydWN0b3Ioc2VwYXJhdG9yKVxuXHR7XG5cdFx0dGhpcy5zZXAgPSBzZXBhcmF0b3Jcblx0fVxuXG5cdHN0YXRpYyBmcm9tQXJyYXkoc2VwYXJhdG9yLCBsb2dFbnRyeURhdGEpXG5cdHtcblx0XHRsZXQgcmxlID0gbmV3IFJ1bnRpbWVMb2dFbnRyeShzZXBhcmF0b3IpO1xuXG5cdFx0cmxlLmRhdGUgPSBsb2dFbnRyeURhdGFbMF07XG5cdFx0cmxlLnRpbWUgPSBsb2dFbnRyeURhdGFbMV07XG5cdFx0cmxlLmRhdGVUaW1lID0gcmxlLl9nZXREYXRlVGltZSgpO1xuXHRcdHJsZS5sZXZlbCA9IGxvZ0VudHJ5RGF0YVsyXS50cmltKCk7XG5cdFx0cmxlLnRocmVhZCA9IGxvZ0VudHJ5RGF0YVszXTtcblx0XHRybGUuY2xhenogPSBsb2dFbnRyeURhdGFbNF07XG5cdFx0cmxlLm1lc3NhZ2UgPSBsb2dFbnRyeURhdGFbNl07XG5cblx0XHRyZXR1cm4gcmxlO1xuXHR9XG5cblx0X2dldERhdGVUaW1lKClcblx0e1xuXHRcdHJldHVybiB0aGlzLmRhdGUgKyAnXFxuJyArIHRoaXMudGltZTtcblx0fVxufVxuIiwiaW1wb3J0IHtCYXNlTW9kdWxlfSBmcm9tICcuL2Jhc2UtbW9kdWxlJztcbmltcG9ydCB7UnVudGltZUxvZ0VudHJ5fSBmcm9tICcuLi9kYXRhL3J1bnRpbWUtbG9nLWVudHJ5JztcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtieXRlc1RvU2l6ZX0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nVmlld2VyIGV4dGVuZHMgQmFzZU1vZHVsZVxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCdsb2dWaWV3ZXInKTtcblxuXHRcdHRoaXMuQ09NTUFORFNfUFJFRklYID0gJ2xvZ1ZpZXdlcic7XG5cdFx0dGhpcy5IRUxQX1VSTCA9ICcvYWRtaW50b29sLUxvZ1ZpZXdlcic7XG5cblx0XHR0aGlzLkFOWV9MRVZFTCA9ICdbYW55XSc7XG5cdFx0dGhpcy5MRVZFTFMgPSBbJ1RSQUNFJywnREVCVUcnLCdJTkZPJywnV0FSTicsJ0VSUk9SJ107XG5cdFx0dGhpcy5BTllfQ0xBU1MgPSAnW2FueV0nO1xuXG5cdFx0dGhpcy5MT0dfREFUQV9MQUJFTCA9ICdsaW5lcyc7XG5cblx0XHR0aGlzLkJPT1RfTE9HX0JBQ0tVUF9JRCA9ICdTRlMyWF9Cb290TG9nJztcblx0XHR0aGlzLlJVTlRJTUVfTE9HX0JBQ0tVUF9JRCA9ICdTRlMyWF9SdW50aW1lTG9nJztcblx0XHR0aGlzLkZVTExfQkFDS1VQX0lEID0gJ1NGUzJYX0xvZ3MnO1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9HRVRfUlVOVElNRV9MT0cgPSAnZ2V0UnVuTG9nJztcblx0XHR0aGlzLlJFUV9HRVRfQk9PVF9MT0cgPSAnZ2V0Qm9vdExvZyc7XG5cdFx0dGhpcy5SRVFfR0VUX0JBQ0tVUFNfU1RBVFVTID0gJ2dldEJha1N0YXR1cyc7XG5cdFx0dGhpcy5SRVFfQkFDS1VQX0JPT1RfTE9HID0gJ2Jha0Jvb3RMb2cnO1xuXHRcdHRoaXMuUkVRX0JBQ0tVUF9SVU5USU1FX0xPRyA9ICdiYWtSdW5Mb2cnO1xuXHRcdHRoaXMuUkVRX0JBQ0tVUF9GVUxMX0xPR1MgPSAnYmFrRnVsbExvZ3MnO1xuXHRcdHRoaXMuUkVRX0RFTEVURV9CQUNLVVAgPSAnZGVsQmFja3VwJztcblxuXHRcdC8vIEluY29taW5nIHJlc3BvbnNlc1xuXHRcdHRoaXMuUkVTUF9JTklUX0VSUk9SID0gJ2luaXRFcnInO1xuXHRcdHRoaXMuUkVTUF9SVU5USU1FX0xPR19FUlJPUiA9ICdydW5Mb2dFcnInO1xuXHRcdHRoaXMuUkVTUF9SVU5USU1FX0xPR19JTlZBTElEID0gJ3J1bkxvZ0ludic7XG5cdFx0dGhpcy5SRVNQX1JVTlRJTUVfTE9HID0gJ3J1bkxvZyc7XG5cdFx0dGhpcy5SRVNQX0JPT1RfTE9HX0VSUk9SID0gJ2Jvb3RMb2dFcnInO1xuXHRcdHRoaXMuUkVTUF9CT09UX0xPRyA9ICdib290TG9nJztcblx0XHR0aGlzLlJFU1BfQkFDS1VQU19TVEFUVVMgPSAnYmFrU3RhdHVzJztcblx0XHR0aGlzLlJFU1BfREVMRVRFX0JBQ0tVUF9GQUlMRUQgPSAnZGVsQmFrRmFpbCc7XG5cdFx0dGhpcy5SRVNQX0JBQ0tVUF9FUlJPUiA9ICdiYWtFcnJvcic7XG5cdFx0dGhpcy5SRVNQX0JBQ0tVUF9XQVJOSU5HID0gJ2Jha1dhcm4nO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNsZ3YtdGFiTmF2aWdhdG9yID4gI3RhYnMnKS5zY3JvbGxpbmdUYWJzKHtcblx0XHRcdGJvb3RzdHJhcFZlcnNpb246IDQsXG5cdFx0XHRzY3JvbGxUb1RhYkVkZ2U6IHRydWUsXG5cdFx0XHRlbmFibGVTd2lwaW5nOiB0cnVlLFxuXHRcdFx0ZGlzYWJsZVNjcm9sbEFycm93c09uRnVsbHlTY3JvbGxlZDogdHJ1ZSxcblx0XHRcdGNzc0NsYXNzTGVmdEFycm93OiAnZmEgZmEtY2hldnJvbi1sZWZ0Jyxcblx0XHRcdGNzc0NsYXNzUmlnaHRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tcmlnaHQnXG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gdGFiIHNob3duIGV2ZW50XG5cdFx0JCgnYVtkYXRhLXRvZ2dsZT1cInRhYlwiXScpLm9uKCdzaG93bi5icy50YWInLCAkLnByb3h5KHRoaXMuX29uVGFiU2hvd24sIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgbG9nIGxpbmVzIGRyb3Bkb3duXG5cdFx0dGhpcy5fbG9nTGluZXNERCA9ICQoJyNsZ3YtbG9nTGluZXNERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdHZhbHVlVGVtcGxhdGU6ICc8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgcHItMVwiPkxvZyBlbnRyaWVzOjwvc3Bhbj48c3Bhbj4jOmRhdGEudGV4dCM8L3NwYW4+Jyxcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBsb2FkIGJ1dHRvblxuXHRcdCQoJyNsZ3YtbG9hZEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJ1bnRpbWVMb2dMb2FkQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJzXG5cdFx0JCgnLnByb2dyZXNzLWJhcicpLmtlbmRvUHJvZ3Jlc3NCYXIoe1xuXHRcdFx0bWluOiAwLFxuICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHR2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDQwMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgbGV2ZWwgZmlsdGVyIGRyb3Bkb3duXG5cdFx0dGhpcy5fbGV2ZWxGaWx0ZXJERCA9ICQoJyNsZ3YtbGV2ZWxERCcpLmtlbmRvRHJvcERvd25MaXN0KHtcblx0XHRcdGRhdGFTb3VyY2U6IFt0aGlzLkFOWV9MRVZFTF0uY29uY2F0KHRoaXMuTEVWRUxTKSxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbkZpbHRlckNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjbGFzcyBmaWx0ZXIgZHJvcGRvd25cblx0XHR0aGlzLl9jbGFzc0ZpbHRlckREID0gJCgnI2xndi1jbGFzc0REJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRmlsdGVyQ2hhbmdlLCB0aGlzKVxuXHRcdH0pLmRhdGEoJ2tlbmRvRHJvcERvd25MaXN0Jyk7XG5cblx0XHQvLyBJbml0aWFsaXplIG1lc3NhZ2UgZmlsdGVyIGlucHV0XG5cdFx0JCgnI2xndi1tZXNzYWdlSW4nKS5vbignaW5wdXQnLCAkLnByb3h5KHRoaXMuX29uRmlsdGVyQ2hhbmdlLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNsZ3YtY2xlYXJGaWx0ZXJCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25DbGVhckZpbHRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGV4cG9ydCBidXR0b25cblx0XHQkKCcjbGd2LWV4cG9ydFJ1bnRpbWVMb2dCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25FeHBvcnRSdW50aW1lTG9nQnRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBydW50aW1lIGxvZyBncmlkXG5cdFx0dGhpcy5fcnVudGltZUxvZ0dyaWQgPSAkKCcjbGd2LXJ1bnRpbWVMb2dHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHQvL3Jlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29sdW1uczpcbiAgICAgICAgICAgIFtcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdkYXRlVGltZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnRGF0ZS9UaW1lJyxcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdsZXZlbCcsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTAwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdMZXZlbCcsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAndGhyZWFkJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG5cdCAgICAgICAgICAgICAgICB0aXRsZTogJ1RocmVhZCcsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnY2xhenonLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDI1MCxcblx0ICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2xhc3MnLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ21lc3NhZ2UnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEwMDAsXG5cdFx0XHRcdFx0dGl0bGU6ICdNZXNzYWdlJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBsb2cgZW50cmllcyB0byBkaXNwbGF5Lidcblx0XHRcdH0sXG5cdFx0XHRkYXRhU291cmNlOiBbXVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgYm9vdCBsb2cgdmlldyBidXR0b25zXG5cdFx0JCgnI2xndi1leHBvcnRCb290TG9nQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uRXhwb3J0Qm9vdExvZ0J0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjbGd2LXN3aXRjaEJvb3RMb2dDb2xvckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblN3aXRjaEJvb3RMb2dDb2xvckJ0Q2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgZ2VuZXJhdGUgYmFja3VwIGJ1dHRvbnNcblx0XHQkKCcjbGd2LWJvb3RMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkJvb3RMb2dHZW5lcmF0ZUJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJ1bnRpbWVMb2dHZW5lcmF0ZUJ0Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjbGd2LWZ1bGxMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkZ1bGxMb2dzR2VuZXJhdGVCdENsaWNrLCB0aGlzKSk7XG5cblx0XHR0aGlzLl9pbml0QmFja3VwQ2FyZCgnI2xndi1ib290TG9nQmFja3VwQ2FyZCcpO1xuXHRcdHRoaXMuX2luaXRCYWNrdXBDYXJkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkJyk7XG5cdFx0dGhpcy5faW5pdEJhY2t1cENhcmQoJyNsZ3YtZnVsbExvZ0JhY2t1cENhcmQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgZG93bmxvYWQgZ3JpZFxuXHRcdHRoaXMuX2Rvd25sb2FkR3JpZCA9ICQoJyNsZ3YtZG93bmxvYWRHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcblx0XHRcdC8vcmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogJ3JvdycsXG4gICAgICAgICAgICBjb2x1bW5zOlxuICAgICAgICAgICAgW1xuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2RhdGUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCxcblx0XHRcdFx0XHR0aXRsZTogJ0RhdGUnLFxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ3RpbWUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCxcblx0ICAgICAgICAgICAgICAgIHRpdGxlOiAnVGltZScsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnbmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMzAwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdGaWxlbmFtZScsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnc2l6ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTAwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdTaXplJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBiYWNrdXBzIGF2YWlsYWJsZS4nXG5cdFx0XHR9LFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uRG93bmxvYWRHcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGRhdGFTb3VyY2U6IFtdXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBkZWxldGUgYnV0dG9uXG5cdFx0JCgnI2xndi1kZWxldGVCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25EZWxldGVCdENsaWNrLCB0aGlzKSk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGxpc3RlbmVyIHRvIHRhYiBzaG93biBldmVudFxuXHRcdCQoJ2FbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKS5vZmYoJ3Nob3duLmJzLnRhYicpO1xuXG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNsZ3YtdGFiTmF2aWdhdG9yICN0YWJzJykuc2Nyb2xsaW5nVGFicygnZGVzdHJveScpO1xuXG5cdFx0Ly8gUmVtb3ZlIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyNsZ3YtbG9hZEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNsZ3YtZXhwb3J0Qm9vdExvZ0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNsZ3Ytc3dpdGNoQm9vdExvZ0NvbG9yQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2xndi1ib290TG9nQmFja3VwQ2FyZCAuYmFja3VwLWJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNsZ3YtY2xlYXJGaWx0ZXJCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjbGd2LWRlbGV0ZUJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI2xndi1tZXNzYWdlSW4nKS5vZmYoJ2lucHV0Jyk7XG5cdH1cblxuXHRvbkV4dGVuc2lvbkNvbW1hbmQoY29tbWFuZCwgZGF0YSlcblx0e1xuXHRcdC8vIEVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbiAodW5hYmxlIHRvIGFjY2VzcyBsb2c0aiBjb25maWd1cmF0aW9uIGZpbGUpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVRfRVJST1IpXG5cdFx0e1xuXHRcdFx0Y29uc3QgZXJyb3IgPSBkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGVycm9yLCB0cnVlKTtcblxuXHRcdFx0Ly8gU2V0IGFsbCB0YWJzIHRvIHNob3cgZXJyb3JzXG5cdFx0XHR0aGlzLl9zd2l0Y2hCb290Vmlld1N0YWNrKCdsZ3YtYm9vdExvZ0Vycm9yVmlldycpO1xuXHRcdFx0dGhpcy5fc3dpdGNoUnVudGltZVZpZXdTdGFjaygnbGd2LXJ1bnRpbWVMb2dFcnJvclZpZXcnKTtcblx0XHRcdHRoaXMuX3N3aXRjaERvd25sb2FkVmlld1N0YWNrKCdsZ3YtZG93bmxvYWRFcnJvclZpZXcnKTtcblxuXHRcdFx0Ly8gRGlzYWJsZSBydW50aW1lIGxvZyBjb250cm9sc1xuXHRcdFx0dGhpcy5fZW5hYmxlUnVudGltZUxvZ0NvbnRyb2xzKGZhbHNlKTtcblxuXHRcdFx0dGhpcy5faW5pdEZhaWxlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gRXJyb3IgcmVzcG9uc2VzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfQk9PVF9MT0dfRVJST1IgfHwgY29tbWFuZCA9PSB0aGlzLlJFU1BfUlVOVElNRV9MT0dfRVJST1IpXG5cdFx0e1xuXHRcdFx0Y29uc3QgZXJyb3IgPSBkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKTtcblxuXHRcdFx0Ly8gU2hvdyBhbiBhbGVydFxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd1NpbXBsZUFsZXJ0KGVycm9yLCB0cnVlKTtcblxuXHRcdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JPT1RfTE9HX0VSUk9SKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTZXQgdGFiIHRvIHNob3cgZXJyb3Jcblx0XHRcdFx0dGhpcy5fc3dpdGNoQm9vdFZpZXdTdGFjaygnbGd2LWJvb3RMb2dFcnJvclZpZXcnKTtcblxuXHRcdFx0XHQvLyBEaXNhYmxlIGJvb3QgbG9nIGJhY2t1cCBnZW5lcmF0aW9uXG5cdFx0XHRcdHRoaXMuX2Jvb3RMb2dCYWNrdXBVbmF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0XHRcdHRoaXMuX2Jvb3RMb2dSZXF1ZXN0ZWQgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUlVOVElNRV9MT0dfRVJST1IpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIERpc2FibGUgY29udHJvbHNcblx0XHRcdFx0dGhpcy5fZW5hYmxlUnVudGltZUxvZ0NvbnRyb2xzKGZhbHNlKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgbG9hZGluZyBiYXIgKHJ1bnRpbWUgbG9nKVxuXHRcdFx0XHR0aGlzLl9zd2l0Y2hSdW50aW1lVmlld1N0YWNrKCdsZ3YtcnVudGltZUxvZ0Vycm9yVmlldycpO1xuXG5cdFx0XHRcdC8vIERpc2FibGUgcnVudGltZSBsb2cgYmFja3VwIGRvd25sb2FkXG5cdFx0XHRcdHRoaXMuX3J1bnRpbWVMb2dCYWNrdXBVbmF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE1vZGlmaWVkIGNvbnZlcnNpb24gcGF0dGVybiBpbiB0aGUgbG9nNGogcHJvcGVydGllcyBmaWxlOiB1bmFibGUgdG8gcGFyc2UgdGhlIGxvZ1xuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1JVTlRJTUVfTE9HX0lOVkFMSUQpXG5cdFx0e1xuXHRcdFx0Ly8gRGlzYWJsZSBjb250cm9sc1xuXHRcdFx0dGhpcy5fZW5hYmxlUnVudGltZUxvZ0NvbnRyb2xzKGZhbHNlKTtcblxuXHRcdFx0Ly8gRmlsbCBpbiBlcnJvciBtZXNzYWdlXG5cdFx0XHQkKCcjbGd2LWNvbnZQYXR0TmFtZScpLnRleHQoZGF0YS5nZXRVdGZTdHJpbmcoJ3BhcmFtJykpO1xuXHRcdFx0JCgnI2xndi1jb252UGF0dFZhbCcpLnRleHQoZGF0YS5nZXRVdGZTdHJpbmcoJ3ZhbHVlJykpO1xuXG5cdFx0XHQvLyBSZW1vdmUgbG9hZGluZyBiYXIgKHJ1bnRpbWUgbG9nKVxuXHRcdFx0dGhpcy5fc3dpdGNoUnVudGltZVZpZXdTdGFjaygnbGd2LWludkNvbnZQYXR0VmlldycpO1xuXHRcdH1cblxuXHRcdC8vIFJ1bnRpbWUgbG9nIHJlY2VpdmVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfUlVOVElNRV9MT0cpXG5cdFx0e1xuXHRcdFx0bGV0IGNsYXNzZXMgPSBbXTtcblx0XHRcdGNsYXNzZXMucHVzaCh0aGlzLkFOWV9DTEFTUyk7XG5cblx0XHRcdGxldCBsb2dFbnRyaWVzID0gZGF0YS5nZXRVdGZTdHJpbmdBcnJheSh0aGlzLkxPR19EQVRBX0xBQkVMKTtcblx0XHRcdGxldCBzZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cdFx0XHRsZXQgY29sdW1ucyA9IGRhdGEuZ2V0SW50KCdjb2xzJyk7XG5cdFx0XHRsZXQgZHNBcnIgPSBbXTtcblxuXHRcdFx0dGhpcy5fdG90YWxSdW50aW1lTG9nRW50cmllcyA9IGxvZ0VudHJpZXMubGVuZ3RoO1xuXG5cdFx0XHQvLyBQYXJzZSBsb2cgZW50cmllc1xuXHRcdFx0Ly8gV2UgY2FuJ3QgdXNlIHRoZSBzcGxpdCBtZXRob2QgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBpbnN0YW5jZXMgb2YgdGhlIHNlcGFyYXRvciBpbiB0aGUgbG9nIG1lc3NhZ2UgdG9vXG5cdFx0XHRmb3IgKGxldCBlID0gMDsgZSA8IGxvZ0VudHJpZXMubGVuZ3RoOyBlKyspXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGxvZ0VudHJ5ID0gbG9nRW50cmllc1tlXTtcblxuXHRcdFx0XHRsZXQgbG9nRW50cnlEYXRhID0gW107XG5cdFx0XHRcdGxldCBzdGFydEluZGV4ID0gMDtcblxuXHRcdFx0XHRmb3IgKGxldCBjID0gMDsgYyA8IGNvbHVtbnMgLSAxOyBjKyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgZW5kSW5kZXggPSBsb2dFbnRyeS5pbmRleE9mKHNlcGFyYXRvciwgc3RhcnRJbmRleCk7XG5cdFx0XHRcdFx0bG9nRW50cnlEYXRhLnB1c2gobG9nRW50cnkuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSk7XG5cdFx0XHRcdFx0c3RhcnRJbmRleCA9IGVuZEluZGV4ICsgc2VwYXJhdG9yLmxlbmd0aDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzdGFydEluZGV4IDwgbG9nRW50cnkubGVuZ3RoKVxuXHRcdFx0XHRcdGxvZ0VudHJ5RGF0YS5wdXNoKGxvZ0VudHJ5LnN1YnN0cmluZyhzdGFydEluZGV4KSk7XG5cblx0XHRcdFx0Ly8gRmlsbCBkYXRhZ3JpZCdzIGRhdGFwcm92aWRlclxuXHRcdFx0XHRsZXQgcmxlID0gUnVudGltZUxvZ0VudHJ5LmZyb21BcnJheShzZXBhcmF0b3IsIGxvZ0VudHJ5RGF0YSk7XG5cdFx0XHRcdGRzQXJyLnB1c2gocmxlKTtcblxuXHRcdFx0XHQvLyBBZGQgY2xhc3MgdG8gZmlsdGVyaW5nIGRyb3Bkb3duXG5cdFx0XHRcdGlmIChjbGFzc2VzLmluZGV4T2YocmxlLmNsYXp6KSA8IDApXG5cdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKHJsZS5jbGF6eik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNob3cgY2xhc3NlcyBsaXN0XG5cdFx0XHRjbGFzc2VzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcblx0XHRcdFx0cmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl9jbGFzc0ZpbHRlckRELnNldERhdGFTb3VyY2UoY2xhc3Nlcyk7XG5cdFx0XHR0aGlzLl9jbGFzc0ZpbHRlckRELnNlbGVjdCgwKTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdGxldCBkcyA9IG5ldyBrZW5kby5kYXRhLkRhdGFTb3VyY2Uoe1xuXHRcdFx0XHRkYXRhOiBkc0FyclxuXHRcdFx0fSlcblxuXHRcdFx0dGhpcy5fc2V0UnVudGltZUxvZ0RhdGFTb3VyY2UoZHMpO1xuXG5cdFx0XHQvLyBSZS1lbmFibGUgbG9nIGxvYWRpbmcgY29udHJvbHNcblx0XHRcdHRoaXMuX2VuYWJsZVJ1bnRpbWVMb2dDb250cm9scyh0cnVlKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIGxvYWRpbmcgYmFyXG5cdFx0XHR0aGlzLl9zd2l0Y2hSdW50aW1lVmlld1N0YWNrKCdsZ3YtcnVudGltZUxvZ1ZpZXcnKTtcblx0XHR9XG5cblx0XHQvLyBCb290IGxvZyByZWNlaXZlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JPT1RfTE9HKVxuXHRcdHtcblx0XHRcdGNvbnN0IGJvb3RMb2dFbnRyaWVzID0gZGF0YS5nZXRTRlNBcnJheSh0aGlzLkxPR19EQVRBX0xBQkVMKTtcblx0XHRcdGxldCB0ZXh0ID0gJyc7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYm9vdExvZ0VudHJpZXMuc2l6ZSgpOyBpKyspXG5cdFx0XHRcdHRleHQgKz0gYm9vdExvZ0VudHJpZXMuZ2V0VXRmU3RyaW5nKGkpICsgJ1xcbic7XG5cblx0XHRcdCQoJyNsZ3YtYm9vdExvZ1RleHQnKS50ZXh0KHRleHQpO1xuXG5cdFx0XHQvLyBSZW1vdmUgbG9hZGluZyBiYXJcblx0XHRcdHRoaXMuX3N3aXRjaEJvb3RWaWV3U3RhY2soJ2xndi1ib290TG9nVmlldycpO1xuXHRcdH1cblxuXHRcdC8vIExvZ3MgYmFja3VwcyBzdGF0dXMgcmVjZWl2ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9CQUNLVVBTX1NUQVRVUylcblx0XHR7XG5cdFx0XHQvLyBTaG93L2hpZGUgb3BlcmF0aW9uIGluIHByb2dyZXNzIG1lc3NhZ2Vcblx0XHRcdHRoaXMuX2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UoZGF0YS5nZXRCb29sKCdydW5uaW5nJyksIGRhdGEuZ2V0VXRmU3RyaW5nKCd0eXBlJykpO1xuXG5cdFx0XHQvLyBCYWNrdXAgZmlsZXMgbGlzdFxuXHRcdFx0aWYgKGRhdGEuY29udGFpbnNLZXkoJ2ZpbGVzJykpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBmaWxlcyA9IGRhdGEuZ2V0U0ZTQXJyYXkoJ2ZpbGVzJyk7XG5cblx0XHRcdFx0bGV0IGxhc3RCb290TG9nQmFja3VwRm91bmQgPSBmYWxzZTtcblx0XHRcdFx0bGV0IGxhc3RSdW50aW1lTG9nQmFja3VwRm91bmQgPSBmYWxzZTtcblx0XHRcdFx0bGV0IGxhc3RGdWxsQmFja3VwRm91bmQgPSBmYWxzZTtcblxuXHRcdFx0XHRsZXQgYmFja3Vwc0xpc3QgPSBbXTtcblxuXHRcdFx0XHRjb25zdCB3ZWJTZXJ2ZXJQcm90b2NvbCA9IChkYXRhLmNvbnRhaW5zS2V5KCdwcm90b2NvbCcpID8gZGF0YS5nZXRVdGZTdHJpbmcoJ3Byb3RvY29sJykgOiAnaHR0cCcpICsgJzovLyc7XG5cdFx0XHRcdGNvbnN0IHdlYlNlcnZlclBvcnQgPSAoZGF0YS5jb250YWluc0tleSgncG9ydCcpID8gJzonICsgZGF0YS5nZXRJbnQoJ3BvcnQnKSA6ICcnKTtcblxuXHRcdFx0XHRsZXQgdG90YWxTaXplID0gMDtcblxuXHRcdFx0XHRmb3IgKGxldCBmID0gMDsgZiA8IGZpbGVzLnNpemUoKTsgZisrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgZmlsZSA9IGZpbGVzLmdldFNGU09iamVjdChmKTtcblxuXHRcdFx0XHRcdGNvbnN0IGZpbGVQYXRoID0gZmlsZS5nZXRVdGZTdHJpbmcoJ3BhdGgnKTtcblxuXHRcdFx0XHRcdGNvbnN0IGZpbGVPYmogPSB7fTtcblx0XHRcdFx0XHRmaWxlT2JqLnBhdGggPSBmaWxlUGF0aDtcblx0XHRcdFx0XHRmaWxlT2JqLnVybCA9IHdlYlNlcnZlclByb3RvY29sICsgdGhpcy5zbWFydEZveC5jb25maWcuaG9zdCArIHdlYlNlcnZlclBvcnQgKyAnLycgKyBmaWxlUGF0aDtcblx0XHRcdFx0XHRmaWxlT2JqLm5hbWUgPSBmaWxlUGF0aC5zdWJzdHIoZmlsZVBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuXHRcdFx0XHRcdGZpbGVPYmouZGF0ZSA9IGZpbGUuZ2V0VXRmU3RyaW5nKCdkYXRlJyk7XG5cdFx0XHRcdFx0ZmlsZU9iai50aW1lID0gZmlsZS5nZXRVdGZTdHJpbmcoJ3RpbWUnKTtcblx0XHRcdFx0XHRmaWxlT2JqLnNpemUgPSBieXRlc1RvU2l6ZShmaWxlLmdldExvbmcoJ3NpemUnKSwgMik7XG5cblx0XHRcdFx0XHR0b3RhbFNpemUgKz0gZmlsZS5nZXRMb25nKCdzaXplJyk7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGlzIGlzIGEgYm9vdCBsb2cgYmFja3VwXG5cdFx0XHRcdFx0aWYgKCFsYXN0Qm9vdExvZ0JhY2t1cEZvdW5kKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChmaWxlT2JqLm5hbWUuc3RhcnRzV2l0aCh0aGlzLkJPT1RfTE9HX0JBQ0tVUF9JRCkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2ZpbGxCYWNrdXBDYXJkKCcjbGd2LWJvb3RMb2dCYWNrdXBDYXJkJywgZmlsZU9iaik7XG5cblx0XHRcdFx0XHRcdFx0bGFzdEJvb3RMb2dCYWNrdXBGb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhpcyBpcyBhIHJ1bnRpbWUgbG9nIGJhY2t1cFxuXHRcdFx0XHRcdGlmICghbGFzdFJ1bnRpbWVMb2dCYWNrdXBGb3VuZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZmlsZU9iai5uYW1lLnN0YXJ0c1dpdGgodGhpcy5SVU5USU1FX0xPR19CQUNLVVBfSUQpKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9maWxsQmFja3VwQ2FyZCgnI2xndi1ydW50aW1lTG9nQmFja3VwQ2FyZCcsIGZpbGVPYmopO1xuXG5cdFx0XHRcdFx0XHRcdGxhc3RSdW50aW1lTG9nQmFja3VwRm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIENoZWNrIGlmIHRoaXMgaXMgYSBmdWxsIGJhY2t1cFxuXHRcdFx0XHRcdGlmICghbGFzdEZ1bGxCYWNrdXBGb3VuZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZmlsZU9iai5uYW1lLnN0YXJ0c1dpdGgodGhpcy5GVUxMX0JBQ0tVUF9JRCkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2ZpbGxCYWNrdXBDYXJkKCcjbGd2LWZ1bGxMb2dCYWNrdXBDYXJkJywgZmlsZU9iaik7XG5cblx0XHRcdFx0XHRcdFx0bGFzdEZ1bGxCYWNrdXBGb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUG9wdWxhdGUgbG9ncyBsaXN0XG5cdFx0XHRcdFx0YmFja3Vwc0xpc3QucHVzaChmaWxlT2JqKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNob3cgdG90YWwgYmFja3VwcyBzaXplXG5cdFx0XHRcdCQoJyNsZ3YtbG9nU2l6ZUxiJykuaHRtbChgVG90YWwgc2l6ZTogPHN0cm9uZz4ke2J5dGVzVG9TaXplKHRvdGFsU2l6ZSwgMiwgJ0tCJyl9PC9zdHJvbmc+YCk7XG5cblx0XHQgICBcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdFx0dGhpcy5fc2V0RG93bmxvYWRHcmlkRGF0YVNvdXJjZShiYWNrdXBzTGlzdCk7XG5cdFx0XHRcdHRoaXMuX29uRG93bmxvYWRHcmlkU2VsZWN0aW9uQ2hhbmdlKCk7XG5cblx0XHRcdFx0Ly8gSGlkZSBsaW5rcyB0byBsYXRlc3QgZmlsZXMgaWYgbm90IGF2YWlsYWJsZVxuXHRcdFx0XHRpZiAoIWxhc3RCb290TG9nQmFja3VwRm91bmQpXG5cdFx0XHRcdFx0dGhpcy5fZmlsbEJhY2t1cENhcmQoJyNsZ3YtYm9vdExvZ0JhY2t1cENhcmQnLCBudWxsKTtcblxuXHRcdFx0XHRpZiAoIWxhc3RSdW50aW1lTG9nQmFja3VwRm91bmQpXG5cdFx0XHRcdFx0dGhpcy5fZmlsbEJhY2t1cENhcmQoJyNsZ3YtcnVudGltZUxvZ0JhY2t1cENhcmQnLCBudWxsKTtcblxuXHRcdFx0XHRpZiAoIWxhc3RGdWxsQmFja3VwRm91bmQpXG5cdFx0XHRcdFx0dGhpcy5fZmlsbEJhY2t1cENhcmQoJyNsZ3YtZnVsbExvZ0JhY2t1cENhcmQnLCBudWxsKTtcblxuXHRcdFx0XHRpZiAoZGF0YS5jb250YWluc0tleSgnbWVzc2FnZScpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGBMb2cgYmFja3VwIHdhcm5pbmdgLCBkYXRhLmdldFV0ZlN0cmluZygnbWVzc2FnZScpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZG93bmxvYWQgdmlldyB0byBtYWluXG5cdFx0XHR0aGlzLl9zd2l0Y2hEb3dubG9hZFZpZXdTdGFjaygnbGd2LWRvd25sb2FkVmlldycpO1xuXHRcdH1cblxuXHRcdC8vIExvZ3MgYmFja3VwIGRlbGV0aW9uIGZhaWxlZFxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0RFTEVURV9CQUNLVVBfRkFJTEVEKVxuXHRcdHtcblx0XHRcdGNvbnN0IGVycm9yID0gZGF0YS5nZXRVdGZTdHJpbmcoJ2Vycm9yJyk7XG5cblx0XHRcdC8vIFNob3cgYW4gYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChlcnJvciwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gQSBibG9ja2luZyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgYmFja3VwIG9wZXJhdGlvblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JBQ0tVUF9FUlJPUilcblx0XHR7XG5cdFx0XHRjb25zdCBlcnJvciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdlcnJvcicpO1xuXG5cdFx0XHQvLyBTaG93IGFuIGFsZXJ0XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoZXJyb3IsIHRydWUpO1xuXHRcdH1cblxuXHRcdC8vIEFuIG5vbi1ibG9ja2luZyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgYmFja3VwIG9wZXJhdGlvblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0JBQ0tVUF9XQVJOSU5HKVxuXHRcdHtcblx0XHRcdGxldCB3YXJuID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3dhcm4nKTtcblxuXHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYExvZyBiYWNrdXAgd2FybmluZ2AsIHdhcm4pO1xuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9vblRhYlNob3duKGUpXG5cdHtcblx0XHRpZiAoIXRoaXMuX2luaXRGYWlsZWQpXG5cdFx0e1xuXHRcdFx0Ly8gSWYgYm9vdCBsb2cgdmlldyB3YXMgZGlzcGxheWVkLi4uXG5cdFx0XHRpZiAoZS50YXJnZXQuaWQgPT0gJ2xndi1ib290TG9nLXRhYicpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIExvYWQgYm9vdCBsb2cgdGhlIGZpcnN0IHRpbWUgdGhlIHRhYiBpcyBzZWxlY3RlZFxuXHRcdFx0XHRpZiAoIXRoaXMuX2Jvb3RMb2dSZXF1ZXN0ZWQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9CT09UX0xPRyk7XG5cdFx0XHRcdFx0dGhpcy5fYm9vdExvZ1JlcXVlc3RlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYmFja3VwJmRvd2xvYWQgdmlldyB3YXMgZGlzcGxheWVkLi4uXG5cdFx0XHRlbHNlIGlmIChlLnRhcmdldC5pZCA9PSAnbGd2LWxvZ3NEb3dubG9hZC10YWInKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSZXF1ZXN0IGxvZ3MgYmFja3VwIHN0YXR1cyB0aGUgZmlyc3QgdGltZSB0aGUgdGFiIGlzIHNlbGVjdGVkXG5cdFx0XHRcdGlmICghdGhpcy5fYmFja3VwU3RhdHVzUmVxdWVzdGVkKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfQkFDS1VQU19TVEFUVVMpO1xuXHRcdFx0XHRcdHRoaXMuX2JhY2t1cFN0YXR1c1JlcXVlc3RlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfb25SdW50aW1lTG9nTG9hZEJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gUmVxdWVzdCBsb2dcblx0XHR0aGlzLl9sb2FkUnVudGltZUxvZygpO1xuXHR9XG5cblx0X29uRXhwb3J0Qm9vdExvZ0J0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gRXhwb3J0IGxvZyB0byBmaWxlXG5cdFx0dGhpcy5fZXhwb3J0TG9nKCQoJyNsZ3YtYm9vdExvZ1RleHQnKS50ZXh0KCksIHRoaXMuQk9PVF9MT0dfQkFDS1VQX0lEKTtcblx0fVxuXG5cdF9vblN3aXRjaEJvb3RMb2dDb2xvckJ0Q2xpY2soKVxuXHR7XG5cdFx0aWYgKCQoJyNsZ3YtYm9vdExvZ1RleHQnKS5oYXNDbGFzcygnaW52ZXJ0JykpXG5cdFx0XHQkKCcjbGd2LWJvb3RMb2dUZXh0JykucmVtb3ZlQ2xhc3MoJ2ludmVydCcpO1xuXHRcdGVsc2Vcblx0XHRcdCQoJyNsZ3YtYm9vdExvZ1RleHQnKS5hZGRDbGFzcygnaW52ZXJ0Jyk7XG5cdH1cblxuXHRfb25Cb290TG9nR2VuZXJhdGVCdENsaWNrKClcblx0e1xuXHRcdC8vIFNob3cvaGlkZSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgbWVzc2FnZVxuXHRcdHRoaXMuX2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UodHJ1ZSwgdGhpcy5CT09UX0xPR19CQUNLVVBfSUQpO1xuXG5cdFx0Ly8gUmVxdWVzdCBiYWNrdXAgZ2VuZXJhdGlvblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfQkFDS1VQX0JPT1RfTE9HKTtcblx0fVxuXG5cdF9vblJ1bnRpbWVMb2dHZW5lcmF0ZUJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gU2hvdy9oaWRlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyBtZXNzYWdlXG5cdFx0dGhpcy5fZGlzYWJsZUJhY2t1cEludGVyZmFjZSh0cnVlLCB0aGlzLlJVTlRJTUVfTE9HX0JBQ0tVUF9JRCk7XG5cblx0XHQvLyBSZXF1ZXN0IGJhY2t1cCBnZW5lcmF0aW9uXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9CQUNLVVBfUlVOVElNRV9MT0cpO1xuXHR9XG5cblx0X29uRnVsbExvZ3NHZW5lcmF0ZUJ0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gU2hvdy9oaWRlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyBtZXNzYWdlXG5cdFx0dGhpcy5fZGlzYWJsZUJhY2t1cEludGVyZmFjZSh0cnVlLCB0aGlzLkZVTExfQkFDS1VQX0lEKTtcblxuXHRcdC8vIFJlcXVlc3QgYmFja3VwIGdlbmVyYXRpb25cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0JBQ0tVUF9GVUxMX0xPR1MpO1xuXHR9XG5cblx0X29uRmlsdGVyQ2hhbmdlKClcblx0e1xuXHRcdC8vIFNldCBmaWx0ZXJzXG5cdFx0dGhpcy5fc2V0UnVudGltZUxvZ0RhdGFTb3VyY2UodGhpcy5fcnVudGltZUxvZ0dyaWQuZGF0YVNvdXJjZSk7XG5cdH1cblxuXHRfb25DbGVhckZpbHRlckNsaWNrKClcblx0e1xuXHRcdHRoaXMuX2NsZWFyUnVudGltZUxvZ0ZpbHRlcnMoKTtcblx0XHR0aGlzLl9zZXRSdW50aW1lTG9nRGF0YVNvdXJjZSh0aGlzLl9ydW50aW1lTG9nR3JpZC5kYXRhU291cmNlKTtcblx0fVxuXG5cdF9vbkV4cG9ydFJ1bnRpbWVMb2dCdENsaWNrKClcblx0e1xuXHRcdGxldCBsb2cgPSAnJztcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5fcnVudGltZUxvZ0dyaWQuZGF0YVNvdXJjZS52aWV3KCk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0Y29uc3QgaXRlbSA9IGVudHJpZXNbaV07XG5cdFx0XHRsb2cgKz0gW2l0ZW0uZGF0ZSwgaXRlbS50aW1lLCBpdGVtLmxldmVsLCBpdGVtLnRocmVhZCwgaXRlbS5jbGF6eiwgaXRlbS5tZXNzYWdlXS5qb2luKGl0ZW0uc2VwKSArICdcXG4nO1xuXHRcdH1cblxuXHRcdC8vIEV4cG9ydCBsb2cgdG8gZmlsZVxuXHRcdHRoaXMuX2V4cG9ydExvZyhsb2csIHRoaXMuUlVOVElNRV9MT0dfQkFDS1VQX0lEKTtcblx0fVxuXG5cdF9vbkRvd25sb2FkR3JpZFNlbGVjdGlvbkNoYW5nZSgpXG5cdHtcblx0XHQvLyBFbmFibGUvZGlzYWJsZSBidXR0b25zXG5cdFx0Y29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5fZG93bmxvYWRHcmlkLnNlbGVjdCgpO1xuXHRcdCQoJyNsZ3YtZG93bmxvYWRCdCcpLmF0dHIoJ2Rpc2FibGVkJywgc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PSAwKTtcblx0XHQkKCcjbGd2LWRlbGV0ZUJ0JykuYXR0cignZGlzYWJsZWQnLCBzZWxlY3RlZFJvd3MubGVuZ3RoID09IDApO1xuXG5cdFx0aWYgKHNlbGVjdGVkUm93cy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2Rvd25sb2FkR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbMF0pO1xuXHRcdFx0JCgnI2xndi1kb3dubG9hZEJ0JykuYXR0cignaHJlZicsIGRhdGFJdGVtLnVybCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdCQoJyNsZ3YtZG93bmxvYWRCdCcpLmF0dHIoJ2hyZWYnLCAnIycpO1xuXHR9XG5cblx0X29uRGVsZXRlQnRDbGljaygpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fZG93bmxvYWRHcmlkLnNlbGVjdCgpO1xuXG5cdFx0aWYgKHNlbGVjdGVkUm93cy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2Rvd25sb2FkR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbMF0pO1xuXG5cdFx0XHQvLyBSZXF1ZXN0IGJhY2t1cCBkZWxldGlvblxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ2ZpbGUnLCBkYXRhSXRlbS5uYW1lKTtcblxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ERUxFVEVfQkFDS1VQLCBwYXJhbXMpO1xuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgTUVUSE9EU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9zd2l0Y2hSdW50aW1lVmlld1N0YWNrKHZpZXdJZClcblx0e1xuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZ3YtcnVudGltZS12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X3N3aXRjaEJvb3RWaWV3U3RhY2sodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xndi1ib290LXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfc3dpdGNoRG93bmxvYWRWaWV3U3RhY2sodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xndi1kb3dubG9hZC12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X2VuYWJsZVJ1bnRpbWVMb2dDb250cm9scyhlbmFibGUpXG5cdHtcblx0XHQkKCcjbGd2LWxvYWRCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cdFx0JCgnI2xndi1leHBvcnRSdW50aW1lTG9nQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHRcdCQoJyNsZ3YtZmlsdGVyQnQnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHR9XG5cblx0X2xvYWRSdW50aW1lTG9nKClcblx0e1xuXHRcdC8vIERpc2FibGUgY29udHJvbHMgdG8gbG9hZCBsb2csIHNvIHRoYXQgaW1wYXRpZW50IHVzZXJzIGNhbid0IHNlbmQgbXVsdGlwbGUgcmVxdWVzdHNcblx0XHQvLyAoaXQgd2lsbCBiZSBlbmFibGVkIGFnYWluIHdoZW4gYSByZXNwb25zZSBpcyByZWNlaXZlZClcblx0XHR0aGlzLl9lbmFibGVSdW50aW1lTG9nQ29udHJvbHMoZmFsc2UpO1xuXG5cdFx0Ly8gQ2xlYXIgZmlsdGVyc1xuXHRcdHRoaXMuX2NsZWFyUnVudGltZUxvZ0ZpbHRlcnMoKTtcblxuXHRcdC8vIFNob3cgbG9hZGluZyBiYXJcblx0XHR0aGlzLl9zd2l0Y2hSdW50aW1lVmlld1N0YWNrKCdsZ3YtcnVudGltZUxvZ0xvYWRpbmdWaWV3Jyk7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3Rcblx0XHQvLyAodGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSByZXRyaWV2ZWQgaXMgc2VudClcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdHBhcmFtcy5wdXRJbnQoJ251bUVudHJpZXMnLCBOdW1iZXIodGhpcy5fbG9nTGluZXNERC52YWx1ZSgpKSk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9SVU5USU1FX0xPRywgcGFyYW1zKTtcblx0fVxuXG5cdF9jbGVhclJ1bnRpbWVMb2dGaWx0ZXJzKClcblx0e1xuXHRcdHRoaXMuX2xldmVsRmlsdGVyREQuc2VsZWN0KDApO1xuXHRcdHRoaXMuX2NsYXNzRmlsdGVyREQuc2VsZWN0KDApO1xuXHRcdCQoJyNsZ3YtbWVzc2FnZUluJykudmFsKCcnKTtcblx0fVxuXG5cdF9leHBvcnRMb2cobG9nLCBuYW1lKVxuXHR7XG5cdFx0bGV0IGJsb2IgPSBuZXcgQmxvYihbbG9nXSwge3R5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04XCJ9KTtcblx0XHRsZXQgZGF0ZSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWU1NRERfSEhtbXNzJyk7XG5cblx0XHRGaWxlU2F2ZXIuc2F2ZUFzKGJsb2IsIGAke25hbWV9XyR7ZGF0ZX0ubG9nYCk7XG5cdH1cblxuXHRfc2V0UnVudGltZUxvZ0RhdGFTb3VyY2UoZHMpXG5cdHtcblx0XHQvLyBSZWFkIGN1cnJlbnQgaG9yaXpvbnRhbCBzY3JvbGwgdmFsdWVcblx0XHRjb25zdCBzY3JvbGxMZWZ0ID0gJCgnI2xndi1ydW50aW1lTG9nR3JpZCAuay1ncmlkLWNvbnRlbnQnLCB0aGlzLl9ydW50aW1lTG9nR3JpZC53cmFwcGVyKS5zY3JvbGxMZWZ0KCk7XG5cblx0XHQvLyBBc3NpZ24gZGF0YSBzb3VyY2UgdG8gZ3JpZFxuXHRcdHRoaXMuX3J1bnRpbWVMb2dHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdFx0Ly8gU2V0IGZpbHRlcnNcblx0XHR0aGlzLl9zZXRGaWx0ZXJzKGRzKTtcblxuXHRcdC8vIFNldCBob3Jpem9udGFsIHNjcm9sbFxuXHRcdCQoJyNsZ3YtcnVudGltZUxvZ0dyaWQgLmstZ3JpZC1jb250ZW50JywgdGhpcy5fcnVudGltZUxvZ0dyaWQud3JhcHBlcikuc2Nyb2xsTGVmdChzY3JvbGxMZWZ0KTtcblxuXHRcdC8vIFVwZGF0ZSBjb3VudGVyXG5cdFx0JCgnI2xndi1ydW50aW1lTG9nRW50cmllc0xiJykudGV4dChgTG9nIGVudHJpZXM6ICR7dGhpcy5fdG90YWxSdW50aW1lTG9nRW50cmllc30gKCR7ZHMudG90YWwoKX0gZGlzcGxheWVkKWApO1xuXHR9XG5cblx0X3NldEZpbHRlcnMoZHMpXG5cdHtcblx0XHRsZXQgZmlsdGVycyA9IFtdO1xuXG5cdFx0Ly8gTGV2ZWwgZmlsdGVyaW5nXG5cdFx0aWYgKHRoaXMuX2xldmVsRmlsdGVyREQuc2VsZWN0KCkgPiAwKVxuXHRcdFx0ZmlsdGVycy5wdXNoKHtcblx0XHRcdFx0ZmllbGQ6ICdsZXZlbCcsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogdGhpcy5fbGV2ZWxGaWx0ZXJERC52YWx1ZSgpXG5cdFx0XHR9KTtcblxuXHRcdC8vIENsYXNzIGZpbHRlcmluZ1xuXHRcdGlmICh0aGlzLl9jbGFzc0ZpbHRlckRELnNlbGVjdCgpID4gMClcblx0XHRcdGZpbHRlcnMucHVzaCh7XG5cdFx0XHRcdGZpZWxkOiAnY2xhenonLCBvcGVyYXRvcjogJ2VxJywgdmFsdWU6IHRoaXMuX2NsYXNzRmlsdGVyREQudmFsdWUoKVxuXHRcdFx0fSk7XG5cblx0XHQvLyBNZXNzYWdlIGZpbHRlcmluZ1xuXHRcdGlmICgkKCcjbGd2LW1lc3NhZ2VJbicpLnZhbCgpICE9ICcnKVxuXHRcdFx0ZmlsdGVycy5wdXNoKHtcblx0XHRcdFx0ZmllbGQ6ICdtZXNzYWdlJywgb3BlcmF0b3I6ICdjb250YWlucycsIHZhbHVlOiAkKCcjbGd2LW1lc3NhZ2VJbicpLnZhbCgpXG5cdFx0XHR9KTtcblxuXHRcdC8vIFNldCBmaWx0ZXJzXG5cdFx0ZHMuZmlsdGVyKGZpbHRlcnMpO1xuXHR9XG5cblx0X2Rpc2FibGVCYWNrdXBJbnRlcmZhY2UoZGlzYWJsZSwgYmFja3VwSWQgPSBudWxsKVxuXHR7XG5cdFx0aWYgKGRpc2FibGUpXG5cdFx0e1xuXHRcdFx0Ly8gU2hvdyBwcm9wZXIgcHJvZ3Jlc3MgYmFyXG5cdFx0XHRpZiAoYmFja3VwSWQgPT0gdGhpcy5CT09UX0xPR19CQUNLVVBfSUQpXG5cdFx0XHRcdCQoJyNsZ3YtYm9vdExvZ0JhY2t1cENhcmQgLnByb2dyZXNzLWJhcicpLnNob3coKTtcblx0XHRcdGVsc2UgaWYgKGJhY2t1cElkID09IHRoaXMuUlVOVElNRV9MT0dfQkFDS1VQX0lEKVxuXHRcdFx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5wcm9ncmVzcy1iYXInKS5zaG93KCk7XG5cdFx0XHRlbHNlIGlmIChiYWNrdXBJZCA9PSB0aGlzLkZVTExfQkFDS1VQX0lEKVxuXHRcdFx0XHQkKCcjbGd2LWZ1bGxMb2dCYWNrdXBDYXJkIC5wcm9ncmVzcy1iYXInKS5zaG93KCk7XG5cblx0XHRcdC8vIERpc2FibGUgYnV0dG9uc1xuXHRcdFx0JCgnI2xndi1ib290TG9nQmFja3VwQ2FyZCAuYmFja3VwLWJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdCQoJyNsZ3YtZnVsbExvZ0JhY2t1cENhcmQgLmJhY2t1cC1idXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBhbGwgcHJvZ3Jlc3MgYmFyXG5cdFx0XHQkKCcuY2FyZC1ib2R5IC5wcm9ncmVzcy1iYXInKS5oaWRlKCk7XG5cblx0XHRcdC8vIEVuYWJsZSBidXR0b25zXG5cdFx0XHQkKCcjbGd2LWZ1bGxMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdGlmICghdGhpcy5fYm9vdExvZ0JhY2t1cFVuYXZhaWxhYmxlKVxuXHRcdFx0XHQkKCcjbGd2LWJvb3RMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdGlmICghdGhpcy5fcnVudGltZUxvZ0JhY2t1cFVuYXZhaWxhYmxlKVxuXHRcdFx0XHQkKCcjbGd2LXJ1bnRpbWVMb2dCYWNrdXBDYXJkIC5iYWNrdXAtYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0X2luaXRCYWNrdXBDYXJkKGlkU2VsZWN0b3IpXG5cdHtcblx0XHQkKGlkU2VsZWN0b3IgKyAnIC5iYWNrdXAtZGV0YWlscycpLmhpZGUoKTtcblx0XHQkKGlkU2VsZWN0b3IgKyAnIC5wcm9ncmVzcy1iYXInKS5oaWRlKCk7XG5cdH1cblxuXHRfZmlsbEJhY2t1cENhcmQoaWRTZWxlY3RvciwgZGV0YWlsc09iaiA9IG51bGwpXG5cdHtcblx0XHRpZiAoZGV0YWlsc09iaiA9PSBudWxsKVxuXHRcdFx0JChpZFNlbGVjdG9yICsgJyAuYmFja3VwLWRldGFpbHMnKS5oaWRlKCk7XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdCQoaWRTZWxlY3RvciArICcgLmJhY2t1cC1kZXRhaWxzJykuc2hvdygpO1xuXG5cdFx0XHQkKGlkU2VsZWN0b3IgKyAnIC5iYWNrdXAtbGluaycpLmF0dHIoJ2hyZWYnLCBkZXRhaWxzT2JqLnVybCk7XG5cdFx0XHQkKGlkU2VsZWN0b3IgKyAnIC5iYWNrdXAtZGF0ZScpLnRleHQoZGV0YWlsc09iai5kYXRlKTtcblx0XHRcdCQoaWRTZWxlY3RvciArICcgLmJhY2t1cC10aW1lJykudGV4dChkZXRhaWxzT2JqLnRpbWUpO1xuXHRcdFx0JChpZFNlbGVjdG9yICsgJyAuYmFja3VwLXNpemUnKS50ZXh0KGRldGFpbHNPYmouc2l6ZSk7XG5cdFx0fVxuXHR9XG5cblx0X3NldERvd25sb2FkR3JpZERhdGFTb3VyY2UoZHMpXG5cdHtcblx0XHQvLyBSZWFkIGN1cnJlbnQgaG9yaXpvbnRhbCBzY3JvbGwgdmFsdWVcblx0ICAgY29uc3Qgc2Nyb2xsTGVmdCA9ICQoJyNsZ3YtZG93bmxvYWRHcmlkIC5rLWdyaWQtY29udGVudCcsIHRoaXMuX2Rvd25sb2FkR3JpZC53cmFwcGVyKS5zY3JvbGxMZWZ0KCk7XG5cblx0ICAgLy8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0ICAgdGhpcy5fZG93bmxvYWRHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdCAgIC8vIFNldCBob3Jpem9udGFsIHNjcm9sbFxuXHQgICAkKCcjbGd2LWRvd25sb2FkR3JpZCAuay1ncmlkLWNvbnRlbnQnLCB0aGlzLl9kb3dubG9hZEdyaWQud3JhcHBlcikuc2Nyb2xsTGVmdChzY3JvbGxMZWZ0KTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNuQkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzFCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9
|