LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIG1vcnBob19lYXN5X2hkci5oDQogKiBbQ1A5MzIvQ1JMRl0geyCCoCCVhI2GibuV+46ujqmTrpS7kuiXcCB9DQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIgTW9ycGhvLEluYy4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWZuZGVmIE1PUlBIT19FQVNZX0hEUl9IDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9IDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAibW9ycGhvX2FwaS5oIg0KI2luY2x1ZGUgIm1vcnBob19lcnJvci5oIg0KI2luY2x1ZGUgIm1vcnBob19pbWFnZV9kYXRhLmgiDQojaW5jbHVkZSAibW9ycGhvX3JlY3RfaW50LmgiDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9WRVIgIk1vcnBobyBFYXN5SERSIFZlci4yLjAuMSAyMDEyLzA3LzE4Ig0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogKGlucHV0LWxpbWl0YWlvbikgKi8NCg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUlOX0lNQUdFX1dJRFRIICAgIDEwMA0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUFYX0lNQUdFX1dJRFRIICAgODE5Mg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUlOX0lNQUdFX0hFSUdIVCAgIDEwMA0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUFYX0lNQUdFX0hFSUdIVCAgODE5Mg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUlOX05JTUFHRVMgICAyDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NQVhfTklNQUdFUyAgMTANCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIChwYXJhbWV0ZXIpICovDQoNCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0RJU0FCTEVEIDANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0VOQUJMRUQgIDENCg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfSU1BR0VfQUxJR05NRU5UX0RFRkFVTFQgIE1PUlBIT19FQVNZX0hEUl9FTkFCTEVEDQoNCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0dIT1NUX1JFTU9WQUxfREVGQVVMVCAgTU9SUEhPX0VBU1lfSERSX0VOQUJMRUQNCg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQVVUT19TQ0FMSU5HX0RFRkFVTFQgIE1PUlBIT19FQVNZX0hEUl9FTkFCTEVEDQoNCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0ZBQ0VfREVURUNUSU9OX0RFRkFVTFQgIE1PUlBIT19FQVNZX0hEUl9FTkFCTEVEDQoNCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0ZBSUxfU09GVF9NRVJHSU5HX0RFRkFVTFQgIE1PUlBIT19FQVNZX0hEUl9FTkFCTEVEDQoNCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0dIT1NUX0RFVEVDVElPTl9TRU5TSVRJVklUWV9MRVZFTF9NSU4gICAgICAwDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9HSE9TVF9ERVRFQ1RJT05fU0VOU0lUSVZJVFlfTEVWRUxfTUFYICAgICAxMA0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfR0hPU1RfREVURUNUSU9OX1NFTlNJVElWSVRZX0xFVkVMX0RFRkFVTFQgIDcNCg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUVSR0VfU01PT1RITkVTU19MRVZFTF9NSU4gICAgICAwDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9TTU9PVEhORVNTX0xFVkVMX01BWCAgICAgMTANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX01FUkdFX1NNT09USE5FU1NfTEVWRUxfREVGQVVMVCAgNg0KDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9QQVJBTV9NSU4gICAgICAgIDANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX01FUkdFX1BBUkFNX01BWCAgICAgIDI1NQ0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUVSR0VfUEFSQU0xX0RFRkFVTFQgICAwDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9QQVJBTTJfREVGQVVMVCAxMjgNCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX01FUkdFX1BBUkFNM19ERUZBVUxUICAgMA0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUVSR0VfUEFSQU00X0RFRkFVTFQgMjU1DQoNCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX1JFTElBQkxFX1JFQ1RfUkFURV9USFJFU0hPTERfTUlOICAgICAgIDANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX1JFTElBQkxFX1JFQ1RfUkFURV9USFJFU0hPTERfTUFYICAgICAxMDANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX1JFTElBQkxFX1JFQ1RfUkFURV9USFJFU0hPTERfREVGQVVMVCAgODANCg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfR0hPU1RfUkFURV9USFJFU0hPTERfTUlOICAgICAgIDANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0dIT1NUX1JBVEVfVEhSRVNIT0xEX01BWCAgICAgMTAwDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9HSE9TVF9SQVRFX1RIUkVTSE9MRF9ERUZBVUxUICA5MA0KDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19PRkZTRVRfTUlOICAgICAgICAgIDANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0NDX09GRlNFVF9NQVggICAgICAgIDI1NQ0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfWV9PRkZTRVRfREVGQVVMVCAgICAwDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19DX09GRlNFVF9ERUZBVUxUICAgIDANCg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfR0FJTl9NSU4gICAgICAgIDEwMA0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfR0FJTl9NQVggICAgICAgMjAwMA0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfWV9HQUlOX0RFRkFVTFQgMTAwMA0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfQ19HQUlOX0RFRkFVTFQgMTAwMA0KDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19HQU1NQV9NSU4gICAgICAgIDEwMA0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfR0FNTUFfTUFYICAgICAgIDIwMDANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0NDX1lfR0FNTUFfREVGQVVMVCAxMDAwDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19DX0dBTU1BX0RFRkFVTFQgMTAwMA0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogKG1lcmdlLXN0YXR1cykgKi8NCg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDANCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0VSUk9SX0lNQUdFX0FMSUdOTUVOVF9GQUlMVVJFICAweDAwMDAwMDAxDQojZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9FUlJPUl9FWFBfRVNUSU1BVElPTl9GQUlMVVJFICAgMHgwMDAwMDAwMg0KI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfRVJST1JfTU9TVExZX0dIT1NUICAgICAgICAgICAgIDB4MDAwMDAwMDQNCiNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0VSUk9SX0lOVEVSTkFMICAgICAgICAgICAgICAgICAweDgwMDAwMDAwDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQp0eXBlZGVmIHN0cnVjdCBfbW9ycGhvX0Vhc3lIRFIgbW9ycGhvX0Vhc3lIRFI7DQp0eXBlZGVmIHN0cnVjdCBfbW9ycGhvX0Vhc3lIRFJfQ2FsbGJhY2sgbW9ycGhvX0Vhc3lIRFJfQ2FsbGJhY2s7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiogRWFzeUhEUiAqLw0Kc3RydWN0IF9tb3JwaG9fRWFzeUhEUg0Kew0KICAgIHZvaWQgKnA7IC8qKjwgk+CVlI1ckaKRzILWgsyDfINDg5ODXiAqLw0KfTsNCg0KLyoqIEVhc3lIRFIgQ2FsbGJhY2sgKGZvciBtdWx0aS10aHJlYWQgcHJvY2Vzc2luZykgKi8NCnN0cnVjdCBfbW9ycGhvX0Vhc3lIRFJfQ2FsbGJhY2sNCnsNCiAgICB2b2lkICpwOyAvKio8IINSgVuDi4Nvg2KDTorWkJSCzJHmiOqI+JCUgsaCtYLEk26Cs4LqgumSbCAqLw0KDQogICAgdm9pZCAqICgqIHRocmVhZF9jcmVhdGUgKSh2b2lkICpwLCBpbnQgaW5kZXgsIHZvaWQgKigqc3RhcnRfcm91dGluZSkodm9pZCAqYXJnKSwgdm9pZCAqYXJnKTsNCiAgICBpbnQgICAgKCogdGhyZWFkX2Rlc3Ryb3kpKHZvaWQgKnAsIHZvaWQgKnRocmVhZCk7DQogICAgaW50ICAgICgqIHRocmVhZF9qb2luICAgKSh2b2lkICpwLCB2b2lkICp0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpOw0KDQogICAgdm9pZCAqICgqIG11dGV4X2NyZWF0ZSApKHZvaWQgKnApOw0KICAgIGludCAgICAoKiBtdXRleF9kZXN0cm95KSh2b2lkICpwLCB2b2lkICptdXRleCk7DQogICAgaW50ICAgICgqIG11dGV4X2xvY2sgICApKHZvaWQgKnAsIHZvaWQgKm11dGV4KTsNCiAgICBpbnQgICAgKCogbXV0ZXhfdHJ5bG9jaykodm9pZCAqcCwgdm9pZCAqbXV0ZXgpOw0KICAgIGludCAgICAoKiBtdXRleF91bmxvY2sgKSh2b2lkICpwLCB2b2lkICptdXRleCk7DQoNCiAgICB2b2lkICogKCogY29uZF9jcmVhdGUgICApKHZvaWQgKnApOw0KICAgIGludCAgICAoKiBjb25kX2Rlc3Ryb3kgICkodm9pZCAqcCwgdm9pZCAqY29uZCk7DQogICAgaW50ICAgICgqIGNvbmRfd2FpdCAgICAgKSh2b2lkICpwLCB2b2lkICpjb25kLCB2b2lkICpsb2NrKTsNCiAgICBpbnQgICAgKCogY29uZF9zaWduYWwgICApKHZvaWQgKnAsIHZvaWQgKmNvbmQpOw0KICAgIGludCAgICAoKiBjb25kX2Jyb2FkY2FzdCkodm9pZCAqcCwgdm9pZCAqY29uZCk7DQp9Ow0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQpleHRlcm4gIkMiDQp7DQojZW5kaWYNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogg2+BW4NXg4eDk5W2jpqX8YLwjuaTvg0KICoNCiAqIEByZXR1cm4gg2+BW4NXg4eDk5W2jpqX8ShNT1JQSE9fRUFTWV9IRFJfVkVSKQ0KICovDQpNT1JQSE9fQVBJKGNoYXIgY29uc3QgKikNCm1vcnBob19FYXN5SERSX2dldFZlcnNpb24odm9pZCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqIJVLl3aCyIOBg4KDioNUg0ODWYLwjuaTvg0KICoNCiAqIEBwYXJhbVtpbl0gIG1heF93aWR0aCAgIJP8l82J5pGcgsyNxZHllZ0NCiAqIEBwYXJhbVtpbl0gIG1heF9oZWlnaHQgIJP8l82J5pGcgsyNxZHljYKCsw0KICogQHBhcmFtW2luXSAgZm9ybWF0ICAgICAgieaRnIN0g0iBW4N9g2KDZ5W2jpqX8Q0KICoNCiAqIEByZXR1cm4glUuXdoLIg4GDgoOKg1SDQ4NZKGJ5dGUpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfZ2V0QnVmZmVyU2l6ZSgNCiAgICBpbnQgbWF4X3dpZHRoLA0KICAgIGludCBtYXhfaGVpZ2h0LA0KICAgIGNoYXIgY29uc3QgKmZvcm1hdCk7DQoNCi8qKg0KICogj4mK+om7DQogKg0KICogjmeXcINYg4yDYoNokJSCyTCIyIm6gsySbILwkN2S6IK1gr2P6o2HgUENCiAqIJWqioSOwI1zgvCNc4KkgUINCiAqDQogKiCOZ5dwg1iDjINig2iQlILJMYjIj+OCzJJsgvCQ3ZLogrWCvY/qjYeBQQ0KICogiOqKh47AjXOC8I1zgqSBQg0KICoNCiAqII5nl3CDWIOMg2KDaJCUgskyiMiP44LMkmyC8JDdkuiCtYK9j+qNh4FBDQogKiCDfYOLg2CDWIOMg2KDaILJguaC6ZXAl/GOwI1zKIjqioeOwI1zKYLwjXOCpIFCDQogKiBjYWxsYmFjayCCyZNLkNiCyJJsgvCQ3ZLogreC6ZVLl3aCoILogUINCiAqDQogKiCBeY7AjXOP85HUgsyRSojagXoNCiAqICAgICA/X1VOS05PV04ggaggMF9JTklUSUFMSVpFRA0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtvdXRdICAgICBidWZmZXIgICAgICAgRWFzeUhEUoLJioSC6JOWgsSC6YOBg4KDioLWgsyDfINDg5ODXg0KICogQHBhcmFtW2luXSAgICAgIGJ1ZmZlcl9zaXplICBFYXN5SERSgsmKhILok5aCxILpg4GDgoOKgsyDVINDg1kNCiAqIEBwYXJhbVtpbl0gICAgICBudGhyZWFkcyAgICAgjmeXcINYg4yDYoNokJQgKINSg0GQlCkNCiAqIEBwYXJhbVtpbl0gICAgICBjYWxsYmFjayAgICAgg1KBW4OLg2+DYoNOitaQlIxRDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9pbml0aWFsaXplKA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIHZvaWQgKmJ1ZmZlciwNCiAgICBpbnQgYnVmZmVyX3NpemUsDQogICAgaW50IG50aHJlYWRzLA0KICAgIG1vcnBob19FYXN5SERSX0NhbGxiYWNrIGNvbnN0ICpjYWxsYmFjayk7DQoNCi8qKg0KICogg06DioFbg5ODQYNig3YNCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9maW5hbGl6ZSgNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqII2HkKyCzIpKjm6BRY7AjXMNCiAqIHNldEltYWdlRm9ybWF0KCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIIF5jsCNc4/zkdSCzJFKiNogKIjqioeOwI1zjp4pgXoNCiAqICAgICAwX0lOSVRJQUxJWkVEIIGoICgxX1BST0NFU1NJTkcpIIGoIDBfSU5JVElBTElaRUQgKI+Il52Krpe5KQ0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAggaggMl9TVVNQRU5ERUQgICAoc3VzcGVuZCgpjMSC0Y9vgrUpDQogKg0KICoggXmOwI1zj/OR1ILMkUqI2iAolaqKhI7AjXOOnimBeg0KICogICAgIDBfSU5JVElBTElaRUQggaggM19QQVVTRUQgICAgICAoj4iXnZKGKQ0KICogICAgICAgICAgICAgICAgICAggaggMF9JTklUSUFMSVpFRCAoj4iXnYqul7kpDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICAgICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtvdXRdICAgICBvdXRwdXRfaW1hZ2UgIIyLicqJ5pGcICiBdTGWh5bagXaCzJP8l82J5pGcgvCOd5LoicKUXCkNCiAqIEBwYXJhbVtpbixvdXRdICBpbnB1dF9pbWFnZXMgIJP8l82J5pGcjFEgKINHg5ODV4OTgsmC5oLBgsSPkYKrireCpoLnguqC6SkNCiAqIEBwYXJhbVtpbl0gICAgICBuaW1hZ2VzICAgICAgIJP8l82J5pGcgsyQlA0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfbWVyZ2UoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQogICAgbW9ycGhvX0ltYWdlRGF0YSAqb3V0cHV0X2ltYWdlLA0KICAgIG1vcnBob19JbWFnZURhdGEgKmlucHV0X2ltYWdlc1tdLA0KICAgIGludCBuaW1hZ2VzKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogjYeQrILMjHCRsY7AjXMNCiAqDQogKiBtZXJnZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiCVqoqEjsCNc46eKGluaXRpYWxpemUoKSCCxSBudGhyZWFkcyCCySAwIILwjneS6IK1gr2CxoKrKYLMgt2XTIz4DQogKg0KICoggXmOwI1zj/OR1ILMkUqI2iAolaqKhI7AjXOOnimBeg0KICogICAgIDNfUEFVU0VEIIGoIDNfUEFVU0VEICAgICAgKI+Il52ShikNCiAqICAgICAgICAgICAgICCBqCAwX0lOSVRJQUxJWkVEICiPiJediq6XuSkNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX3Byb2Nlc3MoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqDQogKiCNh5CsgsyShpJmICiVyoNSg5ODZYNMg1iDZ4KpgueCzIzEgtGPb4K1gsmC5oLpKQ0KICogbWVyZ2UoKSCOwI1zkoaCyY7AjXOJwpRcDQogKg0KICoggXmOwI1zj/OR1ILMkUqI2iAoiOqKh47AjXOOnimBeg0KICogICAgIDFfUFJPQ0VTU0lORyCBqCAyX1NVU1BFTkRFRA0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICBFYXN5SERSIINDg5ODWINeg5ODWA0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfc3VzcGVuZCgNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCk7DQoNCi8qKg0KICogjYeQrILMjcSKSg0KICogc3VzcGVuZCgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiCBeY7AjXOP85HUgsyRSojaICiI6oqHjsCNc46eKYF6DQogKiAgICAgMl9TVVNQRU5ERUQggaggKDFfUFJPQ0VTU0lORykggaggMF9JTklUSUFMSVpFRCAoj4iXnYqul7kpDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAggaggMl9TVVNQRU5ERUQgICAoc3VzcGVuZCgpjMSC0Y9vgrUpDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9yZXN1bWUoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqDQogKiCJ5pGcg3SDSIFbg32DYoNngsyQ3ZLoDQogKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQogKiBAcGFyYW1baW5dICAgICAgZm9ybWF0ICCJ5pGcg3SDSIFbg32DYoNngvCCoILngu2Ct5W2jpqX8Q0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfc2V0SW1hZ2VGb3JtYXQoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQogICAgY2hhciBjb25zdCAqZm9ybWF0KTsNCg0KLyoqDQogKiCJ5pGcg3SDSIFbg32DYoNngsyO5pO+DQogKiBzZXRJbWFnZUZvcm1hdCgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgICAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQogKiBAcGFyYW1bb3V0XSAgICAgYnVmZmVyICAgICAgIInmkZyDdINIgVuDfYNig2eC8IKggueC7YK3lbaOmpfxgqqKaZRbgrOC6oLpg2+DYoN0g0ANCiAqIEBwYXJhbVtpbl0gICAgICBidWZmZXJfc2l6ZSAgg2+DYoN0g0CCzINUg0ODWSiPSZJblbaOmorcgt4pDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9nZXRJbWFnZUZvcm1hdCgNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBjaGFyICpidWZmZXIsDQogICAgaW50IGJ1ZmZlcl9zaXplKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogiMqSdY2Hgu2CuSiO6ILUguqV4pCzKYLMl0yWs4LMkN2S6A0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiB2YWx1ZToNCiAqICAgTU9SX0VBU1lfSERSX0VOQUJMRUQgIDogiMqSdY2Hgu2CuYKggugNCiAqICAgTU9SX0VBU1lfSERSX0RJU0FCTEVEIDogiMqSdY2Hgu2CuYLIgrUNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQogKiBAcGFyYW1baW5dICAgICAgdmFsdWUgIJDdkuiSbA0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfc2V0SW1hZ2VBbGlnbm1lbnRTdGF0dXMoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQogICAgaW50IHZhbHVlKTsNCg0KLyoqDQogKiCIypJ1jYeC7YK5KI7ogtSC6pXikLMpgsyXTJazgsyO5pO+DQogKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtvdXRdICAgICB2YWx1ZSAgkN2S6JJsimmUW5DmDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9nZXRJbWFnZUFsaWdubWVudFN0YXR1cygNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgKnZhbHVlKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogg1OBW4NYg2ePnIuOKJTtjsqRzILUguqV4pCzKYLMl0yWs4LMkN2S6A0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiB2YWx1ZToNCiAqICAgTU9SX0VBU1lfSERSX0VOQUJMRUQgIDogg1OBW4NYg2ePnIuOgqCC6A0KICogICBNT1JfRUFTWV9IRFJfRElTQUJMRUQgOiCDU4Fbg1iDZ4+ci46CyIK1DQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW2luXSAgICAgIHZhbHVlICCQ3ZLokmwNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX3NldEdob3N0UmVtb3ZhbFN0YXR1cygNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgdmFsdWUpOw0KDQovKioNCiAqIINTgVuDWINnj5yLjiiU7Y7KkcyC1ILqleKQsymCzJdMlrOCzI7mk74NCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW291dF0gICAgIHZhbHVlICCQ3ZLokmyKaZRbkOYNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX2dldEdob3N0UmVtb3ZhbFN0YXR1cygNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgKnZhbHVlKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogjqmTropnkeUog06DioNig3ODk4NPKYLMl0yWs4LMkN2S6A0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiB2YWx1ZToNCiAqICAgTU9SX0VBU1lfSERSX0VOQUJMRUQgIDogjqmTropnkeWCoILoDQogKiAgIE1PUl9FQVNZX0hEUl9ESVNBQkxFRCA6II6pk66KZ5HlgsiCtQ0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtpbl0gICAgICB2YWx1ZSAgkN2S6JJsDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9zZXRBdXRvU2NhbGluZ1N0YXR1cygNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgdmFsdWUpOw0KDQovKioNCiAqII6pk66KZ5HlKINOg4qDYoNzg5ODTymCzJdMlrOCzI7mk74NCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW291dF0gICAgIHZhbHVlICCQ3ZLokmyKaZRbkOYNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX2dldEF1dG9TY2FsaW5nU3RhdHVzKA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIGludCAqdmFsdWUpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqDQogKiCK54yfj2+V4pCzgsyXTJazgsyQ3ZLoDQogKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIHZhbHVlOg0KICogICBNT1JfRUFTWV9IRFJfRU5BQkxFRCAgOiCK54yfj2+V4pCzgqCC6A0KICogICBNT1JfRUFTWV9IRFJfRElTQUJMRUQgOiCK54yfj2+V4pCzgsiCtQ0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtpbl0gICAgICB2YWx1ZSAgkN2S6JJsDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9zZXRGYWNlRGV0ZWN0aW9uU3RhdHVzKA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIGludCB2YWx1ZSk7DQoNCi8qKg0KICogiueMn49vleKQs4LMl0yWs4LMjuaTvg0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQogKiBAcGFyYW1bb3V0XSAgICAgdmFsdWUgIJDdkuiSbIpplFuQ5g0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfZ2V0RmFjZURldGVjdGlvblN0YXR1cygNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgKnZhbHVlKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogRmFpbC1zb2Z0LW1lcmdpbmcggsyXTJazgsyQ3ZLoDQogKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIHZhbHVlOg0KICogICBNT1JfRUFTWV9IRFJfRU5BQkxFRCAgOiBGYWlsLXNvZnQtbWVyZ2luZyCCoILoDQogKiAgIE1PUl9FQVNZX0hEUl9ESVNBQkxFRCA6IEZhaWwtc29mdC1tZXJnaW5nIILIgrUNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQogKiBAcGFyYW1baW5dICAgICAgdmFsdWUgIJDdkuiSbA0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfc2V0RmFpbFNvZnRNZXJnaW5nU3RhdHVzKA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIGludCB2YWx1ZSk7DQoNCi8qKg0KICogRmFpbC1zb2Z0LW1lcmdpbmcggsyXTJazgsyO5pO+DQogKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtvdXRdICAgICB2YWx1ZSAgkN2S6JJsimmUW5DmDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9nZXRGYWlsU29mdE1lcmdpbmdTdGF0dXMoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQogICAgaW50ICp2YWx1ZSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqIINTgVuDWINnlLuS6Iq0k3iDjIN4g4uCzJDdkugNCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW2luXSAgICAgIHZhbHVlICCQ3ZLokmwNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX3NldEdob3N0RGV0ZWN0aW9uU2Vuc2l0aXZpdHlMZXZlbCgNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgdmFsdWUpOw0KDQovKioNCiAqIINTgVuDWINnlLuS6Iq0k3iDjIN4g4uCzI7mk74NCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW291dF0gICAgIHZhbHVlICCQ3ZLokmyKaZRbkOYNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX2dldEdob3N0RGV0ZWN0aW9uU2Vuc2l0aXZpdHlMZXZlbCgNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgKnZhbHVlKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogjYeQrILIgt+C54KpgrOCzJDdkugNCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW2luXSAgICAgIHZhbHVlICCQ3ZLokmwNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX3NldE1lcmdlU21vb3RobmVzc0xldmVsKA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIGludCB2YWx1ZSk7DQoNCi8qKg0KICogjYeQrILIgt+C54KpgrOCzI7mk74NCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW291dF0gICAgIHZhbHVlICCQ3ZLokmyKaZRbkOYNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX2dldE1lcmdlU21vb3RobmVzc0xldmVsKA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIGludCAqdmFsdWUpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqDQogKiCNh5Csg3CDiYOBgVuDXoLMkN2S6A0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW2luXSAgICAgIHZhbHVlMSAgkN2S6JJsDQogKiBAcGFyYW1baW5dICAgICAgdmFsdWUyICCQ3ZLokmwNCiAqIEBwYXJhbVtpbl0gICAgICB2YWx1ZTMgIJDdkuiSbA0KICogQHBhcmFtW2luXSAgICAgIHZhbHVlNCAgkN2S6JJsDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9zZXRNZXJnZVBhcmFtZXRlcnMoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQogICAgaW50IHZhbHVlMSwNCiAgICBpbnQgdmFsdWUyLA0KICAgIGludCB2YWx1ZTMsDQogICAgaW50IHZhbHVlNCk7DQoNCi8qKg0KICogjYeQrINwg4mDgYFbg16CzI7mk74NCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtvdXRdICAgICB2YWx1ZTEgIJDdkuiSbIpplFuQ5g0KICogQHBhcmFtW291dF0gICAgIHZhbHVlMiAgkN2S6JJsimmUW5DmDQogKiBAcGFyYW1bb3V0XSAgICAgdmFsdWUzICCQ3ZLokmyKaZRbkOYNCiAqIEBwYXJhbVtvdXRdICAgICB2YWx1ZTQgIJDdkuiSbIpplFuQ5g0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfZ2V0TWVyZ2VQYXJhbWV0ZXJzKA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIGludCAqdmFsdWUxLA0KICAgIGludCAqdmFsdWUyLA0KICAgIGludCAqdmFsdWUzLA0KICAgIGludCAqdmFsdWU0KTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogl0yM+JfMiOboh5JsgsyQ3ZLoDQogKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW2luXSAgICAgIHJhdGUgIJDdkuiSbCAokoaJmyByYXRlICUgi+mMYCkNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX3NldFJlbGlhYmxlUmVjdFJhdGVUaHJlc2hvbGQoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQogICAgaW50IHJhdGUpOw0KDQovKioNCiAqIJdMjPiXzIjm6IeSbILMjuaTvg0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtvdXRdICAgICByYXRlICCQ3ZLokmyKaZRbkOYNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX2dldFJlbGlhYmxlUmVjdFJhdGVUaHJlc2hvbGQoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQogICAgaW50ICpyYXRlKTsNCg0KLyoqDQogKiCXTIz4l8yI5oLMjuaTvg0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqICiXTIz4gsiSbIKqg1qDYoNngrOC6oLpgsyCzSBtZXJnZSgpIIzjKQ0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW291dF0gICAgIHJlY3QgIJDdkuiSbIpplFuQ5g0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfZ2V0UmVsaWFibGVSZWN0KA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIG1vcnBob19SZWN0SW50ICpyZWN0KTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogg1OBW4NYg2eKhI2H6IeSbILMkN2S6A0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtpbl0gICAgICByYXRlICCQ3ZLokmwNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX3NldEdob3N0UmF0ZVRocmVzaG9sZCgNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgcmF0ZSk7DQoNCi8qKg0KICogg1OBW4NYg2eKhI2H6IeSbILMjuaTvg0KICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtvdXRdICAgICByYXRlICCQ3ZLokmyKaZRbkOYNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX2dldEdob3N0UmF0ZVRocmVzaG9sZCgNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgKnJhdGUpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqDQogKiCQRpXikLODcIOJg4GBW4NegsyQ3ZLoDQogKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCiAqIEBwYXJhbVtpbl0gICAgICB5X29mZnNldCAgkN2S6JJsDQogKiBAcGFyYW1baW5dICAgICAgeV9nYWluICAgIJDdkuiSbA0KICogQHBhcmFtW2luXSAgICAgIHlfZ2FtbWEgICCQ3ZLokmwNCiAqIEBwYXJhbVtpbl0gICAgICBjX29mZnNldCAgkN2S6JJsDQogKiBAcGFyYW1baW5dICAgICAgY19nYWluICAgIJDdkuiSbA0KICogQHBhcmFtW2luXSAgICAgIGNfZ2FtbWEgICCQ3ZLokmwNCiAqDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX3NldENvbG9yQ29ycmVjdGlvblBhcmFtZXRlcnMoDQogICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQogICAgaW50IHlfb2Zmc2V0LA0KICAgIGludCB5X2dhaW4sDQogICAgaW50IHlfZ2FtbWEsDQogICAgaW50IGNfb2Zmc2V0LA0KICAgIGludCBjX2dhaW4sDQogICAgaW50IGNfZ2FtbWEpOw0KDQovKioNCiAqIJBGleKQs4Nwg4mDgYFbg16CzI7mk74NCiAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgICAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW291dF0gICAgIHlfb2Zmc2V0ICCQ3ZLokmyKaZRbkOYNCiAqIEBwYXJhbVtvdXRdICAgICB5X2dhaW4gICAgkN2S6JJsimmUW5DmDQogKiBAcGFyYW1bb3V0XSAgICAgeV9nYW1tYSAgIJDdkuiSbIpplFuQ5g0KICogQHBhcmFtW291dF0gICAgIGNfb2Zmc2V0ICCQ3ZLokmyKaZRbkOYNCiAqIEBwYXJhbVtvdXRdICAgICBjX2dhaW4gICAgkN2S6JJsimmUW5DmDQogKiBAcGFyYW1bb3V0XSAgICAgY19nYW1tYSAgIJDdkuiSbIpplFuQ5g0KICoNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0Vhc3lIRFJfZ2V0Q29sb3JDb3JyZWN0aW9uUGFyYW1ldGVycygNCiAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCiAgICBpbnQgKnlfb2Zmc2V0LA0KICAgIGludCAqeV9nYWluLA0KICAgIGludCAqeV9nYW1tYSwNCiAgICBpbnQgKmNfb2Zmc2V0LA0KICAgIGludCAqY19nYWluLA0KICAgIGludCAqY19nYW1tYSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqII2HkKyDWINlgVuDXoNYgsyO5pO+DQogKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIINYg2WBW4Neg1iDUoFbg2gNCiAqICAgTU9SUEhPX0VBU1lfSERSX09LDQogKiAgIE1PUlBIT19FQVNZX0hEUl9FUlJPUl8qDQogKg0KICogQHBhcmFtW2luLG91dF0gIHAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQogKg0KICogQHJldHVybiCDWINlgVuDXoNYg1KBW4NoIChNT1JQSE9fRUFTTU9SUEhPX0VBU1lfSERSX0VSUk9SXw0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19FYXN5SERSX2dldE1lcmdlU3RhdHVzKA0KICAgIG1vcnBob19FYXN5SERSICpwKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogg1SDgINsg0ODi4LMjeyQrCAoj2+XzYnmkZyCzI9rj6wpDQogKiBtb3JwaG9fRWFzeUhEUl9zZXRJbWFnZUZvcm1hdCgpII7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgICAgICAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KICogQHBhcmFtW291dF0gICAgIHRodW1ibmFpbF9pbWFnZSAgj2+XzYnmkZwNCiAqIEBwYXJhbVtpbl0gICAgICBvdXRwdXRfaW1hZ2UgICAgIJP8l82J5pGcDQogKg0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fRWFzeUhEUl9tYWtlVGh1bWJuYWlsKA0KICAgIG1vcnBob19FYXN5SERSICpwLA0KICAgIG1vcnBob19JbWFnZURhdGEgKnRodW1ibmFpbF9pbWFnZSwNCiAgICBtb3JwaG9fSW1hZ2VEYXRhIGNvbnN0ICpvdXRwdXRfaW1hZ2UpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9IC8qIGV4dGVybiAiQyIgKi8NCiNlbmRpZg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2VuZGlmIC8qICFNT1JQSE9fRUFTWV9IRFJfSCAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIFtFT0ZdICovDQo=