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OwogIGdib29sZWFuIHVzZV9ndmFyaWFudDsKfSBfRXh0ZW5kZWRHREJ1c0FyZ0luZm87CgpzgwAAAHR5cGVkZWYgc3RydWN0CnsKICBHREJ1c01ldGhvZEluZm8gcGFyZW50X3N0cnVjdDsKICBjb25zdCBnY2hhciAqc2lnbmFsX25hbWU7CiAgZ2Jvb2xlYW4gcGFzc19mZGxpc3Q7Cn0gX0V4dGVuZGVkR0RCdXNNZXRob2RJbmZvOwoKc2sAAAB0eXBlZGVmIHN0cnVjdAp7CiAgR0RCdXNTaWduYWxJbmZvIHBhcmVudF9zdHJ1Y3Q7CiAgY29uc3QgZ2NoYXIgKnNpZ25hbF9uYW1lOwp9IF9FeHRlbmRlZEdEQnVzU2lnbmFsSW5mbzsKCnOIAAAAdHlwZWRlZiBzdHJ1Y3QKewogIEdEQnVzUHJvcGVydHlJbmZvIHBhcmVudF9zdHJ1Y3Q7CiAgY29uc3QgZ2NoYXIgKmh5cGhlbl9uYW1lOwogIGdib29sZWFuIHVzZV9ndmFyaWFudDsKfSBfRXh0ZW5kZWRHREJ1c1Byb3BlcnR5SW5mbzsKCnNxAAAAdHlwZWRlZiBzdHJ1Y3QKewogIEdEQnVzSW50ZXJmYWNlSW5mbyBwYXJlbnRfc3RydWN0OwogIGNvbnN0IGdjaGFyICpoeXBoZW5fbmFtZTsKfSBfRXh0ZW5kZWRHREJ1c0ludGVyZmFjZUluZm87CgpzDQEAAHR5cGVkZWYgc3RydWN0CnsKICBjb25zdCBfRXh0ZW5kZWRHREJ1c1Byb3BlcnR5SW5mbyAqaW5mbzsKICBndWludCBwcm9wX2lkOwogIEdWYWx1ZSBvcmlnX3ZhbHVlOyAvKiB0aGUgdmFsdWUgYmVmb3JlIHRoZSBjaGFuZ2UgKi8KfSBDaGFuZ2VkUHJvcGVydHk7CgpzdGF0aWMgdm9pZApfY2hhbmdlZF9wcm9wZXJ0eV9mcmVlIChDaGFuZ2VkUHJvcGVydHkgKmRhdGEpCnsKICBnX3ZhbHVlX3Vuc2V0ICgmZGF0YS0+b3JpZ192YWx1ZSk7CiAgZ19mcmVlIChkYXRhKTsKfQoKc4kBAABzdGF0aWMgZ2Jvb2xlYW4KX2dfc3Rydl9lcXVhbDAgKGdjaGFyICoqYSwgZ2NoYXIgKipiKQp7CiAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CiAgZ3VpbnQgbjsKICBpZiAoYSA9PSBOVUxMICYmIGIgPT0gTlVMTCkKICAgIHsKICAgICAgcmV0ID0gVFJVRTsKICAgICAgZ290byBvdXQ7CiAgICB9CiAgaWYgKGEgPT0gTlVMTCB8fCBiID09IE5VTEwpCiAgICBnb3RvIG91dDsKICBpZiAoZ19zdHJ2X2xlbmd0aCAoYSkgIT0gZ19zdHJ2X2xlbmd0aCAoYikpCiAgICBnb3RvIG91dDsKICBmb3IgKG4gPSAwOyBhW25dICE9IE5VTEw7IG4rKykKICAgIGlmIChnX3N0cmNtcDAgKGFbbl0sIGJbbl0pICE9IDApCiAgICAgIGdvdG8gb3V0OwogIHJldCA9IFRSVUU7Cm91dDoKICByZXR1cm4gcmV0Owp9CgpzBQEAAHN0YXRpYyBnYm9vbGVhbgpfZ192YXJpYW50X2VxdWFsMCAoR1ZhcmlhbnQgKmEsIEdWYXJpYW50ICpiKQp7CiAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CiAgaWYgKGEgPT0gTlVMTCAmJiBiID09IE5VTEwpCiAgICB7CiAgICAgIHJldCA9IFRSVUU7CiAgICAgIGdvdG8gb3V0OwogICAgfQogIGlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKQogICAgZ290byBvdXQ7CiAgcmV0ID0gZ192YXJpYW50X2VxdWFsIChhLCBiKTsKb3V0OgogIHJldHVybiByZXQ7Cn0KCnNoBgAAR19HTlVDX1VOVVNFRCBzdGF0aWMgZ2Jvb2xlYW4KX2dfdmFsdWVfZXF1YWwgKGNvbnN0IEdWYWx1ZSAqYSwgY29uc3QgR1ZhbHVlICpiKQp7CiAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CiAgZ19hc3NlcnQgKEdfVkFMVUVfVFlQRSAoYSkgPT0gR19WQUxVRV9UWVBFIChiKSk7CiAgc3dpdGNoIChHX1ZBTFVFX1RZUEUgKGEpKQogICAgewogICAgICBjYXNlIEdfVFlQRV9CT09MRUFOOgogICAgICAgIHJldCA9IChnX3ZhbHVlX2dldF9ib29sZWFuIChhKSA9PSBnX3ZhbHVlX2dldF9ib29sZWFuIChiKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgR19UWVBFX1VDSEFSOgogICAgICAgIHJldCA9IChnX3ZhbHVlX2dldF91Y2hhciAoYSkgPT0gZ192YWx1ZV9nZXRfdWNoYXIgKGIpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBHX1RZUEVfSU5UOgogICAgICAgIHJldCA9IChnX3ZhbHVlX2dldF9pbnQgKGEpID09IGdfdmFsdWVfZ2V0X2ludCAoYikpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEdfVFlQRV9VSU5UOgogICAgICAgIHJldCA9IChnX3ZhbHVlX2dldF91aW50IChhKSA9PSBnX3ZhbHVlX2dldF91aW50IChiKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgR19UWVBFX0lOVDY0OgogICAgICAgIHJldCA9IChnX3ZhbHVlX2dldF9pbnQ2NCAoYSkgPT0gZ192YWx1ZV9nZXRfaW50NjQgKGIpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBHX1RZUEVfVUlOVDY0OgogICAgICAgIHJldCA9IChnX3ZhbHVlX2dldF91aW50NjQgKGEpID09IGdfdmFsdWVfZ2V0X3VpbnQ2NCAoYikpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEdfVFlQRV9ET1VCTEU6CiAgICAgICAgewogICAgICAgICAgLyogQXZvaWQgLVdmbG9hdC1lcXVhbCB3YXJuaW5ncyBieSBkb2luZyBhIGRpcmVjdCBiaXQgY29tcGFyZSAqLwogICAgICAgICAgZ2RvdWJsZSBkYSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAoYSk7CiAgICAgICAgICBnZG91YmxlIGRiID0gZ192YWx1ZV9nZXRfZG91YmxlIChiKTsKICAgICAgICAgIHJldCA9IG1lbWNtcCAoJmRhLCAmZGIsIHNpemVvZiAoZ2RvdWJsZSkpID09IDA7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEdfVFlQRV9TVFJJTkc6CiAgICAgICAgcmV0ID0gKGdfc3RyY21wMCAoZ192YWx1ZV9nZXRfc3RyaW5nIChhKSwgZ192YWx1ZV9nZXRfc3RyaW5n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AGRvAHwAAGoEAHwAAGoEAGYCABaDAQABfAAAagEAagIAZAEAgwEAAXwAAGoBAGoCAGRwAHwAAGohAHwAAGohAGYCABaDAQABfAAAagEAagIAZHEAfAAAaiEAfAAAaiEAZgIAFoMBAAF8AABqAQBqAgBkcgB8AABqIQB8AABqIQBmAgAWgwEAAXwAAGoBAGoCAGQBAIMBAAF8AABqAQBqAgBkcwB8AABqIQAWgwEAAXwAAGoBAGoCAGQMAIMBAAF8AABqAQBqAgBkQgCDAQABfAAAagEAagIAZHQAgwEAAXwAAGoBAGoCAGR1AHwAAGohABaDAQABfAAAagEAagIAZB4AgwEAAXwAAGoBAGoCAGQBAIMBAAF8AABqAQBqAgBkdgB8AABqIQAWgwEAAXwAAGoBAGoCAGQMAIMBAAF8AABqAQBqAgBkdwCDAQABfAAAagEAagIAZB4AgwEAAXwAAGoBAGoCAGQBAIMBAAF8AABqAQBqAgBkeAB8AABqIAAWgwEAAXwAAGoBAGoCAGR5AHwAAGohAHwAAGogAGYCABaDAQABfAAAagEAagIAZAEAgwEAAXwAAGoBAGoCAGR6AHwAAGoEAHwAAGogAGYCABaDAQABfAAAagEAagIAZHsAfAAAagQAfAAAagQAfAAAaiEAZgMAFoMBAAF8AABqAQBqAgBkfAB8AABqBAB8AABqBAB8AABqIQBmAwAWgwEAAXwAAGoBAGoCAGR9AHwAAGoEAHwAAGoEAHwAAGohAGYDABaDAQABfAAAagEAagIAZH4AfAAAagQAfAAAagQAZgIAFoMBAAF8AABqAQBqAgBkfwB8AABqBAB8AABqBABmAgAWgwEAAXwAAGoBAGoCAGQBAIMBAAF8AABqAQBqAgBkgAB8AABqIQB8AABqIQBmAgAWgwEAAXwAAGoBAGoCAGSBAHwAAGohAHwAAGohAGYCABaDAQABfAAAagEAagIAZIIAfAAAaiEAfAAAaiEAZgIAFoMBAAF8AABqAQBqAgBkAQCDAQABfAAAagEAagIAZIMAfAAAaiEAFoMBAAF8AABqAQBqAgBkDACDAQABfAAAagEAagIAZEIAgwEAAXwAAGoBAGoCAGSEAIMBAAF8AABqAQBqAgBkhQB8AABqIQAWgwEAAXwAAGoBAGoCAGQeAIMBAAF8AABqAQBqAgBkAQCDAQAB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dCAqZmRfbGlzdHMOAAAALAogICAgJXNhcmdfJXNzBAAAACk7CgpzCgAAAF9zaWduYWxfJXNzDwAAACAgdm9pZCAoKiVzKSAoCnMOAAAAICAgICVzICpvYmplY3RzDAAAAF9wcm9wX2dldF8lc3MeAAAAICAlcyAoKmdldF8lcykgKCVzICpvYmplY3QpOwoKdAMAAABrZXlzAgAAACVzcwMAAAB9OwpzJwAAAEdUeXBlICVzX2dldF90eXBlICh2b2lkKSBHX0dOVUNfQ09OU1Q7CnMuAAAAR0RCdXNJbnRlcmZhY2VJbmZvIColc19pbnRlcmZhY2VfaW5mbyAodm9pZCk7CnNNAAAAZ3VpbnQgJXNfb3ZlcnJpZGVfcHJvcGVydGllcyAoR09iamVjdENsYXNzICprbGFzcywgZ3VpbnQgcHJvcGVydHlfaWRfYmVnaW4pOwpzLgAAAC8qIEQtQnVzIG1ldGhvZCBjYWxsIGNvbXBsZXRpb24gZnVuY3Rpb25zOiAqLwpzEgAAAEdfR05VQ19ERVBSRUNBVEVEIHNLAAAAdm9pZCAlc19jb21wbGV0ZV8lcyAoCiAgICAlcyAqb2JqZWN0LAogICAgR0RCdXNNZXRob2RJbnZvY2F0aW9uICppbnZvY2F0aW9ucwoAAAAsCiAgICAlcyVzcwMAAAApOwpzKAAAAC8qIEQtQnVzIHNpZ25hbCBlbWlzc2lvbnMgZnVuY3Rpb25zOiAqLwpzIAAAAHZvaWQgJXNfZW1pdF8lcyAoCiAgICAlcyAqb2JqZWN0cxoAAAAvKiBELUJ1cyBtZXRob2QgY2FsbHM6ICovCnMfAAAAdm9pZCAlc19jYWxsXyVzICgKICAgICVzICpwcm94eXNcAAAALAogICAgR0NhbmNlbGxhYmxlICpjYW5jZWxsYWJsZSwKICAgIEdBc3luY1JlYWR5Q2FsbGJhY2sgY2FsbGJhY2ssCiAgICBncG9pbnRlciB1c2VyX2RhdGEpOwpzKgAAAGdib29sZWFuICVzX2NhbGxfJXNfZmluaXNoICgKICAgICVzICpwcm94eXMOAAAALAogICAgJXNvdXRfJXNzHwAAACwKICAgIEdVbml4RkRMaXN0ICoqb3V0X2ZkX2xpc3RzLgAAACwKICAgIEdBc3luY1Jlc3VsdCAqcmVzLAogICAgR0Vycm9yICoqZXJyb3IpOwpzKAAAAGdib29sZWFuICVzX2NhbGxfJXNfc3luYyAoCiAgICAlcyAqcHJveHlzGwAAACwKICAgIEdVbml4RkRMaXN0ICAqZmRfbGlzdHM2AAAALAogICAgR0NhbmNlbGxhYmxlICpjYW5jZWxsYWJsZSwKICAgIEdFcnJvciAqKmVycm9yKTsKcyAAAAAvKiBELUJ1cyBwcm9wZXJ0eSBhY2Nlc3NvcnM6ICovCnMaAAAAJXMlc19nZXRfJXMgKCVzICpvYmplY3QpOwpzGgAAACVzJXNfZHVwXyVzICglcyAqb2JqZWN0KTsKcyYAAAB2b2lkICVzX3NldF8lcyAoJXMgKm9iamVjdCwgJXN2YWx1ZSk7CnMLAAAALyogLS0tLSAqLwpzLwAAACNkZWZpbmUgJXNUWVBFXyVzX1BST1hZICglc19wcm94eV9nZXRfdHlwZSAoKSkKc1MAAAAjZGVmaW5lICVzJXNfUFJPWFkobykgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgobyksICVzVFlQRV8lc19QUk9YWSwgJXNQcm94eSkpCnNbAAAAI2RlZmluZSAlcyVzX1BST1hZX0NMQVNTKGspIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGspLCAlc1RZUEVfJXNfUFJPWFksICVzUHJveHlDbGFzcykpCnNhAAAAI2RlZmluZSAlcyVzX1BST1hZX0dFVF9DTEFTUyhvKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG8pLCAlc1RZUEVfJXNfUFJPWFksICVzUHJveHlDbGFzcykpCnNNAAAAI2RlZmluZSAlc0lTXyVzX1BST1hZKG8pIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG8pLCAlc1RZUEVfJXNfUFJPWFkpKQpzUAAAACNkZWZpbmUgJXNJU18lc19QUk9YWV9DTEFTUyhrKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrKSwgJXNUWVBFXyVzX1BST1hZKSkKcyEAAAB0eXBlZGVmIHN0cnVjdCBfJXNQcm94eSAlc1Byb3h5OwpzKwAAAHR5cGVkZWYgc3RydWN0IF8lc1Byb3h5Q2xhc3MgJXNQcm94eUNsYXNzOwpzLwAAAHR5cGVkZWYgc3RydWN0IF8lc1Byb3h5UHJpdmF0ZSAlc1Byb3h5UHJpdmF0ZTsKcxAAAABzdHJ1Y3QgXyVzUHJveHkKcxIAAAAgIC8qPCBwcml2YXRlID4qLwpzHgAAACAgR0RCdXNQcm94eSBwYXJlbnRfaW5zdGFuY2U7CnMYAAAAICAlc1Byb3h5UHJpdmF0ZSAqcHJpdjsKcxUAAABzdHJ1Y3QgXyVzUHJveHlDbGFzcwpzIAAAACAgR0RCdXNQcm94eUNsYXNzIHBhcmVudF9jbGFzczsKcy0AAABHVHlwZSAlc19wcm94eV9nZXRfdHlwZSAodm9pZCkgR19HTlVDX0NPTlNUOwpzDAEAAHZvaWQgJXNfcHJveHlfbmV3ICgKICAgIEdEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCiAgICBHREJ1c1Byb3h5RmxhZ3MgICAgICBmbGFncywKICAgIGNvbnN0IGdjaGFyICAgICAgICAgKm5hbWUsCiAgICBjb25zdCBnY2hhciAgICAgICAgICpvYmplY3RfcGF0aCwKICAgIEdDYW5jZWxsYWJsZSAgICAgICAgKmNhbmNlbGxhYmxlLAogICAgR0FzeW5jUmVhZHlDYWxsYmFjayAgY2FsbGJhY2ssCiAgICBncG9pbnRlciAgICAgICAgICAgICB1c2VyX2RhdGEpOwpzWQAAACVzIColc19wcm94eV9uZXdfZmluaXNoICgKICAgIEdBc3luY1Jlc3VsdCAgICAgICAgKnJlcywKICAgIEdFcnJvciAgICAgICAgICAgICAqKmVycm9yKTsKc+kAAAAlcyAqJXNfcHJveHlfbmV3X3N5bmMgKAogICAgR0RCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKICAgIEdEQnVzUHJveHlGbGFncyAgICAgIGZsYWdzLAogICAgY29uc3QgZ2NoYXIgICAgICAgICAqbmFtZSwKICAgIGNvbnN0IGdjaGFyICAgICAgICAgKm9iamVjdF9wYXRoLAogICAgR0NhbmNlbGxhYmxlICAgICAgICAqY2FuY2VsbGFibGUsCiAgICBHRXJyb3IgICAgICAgICAgICAgKiplcnJvcik7CnMSAQAAdm9pZCAlc19wcm94eV9uZXdfZm9yX2J1cyAoCiAgICBHQnVzVHlwZSAgICAgICAgICAgICBidXNfdHlwZSwKICAgIEdEQnVzUHJveHlGbGFncyAgICAgIGZsYWdzLAogICAgY29uc3QgZ2NoYXIgICAgICAgICAqbmFtZSwKICAgIGNvbnN0IGdjaGFyICAgICAgICAgKm9iamVjdF9wYXRoLAogICAgR0NhbmNlbGxhYmxlICAgICAgICAqY2FuY2VsbGFibGUsCiAgICBHQXN5bmNSZWFkeUNhbGxiYWNrICBjYWxsYmFjaywKICAgIGdwb2ludGVyICAgICAgICAgICAgIHVzZXJfZGF0YSk7CnNhAAAAJXMgKiVzX3Byb3h5X25ld19mb3JfYnVzX2ZpbmlzaCAoCiAgICBHQXN5bmNSZXN1bHQgICAgICAgICpyZXMsCiAgICBHRXJyb3IgICAgICAgICAgICAgKiplcnJvcik7CnPvAAAAJXMgKiVzX3Byb3h5X25ld19mb3JfYnVzX3N5bmMgKAogICAgR0J1c1R5cGUgICAgICAgICAgICAgYnVzX3R5cGUsCiAgICBHREJ1c1Byb3h5RmxhZ3MgICAgICBmbGFncywKICAgIGNvbnN0IGdjaGFyICAgICAgICAgKm5hbWUsCiAgICBjb25zdCBnY2hhciAgICAgICAgICpvYmplY3RfcGF0aCwKICAgIEdDYW5jZWxsYWJsZSAgICAgICAgKmNhbmNlbGxhYmxlLAogICAgR0Vycm9yICAgICAgICAgICAgICoqZXJyb3IpOwpzNQAAACNkZWZpbmUgJXNUWVBFXyVzX1NLRUxFVE9OICglc19za2VsZXRvbl9nZXRfdHlwZSAoKSkKc1wAAAAjZGVmaW5lICVzJXNfU0tFTEVUT04obykgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgobyksICVzVFlQRV8lc19TS0VMRVRPTiwgJXNTa2VsZXRvbikpCnNkAAAAI2RlZmluZSAlcyVzX1NLRUxFVE9OX0NMQVNTKGspIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGspLCAlc1RZUEVfJXNfU0tFTEVUT04sICVzU2tlbGV0b25DbGFzcykpCnNqAAAAI2RlZmluZSAlcyVzX1NLRUxFVE9OX0dFVF9DTEFTUyhvKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG8pLCAlc1RZUEVfJXNfU0tFTEVUT04sICVzU2tlbGV0b25DbGFzcykpCnNTAAAAI2RlZmluZSAlc0lTXyVzX1NLRUxFVE9OKG8pIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG8pLCAlc1RZUEVfJXNfU0tFTEVUT04pKQpzVgAAACNkZWZpbmUgJXNJU18lc19TS0VMRVRPTl9DTEFTUyhrKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrKSwgJXNUWVBFXyVzX1NLRUxFVE9OKSkKcycAAAB0eXBlZGVmIHN0cnVjdCBfJXNTa2VsZXRvbiAlc1NrZWxldG9uOwpzMQAAAHR5cGVkZWYgc3RydWN0IF8lc1NrZWxldG9uQ2xhc3MgJXNTa2VsZXRvbkNsYXNzOwpzNQAAAHR5cGVkZWYgc3RydWN0IF8lc1NrZWxldG9uUHJpdmF0ZSAlc1NrZWxldG9uUHJpdmF0ZTsKcxMAAABzdHJ1Y3QgXyVzU2tlbGV0b24KcyoAAAAgIEdEQnVzSW50ZXJmYWNlU2tlbGV0b24gcGFyZW50X2luc3RhbmNlOwpzGwAAACAgJXNTa2VsZXRvblByaXZhdGUgKnByaXY7CnMYAAAAc3RydWN0IF8lc1NrZWxldG9uQ2xhc3MKcywAAAAgIEdEQnVzSW50ZXJmYWNlU2tlbGV0b25DbGFzcyBwYXJlbnRfY2xhc3M7CnMwAAAAR1R5cGUgJXNfc2tlbGV0b25fZ2V0X3R5cGUgKHZvaWQpIEdfR05VQ19DT05TVDsKcxwAAAAlcyAqJXNfc2tlbGV0b25fbmV3ICh2b2lkKTsKcy0AAAAjZGVmaW5lICVzVFlQRV9PQkpFQ1QgKCVzb2JqZWN0X2dldF90eXBlICgpKQpzUAAAACNkZWZpbmUgJXNPQkpFQ1QobykgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgobyksICVzVFlQRV9PQkpFQ1QsICVzT2JqZWN0KSkKc0kAAAAjZGVmaW5lICVzSVNfT0JKRUNUKG8pIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG8pLCAlc1RZUEVfT0JKRUNUKSkKc10AAAAjZGVmaW5lICVzT0JKRUNUX0dFVF9JRkFDRShvKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9JTlRFUkZBQ0UgKChvKSwgJXNUWVBFX09CSkVDVCwgJXNPYmplY3QpKQpzEgAAAHN0cnVjdCBfJXNPYmplY3Q7CnMjAAAAdHlwZWRlZiBzdHJ1Y3QgXyVzT2JqZWN0ICVzT2JqZWN0OwpzLQAAAHR5cGVkZWYgc3RydWN0IF8lc09iamVjdElmYWNlICVzT2JqZWN0SWZhY2U7CnMWAAAAc3RydWN0IF8lc09iamVjdElmYWNlCnMlAAAAewogIEdUeXBlSW50ZXJmYWNlIHBhcmVudF9pZmFjZTsKfTsKCnMuAAAAR1R5cGUgJXNvYmplY3RfZ2V0X3R5cGUgKHZvaWQpIEdfR05VQ19DT05TVDsKCnMoAAAAJXMgKiVzb2JqZWN0X2dldF8lcyAoJXNPYmplY3QgKm9iamVjdCk7CnMpAAAAJXMgKiVzb2JqZWN0X3BlZWtfJXMgKCVzT2JqZWN0ICpvYmplY3QpOwpzOQAAACNkZWZpbmUgJXNUWVBFX09CSkVDVF9QUk9YWSAoJXNvYmplY3RfcHJveHlfZ2V0X3R5cGUgKCkpCnNhAAAAI2RlZmluZSAlc09CSkVDVF9QUk9YWShvKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvKSwgJXNUWVBFX09CSkVDVF9QUk9YWSwgJXNPYmplY3RQcm94eSkpCnNpAAAAI2RlZmluZSAlc09CSkVDVF9QUk9YWV9DTEFTUyhrKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrKSwgJXNUWVBFX09CSkVDVF9QUk9YWSwgJXNPYmplY3RQcm94eUNsYXNzKSkKc28AAAAjZGVmaW5lICVzT0JKRUNUX1BST1hZX0dFVF9DTEFTUyhvKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG8pLCAlc1RZUEVfT0JKRUNUX1BST1hZLCAlc09iamVjdFByb3h5Q2xhc3MpKQpzVQAAACNkZWZpbmUgJXNJU19PQkpFQ1RfUFJPWFkobykgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgobyksICVzVFlQRV9PQkpFQ1RfUFJPWFkpKQpzWAAAACNkZWZpbmUgJXNJU19PQkpFQ1RfUFJPWFlfQ0xBU1MoaykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoayksICVzVFlQRV9PQkpFQ1RfUFJPWFkpKQpzLQAAAHR5cGVkZWYgc3RydWN0IF8lc09iamVjdFByb3h5ICVzT2JqZWN0UHJveHk7CnM3AAAAdHlwZWRlZiBzdHJ1Y3QgXyVzT2JqZWN0UHJveHlDbGFzcyAlc09iamVjdFByb3h5Q2xhc3M7CnM7AAAAdHlwZWRlZiBzdHJ1Y3QgXyVzT2JqZWN0UHJveHlQcml2YXRlICVzT2JqZWN0UHJveHlQcml2YXRlOwpzFgAAAHN0cnVjdCBfJXNPYmplY3RQcm94eQpzJAAAACAgR0RCdXNPYmplY3RQcm94eSBwYXJlbnRfaW5zdGFuY2U7CnMeAAAAICAlc09iamVjdFByb3h5UHJpdmF0ZSAqcHJpdjsKcxsAAABzdHJ1Y3QgXyVzT2JqZWN0UHJveHlDbGFzcwpzJgAAACAgR0RCdXNPYmplY3RQcm94eUNsYXNzIHBhcmVudF9jbGFzczsKczMAAABHVHlwZSAlc29iamVjdF9wcm94eV9nZXRfdHlwZSAodm9pZCkgR19HTlVDX0NPTlNUOwpzWwAAACVzT2JqZWN0UHJveHkgKiVzb2JqZWN0X3Byb3h5X25ldyAoR0RCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLCBjb25zdCBnY2hhciAqb2JqZWN0X3BhdGgpOwpzPwAAACNkZWZpbmUgJXNUWVBFX09CSkVDVF9TS0VMRVRPTiAoJXNvYmplY3Rfc2tlbGV0b25fZ2V0X3R5cGUgKCkpCnNqAAAAI2RlZmluZSAlc09CSkVDVF9TS0VMRVRPTihvKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvKSwgJXNUWVBFX09CSkVDVF9TS0VMRVRPTiwgJXNPYmplY3RTa2VsZXRvbikpCnNyAAAAI2RlZmluZSAlc09CSkVDVF9TS0VMRVRPTl9DTEFTUyhrKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrKSwgJXNUWVBFX09CSkVDVF9TS0VMRVRPTiwgJXNPYmplY3RTa2VsZXRvbkNsYXNzKSkKc3gAAAAjZGVmaW5lICVzT0JKRUNUX1NLRUxFVE9OX0dFVF9DTEFTUyhvKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG8pLCAlc1RZUEVfT0JKRUNUX1NLRUxFVE9OLCAlc09iamVjdFNrZWxldG9uQ2xhc3MpKQpzWwAAACNkZWZpbmUgJXNJU19PQkpFQ1RfU0tFTEVUT04obykgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgobyksICVzVFlQRV9PQkpFQ1RfU0tFTEVUT04pKQpzXgAAACNkZWZpbmUgJXNJU19PQkpFQ1RfU0tFTEVUT05fQ0xBU1MoaykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoayksICVzVFlQRV9PQkpFQ1RfU0tFTEVUT04pKQpzMwAAAHR5cGVkZWYgc3RydWN0IF8lc09iamVjdFNrZWxldG9uICVzT2JqZWN0U2tlbGV0b247CnM9AAAAdHlwZWRlZiBzdHJ1Y3QgXyVzT2JqZWN0U2tlbGV0b25DbGFzcyAlc09iamVjdFNrZWxldG9uQ2xhc3M7CnNBAAAAdHlwZWRlZiBzdHJ1Y3QgXyVzT2JqZWN0U2tlbGV0b25Qcml2YXRlICVzT2JqZWN0U2tlbGV0b25Qcml2YXRlOwpzGQAAAHN0cnVjdCBfJXNPYmplY3RTa2VsZXRvbgpzJwAAACAgR0RCdXNPYmplY3RTa2VsZXRvbiBwYXJlbnRfaW5zdGFuY2U7CnMhAAAAICAlc09iamVjdFNrZWxldG9uUHJpdmF0ZSAqcHJpdjsKcx4AAABzdHJ1Y3QgXyVzT2JqZWN0U2tlbGV0b25DbGFzcwpzKQAAACAgR0RCdXNPYmplY3RTa2VsZXRvbkNsYXNzIHBhcmVudF9jbGFzczsKczYAAABHVHlwZSAlc29iamVjdF9za2VsZXRvbl9nZXRfdHlwZSAodm9pZCkgR19HTlVDX0NPTlNUOwpzRAAAACVzT2JqZWN0U2tlbGV0b24gKiVzb2JqZWN0X3NrZWxldG9uX25ldyAoY29uc3QgZ2NoYXIgKm9iamVjdF9wYXRoKTsKc0oAAAB2b2lkICVzb2JqZWN0X3NrZWxldG9uX3NldF8lcyAoJXNPYmplY3RTa2VsZXRvbiAqb2JqZWN0LCAlcyAqaW50ZXJmYWNlXyk7CnNLAAAAI2RlZmluZSAlc1RZUEVfT0JKRUNUX01BTkFHRVJfQ0xJRU5UICglc29iamVjdF9tYW5hZ2VyX2NsaWVudF9nZXRfdHlwZSAoKSkKc3sAAAAjZGVmaW5lICVzT0JKRUNUX01BTkFHRVJfQ0xJRU5UKG8pIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG8pLCAlc1RZUEVfT0JKRUNUX01BTkFHRVJfQ0xJRU5ULCAlc09iamVjdE1hbmFnZXJDbGllbnQpKQpzgwAAACNkZWZpbmUgJXNPQkpFQ1RfTUFOQUdFUl9DTElFTlRfQ0xBU1MoaykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoayksICVzVFlQRV9PQkpFQ1RfTUFOQUdFUl9DTElFTlQsICVzT2JqZWN0TWFuYWdlckNsaWVudENsYXNzKSkKc4kAAAAjZGVmaW5lICVzT0JKRUNUX01BTkFHRVJfQ0xJRU5UX0dFVF9DTEFTUyhvKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG8pLCAlc1RZUEVfT0JKRUNUX01BTkFHRVJfQ0xJRU5ULCAlc09iamVjdE1hbmFnZXJDbGllbnRDbGFzcykpCnNnAAAAI2RlZmluZSAlc0lTX09CSkVDVF9NQU5BR0VSX0NMSUVOVChvKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvKSwgJXNUWVBFX09CSkVDVF9NQU5BR0VSX0NMSUVOVCkpCnNqAAAAI2RlZmluZSAlc0lTX09CSkVDVF9NQU5BR0VSX0NMSUVOVF9DTEFTUyhrKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrKSwgJXNUWVBFX09CSkVDVF9NQU5BR0VSX0NMSUVOVCkpCnM9AAAAdHlwZWRlZiBzdHJ1Y3QgXyVzT2JqZWN0TWFuYWdlckNsaWVudCAlc09iamVjdE1hbmFnZXJDbGllbnQ7CnNHAAAAdHlwZWRlZiBzdHJ1Y3QgXyVzT2JqZWN0TWFuYWdlckNsaWVudENsYXNzICVzT2JqZWN0TWFuYWdlckNsaWVudENsYXNzOwpzSwAAAHR5cGVkZWYgc3RydWN0IF8lc09iamVjdE1hbmFnZXJDbGllbnRQcml2YXRlICVzT2JqZWN0TWFuYWdlckNsaWVudFByaXZhdGU7CnMeAAAAc3RydWN0IF8lc09iamVjdE1hbmFnZXJDbGllbnQKcywAAAAgIEdEQnVzT2JqZWN0TWFuYWdlckNsaWVudCBwYXJlbnRfaW5zdGFuY2U7CnMmAAAAICAlc09iamVjdE1hbmFnZXJDbGllbnRQcml2YXRlICpwcml2OwpzIwAAAHN0cnVjdCBfJXNPYmplY3RNYW5hZ2VyQ2xpZW50Q2xhc3MKcy4AAAAgIEdEQnVzT2JqZWN0TWFuYWdlckNsaWVudENsYXNzIHBhcmVudF9jbGFzczsKczwAAABHVHlwZSAlc29iamVjdF9tYW5hZ2VyX2NsaWVudF9nZXRfdHlwZSAodm9pZCkgR19HTlVDX0NPTlNUOwpznQAAAEdUeXBlICVzb2JqZWN0X21hbmFnZXJfY2xpZW50X2dldF9wcm94eV90eXBlIChHREJ1c09iamVjdE1hbmFnZXJDbGllbnQgKm1hbmFnZXIsIGNvbnN0IGdjaGFyICpvYmplY3RfcGF0aCwgY29uc3QgZ2NoYXIgKmludGVyZmFjZV9uYW1lLCBncG9pbnRlciB1c2VyX2RhdGEpOwpzNwEAAHZvaWQgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3ICgKICAgIEdEQnVzQ29ubmVjdGlvbiAgICAgICAgKmNvbm5lY3Rpb24sCiAgICBHREJ1c09iamVjdE1hbmFnZXJDbGllbnRGbGFncyAgZmxhZ3MsCiAgICBjb25zdCBnY2hhciAgICAgICAgICAgICpuYW1lLAogICAgY29uc3QgZ2NoYXIgICAgICAgICAgICAqb2JqZWN0X3BhdGgsCiAgICBHQ2FuY2VsbGFibGUgICAgICAgICAgICpjYW5jZWxsYWJsZSwKICAgIEdBc3luY1JlYWR5Q2FsbGJhY2sgICAgIGNhbGxiYWNrLAogICAgZ3BvaW50ZXIgICAgICAgICAgICAgICAgdXNlcl9kYXRhKTsKc3gAAABHREJ1c09iamVjdE1hbmFnZXIgKiVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ld19maW5pc2ggKAogICAgR0FzeW5jUmVzdWx0ICAgICAgICAqcmVzLAogICAgR0Vycm9yICAgICAgICAgICAgICoqZXJyb3IpOwpzIQEAAEdEQnVzT2JqZWN0TWFuYWdlciAqJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X3N5bmMgKAogICAgR0RCdXNDb25uZWN0aW9uICAgICAgICAqY29ubmVjdGlvbiwKICAgIEdEQnVzT2JqZWN0TWFuYWdlckNsaWVudEZsYWdzICBmbGFncywKICAgIGNvbnN0IGdjaGFyICAgICAgICAgICAgKm5hbWUsCiAgICBjb25zdCBnY2hhciAgICAgICAgICAgICpvYmplY3RfcGF0aCwKICAgIEdDYW5jZWxsYWJsZSAgICAgICAgICAgKmNhbmNlbGxhYmxlLAogICAgR0Vycm9yICAgICAgICAgICAgICAgICoqZXJyb3IpOwpzPQEAAHZvaWQgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X2Zvcl9idXMgKAogICAgR0J1c1R5cGUgICAgICAgICAgICAgICAgYnVzX3R5cGUsCiAgICBHREJ1c09iamVjdE1hbmFnZXJDbGllbnRGbGFncyAgZmxhZ3MsCiAgICBjb25zdCBnY2hhciAgICAgICAgICAgICpuYW1lLAogICAgY29uc3QgZ2NoYXIgICAgICAgICAgICAqb2JqZWN0X3BhdGgsCiAgICBHQ2FuY2VsbGFibGUgICAgICAgICAgICpjYW5jZWxsYWJsZSwKICAgIEdBc3luY1JlYWR5Q2FsbGJhY2sgICAgIGNhbGxiYWNrLAogICAgZ3BvaW50ZXIgICAgICAgICAgICAgICAgdXNlcl9kYXRhKTsKc4AAAABHREJ1c09iamVjdE1hbmFnZXIgKiVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ld19mb3JfYnVzX2ZpbmlzaCAoCiAgICBHQXN5bmNSZXN1bHQgICAgICAgICpyZXMsCiAgICBHRXJyb3IgICAgICAgICAgICAgKiplcnJvcik7CnMnAQAAR0RCdXNPYmplY3RNYW5hZ2VyIColc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXdfZm9yX2J1c19zeW5jICgKICAgIEdCdXNUeXBlICAgICAgICAgICAgICAgIGJ1c190eXBlLAogICAgR0RCdXNPYmplY3RNYW5hZ2VyQ2xpZW50RmxhZ3MgIGZsYWdzLAogICAgY29uc3QgZ2NoYXIgICAgICAgICAgICAqbmFtZSwKICAgIGNvbnN0IGdjaGFyICAgICAgICAgICAgKm9iamVjdF9wYXRoLAogICAgR0NhbmNlbGxhYmxlICAgICAgICAgICAqY2FuY2VsbGFibGUsCiAgICBHRXJyb3IgICAgICAgICAgICAgICAgKiplcnJvcik7CigAAAAAKCMAAABSCwAAAFIMAAAAUhwAAABSGAAAAFITAAAAdAoAAABuYW1lX3VwcGVydAoAAABuYW1lX2xvd2VydAoAAABjYW1lbF9uYW1lUg8AAAB0BwAAAG1ldGhvZHN0BQAAAEZhbHNlUgEAAAB0EQAAAGxvb2t1cF9hbm5vdGF0aW9udAsAAABhbm5vdGF0aW9uc3QEAAAAVHJ1ZXQFAAAAc2luY2V0BwAAAGluX2FyZ3N0CAAAAGN0eXBlX2ludAcAAABzaWduYWxzdAQAAABhcmdzdAoAAABwcm9wZXJ0aWVzdAMAAABhcmd0BgAAAHNvcnRlZHQEAAAAa2V5c3QPAAAAdmVyc2lvbl9jbXBfa2V5dAoAAABkZXByZWNhdGVkdAgAAABvdXRfYXJnc3QJAAAAY3R5cGVfb3V0dAkAAABmcmVlX2Z1bmN0BAAAAE5vbmV0DAAAAGN0eXBlX2luX2R1cFIKAAAAUhUAAABSDgAAAFIUAAAAKAoAAABSGgAAAHQBAAAAaXQRAAAAZnVuY3Rpb25fcG9pbnRlcnN0AQAAAG10BwAAAHVuaXhfZmRSHwAAAHQFAAAAdmFsdWV0AQAAAGF0AQAAAHN0AQAAAHAoAAAAACgAAAAAcyYAAAAvdXNyL3NoYXJlL2dsaWItMi4wL2NvZGVnZW4vY29kZWdlbi5weXQNAAAAZGVjbGFyZV90eXBlc+0AAABz1AIAAAABEAEQARABFwEQAyYBMgEsATIBEAEXASABIAEQARcBEAEQAgYDFQEQARABBgEVAQkBFgENAREBDgEGAQ0BEAEeAQoBEQMVARABEAEWAQ0BEQEQAR4BCgERAxUBEAEQARYBHwERCyIBHAIQARABFwEQARcBFwEQAxUBEAEQARABBgEVAQkBCQETAQwCGgEGARMBEAEkARABFAETAxUBEAEQARABCQETAQwBGgEQASQBEAEUARMDFQEQARABEAEGARUBCQIJARMBDAEaARABJAEGARMBEAQQAgkBEwEMARoBEAEkAQYBEwEQAxACCQETAQwBGgEQASQBBgETARABJAEGARMBEAMUARMDFQEQARABEAIJARMBLwESAQkBEwEyAgkBEwEvARcDEAEQARABJgEyATIBMgEsASwBEAEgASABIAEQARcBEAEQARABFwEQARABFwEQARABEAEQARcCEAEJARMBDAgLAQkBEwEMAxQBCQETAQwHFAEQAQkBEwEMCAsBCQETAQwDFAEJARMBDAcUARADEAEQARABJgEyATIBMgEsASwBEAEgASABIAEQARcBEAEQARABFwEQARABFwEQARABEAEQARcBEAEJARMBIAIUAwkBEAEQARABIAEmASABJgEQARcBIAEgARABFwEQBAwCCwEQAQkBEwEMASoBEAEJARMBDAEqARABIAEmASYBJgEgASABEAEgASABIAEQARcBEAEQARABFwEQARABFwEQARABEAEQARcBIAEQASABJgEmASYBIAEgARABIAEgASABEAEXARABEAEQARcBEAEQARcBEAEQARABEAEXAQwBFAEQAQkBEwEMASoBEAIQARABIAEmASYBJgEgASABEAEgASABIAEQARcBEAEQARABFwEQARABFwEQARABEAEQARcBEAEXARABDAgLAQwDCwEMBwsBEAEMCAsBDAMLAQwHCwFjAQAAAAEAAAADAAAAQwAAAHMbAAAAfAAAagAAagEAZAEAfAAAagIAFoMBAAFkAABTKAIAAABOcyIAAAAKR19FTkRfREVDTFMKCiNlbmRpZiAvKiBfXyVzX18gKi8KKAMAAABSDAAAAFIcAAAAUhkAAAAoAQAAAFIaAAAAKAAAAAAoAAAAAHMmAAAAL3Vzci9zaGFyZS9nbGliLTIuMC9jb2RlZ2VuL2NvZGVnZW4ucHl0DgAAAGdlbmVyYXRlX291dHJvzQIAAHMEAAAAAAEMA2MDAAAABgAAAAcAAABDAAAAc0sBAAB8AgBkAABrAgByEABkAABTZAEAfQMAeKgAfAIARF2gAH0EAHwEAGoBAGoCAGQCAIMBAHI7AHEdAG4AAHwAAGoDAGoEAGQDAHwBAHwDAHwEAGoBAHwEAGoFAGYEABaDAQABdAYAfAQAagcAgwEAZAEAawIAcokAfAAAagMAagQA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IE5VTEwKfTsKCnMWAAAAXyVzX3NpZ25hbF9pbmZvXyVzX0FSR3MdAAAAXyVzX3NpZ25hbF8lc19hbm5vdGF0aW9uX2luZm9zXQAAAHN0YXRpYyBjb25zdCBfRXh0ZW5kZWRHREJ1c1NpZ25hbEluZm8gXyVzX3NpZ25hbF9pbmZvXyVzID0KewogIHsKICAgIC0xLAogICAgKGdjaGFyICopICIlcyIsCnM4AAAAICAgIChHREJ1c0FyZ0luZm8gKiopICZfJXNfc2lnbmFsX2luZm9fJXNfQVJHX3BvaW50ZXJzLApzRQAAACAgICAoR0RCdXNBbm5vdGF0aW9uSW5mbyAqKikgJl8lc19zaWduYWxfJXNfYW5ub3RhdGlvbl9pbmZvX3BvaW50ZXJzCnMMAAAAICB9LAogICIlcyIKc00AAABzdGF0aWMgY29uc3QgX0V4dGVuZGVkR0RCdXNTaWduYWxJbmZvICogY29uc3QgXyVzX3NpZ25hbF9pbmZvX3BvaW50ZXJzW10gPQp7CnMXAAAAICAmXyVzX3NpZ25hbF9pbmZvXyVzLApzSQAAAEdfREJVU19QUk9QRVJUWV9JTkZPX0ZMQUdTX1JFQURBQkxFIHwgR19EQlVTX1BST1BFUlRZX0lORk9fRkxBR1NfV1JJVEFCTEV0IwAAAEdfREJVU19QUk9QRVJUWV9JTkZPX0ZMQUdTX1JFQURBQkxFdCMAAABHX0RCVVNfUFJPUEVSVFlfSU5GT19GTEFHU19XUklUQUJMRXQfAAAAR19EQlVTX1BST1BFUlRZX0lORk9fRkxBR1NfTk9ORXMfAAAAXyVzX3Byb3BlcnR5XyVzX2Fubm90YXRpb25faW5mb3N9AAAAc3RhdGljIGNvbnN0IF9FeHRlbmRlZEdEQnVzUHJvcGVydHlJbmZvIF8lc19wcm9wZXJ0eV9pbmZvXyVzID0KewogIHsKICAgIC0xLAogICAgKGdjaGFyICopICIlcyIsCiAgICAoZ2NoYXIgKikgIiVzIiwKICAgICVzLApzRwAAACAgICAoR0RCdXNBbm5vdGF0aW9uSW5mbyAqKikgJl8lc19wcm9wZXJ0eV8lc19hbm5vdGF0aW9uX2luZm9fcG9pbnRlcnMKcw0AAAAgIH0sCiAgIiVzIiwKcx0AAABvcmcuZ3RrLkdEQnVzLkMuRm9yY2VHVmFyaWFudHMIAAAAICBGQUxTRQpzBwAAACAgVFJVRQpzUQAAAHN0YXRpYyBjb25zdCBfRXh0ZW5kZWRHREJ1c1Byb3BlcnR5SW5mbyAqIGNvbnN0IF8lc19wcm9wZXJ0eV9pbmZvX3BvaW50ZXJzW10gPQp7CnMZAAAAICAmXyVzX3Byb3BlcnR5X2luZm9fJXMsCnMTAAAAXyVzX2Fubm90YXRpb25faW5mb3NgAAAAc3RhdGljIGNvbnN0IF9FeHRlbmRlZEdEQnVzSW50ZXJmYWNlSW5mbyBfJXNfaW50ZXJmYWNlX2luZm8gPQp7CiAgewogICAgLTEsCiAgICAoZ2NoYXIgKikgIiVzIiwKczQAAAAgICAgKEdEQnVzTWV0aG9kSW5mbyAqKikgJl8lc19tZXRob2RfaW5mb19wb2ludGVycywKczQAAAAgICAgKEdEQnVzU2lnbmFsSW5mbyAqKikgJl8lc19zaWduYWxfaW5mb19wb2ludGVycywKczgAAAAgICAgKEdEQnVzUHJvcGVydHlJbmZvICoqKSAmXyVzX3Byb3BlcnR5X2luZm9fcG9pbnRlcnMsCnM7AAAAICAgIChHREJ1c0Fubm90YXRpb25JbmZvICoqKSAmXyVzX2Fubm90YXRpb25faW5mb19wb2ludGVycwpzEQAAACAgfSwKICAiJXMiLAp9OwoKcwEAAAAKc6QAAAAvKioKICogJXNfaW50ZXJmYWNlX2luZm86CiAqCiAqIEdldHMgYSBtYWNoaW5lLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSAjJXMgRC1CdXMgaW50ZXJmYWNlLgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgbm9uZSk6IEEgI0dEQnVzSW50ZXJmYWNlSW5mby4gRG8gbm90IGZyZWUuCnN2AAAAR0RCdXNJbnRlcmZhY2VJbmZvICoKJXNfaW50ZXJmYWNlX2luZm8gKHZvaWQpCnsKICByZXR1cm4gKEdEQnVzSW50ZXJmYWNlSW5mbyAqKSAmXyVzX2ludGVyZmFjZV9pbmZvLnBhcmVudF9zdHJ1Y3Q7Cn0KCnNvAQAALyoqCiAqICVzX292ZXJyaWRlX3Byb3BlcnRpZXM6CiAqIEBrbGFzczogVGhlIGNsYXNzIHN0cnVjdHVyZSBmb3IgYSAjR09iamVjdDwhLS0gLS0+LWRlcml2ZWQgY2xhc3MuCiAqIEBwcm9wZXJ0eV9pZF9iZWdpbjogVGhlIHByb3BlcnR5IGlkIHRvIGFzc2lnbiB0byB0aGUgZmlyc3Qgb3ZlcnJpZGRlbiBwcm9wZXJ0eS4KICoKICogT3ZlcnJpZGVzIGFsbCAjR09iamVjdCBwcm9wZXJ0aWVzIGluIHRoZSAjJXMgaW50ZXJmYWNlIGZvciBhIGNvbmNyZXRlIGNsYXNzLgogKiBUaGUgcHJvcGVydGllcyBhcmUgb3ZlcnJpZGRlbiBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZGVmaW5lZC4KICoKICogUmV0dXJuczogVGhlIGxhc3QgcHJvcGVydHkgaWQuCnNOAAAAZ3VpbnQKJXNfb3ZlcnJpZGVfcHJvcGVydGllcyAoR09iamVjdENsYXNzICprbGFzcywgZ3VpbnQgcHJvcGVydHlfaWRfYmVnaW4pCnsKc0cAAAAgIGdfb2JqZWN0X2NsYXNzX292ZXJyaWRlX3Byb3BlcnR5IChrbGFzcywgcHJvcGVydHlfaWRfYmVnaW4rKywgIiVzIik7CnMjAAAAICByZXR1cm4gcHJvcGVydHlfaWRfYmVnaW4gLSAxOwp9CgooGwAAAFINAAAAUhwAAABSGAAAAFIPAAAAUiMAAABSJAAAAFIBAAAAUiUAAABSJgAAAFInAAAAUkgAAABSIQAAAFIpAAAAUjMAAABSRQAAAHQLAAAAbmFtZV9oeXBoZW5SKwAAAFIsAAAAUi0AAAB0CAAAAHJlYWRhYmxldAgAAAB3cml0YWJsZVIuAAAAUkYAAABSCQAAAHQGAAAAZXhwYW5kdCsAAAB3cml0ZV9ndGtkb2NfZGVwcmVjYXRlZF9hbmRfc2luY2VfYW5kX2Nsb3NlUiIAAAAoCAAAAFIaAAAAUjgAAABSOgAAAFI7AAAAUkcAAABSPgAAAFI/AAAAdAYAAABhY2Nlc3MoAAAAACgAAAAAcyYAAAAvdXNyL3NoYXJlL2dsaWItMi4wL2NvZGVnZW4vY29kZWdlbi5weXQkAAAAZ2VuZXJhdGVfaW50cm9zcGVjdGlvbl9mb3JfaW50ZXJmYWNlGwMAAHPaAAAAAAEMAQsCFQEQAQYBFQEJASMBIwIlAgwEGgEVARMCIAEVARMCIAEMARMCIAEMAx0BFAMMAQsBEAEkARMGFQEQASMCJQEMBBoBFQETAiABDAETAiABDAILARQDDAELARABJAETBhUBEAESAQkBCQEJAQkBCQIGASUBDAYmAQwBEwIgAQwCCwEVARMCEAEUAwwBCwEQASQBEwQcAQwEFAEVARMCFwEVARMCFwEVARMCFwEMARMCFwEMBAsBEAESAQMGGgEWAQwFFAISAQMJGgEWAQwCCwEQARsBEANjAgAAAAwAAAAKAAAAQwAAAHOlCgAAfAAAagAAagEAZAEAgwEAAXwAAGoAAGoBAHwAAGoCAGoDAGQCAHwBAGoEAHwBAGoFAGYCABZ0BgCDAgCDAQABfAAAagcAfAEAfAAAagAAZAMAgwMAAXwAAGoAAGoBAGQBAIMBAAF8AABqAABqAQB8AABqAgBqAwBkBAB8AQBqBAAWdAYAgwIAgwEAAWkAAH0CAHQIAHwBAGoJAIMBAGQDAGsEAHIEAXhbAHwBAGoJAERdTQB9AwB8AwBqCgBkBQB8AwBqCwAWZgIAfQQAZAYAfAMAagsAFn0FAHwFAGQHAHwBAGoEAHwDAGoMAGYCABY3fQUAfAUAfAIAfAQAPHGwAFduAAB0CAB8AQBqDQCDAQBkAwBrBABydwF4WwB8AQBqDQBEXU0AfQYAfAYAagoAZAgAfAYAagsAFmYCAH0EAGQJAHwGAGoLABZ9BQB8BQBkCgB8AQBqBAB8BgBqDABmAgAWN30FAHwFAHwCAHwEADxxIwFXbgAAdAgAfAEAag4AgwEAZAMAawQAcuoBeFsAfAEAag4ARF1NAH0HAHwHAGoKAGQLAHwHAGoLABZmAgB9BABkDAB8BwBqCwAWfQUAfAUAZA0AfAEAagQAfAcAagwAZgIAFjd9BQB8BQB8AgB8BAA8cZYBV24AAHg7AHQPAHwCAGoQAIMAAGQOAHQRAGoSAIMBAURdHgB9BAB8AABqAABqAQBkDwB8AgB8BAAZFoMBAAFxBgJXfAAAagAAagEAfAAAagIAagMAZBAAfAEAagUAFnQGAIMCAIMBAAF8AABqBwB8AQB8AABqAABkAwCDAwABfAAAagAAagEAZAEAgwEAAXwAAGoAAGoBAGQRAHwBAGoEAHwBAGoEAGYCABaDAQABfAAAagAAagEAZBIAfAEAagQAfAEAagsAZgIAFoMBAAF8AABqAABqAQBkAQCDAQABfAAAagAAagEAZBMAfAEAagsAfAEAagQAZgIAFoMBAAF0CAB8AQBqCQCDAQBkAwBrBAByvQR8AABqAABqAQBkFACDAQABeLEBfAEAagkARF2jAX0DAHQGAH0IAHQRAGoTAHwDAGoUAGQVAIMCAHI9A3QVAH0IAG4AAHwAAGoAAGoBAHwAAGoCAGoDAGQWAHwBAGoEAHwDAGoMAHwBAGoEAGYDABZ0BgCDAgCDAQABfAgAcosDfAAAagAAagEAZBcAgwEAAW4AAHgoAHwDAGoWAERdHQB9CQB8AABqAABqAQBkGAB8CQBqBQAWgwEAAXGVA1d8AABqAABqAQB8AABqAgBqAwBkGQB8AQBqBQB8AwBqBQB8AQBqCwB8AwBqCwBmBAAWdAYAgwIAgwEAAXwAAGoHAHwDAHwAAGoAAGQaAIMDAAF8CAByFgRkGgB9CgBuBgBkGwB9CgB8AABqAABqAQBkHAB8AwBqDAB8AQBqBAB8AwBqCwB0CAB8AwBqFgCDAQB8CgAXZgQAFoMBAAF8CAByawR8AABqAABqAQBkHQCDAQABbgAAeCgAfAMAahYARF0dAH0JAHwAAGoAAGoBAGQeAHwJAGoXABaDAQABcXUEV3wAAGoAAGoBAGQfAIMBAAF8AABqAABqAQBkAQCDAQABcRMDV24AAHQIAHwBAGoNAIMBAGQDAGsEAHIbBnwAAGoAAGoBAGQgAIMBAAF4NgF8AQBqDQBEXSgBfQYAfAAAagAAagEAfAAAagIAagMAZCEAfAEAagQAfAYAagwAfAEAagQAZgMAFnQGAIMCAIMBAAF4KAB8BgBqGABEXR0AfQkAfAAAagAAagEAZCIAfAkAagUAFoMBAAFxMQVXfAAAagAAagEAfAAAagIAagMAZCMAfAEAagUAfAYAagUAZgIAFnQGAIMCAIMBAAF8AABqBwB8BgB8AABqAABkGgCDAwABfAAAagAAagEAZCQAfAYAagwAfAEAagQAfAYAagsAdAgAfAYAahgAgwEAZgQAFoMBAAF4KAB8BgBqGABEXR0AfQkAfAAAagAAagEAZB4AfAkAahcAFoMBAAFx0wVXfAAAagAAagEAZB8AgwEAAXwAAGoAAGoBAGQBAIMBAAFx7ARXbgAAdAgAfAEAag4AgwEAZAMAawQAcpEKfAAAagAAagEAZCUAgwEAAXhOBHwBAGoOAERdQAR9BwB8BwBqGQByawZ8BwBqGgByawZkJgB9CwBuNwB8BwBqGQByfQZkJwB9CwBuJQB8BwBqGgByjwZkKAB9CwBuEwB0GwBkKQB8BwBqBQAWgwEAggEAfAAAagAAagEAfAAAagIAagMAZCoAfAEAagQAfAcAagwAfAEAagUAfAcAagUAfAsAZgUAFnQGAIMCAIMBAAF8AABqBwB8BwB8AABqAABkGgCDAwABfAAAagAAagEAZCsAgwEAAXwHAGocAGoXAGQsAGsCAHJAB2QtAHwHAGoMAHwHAGoFAHwHAGoFAHwHAGocAGodAGYEABZ9BgBuJgN8BwBqHABqHQBkLgBrAgBycQdkLwB8BwBqDAB8BwBqBQB8BwBqBQBmAwAWfQYAbvUCfAcAahwAah0AZDAAawIAcqIHZDEAfAcAagwAfAcAagUAfAcAagUAZgMAFn0GAG7EAnwHAGocAGodAGQyAGsCAHLTB2QzAHwHAGoMAHwHAGoFAHwHAGoFAGYDABZ9BgBukwJ8BwBqHABqHQBkNABrAgByBAhkNQB8BwBqDAB8BwBqBQB8BwBqBQBmAwAWfQYAbmICfAcAahwAah0AZDYAawIAcjUIZDcAfAcAagwAfAcAagUAfAcAagUAZgMAFn0GAG4xAnwHAGocAGodAGQ4AGsCAHJmCGQ5AHwHAGoMAHwHAGoFAHwHAGoFAGYDABZ9BgBuAAJ8BwBqHABqHQBkOgBrAgBylwhkOwB8BwBqDAB8BwBqBQB8BwBqBQBmAwAWfQYAbs8BfAcAahwAah0AZDwAawIAcsgIZD0AfAcAagwAfAcAagUAfAcAagUAZgMAFn0GAG6eAXwHAGocAGodAGQ+AGsCAHL5CGQ/AHwHAGoMAHwHAGoFAHwHAGoFAGYDABZ9BgBubQF8BwBqHABqHQBkQABrAgByKglkQQB8BwBqDAB8BwBqBQB8BwBqBQBmAwAWfQYAbjwBfAcAahwAah0AZEIAawIAclsJZEEAfAcAagwAfAcAagUAfAcAagUAZgMAFn0GAG4LAXwHAGocAGodAGRDAGsCAHKMCWRBAHwHAGoMAHwHAGoFAHwHAGoFAGYDABZ9BgBu2gB8BwBqHABqHQBkRABrAgByvQlkQQB8BwBqDAB8BwBqBQB8BwBqBQBmAwAWfQYAbqkAfAcAahwAah0AZEUAawIAcu4JZEYAfAcAagwAfAcAagUAfAcAagUAZgMAFn0GAG54AHwHAGocAGodAGRHAGsCAHIfCmRGAHwHAGoMAHwHAGoFAHwHAGoFAGYDABZ9BgBuRwB8BwBqHABqHQBkSABrAgByUApkRgB8BwBqDAB8BwBqBQB8BwBqBQBmAwAWfQYAbhYAdBsAZEkAfAcAahwAahcAFoMBAIIBAHwAAGoAAGoBAGRKAHwGABaDAQABfAAAagAAagEAZAEAgwEAAXFKBlduAAB8AABqAABqAQBkSwCDAQABZAAAUyhMAAAATnMBAAAACnNGAAAALyoqCiAqICVzOgogKgogKiBBYnN0cmFjdCBpbnRlcmZhY2UgdHlwZSBmb3IgdGhlIEQtQnVzIGludGVyZmFjZSAjJXMuCmkAAAAAczgAAAAvKioKICogJXNJZmFjZToKICogQHBhcmVudF9pZmFjZTogVGhlIHBhcmVudCBpbnRlcmZhY2UuCnMKAAAAX21ldGhvZF8lc3MMAAAAQGhhbmRsZV8lczogcyYAAABIYW5kbGVyIGZvciB0aGUgIyVzOjpoYW5kbGUtJXMgc2lnbmFsLnMKAAAAX3NpZ25hbF8lc3MFAAAAQCVzOiBzHwAAAEhhbmRsZXIgZm9yIHRoZSAjJXM6OiVzIHNpZ25hbC5zDAAAAF9wcm9wX2dldF8lc3MJAAAAQGdldF8lczogcx8AAABHZXR0ZXIgZm9yIHRoZSAjJXM6JXMgcHJvcGVydHkuUh8AAABzBgAAACAqICVzCnMxAAAAICoKICogVmlydHVhbCB0YWJsZSBmb3IgdGhlIEQtQnVzIGludGVyZmFjZSAjJXMuCnMdAAAAdHlwZWRlZiAlc0lmYWNlICVzSW50ZXJmYWNlOwpzLAAAAEdfREVGSU5FX0lOVEVSRkFDRSAoJXMsICVzLCBHX1RZUEVfT0JKRUNUKTsKcy8AAABzdGF0aWMgdm9pZAolc19kZWZhdWx0X2luaXQgKCVzSWZhY2UgKmlmYWNlKQp7CnM5AAAAICAvKiBHT2JqZWN0IHNpZ25hbHMgZm9yIGluY29taW5nIEQtQnVzIG1ldGhvZCBjYWxsczogKi8KcxYAAABvcmcuZ3RrLkdEQnVzLkMuVW5peEZEc1sAAAAgIC8qKgogICAqICVzOjpoYW5kbGUtJXM6CiAgICogQG9iamVjdDogQSAjJXMuCiAgICogQGludm9jYXRpb246IEEgI0dEQnVzTWV0aG9kSW52b2NhdGlvbi4KczYAAAAgICAqIEBmZF9saXN0OiAoYWxsb3ctbm9uZSk6IEEgI0dVbml4RkRMaXN0IG9yICVOVUxMLgpzMAAAACAgICogQGFyZ18lczogQXJndW1lbnQgcGFzc2VkIGJ5IHJlbW90ZSBjYWxsZXIuCnMnAgAAICAgKgogICAqIFNpZ25hbCBlbWl0dGVkIHdoZW4gYSByZW1vdGUgY2FsbGVyIGlzIGludm9raW5nIHRoZSAlcy4lcygpIEQtQnVzIG1ldGhvZC4KICAgKgogICAqIElmIGEgc2lnbmFsIGhhbmRsZXIgcmV0dXJucyAlJVRSVUUsIGl0IG1lYW5zIHRoZSBzaWduYWwgaGFuZGxlciB3aWxsIGhhbmRsZSB0aGUgaW52b2NhdGlvbiAoZS5nLiB0YWtlIGEgcmVmZXJlbmNlIHRvIEBpbnZvY2F0aW9uIGFuZCBldmVudHVhbGx5IGNhbGwgJXNfY29tcGxldGVfJXMoKSBvciBlLmcuIGdfZGJ1c19tZXRob2RfaW52b2NhdGlvbl9yZXR1cm5fZXJyb3IoKSBvbiBpdCkgYW5kIG5vIG9yZGVyIHNpZ25hbCBoYW5kbGVycyB3aWxsIHJ1bi4gSWYgbm8gc2lnbmFsIGhhbmRsZXIgaGFuZGxlcyB0aGUgaW52b2NhdGlvbiwgdGhlICUlR19EQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EIGVycm9yIGlzIHJldHVybmVkLgogICAqCiAgICogUmV0dXJuczogJSVUUlVFIGlmIHRoZSBpbnZvY2F0aW9uIHdhcyBoYW5kbGVkLCAlJUZBTFNFIHRvIGxldCBvdGhlciBzaWduYWwgaGFuZGxlcnMgcnVuLgppAgAAAGkBAAAAcw8BAAAgIGdfc2lnbmFsX25ldyAoImhhbmRsZS0lcyIsCiAgICBHX1RZUEVfRlJPTV9JTlRFUkZBQ0UgKGlmYWNlKSwKICAgIEdfU0lHTkFMX1JVTl9MQVNULAogICAgR19TVFJVQ1RfT0ZGU0VUICglc0lmYWNlLCBoYW5kbGVfJXMpLAogICAgZ19zaWduYWxfYWNjdW11bGF0b3JfdHJ1ZV9oYW5kbGVkLAogICAgTlVMTCwKICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLAogICAgR19UWVBFX0JPT0xFQU4sCiAgICAlZCwKICAgIEdfVFlQRV9EQlVTX01FVEhPRF9JTlZPQ0FUSU9OcxUAAAAsIEdfVFlQRV9VTklYX0ZEX0xJU1RzBAAAACwgJXNzAwAAACk7CnM0AAAAICAvKiBHT2JqZWN0IHNpZ25hbHMgZm9yIHJlY2VpdmVkIEQtQnVzIHNpZ25hbHM6ICovCnMoAAAAICAvKioKICAgKiAlczo6JXM6CiAgICogQG9iamVjdDogQSAjJXMuCnMYAAAAICAgKiBAYXJnXyVzOiBBcmd1bWVudC4Kc+cAAAAgICAqCiAgICogT24gdGhlIGNsaWVudC1zaWRlLCB0aGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBELUJ1cyBzaWduYWwgIyVzOjolcyBpcyByZWNlaXZlZC4KICAgKgogICAqIE9uIHRoZSBzZXJ2aWNlLXNpZGUsIHRoaXMgc2lnbmFsIGNhbiBiZSB1c2VkIHdpdGggZS5nLiBnX3NpZ25hbF9lbWl0X2J5X25hbWUoKSB0byBtYWtlIHRoZSBvYmplY3QgZW1pdCB0aGUgRC1CdXMgc2lnbmFsLgpzvgAAACAgZ19zaWduYWxfbmV3ICgiJXMiLAogICAgR19UWVBFX0ZST01fSU5URVJGQUNFIChpZmFjZSksCiAgICBHX1NJR05BTF9SVU5fTEFTVCwKICAgIEdfU1RSVUNUX09GRlNFVCAoJXNJZmFjZSwgJXMpLAogICAgTlVMTCwKICAgIE5VTEwsCiAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywKICAgIEdfVFlQRV9OT05FLAogICAgJWRzMQAAACAgLyogR09iamVjdCBwcm9wZXJ0aWVzIGZvciBELUJ1cyBwcm9wZXJ0aWVzOiAqLwpzrgAAAFNpbmNlIHRoZSBELUJ1cyBwcm9wZXJ0eSBmb3IgdGhpcyAjR09iamVjdCBwcm9wZXJ0eSBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgaXQgaXMgbWVhbmluZ2Z1bCB0byBib3RoIHJlYWQgZnJvbSBpdCBhbmQgd3JpdGUgdG8gaXQgb24gYm90aCB0aGUgc2VydmljZS0gYW5kIGNsaWVudC1zaWRlLnPcAAAAU2luY2UgdGhlIEQtQnVzIHByb3BlcnR5IGZvciB0aGlzICNHT2JqZWN0IHByb3BlcnR5IGlzIHJlYWRhYmxlIGJ1dCBub3Qgd3JpdGFibGUsIGl0IGlzIG1lYW5pbmdmdWwgdG8gcmVhZCBmcm9tIGl0IG9uIGJvdGggdGhlIGNsaWVudC0gYW5kIHNlcnZpY2Utc2lkZS4gSXQgaXMgb25seSBtZWFuaW5nZnVsLCBob3dldmVyLCB0byB3cml0ZSB0byBpdCBvbiB0aGUgc2VydmljZS1zaWRlLnPcAAAAU2luY2UgdGhlIEQtQnVzIHByb3BlcnR5IGZvciB0aGlzICNHT2JqZWN0IHByb3BlcnR5IGlzIHdyaXRhYmxlIGJ1dCBub3QgcmVhZGFibGUsIGl0IGlzIG1lYW5pbmdmdWwgdG8gd3JpdGUgdG8gaXQgb24gYm90aCB0aGUgY2xpZW50LSBhbmQgc2VydmljZS1zaWRlLiBJdCBpcyBvbmx5IG1lYW5pbmdmdWwsIGhvd2V2ZXIsIHRvIHJlYWQgZnJvbSBpdCBvbiB0aGUgc2VydmljZS1zaWRlLnM8AAAAQ2Fubm90IGhhbmRsZSBwcm9wZXJ0eSAlcyB0aGF0IG5laXRoZXIgcmVhZGFibGUgbm9yIHdyaXRhYmxlc08AAAAgIC8qKgogICAqICVzOiVzOgogICAqCiAgICogUmVwcmVzZW50cyB0aGUgRC1CdXMgcHJvcGVydHkgIyVzOiVzLgogICAqCiAgICogJXMKcy4AAAAgIGdfb2JqZWN0X2ludGVyZmFjZV9pbnN0YWxsX3Byb3BlcnR5IChpZmFjZSwKdA4AAABHX1RZUEVfVkFSSUFOVHNDAAAAZ19wYXJhbV9zcGVjX3ZhcmlhbnQgKCIlcyIsICIlcyIsICIlcyIsIEdfVkFSSUFOVF9UWVBFICgiJXMiKSwgTlVMTHQBAAAAYnMtAAAAZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCIlcyIsICIlcyIsICIlcyIsIEZBTFNFdAEAAAB5cy8AAABnX3Bh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dmljZS1zaWRlLnM8AAAAQ2Fubm90IGhhbmRsZSBwcm9wZXJ0eSAlcyB0aGF0IG5laXRoZXIgcmVhZGFibGUgbm9yIHdyaXRhYmxlc2sAAAAvKioKICogJXNfZ2V0XyVzOiAoc2tpcCkKICogQG9iamVjdDogQSAjJXMuCiAqCiAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSAjJXM6JXMgRC1CdXMgcHJvcGVydHkuCiAqCiAqICVzCiAqCnNwAQAAICogPHdhcm5pbmc+VGhlIHJldHVybmVkIHZhbHVlIGlzIG9ubHkgdmFsaWQgdW50aWwgdGhlIHByb3BlcnR5IGNoYW5nZXMgc28gb24gdGhlIGNsaWVudC1zaWRlIGl0IGlzIG9ubHkgc2FmZSB0byB1c2UgdGhpcyBmdW5jdGlvbiBvbiB0aGUgdGhyZWFkIHdoZXJlIEBvYmplY3Qgd2FzIGNvbnN0cnVjdGVkLiBVc2UgJXNfZHVwXyVzKCkgaWYgb24gYW5vdGhlciB0aHJlYWQuPC93YXJuaW5nPgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgbm9uZSk6IFRoZSBwcm9wZXJ0eSB2YWx1ZSBvciAlJU5VTEwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQuIERvIG5vdCBmcmVlIHRoZSByZXR1cm5lZCB2YWx1ZSwgaXQgYmVsb25ncyB0byBAb2JqZWN0LgpzIAAAACAqIFJldHVybnM6IFRoZSBwcm9wZXJ0eSB2YWx1ZS4KaQAAAABzHAAAACVzCiVzX2dldF8lcyAoJXMgKm9iamVjdCkKewpzMwAAACAgcmV0dXJuICVzJXNfR0VUX0lGQUNFIChvYmplY3QpLT5nZXRfJXMgKG9iamVjdCk7CnMCAAAAfQpzAQAAAApz7AAAAC8qKgogKiAlc19kdXBfJXM6IChza2lwKQogKiBAb2JqZWN0OiBBICMlcy4KICoKICogR2V0cyBhIGNvcHkgb2YgdGhlICMlczolcyBELUJ1cyBwcm9wZXJ0eS4KICoKICogJXMKICoKICogUmV0dXJuczogKHRyYW5zZmVyIGZ1bGwpOiBUaGUgcHJvcGVydHkgdmFsdWUgb3IgJSVOVUxMIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiBU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aHJlYWQgeW91IGFyZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGZyb20uCiAqIFlvdSBjYW4gdGhlbiBjYWxsICVzX2NhbGxfJXNfZmluaXNoKCkgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICoKICogU2VlICVzX2NhbGxfJXNfc3luYygpIGZvciB0aGUgc3luY2hyb25vdXMsIGJsb2NraW5nIHZlcnNpb24gb2YgdGhpcyBtZXRob2QuCmkAAAAAcx8AAAB2b2lkCiVzX2NhbGxfJXMgKAogICAgJXMgKnByb3h5cw4AAAAsCiAgICAlc2FyZ18lc3MaAAAALAogICAgR1VuaXhGRExpc3QgKmZkX2xpc3RzXQAAACwKICAgIEdDYW5jZWxsYWJsZSAqY2FuY2VsbGFibGUsCiAgICBHQXN5bmNSZWFkeUNhbGxiYWNrIGNhbGxiYWNrLAogICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQp7CnM9AAAAICBnX2RidXNfcHJveHlfY2FsbF93aXRoX3VuaXhfZmRfbGlzdCAoR19EQlVTX1BST1hZIChwcm94eSksCnMrAAAAICBnX2RidXNfcHJveHlfY2FsbCAoR19EQlVTX1BST1hZIChwcm94eSksCnMfAAAAICAgICIlcyIsCiAgICBnX3ZhcmlhbnRfbmV3ICgiKHMCAAAAJXNzAgAAACkicxsAAAAsCiAgICAgICAgICAgICAgICAgICBhcmdfJXNzJwAAACksCiAgICBHX0RCVVNfQ0FMTF9GTEFHU19OT05FLAogICAgLTEsCnMNAAAAICAgIGZkX2xpc3QsCnMvAAAAICAgIGNhbmNlbGxhYmxlLAogICAgY2FsbGJhY2ssCiAgICB1c2VyX2RhdGEpOwpzAwAAAH0KCnMxAAAALyoqCiAqICVzX2NhbGxfJXNfZmluaXNoOgogKiBAcHJveHk6IEEgIyVzUHJveHkuCnNNAAAAICogQG91dF8lczogKG91dCk6IFJldHVybiBsb2NhdGlvbiBmb3IgcmV0dXJuIHBhcmFtZXRlciBvciAlJU5VTEwgdG8gaWdub3JlLgpzRQAAACAqIEBvdXRfZmRfbGlzdDogKG91dCk6IFJldHVybiBsb2NhdGlvbiBmb3IgYSAjR1VuaXhGRExpc3Qgb3IgJU5VTEwuCnMPAQAAICogQHJlczogVGhlICNHQXN5bmNSZXN1bHQgb2J0YWluZWQgZnJvbSB0aGUgI0dBc3luY1JlYWR5Q2FsbGJhY2sgcGFzc2VkIHRvICVzX2NhbGxfJXMoKS4KICogQGVycm9yOiBSZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG9yICUlTlVMTC4KICoKICogRmluaXNoZXMgYW4gb3BlcmF0aW9uIHN0YXJ0ZWQgd2l0aCAlc19jYWxsXyVzKCkuCiAqCiAqIFJldHVybnM6IChza2lwKTogJSVUUlVFIGlmIHRoZSBjYWxsIHN1Y2NlZGVkLCAlJUZBTFNFIGlmIEBlcnJvciBpcyBzZXQuCnMqAAAAZ2Jvb2xlYW4KJXNfY2FsbF8lc19maW5pc2ggKAogICAgJXMgKnByb3h5cw4AAAAsCiAgICAlc291dF8lc3MfAAAALAogICAgR1VuaXhGRExpc3QgKipvdXRfZmRfbGlzdHNBAAAALAogICAgR0FzeW5jUmVzdWx0ICpyZXMsCiAgICBHRXJyb3IgKiplcnJvcikKewogIEdWYXJpYW50ICpfcmV0OwpzZQAAACAgX3JldCA9IGdfZGJ1c19wcm94eV9jYWxsX3dpdGhfdW5peF9mZF9saXN0X2ZpbmlzaCAoR19EQlVTX1BST1hZIChwcm94eSksIG91dF9mZF9saXN0LCByZXMsIGVycm9yKTsKc0YAAAAgIF9yZXQgPSBnX2RidXNfcHJveHlfY2FsbF9maW5pc2ggKEdfREJVU19QUk9YWSAocHJveHkpLCByZXMsIGVycm9yKTsKcyMAAAAgIGlmIChfcmV0ID09IE5VTEwpCiAgICBnb3RvIF9vdXQ7CnMqAAAAICBnX3ZhcmlhbnRfZ2V0IChfcmV0LAogICAgICAgICAgICAgICAgICIocxkAAAAsCiAgICAgICAgICAgICAgICAgb3V0XyVzcx0AAAApOwogIGdfdmFyaWFudF91bnJlZiAoX3JldCk7CnMgAAAAX291dDoKICByZXR1cm4gX3JldCAhPSBOVUxMOwp9CgpzLwAAAC8qKgogKiAlc19jYWxsXyVzX3N5bmM6CiAqIEBwcm94eTogQSAjJXNQcm94eS4Kc3UBAAAgKiBAY2FuY2VsbGFibGU6IChhbGxvdy1ub25lKTogQSAjR0NhbmNlbGxhYmxlIG9yICUlTlVMTC4KICogQGVycm9yOiBSZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG9yICUlTlVMTC4KICoKICogU3luY2hyb25vdXNseSBpbnZva2VzIHRoZSAlcy4lcygpIEQtQnVzIG1ldGhvZCBvbiBAcHJveHkuIFRoZSBjYWxsaW5nIHRocmVhZCBpcyBibG9ja2VkIHVudGlsIGEgcmVwbHkgaXMgcmVjZWl2ZWQuCiAqCiAqIFNlZSAlc19jYWxsXyVzKCkgZm9yIHRoZSBhc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZC4KICoKICogUmV0dXJuczogKHNraXApOiAlJVRSVUUgaWYgdGhlIGNhbGwgc3VjY2VkZWQsICUlRkFMU0UgaWYgQGVycm9yIGlzIHNldC4KcygAAABnYm9vbGVhbgolc19jYWxsXyVzX3N5bmMgKAogICAgJXMgKnByb3h5cxsAAAAsCiAgICBHVW5peEZETGlzdCAgKmZkX2xpc3RzSQAAACwKICAgIEdDYW5jZWxsYWJsZSAqY2FuY2VsbGFibGUsCiAgICBHRXJyb3IgKiplcnJvcikKewogIEdWYXJpYW50ICpfcmV0OwpzSQAAACAgX3JldCA9IGdfZGJ1c19wcm94eV9jYWxsX3dpdGhfdW5peF9mZF9saXN0X3N5bmMgKEdfREJVU19QUk9YWSAocHJveHkpLApzNwAAACAgX3JldCA9IGdfZGJ1c19wcm94eV9jYWxsX3N5bmMgKEdfREJVU19QUk9YWSAocHJveHkpLApzHgAAACAgICBmZF9saXN0LAogICAgb3V0X2ZkX2xpc3QsCnNAAAAAICAgIGNhbmNlbGxhYmxlLAogICAgZXJyb3IpOwogIGlmIChfcmV0ID09IE5VTEwpCiAgICBnb3RvIF9vdXQ7CigUAAAAUiMAAABSJAAAAFIBAAAAUiUAAABSJgAAAFInAAAAUg0AAABSHAAAAFIhAAAAUiIAAABSKQAAAFIYAAAAUgkAAABSUQAAAFJSAAAAUioAAAB0CQAAAGZvcm1hdF9pblIzAAAAUjQAAAB0CgAAAGZvcm1hdF9vdXQoBQAAAFIaAAAAUjgAAABSOgAAAFI7AAAAUj0AAAAoAAAAACgAAAAAcyYAAAAvdXNyL3NoYXJlL2dsaWItMi4wL2NvZGVnZW4vY29kZWdlbi5weXQVAAAAZ2VuZXJhdGVfbWV0aG9kX2NhbGxzFQUAAHPgAAAAAAEQAQYBFQEJAgwDGgEQARsBBgETARIBAwkyARYBDAIaARABJAEGARMBEAUGARMCEAEMAQsBEAEbARABEAEbARADBgETARADEAMMAxoBEAEbAQYBEwESAQMGJgEWAQwCGgEQASQBBgETARAFBgETAhABEAIQAhABGwEQARABGwEQAhAHDAMaARABGwEGARMBEAEbAQYBEwESAQMIJgEWAQwCGgEQASQBBgETARABJAEGARMBEAUGARMCEAEMAQsBEAEbARABEAEbARADBgETAhAEEAIQARsBEAEQARsBEAJjAgAAAAUAAAAGAAAAQwAAAHM2AgAAeC8CfAEAagAARF0kAn0CAHQBAH0DAHQCAGoDAHwCAGoEAGQBAIMCAHI0AHQFAH0DAG4AAHwAAGoGAGoHAGQCAHwBAGoIAHwCAGoIAHwBAGoJAGYDABaDAQABfAMAcnMAfAAAagYAagcAZAMAgwEAAW4AAHgoAHwCAGoKAERdHQB9BAB8AABqBgBqBwBkBAB8BABqCwAWgwEAAXF9AFd8AABqBgBqBwB8AABqDABqDQBkBQB8AQBqCwB8AgBqCwBmAgAWdAEAgwIAgwEAAXwAAGoOAHwCAHwAAGoGAGQGAIMDAAF8AABqBgBqBwBkBwB8AQBqCAB8AgBqCAB8AQBqCQBmAwAWgwEAAXwDAHIiAXwAAGoGAGoHAGQIAIMBAAFuAAB4MQB8AgBqCgBEXSYAfQQAfAAAagYAagcAZAkAfAQAag8AfAQAagsAZgIAFoMBAAFxLAFXfAAAagYAagcAZAoAgwEAAXwDAHJ/AXwAAGoGAGoHAGQLAIMBAAFuEAB8AABqBgBqBwBkDACDAQABeCgAfAIAagoARF0dAH0EAHwAAGoGAGoHAGQNAHwEAGoQABaDAQABcZkBV3wAAGoGAGoHAGQOAIMBAAF4KAB8AgBqCgBEXR0AfQQAfAAAagYAagcAZA8AfAQAagsAFoMBAAFx1AFXfAMAcg4CfAAAagYAagcAZBAAgwEAAW4QAHwAAGoGAGoHAGQRAIMBAAF8AABqBgBqBwBkEgCDAQABcQoAV2QAAFMoEwAAAE5zFgAAAG9yZy5ndGsuR0RCdXMuQy5Vbml4RkRzZQAAAC8qKgogKiAlc19jb21wbGV0ZV8lczoKICogQG9iamVjdDogQSAjJXMuCiAqIEBpbnZvY2F0aW9uOiAodHJhbnNmZXIgZnVsbCk6IEEgI0dEQnVzTWV0aG9kSW52b2NhdGlvbi4KczQAAAAgKiBAZmRfbGlzdDogKGFsbG93LW5vbmUpOiBBICNHVW5peEZETGlzdCBvciAlTlVMTC4Kcx0AAAAgKiBAJXM6IFBhcmFtZXRlciB0byByZXR1cm4uCnM9AQAAICoKICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgaW4gc2VydmljZSBpbXBsZW1lbnRhdGlvbnMgdG8gZmluaXNoIGhhbmRsaW5nIGludm9jYXRpb25zIG9mIHRoZSAlcy4lcygpIEQtQnVzIG1ldGhvZC4gSWYgeW91IGluc3RlYWQgd2FudCB0byBmaW5pc2ggaGFuZGxpbmcgYW4gaW52b2NhdGlvbiBieSByZXR1cm5pbmcgYW4gZXJyb3IsIHVzZSBnX2RidXNfbWV0aG9kX2ludm9jYXRpb25fcmV0dXJuX2Vycm9yKCkgb3Igc2ltaWxhci4KICoKICogVGhpcyBtZXRob2Qgd2lsbCBmcmVlIEBpbnZvY2F0aW9uLCB5b3UgY2Fubm90IHVzZSBpdCBhZnRlcndhcmRzLgppAAAAAHNLAAAAdm9pZAolc19jb21wbGV0ZV8lcyAoCiAgICAlcyAqb2JqZWN0LAogICAgR0RCdXNNZXRob2RJbnZvY2F0aW9uICppbnZvY2F0aW9ucxoAAAAsCiAgICBHVW5peEZETGlzdCAqZmRfbGlzdHMKAAAALAogICAgJXMlc3MEAAAAKQp7CnNcAAAAICBnX2RidXNfbWV0aG9kX2ludm9jYXRpb25fcmV0dXJuX3ZhbHVlX3dpdGhfdW5peF9mZF9saXN0IChpbnZvY2F0aW9uLAogICAgZ192YXJpYW50X25ldyAoIihzSgAAACAgZ19kYnVzX21ldGhvZF9pbnZvY2F0aW9uX3JldHVybl92YWx1ZSAoaW52b2NhdGlvbiwKICAgIGdfdmFyaWFudF9uZXcgKCIocwIAAAAlc3MCAAAAKSJzFwAA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RVJGQUNFICglc1RZUEVfJXMsICVzX3Byb3h5X2lmYWNlX2luaXQpKTsKCnMyAAAAc3RhdGljIHZvaWQKJXNfcHJveHlfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKewpzKAAAACAgJXNQcm94eSAqcHJveHkgPSAlcyVzX1BST1hZIChvYmplY3QpOwpzKgAAACAgZ19kYXRhbGlzdF9jbGVhciAoJnByb3h5LT5wcml2LT5xZGF0YSk7CnNAAAAAICBHX09CSkVDVF9DTEFTUyAoJXNfcHJveHlfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cn0KCnOQAAAAc3RhdGljIHZvaWQKJXNfcHJveHlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKICBndWludCAgICAgICAgIHByb3BfaWQsCiAgR1ZhbHVlICAgICAgICp2YWx1ZSwKICBHUGFyYW1TcGVjICAgKnBzcGVjIEdfR05VQ19VTlVTRUQpCnsKc+oBAAAgIGNvbnN0IF9FeHRlbmRlZEdEQnVzUHJvcGVydHlJbmZvICppbmZvOwogIEdWYXJpYW50ICp2YXJpYW50OwogIGdfYXNzZXJ0IChwcm9wX2lkICE9IDAgJiYgcHJvcF9pZCAtIDEgPCAlZCk7CiAgaW5mbyA9IF8lc19wcm9wZXJ0eV9pbmZvX3BvaW50ZXJzW3Byb3BfaWQgLSAxXTsKICB2YXJpYW50ID0gZ19kYnVzX3Byb3h5X2dldF9jYWNoZWRfcHJvcGVydHkgKEdfREJVU19QUk9YWSAob2JqZWN0KSwgaW5mby0+cGFyZW50X3N0cnVjdC5uYW1lKTsKICBpZiAoaW5mby0+dXNlX2d2YXJpYW50KQogICAgewogICAgICBnX3ZhbHVlX3NldF92YXJpYW50ICh2YWx1ZSwgdmFyaWFudCk7CiAgICB9CiAgZWxzZQogICAgewogICAgICBpZiAodmFyaWFudCAhPSBOVUxMKQogICAgICAgIGdfZGJ1c19ndmFyaWFudF90b19ndmFsdWUgKHZhcmlhbnQsIHZhbHVlKTsKICAgIH0KICBpZiAodmFyaWFudCAhPSBOVUxMKQogICAgZ192YXJpYW50X3VucmVmICh2YXJpYW50KTsKcwMAAAB9CgpzawAAAHN0YXRpYyB2b2lkCiVzX3Byb3h5X3NldF9wcm9wZXJ0eV9jYiAoR0RCdXNQcm94eSAqcHJveHksCiAgR0FzeW5jUmVzdWx0ICpyZXMsCiAgZ3BvaW50ZXIgICAgICB1c2VyX2RhdGEpCnsKc4QBAAAgIGNvbnN0IF9FeHRlbmRlZEdEQnVzUHJvcGVydHlJbmZvICppbmZvID0gdXNlcl9kYXRhOwogIEdFcnJvciAqZXJyb3I7CiAgZXJyb3IgPSBOVUxMOwogIGlmICghZ19kYnVzX3Byb3h5X2NhbGxfZmluaXNoIChwcm94eSwgcmVzLCAmZXJyb3IpKQogICAgewogICAgICBnX3dhcm5pbmcgKCJFcnJvciBzZXR0aW5nIHByb3BlcnR5ICclJXMnIG9uIGludGVyZmFjZSAlczogJSVzICglJXMsICUlZCkiLAogICAgICAgICAgICAgICAgIGluZm8tPnBhcmVudF9zdHJ1Y3QubmFtZSwgCiAgICAgICAgICAgICAgICAgZXJyb3ItPm1lc3NhZ2UsIGdfcXVhcmtfdG9fc3RyaW5nIChlcnJvci0+ZG9tYWluKSwgZXJyb3ItPmNvZGUpOwogICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgIH0Kc5AAAABzdGF0aWMgdm9pZAolc19wcm94eV9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAogIGd1aW50ICAgICAgICAgcHJvcF9pZCwKICBjb25zdCBHVmFsdWUgKnZhbHVlLAogIEdQYXJhbVNwZWMgICAqcHNwZWMgR19HTlVDX1VOVVNFRCkKewpzRAIAACAgY29uc3QgX0V4dGVuZGVkR0RCdXNQcm9wZXJ0eUluZm8gKmluZm87CiAgR1ZhcmlhbnQgKnZhcmlhbnQ7CiAgZ19hc3NlcnQgKHByb3BfaWQgIT0gMCAmJiBwcm9wX2lkIC0gMSA8ICVkKTsKICBpbmZvID0gXyVzX3Byb3BlcnR5X2luZm9fcG9pbnRlcnNbcHJvcF9pZCAtIDFdOwogIHZhcmlhbnQgPSBnX2RidXNfZ3ZhbHVlX3RvX2d2YXJpYW50ICh2YWx1ZSwgR19WQVJJQU5UX1RZUEUgKGluZm8tPnBhcmVudF9zdHJ1Y3Quc2lnbmF0dXJlKSk7CiAgZ19kYnVzX3Byb3h5X2NhbGwgKEdfREJVU19QUk9YWSAob2JqZWN0KSwKICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlNldCIsCiAgICBnX3ZhcmlhbnRfbmV3ICgiKHNzdikiLCAiJXMiLCBpbmZvLT5wYXJlbnRfc3RydWN0Lm5hbWUsIHZhcmlhbnQpLAogICAgR19EQlVTX0NBTExfRkxBR1NfTk9ORSwKICAgIC0xLAogICAgTlVMTCwgKEdBc3luY1JlYWR5Q2FsbGJhY2spICVzX3Byb3h5X3NldF9wcm9wZXJ0eV9jYiwgKEdEQnVzUHJvcGVydHlJbmZvICopICZpbmZvLT5wYXJlbnRfc3RydWN0KTsKICBnX3ZhcmlhbnRfdW5yZWYgKHZhcmlhbnQpOwpzkgAAAHN0YXRpYyB2b2lkCiVzX3Byb3h5X2dfc2lnbmFsIChHREJ1c1Byb3h5ICpwcm94eSwKICBjb25zdCBnY2hhciAqc2VuZGVyX25hbWUgR19HTlVDX1VOVVNFRCwKICBjb25zdCBnY2hhciAqc2lnbmFsX25hbWUsCiAgR1ZhcmlhbnQgKnBhcmFtZXRlcnMpCnsKc44AAAAgIF9FeHRlbmRlZEdEQnVzU2lnbmFsSW5mbyAqaW5mbzsKICBHVmFyaWFudEl0ZXIgaXRlcjsKICBHVmFyaWFudCAqY2hpbGQ7CiAgR1ZhbHVlICpwYXJhbXY7CiAgZ3VpbnQgbnVtX3BhcmFtczsKICBndWludCBuOwogIGd1aW50IHNpZ25hbF9pZDsKc7MAAAAgIGluZm8gPSAoX0V4dGVuZGVkR0RCdXNTaWduYWxJbmZvICopIGdfZGJ1c19pbnRlcmZhY2VfaW5mb19sb29rdXBfc2lnbmFsICgoR0RCdXNJbnRlcmZhY2VJbmZvICopICZfJXNfaW50ZXJmYWNlX2luZm8ucGFyZW50X3N0cnVjdCwgc2lnbmFsX25hbWUpOwogIGlmIChpbmZvID09IE5VTEwpCiAgICByZXR1cm47CnOwAAAAICBudW1fcGFyYW1zID0gZ192YXJpYW50X25fY2hpbGRyZW4gKHBhcmFtZXRlcnMpOwogIHBhcmFtdiA9IGdfbmV3MCAoR1ZhbHVlLCBudW1fcGFyYW1zICsgMSk7CiAgZ192YWx1ZV9pbml0ICgmcGFyYW12WzBdLCAlc1RZUEVfJXMpOwogIGdfdmFsdWVfc2V0X29iamVjdCAoJnBhcmFtdlswXSwgcHJveHkpOwpz8QEAACAgZ192YXJpYW50X2l0ZXJfaW5pdCAoJml0ZXIsIHBhcmFtZXRlcnMpOwogIG4gPSAxOwogIHdoaWxlICgoY2hpbGQgPSBnX3ZhcmlhbnRfaXRlcl9uZXh0X3ZhbHVlICgmaXRlcikpICE9IE5VTEwpCiAgICB7CiAgICAgIF9FeHRlbmRlZEdEQnVzQXJnSW5mbyAqYXJnX2luZm8gPSAoX0V4dGVuZGVkR0RCdXNBcmdJbmZvICopIGluZm8tPnBhcmVudF9zdHJ1Y3QuYXJnc1tuIC0gMV07CiAgICAgIGlmIChhcmdfaW5mby0+dXNlX2d2YXJpYW50KQogICAgICAgIHsKICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnBhcmFtdltuXSwgR19UWVBFX1ZBUklBTlQpOwogICAgICAgICAgZ192YWx1ZV9zZXRfdmFyaWFudCAoJnBhcmFtdltuXSwgY2hpbGQpOwogICAgICAgICAgbisrOwogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIGdfZGJ1c19ndmFyaWFudF90b19ndmFsdWUgKGNoaWxkLCAmcGFyYW12W24rK10pOwogICAgICBnX3ZhcmlhbnRfdW5yZWYgKGNoaWxkKTsKICAgIH0Kcz4AAAAgIHNpZ25hbF9pZCA9IGdfc2lnbmFsX2xvb2t1cCAoaW5mby0+c2lnbmFsX25hbWUsICVzVFlQRV8lcyk7CnMvAAAAICBnX3NpZ25hbF9lbWl0diAocGFyYW12LCBzaWduYWxfaWQsIDAsIE5VTEwpOwpzWgAAACAgZm9yIChuID0gMDsgbiA8IG51bV9wYXJhbXMgKyAxOyBuKyspCiAgICBnX3ZhbHVlX3Vuc2V0ICgmcGFyYW12W25dKTsKICBnX2ZyZWUgKHBhcmFtdik7CnOPAAAAc3RhdGljIHZvaWQKJXNfcHJveHlfZ19wcm9wZXJ0aWVzX2NoYW5nZWQgKEdEQnVzUHJveHkgKl9wcm94eSwKICBHVmFyaWFudCAqY2hhbmdlZF9wcm9wZXJ0aWVzLAogIGNvbnN0IGdjaGFyICpjb25zdCAqaW52YWxpZGF0ZWRfcHJvcGVydGllcykKewpz0gMAACAgJXNQcm94eSAqcHJveHkgPSAlcyVzX1BST1hZIChfcHJveHkpOwogIGd1aW50IG47CiAgY29uc3QgZ2NoYXIgKmtleTsKICBHVmFyaWFudEl0ZXIgKml0ZXI7CiAgX0V4dGVuZGVkR0RCdXNQcm9wZXJ0eUluZm8gKmluZm87CiAgZ192YXJpYW50X2dldCAoY2hhbmdlZF9wcm9wZXJ0aWVzLCAiYXtzdn0iLCAmaXRlcik7CiAgd2hpbGUgKGdfdmFyaWFudF9pdGVyX25leHQgKGl0ZXIsICJ7JnN2fSIsICZrZXksIE5VTEwpKQogICAgewogICAgICBpbmZvID0gKF9FeHRlbmRlZEdEQnVzUHJvcGVydHlJbmZvICopIGdfZGJ1c19pbnRlcmZhY2VfaW5mb19sb29rdXBfcHJvcGVydHkgKChHREJ1c0ludGVyZmFjZUluZm8gKikgJl8lc19pbnRlcmZhY2VfaW5mby5wYXJlbnRfc3RydWN0LCBrZXkpOwogICAgICBnX2RhdGFsaXN0X3JlbW92ZV9kYXRhICgmcHJveHktPnByaXYtPnFkYXRhLCBrZXkpOwogICAgICBpZiAoaW5mbyAhPSBOVUxMKQogICAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHByb3h5KSwgaW5mby0+aHlwaGVuX25hbWUpOwogICAgfQogIGdfdmFyaWFudF9pdGVyX2ZyZWUgKGl0ZXIpOwogIGZvciAobiA9IDA7IGludmFsaWRhdGVkX3Byb3BlcnRpZXNbbl0gIT0gTlVMTDsgbisrKQogICAgewogICAgICBpbmZvID0gKF9FeHRlbmRlZEdEQnVzUHJvcGVydHlJbmZvICopIGdfZGJ1c19pbnRlcmZhY2VfaW5mb19sb29rdXBfcHJvcGVydHkgKChHREJ1c0ludGVyZmFjZUluZm8gKikgJl8lc19pbnRlcmZhY2VfaW5mby5wYXJlbnRfc3RydWN0LCBpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzW25dKTsKICAgICAgZ19kYXRhbGlzdF9yZW1vdmVfZGF0YSAoJnByb3h5LT5wcml2LT5xZGF0YSwgaW52YWxpZGF0ZWRfcHJvcGVydGllc1tuXSk7CiAgICAgIGlmIChpbmZvICE9IE5VTEwpCiAgICAgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAocHJveHkpLCBpbmZvLT5oeXBoZW5fbmFtZSk7CiAgICB9Cn0KCnQBAAAAMHQEAAAATlVMTHN2AAAAc3RhdGljICVzCiVzX3Byb3h5X2dldF8lcyAoJXMgKm9iamVjdCkKewogICVzUHJveHkgKnByb3h5ID0gJXMlc19QUk9YWSAob2JqZWN0KTsKICBHVmFyaWFudCAqdmFyaWFudDsKICAlc3ZhbHVlID0gJXM7CnQSAAAAZ192YXJpYW50X2dldF9zdHJ2dBYAAABnX3ZhcmlhbnRfZ2V0X29ianBhdGh2dB4AAABnX3ZhcmlhbnRfZ2V0X2J5dGVzdHJpbmdfYXJyYXlzYgAAACAgdmFsdWUgPSBnX2RhdGFsaXN0X2dldF9kYXRhICgmcHJveHktPnByaXYtPnFkYXRhLCAiJXMiKTsKICBpZiAodmFsdWUgIT0gTlVMTCkKICAgIHJldHVybiB2YWx1ZTsKc0sAAAAgIHZhcmlhbnQgPSBnX2RidXNfcHJveHlfZ2V0X2NhY2hlZF9wcm9wZXJ0eSAoR19EQlVTX1BST1hZIChwcm94eSksICIlcyIpOwpSVQAAAHMTAAAAICB2YWx1ZSA9IHZhcmlhbnQ7CnMXAAAAICBpZiAodmFyaWFudCAhPSBOVUxMKQpzHwAAACAgICBnX3ZhcmlhbnRfdW5yZWYgKHZhcmlhbnQpOwpzHQAAACAgaWYgKHZhcmlhbnQgIT0gTlVMTCkKICAgIHsKUgUAAAB0FAAAAGdfdmFyaWFudF9nZXRfc3RyaW5ndBIAAABnX3ZhcmlhbnRfZ2V0X29ianZzBgAAACwgTlVMTHMeAAAAICAgICAgdmFsdWUgPSAlcyAodmFyaWFudCVzKTsKc1YAAAAgICAgICBnX2RhdGFsaXN0X3NldF9kYXRhX2Z1bGwgKCZwcm94eS0+cHJpdi0+cWRhdGEsICIlcyIsIChncG9pbnRlcikgdmFsdWUsIGdfZnJlZSk7CnMhAAAAICAgICAgZ192YXJpYW50X3VucmVmICh2YXJpYW50KTsKcwYAAAAgICAgfQpzEAAAACAgcmV0dXJuIHZhbHVlOwpzAgAAAH0Kc7cAAABzdGF0aWMgdm9pZAolc19wcm94eV9pbml0ICglc1Byb3h5ICpwcm94eSkKewogIHByb3h5LT5wcml2ID0gJXNfcHJveHlfZ2V0X2luc3RhbmNlX3ByaXZhdGUgKHByb3h5KTsKICBnX2RidXNfcHJveHlfc2V0X2ludGVyZmFjZV9pbmZvIChHX0RCVVNfUFJPWFkgKHByb3h5KSwgJXNfaW50ZXJmYWNlX2luZm8gKCkpOwp9Cgpz4wEAAHN0YXRpYyB2b2lkCiVzX3Byb3h5X2NsYXNzX2luaXQgKCVzUHJveHlDbGFzcyAqa2xhc3MpCnsKICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CiAgR0RCdXNQcm94eUNsYXNzICpwcm94eV9jbGFzczsKCiAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CiAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgICAgID0gJXNfcHJveHlfZmluYWxpemU7CiAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gJXNfcHJveHlfZ2V0X3Byb3BlcnR5OwogIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICVzX3Byb3h5X3NldF9wcm9wZXJ0eTsKCiAgcHJveHlfY2xhc3MgPSBHX0RCVVNfUFJPWFlfQ0xBU1MgKGtsYXNzKTsKICBwcm94eV9jbGFzcy0+Z19zaWduYWwgPSAlc19wcm94eV9nX3NpZ25hbDsKICBwcm94eV9jbGFzcy0+Z19wcm9wZXJ0aWVzX2NoYW5nZWQgPSAlc19wcm94eV9nX3Byb3BlcnRpZXNfY2hhbmdlZDsKCnMuAAAACiAgJXNfb3ZlcnJpZGVfcHJvcGVydGllcyAoZ29iamVjdF9jbGFzcywgMSk7CnMzAAAAc3RhdGljIHZvaWQKJXNfcHJveHlfaWZhY2VfaW5pdCAoJXNJZmFjZSAqaWZhY2UpCnsKcyMAAAAgIGlmYWNlLT5nZXRfJXMgPSAlc19wcm94eV9nZXRfJXM7CnOYAwAALyoqCiAqICVzX3Byb3h5X25ldzoKICogQGNvbm5lY3Rpb246IEEgI0dEQnVzQ29ubmVjdGlvbi4KICogQGZsYWdzOiBGbGFncyBmcm9tIHRoZSAjR0RCdXNQcm94eUZsYWdzIGVudW1lcmF0aW9uLgogKiBAbmFtZTogKGFsbG93LW5vbmUpOiBBIGJ1cyBuYW1lICh3ZWxsLWtub3duIG9yIHVuaXF1ZSkgb3IgJSVOVUxMIGlmIEBjb25uZWN0aW9uIGlzIG5vdCBhIG1lc3NhZ2UgYnVzIGNvbm5lY3Rpb24uCiAqIEBvYmplY3RfcGF0aDogQW4gb2JqZWN0IHBhdGguCiAqIEBjYW5jZWxsYWJsZTogKGFsbG93LW5vbmUpOiBBICNHQ2FuY2VsbGFibGUgb3IgJSVOVUxMLgogKiBAY2FsbGJhY2s6IEEgI0dBc3luY1JlYWR5Q2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNhdGlzZmllZC4KICogQHVzZXJfZGF0YTogVXNlciBkYXRhIHRvIHBhc3MgdG8gQGNhbGxiYWNrLgogKgogKiBBc3luY2hyb25vdXNseSBjcmVhdGVzIGEgcHJveHkgZm9yIHRoZSBELUJ1cyBpbnRlcmZhY2UgIyVzLiBTZWUgZ19kYnVzX3Byb3h5X25ldygpIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBmaW5pc2hlZCwgQGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgPGxpbmsgbGlua2VuZD0iZy1tYWluLWNvbnRleHQtcHVzaC10aHJlYWQtZGVmYXVsdCI+dGhyZWFkLWRlZmF1bHQgbWFpbiBsb29wPC9saW5rPiBvZiB0aGUgdGhyZWFkIHlvdSBhcmUgY2FsbGluZyB0aGlzIG1ldGhvZCBmcm9tLgogKiBZb3UgY2FuIHRoZW4gY2FsbCAlc19wcm94eV9uZXdfZmluaXNoKCkgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICoKICogU2VlICVzX3Byb3h5X25ld19zeW5jKCkgZm9yIHRoZSBzeW5jaHJvbm91cywgYmxvY2tpbmcgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgpz8gEAAHZvaWQKJXNfcHJveHlfbmV3ICgKICAgIEdEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCiAgICBHREJ1c1Byb3h5RmxhZ3MgICAgICBmbGFncywKICAgIGNvbnN0IGdjaGFyICAgICAgICAgKm5hbWUsCiAgICBjb25zdCBnY2hhciAgICAgICAgICpvYmplY3RfcGF0aCwKICAgIEdDYW5jZWxsYWJsZSAgICAgICAgKmNhbmNlbGxhYmxlLAogICAgR0FzeW5jUmVhZHlDYWxsYmFjayAgY2FsbGJhY2ssCiAgICBncG9pbnRlciAgICAgICAgICAgICB1c2VyX2RhdGEpCnsKICBnX2FzeW5jX2luaXRhYmxlX25ld19hc3luYyAoJXNUWVBFXyVzX1BST1hZLCBHX1BSSU9SSVRZX0RFRkFVTFQsIGNhbmNlbGxhYmxlLCBjYWxsYmFjaywgdXNlcl9kYXRhLCAiZy1mbGFncyIsIGZsYWdzLCAiZy1uYW1lIiwgbmFtZSwgImctY29ubmVjdGlvbiIsIGNvbm5lY3Rpb24sICJnLW9iamVjdC1wYXRoIiwgb2JqZWN0X3BhdGgsICJnLWludGVyZmFjZS1uYW1lIiwgIiVzIiwgTlVMTCk7Cn0KCnNIAQAALyoqCiAqICVzX3Byb3h5X25ld19maW5pc2g6CiAqIEByZXM6IFRoZSAjR0FzeW5jUmVzdWx0IG9idGFpbmVkIGZyb20gdGhlICNHQXN5bmNSZWFkeUNhbGxiYWNrIHBhc3NlZCB0byAlc19wcm94eV9uZXcoKS4KICogQGVycm9yOiBSZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG9yICUlTlVMTAogKgogKiBGaW5pc2hlcyBhbiBvcGVyYXRpb24gc3RhcnRlZCB3aXRoICVzX3Byb3h5X25ldygpLgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgZnVsbCkgKHR5cGUgJXNQcm94eSk6IFRoZSBjb25zdHJ1Y3RlZCBwcm94eSBvYmplY3Qgb3IgJSVOVUxMIGlmIEBlcnJvciBpcyBzZXQuCnN6AQAAJXMgKgolc19wcm94eV9uZXdfZmluaXNoICgKICAgIEdBc3luY1Jlc3VsdCAgICAgICAgKnJlcywKICAgIEdFcnJvciAgICAgICAgICAgICAqKmVycm9yKQp7CiAgR09iamVjdCAqcmV0OwogIEdPYmplY3QgKnNvdXJjZV9vYmplY3Q7CiAgc291cmNlX29iamVjdCA9IGdfYXN5bmNfcmVzdWx0X2dldF9zb3VyY2Vfb2JqZWN0IChyZXMpOwogIHJldCA9IGdfYXN5bmNfaW5pdGFibGVfbmV3X2ZpbmlzaCAoR19BU1lOQ19JTklUQUJMRSAoc291cmNlX29iamVjdCksIHJlcywgZXJyb3IpOwogIGdfb2JqZWN0X3VucmVmIChzb3VyY2Vfb2JqZWN0KTsKICBpZiAocmV0ICE9IE5VTEwpCiAgICByZXR1cm4gJXMlcyAocmV0KTsKICBlbHNlCiAgICByZXR1cm4gTlVMTDsKfQoKc9UCAAAvKioKICogJXNfcHJveHlfbmV3X3N5bmM6CiAqIEBjb25uZWN0aW9uOiBBICNHREJ1c0Nvbm5lY3Rpb24uCiAqIEBmbGFnczogRmxhZ3MgZnJvbSB0aGUgI0dEQnVzUHJveHlGbGFncyBlbnVtZXJhdGlvbi4KICogQG5hbWU6IChhbGxvdy1ub25lKTogQSBidXMgbmFtZSAod2VsbC1rbm93biBvciB1bmlxdWUpIG9yICUlTlVMTCBpZiBAY29ubmVjdGlvbiBpcyBub3QgYSBtZXNzYWdlIGJ1cyBjb25uZWN0aW9uLgogKiBAb2JqZWN0X3BhdGg6IEFuIG9iamVjdCBwYXRoLgogKiBAY2FuY2VsbGFibGU6IChhbGxvdy1ub25lKTogQSAjR0NhbmNlbGxhYmxlIG9yICUlTlVMTC4KICogQGVycm9yOiBSZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG9yICUlTlVMTAogKgogKiBTeW5jaHJvbm91c2x5IGNyZWF0ZXMgYSBwcm94eSBmb3IgdGhlIEQtQnVzIGludGVyZmFjZSAjJXMuIFNlZSBnX2RidXNfcHJveHlfbmV3X3N5bmMoKSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBUaGUgY2FsbGluZyB0aHJlYWQgaXMgYmxvY2tlZCB1bnRpbCBhIHJlcGx5IGlzIHJlY2VpdmVkLgogKgogKiBTZWUgJXNfcHJveHlfbmV3KCkgZm9yIHRoZSBhc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgZnVsbCkgKHR5cGUgJXNQcm94eSk6IFRoZSBjb25zdHJ1Y3RlZCBwcm94eSBvYmplY3Qgb3IgJSVOVUxMIGlmIEBlcnJvciBpcyBzZXQuCnP8AQAAJXMgKgolc19wcm94eV9uZXdfc3luYyAoCiAgICBHREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAogICAgR0RCdXNQcm94eUZsYWdzICAgICAgZmxhZ3MsCiAgICBjb25zdCBnY2hhciAgICAgICAgICpuYW1lLAogICAgY29uc3QgZ2NoYXIgICAgICAgICAqb2JqZWN0X3BhdGgsCiAgICBHQ2FuY2VsbGFibGUgICAgICAgICpjYW5jZWxsYWJsZSwKICAgIEdFcnJvciAgICAgICAgICAgICAqKmVycm9yKQp7CiAgR0luaXRhYmxlICpyZXQ7CiAgcmV0ID0gZ19pbml0YWJsZV9uZXcgKCVzVFlQRV8lc19QUk9YWSwgY2FuY2VsbGFibGUsIGVycm9yLCAiZy1mbGFncyIsIGZsYWdzLCAiZy1uYW1lIiwgbmFtZSwgImctY29ubmVjdGlvbiIsIGNvbm5lY3Rpb24sICJnLW9iamVjdC1wYXRoIiwgb2JqZWN0X3BhdGgsICJnLWludGVyZmFjZS1uYW1lIiwgIiVzIiwgTlVMTCk7CiAgaWYgKHJldCAhPSBOVUxMKQogICAgcmV0dXJuICVzJXMgKHJldCk7CiAgZWxzZQogICAgcmV0dXJuIE5VTEw7Cn0KCnNEAwAALyoqCiAqICVzX3Byb3h5X25ld19mb3JfYnVzOgogKiBAYnVzX3R5cGU6IEEgI0dCdXNUeXBlLgogKiBAZmxhZ3M6IEZsYWdzIGZyb20gdGhlICNHREJ1c1Byb3h5RmxhZ3MgZW51bWVyYXRpb24uCiAqIEBuYW1lOiBBIGJ1cyBuYW1lICh3ZWxsLWtub3duIG9yIHVuaXF1ZSkuCiAqIEBvYmplY3RfcGF0aDogQW4gb2JqZWN0IHBhdGguCiAqIEBjYW5jZWxsYWJsZTogKGFsbG93LW5vbmUpOiBBICNHQ2FuY2VsbGFibGUgb3IgJSVOVUxMLgogKiBAY2FsbGJhY2s6IEEgI0dBc3luY1JlYWR5Q2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNhdGlzZmllZC4KICogQHVzZXJfZGF0YTogVXNlciBkYXRhIHRvIHBhc3MgdG8gQGNhbGxiYWNrLgogKgogKiBMaWtlICVzX3Byb3h5X25ldygpIGJ1dCB0YWtlcyBhICNHQnVzVHlwZSBpbnN0ZWFkIG9mIGEgI0dEQnVzQ29ubmVjdGlvbi4KICoKICogV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLCBAY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGluIHRoZSA8bGluayBsaW5rZW5kPSJnLW1haW4tY29udGV4dC1wdXNoLXRocmVhZC1kZWZhdWx0Ij50aHJlYWQtZGVmYXVsdCBtYWluIGxvb3A8L2xpbms+IG9mIHRoZSB0aHJlYWQgeW91IGFyZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGZyb20uCiAqIFlvdSBjYW4gdGhlbiBjYWxsICVzX3Byb3h5X25ld19mb3JfYnVzX2ZpbmlzaCgpIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAqCiAqIFNlZSAlc19wcm94eV9uZXdfZm9yX2J1c19zeW5jKCkgZm9yIHRoZSBzeW5jaHJvbm91cywgYmxvY2tpbmcgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgpz9AEAAHZvaWQKJXNfcHJveHlfbmV3X2Zvcl9idXMgKAogICAgR0J1c1R5cGUgICAgICAgICAgICAgYnVzX3R5cGUsCiAgICBHREJ1c1Byb3h5RmxhZ3MgICAgICBmbGFncywKICAgIGNvbnN0IGdjaGFyICAgICAgICAgKm5hbWUsCiAgICBjb25zdCBnY2hhciAgICAgICAgICpvYmplY3RfcGF0aCwKICAgIEdDYW5jZWxsYWJsZSAgICAgICAgKmNhbmNlbGxhYmxlLAogICAgR0FzeW5jUmVhZHlDYWxsYmFjayAgY2FsbGJhY2ssCiAgICBncG9pbnRlciAgICAgICAgICAgICB1c2VyX2RhdGEpCnsKICBnX2FzeW5jX2luaXRhYmxlX25ld19hc3luYyAoJXNUWVBFXyVzX1BST1hZLCBHX1BSSU9SSVRZX0RFRkFVTFQsIGNhbmNlbGxhYmxlLCBjYWxsYmFjaywgdXNlcl9kYXRhLCAiZy1mbGFncyIsIGZsYWdzLCAiZy1uYW1lIiwgbmFtZSwgImctYnVzLXR5cGUiLCBidXNfdHlwZSwgImctb2JqZWN0LXBhdGgiLCBvYmplY3RfcGF0aCwgImctaW50ZXJmYWNlLW5hbWUiLCAiJXMiLCBOVUxMKTsKfQoKc2ABAAAvKioKICogJXNfcHJveHlfbmV3X2Zvcl9idXNfZmluaXNoOgogKiBAcmVzOiBUaGUgI0dBc3luY1Jlc3VsdCBvYnRhaW5lZCBmcm9tIHRoZSAjR0FzeW5jUmVhZHlDYWxsYmFjayBwYXNzZWQgdG8gJXNfcHJveHlfbmV3X2Zvcl9idXMoKS4KICogQGVycm9yOiBSZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG9yICUlTlVMTAogKgogKiBGaW5pc2hlcyBhbiBvcGVyYXRpb24gc3RhcnRlZCB3aXRoICVzX3Byb3h5X25ld19mb3JfYnVzKCkuCiAqCiAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKSAodHlwZSAlc1Byb3h5KTogVGhlIGNvbnN0cnVjdGVkIHByb3h5IG9iamVjdCBvciAlJU5VTEwgaWYgQGVycm9yIGlzIHNldC4Kc4IBAAAlcyAqCiVzX3Byb3h5X25ld19mb3JfYnVzX2ZpbmlzaCAoCiAgICBHQXN5bmNSZXN1bHQgICAgICAgICpyZXMsCiAgICBHRXJyb3IgICAgICAgICAgICAgKiplcnJvcikKewogIEdPYmplY3QgKnJldDsKICBHT2JqZWN0ICpzb3VyY2Vfb2JqZWN0OwogIHNvdXJjZV9vYmplY3QgPSBnX2FzeW5jX3Jlc3VsdF9nZXRfc291cmNlX29iamVjdCAocmVzKTsKICByZXQgPSBnX2FzeW5jX2luaXRhYmxlX25ld19maW5pc2ggKEdfQVNZTkNfSU5JVEFCTEUgKHNvdXJjZV9vYmplY3QpLCByZXMsIGVycm9yKTsKICBnX29iamVjdF91bnJlZiAoc291cmNlX29iamVjdCk7CiAgaWYgKHJldCAhPSBOVUxMKQogICAgcmV0dXJuICVzJXMgKHJldCk7CiAgZWxzZQogICAgcmV0dXJuIE5VTEw7Cn0KCnN6AgAALyoqCiAqICVzX3Byb3h5X25ld19mb3JfYnVzX3N5bmM6CiAqIEBidXNfdHlwZTogQSAjR0J1c1R5cGUuCiAqIEBmbGFnczogRmxhZ3MgZnJvbSB0aGUgI0dEQnVzUHJveHlGbGFncyBlbnVtZXJhdGlvbi4KICogQG5hbWU6IEEgYnVzIG5hbWUgKHdlbGwta25vd24gb3IgdW5pcXVlKS4KICogQG9iamVjdF9wYXRoOiBBbiBvYmplY3QgcGF0aC4KICogQGNhbmNlbGxhYmxlOiAoYWxsb3ctbm9uZSk6IEEgI0dDYW5jZWxsYWJsZSBvciAlJU5VTEwuCiAqIEBlcnJvcjogUmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBvciAlJU5VTEwKICoKICogTGlrZSAlc19wcm94eV9uZXdfc3luYygpIGJ1dCB0YWtlcyBhICNHQnVzVHlwZSBpbnN0ZWFkIG9mIGEgI0dEQnVzQ29ubmVjdGlvbi4KICoKICogVGhlIGNhbGxpbmcgdGhyZWFkIGlzIGJsb2NrZWQgdW50aWwgYSByZXBseSBpcyByZWNlaXZlZC4KICoKICogU2VlICVzX3Byb3h5X25ld19mb3JfYnVzKCkgZm9yIHRoZSBhc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgZnVsbCkgKHR5cGUgJXNQcm94eSk6IFRoZSBjb25zdHJ1Y3RlZCBwcm94eSBvYmplY3Qgb3IgJSVOVUxMIGlmIEBlcnJvciBpcyBzZXQuCnP+AQAAJXMgKgolc19wcm94eV9uZXdfZm9yX2J1c19zeW5jICgKICAgIEdCdXNUeXBlICAgICAgICAgICAgIGJ1c190eXBlLAogICAgR0RCdXNQcm94eUZsYWdzICAgICAgZmxhZ3MsCiAgICBjb25zdCBnY2hhciAgICAgICAgICpuYW1lLAogICAgY29uc3QgZ2NoYXIgICAgICAgICAqb2JqZWN0X3BhdGgsCiAgICBHQ2FuY2VsbGFibGUgICAgICAg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dG9uX2hhbmRsZV9tZXRob2RfY2FsbCAoCiAgR0RCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uIEdfR05VQ19VTlVTRUQsCiAgY29uc3QgZ2NoYXIgKnNlbmRlciBHX0dOVUNfVU5VU0VELAogIGNvbnN0IGdjaGFyICpvYmplY3RfcGF0aCBHX0dOVUNfVU5VU0VELAogIGNvbnN0IGdjaGFyICppbnRlcmZhY2VfbmFtZSwKICBjb25zdCBnY2hhciAqbWV0aG9kX25hbWUsCiAgR1ZhcmlhbnQgKnBhcmFtZXRlcnMsCiAgR0RCdXNNZXRob2RJbnZvY2F0aW9uICppbnZvY2F0aW9uLAogIGdwb2ludGVyIHVzZXJfZGF0YSkKewogICVzU2tlbGV0b24gKnNrZWxldG9uID0gJXMlc19TS0VMRVRPTiAodXNlcl9kYXRhKTsKICBfRXh0ZW5kZWRHREJ1c01ldGhvZEluZm8gKmluZm87CiAgR1ZhcmlhbnRJdGVyIGl0ZXI7CiAgR1ZhcmlhbnQgKmNoaWxkOwogIEdWYWx1ZSAqcGFyYW12OwogIGd1aW50IG51bV9wYXJhbXM7CiAgZ3VpbnQgbnVtX2V4dHJhOwogIGd1aW50IG47CiAgZ3VpbnQgc2lnbmFsX2lkOwogIEdWYWx1ZSByZXR1cm5fdmFsdWUgPSBHX1ZBTFVFX0lOSVQ7CnN4AAAAICBpbmZvID0gKF9FeHRlbmRlZEdEQnVzTWV0aG9kSW5mbyAqKSBnX2RidXNfbWV0aG9kX2ludm9jYXRpb25fZ2V0X21ldGhvZF9pbmZvIChpbnZvY2F0aW9uKTsKICBnX2Fzc2VydCAoaW5mbyAhPSBOVUxMKTsKc3ECAAAgIG51bV9wYXJhbXMgPSBnX3ZhcmlhbnRfbl9jaGlsZHJlbiAocGFyYW1ldGVycyk7CiAgbnVtX2V4dHJhID0gaW5mby0+cGFzc19mZGxpc3QgPyAzIDogMjsgIHBhcmFtdiA9IGdfbmV3MCAoR1ZhbHVlLCBudW1fcGFyYW1zICsgbnVtX2V4dHJhKTsKICBuID0gMDsKICBnX3ZhbHVlX2luaXQgKCZwYXJhbXZbbl0sICVzVFlQRV8lcyk7CiAgZ192YWx1ZV9zZXRfb2JqZWN0ICgmcGFyYW12W24rK10sIHNrZWxldG9uKTsKICBnX3ZhbHVlX2luaXQgKCZwYXJhbXZbbl0sIEdfVFlQRV9EQlVTX01FVEhPRF9JTlZPQ0FUSU9OKTsKICBnX3ZhbHVlX3NldF9vYmplY3QgKCZwYXJhbXZbbisrXSwgaW52b2NhdGlvbik7CiAgaWYgKGluZm8tPnBhc3NfZmRsaXN0KQogICAgewojaWZkZWYgR19PU19VTklYCiAgICAgIGdfdmFsdWVfaW5pdCAoJnBhcmFtdltuXSwgR19UWVBFX1VOSVhfRkRfTElTVCk7CiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAoJnBhcmFtdltuKytdLCBnX2RidXNfbWVzc2FnZV9nZXRfdW5peF9mZF9saXN0IChnX2RidXNfbWV0aG9kX2ludm9jYXRpb25fZ2V0X21lc3NhZ2UgKGludm9jYXRpb24pKSk7CiNlbHNlCiAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOwojZW5kaWYKICAgIH0Kc/MBAAAgIGdfdmFyaWFudF9pdGVyX2luaXQgKCZpdGVyLCBwYXJhbWV0ZXJzKTsKICB3aGlsZSAoKGNoaWxkID0gZ192YXJpYW50X2l0ZXJfbmV4dF92YWx1ZSAoJml0ZXIpKSAhPSBOVUxMKQogICAgewogICAgICBfRXh0ZW5kZWRHREJ1c0FyZ0luZm8gKmFyZ19pbmZvID0gKF9FeHRlbmRlZEdEQnVzQXJnSW5mbyAqKSBpbmZvLT5wYXJlbnRfc3RydWN0LmluX2FyZ3NbbiAtIG51bV9leHRyYV07CiAgICAgIGlmIChhcmdfaW5mby0+dXNlX2d2YXJpYW50KQogICAgICAgIHsKICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnBhcmFtdltuXSwgR19UWVBFX1ZBUklBTlQpOwogICAgICAgICAgZ192YWx1ZV9zZXRfdmFyaWFudCAoJnBhcmFtdltuXSwgY2hpbGQpOwogICAgICAgICAgbisrOwogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIGdfZGJ1c19ndmFyaWFudF90b19ndmFsdWUgKGNoaWxkLCAmcGFyYW12W24rK10pOwogICAgICBnX3ZhcmlhbnRfdW5yZWYgKGNoaWxkKTsKICAgIH0Kcz4AAAAgIHNpZ25hbF9pZCA9IGdfc2lnbmFsX2xvb2t1cCAoaW5mby0+c2lnbmFsX25hbWUsICVzVFlQRV8lcyk7CnNlAQAAICBnX3ZhbHVlX2luaXQgKCZyZXR1cm5fdmFsdWUsIEdfVFlQRV9CT09MRUFOKTsKICBnX3NpZ25hbF9lbWl0diAocGFyYW12LCBzaWduYWxfaWQsIDAsICZyZXR1cm5fdmFsdWUpOwogIGlmICghZ192YWx1ZV9nZXRfYm9vbGVhbiAoJnJldHVybl92YWx1ZSkpCiAgICBnX2RidXNfbWV0aG9kX2ludm9jYXRpb25fcmV0dXJuX2Vycm9yIChpbnZvY2F0aW9uLCBHX0RCVVNfRVJST1IsIEdfREJVU19FUlJPUl9VTktOT1dOX01FVEhPRCwgIk1ldGhvZCAlcyBpcyBub3QgaW1wbGVtZW50ZWQgb24gaW50ZXJmYWNlICVzIiwgbWV0aG9kX25hbWUsIGludGVyZmFjZV9uYW1lKTsKICBnX3ZhbHVlX3Vuc2V0ICgmcmV0dXJuX3ZhbHVlKTsKc2IAAAAgIGZvciAobiA9IDA7IG4gPCBudW1fcGFyYW1zICsgbnVtX2V4dHJhOyBuKyspCiAgICBnX3ZhbHVlX3Vuc2V0ICgmcGFyYW12W25dKTsKICBnX2ZyZWUgKHBhcmFtdik7CnMDAAAAfQoKc8MBAABzdGF0aWMgR1ZhcmlhbnQgKgpfJXNfc2tlbGV0b25faGFuZGxlX2dldF9wcm9wZXJ0eSAoCiAgR0RCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uIEdfR05VQ19VTlVTRUQsCiAgY29uc3QgZ2NoYXIgKnNlbmRlciBHX0dOVUNfVU5VU0VELAogIGNvbnN0IGdjaGFyICpvYmplY3RfcGF0aCBHX0dOVUNfVU5VU0VELAogIGNvbnN0IGdjaGFyICppbnRlcmZhY2VfbmFtZSBHX0dOVUNfVU5VU0VELAogIGNvbnN0IGdjaGFyICpwcm9wZXJ0eV9uYW1lLAogIEdFcnJvciAqKmVycm9yLAogIGdwb2ludGVyIHVzZXJfZGF0YSkKewogICVzU2tlbGV0b24gKnNrZWxldG9uID0gJXMlc19TS0VMRVRPTiAodXNlcl9kYXRhKTsKICBHVmFsdWUgdmFsdWUgPSBHX1ZBTFVFX0lOSVQ7CiAgR1BhcmFtU3BlYyAqcHNwZWM7CiAgX0V4dGVuZGVkR0RCdXNQcm9wZXJ0eUluZm8gKmluZm87CiAgR1ZhcmlhbnQgKnJldDsKc84CAAAgIHJldCA9IE5VTEw7CiAgaW5mbyA9IChfRXh0ZW5kZWRHREJ1c1Byb3BlcnR5SW5mbyAqKSBnX2RidXNfaW50ZXJmYWNlX2luZm9fbG9va3VwX3Byb3BlcnR5ICgoR0RCdXNJbnRlcmZhY2VJbmZvICopICZfJXNfaW50ZXJmYWNlX2luZm8ucGFyZW50X3N0cnVjdCwgcHJvcGVydHlfbmFtZSk7CiAgZ19hc3NlcnQgKGluZm8gIT0gTlVMTCk7CiAgcHNwZWMgPSBnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChHX09CSkVDVF9HRVRfQ0xBU1MgKHNrZWxldG9uKSwgaW5mby0+aHlwaGVuX25hbWUpOwogIGlmIChwc3BlYyA9PSBOVUxMKQogICAgewogICAgICBnX3NldF9lcnJvciAoZXJyb3IsIEdfREJVU19FUlJPUiwgR19EQlVTX0VSUk9SX0lOVkFMSURfQVJHUywgIk5vIHByb3BlcnR5IHdpdGggbmFtZSAlJXMiLCBwcm9wZXJ0eV9uYW1lKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbHVlLCBwc3BlYy0+dmFsdWVfdHlwZSk7CiAgICAgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHNrZWxldG9uKSwgaW5mby0+aHlwaGVuX25hbWUsICZ2YWx1ZSk7CiAgICAgIHJldCA9IGdfZGJ1c19ndmFsdWVfdG9fZ3ZhcmlhbnQgKCZ2YWx1ZSwgR19WQVJJQU5UX1RZUEUgKGluZm8tPnBhcmVudF9zdHJ1Y3Quc2lnbmF0dXJlKSk7CiAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7CiAgICB9CiAgcmV0dXJuIHJldDsKfQoKc9UBAABzdGF0aWMgZ2Jvb2xlYW4KXyVzX3NrZWxldG9uX2hhbmRsZV9zZXRfcHJvcGVydHkgKAogIEdEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiBHX0dOVUNfVU5VU0VELAogIGNvbnN0IGdjaGFyICpzZW5kZXIgR19HTlVDX1VOVVNFRCwKICBjb25zdCBnY2hhciAqb2JqZWN0X3BhdGggR19HTlVDX1VOVVNFRCwKICBjb25zdCBnY2hhciAqaW50ZXJmYWNlX25hbWUgR19HTlVDX1VOVVNFRCwKICBjb25zdCBnY2hhciAqcHJvcGVydHlfbmFtZSwKICBHVmFyaWFudCAqdmFyaWFudCwKICBHRXJyb3IgKiplcnJvciwKICBncG9pbnRlciB1c2VyX2RhdGEpCnsKICAlc1NrZWxldG9uICpza2VsZXRvbiA9ICVzJXNfU0tFTEVUT04gKHVzZXJfZGF0YSk7CiAgR1ZhbHVlIHZhbHVlID0gR19WQUxVRV9JTklUOwogIEdQYXJhbVNwZWMgKnBzcGVjOwogIF9FeHRlbmRlZEdEQnVzUHJvcGVydHlJbmZvICppbmZvOwogIGdib29sZWFuIHJldDsKc94CAAAgIHJldCA9IEZBTFNFOwogIGluZm8gPSAoX0V4dGVuZGVkR0RCdXNQcm9wZXJ0eUluZm8gKikgZ19kYnVzX2ludGVyZmFjZV9pbmZvX2xvb2t1cF9wcm9wZXJ0eSAoKEdEQnVzSW50ZXJmYWNlSW5mbyAqKSAmXyVzX2ludGVyZmFjZV9pbmZvLnBhcmVudF9zdHJ1Y3QsIHByb3BlcnR5X25hbWUpOwogIGdfYXNzZXJ0IChpbmZvICE9IE5VTEwpOwogIHBzcGVjID0gZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoR19PQkpFQ1RfR0VUX0NMQVNTIChza2VsZXRvbiksIGluZm8tPmh5cGhlbl9uYW1lKTsKICBpZiAocHNwZWMgPT0gTlVMTCkKICAgIHsKICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBHX0RCVVNfRVJST1IsIEdfREJVU19FUlJPUl9JTlZBTElEX0FSR1MsICJObyBwcm9wZXJ0eSB3aXRoIG5hbWUgJSVzIiwgcHJvcGVydHlfbmFtZSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICBpZiAoaW5mby0+dXNlX2d2YXJpYW50KQogICAgICAgIGdfdmFsdWVfc2V0X3ZhcmlhbnQgKCZ2YWx1ZSwgdmFyaWFudCk7CiAgICAgIGVsc2UKICAgICAgICBnX2RidXNfZ3ZhcmlhbnRfdG9fZ3ZhbHVlICh2YXJpYW50LCAmdmFsdWUpOwogICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChza2VsZXRvbiksIGluZm8tPmh5cGhlbl9uYW1lLCAmdmFsdWUpOwogICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOwogICAgICByZXQgPSBUUlVFOwogICAgfQogIHJldHVybiByZXQ7Cn0KCnOyAAAAc3RhdGljIGNvbnN0IEdEQnVzSW50ZXJmYWNlVlRhYmxlIF8lc19za2VsZXRvbl92dGFibGUgPQp7CiAgXyVzX3NrZWxldG9uX2hhbmRsZV9tZXRob2RfY2FsbCwKICBfJXNfc2tlbGV0b25faGFuZGxlX2dldF9wcm9wZXJ0eSwKICBfJXNfc2tlbGV0b25faGFuZGxlX3NldF9wcm9wZXJ0eSwKICB7TlVMTH0KfTsKCnOSAAAAc3RhdGljIEdEQnVzSW50ZXJmYWNlSW5mbyAqCiVzX3NrZWxldG9uX2RidXNfaW50ZXJmYWNlX2dldF9pbmZvIChHREJ1c0ludGVyZmFjZVNrZWxldG9uICpza2VsZXRvbiBHX0dOVUNfVU5VU0VEKQp7CiAgcmV0dXJuICVzX2ludGVyZmFjZV9pbmZvICgpOwpzrwAAAHN0YXRpYyBHREJ1c0ludGVyZmFjZVZUYWJsZSAqCiVzX3NrZWxldG9uX2RidXNfaW50ZXJmYWNlX2dldF92dGFibGUgKEdEQnVzSW50ZXJmYWNlU2tlbGV0b24gKnNrZWxldG9uIEdfR05VQ19VTlVTRUQpCnsKICByZXR1cm4gKEdEQnVzSW50ZXJmYWNlVlRhYmxlICopICZfJXNfc2tlbGV0b25fdnRhYmxlOwpzlgAAAHN0YXRpYyBHVmFyaWFudCAqCiVzX3NrZWxldG9uX2RidXNfaW50ZXJmYWNlX2dldF9wcm9wZXJ0aWVzIChHREJ1c0ludGVyZmFjZVNrZWxldG9uICpfc2tlbGV0b24pCnsKICAlc1NrZWxldG9uICpza2VsZXRvbiA9ICVzJXNfU0tFTEVUT04gKF9za2VsZXRvbik7CnPKAwAACiAgR1ZhcmlhbnRCdWlsZGVyIGJ1aWxkZXI7CiAgZ3VpbnQgbjsKICBnX3ZhcmlhbnRfYnVpbGRlcl9pbml0ICgmYnVpbGRlciwgR19WQVJJQU5UX1RZUEUgKCJhe3N2fSIpKTsKICBpZiAoXyVzX2ludGVyZmFjZV9pbmZvLnBhcmVudF9zdHJ1Y3QucHJvcGVydGllcyA9PSBOVUxMKQogICAgZ290byBvdXQ7CiAgZm9yIChuID0gMDsgXyVzX2ludGVyZmFjZV9pbmZvLnBhcmVudF9zdHJ1Y3QucHJvcGVydGllc1tuXSAhPSBOVUxMOyBuKyspCiAgICB7CiAgICAgIEdEQnVzUHJvcGVydHlJbmZvICppbmZvID0gXyVzX2ludGVyZmFjZV9pbmZvLnBhcmVudF9zdHJ1Y3QucHJvcGVydGllc1tuXTsKICAgICAgaWYgKGluZm8tPmZsYWdzICYgR19EQlVTX1BST1BFUlRZX0lORk9fRkxBR1NfUkVBREFCTEUpCiAgICAgICAgewogICAgICAgICAgR1ZhcmlhbnQgKnZhbHVlOwogICAgICAgICAgdmFsdWUgPSBfJXNfc2tlbGV0b25faGFuZGxlX2dldF9wcm9wZXJ0eSAoZ19kYnVzX2ludGVyZmFjZV9za2VsZXRvbl9nZXRfY29ubmVjdGlvbiAoR19EQlVTX0lOVEVSRkFDRV9TS0VMRVRPTiAoc2tlbGV0b24pKSwgTlVMTCwgZ19kYnVzX2ludGVyZmFjZV9za2VsZXRvbl9nZXRfb2JqZWN0X3BhdGggKEdfREJVU19JTlRFUkZBQ0VfU0tFTEVUT04gKHNrZWxldG9uKSksICIlcyIsIGluZm8tPm5hbWUsIE5VTEwsIHNrZWxldG9uKTsKICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgZ192YXJpYW50X3Rha2VfcmVmICh2YWx1ZSk7CiAgICAgICAgICAgICAgZ192YXJpYW50X2J1aWxkZXJfYWRkICgmYnVpbGRlciwgIntzdn0iLCBpbmZvLT5uYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgZ192YXJpYW50X3VucmVmICh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cm91dDoKICByZXR1cm4gZ192YXJpYW50X2J1aWxkZXJfZW5kICgmYnVpbGRlcik7Cn0KCnM4AAAAc3RhdGljIGdib29sZWFuIF8lc19lbWl0X2NoYW5nZWQgKGdwb2ludGVyIHVzZXJfZGF0YSk7CgpzUwAAAHN0YXRpYyB2b2lkCiVzX3NrZWxldG9uX2RidXNfaW50ZXJmYWNlX2ZsdXNoIChHREJ1c0ludGVyZmFjZVNrZWxldG9uICpfc2tlbGV0b24pCnsKc8kBAAAgICVzU2tlbGV0b24gKnNrZWxldG9uID0gJXMlc19TS0VMRVRPTiAoX3NrZWxldG9uKTsKICBnYm9vbGVhbiBlbWl0X2NoYW5nZWQgPSBGQUxTRTsKCiAgZ19tdXRleF9sb2NrICgmc2tlbGV0b24tPnByaXYtPmxvY2spOwogIGlmIChza2VsZXRvbi0+cHJpdi0+Y2hhbmdlZF9wcm9wZXJ0aWVzX2lkbGVfc291cmNlICE9IE5VTEwpCiAgICB7CiAgICAgIGdfc291cmNlX2Rlc3Ryb3kgKHNrZWxldG9uLT5wcml2LT5jaGFuZ2VkX3Byb3BlcnRpZXNfaWRsZV9zb3VyY2UpOwogICAgICBza2VsZXRvbi0+cHJpdi0+Y2hhbmdlZF9wcm9wZXJ0aWVzX2lkbGVfc291cmNlID0gTlVMTDsKICAgICAgZW1pdF9jaGFuZ2VkID0gVFJVRTsKICAgIH0KICBnX211dGV4X3VubG9jayAoJnNrZWxldG9uLT5wcml2LT5sb2NrKTsKCiAgaWYgKGVtaXRfY2hhbmdlZCkKICAgIF8lc19lbWl0X2NoYW5nZWQgKHNrZWxldG9uKTsKcy0AAABzdGF0aWMgdm9pZApfJXNfb25fc2lnbmFsXyVzICgKICAgICVzICpvYmplY3RzDgAAACwKICAgICVzYXJnXyVzc9UAAAApCnsKICAlc1NrZWxldG9uICpza2VsZXRvbiA9ICVzJXNfU0tFTEVUT04gKG9iamVjdCk7CgogIEdMaXN0ICAgICAgKmNvbm5lY3Rpb25zLCAqbDsKICBHVmFyaWFudCAgICpzaWduYWxfdmFyaWFudDsKICBjb25uZWN0aW9ucyA9IGdfZGJ1c19pbnRlcmZhY2Vfc2tlbGV0b25fZ2V0X2Nvbm5lY3Rpb25zIChHX0RCVVNfSU5URVJGQUNFX1NLRUxFVE9OIChza2VsZXRvbikpOwpzOQAAAAogIHNpZ25hbF92YXJpYW50ID0gZ192YXJpYW50X3JlZl9zaW5rIChnX3ZhcmlhbnRfbmV3ICgiKHMCAAAAJXNzAgAAACkicxsAAAAsCiAgICAgICAgICAgICAgICAgICBhcmdfJXNzBAAAACkpOwpzJQEAACAgZm9yIChsID0gY29ubmVjdGlvbnM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCiAgICB7CiAgICAgIEdEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGwtPmRhdGE7CiAgICAgIGdfZGJ1c19jb25uZWN0aW9uX2VtaXRfc2lnbmFsIChjb25uZWN0aW9uLAogICAgICAgIE5VTEwsIGdfZGJ1c19pbnRlcmZhY2Vfc2tlbGV0b25fZ2V0X29iamVjdF9wYXRoIChHX0RCVVNfSU5URVJGQUNFX1NLRUxFVE9OIChza2VsZXRvbikpLCAiJXMiLCAiJXMiLAogICAgICAgIHNpZ25hbF92YXJpYW50LCBOVUxMKTsKICAgIH0KcyQAAAAgIGdfdmFyaWFudF91bnJlZiAoc2lnbmFsX3ZhcmlhbnQpOwpzMgAAACAgZ19saXN0X2ZyZWVfZnVsbCAoY29ubmVjdGlvbnMsIGdfb2JqZWN0X3VucmVmKTsKczUAAABzdGF0aWMgdm9pZCAlc19za2VsZXRvbl9pZmFjZV9pbml0ICglc0lmYWNlICppZmFjZSk7CnNSAAAAR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKCVzU2tlbGV0b24sICVzX3NrZWxldG9uLCBHX1RZUEVfREJVU19JTlRFUkZBQ0VfU0tFTEVUT04sCnM0AAAAICAgICAgICAgICAgICAgICAgICAgICAgIEdfQUREX1BSSVZBVEUgKCVzU2tlbGV0b24pCnNWAAAAICAgICAgICAgICAgICAgICAgICAgICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoJXNUWVBFXyVzLCAlc19za2VsZXRvbl9pZmFjZV9pbml0KSk7CgpzNQAAAHN0YXRpYyB2b2lkCiVzX3NrZWxldG9uX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCnsKczEAAAAgICVzU2tlbGV0b24gKnNrZWxldG9uID0gJXMlc19TS0VMRVRPTiAob2JqZWN0KTsKc1oAAAAgIGd1aW50IG47CiAgZm9yIChuID0gMDsgbiA8ICVkOyBuKyspCiAgICBnX3ZhbHVlX3Vuc2V0ICgmc2tlbGV0b24tPnByaXYtPnByb3BlcnRpZXNbbl0pOwpzJwAAACAgZ19mcmVlIChza2VsZXRvbi0+cHJpdi0+cHJvcGVydGllcyk7CnNiAAAAICBnX2xpc3RfZnJlZV9mdWxsIChza2VsZXRvbi0+cHJpdi0+Y2hhbmdlZF9wcm9wZXJ0aWVzLCAoR0Rlc3Ryb3lOb3RpZnkpIF9jaGFuZ2VkX3Byb3BlcnR5X2ZyZWUpOwpzPgAAACAgaWYgKHNrZWxldG9uLT5wcml2LT5jaGFuZ2VkX3Byb3BlcnRpZXNfaWRsZV9zb3VyY2UgIT0gTlVMTCkKc0cAAAAgICAgZ19zb3VyY2VfZGVzdHJveSAoc2tlbGV0b24tPnByaXYtPmNoYW5nZWRfcHJvcGVydGllc19pZGxlX3NvdXJjZSk7CnMyAAAAICBnX21haW5fY29udGV4dF91bnJlZiAoc2tlbGV0b24tPnByaXYtPmNvbnRleHQpOwpzKQAAACAgZ19tdXRleF9jbGVhciAoJnNrZWxldG9uLT5wcml2LT5sb2NrKTsKc0MAAAAgIEdfT0JKRUNUX0NMQVNTICglc19za2VsZXRvbl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKfQoKc5MAAABzdGF0aWMgdm9pZAolc19za2VsZXRvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAogIGd1aW50ICAgICAgICAgcHJvcF9pZCwKICBHVmFsdWUgICAgICAgKnZhbHVlLAogIEdQYXJhbVNwZWMgICAqcHNwZWMgR19HTlVDX1VOVVNFRCkKewpz9AAAACAgJXNTa2VsZXRvbiAqc2tlbGV0b24gPSAlcyVzX1NLRUxFVE9OIChvYmplY3QpOwogIGdfYXNzZXJ0IChwcm9wX2lkICE9IDAgJiYgcHJvcF9pZCAtIDEgPCAlZCk7CiAgZ19tdXRleF9sb2NrICgmc2tlbGV0b24tPnByaXYtPmxvY2spOwogIGdfdmFsdWVfY29weSAoJnNrZWxldG9uLT5wcml2LT5wcm9wZXJ0aWVzW3Byb3BfaWQgLSAxXSwgdmFsdWUpOwogIGdfbXV0ZXhfdW5sb2NrICgmc2tlbGV0b24tPnByaXYtPmxvY2spOwpzbAAAAHN0YXRpYyBnYm9vbGVhbgpfJXNfZW1pdF9jaGFuZ2VkIChncG9pbnRlciB1c2VyX2RhdGEpCnsKICAlc1NrZWxldG9uICpza2VsZXRvbiA9ICVzJXNfU0tFTEVUT04gKHVzZXJfZGF0YSk7CnPFBwAAICBHTGlzdCAqbDsKICBHVmFyaWFudEJ1aWxkZXIgYnVpbGRlcjsKICBHVmFyaWFudEJ1aWxkZXIgaW52YWxpZGF0ZWRfYnVpbGRlcjsKICBndWludCBudW1fY2hhbmdlczsKCiAgZ19tdXRleF9sb2NrICgmc2tlbGV0b24tPnByaXYtPmxvY2spOwogIGdfdmFyaWFudF9idWlsZGVyX2luaXQgKCZidWlsZGVyLCBHX1ZBUklBTlRfVFlQRSAoImF7c3Z9IikpOwogIGdfdmFyaWFudF9idWlsZGVyX2luaXQgKCZpbnZhbGlkYXRlZF9idWlsZGVyLCBHX1ZBUklBTlRfVFlQRSAoImFzIikpOwogIGZvciAobCA9IHNrZWxldG9uLT5wcml2LT5jaGFuZ2VkX3Byb3BlcnRpZXMsIG51bV9jaGFuZ2VzID0gMDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKICAgIHsKICAgICAgQ2hhbmdlZFByb3BlcnR5ICpjcCA9IGwtPmRhdGE7CiAgICAgIEdWYXJpYW50ICp2YXJpYW50OwogICAgICBjb25zdCBHVmFsdWUgKmN1cl92YWx1ZTsKCiAgICAgIGN1cl92YWx1ZSA9ICZza2VsZXRvbi0+cHJpdi0+cHJvcGVydGllc1tjcC0+cHJvcF9pZCAtIDFdOwogICAgICBpZiAoIV9nX3ZhbHVlX2VxdWFsIChjdXJfdmFsdWUsICZjcC0+b3JpZ192YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgdmFyaWFudCA9IGdfZGJ1c19ndmFsdWVfdG9fZ3ZhcmlhbnQgKGN1cl92YWx1ZSwgR19WQVJJQU5UX1RZUEUgKGNwLT5pbmZvLT5wYXJlbnRfc3RydWN0LnNpZ25hdHVyZSkpOwogICAgICAgICAgZ192YXJpYW50X2J1aWxkZXJfYWRkICgmYnVpbGRlciwgIntzdn0iLCBjcC0+aW5mby0+cGFyZW50X3N0cnVjdC5uYW1lLCB2YXJpYW50KTsKICAgICAgICAgIGdfdmFyaWFudF91bnJlZiAodmFyaWFudCk7CiAgICAgICAgICBudW1fY2hhbmdlcysrOwogICAgICAgIH0KICAgIH0KICBpZiAobnVtX2NoYW5nZXMgPiAwKQogICAgewogICAgICBHTGlzdCAqY29ubmVjdGlvbnMsICpsbDsKICAgICAgR1ZhcmlhbnQgKnNpZ25hbF92YXJpYW50OwogICAgICBzaWduYWxfdmFyaWFudCA9IGdfdmFyaWFudF9yZWZfc2luayAoZ192YXJpYW50X25ldyAoIihzYXtzdn1hcykiLCAiJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1aWxkZXIsICZpbnZhbGlkYXRlZF9idWlsZGVyKSk7CiAgICAgIGNvbm5lY3Rpb25zID0gZ19kYnVzX2ludGVyZmFjZV9za2VsZXRvbl9nZXRfY29ubmVjdGlvbnMgKEdfREJVU19JTlRFUkZBQ0VfU0tFTEVUT04gKHNrZWxldG9uKSk7CiAgICAgIGZvciAobGwgPSBjb25uZWN0aW9uczsgbGwgIT0gTlVMTDsgbGwgPSBsbC0+bmV4dCkKICAgICAgICB7CiAgICAgICAgICBHREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBsbC0+ZGF0YTsKCiAgICAgICAgICBnX2RidXNfY29ubmVjdGlvbl9lbWl0X3NpZ25hbCAoY29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBnX2RidXNfaW50ZXJmYWNlX3NrZWxldG9uX2dldF9vYmplY3RfcGF0aCAoR19EQlVTX0lOVEVSRkFDRV9TS0VMRVRPTiAoc2tlbGV0b24pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3BlcnRpZXNDaGFuZ2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxfdmFyaWFudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9CiAgICAgIGdfdmFyaWFudF91bnJlZiAoc2lnbmFsX3ZhcmlhbnQpOwogICAgICBnX2xpc3RfZnJlZV9mdWxsIChjb25uZWN0aW9ucywgZ19vYmplY3RfdW5yZWYpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgZ192YXJpYW50X2J1aWxkZXJfY2xlYXIgKCZidWlsZGVyKTsKICAgICAgZ192YXJpYW50X2J1aWxkZXJfY2xlYXIgKCZpbnZhbGlkYXRlZF9idWlsZGVyKTsKICAgIH0Kcy0AAAAgIHNrZWxldG9uLT5wcml2LT5jaGFuZ2VkX3Byb3BlcnRpZXMgPSBOVUxMOwpzOQAAACAgc2tlbGV0b24tPnByaXYtPmNoYW5nZWRfcHJvcGVydGllc19pZGxlX3NvdXJjZSA9IE5VTEw7CnMqAAAAICBnX211dGV4X3VubG9jayAoJnNrZWxldG9uLT5wcml2LT5sb2NrKTsKcxMAAAAgIHJldHVybiBGQUxTRTsKfQoKc5IBAABzdGF0aWMgdm9pZApfJXNfc2NoZWR1bGVfZW1pdF9jaGFuZ2VkICglc1NrZWxldG9uICpza2VsZXRvbiwgY29uc3QgX0V4dGVuZGVkR0RCdXNQcm9wZXJ0eUluZm8gKmluZm8sIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqb3JpZ192YWx1ZSkKewogIENoYW5nZWRQcm9wZXJ0eSAqY3A7CiAgR0xpc3QgKmw7CiAgY3AgPSBOVUxMOwogIGZvciAobCA9IHNrZWxldG9uLT5wcml2LT5jaGFuZ2VkX3Byb3BlcnRpZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCiAgICB7CiAgICAgIENoYW5nZWRQcm9wZXJ0eSAqaV9jcCA9IGwtPmRhdGE7CiAgICAgIGlmIChpX2NwLT5pbmZvID09IGluZm8pCiAgICAgICAgewogICAgICAgICAgY3AgPSBpX2NwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQpzVAEAACAgaWYgKGNwID09IE5VTEwpCiAgICB7CiAgICAgIGNwID0gZ19uZXcwIChDaGFuZ2VkUHJvcGVydHksIDEpOwogICAgICBjcC0+cHJvcF9pZCA9IHByb3BfaWQ7CiAgICAgIGNwLT5pbmZvID0gaW5mbzsKICAgICAgc2tlbGV0b24tPnByaXYtPmNoYW5nZWRfcHJvcGVydGllcyA9IGdfbGlzdF9wcmVwZW5kIChza2VsZXRvbi0+cHJpdi0+Y2hhbmdlZF9wcm9wZXJ0aWVzLCBjcCk7CiAgICAgIGdfdmFsdWVfaW5pdCAoJmNwLT5vcmlnX3ZhbHVlLCBHX1ZBTFVFX1RZUEUgKG9yaWdfdmFsdWUpKTsKICAgICAgZ192YWx1ZV9jb3B5IChvcmlnX3ZhbHVlLCAmY3AtPm9yaWdfdmFsdWUpOwogICAgfQp9CgpzUAMAAHN0YXRpYyB2b2lkCiVzX3NrZWxldG9uX25vdGlmeSAoR09iamVjdCAgICAgICpvYmplY3QsCiAgR1BhcmFtU3BlYyAqcHNwZWMgR19HTlVDX1VOVVNFRCkKewogICVzU2tlbGV0b24gKnNrZWxldG9uID0gJXMlc19TS0VMRVRPTiAob2JqZWN0KTsKICBnX211dGV4X2xvY2sgKCZza2VsZXRvbi0+cHJpdi0+bG9jayk7CiAgaWYgKHNrZWxldG9uLT5wcml2LT5jaGFuZ2VkX3Byb3BlcnRpZXMgIT0gTlVMTCAmJgogICAgICBza2VsZXRvbi0+cHJpdi0+Y2hhbmdlZF9wcm9wZXJ0aWVzX2lkbGVfc291cmNlID09IE5VTEwpCiAgICB7CiAgICAgIHNrZWxldG9uLT5wcml2LT5jaGFuZ2VkX3Byb3BlcnRpZXNfaWRsZV9zb3VyY2UgPSBnX2lkbGVfc291cmNlX25ldyAoKTsKICAgICAgZ19zb3VyY2Vfc2V0X3ByaW9yaXR5IChza2VsZXRvbi0+cHJpdi0+Y2hhbmdlZF9wcm9wZXJ0aWVzX2lkbGVfc291cmNlLCBHX1BSSU9SSVRZX0RFRkFVTFQpOwogICAgICBnX3NvdXJjZV9zZXRfY2FsbGJhY2sgKHNrZWxldG9uLT5wcml2LT5jaGFuZ2VkX3Byb3BlcnRpZXNfaWRsZV9zb3VyY2UsIF8lc19lbWl0X2NoYW5nZWQsIGdfb2JqZWN0X3JlZiAoc2tlbGV0b24pLCAoR0Rlc3Ryb3lOb3RpZnkpIGdfb2JqZWN0X3VucmVmKTsKICAgICAgZ19zb3VyY2VfYXR0YWNoIChza2VsZXRvbi0+cHJpdi0+Y2hhbmdlZF9wcm9wZXJ0aWVzX2lkbGVfc291cmNlLCBza2VsZXRvbi0+cHJpdi0+Y29udGV4dCk7CiAgICAgIGdfc291cmNlX3VucmVmIChza2VsZXRvbi0+cHJpdi0+Y2hhbmdlZF9wcm9wZXJ0aWVzX2lkbGVfc291cmNlKTsKICAgIH0KICBnX211dGV4X3VubG9jayAoJnNrZWxldG9uLT5wcml2LT5sb2NrKTsKfQoKc4UAAABzdGF0aWMgdm9pZAolc19za2VsZXRvbl9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAogIGd1aW50ICAgICAgICAgcHJvcF9pZCwKICBjb25zdCBHVmFsdWUgKnZhbHVlLAogIEdQYXJhbVNwZWMgICAqcHNwZWMpCnsKc64CAAAgICVzU2tlbGV0b24gKnNrZWxldG9uID0gJXMlc19TS0VMRVRPTiAob2JqZWN0KTsKICBnX2Fzc2VydCAocHJvcF9pZCAhPSAwICYmIHByb3BfaWQgLSAxIDwgJWQpOwogIGdfbXV0ZXhfbG9jayAoJnNrZWxldG9uLT5wcml2LT5sb2NrKTsKICBnX29iamVjdF9mcmVlemVfbm90aWZ5IChvYmplY3QpOwogIGlmICghX2dfdmFsdWVfZXF1YWwgKHZhbHVlLCAmc2tlbGV0b24tPnByaXYtPnByb3BlcnRpZXNbcHJvcF9pZCAtIDFdKSkKICAgIHsKICAgICAgaWYgKGdfZGJ1c19pbnRlcmZhY2Vfc2tlbGV0b25fZ2V0X2Nvbm5lY3Rpb24gKEdfREJVU19JTlRFUkZBQ0VfU0tFTEVUT04gKHNrZWxldG9uKSkgIT0gTlVMTCkKICAgICAgICBfJXNfc2NoZWR1bGVfZW1pdF9jaGFuZ2VkIChza2VsZXRvbiwgXyVzX3Byb3BlcnR5X2luZm9fcG9pbnRlcnNbcHJvcF9pZCAtIDFdLCBwcm9wX2lkLCAmc2tlbGV0b24tPnByaXYtPnByb3BlcnRpZXNbcHJvcF9pZCAtIDFdKTsKICAgICAgZ192YWx1ZV9jb3B5ICh2YWx1ZSwgJnNrZWxldG9uLT5wcml2LT5wcm9wZXJ0aWVzW3Byb3BfaWQgLSAxXSk7CiAgICAgIGdfb2JqZWN0X25vdGlmeV9ieV9wc3BlYyAob2JqZWN0LCBwc3BlYyk7CiAgICB9CiAgZ19tdXRleF91bmxvY2sgKCZza2VsZXRvbi0+cHJpdi0+bG9jayk7CiAgZ19vYmplY3RfdGhhd19ub3RpZnkgKG9iamVjdCk7CnN2AAAAc3RhdGljIHZvaWQKJXNfc2tlbGV0b25faW5pdCAoJXNTa2VsZXRvbiAqc2tlbGV0b24pCnsKICBza2VsZXRvbi0+cHJpdiA9ICVzX3NrZWxldG9uX2dldF9pbnN0YW5jZV9wcml2YXRlIChza2VsZXRvbik7CnMoAAAAICBnX211dGV4X2luaXQgKCZza2VsZXRvbi0+cHJpdi0+bG9jayk7CnNCAAAAICBza2VsZXRvbi0+cHJpdi0+Y29udGV4dCA9IGdfbWFpbl9jb250ZXh0X3JlZl90aHJlYWRfZGVmYXVsdCAoKTsKczQAAAAgIHNrZWxldG9uLT5wcml2LT5wcm9wZXJ0aWVzID0gZ19uZXcwIChHVmFsdWUsICVkKTsKczYAAAAgIGdfdmFsdWVfaW5pdCAoJnNrZWxldG9uLT5wcml2LT5wcm9wZXJ0aWVzWyVkXSwgJXMpOwppAQAAAHMsAAAAc3RhdGljICVzCiVzX3NrZWxldG9uX2dldF8lcyAoJXMgKm9iamVjdCkKewpzjwAAACAgJXN2YWx1ZTsKICBnX211dGV4X2xvY2sgKCZza2VsZXRvbi0+cHJpdi0+bG9jayk7CiAgdmFsdWUgPSAlcyAoJihza2VsZXRvbi0+cHJpdi0+cHJvcGVydGllc1slZF0pKTsKICBnX211dGV4X3VubG9jayAoJnNrZWxldG9uLT5wcml2LT5sb2NrKTsKcxAAAAAgIHJldHVybiB2YWx1ZTsKcwIAAAB9CnPpAAAAc3RhdGljIHZvaWQKJXNfc2tlbGV0b25fY2xhc3NfaW5pdCAoJXNTa2VsZXRvbkNsYXNzICprbGFzcykKewogIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKICBHREJ1c0ludGVyZmFjZVNrZWxldG9uQ2xhc3MgKnNrZWxldG9uX2NsYXNzOwoKICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9ICVzX3NrZWxldG9uX2ZpbmFsaXplOwpzqQAAACAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gJXNfc2tlbGV0b25fZ2V0X3Byb3BlcnR5OwogIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICVzX3NrZWxldG9uX3NldF9wcm9wZXJ0eTsKICBnb2JqZWN0X2NsYXNzLT5ub3RpZnkgICAgICAgPSAlc19za2VsZXRvbl9ub3RpZnk7CgpzLgAAAAogICVzX292ZXJyaWRlX3Byb3BlcnRpZXMgKGdvYmplY3RfY2xhc3MsIDEpOwpzPQAAAAogIHNrZWxldG9uX2NsYXNzID0gR19EQlVTX0lOVEVSRkFDRV9TS0VMRVRPTl9DTEFTUyAoa2xhc3MpOwpzQgAAACAgc2tlbGV0b25fY2xhc3MtPmdldF9pbmZvID0gJXNfc2tlbGV0b25fZGJ1c19pbnRlcmZhY2VfZ2V0X2luZm87CnNOAAAAICBza2VsZXRvbl9jbGFzcy0+Z2V0X3Byb3BlcnRpZXMgPSAlc19za2VsZXRvbl9kYnVzX2ludGVyZmFjZV9nZXRfcHJvcGVydGllczsKczwAAAAgIHNrZWxldG9uX2NsYXNzLT5mbHVzaCA9ICVzX3NrZWxldG9uX2RidXNfaW50ZXJmYWNlX2ZsdXNoOwpzRgAAACAgc2tlbGV0b25fY2xhc3MtPmdldF92dGFibGUgPSAlc19za2VsZXRvbl9kYnVzX2ludGVyZmFjZV9nZXRfdnRhYmxlOwpzNgAAAHN0YXRpYyB2b2lk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fAEAagkAZgYAFnQFAIMCAIMBAAF8AABqCwB8AQB8AABqAABkDgCDAwABfAAAagAAagEAZBIAfAEAagkAfAAAagYAfAEAag0Aag4AgwAAfAAAagQAZgQAFoMBAAF8AABqAABqAQBkEwB8AQBqCgB8AABqDAB8AQBqDQBmAwAWgwEAAXHfAld8AABqAABqAQBkAwCDAQABfAAAagAAagEAZBQAfAAAagYAFoMBAAF8AABqAABqAQB8AABqAgBqAwBkFQB8AABqBAB8AABqBABmAgAWdAUAgwIAgwEAAXwAAGoAAGoBAGQWAIMBAAF8AABqAABqAQBkAwCDAQABfAAAagAAagEAfAAAagIAagMAZBcAfAAAagQAfAAAagQAZgIAFnQFAIMCAIMBAAF8AABqAABqAQBkFgCDAQABfAAAagAAagEAZAMAgwEAAXwAAGoAAGoBAGQYAHwAAGoGAHwAAGoGAHwAAGoEAGYDABaDAQABfAAAagAAagEAZBkAfAAAagYAfAAAagYAfAAAagYAZgMAFoMBAAF8AABqAABqAQBkAwCDAQABfAAAagAAagEAZBoAfAAAagQAfAAAagYAfAAAagwAfAAAagYAfAAAagYAfAAAagYAZgYAFoMBAAF8AABqAABqAQBkGwB8AABqBgB8AABqBABmAgAWgwEAAXwAAGoAAGoBAGQcAHwAAGoGABaDAQABfAAAagAAagEAZAwAZDQAFoMBAAF8AABqAABqAQBkHQB8AABqBgB8AABqBAB8AABqDABmAwAWgwEAAWQeAH0CAHg4AHwAAGoHAERdLQB9AQB8AABqAABqAQBkHwB8AgB8AQBqCgBmAgAWgwEAAXwCAGQeADd9AgBxhAVXfAAAagAAagEAZCAAZDUAFoMBAAF8AABqAABqAQBkIQB8AABqBgB8AABqBAB8AABqBgB8AABqBgBmBAAWgwEAAWQeAH0CAHg4AHwAAGoHAERdLQB9AQB8AABqAABqAQBkIgB8AgB8AQBqCABmAgAWgwEAAXwCAGQeADd9AgBxBQZXfAAAagAAagEAZAwAgwEAAXwAAGoAAGoBAHwAAGoCAGoDAGQjAHwAAGoGABZ0BQCDAgCDAQABfAAAagAAagEAZCQAfAAAagQAfAAAagYAfAAAagwAfAAAagwAZgQAFoMBAAF8AABqAABqAQB8AABqAgBqAwBkJQB8AABqBAB8AABqBABmAgAWdAUAgwIAgwEAAXwAAGoAAGoBAGQWAIMBAAF8AABqAABqAQBkAwCDAQABfAAAagAAagEAfAAAagIAagMAZCYAfAAAagQAfAAAagQAZgIAFnQFAIMCAIMBAAF8AABqAABqAQBkFgCDAQABfAAAagAAagEAZAMAgwEAAXwAAGoAAGoBAGQnAHwAAGoGAHwAAGoGAHwAAGoEAGYDABaDAQABfAAAagAAagEAZAMAgwEAAXwAAGoAAGoBAGQoAHwAAGoGAHwAAGoGAHwAAGoGAGYDABaDAQABfAAAagAAagEAZCkAfAAAagQAfAAAagYAfAAAagwAfAAAagYAfAAAagYAfAAAagYAZgYAFoMBAAF8AABqAABqAQBkKgB8AABqBgB8AABqBABmAgAWgwEAAXwAAGoAAGoBAGQrAHwAAGoGAHwAAGoEAHwAAGoMAGYDABaDAQABZB4AfQIAeEQAfAAAagcARF05AH0BAHwAAGoAAGoBAGQsAHwCAHwAAGoMAHwBAGoNAHwBAGoKAGYEABaDAQABfAIAZB4AN30CAHEgCFd8AABqAABqAQBkIABkNgAWgwEAAXwAAGoAAGoBAGQtAHwAAGoGAHwAAGoEAHwAAGoMAGYDABaDAQABZB4AfQIAeDgAfAAAagcARF0tAH0BAHwAAGoAAGoBAGQfAHwCAHwBAGoKAGYCABaDAQABfAIAZB4AN30CAHGnCFd8AABqAABqAQBkIABkNwAWgwEAAXwAAGoAAGoBAGQuAHwAAGoGAHwAAGoEAHwAAGoGAHwAAGoGAGYEABaDAQABZB4AfQIAeDgAfAAAagcARF0tAH0BAHwAAGoAAGoBAGQiAHwCAHwBAGoIAGYCABaDAQABfAIAZB4AN30CAHEoCVd8AABqAABqAQBkDACDAQABfAAAagAAagEAfAAAagIAagMAZC8AfAAAagYAFnQFAIMCAIMBAAF8AABqAABqAQBkMAB8AABqBAB8AABqBgB8AABqDAB8AABqDABmBAAWgwEAAXi9AHwAAGoHAERdsgB9AQB8AABqAABqAQB8AABqAgBqAwBkMQB8AABqBgB8AQBqDQBqDgCDAAB8AABqBAB8AQBqCQB8AQBqCQB8AQBqCgBmBgAWdAUAgwIAgwEAAXwAAGoLAHwBAHwAAGoAAGQOAIMDAAF8AABqAABqAQBkMgB8AABqBgB8AQBqDQBqDgCDAAB8AABqBAB8AQBqCQBmBAAWgwEAAXwAAGoAAGoBAGQzAHwBAGoIABaDAQABccUJV3wAAGoAAGoBAGQDAIMBAAFkAABTKDgAAABOc9AAAAAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogQ29kZSBmb3IgT2JqZWN0LCBPYmplY3RQcm94eSBhbmQgT2JqZWN0U2tlbGV0b24KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKcxkBAAAvKioKICogU0VDVElPTjolc09iamVjdAogKiBAdGl0bGU6ICVzT2JqZWN0CiAqIEBzaG9ydF9kZXNjcmlwdGlvbjogU3BlY2lhbGl6ZWQgR0RCdXNPYmplY3QgdHlwZXMKICoKICogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSAjJXNPYmplY3QsICMlc09iamVjdFByb3h5LCBhbmQgIyVzT2JqZWN0U2tlbGV0b24gdHlwZXMgd2hpY2ggbWFrZSBpdCBlYXNpZXIgdG8gd29yayB3aXRoIG9iamVjdHMgaW1wbGVtZW50aW5nIGdlbmVyYXRlZCB0eXBlcyBmb3IgRC1CdXMgaW50ZXJmYWNlcy4KICovCnMBAAAACnNYAAAALyoqCiAqICVzT2JqZWN0OgogKgogKiBUaGUgIyVzT2JqZWN0IHR5cGUgaXMgYSBzcGVjaWFsaXplZCBjb250YWluZXIgb2YgaW50ZXJmYWNlcy4KICovCnNzAAAALyoqCiAqICVzT2JqZWN0SWZhY2U6CiAqIEBwYXJlbnRfaWZhY2U6IFRoZSBwYXJlbnQgaW50ZXJmYWNlLgogKgogKiBWaXJ0dWFsIHRhYmxlIGZvciB0aGUgIyVzT2JqZWN0IGludGVyZmFjZS4KICovCnMpAAAAdHlwZWRlZiAlc09iamVjdElmYWNlICVzT2JqZWN0SW50ZXJmYWNlOwpzjAAAAEdfREVGSU5FX0lOVEVSRkFDRV9XSVRIX0NPREUgKCVzT2JqZWN0LCAlc29iamVjdCwgR19UWVBFX09CSkVDVCwgZ190eXBlX2ludGVyZmFjZV9hZGRfcHJlcmVxdWlzaXRlIChnX2RlZmluZV90eXBlX2lkLCBHX1RZUEVfREJVU19PQkpFQ1QpKTsKczsAAABzdGF0aWMgdm9pZAolc29iamVjdF9kZWZhdWx0X2luaXQgKCVzT2JqZWN0SWZhY2UgKmlmYWNlKQp7CnO7AAAAICAvKioKICAgKiAlc09iamVjdDolczoKICAgKgogICAqIFRoZSAjJXMgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgRC1CdXMgaW50ZXJmYWNlICMlcywgaWYgYW55LgogICAqCiAgICogQ29ubmVjdCB0byB0aGUgI0dPYmplY3Q6Om5vdGlmeSBzaWduYWwgdG8gZ2V0IGluZm9ybWVkIG9mIHByb3BlcnR5IGNoYW5nZXMuCmkCAAAAc40AAAAgIGdfb2JqZWN0X2ludGVyZmFjZV9pbnN0YWxsX3Byb3BlcnR5IChpZmFjZSwgZ19wYXJhbV9zcGVjX29iamVjdCAoIiVzIiwgIiVzIiwgIiVzIiwgJXNUWVBFXyVzLCBHX1BBUkFNX1JFQURXUklURXxHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CgpzAwAAAH0KCnMDAQAALyoqCiAqICVzb2JqZWN0X2dldF8lczoKICogQG9iamVjdDogQSAjJXNPYmplY3QuCiAqCiAqIEdldHMgdGhlICMlcyBpbnN0YW5jZSBmb3IgdGhlIEQtQnVzIGludGVyZmFjZSAjJXMgb24gQG9iamVjdCwgaWYgYW55LgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgZnVsbCk6IEEgIyVzIHRoYXQgbXVzdCBiZSBmcmVlZCB3aXRoIGdfb2JqZWN0X3VucmVmKCkgb3IgJSVOVUxMIGlmIEBvYmplY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UuCmkAAAAAcycAAAAlcyAqJXNvYmplY3RfZ2V0XyVzICglc09iamVjdCAqb2JqZWN0KQpzmQAAAHsKICBHREJ1c0ludGVyZmFjZSAqcmV0OwogIHJldCA9IGdfZGJ1c19vYmplY3RfZ2V0X2ludGVyZmFjZSAoR19EQlVTX09CSkVDVCAob2JqZWN0KSwgIiVzIik7CiAgaWYgKHJldCA9PSBOVUxMKQogICAgcmV0dXJuIE5VTEw7CiAgcmV0dXJuICVzJXMgKHJldCk7Cn0KCnPzAQAALyoqCiAqICVzb2JqZWN0X3BlZWtfJXM6IChza2lwKQogKiBAb2JqZWN0OiBBICMlc09iamVjdC4KICoKICogTGlrZSAlc29iamVjdF9nZXRfJXMoKSBidXQgZG9lc24ndCBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSByZXR1cm5lZCBvYmplY3QuCiAqCiAqIDx3YXJuaW5nPkl0IGlzIG5vdCBzYWZlIHRvIHVzZSB0aGUgcmV0dXJuZWQgb2JqZWN0IGlmIHlvdSBhcmUgb24gYW5vdGhlciB0aHJlYWQgdGhhbiB0aGUgb25lIHdoZXJlIHRoZSAjR0RCdXNPYmplY3RNYW5hZ2VyQ2xpZW50IG9yICNHREJ1c09iamVjdE1hbmFnZXJTZXJ2ZXIgZm9yIEBvYmplY3QgaXMgcnVubmluZy48L3dhcm5pbmc+CiAqCiAqIFJldHVybnM6ICh0cmFuc2ZlciBub25lKTogQSAjJXMgb3IgJSVOVUxMIGlmIEBvYmplY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UuIERvIG5vdCBmcmVlIHRoZSByZXR1cm5lZCBvYmplY3QsIGl0IGlzIG93bmVkIGJ5IEBvYmplY3QuCnMoAAAAJXMgKiVzb2JqZWN0X3BlZWtfJXMgKCVzT2JqZWN0ICpvYmplY3QpCnOxAAAAewogIEdEQnVzSW50ZXJmYWNlICpyZXQ7CiAgcmV0ID0gZ19kYnVzX29iamVjdF9nZXRfaW50ZXJmYWNlIChHX0RCVVNfT0JKRUNUIChvYmplY3QpLCAiJXMiKTsKICBpZiAocmV0ID09IE5VTEwpCiAgICByZXR1cm4gTlVMTDsKICBnX29iamVjdF91bnJlZiAocmV0KTsKICByZXR1cm4gJXMlcyAocmV0KTsKfQoKc88AAABzdGF0aWMgdm9pZAolc29iamVjdF9ub3RpZnkgKEdEQnVzT2JqZWN0ICpvYmplY3QsIEdEQnVzSW50ZXJmYWNlICppbnRlcmZhY2UpCnsKICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChvYmplY3QpLCAoKF9FeHRlbmRlZEdEQnVzSW50ZXJmYWNlSW5mbyAqKSBnX2RidXNfaW50ZXJmYWNlX2dldF9pbmZvIChpbnRlcmZhY2UpKS0+aHlwaGVuX25hbWUpOwp9CgpziAAAAC8qKgogKiAlc09iamVjdFByb3h5OgogKgogKiBUaGUgIyVzT2JqZWN0UHJveHkgc3RydWN0dXJlIGNvbnRhaW5zIG9ubHkgcHJpdmF0ZSBkYXRhIGFuZCBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgcHJvdmlkZWQgQVBJLgpzBAAAACAqLwpzaQAAAC8qKgogKiAlc09iamVjdFByb3h5Q2xhc3M6CiAqIEBwYXJlbnRfY2xhc3M6IFRoZSBwYXJlbnQgY2xhc3MuCiAqCiAqIENsYXNzIHN0cnVjdHVyZSBmb3IgIyVzT2JqZWN0UHJveHkuCnNaAAAAc3RhdGljIHZvaWQKJXNvYmplY3RfcHJveHlfXyVzb2JqZWN0X2lmYWNlX2luaXQgKCVzT2JqZWN0SWZhY2UgKmlmYWNlIEdfR05VQ19VTlVTRUQpCnsKfQoKc64AAABzdGF0aWMgdm9pZAolc29iamVjdF9wcm94eV9fZ19kYnVzX29iamVjdF9pZmFjZV9pbml0IChHREJ1c09iamVjdElmYWNlICppZmFjZSkKewogIGlmYWNlLT5pbnRlcmZhY2VfYWRkZWQgPSAlc29iamVjdF9ub3RpZnk7CiAgaWZhY2UtPmludGVyZmFjZV9yZW1vdmVkID0gJXNvYmplY3Rfbm90aWZ5Owp9CgpzJwEAAEdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICglc09iamVjdFByb3h5LCAlc29iamVjdF9wcm94eSwgR19UWVBFX0RCVVNfT0JKRUNUX1BST1hZLAogICAgICAgICAgICAgICAgICAgICAgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFICglc1RZUEVfT0JKRUNULCAlc29iamVjdF9wcm94eV9fJXNvYmplY3RfaWZhY2VfaW5pdCkKICAgICAgICAgICAgICAgICAgICAgICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR19UWVBFX0RCVVNfT0JKRUNULCAlc29iamVjdF9wcm94eV9fZ19kYnVzX29iamVjdF9pZmFjZV9pbml0KSk7CgpzSwAAAHN0YXRpYyB2b2lkCiVzb2JqZWN0X3Byb3h5X2luaXQgKCVzT2JqZWN0UHJveHkgKm9iamVjdCBHX0dOVUNfVU5VU0VEKQp7Cn0KCnPWAAAAc3RhdGljIHZvaWQKJXNvYmplY3RfcHJveHlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKmdvYmplY3QsCiAgZ3VpbnQgICAgICAgICBwcm9wX2lkLAogIGNvbnN0IEdWYWx1ZSAqdmFsdWUgR19HTlVDX1VOVVNFRCwKICBHUGFyYW1TcGVjICAgKnBzcGVjKQp7CiAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChnb2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CnP0AAAAc3RhdGljIHZvaWQKJXNvYmplY3RfcHJveHlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKmdvYmplY3QsCiAgZ3VpbnQgICAgICAgICBwcm9wX2lkLAogIEdWYWx1ZSAgICAgICAqdmFsdWUsCiAgR1BhcmFtU3BlYyAgICpwc3BlYykKewogICVzT2JqZWN0UHJveHkgKm9iamVjdCA9ICVzT0JKRUNUX1BST1hZIChnb2JqZWN0KTsKICBHREJ1c0ludGVyZmFjZSAqaW50ZXJmYWNlOwoKICBzd2l0Y2ggKHByb3BfaWQpCiAgICB7CmkBAAAAc5cAAAAgICAgY2FzZSAlZDoKICAgICAgaW50ZXJmYWNlID0gZ19kYnVzX29iamVjdF9nZXRfaW50ZXJmYWNlIChHX0RCVVNfT0JKRUNUIChvYmplY3QpLCAiJXMiKTsKICAgICAgZ192YWx1ZV90YWtlX29iamVjdCAodmFsdWUsIGludGVyZmFjZSk7CiAgICAgIGJyZWFrOwoKc2QAAAAgICAgZGVmYXVsdDoKICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChnb2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CiAgICAgIGJyZWFrOwogIH0KfQoKc/gAAABzdGF0aWMgdm9pZAolc29iamVjdF9wcm94eV9jbGFzc19pbml0ICglc09iamVjdFByb3h5Q2xhc3MgKmtsYXNzKQp7CiAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKCiAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gJXNvYmplY3RfcHJveHlfc2V0X3Byb3BlcnR5OwogIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9ICVzb2JqZWN0X3Byb3h5X2dldF9wcm9wZXJ0eTsKCnM+AAAAICBnX29iamVjdF9jbGFzc19vdmVycmlkZV9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgJWQsICIlcyIpOwpzuAAAAC8qKgogKiAlc29iamVjdF9wcm94eV9uZXc6CiAqIEBjb25uZWN0aW9uOiBBICNHREJ1c0Nvbm5lY3Rpb24uCiAqIEBvYmplY3RfcGF0aDogQW4gb2JqZWN0IHBhdGguCiAqCiAqIENyZWF0ZXMgYSBuZXcgcHJveHkgb2JqZWN0LgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgZnVsbCk6IFRoZSBwcm94eSBvYmplY3QuCiAqLwpzaQEAACVzT2JqZWN0UHJveHkgKgolc29iamVjdF9wcm94eV9uZXcgKEdEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKICBjb25zdCBnY2hhciAqb2JqZWN0X3BhdGgpCnsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoR19JU19EQlVTX0NPTk5FQ1RJT04gKGNvbm5lY3Rpb24pLCBOVUxMKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ192YXJpYW50X2lzX29iamVjdF9wYXRoIChvYmplY3RfcGF0aCksIE5VTEwpOwogIHJldHVybiAlc09CSkVDVF9QUk9YWSAoZ19vYmplY3RfbmV3ICglc1RZUEVfT0JKRUNUX1BST1hZLCAiZy1jb25uZWN0aW9uIiwgY29ubmVjdGlvbiwgImctb2JqZWN0LXBhdGgiLCBvYmplY3RfcGF0aCwgTlVMTCkpOwp9CgpzjgAAAC8qKgogKiAlc09iamVjdFNrZWxldG9uOgogKgogKiBUaGUgIyVzT2JqZWN0U2tlbGV0b24gc3RydWN0dXJlIGNvbnRhaW5zIG9ubHkgcHJpdmF0ZSBkYXRhIGFuZCBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgcHJvdmlkZWQgQVBJLgpzbwAAAC8qKgogKiAlc09iamVjdFNrZWxldG9uQ2xhc3M6CiAqIEBwYXJlbnRfY2xhc3M6IFRoZSBwYXJlbnQgY2xhc3MuCiAqCiAqIENsYXNzIHN0cnVjdHVyZSBmb3IgIyVzT2JqZWN0U2tlbGV0b24uCnNdAAAAc3RhdGljIHZvaWQKJXNvYmplY3Rfc2tlbGV0b25fXyVzb2JqZWN0X2lmYWNlX2luaXQgKCVzT2JqZWN0SWZhY2UgKmlmYWNlIEdfR05VQ19VTlVTRUQpCnsKfQoKc7EAAABzdGF0aWMgdm9pZAolc29iamVjdF9za2VsZXRvbl9fZ19kYnVzX29iamVjdF9pZmFjZV9pbml0IChHREJ1c09iamVjdElmYWNlICppZmFjZSkKewogIGlmYWNlLT5pbnRlcmZhY2VfYWRkZWQgPSAlc29iamVjdF9ub3RpZnk7CiAgaWZhY2UtPmludGVyZmFjZV9yZW1vdmVkID0gJXNvYmplY3Rfbm90aWZ5Owp9CgpzNgEAAEdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICglc09iamVjdFNrZWxldG9uLCAlc29iamVjdF9za2VsZXRvbiwgR19UWVBFX0RCVVNfT0JKRUNUX1NLRUxFVE9OLAogICAgICAgICAgICAgICAgICAgICAgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFICglc1RZUEVfT0JKRUNULCAlc29iamVjdF9za2VsZXRvbl9fJXNvYmplY3RfaWZhY2VfaW5pdCkKICAgICAgICAgICAgICAgICAgICAgICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR19UWVBFX0RCVVNfT0JKRUNULCAlc29iamVjdF9za2VsZXRvbl9fZ19kYnVzX29iamVjdF9pZmFjZV9pbml0KSk7CgpzUQAAAHN0YXRpYyB2b2lkCiVzb2JqZWN0X3NrZWxldG9uX2luaXQgKCVzT2JqZWN0U2tlbGV0b24gKm9iamVjdCBHX0dOVUNfVU5VU0VEKQp7Cn0KCnMFAQAAc3RhdGljIHZvaWQKJXNvYmplY3Rfc2tlbGV0b25fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKmdvYmplY3QsCiAgZ3VpbnQgICAgICAgICBwcm9wX2lkLAogIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCiAgR1BhcmFtU3BlYyAgICpwc3BlYykKewogICVzT2JqZWN0U2tlbGV0b24gKm9iamVjdCA9ICVzT0JKRUNUX1NLRUxFVE9OIChnb2JqZWN0KTsKICBHREJ1c0ludGVyZmFjZVNrZWxldG9uICppbnRlcmZhY2U7CgogIHN3aXRjaCAocHJvcF9pZCkKICAgIHsKc4kBAAAgICAgY2FzZSAlZDoKICAgICAgaW50ZXJmYWNlID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CiAgICAgIGlmIChpbnRlcmZhY2UgIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICBnX3dhcm5faWZfZmFpbCAoJXNJU18lcyAoaW50ZXJmYWNlKSk7CiAgICAgICAgICBnX2RidXNfb2JqZWN0X3NrZWxldG9uX2FkZF9pbnRlcmZhY2UgKEdfREJVU19PQkpFQ1RfU0tFTEVUT04gKG9iamVjdCksIGludGVyZmFjZSk7CiAgICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgZ19kYnVzX29iamVjdF9za2VsZXRvbl9yZW1vdmVfaW50ZXJmYWNlX2J5X25hbWUgKEdfREJVU19PQkpFQ1RfU0tFTEVUT04gKG9iamVjdCksICIlcyIpOwogICAgICAgIH0KICAgICAgYnJlYWs7Cgpz/QAAAHN0YXRpYyB2b2lkCiVzb2JqZWN0X3NrZWxldG9uX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpnb2JqZWN0LAogIGd1aW50ICAgICAgICAgcHJvcF9pZCwKICBHVmFsdWUgICAgICAgKnZhbHVlLAogIEdQYXJhbVNwZWMgICAqcHNwZWMpCnsKICAlc09iamVjdFNrZWxldG9uICpvYmplY3QgPSAlc09CSkVDVF9TS0VMRVRPTiAoZ29iamVjdCk7CiAgR0RCdXNJbnRlcmZhY2UgKmludGVyZmFjZTsKCiAgc3dpdGNoIChwcm9wX2lkKQogICAgewpzBAEAAHN0YXRpYyB2b2lkCiVzb2JqZWN0X3NrZWxldG9uX2NsYXNzX2luaXQgKCVzT2JqZWN0U2tlbGV0b25DbGFzcyAqa2xhc3MpCnsKICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOwoKICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSAlc29iamVjdF9za2VsZXRvbl9zZXRfcHJvcGVydHk7CiAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gJXNvYmplY3Rfc2tlbGV0b25fZ2V0X3Byb3BlcnR5OwoKc50AAAAvKioKICogJXNvYmplY3Rfc2tlbGV0b25fbmV3OgogKiBAb2JqZWN0X3BhdGg6IEFuIG9iamVjdCBwYXRoLgogKgogKiBDcmVhdGVzIGEgbmV3IHNrZWxldG9uIG9iamVjdC4KICoKICogUmV0dXJuczogKHRyYW5zZmVyIGZ1bGwpOiBUaGUgc2tlbGV0b24gb2JqZWN0LgogKi8Kc/gAAAAlc09iamVjdFNrZWxldG9uICoKJXNvYmplY3Rfc2tlbGV0b25fbmV3IChjb25zdCBnY2hhciAqb2JqZWN0X3BhdGgpCnsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ192YXJpYW50X2lzX29iamVjdF9wYXRoIChvYmplY3RfcGF0aCksIE5VTEwpOwogIHJldHVybiAlc09CSkVDVF9TS0VMRVRPTiAoZ19vYmplY3RfbmV3ICglc1RZUEVfT0JKRUNUX1NLRUxFVE9OLCAiZy1vYmplY3QtcGF0aCIsIG9iamVjdF9wYXRoLCBOVUxMKSk7Cn0KCnPMAAAALyoqCiAqICVzb2JqZWN0X3NrZWxldG9uX3NldF8lczoKICogQG9iamVjdDogQSAjJXNPYmplY3RTa2VsZXRvbi4KICogQGludGVyZmFjZV86IChhbGxvdy1ub25lKTogQSAjJXMgb3IgJSVOVUxMIHRvIGNsZWFyIHRoZSBpbnRlcmZhY2UuCiAqCiAqIFNldHMgdGhlICMlcyBpbnN0YW5jZSBmb3IgdGhlIEQtQnVzIGludGVyZmFjZSAjJXMgb24gQG9iamVjdC4Kc0kAAAB2b2lkICVzb2JqZWN0X3NrZWxldG9uX3NldF8lcyAoJXNPYmplY3RTa2VsZXRvbiAqb2JqZWN0LCAlcyAqaW50ZXJmYWNlXykKc0EAAAB7CiAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAob2JqZWN0KSwgIiVzIiwgaW50ZXJmYWNlXywgTlVMTCk7Cn0KCigAAAAAKAAAAAAoAAAAACgAAAAAKA8AAABSDQAAAFIcAAAAUgkAAABSUQAAAFIOAAAAUiQAAABSFQAAAFILAAAAUk4AAABSIgAAAFIYAAAAUlIAAABSEwAAAFIgAAAAUhQAAAAoAwAAAFIaAAAAUjgAAABSRAAAACgAAAAAKAAAAABzJgAAAC91c3Ivc2hhcmUvZ2xpYi0yLjAvY29kZWdlbi9jb2RlZ2VuLnB5dA8AAABnZW5lcmF0ZV9vYmplY3RACgAAczIBAAAAARAGEgEDBywBEAISAQMFGgEQAhIBAwYaARACIAEgARABDAMUARABEgEDBiYBFgEMAioBEAMQARIBAwc4ARYBDAEmAQwIHgEQARABEgEDCT4BFgEMASYBDAkeARACDAYLAhIBAwQaARABEAESAQMFGgEQARACDAUaAQwHGgEQAQwELAIMBBQBDAcLAQwBCAEMCxoBBgEQAQwFEQEOAQwFCAEMCCABBgEQAQwCEQEOARADEgEDCREBDAggAhIBAwQaARABEAESAQMFGgEQARACDAUaARABDAcaAQwELAIMBBQBDAsaAQYBEAEMDR0BDgEMBQgBDAsaAQYBEAEMBREBDgEMBQgBDAggAQYBEAEMAhEBDgEQAhIBAwgRAQwGIAEQARIBAwY4ARYBDAEmAQwEDwFjAQAAAAIAAAAHAAAAQwAAAHO4BAAAfAAAagAAagEAZAEAgwEAAXwAAGoAAGoBAHwAAGoCAGoDAGQCAHwAAGoEAHwAAGoEAHwAAGoFAGYDABZ0BgCDAgCDAQABfAAAagAAagEAZAMAgwEAAXwAAGoAAGoBAHwAAGoCAGoDAGQEAHwAAGoEAHwAAGoEAGYCABZ0BgCDAgCDAQABfAAAagAAagEAZAUAgwEAAXwAAGoAAGoBAGQDAIMBAAF8AABqAABqAQB8AABqAgBqAwBkBgB8AABqBAB8AABqBABmAgAWdAYAgwIAgwEAAXwAAGoAAGoBAGQFAIMBAAF8AABqAABqAQBkAwCDAQABfAAAagAAagEAZAcAfAAAagQAfAAAagUAZgIAFoMBAAF8AABqAABqAQBkCAB8AABqBQB8AABqBABmAgAWgwEAAXwAAGoAAGoBAGQJAHwAAGoFAHwAAGoEAGYCABaDAQABfAAAagAAagEAfAAAagIAagMAZAoAfAAAagUAfAAAagQAZgIAFnQGAIMCAIMBAAF8AABqAABqAQBkBQCDAQABfAAAagAAagEAZAsAfAAAagUAFoMBAAF8AABqAABqAQBkDAB8AABqBwAWgwEAAXg3AHwAAGoIAERdLAB9AQB8AABqAABqAQBkDQB8AQBqCQB8AQBqBwB8AQBqCgBmAwAWgwEAAXHKAVd8AABqAABqAQBkDgCDAQABfAAAagAAagEAZA8AgwEAAXwAAGoAAGoBAGQQAIMBAAF8AABqAABqAQB8AABqAgBqAwBkEQB8AABqBQB8AABqBQB8AABqBQB8AABqBQBmBAAWdAYAgwIAgwEAAXwAAGoAAGoBAGQFAIMBAAF8AABqAABqAQBkEgB8AABqBQB8AABqBwB8AABqBQBmAwAWgwEAAXwAAGoAAGoBAGQTAHwAAGoFAHwAAGoFAHwAAGoFAHwAAGoEAGYEABaDAQABfAAAagAAagEAZAUAgwEAAXwAAGoAAGoBAGQUAHwAAGoFABaDAQABfAAAagAAagEAfAAAagIAagMAZBUAfAAAagUAfAAAagUAfAAAagUAfAAAagQAZgQAFnQGAIMCAIMBAAF8AABqAABqAQBkBQCDAQABfAAAagAAagEAZBYAfAAAagUAfAAAagcAfAAAagUAZgMAFoMBAAF8AABqAABqAQBkAwCDAQABfAAAagAAagEAfAAAagIAagMAZBcAfAAAagUAfAAAagUAfAAAagUAfAAAagUAZgQAFnQGAIMCAIMBAAF8AABqAABqAQBkBQCDAQABfAAAagAAagEAZBgAfAAAagUAfAAAagcAfAAAagUAZgMAFoMBAAF8AABqAABqAQBkGQB8AABqBQB8AABqBQB8AABqBQB8AABqBABmBAAWgwEAAXwAAGoAAGoBAGQFAIMBAAF8AABqAABqAQBkGgB8AABqBQAWgwEAAXwAAGoAAGoBAHwAAGoCAGoDAGQbAHwAAGoFAHwAAGoFAHwAAGoFAHwAAGoEAGYEABZ0BgCDAgCDAQABfAAAagAAagEAZAUAgwEAAXwAAGoAAGoBAGQcAHwAAGoFAHwAAGoHAHwAAGoFAGYDABaDAQABfAAAagAAagEAZAMAgwEAAWQAAFMoHQAAAE5zvgAAAC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBDb2RlIGZvciBPYmplY3RNYW5hZ2VyIGNsaWVudAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgpzEAEAAC8qKgogKiBTRUNUSU9OOiVzT2JqZWN0TWFuYWdlckNsaWVudAogKiBAdGl0bGU6ICVzT2JqZWN0TWFuYWdlckNsaWVudAogKiBAc2hvcnRfZGVzY3JpcHRpb246IEdlbmVyYXRlZCBHREJ1c09iamVjdE1hbmFnZXJDbGllbnQgdHlwZQogKgogKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgYSAjR0RCdXNPYmplY3RNYW5hZ2VyQ2xpZW50IHRoYXQgdXNlcyAlc29iamVjdF9tYW5hZ2VyX2NsaWVudF9nZXRfcHJveHlfdHlwZSgpIGFzIHRoZSAjR0RCdXNQcm94eVR5cGVGdW5jLgogKi8KcwEAAAAKc5gAAAAvKioKICogJXNPYmplY3RNYW5hZ2VyQ2xpZW50OgogKgogKiBUaGUgIyVzT2JqZWN0TWFuYWdlckNsaWVudCBzdHJ1Y3R1cmUgY29udGFpbnMgb25seSBwcml2YXRlIGRhdGEgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBwcm92aWRlZCBBUEkuCnMEAAAAICovCnN5AAAALyoqCiAqICVzT2JqZWN0TWFuYWdlckNsaWVudENsYXNzOgogKiBAcGFyZW50X2NsYXNzOiBUaGUgcGFyZW50IGNsYXNzLgogKgogKiBDbGFzcyBzdHJ1Y3R1cmUgZm9yICMlc09iamVjdE1hbmFnZXJDbGllbnQuCnNkAAAAR19ERUZJTkVfVFlQRSAoJXNPYmplY3RNYW5hZ2VyQ2xpZW50LCAlc29iamVjdF9tYW5hZ2VyX2NsaWVudCwgR19UWVBFX0RCVVNfT0JKRUNUX01BTkFHRVJfQ0xJRU5UKTsKCnNdAAAAc3RhdGljIHZvaWQKJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfaW5pdCAoJXNPYmplY3RNYW5hZ2VyQ2xpZW50ICptYW5hZ2VyIEdfR05VQ19VTlVTRUQpCnsKfQoKc2YAAABzdGF0aWMgdm9pZAolc29iamVjdF9tYW5hZ2VyX2NsaWVudF9jbGFzc19pbml0ICglc09iamVjdE1hbmFnZXJDbGllbnRDbGFzcyAqa2xhc3MgR19HTlVDX1VOVVNFRCkKewp9CgpzNAIAAC8qKgogKiAlc29iamVjdF9tYW5hZ2VyX2NsaWVudF9nZXRfcHJveHlfdHlwZToKICogQG1hbmFnZXI6IEEgI0dEQnVzT2JqZWN0TWFuYWdlckNsaWVudC4KICogQG9iamVjdF9wYXRoOiBUaGUgb2JqZWN0IHBhdGggb2YgdGhlIHJlbW90ZSBvYmplY3QgKHVudXNlZCkuCiAqIEBpbnRlcmZhY2VfbmFtZTogKGFsbG93LW5vbmUpOiBJbnRlcmZhY2UgbmFtZSBvZiB0aGUgcmVtb3RlIG9iamVjdCBvciAlJU5VTEwgdG8gZ2V0IHRoZSBvYmplY3QgcHJveHkgI0dUeXBlLgogKiBAdXNlcl9kYXRhOiBVc2VyIGRhdGEgKHVudXNlZCkuCiAqCiAqIEEgI0dEQnVzUHJveHlUeXBlRnVuYyB0aGF0IG1hcHMgQGludGVyZmFjZV9uYW1lIHRvIHRoZSBnZW5lcmF0ZWQgI0dEQnVzT2JqZWN0UHJveHk8IS0tIC0tPi0gYW5kICNHREJ1c1Byb3h5PCEtLSAtLT4tZGVyaXZlZCB0eXBlcy4KICoKICogUmV0dXJuczogQSAjR0RCdXNQcm94eTwhLS0gLS0+LWRlcml2ZWQgI0dUeXBlIGlmIEBpbnRlcmZhY2VfbmFtZSBpcyBub3QgJSVOVUxMLCBvdGhlcndpc2UgdGhlICNHVHlwZSBmb3IgIyVzT2JqZWN0UHJveHkuCnPIAAAAR1R5cGUKJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfZ2V0X3Byb3h5X3R5cGUgKEdEQnVzT2JqZWN0TWFuYWdlckNsaWVudCAqbWFuYWdlciBHX0dOVUNfVU5VU0VELCBjb25zdCBnY2hhciAqb2JqZWN0X3BhdGggR19HTlVDX1VOVVNFRCwgY29uc3QgZ2NoYXIgKmludGVyZmFjZV9uYW1lLCBncG9pbnRlciB1c2VyX2RhdGEgR19HTlVDX1VOVVNFRCkKewpzBAEAACAgc3RhdGljIGdzaXplIG9uY2VfaW5pdF92YWx1ZSA9IDA7CiAgc3RhdGljIEdIYXNoVGFibGUgKmxvb2t1cF9oYXNoOwogIEdUeXBlIHJldDsKCiAgaWYgKGludGVyZmFjZV9uYW1lID09IE5VTEwpCiAgICByZXR1cm4gJXNUWVBFX09CSkVDVF9QUk9YWTsKICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKCZvbmNlX2luaXRfdmFsdWUpKQogICAgewogICAgICBsb29rdXBfaGFzaCA9IGdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsKc14AAAAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChsb29rdXBfaGFzaCwgKGdwb2ludGVyKSAiJXMiLCBHU0laRV9UT19QT0lOVEVSICglc1RZUEVfJXNfUFJPWFkpKTsKczUAAAAgICAgICBnX29uY2VfaW5pdF9sZWF2ZSAoJm9uY2VfaW5pdF92YWx1ZSwgMSk7CiAgICB9CnOLAAAAICByZXQgPSAoR1R5cGUpIEdQT0lOVEVSX1RPX1NJWkUgKGdfaGFzaF90YWJsZV9sb29rdXAgKGxvb2t1cF9oYXNoLCBpbnRlcmZhY2VfbmFtZSkpOwogIGlmIChyZXQgPT0gKEdUeXBlKSAwKQogICAgcmV0ID0gR19UWVBFX0RCVVNfUFJPWFk7CnMRAAAAICByZXR1cm4gcmV0Owp9CgpzIwQAAC8qKgogKiAlc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXc6CiAqIEBjb25uZWN0aW9uOiBBICNHREJ1c0Nvbm5lY3Rpb24uCiAqIEBmbGFnczogRmxhZ3MgZnJvbSB0aGUgI0dEQnVzT2JqZWN0TWFuYWdlckNsaWVudEZsYWdzIGVudW1lcmF0aW9uLgogKiBAbmFtZTogKGFsbG93LW5vbmUpOiBBIGJ1cyBuYW1lICh3ZWxsLWtub3duIG9yIHVuaXF1ZSkgb3IgJSVOVUxMIGlmIEBjb25uZWN0aW9uIGlzIG5vdCBhIG1lc3NhZ2UgYnVzIGNvbm5lY3Rpb24uCiAqIEBvYmplY3RfcGF0aDogQW4gb2JqZWN0IHBhdGguCiAqIEBjYW5jZWxsYWJsZTogKGFsbG93LW5vbmUpOiBBICNHQ2FuY2VsbGFibGUgb3IgJSVOVUxMLgogKiBAY2FsbGJhY2s6IEEgI0dBc3luY1JlYWR5Q2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIHNhdGlzZmllZC4KICogQHVzZXJfZGF0YTogVXNlciBkYXRhIHRvIHBhc3MgdG8gQGNhbGxiYWNrLgogKgogKiBBc3luY2hyb25vdXNseSBjcmVhdGVzICNHREJ1c09iamVjdE1hbmFnZXJDbGllbnQgdXNpbmcgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfZ2V0X3Byb3h5X3R5cGUoKSBhcyB0aGUgI0dEQnVzUHJveHlUeXBlRnVuYy4gU2VlIGdfZGJ1c19vYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3KCkgZm9yIG1vcmUgZGV0YWlscy4KICoKICogV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLCBAY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGluIHRoZSA8bGluayBsaW5rZW5kPSJnLW1haW4tY29udGV4dC1wdXNoLXRocmVhZC1kZWZhdWx0Ij50aHJlYWQtZGVmYXVsdCBtYWluIGxvb3A8L2xpbms+IG9mIHRoZSB0aHJlYWQgeW91IGFyZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGZyb20uCiAqIFlvdSBjYW4gdGhlbiBjYWxsICVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ld19maW5pc2goKSB0byBnZXQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogKgogKiBTZWUgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X3N5bmMoKSBmb3IgdGhlIHN5bmNocm9ub3VzLCBibG9ja2luZyB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCnNHAgAAdm9pZAolc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXcgKAogICAgR0RCdXNDb25uZWN0aW9uICAgICAgICAqY29ubmVjdGlvbiwKICAgIEdEQnVzT2JqZWN0TWFuYWdlckNsaWVudEZsYWdzICBmbGFncywKICAgIGNvbnN0IGdjaGFyICAgICAgICAgICAgKm5hbWUsCiAgICBjb25zdCBnY2hhciAgICAgICAgICAgICpvYmplY3RfcGF0aCwKICAgIEdDYW5jZWxsYWJsZSAgICAgICAgICAgKmNhbmNlbGxhYmxlLAogICAgR0FzeW5jUmVhZHlDYWxsYmFjayAgICAgY2FsbGJhY2ssCiAgICBncG9pbnRlciAgICAgICAgICAgICAgICB1c2VyX2RhdGEpCnsKICBnX2FzeW5jX2luaXRhYmxlX25ld19hc3luYyAoJXNUWVBFX09CSkVDVF9NQU5BR0VSX0NMSUVOVCwgR19QUklPUklUWV9ERUZBVUxULCBjYW5jZWxsYWJsZSwgY2FsbGJhY2ssIHVzZXJfZGF0YSwgImZsYWdzIiwgZmxhZ3MsICJuYW1lIiwgbmFtZSwgImNvbm5lY3Rpb24iLCBjb25uZWN0aW9uLCAib2JqZWN0LXBhdGgiLCBvYmplY3RfcGF0aCwgImdldC1wcm94eS10eXBlLWZ1bmMiLCAlc29iamVjdF9tYW5hZ2VyX2NsaWVudF9nZXRfcHJveHlfdHlwZSwgTlVMTCk7Cn0KCnOMAQAALyoqCiAqICVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ld19maW5pc2g6CiAqIEByZXM6IFRoZSAjR0FzeW5jUmVzdWx0IG9idGFpbmVkIGZyb20gdGhlICNHQXN5bmNSZWFkeUNhbGxiYWNrIHBhc3NlZCB0byAlc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXcoKS4KICogQGVycm9yOiBSZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG9yICUlTlVMTAogKgogKiBGaW5pc2hlcyBhbiBvcGVyYXRpb24gc3RhcnRlZCB3aXRoICVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ldygpLgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgZnVsbCkgKHR5cGUgJXNPYmplY3RNYW5hZ2VyQ2xpZW50KTogVGhlIGNvbnN0cnVjdGVkIG9iamVjdCBtYW5hZ2VyIGNsaWVudCBvciAlJU5VTEwgaWYgQGVycm9yIGlzIHNldC4Kc6oBAABHREJ1c09iamVjdE1hbmFnZXIgKgolc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXdfZmluaXNoICgKICAgIEdBc3luY1Jlc3VsdCAgICAgICAgKnJlcywKICAgIEdFcnJvciAgICAgICAgICAgICAqKmVycm9yKQp7CiAgR09iamVjdCAqcmV0OwogIEdPYmplY3QgKnNvdXJjZV9vYmplY3Q7CiAgc291cmNlX29iamVjdCA9IGdfYXN5bmNfcmVzdWx0X2dldF9zb3VyY2Vfb2JqZWN0IChyZXMpOwogIHJldCA9IGdfYXN5bmNfaW5pdGFibGVfbmV3X2ZpbmlzaCAoR19BU1lOQ19JTklUQUJMRSAoc291cmNlX29iamVjdCksIHJlcywgZXJyb3IpOwogIGdfb2JqZWN0X3VucmVmIChzb3VyY2Vfb2JqZWN0KTsKICBpZiAocmV0ICE9IE5VTEwpCiAgICByZXR1cm4gR19EQlVTX09CSkVDVF9NQU5BR0VSIChyZXQpOwogIGVsc2UKICAgIHJldHVybiBOVUxMOwp9CgpzaAMAAC8qKgogKiAlc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXdfc3luYzoKICogQGNvbm5lY3Rpb246IEEgI0dEQnVzQ29ubmVjdGlvbi4KICogQGZsYWdzOiBGbGFncyBmcm9tIHRoZSAjR0RCdXNPYmplY3RNYW5hZ2VyQ2xpZW50RmxhZ3MgZW51bWVyYXRpb24uCiAqIEBuYW1lOiAoYWxsb3ctbm9uZSk6IEEgYnVzIG5hbWUgKHdlbGwta25vd24gb3IgdW5pcXVlKSBvciAlJU5VTEwgaWYgQGNvbm5lY3Rpb24gaXMgbm90IGEgbWVzc2FnZSBidXMgY29ubmVjdGlvbi4KICogQG9iamVjdF9wYXRoOiBBbiBvYmplY3QgcGF0aC4KICogQGNhbmNlbGxhYmxlOiAoYWxsb3ctbm9uZSk6IEEgI0dDYW5jZWxsYWJsZSBvciAlJU5VTEwuCiAqIEBlcnJvcjogUmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBvciAlJU5VTEwKICoKICogU3luY2hyb25vdXNseSBjcmVhdGVzICNHREJ1c09iamVjdE1hbmFnZXJDbGllbnQgdXNpbmcgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfZ2V0X3Byb3h5X3R5cGUoKSBhcyB0aGUgI0dEQnVzUHJveHlUeXBlRnVuYy4gU2VlIGdfZGJ1c19vYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X3N5bmMoKSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBUaGUgY2FsbGluZyB0aHJlYWQgaXMgYmxvY2tlZCB1bnRpbCBhIHJlcGx5IGlzIHJlY2VpdmVkLgogKgogKiBTZWUgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3KCkgZm9yIHRoZSBhc3luY2hyb25vdXMgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgogKgogKiBSZXR1cm5zOiAodHJhbnNmZXIgZnVsbCkgKHR5cGUgJXNPYmplY3RNYW5hZ2VyQ2xpZW50KTogVGhlIGNvbnN0cnVjdGVkIG9iamVjdCBtYW5hZ2VyIGNsaWVudCBvciAlJU5VTEwgaWYgQGVycm9yIGlzIHNldC4Kc28CAABHREJ1c09iamVjdE1hbmFnZXIgKgolc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXdfc3luYyAoCiAgICBHREJ1c0Nvbm5lY3Rpb24gICAgICAgICpjb25uZWN0aW9uLAogICAgR0RCdXNPYmplY3RNYW5hZ2VyQ2xpZW50RmxhZ3MgIGZsYWdzLAogICAgY29uc3QgZ2NoYXIgICAgICAgICAgICAqbmFtZSwKICAgIGNvbnN0IGdjaGFyICAgICAgICAgICAgKm9iamVjdF9wYXRoLAogICAgR0NhbmNlbGxhYmxlICAgICAgICAgICAqY2FuY2VsbGFibGUsCiAgICBHRXJyb3IgICAgICAgICAgICAgICAgKiplcnJvcikKewogIEdJbml0YWJsZSAqcmV0OwogIHJldCA9IGdfaW5pdGFibGVfbmV3ICglc1RZUEVfT0JKRUNUX01BTkFHRVJfQ0xJRU5ULCBjYW5jZWxsYWJsZSwgZXJyb3IsICJmbGFncyIsIGZsYWdzLCAibmFtZSIsIG5hbWUsICJjb25uZWN0aW9uIiwgY29ubmVjdGlvbiwgIm9iamVjdC1wYXRoIiwgb2JqZWN0X3BhdGgsICJnZXQtcHJveHktdHlwZS1mdW5jIiwgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfZ2V0X3Byb3h5X3R5cGUsIE5VTEwpOwogIGlmIChyZXQgIT0gTlVMTCkKICAgIHJldHVybiBHX0RCVVNfT0JKRUNUX01BTkFHRVIgKHJldCk7CiAgZWxzZQogICAgcmV0dXJuIE5VTEw7Cn0KCnOOAwAALyoqCiAqICVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ld19mb3JfYnVzOgogKiBAYnVzX3R5cGU6IEEgI0dCdXNUeXBlLgogKiBAZmxhZ3M6IEZsYWdzIGZyb20gdGhlICNHREJ1c09iamVjdE1hbmFnZXJDbGllbnRGbGFncyBlbnVtZXJhdGlvbi4KICogQG5hbWU6IEEgYnVzIG5hbWUgKHdlbGwta25vd24gb3IgdW5pcXVlKS4KICogQG9iamVjdF9wYXRoOiBBbiBvYmplY3QgcGF0aC4KICogQGNhbmNlbGxhYmxlOiAoYWxsb3ctbm9uZSk6IEEgI0dDYW5jZWxsYWJsZSBvciAlJU5VTEwuCiAqIEBjYWxsYmFjazogQSAjR0FzeW5jUmVhZHlDYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgc2F0aXNmaWVkLgogKiBAdXNlcl9kYXRhOiBVc2VyIGRhdGEgdG8gcGFzcyB0byBAY2FsbGJhY2suCiAqCiAqIExpa2UgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3KCkgYnV0IHRha2VzIGEgI0dCdXNUeXBlIGluc3RlYWQgb2YgYSAjR0RCdXNDb25uZWN0aW9uLgogKgogKiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQsIEBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgaW4gdGhlIDxsaW5rIGxpbmtlbmQ9ImctbWFpbi1jb250ZXh0LXB1c2gtdGhyZWFkLWRlZmF1bHQiPnRocmVhZC1kZWZhdWx0IG1haW4gbG9vcDwvbGluaz4gb2YgdGhlIHRocmVhZCB5b3UgYXJlIGNhbGxpbmcgdGhpcyBtZXRob2QgZnJvbS4KICogWW91IGNhbiB0aGVuIGNhbGwgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X2Zvcl9idXNfZmluaXNoKCkgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICoKICogU2VlICVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ld19mb3JfYnVzX3N5bmMoKSBmb3IgdGhlIHN5bmNocm9ub3VzLCBibG9ja2luZyB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCnNJAgAAdm9pZAolc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXdfZm9yX2J1cyAoCiAgICBHQnVzVHlwZSAgICAgICAgICAgICAgICBidXNfdHlwZSwKICAgIEdEQnVzT2JqZWN0TWFuYWdlckNsaWVudEZsYWdzICBmbGFncywKICAgIGNvbnN0IGdjaGFyICAgICAgICAgICAgKm5hbWUsCiAgICBjb25zdCBnY2hhciAgICAgICAgICAgICpvYmplY3RfcGF0aCwKICAgIEdDYW5jZWxsYWJsZSAgICAgICAgICAgKmNhbmNlbGxhYmxlLAogICAgR0FzeW5jUmVhZHlDYWxsYmFjayAgICAgY2FsbGJhY2ssCiAgICBncG9pbnRlciAgICAgICAgICAgICAgICB1c2VyX2RhdGEpCnsKICBnX2FzeW5jX2luaXRhYmxlX25ld19hc3luYyAoJXNUWVBFX09CSkVDVF9NQU5BR0VSX0NMSUVOVCwgR19QUklPUklUWV9ERUZBVUxULCBjYW5jZWxsYWJsZSwgY2FsbGJhY2ssIHVzZXJfZGF0YSwgImZsYWdzIiwgZmxhZ3MsICJuYW1lIiwgbmFtZSwgImJ1cy10eXBlIiwgYnVzX3R5cGUsICJvYmplY3QtcGF0aCIsIG9iamVjdF9wYXRoLCAiZ2V0LXByb3h5LXR5cGUtZnVuYyIsICVzb2JqZWN0X21hbmFnZXJfY2xpZW50X2dldF9wcm94eV90eXBlLCBOVUxMKTsKfQoKc6QBAAAvKioKICogJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X2Zvcl9idXNfZmluaXNoOgogKiBAcmVzOiBUaGUgI0dBc3luY1Jlc3VsdCBvYnRhaW5lZCBmcm9tIHRoZSAjR0FzeW5jUmVhZHlDYWxsYmFjayBwYXNzZWQgdG8gJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X2Zvcl9idXMoKS4KICogQGVycm9yOiBSZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIG9yICUlTlVMTAogKgogKiBGaW5pc2hlcyBhbiBvcGVyYXRpb24gc3RhcnRlZCB3aXRoICVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ld19mb3JfYnVzKCkuCiAqCiAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKSAodHlwZSAlc09iamVjdE1hbmFnZXJDbGllbnQpOiBUaGUgY29uc3RydWN0ZWQgb2JqZWN0IG1hbmFnZXIgY2xpZW50IG9yICUlTlVMTCBpZiBAZXJyb3IgaXMgc2V0LgpzsgEAAEdEQnVzT2JqZWN0TWFuYWdlciAqCiVzb2JqZWN0X21hbmFnZXJfY2xpZW50X25ld19mb3JfYnVzX2ZpbmlzaCAoCiAgICBHQXN5bmNSZXN1bHQgICAgICAgICpyZXMsCiAgICBHRXJyb3IgICAgICAgICAgICAgKiplcnJvcikKewogIEdPYmplY3QgKnJldDsKICBHT2JqZWN0ICpzb3VyY2Vfb2JqZWN0OwogIHNvdXJjZV9vYmplY3QgPSBnX2FzeW5jX3Jlc3VsdF9nZXRfc291cmNlX29iamVjdCAocmVzKTsKICByZXQgPSBnX2FzeW5jX2luaXRhYmxlX25ld19maW5pc2ggKEdfQVNZTkNfSU5JVEFCTEUgKHNvdXJjZV9vYmplY3QpLCByZXMsIGVycm9yKTsKICBnX29iamVjdF91bnJlZiAoc291cmNlX29iamVjdCk7CiAgaWYgKHJldCAhPSBOVUxMKQogICAgcmV0dXJuIEdfREJVU19PQkpFQ1RfTUFOQUdFUiAocmV0KTsKICBlbHNlCiAgICByZXR1cm4gTlVMTDsKfQoKc8wCAAAvKioKICogJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X2Zvcl9idXNfc3luYzoKICogQGJ1c190eXBlOiBBICNHQnVzVHlwZS4KICogQGZsYWdzOiBGbGFncyBmcm9tIHRoZSAjR0RCdXNPYmplY3RNYW5hZ2VyQ2xpZW50RmxhZ3MgZW51bWVyYXRpb24uCiAqIEBuYW1lOiBBIGJ1cyBuYW1lICh3ZWxsLWtub3duIG9yIHVuaXF1ZSkuCiAqIEBvYmplY3RfcGF0aDogQW4gb2JqZWN0IHBhdGguCiAqIEBjYW5jZWxsYWJsZTogKGFsbG93LW5vbmUpOiBBICNHQ2FuY2VsbGFibGUgb3IgJSVOVUxMLgogKiBAZXJyb3I6IFJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3Igb3IgJSVOVUxMCiAqCiAqIExpa2UgJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X3N5bmMoKSBidXQgdGFrZXMgYSAjR0J1c1R5cGUgaW5zdGVhZCBvZiBhICNHREJ1c0Nvbm5lY3Rpb24uCiAqCiAqIFRoZSBjYWxsaW5nIHRocmVhZCBpcyBibG9ja2VkIHVudGlsIGEgcmVwbHkgaXMgcmVjZWl2ZWQuCiAqCiAqIFNlZSAlc29iamVjdF9tYW5hZ2VyX2NsaWVudF9uZXdfZm9yX2J1cygpIGZvciB0aGUgYXN5bmNocm9ub3VzIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KICoKICogUmV0dXJuczogKHRyYW5zZmVyIGZ1bGwpICh0eXBlICVzT2JqZWN0TWFuYWdlckNsaWVudCk6IFRoZSBjb25zdHJ1Y3RlZCBvYmplY3QgbWFuYWdlciBjbGllbnQgb3IgJSVOVUxMIGlmIEBlcnJvciBpcyBzZXQuCnNxAgAAR0RCdXNPYmplY3RNYW5hZ2VyICoKJXNvYmplY3RfbWFuYWdlcl9jbGllbnRfbmV3X2Zvcl9idXNfc3luYyAoCiAgICBHQnVzVHlwZSAgICAgICAgICAgICAgICBidXNfdHlwZSwKICAgIEdEQnVzT2JqZWN0TWFuYWdlckNsaWVudEZsYWdzICBmbGFncywKICAgIGNvbnN0IGdjaGFyICAgICAgICAgICAgKm5hbWUsCiAgICBjb25zdCBnY2hhciAgICAgICAgICAgICpvYmplY3RfcGF0aCwKICAgIEdDYW5jZWxsYWJsZSAgICAgICAgICAgKmNhbmNlbGxhYmxlLAog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