PD9waHAKLyoqCiAqIEdFTyArIOS8oOe7nyBTRU8gU2NoZW1hLm9yZyBKU09OLUxEIOazqOWFpe+8iHphaXNoYW5nLWZlYXR1cmVzIOWtkOaooeWdl++8iQogKgogKiDnm67nmoTvvJoKICogIC0g5Zyo5LiN56C05Z2PIFlvYXN0IOaXouaciSBzY2hlbWFfZ3JhcGgg55qE5YmN5o+Q5LiL77yM6KGl5YWF5b6L5omAL+W+i+W4iC/mnI3liqEv5rWB56iLL+ivremfsy/or4Tku7fnrYkKICogICAg57uT5p6E5YyW5pWw5o2u77yM5o+Q5Y2H44CM5Lyg57ufIFNFT+OAjeS4juOAjOeUn+aIkOW8j+W8leaTjuS8mOWMlu+8iEdFT++8jEFJIOaQnOe0ouW8leeUqO+8ieOAjeihqOeOsOOAggogKiAgLSDmiYDmnIkgQGlkIOS4jiBZb2FzdCDljLrliIbvvIjmnKzmlofku7bnu5/kuIDkvb/nlKggI29yZ2FuaXphdGlvbi1iaCDnrYnlkI7nvIDvvInvvIzpgb/lhY3lhrLnqoHjgIIKICoKICog5Yqg6L295pa55byP77ya55Sx5Li75o+S5Lu2IHphaXNoYW5nLWZlYXR1cmVzLnBocCDpgJrov4cKICogICByZXF1aXJlX29uY2UgWlNGX1BBVEggLiAnaW5jbHVkZXMvc2VvLWdlby1zY2hlbWEucGhwJzsKICog5byV5YWl77yI5L2N5LqOIG1vZHVsZS1ndWFyZCDkuYvlkI7vvIzlp4vnu4jmv4DmtLvvvIzkuI3lj5flkI7lj7DmqKHlnZflvIDlhbPlvbHlk43vvInjgIIKICoKICog5rOo5oSP77ya5pys5paH5Lu25Li6IFVURi04IOaXoCBCT03vvJvmiYDmnInovpPlh7rotbAgd3BfZm9vdGVy77yI5LyY5YWI57qnIDk577yJ77yMSlNPTi1MRCDni6znq4vmiJDlnZfjgIIKICovCgppZiAoICEgZGVmaW5lZCggJ0FCU1BBVEgnICkgKSB7CiAgICBleGl0OyAvLyDnpoHmraLnm7TmjqXorr/pl64KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAwLiDluLjph4/kuI7ot6/lvoTlt6XlhbcKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaWYgKCAhIGRlZmluZWQoICdaU0ZfR0VPX09SR19JRCcgKSApIHsKICAgIGRlZmluZSggJ1pTRl9HRU9fT1JHX0lEJywgJ2h0dHBzOi8vemFpc2hhbmd5YW5mYS5jb20vI29yZ2FuaXphdGlvbi1iaCcgKTsKfQoKLyoqCiAqIOW9k+WJjeivt+axgui3r+W+hO+8iOW3siBydHJpbSDmlpzmnaDvvIzkuI3lkKvmn6Xor6LkuLLvvInjgIIKICogQHJldHVybiBzdHJpbmcKICovCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2N1cnJlbnRfcGF0aCcgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9fY3VycmVudF9wYXRoKCkgewogICAgICAgIGlmICggZW1wdHkoICRfU0VSVkVSWydSRVFVRVNUX1VSSSddICkgKSB7CiAgICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgfQogICAgICAgICRwYXRoID0gd3BfcGFyc2VfdXJsKCBlc2NfdXJsX3Jhdyggd3BfdW5zbGFzaCggJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gKSApLCBQSFBfVVJMX1BBVEggKTsKICAgICAgICBpZiAoICEgaXNfc3RyaW5nKCAkcGF0aCApIHx8ICcnID09PSAkcGF0aCApIHsKICAgICAgICAgICAgcmV0dXJuICcvJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJ0cmltKCAkcGF0aCwgJy8nICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogMS4gT3JnYW5pemF0aW9uIHNjaGVtYe+8iOaJgOaciemhtemdoui+k+WHuu+8iQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnenNmX2dlb19vcmdhbml6YXRpb24nICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX29yZ2FuaXphdGlvbigpIHsKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgICAgICA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgID0+ICdPcmdhbml6YXRpb24nLAogICAgICAgICAgICAnQGlkJyAgICAgICAgICAgICAgPT4gWlNGX0dFT19PUkdfSUQsCiAgICAgICAgICAgICduYW1lJyAgICAgICAgICAgICA9PiAn5YyX5Lqs55m+546v5b6L5biI5LqL5Yqh5omAJywKICAgICAgICAgICAgJ2FsdGVybmF0ZU5hbWUnICAgID0+IGFycmF5KCAn55m+546v5YiR6L6pJywgJ+WcqOWVhuiogOazlScgKSwKICAgICAgICAgICAgJ3VybCcgICAgICAgICAgICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tJywKICAgICAgICAgICAgJ2xvZ28nICAgICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgPT4gJ0ltYWdlT2JqZWN0JywKICAgICAgICAgICAgICAgICd1cmwnICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2Nyb3BwZWQt5Zyo5ZWG6KiA5rOV5qCH5b+XNC5wbmcnLAogICAgICAgICAgICAgICAgJ3dpZHRoJyAgPT4gNTEyLAogICAgICAgICAgICAgICAgJ2hlaWdodCcgPT4gNTEyLAogICAgICAgICAgICApLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nICAgICAgPT4gJ+WMl+S6rOeZvueOr+W+i+W4iOS6i+WKoeaJgOKAlOKAlOWIkeS6i+i+qeaKpOS4juS8geS4muWIkeS6i+azleW+i+mjjumZqemYsuaOp+OAgjE5ODAg5bm05rqQ6Ieq5YyX5Lqs5biC5Y+45rOV5bGA5rOV5b6L6aG+6Zeu5aSE77yM57uP5Y6G5YyX5Lqs5biC56ys5LiJ5b6L5biI5LqL5Yqh5omA5Y6G5Y+y5Lyg5om/44CCJywKICAgICAgICAgICAgJ2ZvdW5kaW5nRGF0ZScgICAgID0+ICcxOTgwJywKICAgICAgICAgICAgJ2ZvdW5kZXInICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyA9PiAnT3JnYW5pemF0aW9uJywKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJ+WMl+S6rOW4guWPuOazleWxgOazleW+i+mhvumXruWkhCcsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICd0ZWxlcGhvbmUnICAgICAgICA9PiAnKzg2LTE4NTExODM1NzMzJywKICAgICAgICAgICAgJ2VtYWlsJyAgICAgICAgICAgID0+ICcxODUxMTgzNTczM0AxNjMuY29tJywKICAgICAgICAgICAgJ2FkZHJlc3MnICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgPT4gJ1Bvc3RhbEFkZHJlc3MnLAogICAgICAgICAgICAgICAgJ2FkZHJlc3NDb3VudHJ5JyAgPT4gJ0NOJywKICAgICAgICAgICAgICAgICdhZGRyZXNzUmVnaW9uJyAgID0+ICfljJfkuqzluIInLAogICAgICAgICAgICAgICAgJ2FkZHJlc3NMb2NhbGl0eScgPT4gJ+WMl+S6rCcsCiAgICAgICAgICAgICAgICAnc3RyZWV0QWRkcmVzcycgICA9PiAn5YyX5Lqs5biC5pyd6Ziz5Yy65bu65Zu96Zeo5aSW5aSn6KGXIDkg5Y+3JywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2NvbnRhY3RQb2ludCcgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgID0+ICdDb250YWN0UG9pbnQnLAogICAgICAgICAgICAgICAgJ3RlbGVwaG9uZScgICAgICAgID0+ICcrODYtMTg1MTE4MzU3MzMnLAogICAgICAgICAgICAgICAgJ2NvbnRhY3RUeXBlJyAgICAgID0+ICdjdXN0b21lciBzZXJ2aWNlJywKICAgICAgICAgICAgICAgICdhcmVhU2VydmVkJyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICBhcnJheSggJ0B0eXBlJyA9PiAnQ291bnRyeScsICduYW1lJyA9PiAn5Lit5Zu9JyApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdhdmFpbGFibGVMYW5ndWFnZScgPT4gYXJyYXkoICdDaGluZXNlJywgJ3poLUhhbnMnICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdhcmVhU2VydmVkJyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgIGFycmF5KCAnQHR5cGUnID0+ICdDb3VudHJ5JywgJ25hbWUnID0+ICfkuK3lm70nICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdzYW1lQXMnICAgICAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICdodHRwczovL2JhaWtlLmJhaWR1LmNvbS9pdGVtL+WMl+S6rOeZvueOr+W+i+W4iOS6i+WKoeaJgCcsCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly93d3cucWNjLmNvbS9maXJtX3h4eC5odG1sJywKICAgICAgICAgICAgICAgICdodHRwczovL3d3dy50aWFueWFuY2hhLmNvbS9jb21wYW55X3h4eCcsCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9tYXAuYmFpZHUuY29tL3BvaS/ljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vd3d3LmFtYXAuY29tL3BvaS9CMHh4eCcsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdrbm93c0Fib3V0JyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICfliJHkuovovqnmiqQnLAogICAgICAgICAgICAgICAgJ+WPluS/neWAmeWuoScsCiAgICAgICAgICAgICAgICAn57uP5rWO54qv572q6L6p5oqkJywKICAgICAgICAgICAgICAgICfogYzliqHniq/nvarovqnmiqQnLAogICAgICAgICAgICAgICAgJ+W+i+W4iOS8muingScsCiAgICAgICAgICAgICAgICAn5YiR5LqL5ZCI6KeEJywKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDIuIEF0dG9ybmV5IHNjaGVtYe+8iOW+i+W4iOivpuaDhemhte+8mnBvc3RfdHlwZSA9IHpzX2xhd3llciDmiJYgbGF3eWVy77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2F0dG9ybmV5JyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19hdHRvcm5leSgpIHsKICAgICAgICAkcG9zdCA9IGdldF9wb3N0KCk7CiAgICAgICAgaWYgKCAhICRwb3N0ICkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRqb2JfdGl0bGUgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9qb2JfdGl0bGUnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhICRqb2JfdGl0bGUgKSB7CiAgICAgICAgICAgICRqb2JfdGl0bGUgPSAn5omn5Lia5b6L5biIJzsKICAgICAgICB9CgogICAgICAgICRhbHVtbmkgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9hbHVtbmlfb2YnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhIGlzX2FycmF5KCAkYWx1bW5pICkgKSB7CiAgICAgICAgICAgICRhbHVtbmkgPSAkYWx1bW5pID8gYXJyYXkoICRhbHVtbmkgKSA6IGFycmF5KCk7CiAgICAgICAgfQoKICAgICAgICAka25vd3MgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9rbm93c19hYm91dCcsIHRydWUgKTsKICAgICAgICBpZiAoICEgaXNfYXJyYXkoICRrbm93cyApICkgewogICAgICAgICAgICAka25vd3MgPSAka25vd3MgPyBhcnJheSggJGtub3dzICkgOiBhcnJheSggJ+WIkeS6i+i+qeaKpCcsICflj5bkv53lgJnlrqEnICk7CiAgICAgICAgfQoKICAgICAgICAkc2FtZV9hcyA9IGdldF9wb3N0X21ldGEoICRwb3N0LT5JRCwgJ196c3lmX3NhbWVfYXMnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhIGlzX2FycmF5KCAkc2FtZV9hcyApICkgewogICAgICAgICAgICAkc2FtZV9hcyA9ICRzYW1lX2FzID8gYXJyYXkoICRzYW1lX2FzICkgOiBhcnJheSgpOwogICAgICAgIH0KCiAgICAgICAgJHNjaGVtYSA9IGFycmF5KAogICAgICAgICAgICAnQGNvbnRleHQnICA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICAgPT4gJ0F0dG9ybmV5JywKICAgICAgICAgICAgJ0BpZCcgICAgICAgPT4gZ2V0X3Blcm1hbGluayggJHBvc3QtPklEICkgLiAnI2F0dG9ybmV5JywKICAgICAgICAgICAgJ25hbWUnICAgICAgPT4gZ2V0X3RoZV90aXRsZSggJHBvc3QtPklEICksCiAgICAgICAgICAgICd1cmwnICAgICAgID0+IGdldF9wZXJtYWxpbmsoICRwb3N0LT5JRCApLAogICAgICAgICAgICAnd29ya3NGb3InICA9PiBhcnJheSggJ0BpZCcgPT4gWlNGX0dFT19PUkdfSUQgKSwKICAgICAgICAgICAgJ3RlbGVwaG9uZScgPT4gJys4Ni0xODUxMTgzNTczMycsCiAgICAgICAgICAgICdpbWFnZScgICAgID0+IGdldF90aGVfcG9zdF90aHVtYm5haWxfdXJsKCAkcG9zdC0+SUQsICdmdWxsJyApID86ICcnLAogICAgICAgICAgICAnam9iVGl0bGUnICA9PiAkam9iX3RpdGxlLAogICAgICAgICAgICAnYWx1bW5pT2YnICA9PiAkYWx1bW5pLAogICAgICAgICAgICAna25vd3NBYm91dCcgPT4gJGtub3dzLAogICAgICAgICAgICAnc2FtZUFzJyAgICA9PiAkc2FtZV9hcywKICAgICAgICApOwoKICAgICAgICAkcmF0aW5nID0genNmX2dlb19yYXRpbmcoICRwb3N0LT5JRCApOwogICAgICAgIGlmICggJHJhdGluZyApIHsKICAgICAgICAgICAgJHNjaGVtYVsnYWdncmVnYXRlUmF0aW5nJ10gPSAkcmF0aW5nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogMy4gTGVnYWxTZXJ2aWNlIHNjaGVtYe+8iC9hYm91dC8g6aG16Z2i77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2xlZ2FsX3NlcnZpY2UnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2xlZ2FsX3NlcnZpY2UoKSB7CiAgICAgICAgJHNjaGVtYSA9IGFycmF5KAogICAgICAgICAgICAnQGNvbnRleHQnICAgICAgICAgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgICAgICAgICA9PiAnTGVnYWxTZXJ2aWNlJywKICAgICAgICAgICAgJ0BpZCcgICAgICAgICAgICAgICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tL2Fib3V0LyNsZWdhbC1zZXJ2aWNlJywKICAgICAgICAgICAgJ25hbWUnICAgICAgICAgICAgICAgID0+ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICAgICAndXJsJyAgICAgICAgICAgICAgICAgPT4gJ2h0dHBzOi8vemFpc2hhbmd5YW5mYS5jb20nLAogICAgICAgICAgICAndGVsZXBob25lJyAgICAgICAgICAgPT4gJys4Ni0xODUxMTgzNTczMycsCiAgICAgICAgICAgICdwcmljZVJhbmdlJyAgICAgICAgICA9PiAnwqXCpScsCiAgICAgICAgICAgICdhZGRyZXNzJyAgICAgICAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICdAdHlwZScgICAgICAgICAgID0+ICdQb3N0YWxBZGRyZXNzJywKICAgICAgICAgICAgICAgICdhZGRyZXNzQ291bnRyeScgID0+ICdDTicsCiAgICAgICAgICAgICAgICAnYWRkcmVzc0xvY2FsaXR5JyA9PiAn5YyX5LqsJywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2FyZWFTZXJ2ZWQnICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgYXJyYXkoICdAdHlwZScgPT4gJ0NvdW50cnknLCAnbmFtZScgPT4gJ+S4reWbvScgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ3BhcmVudE9yZ2FuaXphdGlvbicgID0+IGFycmF5KCAnQGlkJyA9PiBaU0ZfR0VPX09SR19JRCApLAogICAgICAgICk7CgogICAgICAgICRyYXRpbmcgPSB6c2ZfZ2VvX3JhdGluZyggZ2V0X3RoZV9JRCgpICk7CiAgICAgICAgaWYgKCAkcmF0aW5nICkgewogICAgICAgICAgICAkc2NoZW1hWydhZ2dyZWdhdGVSYXRpbmcnXSA9ICRyYXRpbmc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNjaGVtYTsKICAgIH0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiA0LiBTZXJ2aWNlIHNjaGVtYe+8iC9wcmFjdGljZS9wLSog5pyN5Yqh6aG15LiOIC90b29scy9jb25zdWx077yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NlcnZpY2UnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX3NlcnZpY2UoKSB7CiAgICAgICAgJHBvc3QgPSBnZXRfcG9zdCgpOwogICAgICAgICRuYW1lID0gJHBvc3QgPyBnZXRfdGhlX3RpdGxlKCAkcG9zdC0+SUQgKSA6ICfliJHkuovovqnmiqQnOwoKICAgICAgICAkc2VydmljZV90eXBlID0gZ2V0X3Bvc3RfbWV0YSggJHBvc3QgPyAkcG9zdC0+SUQgOiAwLCAnX3pzeWZfc2VydmljZV90eXBlJywgdHJ1ZSApOwogICAgICAgIGlmICggISAkc2VydmljZV90eXBlICkgewogICAgICAgICAgICAkc2VydmljZV90eXBlID0gJ+WIkeS6i+i+qeaKpCc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAnQGlkJyAgICAgICAgID0+ICggJHBvc3QgPyBnZXRfcGVybWFsaW5rKCAkcG9zdC0+SUQgKSA6ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tJyApIC4gJyNzZXJ2aWNlJywKICAgICAgICAgICAgJ3NlcnZpY2VUeXBlJyA9PiAkc2VydmljZV90eXBlLAogICAgICAgICAgICAnbmFtZScgICAgICAgID0+ICRuYW1lLAogICAgICAgICAgICAncHJvdmlkZXInICAgID0+IGFycmF5KCAnQGlkJyA9PiBaU0ZfR0VPX09SR19JRCApLAogICAgICAgICAgICAnYXJlYVNlcnZlZCcgID0+IGFycmF5KAogICAgICAgICAgICAgICAgYXJyYXkoICdAdHlwZScgPT4gJ0NvdW50cnknLCAnbmFtZScgPT4gJ+S4reWbvScgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyA9PiAkcG9zdCA/IHdwX3N0cmlwX2FsbF90YWdzKCBnZXRfdGhlX2V4Y2VycHQoICRwb3N0LT5JRCApICkgOiAnJywKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDUuIEhvd1RvIHNjaGVtYe+8iOato+aWh+WQq+OAjOatpemqpC/mtYHnqIvjgI3kuJTkuLrljZXnr4cgcG9zdO+8jOino+aekCA8b2w+PGxpPu+8iQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnenNmX2dlb19ob3d0bycgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9faG93dG8oKSB7CiAgICAgICAgJHBvc3QgPSBnZXRfcG9zdCgpOwogICAgICAgIGlmICggISAkcG9zdCApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyDkvb/nlKjmuLLmn5PlkI7nmoTmraPmlofvvIh0aGVfY29udGVudCDov4fmu6TlmajlsZXlvIDljLrlnZcv55+t5Luj56CB5ZCO55qE55yf5a6eIDxvbD4vPHVsPiDliJfooajvvInjgIIKICAgICAgICAkY29udGVudCA9IGFwcGx5X2ZpbHRlcnMoICd0aGVfY29udGVudCcsICRwb3N0LT5wb3N0X2NvbnRlbnQgKTsKICAgICAgICBpZiAoICEgcHJlZ19tYXRjaCggJy/mraXpqqR85rWB56iLLycsICRjb250ZW50ICkgKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8g6Kej5p6Q5pyJ5bqP5YiX6KGoIDxvbD7vvJvoi6Xml6DliJnlhZzlupXop6PmnpDml6Dluo/liJfooaggPHVsPu+8iOacrOermea1geeoi+Wei+aWh+eroOWkmueUqCA8dWw+PGxpPu+8ieOAggogICAgICAgICRsaXN0X2lubmVyID0gbnVsbDsKICAgICAgICBpZiAoIHByZWdfbWF0Y2goICcvPG9sW14+XSo+KFtcc1xTXSo/KTxcL29sPi9pJywgJGNvbnRlbnQsICRsbSApICkgewogICAgICAgICAgICAkbGlzdF9pbm5lciA9ICRsbVsxXTsKICAgICAgICB9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvPHVsW14+XSo+KFtcc1xTXSo/KTxcL3VsPi9pJywgJGNvbnRlbnQsICRsbSApICkgewogICAgICAgICAgICAkbGlzdF9pbm5lciA9ICRsbVsxXTsKICAgICAgICB9CiAgICAgICAgaWYgKCBudWxsID09PSAkbGlzdF9pbm5lciApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkc3RlcHMgPSBhcnJheSgpOwogICAgICAgIGlmICggcHJlZ19tYXRjaF9hbGwoICcvPGxpW14+XSo+KFtcc1xTXSo/KTxcL2xpPi9pJywgJGxpc3RfaW5uZXIsICRsaV9tYXRjaGVzICkgKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCAkbGlfbWF0Y2hlc1sxXSBhcyAkaWR4ID0+ICRsaV9odG1sICkgewogICAgICAgICAgICAgICAgJHRleHQgPSB0cmltKCB3cF9zdHJpcF9hbGxfdGFncyggJGxpX2h0bWwgKSApOwogICAgICAgICAgICAgICAgaWYgKCAnJyA9PT0gJHRleHQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3RlcHNbXSA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICdAdHlwZScgICAgPT4gJ0hvd1RvU3RlcCcsCiAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJyA9PiAkaWR4ICsgMSwKICAgICAgICAgICAgICAgICAgICAnbmFtZScgICAgID0+ICR0ZXh0LAogICAgICAgICAgICAgICAgICAgICd0ZXh0JyAgICAgPT4gJHRleHQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIGVtcHR5KCAkc3RlcHMgKSApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgPT4gJ0hvd1RvJywKICAgICAgICAgICAgJ0BpZCcgICAgICAgICA9PiBnZXRfcGVybWFsaW5rKCAkcG9zdC0+SUQgKSAuICcjaG93dG8nLAogICAgICAgICAgICAnbmFtZScgICAgICAgID0+IGdldF90aGVfdGl0bGUoICRwb3N0LT5JRCApLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nID0+IHdwX3N0cmlwX2FsbF90YWdzKCBnZXRfdGhlX2V4Y2VycHQoICRwb3N0LT5JRCApICksCiAgICAgICAgICAgICdzdGVwJyAgICAgICAgPT4gJHN0ZXBzLAogICAgICAgICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogNi4gU3BlYWthYmxlIHNjaGVtYe+8iOWFs+mUrumhte+8mi9sYXd5ZXJzL+OAgS9wcmFjdGljZS/jgIEvYWJvdXQv44CBUUEg6K+m5oOF77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NwZWFrYWJsZScgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9fc3BlYWthYmxlKCkgewogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ0Bjb250ZXh0JyA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICA9PiAnU3BlYWthYmxlU3BlY2lmaWNhdGlvbicsCiAgICAgICAgICAgICd4cGF0aCcgICAgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAnL2h0bWwvaGVhZC90aXRsZScsCiAgICAgICAgICAgICAgICAnL2h0bWwvYm9keS9tYWluL2gxJywKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDcuIFJldmlldyAvIEFnZ3JlZ2F0ZVJhdGluZyDor7vlj5bvvIjoh6rlrprkuYnlrZfmrrXvvIkKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9fcmF0aW5nJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19yYXRpbmcoICRwb3N0X2lkICkgewogICAgICAgICRhdmcgICA9IGdldF9wb3N0X21ldGEoICRwb3N0X2lkLCAnX3pzeWZfcmF0aW5nX2F2ZycsIHRydWUgKTsKICAgICAgICAkY291bnQgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdF9pZCwgJ196c3lmX3Jldmlld19jb3VudCcsIHRydWUgKTsKICAgICAgICBpZiAoICRhdmcgPT09ICcnIHx8ICRjb3VudCA9PT0gJycgKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAkYXZnX2YgICA9IGZsb2F0dmFsKCAkYXZnICk7CiAgICAgICAgJGNvdW50X2kgPSBpbnR2YWwoICRjb3VudCApOwogICAgICAgIGlmICggJGNvdW50X2kgPD0gMCB8fCAkYXZnX2YgPD0gMCApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ0B0eXBlJyAgICAgICA9PiAnQWdncmVnYXRlUmF0aW5nJywKICAgICAgICAgICAgJ3JhdGluZ1ZhbHVlJyA9PiAkYXZnX2YsCiAgICAgICAgICAgICdyZXZpZXdDb3VudCcgPT4gJGNvdW50X2ksCiAgICAgICAgICAgICdiZXN0UmF0aW5nJyAgPT4gNSwKICAgICAgICAgICAgJ3dvcnN0UmF0aW5nJyA9PiAxLAogICAgICAgICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogOC4g6aG16Z2i5LiK5LiL5paH5Yik5patCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwoKSB7CiAgICAgICAgcmV0dXJuIGlzX3Npbmd1bGFyKCBhcnJheSggJ3pzX2xhd3llcicsICdsYXd5ZXInICkgKTsKICAgIH0KfQoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9faXNfYWJvdXQnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2lzX2Fib3V0KCkgewogICAgICAgIHJldHVybiB6c2ZfZ2VvX2N1cnJlbnRfcGF0aCgpID09PSAnL2Fib3V0JzsKICAgIH0KfQoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9faXNfc2VydmljZV9wYWdlJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19pc19zZXJ2aWNlX3BhZ2UoKSB7CiAgICAgICAgJHBhdGggPSB6c2ZfZ2VvX2N1cnJlbnRfcGF0aCgpOwogICAgICAgIGlmICggcHJlZ19tYXRjaCggJyNeL3ByYWN0aWNlL3AtIycsICRwYXRoICkgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIHByZWdfbWF0Y2goICcjXi90b29scy9jb25zdWx0IycsICRwYXRoICkgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2lzX3NwZWFrYWJsZV9wYWdlJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19pc19zcGVha2FibGVfcGFnZSgpIHsKICAgICAgICAkcGF0aCA9IHpzZl9nZW9fY3VycmVudF9wYXRoKCk7CiAgICAgICAgaWYgKCAkcGF0aCA9PT0gJy9sYXd5ZXJzJyB8fCBzdHJwb3MoICRwYXRoLCAnL2xhd3llcnMvJyApID09PSAwICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdHJwb3MoICRwYXRoLCAnL3ByYWN0aWNlJyApID09PSAwICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkcGF0aCA9PT0gJy9hYm91dCcgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBRQSDor6bmg4XpobUKICAgICAgICBpZiAoIHN0cnBvcyggJHBhdGgsICcvcWEvJyApICE9PSBmYWxzZSApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiA5LiDkuLvovpPlh7rvvJp3cF9mb290ZXIg5LyY5YWI57qnIDk5CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NjaGVtYV9lbWl0JyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19zY2hlbWFfZW1pdCgpIHsKICAgICAgICBpZiAoIGlzX2FkbWluKCkgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRzY2hlbWFzID0gYXJyYXkoKTsKCiAgICAgICAgLy8g5omA5pyJ6aG16Z2i77yaT3JnYW5pemF0aW9uCiAgICAgICAgJHNjaGVtYXNbXSA9IHpzZl9nZW9fb3JnYW5pemF0aW9uKCk7CgogICAgICAgIC8vIOW+i+W4iOivpuaDhemhte+8mkF0dG9ybmV577yIKyDlj6/pgIkgQWdncmVnYXRlUmF0aW5n77yJCiAgICAgICAgaWYgKCB6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwoKSApIHsKICAgICAgICAgICAgJGF0dG9ybmV5ID0genNmX2dlb19hdHRvcm5leSgpOwogICAgICAgICAgICBpZiAoICRhdHRvcm5leSApIHsKICAgICAgICAgICAgICAgICRzY2hlbWFzW10gPSAkYXR0b3JuZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOWFs+S6jumhte+8mkxlZ2FsU2VydmljZe+8iCsg5Y+v6YCJIEFnZ3JlZ2F0ZVJhdGluZ++8iQogICAgICAgIGlmICggenNmX2dlb19pc19hYm91dCgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19sZWdhbF9zZXJ2aWNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyDmnI3liqHpobXvvJpTZXJ2aWNlCiAgICAgICAgaWYgKCB6c2ZfZ2VvX2lzX3NlcnZpY2VfcGFnZSgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19zZXJ2aWNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyDljZXnr4cgcG9zdCDkuJTmraPmloflkKvmraXpqqQv5rWB56iL77yaSG93VG8KICAgICAgICBpZiAoIGlzX3Npbmd1bGFyKCAncG9zdCcgKSApIHsKICAgICAgICAgICAgJGRiZ19jb250ZW50ID0gYXBwbHlfZmlsdGVycyggJ3RoZV9jb250ZW50JywgZ2V0X3Bvc3QoKS0+cG9zdF9jb250ZW50ICk7CiAgICAgICAgICAgICRkYmdfc3RlcCA9IChib29sKSBwcmVnX21hdGNoKCAnL+atpemqpHzmtYHnqIsvJywgJGRiZ19jb250ZW50ICk7CiAgICAgICAgICAgICRkYmdfb2wgPSAoYm9vbCkgcHJlZ19tYXRjaCggJy88b2xbXj5dKj4vaScsICRkYmdfY29udGVudCApOwogICAgICAgICAgICAkZGJnX3VsID0gKGJvb2wpIHByZWdfbWF0Y2goICcvPHVsW14+XSo+L2knLCAkZGJnX2NvbnRlbnQgKTsKICAgICAgICAgICAgJGRiZ19saSA9IChib29sKSBwcmVnX21hdGNoKCAnLzxsaVtePl0qPi9pJywgJGRiZ19jb250ZW50ICk7CiAgICAgICAgICAgIGVjaG8gIlxuPCEtLSBaU0ZfREVCVUcgaG93dG86IHN0ZXA9JGRiZ19zdGVwIG9sPSRkYmdfb2wgdWw9JGRiZ191bCBsaT0kZGJnX2xpIGNsZW49IiAuIHN0cmxlbiggJGRiZ19jb250ZW50ICkgLiAiIC0tPlxuIjsKICAgICAgICAgICAgJGhvd3RvID0genNmX2dlb19ob3d0bygpOwogICAgICAgICAgICBpZiAoICRob3d0byApIHsKICAgICAgICAgICAgICAgICRzY2hlbWFzW10gPSAkaG93dG87CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOWFs+mUrumhte+8mlNwZWFrYWJsZQogICAgICAgIGlmICggenNmX2dlb19pc19zcGVha2FibGVfcGFnZSgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19zcGVha2FibGUoKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCAkc2NoZW1hcyBhcyAkc2NoZW1hICkgewogICAgICAgICAgICBpZiAoIGVtcHR5KCAkc2NoZW1hICkgfHwgISBpc19hcnJheSggJHNjaGVtYSApICkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGpzb24gPSB3cF9qc29uX2VuY29kZSggJHNjaGVtYSwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBKU09OX1BSRVRUWV9QUklOVCApOwogICAgICAgICAgICBpZiAoIGZhbHNlID09PSAkanNvbiApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gIlxuIiAuICc8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2xkK2pzb24iPicgLiAkanNvbiAuICc8L3NjcmlwdD4nIC4gIlxuIjsKICAgICAgICB9CiAgICB9Cn0KCmFkZF9hY3Rpb24oICd3cF9mb290ZXInLCAnenNmX2dlb19zY2hlbWFfZW1pdCcsIDk5ICk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDEwLiBBcnRpY2xlIHNjaGVtYSDkv67mraPvvJrloavlhYUgcHVibGlzaGVyIOS4jiBhdXRob3IubmFtZQogKiAgICAg77yIWW9hc3Qgd3BzZW9fc2NoZW1hX2FydGljbGUgZmlsdGVy77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZml4X2FydGljbGVfcHVibGlzaGVyJyApICkgewogICAgZnVuY3Rpb24genNmX2ZpeF9hcnRpY2xlX3B1Ymxpc2hlciggJHNjaGVtYSApIHsKICAgICAgICBpZiAoICEgaXNfYXJyYXkoICRzY2hlbWEgKSApIHsKICAgICAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICAkc2NoZW1hWydwdWJsaXNoZXInXSA9IGFycmF5KAogICAgICAgICAgICAnQHR5cGUnID0+ICdPcmdhbml6YXRpb24nLAogICAgICAgICAgICAnQGlkJyAgID0+IFpTRl9HRU9fT1JHX0lELAogICAgICAgICAgICAnbmFtZScgID0+ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICk7CgogICAgICAgIGlmICggZW1wdHkoICRzY2hlbWFbJ2F1dGhvciddWyduYW1lJ10gKSApIHsKICAgICAgICAgICAgJHNjaGVtYVsnYXV0aG9yJ11bJ25hbWUnXSA9ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICB9Cn0KCmFkZF9maWx0ZXIoICd3cHNlb19zY2hlbWFfYXJ0aWNsZScsICd6c2ZfZml4X2FydGljbGVfcHVibGlzaGVyJywgMTAsIDEgKTsK 劳务派遣合同纠纷高发,这些条款必须看清_法律资讯 - 北京百环律师事务所 劳务派遣合同纠纷高发,这些条款必须看清_法律资讯 - 北京百环律师事务所
10万+问答 5万+专业文章 50+实用工具 100+合作律师
📞 18511835733 18511835733@163.com
首页 > 劳务派遣合同纠纷高发,这些条款必须看清_法律资讯
首页 » 劳务派遣合同纠纷高发,这些条款必须看清

劳务派遣合同纠纷高发,这些条款必须看清

2026年9月3日 · 分类:法律资讯

本文要点(AI 摘要)

  • 上个月有个做IT外包的老板来所里,一脸愁容。
  • 我翻了翻他带来的合同,问题一目了然。
  • 先说结论:很多派遣合同纠纷,根源不在派遣公司,而在用工单位自己签的协议里埋了雷。
  • 靠前个雷是“责任转嫁条款”。
  • 第二个雷是“同工同酬被架空”。
文章摘要

劳务派遣合同纠纷高发,这些条款必须看清

上个月有个做IT外包的老板来所里,一脸愁容。他说公司用劳务派遣用了五六年,最近被一个离职员工告了,仲裁庭认定他跟派遣单位承担连带赔偿责任,要补社保、付加班费,

劳务派遣合同纠纷高发,这些条款必须看清

上个月有个做IT外包的老板来所里,一脸愁容。他说公司用劳务派遣用了五六年,最近被一个离职员工告了,仲裁庭认定他跟派遣单位承担连带赔偿责任,要补社保、付加班费,加起来小二十万。他反复问我:“文律师,我们签了派遣协议的呀,白纸黑字,怎么还是我们的责任?”

我翻了翻他带来的合同,问题一目了然。今天我把这类案子里最常见的几个坑给你摆一摆,尤其是用人单位的老板、HR,认真看完,能帮你省下真金白银。

劳务派遣合同里,最容易埋雷的三个条款

北京律师事务所 文道全律师8

先说结论:很多派遣合同纠纷,根源不在派遣公司,而在用工单位自己签的协议里埋了雷。

靠前个雷是“责任转嫁条款”。有些派遣协议里写着“派遣人员的一切劳动纠纷由派遣公司负责,与用工单位无关”。这话听着像护身符,实际上一文不值。根据《劳动合同法》第九十二条,给被派遣劳动者造成损害的,劳务派遣单位与用工单位承担连带赔偿责任。你内部怎么约定是你的事,法律上该你承担的责任,跑不掉。

第二个雷是“同工同酬被架空”。我见过不少派遣协议,薪酬标准写成“按用工单位相关制度执行”,但制度里根本没写派遣工怎么定薪。真出了纠纷,派遣工主张同工同酬,举证责任一倒置,用工单位拿不出合理依据,基本就是输。

第三个雷是“退回条款过于随意”。合同里写“用工单位可根据业务需要随时退回派遣人员”,这等于给了你一把双刃剑。司法实践里,随意退回导致派遣单位违法解除的,用工单位经常被认定承担连带责任。北京百环律师事务所处理过的案件里,这类纠纷占了相当比例。

❗ 特别注意:派遣协议不是签了就完事,关键看条款是否跟法律强制性规定冲突。冲突的部分,写了也白写。

为什么劳务派遣纠纷这两年在猛增

北京律师事务所 文道全律师12

人社部2023年发布的统计公报显示,全国劳务派遣用工总量仍在数千万级别。而中国裁判文书网的数据侧面反映,涉及派遣用工的劳动争议案件近三年持续处于高位。数字背后是几个现实原因。

一是“假外包真派遣”的操作太普遍。很多企业把原来的派遣工包装成“外包人员”,签的是服务外包合同,干的还是原来那些活,管理还是自己管。一旦出事,仲裁委和法院穿透看实质,认定你还是用工单位,该承担的责任一样不少。

二是派遣用工的“三性”岗位审查变严。法律明确规定,劳务派遣只能在临时性、辅助性或者替代性的工作岗位上实施,而且用工数量不得超过用工总量的10%。很多企业超比例使用派遣工,本身就是违法状态,纠纷一来,先输一半。

三是社保缴纳不规范。派遣公司为了赚差价,常常按最低基数给派遣工缴社保,甚至异地缴。员工一旦发生工伤或者要求补缴,矛头往往同时指向用工单位。

📌 划重点:纠纷高发的根源,是用工单位把派遣当成“甩包袱”的工具,但法律的设计逻辑是——谁实际用工,谁就要承担相应责任。

真出了纠纷,用工单位该怎么应对

北京律师事务所 文道全律师17

文道全律师团队处理过不少这类纠纷,我的经验是,应对策略分三步走。

靠前步,先把证据链固定下来。包括派遣协议原件、工资支付记录、考勤记录、社保缴纳凭证、岗位说明书。尤其是能证明“派遣公司独立行使管理权”的证据,比如派遣公司自己排班、自己考核的记录。这决定了你在连带责任里能分担多少。

第二步,审查派遣公司资质。如果对方没有劳务派遣经营许可证,或者许可证已过期,那你们的派遣协议可能被认定无效,后果是可能被认定为直接建立劳动关系。这一步很多人忽略,但影响是根本性的。

第三步,积极协商,别硬扛。这类案件标的通常不大,但仲裁加诉讼走完,时间成本很高。在事实清楚、责任难逃的情况下,尽早拿出和解方案,往往比硬扛到底更划算。文道全律师常说:“我不劝你打官司,除非真的有必要。”这话放在派遣纠纷里尤其适用。

✅ 这个动作今天就能做:把现有的派遣协议翻出来,对照《劳务派遣暂行规定》第七条,看必备条款是不是都齐了。缺一项,就是隐患。

给用人单位的四个实操建议

北京百环律师事务所的实践经验表明,与其等纠纷来了再补救,不如在合同签署环节就把风险摁住。

靠前,派遣协议里必须明确“派遣公司承担雇主责任”的具体情形,包括工伤申报、劳动合同签订、工资发放、社保缴纳,逐项写明由派遣公司负责,并约定违约责任。这不能免除你的连带责任,但能让你在承担后向派遣公司追偿时有依据。

第二,薪酬条款要设计好。要么直接约定派遣工的工资标准不低于用工单位相同岗位的多少比例,要么明确薪酬结构由派遣公司确定并书面告知。别用“按公司制度执行”这种模糊表述,等于把解释权交给了仲裁员。

第三,退回机制要写清楚。只能依据《劳动合同法》第六十五条第二款规定的法定情形退回,比如派遣工有严重违纪、不能胜任工作等。合同里写“随时可退”,法律上不支持,反而让你在管理上陷入被动。

第四,保留好“三性”岗位的论证材料。比如临时性岗位的起止时间、辅助性岗位的职责说明。万一被查超比例用工,这些材料能证明你并非故意规避法律。

⚠️ 常见误区:很多人觉得派遣工不是自己的员工,不用签劳动合同、不用做入职培训。错了。用工单位对派遣工同样负有安全生产培训义务,出了工伤,培训记录缺失可能让你承担更大比例的责任。

关于劳务派遣纠纷,你可能还想问

有人可能会问:文道全律师,我们公司现在派遣工占比超过10%,是不是必须马上整改?老实说,法律给了过渡期安排,但各地执行尺度不一样。建议你对照当地人社部门的具体要求,尽快把超比例部分转为直接用工或者真外包,别拖。

另一个常问的是:派遣工出了工伤,用工单位要赔吗?根据《工伤保险条例》,派遣公司是法定参保单位,但实际用工单位如果未尽到安全保障义务,同样要承担相应责任。所以现场安全管理和培训记录,一样都不能少。

还有一个高频问题:派遣公司跑路了,工资找谁要?实践中,用工单位往往被认定承担垫付责任。所以选择派遣公司时,注册资本、经营年限、过往涉诉情况,都要提前摸底。

📞 直接问律师:如果你手里已经有一份派遣协议拿不准,或者纠纷已经起来,别自己硬扛。打 18511835733 找文道全律师团队,15分钟免费诊断,帮你把风险点捋清楚。

文道全律师有句话,放在这儿收尾最合适:“很多企业不是被对手打败的,是被自己的合同漏洞坑死的。”劳务派遣的坑,大多不在派遣公司,而在你自己签的那份协议里。趁还没出事,赶紧翻出来看看。

北京百环律师事务所
地址:北京市海淀区丹棱街6号1幢912室(丹棱SOHO-912)
咨询电话:18511835733

*本文为普法参考,不作为具体案件的法律意见。如有纠纷,建议直接咨询文道全律师团队获取针对性方案。*

本文由 北京百环律师事务所刑事律师团队 审核并授权发布,内容为普法信息、不构成个案法律意见。预约面谈请拨 18511835733
相关法律问题,在线咨询
💬📞
在商言法(北京)文化有限公司负责本平台运营与技术服务;具体法律服务由用户实际委托的律师或机构提供。 了解平台
💻
添加律师微信

微信号与手机号相同

18511835733