O Seal Surface Speed and Wear Check Calculator is a practical engineering tool designed to calculate seal surface speed and evaluate potential wear under rotary or reciprocating operating conditions. By analyzing parameters such as shaft diameter, rotational speed, pressure, temperature, seal material, and lubrication, users can quickly assess speed limits, PV conditions, and wear risks. The Seal Surface Speed and Wear Check Calculator helps engineers optimize sealing systems, improve reliability, and reduce premature seal failure in hydraulic, pneumatic, and industrial equipment.
LyoqDQogKiBTZWFsIFN1cmZhY2UgU3BlZWQgYW5kIFdlYXIgQ2hlY2sgQ2FsY3VsYXRvcg0KICogU2NvcGVkIGZvciBXb3JkUHJlc3MgZW1iZWQg4oCUIGFsbCBxdWVyaWVzIGxpbWl0ZWQgdG8gI3NlYWwtc3BlZWQtd2Vhci1jYWxjdWxhdG9yDQogKi8NCg0KKGZ1bmN0aW9uICgpIHsNCiAgICAndXNlIHN0cmljdCc7DQoNCiAgICBjb25zdCBST09UX0lEID0gJ3NlYWwtc3BlZWQtd2Vhci1jYWxjdWxhdG9yJzsNCiAgICBjb25zdCBNTV9UT19JTkNIID0gMSAvIDI1LjQ7DQogICAgY29uc3QgSU5DSF9UT19NTSA9IDI1LjQ7DQogICAgY29uc3QgTV9UT19GVCA9IDMuMjgwODQ7DQogICAgY29uc3QgRlRfVE9fTSA9IDEgLyBNX1RPX0ZUOw0KICAgIGNvbnN0IE1QU19UT19GVFBTID0gTV9UT19GVDsNCiAgICBjb25zdCBNUFNfVE9fRlRQTSA9IE1fVE9fRlQgKiA2MDsNCiAgICBjb25zdCBNUEFfVE9fUFNJID0gMTQ1LjAzODsNCiAgICBjb25zdCBNUEFfVE9fQkFSID0gMTA7DQogICAgY29uc3QgUFNJX1RPX01QQSA9IDEgLyBNUEFfVE9fUFNJOw0KICAgIGNvbnN0IEJBUl9UT19NUEEgPSAwLjE7DQogICAgY29uc3QgTl9UT19MQkYgPSAwLjIyNDgwOTsNCiAgICBjb25zdCBMQkZfVE9fTiA9IDEgLyBOX1RPX0xCRjsNCg0KICAgIGNvbnN0IE1BVEVSSUFMX0RBVEEgPSB7DQogICAgICAgIE5CUjogeyBtYXhTcGVlZDogNi4wLCBtYXhUZW1wOiAxMDAsIHB2TGltaXQ6IDAuNSwgd2VhckZhY3RvcjogMS4wIH0sDQogICAgICAgIEZLTTogeyBtYXhTcGVlZDogMTAuMCwgbWF4VGVtcDogMjAwLCBwdkxpbWl0OiAxLjAsIHdlYXJGYWN0b3I6IDAuNyB9LA0KICAgICAgICBFUERNOiB7IG1heFNwZWVkOiA4LjAsIG1heFRlbXA6IDE1MCwgcHZMaW1pdDogMC40LCB3ZWFyRmFjdG9yOiAxLjEgfSwNCiAgICAgICAgSE5CUjogeyBtYXhTcGVlZDogOC4wLCBtYXhUZW1wOiAxNTAsIHB2TGltaXQ6IDAuOCwgd2VhckZhY3RvcjogMC43NSB9LA0KICAgICAgICBQVEZFOiB7IG1heFNwZWVkOiAxNS4wLCBtYXhUZW1wOiAyNjAsIHB2TGltaXQ6IDIuNSwgd2VhckZhY3RvcjogMC41IH0sDQogICAgICAgIFBvbHl1cmV0aGFuZTogeyBtYXhTcGVlZDogOC4wLCBtYXhUZW1wOiA4MCwgcHZMaW1pdDogMC44LCB3ZWFyRmFjdG9yOiAxLjAgfSwNCiAgICAgICAgU2lsaWNvbmU6IHsgbWF4U3BlZWQ6IDQuMCwgbWF4VGVtcDogMjAwLCBwdkxpbWl0OiAwLjMsIHdlYXJGYWN0b3I6IDEuMyB9LA0KICAgICAgICBDdXN0b206IHsgbWF4U3BlZWQ6IDEwLjAsIG1heFRlbXA6IDE1MCwgcHZMaW1pdDogMS4wLCB3ZWFyRmFjdG9yOiAxLjAgfQ0KICAgIH07DQoNCiAgICBjb25zdCBMVUJFX0ZBQ1RPUlMgPSB7DQogICAgICAgIGV4Y2VsbGVudDogMC42LA0KICAgICAgICBnb29kOiAwLjgsDQogICAgICAgIGxpbWl0ZWQ6IDEuMCwNCiAgICAgICAgcG9vcjogMS4zLA0KICAgICAgICBkcnk6IDEuOA0KICAgIH07DQoNCiAgICBsZXQgcm9vdCA9IG51bGw7DQogICAgbGV0IHVuaXRTeXN0ZW0gPSAnbWV0cmljJzsNCiAgICBsZXQgYWxsb3dTcGVlZE1hbnVhbCA9IGZhbHNlOw0KICAgIGxldCBhbGxvd1BWTWFudWFsID0gZmFsc2U7DQogICAgbGV0IGVscyA9IHt9Ow0KDQogICAgZnVuY3Rpb24gJChpZCkgew0KICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKSB8fA0KICAgICAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zc3djPSInICsgaWQgKyAnIl0nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzZXRWaXNpYmxlKG5vZGVzLCBzaG93KSB7DQogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdzc3djLWhpZGRlbicsICFzaG93KTsNCiAgICAgICAgICAgIGlmIChzaG93KSB7DQogICAgICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNzd2MtaGlkZGVuJyk7DQogICAgICAgICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3N3Yy1oaWRkZW4nLCAndHJ1ZScpOw0KICAgICAgICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNldFRleHQoZWwsIHRleHQpIHsNCiAgICAgICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IHRleHQ7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2V0Q2xhc3MoZWwsIGNsYXNzTmFtZSkgew0KICAgICAgICBpZiAoZWwpIGVsLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBiaW5kRWxlbWVudHMoKSB7DQogICAgICAgIGVscyA9IHsNCiAgICAgICAgICAgIHVuaXRSYWRpb3M6IHJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0ic3N3Yy11bml0U3lzdGVtIl0nKSwNCiAgICAgICAgICAgIG1vdGlvblR5cGU6ICQoJ3Nzd2MtbW90aW9uVHlwZScpLA0KICAgICAgICAgICAgc2VhbFR5cGU6ICQoJ3Nzd2Mtc2VhbFR5cGUnKSwNCiAgICAgICAgICAgIGRpYW1ldGVyOiAkKCdzc3djLWRpYW1ldGVyJyksDQogICAgICAgICAgICBycG06ICQoJ3Nzd2MtcnBtJyksDQogICAgICAgICAgICBzdHJva2U6ICQoJ3Nzd2Mtc3Ryb2tlJyksDQogICAgICAgICAgICBmcmVxdWVuY3k6ICQoJ3Nzd2MtZnJlcXVlbmN5JyksDQogICAgICAgICAgICBmcmVxdWVuY3lVbml0OiAkKCdzc3djLWZyZXF1ZW5jeVVuaXQnKSwNCiAgICAgICAgICAgIG9zY0FuZ2xlOiAkKCdzc3djLW9zY0FuZ2xlJyksDQogICAgICAgICAgICBjdXN0b21TcGVlZDogJCgnc3N3Yy1jdXN0b21TcGVlZCcpLA0KICAgICAgICAgICAgcHJlc3N1cmU6ICQoJ3Nzd2MtcHJlc3N1cmUnKSwNCiAgICAgICAgICAgIHByZXNzdXJlVW5pdDogJCgnc3N3Yy1wcmVzc3VyZVVuaXQnKSwNCiAgICAgICAgICAgIHRlbXBlcmF0dXJlOiAkKCdzc3djLXRlbXBlcmF0dXJlJyksDQogICAgICAgICAgICBtYXRlcmlhbDogJCgnc3N3Yy1tYXRlcmlhbCcpLA0KICAgICAgICAgICAgbHVicmljYXRpb246ICQoJ3Nzd2MtbHVicmljYXRpb24nKSwNCiAgICAgICAgICAgIHN1cmZhY2VGaW5pc2g6ICQoJ3Nzd2Mtc3VyZmFjZUZpbmlzaCcpLA0KICAgICAgICAgICAgZmluaXNoVW5pdDogJCgnc3N3Yy1maW5pc2hVbml0JyksDQogICAgICAgICAgICBhbGxvd1NwZWVkOiAkKCdzc3djLWFsbG93U3BlZWQnKSwNCiAgICAgICAgICAgIGFsbG93UFY6ICQoJ3Nzd2MtYWxsb3dQVicpLA0KICAgICAgICAgICAgZnJpY3Rpb25Db2VmZjogJCgnc3N3Yy1mcmljdGlvbkNvZWZmJyksDQogICAgICAgICAgICBub3JtYWxGb3JjZTogJCgnc3N3Yy1ub3JtYWxGb3JjZScpLA0KICAgICAgICAgICAgb3BlcmF0aW5nVGltZTogJCgnc3N3Yy1vcGVyYXRpbmdUaW1lJyksDQogICAgICAgICAgICB0b3RhbEN5Y2xlczogJCgnc3N3Yy10b3RhbEN5Y2xlcycpLA0KICAgICAgICAgICAgY2FsY3VsYXRlQnRuOiAkKCdzc3djLWNhbGN1bGF0ZUJ0bicpLA0KICAgICAgICAgICAgd2FybmluZ3M6ICQoJ3Nzd2Mtd2FybmluZ3MnKSwNCiAgICAgICAgICAgIG1hdGVyaWFsU3BlZWRIaW50OiAkKCdzc3djLW1hdGVyaWFsU3BlZWRIaW50JyksDQogICAgICAgICAgICBkaWFtZXRlckVycm9yOiAkKCdzc3djLWRpYW1ldGVyRXJyb3InKSwNCiAgICAgICAgICAgIHJwbUVycm9yOiAkKCdzc3djLXJwbUVycm9yJyksDQogICAgICAgICAgICBzdHJva2VFcnJvcjogJCgnc3N3Yy1zdHJva2VFcnJvcicpLA0KICAgICAgICAgICAgZnJlcXVlbmN5RXJyb3I6ICQoJ3Nzd2MtZnJlcXVlbmN5RXJyb3InKSwNCiAgICAgICAgICAgIGFsbG93U3BlZWRFcnJvcjogJCgnc3N3Yy1hbGxvd1NwZWVkRXJyb3InKSwNCiAgICAgICAgICAgIGFsbG93UFZFcnJvcjogJCgnc3N3Yy1hbGxvd1BWRXJyb3InKSwNCiAgICAgICAgICAgIHJlc3VsdHNTZWN0aW9uOiAkKCdzc3djLXJlc3VsdHNTZWN0aW9uJyksDQogICAgICAgICAgICBzdGF0dXNCYW5uZXI6ICQoJ3Nzd2Mtc3RhdHVzQmFubmVyJyksDQogICAgICAgICAgICBzdGF0dXNJY29uOiAkKCdzc3djLXN0YXR1c0ljb24nKSwNCiAgICAgICAgICAgIHN0YXR1c1RpdGxlOiAkKCdzc3djLXN0YXR1c1RpdGxlJyksDQogICAgICAgICAgICBzdGF0dXNTdWI6ICQoJ3Nzd2Mtc3RhdHVzU3ViJyksDQogICAgICAgICAgICByZXN1bHRTdXJmYWNlU3BlZWQ6IHJvb3QucXVlcnlTZWxlY3RvcignLnNzd2Mtb3V0LXN1cmZhY2Utc3BlZWQnKSwNCiAgICAgICAgICAgIHJlc3VsdEF2Z1NwZWVkOiByb290LnF1ZXJ5U2VsZWN0b3IoJy5zc3djLW91dC1hdmctc3BlZWQnKSwNCiAgICAgICAgICAgIHJlc3VsdFBlYWtTcGVlZDogcm9vdC5xdWVyeVNlbGVjdG9yKCcuc3N3Yy1vdXQtcGVhay1zcGVlZCcpLA0KICAgICAgICAgICAgcmVzdWx0QWxsb3dTcGVlZDogcm9vdC5xdWVyeVNlbGVjdG9yKCcuc3N3Yy1vdXQtYWxsb3ctc3BlZWQnKSwNCiAgICAgICAgICAgIHJlc3VsdFNwZWVkVXRpbDogcm9vdC5xdWVyeVNlbGVjdG9yKCcuc3N3Yy1vdXQtc3BlZWQtdXRpbCcpLA0KICAgICAgICAgICAgcmVzdWx0UFY6IHJvb3QucXVlcnlTZWxlY3RvcignLnNzd2Mtb3V0LXB2JyksDQogICAgICAgICAgICByZXN1bHRQVlV0aWw6IHJvb3QucXVlcnlTZWxlY3RvcignLnNzd2Mtb3V0LXB2LXV0aWwnKSwNCiAgICAgICAgICAgIHJlc3VsdERpc3RhbmNlOiByb290LnF1ZXJ5U2VsZWN0b3IoJy5zc3djLW91dC1kaXN0YW5jZScpLA0KICAgICAgICAgICAgcmVzdWx0RnJpY3Rpb25Qb3dlcjogcm9vdC5xdWVyeVNlbGVjdG9yKCcuc3N3Yy1vdXQtZnJpY3Rpb24tcG93ZXInKSwNCiAgICAgICAgICAgIHJlc3VsdFdlYXJJbmRleDogcm9vdC5xdWVyeVNlbGVjdG9yKCcuc3N3Yy1vdXQtd2Vhci1pbmRleCcpLA0KICAgICAgICAgICAgcmVzdWx0V2VhclJpc2s6IHJvb3QucXVlcnlTZWxlY3RvcignLnNzd2Mtb3V0LXdlYXItcmlzaycpLA0KICAgICAgICAgICAgcmVzdWx0VGhlcm1hbFJpc2s6IHJvb3QucXVlcnlTZWxlY3RvcignLnNzd2Mtb3V0LXRoZXJtYWwtcmlzaycpLA0KICAgICAgICAgICAgcmVzdWx0U2VydmljZUxpZmU6IHJvb3QucXVlcnlTZWxlY3RvcignLnNzd2Mtb3V0LXNlcnZpY2UtbGlmZScpLA0KICAgICAgICAgICAgcmVzdWx0T3BlcmF0aW5nU3RhdHVzOiByb290LnF1ZXJ5U2VsZWN0b3IoJy5zc3djLW91dC1vcGVyYXRpbmctc3RhdHVzJykNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwYXJzZU51bSh2YWx1ZSkgew0KICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsOw0KICAgICAgICBjb25zdCBuID0gcGFyc2VGbG9hdCh2YWx1ZSk7DQogICAgICAgIHJldHVybiBpc05hTihuKSA/IG51bGwgOiBuOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldExlbmd0aFVuaXQoKSB7DQogICAgICAgIHJldHVybiB1bml0U3lzdGVtID09PSAnbWV0cmljJyA/ICdtbScgOiAnaW4nOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFNwZWVkVW5pdCgpIHsNCiAgICAgICAgcmV0dXJuIHVuaXRTeXN0ZW0gPT09ICdtZXRyaWMnID8gJ20vcycgOiAnZnQvbWluJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRUZW1wVW5pdCgpIHsNCiAgICAgICAgcmV0dXJuIHVuaXRTeXN0ZW0gPT09ICdtZXRyaWMnID8gJ1x1MDBCMEMnIDogJ1x1MDBCMEYnOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldEZvcmNlVW5pdCgpIHsNCiAgICAgICAgcmV0dXJuIHVuaXRTeXN0ZW0gPT09ICdtZXRyaWMnID8gJ04nIDogJ2xiZic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0UFZVbml0KCkgew0KICAgICAgICByZXR1cm4gdW5pdFN5c3RlbSA9PT0gJ21ldHJpYycgPyAnTVBhXHUwMEI3bS9zJyA6ICdwc2lcdTAwQjdmdC9taW4nOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljTGVuZ3RoKHZhbHVlKSB7DQogICAgICAgIHJldHVybiB1bml0U3lzdGVtID09PSAnbWV0cmljJyA/IHZhbHVlIDogdmFsdWUgKiBJTkNIX1RPX01NOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZyb21NZXRyaWNMZW5ndGgodmFsdWVNbSkgew0KICAgICAgICByZXR1cm4gdW5pdFN5c3RlbSA9PT0gJ21ldHJpYycgPyB2YWx1ZU1tIDogdmFsdWVNbSAqIE1NX1RPX0lOQ0g7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NZXRyaWNTcGVlZCh2YWx1ZSkgew0KICAgICAgICBpZiAodW5pdFN5c3RlbSA9PT0gJ21ldHJpYycpIHJldHVybiB2YWx1ZTsNCiAgICAgICAgcmV0dXJuIHZhbHVlICogRlRfVE9fTSAvIDYwOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZyb21NZXRyaWNTcGVlZCh2YWx1ZU1wcykgew0KICAgICAgICBpZiAodW5pdFN5c3RlbSA9PT0gJ21ldHJpYycpIHJldHVybiB2YWx1ZU1wczsNCiAgICAgICAgcmV0dXJuIHZhbHVlTXBzICogTVBTX1RPX0ZUUE07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NZXRyaWNQcmVzc3VyZSh2YWx1ZSwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ01QYScpIHJldHVybiB2YWx1ZTsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdiYXInKSByZXR1cm4gdmFsdWUgKiBCQVJfVE9fTVBBOw0KICAgICAgICByZXR1cm4gdmFsdWUgKiBQU0lfVE9fTVBBOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZyb21NZXRyaWNQcmVzc3VyZSh2YWx1ZU1wYSwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ01QYScpIHJldHVybiB2YWx1ZU1wYTsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdiYXInKSByZXR1cm4gdmFsdWVNcGEgLyBCQVJfVE9fTVBBOw0KICAgICAgICByZXR1cm4gdmFsdWVNcGEgKiBNUEFfVE9fUFNJOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljVGVtcCh2YWx1ZSkgew0KICAgICAgICBpZiAodW5pdFN5c3RlbSA9PT0gJ21ldHJpYycpIHJldHVybiB2YWx1ZTsNCiAgICAgICAgcmV0dXJuICh2YWx1ZSAtIDMyKSAqIDUgLyA5Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljRm9yY2UodmFsdWUpIHsNCiAgICAgICAgcmV0dXJuIHVuaXRTeXN0ZW0gPT09ICdtZXRyaWMnID8gdmFsdWUgOiB2YWx1ZSAqIExCRl9UT19OOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljRmluaXNoKHZhbHVlLCB1bml0KSB7DQogICAgICAgIGlmICh1bml0ID09PSAndW0nKSByZXR1cm4gdmFsdWU7DQogICAgICAgIHJldHVybiB2YWx1ZSAqIDAuMDI1NDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JtYXRTcGVlZCh2YWx1ZU1wcykgew0KICAgICAgICBpZiAodW5pdFN5c3RlbSA9PT0gJ21ldHJpYycpIHsNCiAgICAgICAgICAgIHJldHVybiB2YWx1ZU1wcy50b0ZpeGVkKDMpICsgJyBtL3MgKCcgKw0KICAgICAgICAgICAgICAgICh2YWx1ZU1wcyAqIE1QU19UT19GVFBTKS50b0ZpeGVkKDIpICsgJyBmdC9zKSc7DQogICAgICAgIH0NCiAgICAgICAgY29uc3QgZnRNaW4gPSBmcm9tTWV0cmljU3BlZWQodmFsdWVNcHMpOw0KICAgICAgICByZXR1cm4gZnRNaW4udG9GaXhlZCgxKSArICcgZnQvbWluICgnICsNCiAgICAgICAgICAgICh2YWx1ZU1wcykudG9GaXhlZCgzKSArICcgbS9zKSc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2UodmFsdWVNKSB7DQogICAgICAgIGlmICh1bml0U3lzdGVtID09PSAnbWV0cmljJykgew0KICAgICAgICAgICAgaWYgKHZhbHVlTSA+PSAxMDAwKSByZXR1cm4gKHZhbHVlTSAvIDEwMDApLnRvRml4ZWQoMikgKyAnIGttJzsNCiAgICAgICAgICAgIHJldHVybiB2YWx1ZU0udG9GaXhlZCgyKSArICcgbSc7DQogICAgICAgIH0NCiAgICAgICAgY29uc3QgZnQgPSB2YWx1ZU0gKiBNX1RPX0ZUOw0KICAgICAgICBpZiAoZnQgPj0gNTI4MCkgcmV0dXJuIChmdCAvIDUyODApLnRvRml4ZWQoMikgKyAnIG1pJzsNCiAgICAgICAgcmV0dXJuIGZ0LnRvRml4ZWQoMSkgKyAnIGZ0JzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JtYXRQb3dlcih2YWx1ZVcpIHsNCiAgICAgICAgaWYgKHZhbHVlVyA+PSAxMDAwKSByZXR1cm4gKHZhbHVlVyAvIDEwMDApLnRvRml4ZWQoMykgKyAnIGtXJzsNCiAgICAgICAgcmV0dXJuIHZhbHVlVy50b0ZpeGVkKDIpICsgJyBXJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JtYXRQVkxpbWl0KG1hdCkgew0KICAgICAgICBpZiAodW5pdFN5c3RlbSA9PT0gJ21ldHJpYycpIHJldHVybiBtYXQucHZMaW1pdC50b0ZpeGVkKDIpOw0KICAgICAgICByZXR1cm4gKG1hdC5wdkxpbWl0ICogTVBBX1RPX1BTSSAqIE1QU19UT19GVFBNKS50b0ZpeGVkKDEpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNvbnZlcnRJbnB1dHNPblVuaXRDaGFuZ2UoZnJvbVN5c3RlbSwgdG9TeXN0ZW0pIHsNCiAgICAgICAgaWYgKGZyb21TeXN0ZW0gPT09IHRvU3lzdGVtKSByZXR1cm47DQoNCiAgICAgICAgZnVuY3Rpb24gY29udmVydExlbmd0aChpbnB1dCkgew0KICAgICAgICAgICAgY29uc3QgdiA9IHBhcnNlTnVtKGlucHV0ICYmIGlucHV0LnZhbHVlKTsNCiAgICAgICAgICAgIGlmICh2ID09PSBudWxsIHx8ICFpbnB1dCkgcmV0dXJuOw0KICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAodG9TeXN0ZW0gPT09ICdtZXRyaWMnID8gdiAqIElOQ0hfVE9fTU0gOiB2ICogTU1fVE9fSU5DSCkNCiAgICAgICAgICAgICAgICAudG9GaXhlZCh0b1N5c3RlbSA9PT0gJ21ldHJpYycgPyAyIDogNCk7DQogICAgICAgIH0NCg0KICAgICAgICBjb252ZXJ0TGVuZ3RoKGVscy5kaWFtZXRlcik7DQogICAgICAgIGNvbnZlcnRMZW5ndGgoZWxzLnN0cm9rZSk7DQoNCiAgICAgICAgY29uc3QgdGVtcCA9IHBhcnNlTnVtKGVscy50ZW1wZXJhdHVyZS52YWx1ZSk7DQogICAgICAgIGlmICh0ZW1wICE9PSBudWxsKSB7DQogICAgICAgICAgICBpZiAoZnJvbVN5c3RlbSA9PT0gJ21ldHJpYycgJiYgdG9TeXN0ZW0gPT09ICdpbXBlcmlhbCcpIHsNCiAgICAgICAgICAgICAgICBlbHMudGVtcGVyYXR1cmUudmFsdWUgPSAodGVtcCAqIDkgLyA1ICsgMzIpLnRvRml4ZWQoMSk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGZyb21TeXN0ZW0gPT09ICdpbXBlcmlhbCcgJiYgdG9TeXN0ZW0gPT09ICdtZXRyaWMnKSB7DQogICAgICAgICAgICAgICAgZWxzLnRlbXBlcmF0dXJlLnZhbHVlID0gKCh0ZW1wIC0gMzIpICogNSAvIDkpLnRvRml4ZWQoMSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBjdXN0b21TcGVlZCA9IHBhcnNlTnVtKGVscy5jdXN0b21TcGVlZC52YWx1ZSk7DQogICAgICAgIGlmIChjdXN0b21TcGVlZCAhPT0gbnVsbCkgew0KICAgICAgICAgICAgZWxzLmN1c3RvbVNwZWVkLnZhbHVlID0gKHRvU3lzdGVtID09PSAnbWV0cmljJw0KICAgICAgICAgICAgICAgID8gY3VzdG9tU3BlZWQgLyBNUFNfVE9fRlRQTQ0KICAgICAgICAgICAgICAgIDogY3VzdG9tU3BlZWQgKiBNUFNfVE9fRlRQTSkudG9GaXhlZCh0b1N5c3RlbSA9PT0gJ21ldHJpYycgPyAzIDogMSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYWxsb3dTcGVlZE1hbnVhbCkgew0KICAgICAgICAgICAgY29uc3QgYWxsb3dTcGVlZCA9IHBhcnNlTnVtKGVscy5hbGxvd1NwZWVkLnZhbHVlKTsNCiAgICAgICAgICAgIGlmIChhbGxvd1NwZWVkICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgZWxzLmFsbG93U3BlZWQudmFsdWUgPSAodG9TeXN0ZW0gPT09ICdtZXRyaWMnDQogICAgICAgICAgICAgICAgICAgID8gYWxsb3dTcGVlZCAvIE1QU19UT19GVFBNDQogICAgICAgICAgICAgICAgICAgIDogYWxsb3dTcGVlZCAqIE1QU19UT19GVFBNKS50b0ZpeGVkKHRvU3lzdGVtID09PSAnbWV0cmljJyA/IDIgOiAxKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChhbGxvd1BWTWFudWFsKSB7DQogICAgICAgICAgICBjb25zdCBhbGxvd1BWID0gcGFyc2VOdW0oZWxzLmFsbG93UFYudmFsdWUpOw0KICAgICAgICAgICAgaWYgKGFsbG93UFYgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICBlbHMuYWxsb3dQVi52YWx1ZSA9ICh0b1N5c3RlbSA9PT0gJ21ldHJpYycNCiAgICAgICAgICAgICAgICAgICAgPyBhbGxvd1BWIC8gKE1QQV9UT19QU0kgKiBNUFNfVE9fRlRQTSkNCiAgICAgICAgICAgICAgICAgICAgOiBhbGxvd1BWICogTVBBX1RPX1BTSSAqIE1QU19UT19GVFBNKS50b0ZpeGVkKHRvU3lzdGVtID09PSAnbWV0cmljJyA/IDIgOiAxKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGZvcmNlID0gcGFyc2VOdW0oZWxzLm5vcm1hbEZvcmNlLnZhbHVlKTsNCiAgICAgICAgaWYgKGZvcmNlICE9PSBudWxsKSB7DQogICAgICAgICAgICBlbHMubm9ybWFsRm9yY2UudmFsdWUgPSAodG9TeXN0ZW0gPT09ICdtZXRyaWMnDQogICAgICAgICAgICAgICAgPyBmb3JjZSAqIExCRl9UT19ODQogICAgICAgICAgICAgICAgOiBmb3JjZSAqIE5fVE9fTEJGKS50b0ZpeGVkKDIpOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgZmluaXNoID0gcGFyc2VOdW0oZWxzLnN1cmZhY2VGaW5pc2gudmFsdWUpOw0KICAgICAgICBpZiAoZmluaXNoICE9PSBudWxsKSB7DQogICAgICAgICAgICBpZiAoZWxzLmZpbmlzaFVuaXQudmFsdWUgPT09ICd1bScgJiYgdG9TeXN0ZW0gPT09ICdpbXBlcmlhbCcpIHsNCiAgICAgICAgICAgICAgICBlbHMuZmluaXNoVW5pdC52YWx1ZSA9ICd1aW4nOw0KICAgICAgICAgICAgICAgIGVscy5zdXJmYWNlRmluaXNoLnZhbHVlID0gKGZpbmlzaCAqIDM5LjM3MDEpLnRvRml4ZWQoMSk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGVscy5maW5pc2hVbml0LnZhbHVlID09PSAndWluJyAmJiB0b1N5c3RlbSA9PT0gJ21ldHJpYycpIHsNCiAgICAgICAgICAgICAgICBlbHMuZmluaXNoVW5pdC52YWx1ZSA9ICd1bSc7DQogICAgICAgICAgICAgICAgZWxzLnN1cmZhY2VGaW5pc2gudmFsdWUgPSAoZmluaXNoICogMC4wMjU0KS50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0UFZMaW1pdE1ldHJpYyhhbGxvd1BWLCBtYXQpIHsNCiAgICAgICAgaWYgKGFsbG93UFYgIT09IG51bGwpIHsNCiAgICAgICAgICAgIHJldHVybiB1bml0U3lzdGVtID09PSAnbWV0cmljJw0KICAgICAgICAgICAgICAgID8gYWxsb3dQVg0KICAgICAgICAgICAgICAgIDogYWxsb3dQViAvIChNUEFfVE9fUFNJICogTVBTX1RPX0ZUUE0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBtYXQucHZMaW1pdDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRGcmVxdWVuY3lIeigpIHsNCiAgICAgICAgY29uc3QgZiA9IHBhcnNlTnVtKGVscy5mcmVxdWVuY3kudmFsdWUpOw0KICAgICAgICBpZiAoZiA9PT0gbnVsbCkgcmV0dXJuIG51bGw7DQogICAgICAgIHJldHVybiBlbHMuZnJlcXVlbmN5VW5pdC52YWx1ZSA9PT0gJ0h6JyA/IGYgOiBmIC8gNjA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0TWF0ZXJpYWxEYXRhKCkgew0KICAgICAgICByZXR1cm4gTUFURVJJQUxfREFUQVtlbHMubWF0ZXJpYWwudmFsdWVdIHx8IE1BVEVSSUFMX0RBVEEuQ3VzdG9tOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVVuaXRMYWJlbHMoKSB7DQogICAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdW5pdD0ibGVuZ3RoIl0nKS5mb3JFYWNoKGVsID0+IHsNCiAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gZ2V0TGVuZ3RoVW5pdCgpOw0KICAgICAgICB9KTsNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS11bml0PSJzcGVlZCJdJykuZm9yRWFjaChlbCA9PiB7DQogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IGdldFNwZWVkVW5pdCgpOw0KICAgICAgICB9KTsNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS11bml0PSJ0ZW1wZXJhdHVyZSJdJykuZm9yRWFjaChlbCA9PiB7DQogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IGdldFRlbXBVbml0KCk7DQogICAgICAgIH0pOw0KICAgICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXVuaXQ9ImZvcmNlIl0nKS5mb3JFYWNoKGVsID0+IHsNCiAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gZ2V0Rm9yY2VVbml0KCk7DQogICAgICAgIH0pOw0KICAgICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXVuaXQ9InB2Il0nKS5mb3JFYWNoKGVsID0+IHsNCiAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gZ2V0UFZVbml0KCk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZU1vdGlvblZpc2liaWxpdHkoKSB7DQogICAgICAgIGNvbnN0IG1vdGlvbiA9IGVscy5tb3Rpb25UeXBlLnZhbHVlOw0KICAgICAgICBzZXRWaXNpYmxlKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnNzd2MtbW90aW9uLXJvdGFyeScpLCBtb3Rpb24gPT09ICdyb3RhcnknKTsNCiAgICAgICAgc2V0VmlzaWJsZShyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zc3djLW1vdGlvbi1yZWNpcCcpLA0KICAgICAgICAgICAgbW90aW9uID09PSAncmVjaXByb2NhdGluZycgfHwgbW90aW9uID09PSAnb3NjaWxsYXRpbmcnKTsNCiAgICAgICAgc2V0VmlzaWJsZShyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zc3djLW1vdGlvbi1vc2NpbGxhdGluZycpLCBtb3Rpb24gPT09ICdvc2NpbGxhdGluZycpOw0KICAgICAgICBzZXRWaXNpYmxlKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnNzd2MtbW90aW9uLWN1c3RvbScpLCBtb3Rpb24gPT09ICdjdXN0b20nKTsNCiAgICAgICAgc2V0VmlzaWJsZShyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zc3djLW1vdGlvbi1yZWNpcC1maWVsZCcpLA0KICAgICAgICAgICAgbW90aW9uICE9PSAncm90YXJ5JyAmJiBtb3Rpb24gIT09ICdjdXN0b20nKTsNCg0KICAgICAgICBjb25zdCBpc1JlY2lwID0gbW90aW9uID09PSAncmVjaXByb2NhdGluZycgfHwgbW90aW9uID09PSAnb3NjaWxsYXRpbmcnOw0KICAgICAgICBzZXRWaXNpYmxlKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnNzd2MtcmVjaXAtb25seScpLCBpc1JlY2lwKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVNYXRlcmlhbERlZmF1bHRzKCkgew0KICAgICAgICBjb25zdCBtYXQgPSBnZXRNYXRlcmlhbERhdGEoKTsNCiAgICAgICAgZWxzLm1hdGVyaWFsU3BlZWRIaW50LnRleHRDb250ZW50ID0NCiAgICAgICAgICAgICdSZWZlcmVuY2UgbWF4IHNwZWVkIGZvciAnICsgZWxzLm1hdGVyaWFsLnZhbHVlICsgJzogJyArDQogICAgICAgICAgICBmcm9tTWV0cmljU3BlZWQobWF0Lm1heFNwZWVkKS50b0ZpeGVkKDIpICsgJyAnICsgZ2V0U3BlZWRVbml0KCkgKw0KICAgICAgICAgICAgJyAobm90IGEgdW5pdmVyc2FsIGxpbWl0KSc7DQoNCiAgICAgICAgaWYgKCFhbGxvd1NwZWVkTWFudWFsKSB7DQogICAgICAgICAgICBlbHMuYWxsb3dTcGVlZC52YWx1ZSA9IGZyb21NZXRyaWNTcGVlZChtYXQubWF4U3BlZWQpLnRvRml4ZWQodW5pdFN5c3RlbSA9PT0gJ21ldHJpYycgPyAyIDogMSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFhbGxvd1BWTWFudWFsKSB7DQogICAgICAgICAgICBlbHMuYWxsb3dQVi52YWx1ZSA9IGZvcm1hdFBWTGltaXQobWF0KTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNsZWFyRXJyb3JzKCkgew0KICAgICAgICBbJ2RpYW1ldGVyJywgJ3JwbScsICdzdHJva2UnLCAnZnJlcXVlbmN5JywgJ2FsbG93U3BlZWQnLCAnYWxsb3dQViddLmZvckVhY2goa2V5ID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGVyckVsID0gZWxzW2tleSArICdFcnJvciddOw0KICAgICAgICAgICAgY29uc3QgaW5wdXRFbCA9IGVsc1trZXldOw0KICAgICAgICAgICAgaWYgKGVyckVsKSBlcnJFbC50ZXh0Q29udGVudCA9ICcnOw0KICAgICAgICAgICAgaWYgKGlucHV0RWwpIGlucHV0RWwuY2xhc3NMaXN0LnJlbW92ZSgnc3N3Yy1lcnJvcicpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0cygpIHsNCiAgICAgICAgY2xlYXJFcnJvcnMoKTsNCiAgICAgICAgY29uc3Qgd2FybmluZ3MgPSBbXTsNCiAgICAgICAgbGV0IHZhbGlkID0gdHJ1ZTsNCiAgICAgICAgY29uc3QgbW90aW9uID0gZWxzLm1vdGlvblR5cGUudmFsdWU7DQoNCiAgICAgICAgY29uc3QgZGlhbWV0ZXIgPSBwYXJzZU51bShlbHMuZGlhbWV0ZXIudmFsdWUpOw0KICAgICAgICBpZiAoZGlhbWV0ZXIgPT09IG51bGwgfHwgZGlhbWV0ZXIgPD0gMCkgew0KICAgICAgICAgICAgZWxzLmRpYW1ldGVyRXJyb3IudGV4dENvbnRlbnQgPSAnRGlhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgZWxzLmRpYW1ldGVyLmNsYXNzTGlzdC5hZGQoJ3Nzd2MtZXJyb3InKTsNCiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobW90aW9uID09PSAncm90YXJ5Jykgew0KICAgICAgICAgICAgY29uc3QgcnBtID0gcGFyc2VOdW0oZWxzLnJwbS52YWx1ZSk7DQogICAgICAgICAgICBpZiAocnBtID09PSBudWxsIHx8IHJwbSA8IDApIHsNCiAgICAgICAgICAgICAgICBlbHMucnBtRXJyb3IudGV4dENvbnRlbnQgPSAnU3BlZWQgY2Fubm90IGJlIG5lZ2F0aXZlLic7DQogICAgICAgICAgICAgICAgZWxzLnJwbS5jbGFzc0xpc3QuYWRkKCdzc3djLWVycm9yJyk7DQogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChtb3Rpb24gPT09ICdyZWNpcHJvY2F0aW5nJyB8fCBtb3Rpb24gPT09ICdvc2NpbGxhdGluZycpIHsNCiAgICAgICAgICAgIGNvbnN0IHN0cm9rZSA9IHBhcnNlTnVtKGVscy5zdHJva2UudmFsdWUpOw0KICAgICAgICAgICAgaWYgKHN0cm9rZSA9PT0gbnVsbCB8fCBzdHJva2UgPD0gMCkgew0KICAgICAgICAgICAgICAgIGVscy5zdHJva2VFcnJvci50ZXh0Q29udGVudCA9ICdTdHJva2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgICAgIGVscy5zdHJva2UuY2xhc3NMaXN0LmFkZCgnc3N3Yy1lcnJvcicpOw0KICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb25zdCBmcmVxID0gcGFyc2VOdW0oZWxzLmZyZXF1ZW5jeS52YWx1ZSk7DQogICAgICAgICAgICBpZiAoZnJlcSA9PT0gbnVsbCB8fCBmcmVxIDwgMCkgew0KICAgICAgICAgICAgICAgIGVscy5mcmVxdWVuY3lFcnJvci50ZXh0Q29udGVudCA9ICdGcmVxdWVuY3kgY2Fubm90IGJlIG5lZ2F0aXZlLic7DQogICAgICAgICAgICAgICAgZWxzLmZyZXF1ZW5jeS5jbGFzc0xpc3QuYWRkKCdzc3djLWVycm9yJyk7DQogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGFsbG93U3BlZWQgPSBwYXJzZU51bShlbHMuYWxsb3dTcGVlZC52YWx1ZSk7DQogICAgICAgIGlmIChhbGxvd1NwZWVkID09PSBudWxsIHx8IGFsbG93U3BlZWQgPD0gMCkgew0KICAgICAgICAgICAgZWxzLmFsbG93U3BlZWRFcnJvci50ZXh0Q29udGVudCA9ICdBbGxvd2FibGUgc3BlZWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgZWxzLmFsbG93U3BlZWQuY2xhc3NMaXN0LmFkZCgnc3N3Yy1lcnJvcicpOw0KICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGFsbG93UFYgPSBwYXJzZU51bShlbHMuYWxsb3dQVi52YWx1ZSk7DQogICAgICAgIGlmIChhbGxvd1BWICE9PSBudWxsICYmIGFsbG93UFYgPD0gMCkgew0KICAgICAgICAgICAgZWxzLmFsbG93UFZFcnJvci50ZXh0Q29udGVudCA9ICdBbGxvd2FibGUgUFYgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgZWxzLmFsbG93UFYuY2xhc3NMaXN0LmFkZCgnc3N3Yy1lcnJvcicpOw0KICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghdmFsaWQpIHJldHVybiB7IHZhbGlkLCB3YXJuaW5ncywgcmVzdWx0czogbnVsbCB9Ow0KDQogICAgICAgIGNvbnN0IERtbSA9IHRvTWV0cmljTGVuZ3RoKGRpYW1ldGVyKTsNCiAgICAgICAgY29uc3QgRG0gPSBEbW0gLyAxMDAwOw0KICAgICAgICBsZXQgc3VyZmFjZVNwZWVkID0gMDsNCiAgICAgICAgbGV0IGF2Z1NwZWVkID0gMDsNCiAgICAgICAgbGV0IHBlYWtTcGVlZCA9IDA7DQoNCiAgICAgICAgaWYgKG1vdGlvbiA9PT0gJ3JvdGFyeScpIHsNCiAgICAgICAgICAgIGNvbnN0IHJwbSA9IHBhcnNlTnVtKGVscy5ycG0udmFsdWUpIHx8IDA7DQogICAgICAgICAgICBzdXJmYWNlU3BlZWQgPSBNYXRoLlBJICogRG0gKiBycG0gLyA2MDsNCiAgICAgICAgICAgIGF2Z1NwZWVkID0gc3VyZmFjZVNwZWVkOw0KICAgICAgICAgICAgcGVha1NwZWVkID0gc3VyZmFjZVNwZWVkOw0KICAgICAgICB9IGVsc2UgaWYgKG1vdGlvbiA9PT0gJ3JlY2lwcm9jYXRpbmcnKSB7DQogICAgICAgICAgICBjb25zdCBMbSA9IHRvTWV0cmljTGVuZ3RoKHBhcnNlTnVtKGVscy5zdHJva2UudmFsdWUpKSAvIDEwMDA7DQogICAgICAgICAgICBjb25zdCBmID0gZ2V0RnJlcXVlbmN5SHooKSB8fCAwOw0KICAgICAgICAgICAgYXZnU3BlZWQgPSAyICogTG0gKiBmOw0KICAgICAgICAgICAgcGVha1NwZWVkID0gTWF0aC5QSSAqIExtICogZjsNCiAgICAgICAgICAgIHN1cmZhY2VTcGVlZCA9IHBlYWtTcGVlZDsNCiAgICAgICAgfSBlbHNlIGlmIChtb3Rpb24gPT09ICdvc2NpbGxhdGluZycpIHsNCiAgICAgICAgICAgIGNvbnN0IGFuZ2xlRGVnID0gcGFyc2VOdW0oZWxzLm9zY0FuZ2xlLnZhbHVlKSB8fCA0NTsNCiAgICAgICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gYW5nbGVEZWcgKiBNYXRoLlBJIC8gMTgwOw0KICAgICAgICAgICAgY29uc3QgTG0gPSBEbSAqIGFuZ2xlUmFkOw0KICAgICAgICAgICAgY29uc3QgZiA9IGdldEZyZXF1ZW5jeUh6KCkgfHwgMDsNCiAgICAgICAgICAgIGF2Z1NwZWVkID0gMiAqIExtICogZjsNCiAgICAgICAgICAgIHBlYWtTcGVlZCA9IE1hdGguUEkgKiBMbSAqIGY7DQogICAgICAgICAgICBzdXJmYWNlU3BlZWQgPSBwZWFrU3BlZWQ7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBzdXJmYWNlU3BlZWQgPSB0b01ldHJpY1NwZWVkKHBhcnNlTnVtKGVscy5jdXN0b21TcGVlZC52YWx1ZSkgfHwgMCk7DQogICAgICAgICAgICBhdmdTcGVlZCA9IHN1cmZhY2VTcGVlZDsNCiAgICAgICAgICAgIHBlYWtTcGVlZCA9IHN1cmZhY2VTcGVlZDsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHByZXNzdXJlTXBhID0gdG9NZXRyaWNQcmVzc3VyZSgNCiAgICAgICAgICAgIHBhcnNlTnVtKGVscy5wcmVzc3VyZS52YWx1ZSkgfHwgMCwNCiAgICAgICAgICAgIGVscy5wcmVzc3VyZVVuaXQudmFsdWUNCiAgICAgICAgKTsNCiAgICAgICAgY29uc3QgdGVtcEMgPSB0b01ldHJpY1RlbXAocGFyc2VOdW0oZWxzLnRlbXBlcmF0dXJlLnZhbHVlKSB8fCAyMCk7DQogICAgICAgIGNvbnN0IG1hdCA9IGdldE1hdGVyaWFsRGF0YSgpOw0KICAgICAgICBjb25zdCBhbGxvd1NwZWVkTXBzID0gdG9NZXRyaWNTcGVlZChhbGxvd1NwZWVkKTsNCiAgICAgICAgY29uc3QgcHZWYWx1ZSA9IHByZXNzdXJlTXBhICogc3VyZmFjZVNwZWVkOw0KICAgICAgICBjb25zdCBwdkxpbWl0TWV0cmljID0gZ2V0UFZMaW1pdE1ldHJpYyhhbGxvd1BWLCBtYXQpOw0KDQogICAgICAgIGNvbnN0IHNwZWVkVXRpbCA9IGFsbG93U3BlZWRNcHMgPiAwID8gKHN1cmZhY2VTcGVlZCAvIGFsbG93U3BlZWRNcHMpICogMTAwIDogMDsNCiAgICAgICAgY29uc3QgcHZVdGlsID0gcHZMaW1pdE1ldHJpYyA+IDAgPyAocHZWYWx1ZSAvIHB2TGltaXRNZXRyaWMpICogMTAwIDogbnVsbDsNCg0KICAgICAgICBjb25zdCBzcGVlZEZhY3RvciA9IGFsbG93U3BlZWRNcHMgPiAwID8gc3VyZmFjZVNwZWVkIC8gYWxsb3dTcGVlZE1wcyA6IDE7DQogICAgICAgIGNvbnN0IHByZXNzdXJlRmFjdG9yID0gTWF0aC5taW4oMi4wLCAxICsgKHByZXNzdXJlTXBhIC8gMC41KSAqIDAuMjUpOw0KICAgICAgICBjb25zdCB0ZW1wUmF0aW8gPSB0ZW1wQyAvIG1hdC5tYXhUZW1wOw0KICAgICAgICBsZXQgdGVtcEZhY3RvciA9IDAuODU7DQogICAgICAgIGlmICh0ZW1wUmF0aW8gPiAxKSB0ZW1wRmFjdG9yID0gMS44Ow0KICAgICAgICBlbHNlIGlmICh0ZW1wUmF0aW8gPiAwLjg1KSB0ZW1wRmFjdG9yID0gMS4zOw0KICAgICAgICBlbHNlIGlmICh0ZW1wUmF0aW8gPiAwLjcpIHRlbXBGYWN0b3IgPSAxLjA7DQogICAgICAgIGVsc2UgdGVtcEZhY3RvciA9IDAuODU7DQoNCiAgICAgICAgY29uc3QgbHViZUZhY3RvciA9IExVQkVfRkFDVE9SU1tlbHMubHVicmljYXRpb24udmFsdWVdIHx8IDEuMDsNCiAgICAgICAgY29uc3QgbWF0ZXJpYWxGYWN0b3IgPSBtYXQud2VhckZhY3RvcjsNCg0KICAgICAgICBsZXQgZmluaXNoRmFjdG9yID0gMS4wOw0KICAgICAgICBjb25zdCBmaW5pc2ggPSBwYXJzZU51bShlbHMuc3VyZmFjZUZpbmlzaC52YWx1ZSk7DQogICAgICAgIGlmIChmaW5pc2ggIT09IG51bGwgJiYgZmluaXNoID4gMCkgew0KICAgICAgICAgICAgY29uc3QgcmFVbSA9IHRvTWV0cmljRmluaXNoKGZpbmlzaCwgZWxzLmZpbmlzaFVuaXQudmFsdWUpOw0KICAgICAgICAgICAgaWYgKHJhVW0gPiAxLjYpIGZpbmlzaEZhY3RvciA9IDEuMjsNCiAgICAgICAgICAgIGVsc2UgaWYgKHJhVW0gPiAwLjgpIGZpbmlzaEZhY3RvciA9IDEuMDU7DQogICAgICAgICAgICBlbHNlIGlmIChyYVVtIDw9IDAuNCkgZmluaXNoRmFjdG9yID0gMC45NTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHdlYXJJbmRleCA9IHNwZWVkRmFjdG9yICogcHJlc3N1cmVGYWN0b3IgKiB0ZW1wRmFjdG9yICogbHViZUZhY3RvciAqIG1hdGVyaWFsRmFjdG9yICogZmluaXNoRmFjdG9yOw0KDQogICAgICAgIGxldCBzbGlkaW5nRGlzdGFuY2UgPSBudWxsOw0KICAgICAgICBjb25zdCBvcFRpbWUgPSBwYXJzZU51bShlbHMub3BlcmF0aW5nVGltZS52YWx1ZSk7DQogICAgICAgIGNvbnN0IHRvdGFsQ3ljbGVzID0gcGFyc2VOdW0oZWxzLnRvdGFsQ3ljbGVzLnZhbHVlKTsNCg0KICAgICAgICBpZiAob3BUaW1lICE9PSBudWxsICYmIG9wVGltZSA+IDApIHsNCiAgICAgICAgICAgIHNsaWRpbmdEaXN0YW5jZSA9IGF2Z1NwZWVkICogb3BUaW1lICogMzYwMDsNCiAgICAgICAgfSBlbHNlIGlmICh0b3RhbEN5Y2xlcyAhPT0gbnVsbCAmJiB0b3RhbEN5Y2xlcyA+IDAgJiYNCiAgICAgICAgICAgIChtb3Rpb24gPT09ICdyZWNpcHJvY2F0aW5nJyB8fCBtb3Rpb24gPT09ICdvc2NpbGxhdGluZycpKSB7DQogICAgICAgICAgICBsZXQgTG07DQogICAgICAgICAgICBpZiAobW90aW9uID09PSAncmVjaXByb2NhdGluZycpIHsNCiAgICAgICAgICAgICAgICBMbSA9IHRvTWV0cmljTGVuZ3RoKHBhcnNlTnVtKGVscy5zdHJva2UudmFsdWUpKSAvIDEwMDA7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gKHBhcnNlTnVtKGVscy5vc2NBbmdsZS52YWx1ZSkgfHwgNDUpICogTWF0aC5QSSAvIDE4MDsNCiAgICAgICAgICAgICAgICBMbSA9IERtICogYW5nbGVSYWQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzbGlkaW5nRGlzdGFuY2UgPSAyICogTG0gKiB0b3RhbEN5Y2xlczsNCiAgICAgICAgfQ0KDQogICAgICAgIGxldCBmcmljdGlvblBvd2VyID0gbnVsbDsNCiAgICAgICAgY29uc3QgbXUgPSBwYXJzZU51bShlbHMuZnJpY3Rpb25Db2VmZi52YWx1ZSk7DQogICAgICAgIGNvbnN0IG5vcm1hbEZvcmNlID0gcGFyc2VOdW0oZWxzLm5vcm1hbEZvcmNlLnZhbHVlKTsNCiAgICAgICAgaWYgKG11ICE9PSBudWxsICYmIG5vcm1hbEZvcmNlICE9PSBudWxsICYmIG11ID4gMCAmJiBub3JtYWxGb3JjZSA+IDApIHsNCiAgICAgICAgICAgIGNvbnN0IGZvcmNlTiA9IHRvTWV0cmljRm9yY2Uobm9ybWFsRm9yY2UpOw0KICAgICAgICAgICAgZnJpY3Rpb25Qb3dlciA9IG11ICogZm9yY2VOICogc3VyZmFjZVNwZWVkOw0KICAgICAgICB9DQoNCiAgICAgICAgbGV0IHdlYXJSaXNrID0gJ0xvdyc7DQogICAgICAgIGlmICh3ZWFySW5kZXggPj0gMS44IHx8IHNwZWVkVXRpbCA+IDEwMCB8fCAocHZVdGlsICE9PSBudWxsICYmIHB2VXRpbCA+IDEwMCkpIHsNCiAgICAgICAgICAgIHdlYXJSaXNrID0gJ0hpZ2gnOw0KICAgICAgICB9IGVsc2UgaWYgKHdlYXJJbmRleCA+PSAxLjAgfHwgc3BlZWRVdGlsID49IDgwIHx8IChwdlV0aWwgIT09IG51bGwgJiYgcHZVdGlsID49IDgwKSkgew0KICAgICAgICAgICAgd2VhclJpc2sgPSAnTW9kZXJhdGUnOw0KICAgICAgICB9DQoNCiAgICAgICAgbGV0IHRoZXJtYWxTY29yZSA9IDA7DQogICAgICAgIGlmIChzcGVlZFV0aWwgPiA3MCkgdGhlcm1hbFNjb3JlICs9IDI7DQogICAgICAgIGVsc2UgaWYgKHNwZWVkVXRpbCA+IDQwKSB0aGVybWFsU2NvcmUgKz0gMTsNCiAgICAgICAgaWYgKHByZXNzdXJlTXBhID4gMC41KSB0aGVybWFsU2NvcmUgKz0gMTsNCiAgICAgICAgaWYgKHByZXNzdXJlTXBhID4gMikgdGhlcm1hbFNjb3JlICs9IDE7DQogICAgICAgIGlmIChsdWJlRmFjdG9yID49IDEuMykgdGhlcm1hbFNjb3JlICs9IDI7DQogICAgICAgIGlmIChsdWJlRmFjdG9yID49IDEuOCkgdGhlcm1hbFNjb3JlICs9IDI7DQogICAgICAgIGlmICh0ZW1wUmF0aW8gPiAwLjg1KSB0aGVybWFsU2NvcmUgKz0gMTsNCiAgICAgICAgaWYgKHRlbXBSYXRpbyA+IDEpIHRoZXJtYWxTY29yZSArPSAyOw0KICAgICAgICBpZiAoZnJpY3Rpb25Qb3dlciAhPT0gbnVsbCAmJiBmcmljdGlvblBvd2VyID4gNTAwKSB0aGVybWFsU2NvcmUgKz0gMTsNCg0KICAgICAgICBsZXQgdGhlcm1hbFJpc2sgPSAnTG93JzsNCiAgICAgICAgaWYgKHRoZXJtYWxTY29yZSA+PSA1KSB0aGVybWFsUmlzayA9ICdIaWdoJzsNCiAgICAgICAgZWxzZSBpZiAodGhlcm1hbFNjb3JlID49IDMpIHRoZXJtYWxSaXNrID0gJ01vZGVyYXRlJzsNCg0KICAgICAgICBsZXQgc2VydmljZUxpZmUgPSAnRmF2b3JhYmxlJzsNCiAgICAgICAgaWYgKHdlYXJSaXNrID09PSAnSGlnaCcgfHwgdGhlcm1hbFJpc2sgPT09ICdIaWdoJykgc2VydmljZUxpZmUgPSAnUmVkdWNlZCBMaWZlIEV4cGVjdGVkJzsNCiAgICAgICAgZWxzZSBpZiAod2VhclJpc2sgPT09ICdNb2RlcmF0ZScgfHwgdGhlcm1hbFJpc2sgPT09ICdNb2RlcmF0ZScpIHNlcnZpY2VMaWZlID0gJ01vbml0b3InOw0KDQogICAgICAgIGxldCBvcGVyYXRpbmdTdGF0dXMgPSAnQWNjZXB0YWJsZSc7DQogICAgICAgIGlmICh3ZWFyUmlzayA9PT0gJ0hpZ2gnIHx8IHRoZXJtYWxSaXNrID09PSAnSGlnaCcgfHwgc3BlZWRVdGlsID4gMTAwKSB7DQogICAgICAgICAgICBvcGVyYXRpbmdTdGF0dXMgPSAnUmV2aWV3IFJlcXVpcmVkJzsNCiAgICAgICAgfSBlbHNlIGlmICh3ZWFyUmlzayA9PT0gJ01vZGVyYXRlJyB8fCBzcGVlZFV0aWwgPj0gODApIHsNCiAgICAgICAgICAgIG9wZXJhdGluZ1N0YXR1cyA9ICdDYXV0aW9uJzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChzcGVlZFV0aWwgPiAxMDApIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgICAgICAgIHR5cGU6ICdkYW5nZXInLA0KICAgICAgICAgICAgICAgIHRleHQ6ICdBY3R1YWwgc3VyZmFjZSBzcGVlZCBleGNlZWRzIHRoZSBhbGxvd2FibGUgbGltaXQuIFJlZHVjZSBzcGVlZCBvciBzZWxlY3QgYSBoaWdoZXItc3BlZWQgc2VhbCBtYXRlcmlhbC4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocHZVdGlsICE9PSBudWxsICYmIHB2VXRpbCA+IDEwMCkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgdHlwZTogJ2RhbmdlcicsDQogICAgICAgICAgICAgICAgdGV4dDogJ0NhbGN1bGF0ZWQgUFYgZXhjZWVkcyB0aGUgYWxsb3dhYmxlIFBWIGxpbWl0LiBWZXJpZnkgd2l0aCBtYW51ZmFjdHVyZXIgZGF0YS4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZWxzLmx1YnJpY2F0aW9uLnZhbHVlID09PSAnZHJ5JyAmJiBzdXJmYWNlU3BlZWQgPiAwLjUpIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgICAgICAgIHR5cGU6ICdkYW5nZXInLA0KICAgICAgICAgICAgICAgIHRleHQ6ICdEcnkgcnVubmluZyBhdCBlbGV2YXRlZCBzdXJmYWNlIHNwZWVkIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHdlYXIgYW5kIHRoZXJtYWwgcmlzay4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGVtcEMgPiBtYXQubWF4VGVtcCkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgdHlwZTogJ2RhbmdlcicsDQogICAgICAgICAgICAgICAgdGV4dDogJ09wZXJhdGluZyB0ZW1wZXJhdHVyZSBleGNlZWRzIHR5cGljYWwgY29udGludW91cyBsaW1pdCBmb3IgJyArIGVscy5tYXRlcmlhbC52YWx1ZSArICcgKCcgKyBtYXQubWF4VGVtcCArICcgXHUwMEIwQykuJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0gZWxzZSBpZiAodGVtcFJhdGlvID4gMC44NSkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLA0KICAgICAgICAgICAgICAgIHRleHQ6ICdPcGVyYXRpbmcgdGVtcGVyYXR1cmUgaXMgYXBwcm9hY2hpbmcgdGhlIG1hdGVyaWFsIHRlbXBlcmF0dXJlIGxpbWl0LicNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIGlmIChzcGVlZFV0aWwgPj0gODAgJiYgc3BlZWRVdGlsIDw9IDEwMCkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLA0KICAgICAgICAgICAgICAgIHRleHQ6ICdTcGVlZCB1dGlsaXphdGlvbiBpcyBhcHByb2FjaGluZyB0aGUgcmVjb21tZW5kZWQgbGltaXQuJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdmFsaWQsDQogICAgICAgICAgICB3YXJuaW5ncywNCiAgICAgICAgICAgIHJlc3VsdHM6IHsNCiAgICAgICAgICAgICAgICBzdXJmYWNlU3BlZWQsDQogICAgICAgICAgICAgICAgYXZnU3BlZWQsDQogICAgICAgICAgICAgICAgcGVha1NwZWVkLA0KICAgICAgICAgICAgICAgIGFsbG93U3BlZWRNcHMsDQogICAgICAgICAgICAgICAgc3BlZWRVdGlsLA0KICAgICAgICAgICAgICAgIHByZXNzdXJlTXBhLA0KICAgICAgICAgICAgICAgIHB2VmFsdWUsDQogICAgICAgICAgICAgICAgcHZMaW1pdE1ldHJpYywNCiAgICAgICAgICAgICAgICBwdlV0aWwsDQogICAgICAgICAgICAgICAgd2VhckluZGV4LA0KICAgICAgICAgICAgICAgIHNsaWRpbmdEaXN0YW5jZSwNCiAgICAgICAgICAgICAgICBmcmljdGlvblBvd2VyLA0KICAgICAgICAgICAgICAgIHdlYXJSaXNrLA0KICAgICAgICAgICAgICAgIHRoZXJtYWxSaXNrLA0KICAgICAgICAgICAgICAgIHRoZXJtYWxTY29yZSwNCiAgICAgICAgICAgICAgICBzZXJ2aWNlTGlmZSwNCiAgICAgICAgICAgICAgICBvcGVyYXRpbmdTdGF0dXMsDQogICAgICAgICAgICAgICAgdGVtcEMsDQogICAgICAgICAgICAgICAgbWF0LA0KICAgICAgICAgICAgICAgIG1vdGlvbiwNCiAgICAgICAgICAgICAgICBpc1JlY2lwOiBtb3Rpb24gPT09ICdyZWNpcHJvY2F0aW5nJyB8fCBtb3Rpb24gPT09ICdvc2NpbGxhdGluZycNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByaXNrQ2xhc3MobGV2ZWwpIHsNCiAgICAgICAgaWYgKGxldmVsID09PSAnTG93JyB8fCBsZXZlbCA9PT0gJ0FjY2VwdGFibGUnIHx8IGxldmVsID09PSAnRmF2b3JhYmxlJykgcmV0dXJuICdzc3djLXJpc2stbG93JzsNCiAgICAgICAgaWYgKGxldmVsID09PSAnTW9kZXJhdGUnIHx8IGxldmVsID09PSAnQ2F1dGlvbicgfHwgbGV2ZWwgPT09ICdNb25pdG9yJykgcmV0dXJuICdzc3djLXJpc2stbW9kZXJhdGUnOw0KICAgICAgICByZXR1cm4gJ3Nzd2Mtcmlzay1oaWdoJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzdGF0dXNCYW5uZXJDbGFzcyhzdGF0dXMpIHsNCiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ0FjY2VwdGFibGUnKSByZXR1cm4gJ3Nzd2Mtc3RhdHVzLWFjY2VwdGFibGUnOw0KICAgICAgICBpZiAoc3RhdHVzID09PSAnQ2F1dGlvbicpIHJldHVybiAnc3N3Yy1zdGF0dXMtY2F1dGlvbic7DQogICAgICAgIHJldHVybiAnc3N3Yy1zdGF0dXMtcmV2aWV3JzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzdGF0dXNJY29uKHN0YXR1cykgew0KICAgICAgICBpZiAoc3RhdHVzID09PSAnQWNjZXB0YWJsZScpIHJldHVybiAnXHUyNzEzJzsNCiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ0NhdXRpb24nKSByZXR1cm4gJyEnOw0KICAgICAgICByZXR1cm4gJ1x1MjcxNyc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheVdhcm5pbmdzKHdhcm5pbmdzKSB7DQogICAgICAgIGlmICghZWxzLndhcm5pbmdzKSByZXR1cm47DQogICAgICAgIGVscy53YXJuaW5ncy5pbm5lckhUTUwgPSAnJzsNCiAgICAgICAgd2FybmluZ3MuZm9yRWFjaCh3ID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdzc3djLXdhcm5pbmctaXRlbScgKyAody50eXBlID09PSAnZGFuZ2VyJyA/ICcgc3N3Yy13YXJuaW5nLWRhbmdlcicgOiAnJyk7DQogICAgICAgICAgICBkaXYudGV4dENvbnRlbnQgPSB3LnRleHQ7DQogICAgICAgICAgICBlbHMud2FybmluZ3MuYXBwZW5kQ2hpbGQoZGl2KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd1NlY3Rpb24oc2VjdGlvbikgew0KICAgICAgICBpZiAoIXNlY3Rpb24pIHJldHVybjsNCiAgICAgICAgc2VjdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdzc3djLWhpZGRlbicpOw0KICAgICAgICBzZWN0aW9uLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zc3djLWhpZGRlbicpOw0KICAgICAgICBzZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlU2VjdGlvbihzZWN0aW9uKSB7DQogICAgICAgIGlmICghc2VjdGlvbikgcmV0dXJuOw0KICAgICAgICBzZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ3Nzd2MtaGlkZGVuJyk7DQogICAgICAgIHNlY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLXNzd2MtaGlkZGVuJywgJ3RydWUnKTsNCiAgICAgICAgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRpc3BsYXlSZXN1bHRzKGRhdGEpIHsNCiAgICAgICAgZGlzcGxheVdhcm5pbmdzKGRhdGEud2FybmluZ3MpOw0KDQogICAgICAgIGlmICghZGF0YS52YWxpZCB8fCAhZGF0YS5yZXN1bHRzKSB7DQogICAgICAgICAgICBoaWRlU2VjdGlvbihlbHMucmVzdWx0c1NlY3Rpb24pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgciA9IGRhdGEucmVzdWx0czsNCiAgICAgICAgdXBkYXRlTW90aW9uVmlzaWJpbGl0eSgpOw0KICAgICAgICBzaG93U2VjdGlvbihlbHMucmVzdWx0c1NlY3Rpb24pOw0KDQogICAgICAgIHNldFRleHQoZWxzLnJlc3VsdFN1cmZhY2VTcGVlZCwgZm9ybWF0U3BlZWQoci5zdXJmYWNlU3BlZWQpKTsNCiAgICAgICAgc2V0VGV4dChlbHMucmVzdWx0QXZnU3BlZWQsIGZvcm1hdFNwZWVkKHIuYXZnU3BlZWQpKTsNCiAgICAgICAgc2V0VGV4dChlbHMucmVzdWx0UGVha1NwZWVkLCBmb3JtYXRTcGVlZChyLnBlYWtTcGVlZCkpOw0KICAgICAgICBzZXRUZXh0KGVscy5yZXN1bHRBbGxvd1NwZWVkLCBmb3JtYXRTcGVlZChyLmFsbG93U3BlZWRNcHMpKTsNCiAgICAgICAgc2V0VGV4dChlbHMucmVzdWx0U3BlZWRVdGlsLCByLnNwZWVkVXRpbC50b0ZpeGVkKDEpICsgJyUnKTsNCiAgICAgICAgc2V0Q2xhc3MoZWxzLnJlc3VsdFNwZWVkVXRpbCwgJ3Nzd2MtcmVzdWx0LXZhbHVlIHNzd2Mtb3V0LXNwZWVkLXV0aWwgJyArDQogICAgICAgICAgICAoci5zcGVlZFV0aWwgPiAxMDAgPyAnc3N3Yy1yaXNrLWhpZ2gnIDogci5zcGVlZFV0aWwgPj0gODAgPyAnc3N3Yy1yaXNrLW1vZGVyYXRlJyA6ICdzc3djLXJpc2stbG93JykpOw0KDQogICAgICAgIGlmICh1bml0U3lzdGVtID09PSAnbWV0cmljJykgew0KICAgICAgICAgICAgc2V0VGV4dChlbHMucmVzdWx0UFYsIHIucHZWYWx1ZS50b0ZpeGVkKDQpICsgJyBNUGFcdTAwQjdtL3MnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHNldFRleHQoZWxzLnJlc3VsdFBWLCAoci5wcmVzc3VyZU1wYSAqIE1QQV9UT19QU0kpLnRvRml4ZWQoMikgKyAnIHBzaSBcdTAwRDcgJyArDQogICAgICAgICAgICAgICAgZnJvbU1ldHJpY1NwZWVkKHIuc3VyZmFjZVNwZWVkKS50b0ZpeGVkKDEpICsgJyBmdC9taW4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLnB2VXRpbCAhPT0gbnVsbCkgew0KICAgICAgICAgICAgc2V0VGV4dChlbHMucmVzdWx0UFZVdGlsLCByLnB2VXRpbC50b0ZpeGVkKDEpICsgJyUnKTsNCiAgICAgICAgICAgIHNldENsYXNzKGVscy5yZXN1bHRQVlV0aWwsICdzc3djLXJlc3VsdC12YWx1ZSBzc3djLW91dC1wdi11dGlsICcgKw0KICAgICAgICAgICAgICAgIChyLnB2VXRpbCA+IDEwMCA/ICdzc3djLXJpc2staGlnaCcgOiByLnB2VXRpbCA+PSA4MCA/ICdzc3djLXJpc2stbW9kZXJhdGUnIDogJ3Nzd2Mtcmlzay1sb3cnKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBzZXRUZXh0KGVscy5yZXN1bHRQVlV0aWwsICdOL0EnKTsNCiAgICAgICAgICAgIHNldENsYXNzKGVscy5yZXN1bHRQVlV0aWwsICdzc3djLXJlc3VsdC12YWx1ZSBzc3djLW91dC1wdi11dGlsJyk7DQogICAgICAgIH0NCg0KICAgICAgICBzZXRUZXh0KGVscy5yZXN1bHREaXN0YW5jZSwgci5zbGlkaW5nRGlzdGFuY2UgIT09IG51bGwgPw0KICAgICAgICAgICAgZm9ybWF0RGlzdGFuY2Uoci5zbGlkaW5nRGlzdGFuY2UpIDogJ04vQSAoZW50ZXIgdGltZSBvciBjeWNsZXMpJyk7DQogICAgICAgIHNldFRleHQoZWxzLnJlc3VsdEZyaWN0aW9uUG93ZXIsIHIuZnJpY3Rpb25Qb3dlciAhPT0gbnVsbCA/DQogICAgICAgICAgICBmb3JtYXRQb3dlcihyLmZyaWN0aW9uUG93ZXIpIDogJ04vQSAoZW50ZXIgXHUwM0JDIGFuZCBub3JtYWwgZm9yY2UpJyk7DQogICAgICAgIHNldFRleHQoZWxzLnJlc3VsdFdlYXJJbmRleCwgci53ZWFySW5kZXgudG9GaXhlZCgyKSk7DQogICAgICAgIHNldFRleHQoZWxzLnJlc3VsdFdlYXJSaXNrLCByLndlYXJSaXNrKTsNCiAgICAgICAgc2V0Q2xhc3MoZWxzLnJlc3VsdFdlYXJSaXNrLCAnc3N3Yy1yZXN1bHQtdmFsdWUgc3N3Yy1vdXQtd2Vhci1yaXNrICcgKyByaXNrQ2xhc3Moci53ZWFyUmlzaykpOw0KICAgICAgICBzZXRUZXh0KGVscy5yZXN1bHRUaGVybWFsUmlzaywgci50aGVybWFsUmlzayk7DQogICAgICAgIHNldENsYXNzKGVscy5yZXN1bHRUaGVybWFsUmlzaywgJ3Nzd2MtcmVzdWx0LXZhbHVlIHNzd2Mtb3V0LXRoZXJtYWwtcmlzayAnICsgcmlza0NsYXNzKHIudGhlcm1hbFJpc2spKTsNCiAgICAgICAgc2V0VGV4dChlbHMucmVzdWx0U2VydmljZUxpZmUsIHIuc2VydmljZUxpZmUpOw0KICAgICAgICBzZXRDbGFzcyhlbHMucmVzdWx0U2VydmljZUxpZmUsICdzc3djLXJlc3VsdC12YWx1ZSBzc3djLW91dC1zZXJ2aWNlLWxpZmUgJyArIHJpc2tDbGFzcyhyLnNlcnZpY2VMaWZlKSk7DQogICAgICAgIHNldFRleHQoZWxzLnJlc3VsdE9wZXJhdGluZ1N0YXR1cywgci5vcGVyYXRpbmdTdGF0dXMpOw0KICAgICAgICBzZXRDbGFzcyhlbHMucmVzdWx0T3BlcmF0aW5nU3RhdHVzLCAnc3N3Yy1yZXN1bHQtdmFsdWUgc3N3Yy1vdXQtb3BlcmF0aW5nLXN0YXR1cyAnICsgcmlza0NsYXNzKHIub3BlcmF0aW5nU3RhdHVzKSk7DQoNCiAgICAgICAgaWYgKGVscy5zdGF0dXNCYW5uZXIpIHsNCiAgICAgICAgICAgIGVscy5zdGF0dXNCYW5uZXIuY2xhc3NOYW1lID0gJ3Nzd2Mtc3RhdHVzLWJhbm5lciAnICsgc3RhdHVzQmFubmVyQ2xhc3Moci5vcGVyYXRpbmdTdGF0dXMpOw0KICAgICAgICB9DQogICAgICAgIHNldFRleHQoZWxzLnN0YXR1c0ljb24sIHN0YXR1c0ljb24oci5vcGVyYXRpbmdTdGF0dXMpKTsNCiAgICAgICAgc2V0VGV4dChlbHMuc3RhdHVzVGl0bGUsICdTZWFsIE9wZXJhdGluZyBTdGF0dXM6ICcgKyByLm9wZXJhdGluZ1N0YXR1cyk7DQogICAgICAgIHNldFRleHQoZWxzLnN0YXR1c1N1Yiwgci53ZWFyUmlzayArICcgd2VhciByaXNrIHwgJyArIHIudGhlcm1hbFJpc2sgKw0KICAgICAgICAgICAgJyB0aGVybWFsIHJpc2sgfCBTZXJ2aWNlIGxpZmU6ICcgKyByLnNlcnZpY2VMaWZlKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7DQogICAgICAgIGRpc3BsYXlSZXN1bHRzKHZhbGlkYXRlSW5wdXRzKCkpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7DQogICAgICAgIGVscy51bml0UmFkaW9zLmZvckVhY2gocmFkaW8gPT4gew0KICAgICAgICAgICAgcmFkaW8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U3lzdGVtID0gdGhpcy52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgY29udmVydElucHV0c09uVW5pdENoYW5nZSh1bml0U3lzdGVtLCBuZXdTeXN0ZW0pOw0KICAgICAgICAgICAgICAgICAgICB1bml0U3lzdGVtID0gbmV3U3lzdGVtOw0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVVbml0TGFiZWxzKCk7DQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hdGVyaWFsRGVmYXVsdHMoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZWxzLm1vdGlvblR5cGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdXBkYXRlTW90aW9uVmlzaWJpbGl0eSgpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBlbHMubWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgYWxsb3dTcGVlZE1hbnVhbCA9IGZhbHNlOw0KICAgICAgICAgICAgYWxsb3dQVk1hbnVhbCA9IGZhbHNlOw0KICAgICAgICAgICAgdXBkYXRlTWF0ZXJpYWxEZWZhdWx0cygpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBlbHMuYWxsb3dTcGVlZC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGFsbG93U3BlZWRNYW51YWwgPSB0cnVlOw0KICAgICAgICB9KTsNCg0KICAgICAgICBlbHMuYWxsb3dQVi5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGFsbG93UFZNYW51YWwgPSBlbHMuYWxsb3dQVi52YWx1ZSAhPT0gJyc7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5jYWxjdWxhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjYWxjdWxhdGUpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGluaXQoKSB7DQogICAgICAgIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChST09UX0lEKTsNCiAgICAgICAgaWYgKCFyb290KSByZXR1cm47DQogICAgICAgIGJpbmRFbGVtZW50cygpOw0KICAgICAgICBiaW5kRXZlbnRzKCk7DQogICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICAgICAgdXBkYXRlTW90aW9uVmlzaWJpbGl0eSgpOw0KICAgICAgICB1cGRhdGVNYXRlcmlhbERlZmF1bHRzKCk7DQogICAgfQ0KDQogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgew0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaW5pdCgpOw0KICAgIH0NCn0pKCk7DQo=
Parâmetros de entrada
General Settings
Parâmetros de movimento
milímetros
rpm
milímetros
°
EM
Seal & Operating Conditions
°C
Allowable Limits & Optional Inputs
EM
MPa·m/s
—
N
hours
cycles
Resultados do cálculo
—
Seal Operating Status
Enter values and calculate
Surface Speed
—
Average Sliding Speed
—
Peak Sliding Speed
—
Allowable Surface Speed
—
Speed Utilization
—
PV Value
—
PV Utilization
—
Total Sliding Distance
—
Estimated Friction Power
—
Wear Index
—
Wear Risk Level
—
Thermal Risk
—
Service Life Indicator
—
Seal Operating Status
—