LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNmcmVldHlwZS5jLHYgMS4xMSAyMDAyLzA4LzMxIDIyOjE3OjMyIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCi8qCiAgQ29weXJpZ2h0IKkgMjAwMi0yMDAzIGJ5IEp1bGl1c3ogQ2hyb2JvY3plawoKICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAogIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICBUSEUgU09GVFdBUkUuCiovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJmY2ludC5oIgojaW5jbHVkZSA8ZnQyYnVpbGQuaD4KI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAojaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICiNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICiNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICiNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICiNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAojaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICiNpZiBIQVZFX0ZUX0dFVF9YMTFfRk9OVF9GT1JNQVQKI2luY2x1ZGUgRlRfWEZSRUU4Nl9ICiNlbmRpZgoKI2lmIEhBVkVfRlRfR0VUX0JERl9QUk9QRVJUWQojaW5jbHVkZSBGVF9CREZfSAojaW5jbHVkZSBGVF9NT0RVTEVfSAojZGVmaW5lIEhBU19CREZfUFJPUEVSVFkoZikgKChmKSAmJiAoZiktPmRyaXZlciAmJiBcCgkJCSAgICAgKGYpLT5kcml2ZXItPnJvb3QuY2xhenotPmdldF9pbnRlcmZhY2UpCiNkZWZpbmUgTVlfR2V0X0JERl9Qcm9wZXJ0eShmLG4scCkgKEhBU19CREZfUFJPUEVSVFkoZikgPyBcCgkJCQkgICAgRlRfR2V0X0JERl9Qcm9wZXJ0eShmLG4scCkgOiBcCgkJCQkgICAgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQpCiNlbmRpZgoKI2lmICFIQVZFX0ZUX0dFVF9CREZfUFJPUEVSVFkKI3dhcm5pbmcgIk5vIEZUX0dldF9CREZfUHJvcGVydHk6IFBsZWFzZSBpbnN0YWxsIGZyZWV0eXBlIDIuMS40IG9yIGxhdGVyIgojZW5kaWYKCiNpZiAhSEFWRV9GVF9HRVRfUFNfRk9OVF9JTkZPCiN3YXJuaW5nICJObyBGVF9HZXRfUFNfRm9udF9JbmZvOiBQbGVhc2UgaW5zdGFsbCBmcmVldHlwZSAyLjEuMSBvciBsYXRlciIKI2VuZGlmCgovKgogKiBLZWVwIEhhbiBsYW5ndWFnZXMgc2VwYXJhdGVkIGJ5IGVsaW1pbmF0aW5nIGxhbmd1YWdlcwogKiB0aGF0IHRoZSBjb2RlUGFnZVJhbmdlIGJpdHMgc2F5cyBhcmVuJ3Qgc3VwcG9ydGVkCiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBpbnQJCSAgICBiaXQ7CiAgICBjb25zdCBGY0NoYXI4ICAgKmxhbmc7Cn0gRmNDb2RlUGFnZVJhbmdlW10gPSB7CiAgICB7IDE3LAkoY29uc3QgRmNDaGFyOCAqKSAiamEiIH0sCiAgICB7IDE4LAkoY29uc3QgRmNDaGFyOCAqKSAiemgtY24iIH0sCiAgICB7IDE5LAkoY29uc3QgRmNDaGFyOCAqKSAia28iIH0sCiAgICB7IDIwLAkoY29uc3QgRmNDaGFyOCAqKSAiemgtdHciIH0sCn07CgojZGVmaW5lIE5VTV9DT0RFX1BBR0VfUkFOR0UgKHNpemVvZiBGY0NvZGVQYWdlUmFuZ2UgLyBzaXplb2YgRmNDb2RlUGFnZVJhbmdlWzBdKQoKRmNCb29sCkZjRnJlZVR5cGVJc0V4Y2x1c2l2ZUxhbmcgKGNvbnN0IEZjQ2hhcjggICpsYW5nKQp7CiAgICBpbnQJICAgIGk7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFX1BBR0VfUkFOR0U7IGkrKykKICAgIHsKCWlmIChGY0xhbmdDb21wYXJlIChsYW5nLCBGY0NvZGVQYWdlUmFuZ2VbaV0ubGFuZykgIT0gRmNMYW5nRGlmZmVyZW50TGFuZykKCSAgICByZXR1cm4gRmNUcnVlOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnR5cGVkZWYgc3RydWN0IHsKICAgIEZUX1VTaG9ydAlwbGF0Zm9ybV9pZDsKICAgIEZUX1VTaG9ydAllbmNvZGluZ19pZDsKICAgIGNoYXIJKmZyb21jb2RlOwp9IEZjRnRFbmNvZGluZzsKCiNkZWZpbmUgVFRfRU5DT0RJTkdfRE9OVF9DQVJFCTB4ZmZmZgojZGVmaW5lIEZDX0VOQ09ESU5HX01BQ19ST01BTgkiTUFDSU5UT1NIIgoKc3RhdGljIGNvbnN0IEZjRnRFbmNvZGluZyAgIGZjRnRFbmNvZGluZ1tdID0gewogeyAgVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERSwJVFRfRU5DT0RJTkdfRE9OVF9DQVJFLAkiVUNTLTJCRSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0lEX1JPTUFOLAkiTUFDSU5UT1NIIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfSURfSkFQQU5FU0UsCSJTSklTIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19JRF9VTklDT0RFX0NTLAkiVVRGLTE2QkUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0lEX1NKSVMsCQkiU0pJUy1XSU4iIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0lEX0dCMjMxMiwJIkdCMzIxMiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfSURfQklHXzUsCQkiQklHLTUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0lEX1dBTlNVTkcsCSJXYW5zdW5nIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19JRF9KT0hBQiwJCSJKb2hhcCIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfSURfVUNTXzQsCQkiVUNTNCIgfSwKIHsgIFRUX1BMQVRGT1JNX0lTTywJCVRUX0lTT19JRF83QklUX0FTQ0lJLAkiQVNDSUkiIH0sCiB7ICBUVF9QTEFURk9STV9JU08sCQlUVF9JU09fSURfMTA2NDYsCSJVQ1MtMkJFIiB9LAogeyAgVFRfUExBVEZPUk1fSVNPLAkJVFRfSVNPX0lEXzg4NTlfMSwJIklTTy04ODU5LTEiIH0sCn07CgojZGVmaW5lIE5VTV9GQ19GVF9FTkNPRElORyAgKHNpemVvZiAoZmNGdEVuY29kaW5nKSAvIHNpemVvZiAoZmNGdEVuY29kaW5nWzBdKSkKCnR5cGVkZWYgc3RydWN0IHsKICAgIEZUX1VTaG9ydAlwbGF0Zm9ybV9pZDsKICAgIEZUX1VTaG9ydAlsYW5ndWFnZV9pZDsKICAgIGNoYXIJKmxhbmc7Cn0gRmNGdExhbmd1YWdlOwoKI2RlZmluZSBUVF9MQU5HVUFHRV9ET05UX0NBUkUJMHhmZmZmCgpzdGF0aWMgY29uc3QgRmNGdExhbmd1YWdlICAgZmNGdExhbmd1YWdlW10gPSB7CiB7ICBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFLAlUVF9MQU5HVUFHRV9ET05UX0NBUkUsCQkgICAgMCB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0VOR0xJU0gsCQkgICAgImVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0ZSRU5DSCwJCSAgICAiZnIiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfR0VSTUFOLAkJICAgICJkZSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9JVEFMSUFOLAkJICAgICJpdCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9EVVRDSCwJCSAgICAibmwiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfU1dFRElTSCwJCSAgICAic3YiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfU1BBTklTSCwJCSAgICAiZXMiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfREFOSVNILAkJICAgICJkYSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9QT1JUVUdVRVNFLAkgICAgInB0IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX05PUldFR0lBTiwJICAgICJubyIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9IRUJSRVcsCQkgICAgImhlIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0pBUEFORVNFLAkJICAgICJqYSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9BUkFCSUMsCQkgICAgImFyIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0ZJTk5JU0gsCQkgICAgImZpIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0dSRUVLLAkJICAgICJlbCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9JQ0VMQU5ESUMsCSAgICAiaXMiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfTUFMVEVTRSwJCSAgICAibXQiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfVFVSS0lTSCwJCSAgICAidHIiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfQ1JPQVRJQU4sCQkgICAgImhyIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwsICAiemgtdHciIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfVVJEVSwJCSAgICAidXIiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfSElOREksCQkgICAgImhpIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1RIQUksCQkgICAgInRoIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0tPUkVBTiwJCSAgICAia28iIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfTElUSFVBTklBTiwJICAgICJsdCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9QT0xJU0gsCQkgICAgInBsIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0hVTkdBUklBTiwJICAgICJodSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9FU1RPTklBTiwJCSAgICAiZXQiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfTEVUVElTSCwJCSAgICAibHYiIH0sCi8qIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9TQUFNSVNLLCA/Pz8gKi8KIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9GQUVST0VTRSwJCSAgICAiZm8iIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfRkFSU0ksCQkgICAgImZhIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1JVU1NJQU4sCQkgICAgInJ1IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0NISU5FU0VfU0lNUExJRklFRCwgICAiemgtY24iIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfRkxFTUlTSCwJCSAgICAibmwiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfSVJJU0gsCQkgICAgImdhIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0FMQkFOSUFOLAkJICAgICJzcSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9ST01BTklBTiwJCSAgICAicm8iIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfQ1pFQ0gsCQkgICAgImNzIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1NMT1ZBSywJCSAgICAic2siIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfU0xPVkVOSUFOLAkgICAgInNsIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1lJRERJU0gsCQkgICAgInlpIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1NFUkJJQU4sCQkgICAgInNyIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX01BQ0VET05JQU4sCSAgICAibWsiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfQlVMR0FSSUFOLAkgICAgImJnIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1VLUkFJTklBTiwJICAgICJ1ayIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9CWUVMT1JVU1NJQU4sCSAgICAiYmUiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfVVpCRUssCQkgICAgInV6IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0tBWkFLSCwJCSAgICAia2siIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfQVpFUkJBSUpBTkksCSAgICAiYXoiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfQVpFUkJBSUpBTklfQ1lSSUxMSUNfU0NSSVBULCAiYXoiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfQVpFUkJBSUpBTklfQVJBQklDX1NDUklQVCwgICAgImFyIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0FSTUVOSUFOLAkJICAgICJoeSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9HRU9SR0lBTiwJCSAgICAia2EiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfTU9MREFWSUFOLAkgICAgIm1vIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0tJUkdISVosCQkgICAgImt5IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1RBSklLSSwJCSAgICAidGciIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfVFVSS01FTiwJCSAgICAidGsiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfTU9OR09MSUFOLAkgICAgIm1vIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX01PTkdPTElBTl9NT05HT0xJQU5fU0NSSVBULCJtbyIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9NT05HT0xJQU5fQ1lSSUxMSUNfU0NSSVBULCAibW8iIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfUEFTSFRPLAkJICAgICJwcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9LVVJESVNILAkJICAgICJrdSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9LQVNITUlSSSwJCSAgICAia3MiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfU0lOREhJLAkJICAgICJzZCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9USUJFVEFOLAkJICAgICJibyIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9ORVBBTEksCQkgICAgIm5lIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1NBTlNLUklULAkJICAgICJzYSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9NQVJBVEhJLAkJICAgICJtciIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9CRU5HQUxJLAkJICAgICJibiIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9BU1NBTUVTRSwJCSAgICAiYXMiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfR1VKQVJBVEksCQkgICAgImd1IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1BVTkpBQkksCQkgICAgInBhIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX09SSVlBLAkJICAgICJvciIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9NQUxBWUFMQU0sCSAgICAibWwiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfS0FOTkFEQSwJCSAgICAia24iIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfVEFNSUwsCQkgICAgInRhIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1RFTFVHVSwJCSAgICAidGUiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfU0lOSEFMRVNFLAkgICAgInNpIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0JVUk1FU0UsCQkgICAgIm15IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0tITUVSLAkJICAgICJrbSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9MQU8sCQkgICAgImxvIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1ZJRVROQU1FU0UsCSAgICAidmkiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfSU5ET05FU0lBTiwJICAgICJpZCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9UQUdBTE9HLAkJICAgICJ0bCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9NQUxBWV9ST01BTl9TQ1JJUFQsICAgIm1zIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX01BTEFZX0FSQUJJQ19TQ1JJUFQsICAibXMiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfQU1IQVJJQywJCSAgICAiYW0iIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfVElHUklOWUEsCQkgICAgInRpIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0dBTExBLAkJICAgICJvbSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9TT01BTEksCQkgICAgInNvIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1NXQUhJTEksCQkgICAgInN3IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1JVQU5EQSwJCSAgICAicnciIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfUlVOREksCQkgICAgInJuIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0NIRVdBLAkJICAgICJueSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9NQUxBR0FTWSwJCSAgICAibWciIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfRVNQRVJBTlRPLAkgICAgImVvIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1dFTFNILAkJICAgICJjeSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9CQVNRVUUsCQkgICAgImV1IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0NBVEFMQU4sCQkgICAgImNhIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0xBVElOLAkJICAgICJsYSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9RVUVDSFVBLAkJICAgICJxdSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9HVUFSQU5JLAkJICAgICJnbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9BWU1BUkEsCQkgICAgImF5IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1RBVEFSLAkJICAgICJ0dCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9VSUdIVVIsCQkgICAgInVnIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0RaT05HS0hBLAkJICAgICJkeiIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9KQVZBTkVTRSwJCSAgICAianciIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfU1VOREFORVNFLAkgICAgInN1IiB9LAogICAgCiNpZiAwICAvKiB0aGVzZSBzZWVtIHRvIGJlIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkICovCgogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQyB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0lSSVNIX0dBRUxJQyB9LAoKI2VuZGlmCiAgICAKICAvKiBUaGUgZm9sbG93aW5nIGNvZGVzIGFyZSBuZXcgYXMgb2YgMjAwMC0wMy0xMCAqLwogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0dBTElDSUFOLAkJICAgICJnbCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9BRlJJS0FBTlMsCSAgICAiYWYiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfQlJFVE9OLAkJICAgICJiciIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9JTlVLVElUVVQsCSAgICAiaXUiIH0sCiB7ICBUVF9QTEFURk9STV9NQUNJTlRPU0gsCVRUX01BQ19MQU5HSURfU0NPVFRJU0hfR0FFTElDLAkgICAgImdkIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX01BTlhfR0FFTElDLAkgICAgImd2IiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0lSSVNIX0dBRUxJQywJICAgICJnYSIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9UT05HQU4sCQkgICAgInRvIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0dSRUVLX1BPTFlUT05JQywJICAgICJlbCIgfSwKIHsgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwJVFRfTUFDX0xBTkdJRF9HUkVFTEFORElDLAkgICAgImlrIiB9LAogeyAgVFRfUExBVEZPUk1fTUFDSU5UT1NILAlUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JX1JPTUFOX1NDUklQVCwiYXoiIH0sCgogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQVJBQklDX1NBVURJX0FSQUJJQSwJImFyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQVJBQklDX0lSQVEsCQkiYXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BUkFCSUNfRUdZUFQsCQkiYXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BUkFCSUNfTElCWUEsCQkiYXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BUkFCSUNfQUxHRVJJQSwJCSJhciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FSQUJJQ19NT1JPQ0NPLAkJImFyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQVJBQklDX1RVTklTSUEsCQkiYXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BUkFCSUNfT01BTiwJCSJhciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FSQUJJQ19ZRU1FTiwJCSJhciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FSQUJJQ19TWVJJQSwJCSJhciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FSQUJJQ19KT1JEQU4sCQkiYXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BUkFCSUNfTEVCQU5PTiwJCSJhciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FSQUJJQ19LVVdBSVQsCQkiYXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BUkFCSUNfVUFFLAkJImFyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQVJBQklDX0JBSFJBSU4sCQkiYXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BUkFCSUNfUUFUQVIsCQkiYXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9CVUxHQVJJQU5fQlVMR0FSSUEsCSJiZyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0NBVEFMQU5fU1BBSU4sCQkiY2EiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9DSElORVNFX1RBSVdBTiwJCSJ6aC10dyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0NISU5FU0VfUFJDLAkJInpoLWNuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQ0hJTkVTRV9IT05HX0tPTkcsCQkiemgtaGsiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9DSElORVNFX1NJTkdBUE9SRSwJCSJ6aC1zZyIgfSwKCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9DSElORVNFX01BQ0FVLAkJInpoLW1vIiB9LAoKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0NaRUNIX0NaRUNIX1JFUFVCTElDLAkiY3MiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9EQU5JU0hfREVOTUFSSywJCSJkYSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0dFUk1BTl9HRVJNQU5ZLAkJImRlIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfR0VSTUFOX1NXSVRaRVJMQU5ELAkiZGUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9HRVJNQU5fQVVTVFJJQSwJCSJkZSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0dFUk1BTl9MVVhFTUJPVVJHLAkJImRlIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfR0VSTUFOX0xJRUNIVEVOU1RFSSwJImRlIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfR1JFRUtfR1JFRUNFLAkJImVsIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRU5HTElTSF9VTklURURfU1RBVEVTLAkiZW4iIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9FTkdMSVNIX1VOSVRFRF9LSU5HRE9NLAkiZW4iIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9FTkdMSVNIX0FVU1RSQUxJQSwJCSJlbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FOQURBLAkJImVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRU5HTElTSF9ORVdfWkVBTEFORCwJImVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRU5HTElTSF9JUkVMQU5ELAkJImVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRU5HTElTSF9TT1VUSF9BRlJJQ0EsCSJlbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0VOR0xJU0hfSkFNQUlDQSwJCSJlbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FSSUJCRUFOLAkJImVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRU5HTElTSF9CRUxJWkUsCQkiZW4iIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9FTkdMSVNIX1RSSU5JREFELAkJImVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRU5HTElTSF9aSU1CQUJXRSwJCSJlbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0VOR0xJU0hfUEhJTElQUElORVMsCSJlbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fVFJBRElUSU9OQUxfU09SVCwiZXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TUEFOSVNIX01FWElDTywJCSJlcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fSU5URVJOQVRJT05BTF9TT1JULCJlcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfR1VBVEVNQUxBLAkJImVzIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU1BBTklTSF9DT1NUQV9SSUNBLAkiZXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TUEFOSVNIX1BBTkFNQSwJCSJlcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDLCJlcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfVkVORVpVRUxBLAkJImVzIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU1BBTklTSF9DT0xPTUJJQSwJCSJlcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEVSVSwJCSJlcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfQVJHRU5USU5BLAkJImVzIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU1BBTklTSF9FQ1VBRE9SLAkJImVzIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU1BBTklTSF9DSElMRSwJCSJlcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfVVJVR1VBWSwJCSJlcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFSQUdVQVksCQkiZXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TUEFOSVNIX0JPTElWSUEsCQkiZXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TUEFOSVNIX0VMX1NBTFZBRE9SLAkiZXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TUEFOSVNIX0hPTkRVUkFTLAkJImVzIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU1BBTklTSF9OSUNBUkFHVUEsCQkiZXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TUEFOSVNIX1BVRVJUT19SSUNPLAkiZXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GSU5OSVNIX0ZJTkxBTkQsCQkiZmkiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GUkVOQ0hfRlJBTkNFLAkJImZyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRlJFTkNIX0JFTEdJVU0sCQkiZnIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GUkVOQ0hfQ0FOQURBLAkJImZyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRlJFTkNIX1NXSVRaRVJMQU5ELAkiZnIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GUkVOQ0hfTFVYRU1CT1VSRywJCSJmciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0ZSRU5DSF9NT05BQ08sCQkiZnIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9IRUJSRVdfSVNSQUVMLAkJImhlIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfSFVOR0FSSUFOX0hVTkdBUlksCQkiaHUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9JQ0VMQU5ESUNfSUNFTEFORCwJCSJpcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0lUQUxJQU5fSVRBTFksCQkiaXQiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9JVEFMSUFOX1NXSVRaRVJMQU5ELAkiaXQiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9KQVBBTkVTRV9KQVBBTiwJCSJqYSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0tPUkVBTl9FWFRFTkRFRF9XQU5TVU5HX0tPUkVBLCJrbyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0tPUkVBTl9KT0hBQl9LT1JFQSwJImtvIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRFVUQ0hfTkVUSEVSTEFORFMsCQkibmwiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9EVVRDSF9CRUxHSVVNLAkJIm5sIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9CT0tNQUwsCSJubyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX05PUldFR0lBTl9OT1JXQVlfTllOT1JTSywJIm5uIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfUE9MSVNIX1BPTEFORCwJCSJwbCIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1BPUlRVR1VFU0VfQlJBWklMLAkJInB0IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9QT1JUVUdBTCwJInB0IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfUkhBRVRPX1JPTUFOSUNfU1dJVFpFUkxBTkQsInJtIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfUk9NQU5JQU5fUk9NQU5JQSwJCSJybyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX01PTERBVklBTl9NT0xEQVZJQSwJIm1vIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfUlVTU0lBTl9SVVNTSUEsCQkicnUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9SVVNTSUFOX01PTERBVklBLAkJInJ1IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQ1JPQVRJQU5fQ1JPQVRJQSwJCSJociIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NFUkJJQU5fU0VSQklBX0xBVElOLAkic3IiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TRVJCSUFOX1NFUkJJQV9DWVJJTExJQywJInNyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU0xPVkFLX1NMT1ZBS0lBLAkJInNrIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQUxCQU5JQU5fQUxCQU5JQSwJCSJzcSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NXRURJU0hfU1dFREVOLAkJInN2IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU1dFRElTSF9GSU5MQU5ELAkJInN2IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVEhBSV9USEFJTEFORCwJCSJ0aCIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1RVUktJU0hfVFVSS0VZLAkJInRyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVVJEVV9QQUtJU1RBTiwJCSJ1ciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0lORE9ORVNJQU5fSU5ET05FU0lBLAkiaWQiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9VS1JBSU5JQU5fVUtSQUlORSwJCSJ1ayIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0JFTEFSVVNJQU5fQkVMQVJVUywJImJlIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU0xPVkVORV9TTE9WRU5JQSwJCSJzbCIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0VTVE9OSUFOX0VTVE9OSUEsCQkiZXQiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9MQVRWSUFOX0xBVFZJQSwJCSJsdiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0xJVEhVQU5JQU5fTElUSFVBTklBLAkibHQiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9DTEFTU0lDX0xJVEhVQU5JQU5fTElUSFVBTklBLCJsdCIgfSwKCiNpZmRlZiBUVF9NU19MQU5HSURfTUFPUklfTkVXX1pFTEFORAogICAgLyogdGhpcyBzZWVtcyB0byBiZSBhbiBlcnJvciB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkICovCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9NQU9SSV9ORVdfWkVBTEFORCwJCSJtaSIgfSwKI2VuZGlmCgogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRkFSU0lfSVJBTiwJCSJmYSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1ZJRVROQU1FU0VfVklFVF9OQU0sCSJ2aSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FSTUVOSUFOX0FSTUVOSUEsCQkiaHkiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0xBVElOLAkiYXoiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0NZUklMTElDLAkiYXoiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9CQVNRVUVfU1BBSU4sCQkiZXUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TT1JCSUFOX0dFUk1BTlksCQkid2VuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfTUFDRURPTklBTl9NQUNFRE9OSUEsCSJtayIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NVVFVfU09VVEhfQUZSSUNBLAkJInN0IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVFNPTkdBX1NPVVRIX0FGUklDQSwJInRzIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVFNXQU5BX1NPVVRIX0FGUklDQSwJInRuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVkVOREFfU09VVEhfQUZSSUNBLAkidmVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfWEhPU0FfU09VVEhfQUZSSUNBLAkieGgiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9aVUxVX1NPVVRIX0FGUklDQSwJCSJ6dSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FGUklLQUFOU19TT1VUSF9BRlJJQ0EsCSJhZiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0dFT1JHSUFOX0dFT1JHSUEsCQkia2EiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GQUVST0VTRV9GQUVST0VfSVNMQU5EUywJImZvIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfSElORElfSU5ESUEsCQkiaGkiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9NQUxURVNFX01BTFRBLAkJIm10IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU0FBTUlfTEFQT05JQSwJCSJzZSIgfSwKCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TQ09UVElTSF9HQUVMSUNfVU5JVEVEX0tJTkdET00sImdkIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfSVJJU0hfR0FFTElDX0lSRUxBTkQsCSJnYSIgfSwKCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9NQUxBWV9NQUxBWVNJQSwJCSJtcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX01BTEFZX0JSVU5FSV9EQVJVU1NBTEFNLAkibXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9LQVpBS19LQVpBS1NUQU4sCQkia2siIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TV0FISUxJX0tFTllBLAkJInN3IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9MQVRJTiwJInV6IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9DWVJJTExJQywJInV6IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVEFUQVJfVEFUQVJTVEFOLAkJInR0IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQkVOR0FMSV9JTkRJQSwJCSJibiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1BVTkpBQklfSU5ESUEsCQkicGEiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9HVUpBUkFUSV9JTkRJQSwJCSJndSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX09SSVlBX0lORElBLAkJIm9yIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVEFNSUxfSU5ESUEsCQkidGEiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9URUxVR1VfSU5ESUEsCQkidGUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9LQU5OQURBX0lORElBLAkJImtuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfTUFMQVlBTEFNX0lORElBLAkJIm1sIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQVNTQU1FU0VfSU5ESUEsCQkiYXMiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9NQVJBVEhJX0lORElBLAkJIm1yIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfU0FOU0tSSVRfSU5ESUEsCQkic2EiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9LT05LQU5JX0lORElBLAkJImtvayIgfSwKCiAgLyogbmV3IGFzIG9mIDIwMDEtMDEtMDEgKi8KIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FSQUJJQ19HRU5FUkFMLAkJImFyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQ0hJTkVTRV9HRU5FUkFMLAkJInpoIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRU5HTElTSF9HRU5FUkFMLAkJImVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRlJFTkNIX1dFU1RfSU5ESUVTLAkiZnIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GUkVOQ0hfUkVVTklPTiwJCSJmciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0ZSRU5DSF9DT05HTywJCSJmciIgfSwKCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GUkVOQ0hfU0VORUdBTCwJCSJmciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0ZSRU5DSF9DQU1FUk9PTiwJCSJmciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0ZSRU5DSF9DT1RFX0RfSVZPSVJFLAkiZnIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GUkVOQ0hfTUFMSSwJCSJmciIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0JPU05JQU5fQk9TTklBX0hFUlpFR09WSU5BLCJicyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1VSRFVfSU5ESUEsCQkidXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9UQUpJS19UQUpJS0lTVEFOLAkJInRnIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfWUlERElTSF9HRVJNQU5ZLAkJInlpIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfS0lSR0hJWl9LSVJHSElaU1RBTiwJImt5IiB9LAoKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1RVUktNRU5fVFVSS01FTklTVEFOLAkidGsiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUEsCSJtbiIgfSwKCiAgLyogdGhlIGZvbGxvd2luZyBzZWVtcyB0byBiZSBpbmNvbnNpc3RlbnQ7CiAgICAgaGVyZSBpcyB0aGUgY3VycmVudCAib2ZmaWNpYWwiIHdheTogKi8KIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1RJQkVUQU5fQkhVVEFOLAkJImJvIiB9LAogIC8qIGFuZCBoZXJlIGlzIHdoYXQgaXMgdXNlZCBieSBQYXNzcG9ydCBTREsgKi8KIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1RJQkVUQU5fQ0hJTkEsCQkiYm8iIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9EWk9OR0hLQV9CSFVUQU4sCQkiZHoiIH0sCiAgLyogZW5kIG9mIGluY29uc2lzdGVuY3kgKi8KCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9XRUxTSF9XQUxFUywJCSJjeSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0tITUVSX0NBTUJPRElBLAkJImttIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfTEFPX0xBT1MsCQkJImxvIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQlVSTUVTRV9NWUFOTUFSLAkJIm15IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfR0FMSUNJQU5fU1BBSU4sCQkiZ2wiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9NQU5JUFVSSV9JTkRJQSwJCSJtbmkiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TSU5ESElfSU5ESUEsCQkic2QiIH0sCiAgLyogdGhlIGZvbGxvd2luZyBvbmUgaXMgb25seSBlbmNvdW50ZXJlZCBpbiBNaWNyb3NvZnQgUlRGIHNwZWNpZmljYXRpb24gKi8KIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0tBU0hNSVJJX1BBS0lTVEFOLAkJImtzIiB9LAogIC8qIHRoZSBmb2xsb3dpbmcgb25lIGlzIG5vdCBpbiB0aGUgUGFzc3BvcnQgbGlzdCwgbG9va3MgbGlrZSBhbiBvbWlzc2lvbiAqLwogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfS0FTSE1JUklfSU5ESUEsCQkia3MiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9ORVBBTElfTkVQQUwsCQkibmUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9ORVBBTElfSU5ESUEsCQkibmUiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9GUklTSUFOX05FVEhFUkxBTkRTLAkiZnkiIH0sCgogIC8qIG5ldyBhcyBvZiAyMDAxLTAzLTAxIChmcm9tIE9mZmljZSBYcCkgKi8KIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0VOR0xJU0hfSE9OR19LT05HLAkJImVuIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRU5HTElTSF9JTkRJQSwJCSJlbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0VOR0xJU0hfTUFMQVlTSUEsCQkiZW4iIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9FTkdMSVNIX1NJTkdBUE9SRSwJCSJlbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NZUklBQ19TWVJJQSwJCSJzeXIiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TSU5IQUxFU0VfU1JJX0xBTktBLAkic2kiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9DSEVST0tFRV9VTklURURfU1RBVEVTLAkiY2hyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfSU5VS1RJVFVUX0NBTkFEQSwJCSJpdSIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0FNSEFSSUNfRVRISU9QSUEsCQkiYW0iIH0sCiNpZiAwCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDTyB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVEFNQVpJR0hUX01PUk9DQ09fTEFUSU4gfSwKI2VuZGlmCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9QQVNIVE9fQUZHSEFOSVNUQU4sCSJwcyIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0ZJTElQSU5PX1BISUxJUFBJTkVTLAkicGhpIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfREhJVkVISV9NQUxESVZFUywJCSJkaXYiIH0sCiAgICAKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX09ST01PX0VUSElPUElBLAkJIm9tIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfVElHUklHTkFfRVRISU9QSUEsCQkidGkiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9USUdSSUdOQV9FUllUSFJFQSwJCSJ0aSIgfSwKCiAgLyogTmV3IGFkZGl0aW9ucyBmcm9tIFdpbmRvd3MgWHAvUGFzc3BvcnQgU0RLIDIwMDEtMTEtMTAuICovCgogIC8qIGRvbid0IGFzayB3aGF0IHRoaXMgb25lIG1lYW5zLi4uIEl0IGlzIGNvbW1lbnRlZCBvdXQgY3VycmVudGx5LiAqLwojaWYgMAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfR1JFRUtfR1JFRUNFMiB9LAojZW5kaWYKCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TUEFOSVNIX1VOSVRFRF9TVEFURVMsCSJlcyIgfSwKICAvKiBUaGUgZm9sbG93aW5nIHR3byBJRHMgYmxhdGFudGx5IHZpb2xhdGUgTVMgc3BlY3MgYnkgdXNpbmcgYSAqLwogIC8qIHN1Ymxhbmd1YWdlID4sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1NQQU5JU0hfTEFUSU5fQU1FUklDQSwJImVzIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRlJFTkNIX05PUlRIX0FGUklDQSwJImZyIiB9LAoKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0ZSRU5DSF9NT1JPQ0NPLAkJImZyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRlJFTkNIX0hBSVRJLAkJImZyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfQkVOR0FMSV9CQU5HTEFERVNILAkiYm4iIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9QVU5KQUJJX0FSQUJJQ19QQUtJU1RBTiwJImFyIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBX01PTkdPTElBTiwibW4iIH0sCiNpZiAwCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9FRE9fTklHRVJJQSB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfRlVMRlVMREVfTklHRVJJQSB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfSUJJQklPX05JR0VSSUEgfSwKI2VuZGlmCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9IQVVTQV9OSUdFUklBLAkJImhhIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfWU9SVUJBX05JR0VSSUEsCQkieW8iIH0sCiAgLyogbGFuZ3VhZ2UgY29kZXMgZnJvbSwgdG8sIGFyZSAoc3RpbGwpIHVua25vd24uICovCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9JR0JPX05JR0VSSUEsCQkiaWJvIiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfS0FOVVJJX05JR0VSSUEsCQkia2F1IiB9LAogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfR1VBUkFOSV9QQVJBR1VBWSwJCSJnbiIgfSwKIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX0hBV0FJSUFOX1VOSVRFRF9TVEFURVMsCSJoYXciIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9MQVRJTiwJCQkibGEiIH0sCiB7ICBUVF9QTEFURk9STV9NSUNST1NPRlQsCVRUX01TX0xBTkdJRF9TT01BTElfU09NQUxJQSwJCSJzbyIgfSwKI2lmIDAKICAvKiBOb3RlOiBZaSBkb2VzIG5vdCBoYXZlIGEgKHByb3BlcikgSVNPIDYzOS0yIGNvZGUsIHNpbmNlIGl0IGlzIG1vc3RseSAqLwogIC8qICAgICAgIG5vdCB3cml0dGVuIChidXQgT1RPSCB0aGUgcGVjdWxpYXIgd3JpdGluZyBzeXN0ZW0gaXMgd29ydGggICAgICovCiAgLyogICAgICAgc3R1ZHlpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIHsgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCwJVFRfTVNfTEFOR0lEX1lJX0NISU5BIH0sCiNlbmRpZgogeyAgVFRfUExBVEZPUk1fTUlDUk9TT0ZULAlUVF9NU19MQU5HSURfUEFQSUFNRU5UVV9ORVRIRVJMQU5EU19BTlRJTExFUywicGFwIiB9LAp9OwoKI2RlZmluZSBOVU1fRkNfRlRfTEFOR1VBR0UgIChzaXplb2YgKGZjRnRMYW5ndWFnZSkgLyBzaXplb2YgKGZjRnRMYW5ndWFnZVswXSkpCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBGVF9VU2hvcnQJbGFuZ3VhZ2VfaWQ7CiAgICBjaGFyCSpmcm9tY29kZTsKfSBGY01hY1JvbWFuRmFrZTsKCnN0YXRpYyBjb25zdCBGY01hY1JvbWFuRmFrZSBmY01hY1JvbWFuRmFrZVtdID0gewogeyAgVFRfTVNfTEFOR0lEX0pBUEFORVNFX0pBUEFOLAkiU0pJUy1XSU4iIH0sCiB7ICBUVF9NU19MQU5HSURfRU5HTElTSF9VTklURURfU1RBVEVTLAkiQVNDSUkiIH0sCn07CgpzdGF0aWMgRmNDaGFyOCAqCkZjRm9udENhcGFiaWxpdGllcyhGVF9GYWNlIGZhY2UpOwoKI2RlZmluZSBOVU1fRkNfTUFDX1JPTUFOX0ZBS0UJKHNpemVvZiAoZmNNYWNSb21hbkZha2UpIC8gc2l6ZW9mIChmY01hY1JvbWFuRmFrZVswXSkpCgojaWYgSEFWRV9JQ09OViAmJiBIQVZFX0lDT05WX0gKI2RlZmluZSBVU0VfSUNPTlYgMQojaW5jbHVkZSA8aWNvbnYuaD4KI2VuZGlmCgpzdGF0aWMgRmNDaGFyOCAqCkZjU2ZudE5hbWVUcmFuc2NvZGUgKEZUX1NmbnROYW1lICpzbmFtZSkKewogICAgaW50CSAgICBpOwogICAgY2hhciAgICAqZnJvbWNvZGU7CiNpZiBVU0VfSUNPTlYKICAgIGljb252X3QgY2Q7CiNlbmRpZgogICAgRmNDaGFyOCAqdXRmODsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZDX0ZUX0VOQ09ESU5HOyBpKyspCglpZiAoZmNGdEVuY29kaW5nW2ldLnBsYXRmb3JtX2lkID09IHNuYW1lLT5wbGF0Zm9ybV9pZCAmJgoJICAgIChmY0Z0RW5jb2RpbmdbaV0uZW5jb2RpbmdfaWQgPT0gVFRfRU5DT0RJTkdfRE9OVF9DQVJFIHx8CgkgICAgIGZjRnRFbmNvZGluZ1tpXS5lbmNvZGluZ19pZCA9PSBzbmFtZS0+ZW5jb2RpbmdfaWQpKQoJICAgIGJyZWFrOwogICAgaWYgKGkgPT0gTlVNX0ZDX0ZUX0VOQ09ESU5HKQoJcmV0dXJuIDA7CiAgICBmcm9tY29kZSA9IGZjRnRFbmNvZGluZ1tpXS5mcm9tY29kZTsKCiAgICAvKgogICAgICogInJlYWwiIE1hYyBsYW5ndWFnZSBJRHMgYXJlIGFsbCBsZXNzIHRoYW4gMTUwLgogICAgICogTmFtZXMgdXNpbmcgb25lIG9mIHRoZSBNUyBsYW5ndWFnZSBJRHMgYXJlIGFzc3VtZWQKICAgICAqIHRvIHVzZSBhbiBhc3NvY2lhdGVkIGVuY29kaW5nIChZZXMsIHRoaXMgaXMgYSBrbHVkZ2UpCiAgICAgKi8KICAgIGlmICghc3RyY21wIChmcm9tY29kZSwgRkNfRU5DT0RJTkdfTUFDX1JPTUFOKSAmJgoJc25hbWUtPmxhbmd1YWdlX2lkID49IDB4MTAwKQogICAgewoJaW50CWY7CgoJZnJvbWNvZGUgPSAwOwoJZm9yIChmID0gMDsgZiA8IE5VTV9GQ19NQUNfUk9NQU5fRkFLRTsgZisrKQoJICAgIGlmIChmY01hY1JvbWFuRmFrZVtmXS5sYW5ndWFnZV9pZCA9PSBzbmFtZS0+bGFuZ3VhZ2VfaWQpCgkgICAgewoJCWZyb21jb2RlID0gZmNNYWNSb21hbkZha2VbZl0uZnJvbWNvZGU7CgkJYnJlYWs7CgkgICAgfQoJaWYgKCFmcm9tY29kZSkKCSAgICByZXR1cm4gMDsKICAgIH0KI2lmIFVTRV9JQ09OVgogICAgY2QgPSBpY29udl9vcGVuICgiVVRGLTgiLCBmcm9tY29kZSk7CiAgICBpZiAoY2QpCiAgICB7CglzaXplX3QJICAgIGluX2J5dGVzX2xlZnQgPSBzbmFtZS0+c3RyaW5nX2xlbjsKCXNpemVfdAkgICAgb3V0X2J5dGVzX2xlZnQgPSBzbmFtZS0+c3RyaW5nX2xlbiAqIEZDX1VURjhfTUFYX0xFTjsKCWNoYXIJICAgICppbmJ1ZiwgKm91dGJ1ZjsKCQoJdXRmOCA9IG1hbGxvYyAob3V0X2J5dGVzX2xlZnQgKyAxKTsKCWlmICghdXRmOCkKCSAgICByZXR1cm4gMDsKCQoJb3V0YnVmID0gKGNoYXIgKikgdXRmODsKCWluYnVmID0gKGNoYXIgKikgc25hbWUtPnN0cmluZzsKCQoJd2hpbGUgKGluX2J5dGVzX2xlZnQpCgl7CgkgICAgc2l6ZV90CWRpZCA9IGljb252IChjZCwgCgkJCQkgJmluYnVmLCAmaW5fYnl0ZXNfbGVmdCwKCQkJCSAmb3V0YnVmLCAmb3V0X2J5dGVzX2xlZnQpOwoJICAgIGlmIChkaWQgPT0gKHNpemVfdCkgKC0xKSkKCSAgICB7CgkJZnJlZSAodXRmOCk7CgkJcmV0dXJuIDA7CgkgICAgfQoJfQoJKm91dGJ1ZiA9ICdcMCc7Cglnb3RvIGRvbmU7CiAgICB9CiNlbmRpZgogICAgaWYgKCFzdHJjbXAgKGZyb21jb2RlLCAiVUNTLTJCRSIpIHx8ICFzdHJjbXAgKGZyb21jb2RlLCAiVVRGLTE2QkUiKSkKICAgIHsKCUZjQ2hhcjgJICAgICpzcmMgPSBzbmFtZS0+c3RyaW5nOwoJaW50CSAgICBzcmNfbGVuID0gc25hbWUtPnN0cmluZ19sZW47CglpbnQJICAgIGxlbjsKCWludAkgICAgd2NoYXI7CglpbnQJICAgIGlsZW4sIG9sZW47CglGY0NoYXI4CSAgICAqdTg7CglGY0NoYXIzMiAgICB1Y3M0OwoJCgkvKgoJICogQ29udmVydCBVdGYxNiB0byBVdGY4CgkgKi8KCglpZiAoIUZjVXRmMTZMZW4gKHNyYywgRmNFbmRpYW5CaWcsIHNyY19sZW4sICZsZW4sICZ3Y2hhcikpCgkgICAgcmV0dXJuIDA7CgoJLyoKCSAqIEFsbG9jYXRlIHBsZW50eSBvZiBzcGFjZS4gIEZyZWVkIGJlbG93CgkgKi8KCXV0ZjggPSBtYWxsb2MgKGxlbiAqIEZDX1VURjhfTUFYX0xFTiArIDEpOwoJaWYgKCF1dGY4KQoJICAgIHJldHVybiAwOwoKCXU4ID0gdXRmODsKCgl3aGlsZSAoKGlsZW4gPSBGY1V0ZjE2VG9VY3M0IChzcmMsIEZjRW5kaWFuQmlnLCAmdWNzNCwgc3JjX2xlbikpID4gMCkKCXsKCSAgICBzcmNfbGVuIC09IGlsZW47CgkgICAgc3JjICs9IGlsZW47CgkgICAgb2xlbiA9IEZjVWNzNFRvVXRmOCAodWNzNCwgdTgpOwoJICAgIHU4ICs9IG9sZW47Cgl9CgkqdTggPSAnXDAnOwoJZ290byBkb25lOwogICAgfQogICAgaWYgKCFzdHJjbXAgKGZyb21jb2RlLCAiQVNDSUkiKSB8fCAhc3RyY21wIChmcm9tY29kZSwgIklTTy04ODU5LTEiKSkKICAgIHsKCUZjQ2hhcjgJICAgICpzcmMgPSBzbmFtZS0+c3RyaW5nOwoJaW50CSAgICBzcmNfbGVuID0gc25hbWUtPnN0cmluZ19sZW47CglpbnQJICAgIG9sZW47CglGY0NoYXI4CSAgICAqdTg7CglGY0NoYXIzMiAgICB1Y3M0OwoJCgkvKgoJICogQ29udmVydCBMYXRpbjEgdG8gVXRmOC4gRnJlZWQgYmVsb3cKCSAqLwoJdXRmOCA9IG1hbGxvYyAoc3JjX2xlbiAqIDIgKyAxKTsKCWlmICghdXRmOCkKCSAgICByZXR1cm4gMDsKCgl1OCA9IHV0Zjg7Cgl3aGlsZSAoc3JjX2xlbiA+IDApCgl7CgkgICAgdWNzNCA9ICpzcmMrKzsKCSAgICBzcmNfbGVuLS07CgkgICAgb2xlbiA9IEZjVWNzNFRvVXRmOCAodWNzNCwgdTgpOwoJICAgIHU4ICs9IG9sZW47Cgl9CgkqdTggPSAnXDAnOwoJZ290byBkb25lOwogICAgfQogICAgaWYgKCFzdHJjbXAgKGZyb21jb2RlLCBGQ19FTkNPRElOR19NQUNfUk9NQU4pKQogICAgewoJRmNDaGFyOAkJKnU4OwoJY29uc3QgRmNDaGFyTWFwCSptYXAgPSBGY0ZyZWVUeXBlR2V0UHJpdmF0ZU1hcCAoZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4pOwoJRmNDaGFyOAkJKnNyYyA9IChGY0NoYXI4ICopIHNuYW1lLT5zdHJpbmc7CglpbnQJCXNyY19sZW4gPSBzbmFtZS0+c3RyaW5nX2xlbjsKCQoJLyoKCSAqIENvbnZlcnQgQXBwbGVSb21hbiB0byBVdGY4CgkgKi8KCWlmICghbWFwKQoJICAgIHJldHVybiAwOwoKCXV0ZjggPSBtYWxsb2MgKHNuYW1lLT5zdHJpbmdfbGVuICogMyArIDEpOwoJaWYgKCF1dGY4KQoJICAgIHJldHVybiAwOwoKCXU4ID0gdXRmODsKCXdoaWxlIChzcmNfbGVuID4gMCkKCXsKCSAgICBGY0NoYXIzMgl1Y3M0ID0gRmNGcmVlVHlwZVByaXZhdGVUb1VjczQgKCpzcmMrKywgbWFwKTsKCSAgICBpbnQJCW9sZW4gPSBGY1VjczRUb1V0ZjggKHVjczQsIHU4KTsKCSAgICBzcmNfbGVuLS07CgkgICAgdTggKz0gb2xlbjsKCX0KCSp1OCA9ICdcMCc7Cglnb3RvIGRvbmU7CiAgICB9CiAgICByZXR1cm4gMDsKZG9uZToKICAgIGlmIChGY1N0ckNtcElnbm9yZUJsYW5rc0FuZENhc2UgKHV0ZjgsICIiKSA9PSAwKQogICAgewoJZnJlZSAodXRmOCk7CglyZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiB1dGY4Owp9CgpzdGF0aWMgRmNDaGFyOCAqCkZjU2ZudE5hbWVMYW5ndWFnZSAoRlRfU2ZudE5hbWUgKnNuYW1lKQp7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkNfRlRfTEFOR1VBR0U7IGkrKykKCWlmIChmY0Z0TGFuZ3VhZ2VbaV0ucGxhdGZvcm1faWQgPT0gc25hbWUtPnBsYXRmb3JtX2lkICYmCgkgICAgKGZjRnRMYW5ndWFnZVtpXS5sYW5ndWFnZV9pZCA9PSBUVF9MQU5HVUFHRV9ET05UX0NBUkUgfHwKCSAgICAgZmNGdExhbmd1YWdlW2ldLmxhbmd1YWdlX2lkID09IHNuYW1lLT5sYW5ndWFnZV9pZCkpCgkgICAgcmV0dXJuIGZjRnRMYW5ndWFnZVtpXS5sYW5nOwogICAgcmV0dXJuIDA7Cn0KCi8qIE9yZGVyIGlzIHNpZ25pZmljYW50LiAgRm9yIGV4YW1wbGUsIHNvbWUgQiZIIGZvbnRzIGFyZSBoaW50ZWQgYnkKICAgVVJXKyssIGFuZCBib3RoIHN0cmluZ3MgYXBwZWFyIGluIHRoZSBub3RpY2UuICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIGNvbnN0IEZUX1N0cmluZyAqbm90aWNlOwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5Owp9IEZjTm90aWNlRm91bmRyaWVzW10gPSB7CiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIkJpZ2Vsb3ciLAkoY29uc3QgRmNDaGFyOCAqKSAiYiZoIiB9LAogICAgeyAoY29uc3QgRlRfU3RyaW5nICopICJBZG9iZSIsCShjb25zdCBGY0NoYXI4ICopICJhZG9iZSIgfSwKICAgIHsgKGNvbnN0IEZUX1N0cmluZyAqKSAiQml0c3RyZWFtIiwJKGNvbnN0IEZjQ2hhcjggKikgImJpdHN0cmVhbSIgfSwKICAgIHsgKGNvbnN0IEZUX1N0cmluZyAqKSAiTW9ub3R5cGUiLAkoY29uc3QgRmNDaGFyOCAqKSAibW9ub3R5cGUiIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIkxpbm90eXBlIiwJKGNvbnN0IEZjQ2hhcjggKikgImxpbm90eXBlIiB9LAogICAgeyAoY29uc3QgRlRfU3RyaW5nICopICJMSU5PVFlQRS1IRUxMIiwKCQkJCQkoY29uc3QgRmNDaGFyOCAqKSAibGlub3R5cGUiIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIklCTSIsCShjb25zdCBGY0NoYXI4ICopICJpYm0iIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIlVSVyIsCShjb25zdCBGY0NoYXI4ICopICJ1cnciIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIkludGVybmF0aW9uYWwgVHlwZWZhY2UgQ29ycG9yYXRpb24iLCAKCQkJCQkoY29uc3QgRmNDaGFyOCAqKSAiaXRjIiB9LAogICAgeyAoY29uc3QgRlRfU3RyaW5nICopICJUaXJvIFR5cGV3b3JrcyIsCgkJCQkJKGNvbnN0IEZjQ2hhcjggKikgInRpcm8iIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIlhGcmVlODYiLAkoY29uc3QgRmNDaGFyOCAqKSAieGZyZWU4NiIgfSwKICAgIHsgKGNvbnN0IEZUX1N0cmluZyAqKSAiTWljcm9zb2Z0IiwJKGNvbnN0IEZjQ2hhcjggKikgIm1pY3Jvc29mdCIgfSwKICAgIHsgKGNvbnN0IEZUX1N0cmluZyAqKSAiT21lZ2EiLAkoY29uc3QgRmNDaGFyOCAqKSAib21lZ2EiIH0sCiAgICB7IChjb25zdCBGVF9TdHJpbmcgKikgIkZvbnQyMSIsCShjb25zdCBGY0NoYXI4ICopICJod2FuIiB9LAogICAgeyAoY29uc3QgRlRfU3RyaW5nICopICJIYW5ZYW5nIFN5c3RlbSIsCgkJCQkJKGNvbnN0IEZjQ2hhcjggKikgImhhbnlhbmciIH0KfTsKCiNkZWZpbmUgTlVNX05PVElDRV9GT1VORFJJRVMJKHNpemVvZiAoRmNOb3RpY2VGb3VuZHJpZXMpIC8gc2l6ZW9mIChGY05vdGljZUZvdW5kcmllc1swXSkpCgpzdGF0aWMgY29uc3QgRmNDaGFyOCAqCkZjTm90aWNlRm91bmRyeShjb25zdCBGVF9TdHJpbmcgKm5vdGljZSkKewogICAgaW50IGk7CgogICAgaWYgKG5vdGljZSkKCWZvcihpID0gMDsgaSA8IE5VTV9OT1RJQ0VfRk9VTkRSSUVTOyBpKyspCgkgICAgaWYgKHN0cnN0ciAoKGNvbnN0IGNoYXIgKikgbm90aWNlLCAoY29uc3QgY2hhciAqKSBGY05vdGljZUZvdW5kcmllc1tpXS5ub3RpY2UpKQoJCXJldHVybiBGY05vdGljZUZvdW5kcmllc1tpXS5mb3VuZHJ5OwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWZW5kb3JNYXRjaChjb25zdCBGVF9DaGFyIHZlbmRvcls0XSwgY29uc3QgRlRfQ2hhciAqdmVuZG9yX3N0cmluZykKewogICAgLyogdmVuZG9yIGlzIG5vdCBuZWNlc3NhcmlseSBOVUwtdGVybWluYXRlZC4gKi8KICAgIGludCBpLCBsZW47CiAgICAKICAgIGxlbiA9IHN0cmxlbih2ZW5kb3Jfc3RyaW5nKTsKICAgIGlmIChtZW1jbXAodmVuZG9yLCB2ZW5kb3Jfc3RyaW5nLCBsZW4pICE9IDApCiAgICAgICAgcmV0dXJuIEZjRmFsc2U7CiAgICBmb3IgKGkgPSBsZW47IGkgPCA0OyBpKyspCiAgICAgICAgaWYgKHZlbmRvcltpXSAhPSAnICcgJiYgdmVuZG9yW2ldICE9ICdcMCcpCiAgICAgICAgICAgIHJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKLyogVGhpcyB0YWJsZSBpcyBwYXJ0bHkgdGFrZW4gZnJvbSB0dG1rZmRpciBieSBKb2VyZyBQb21tbml0ei4gKi8KCi8qIEl0IHNob3VsZCBub3QgY29udGFpbiB1c2VsZXNzIGVudHJpZXMgKHN1Y2ggYXMgVU5LTikgbm9yIGR1cGxpY2F0ZQogICBlbnRyaWVzIGZvciBwYWRkaW5nIGJvdGggd2l0aCBzcGFjZXMgYW5kIE5VTHMuICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIGNvbnN0IEZUX0NoYXIgICAqdmVuZG9yOwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5Owp9IEZjVmVuZG9yRm91bmRyaWVzW10gPSB7CiAgICB7IChjb25zdCBGVF9DaGFyICopICJBREJFIiwgKGNvbnN0IEZjQ2hhcjggKikgImFkb2JlIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJBR0ZBIiwgKGNvbnN0IEZjQ2hhcjggKikgImFnZmEifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkFMVFMiLCAoY29uc3QgRmNDaGFyOCAqKSAiYWx0c3lzIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJBUFBMIiwgKGNvbnN0IEZjQ2hhcjggKikgImFwcGxlIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJBUlBIIiwgKGNvbnN0IEZjQ2hhcjggKikgImFycGhpYyJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiQVRFQyIsIChjb25zdCBGY0NoYXI4ICopICJhbGx0eXBlIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJCJkgiLCAgKGNvbnN0IEZjQ2hhcjggKikgImImaCJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiQklUUyIsIChjb25zdCBGY0NoYXI4ICopICJiaXRzdHJlYW0ifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkNBTk8iLCAoY29uc3QgRmNDaGFyOCAqKSAiY2Fubm9uIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJEWU5BIiwgKGNvbnN0IEZjQ2hhcjggKikgImR5bmFsYWIifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkVQU04iLCAoY29uc3QgRmNDaGFyOCAqKSAiZXBzb24ifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkZKIiwgICAoY29uc3QgRmNDaGFyOCAqKSAiZnVqaXRzdSJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiSUJNIiwgIChjb25zdCBGY0NoYXI4ICopICJpYm0ifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIklUQyIsICAoY29uc3QgRmNDaGFyOCAqKSAiaXRjIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJJTVBSIiwgKGNvbnN0IEZjQ2hhcjggKikgImltcHJlc3MifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIkxBUkEiLCAoY29uc3QgRmNDaGFyOCAqKSAibGFyYWJpZWZvbnRzIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJMRUFGIiwgKGNvbnN0IEZjQ2hhcjggKikgImludGVybGVhZiJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTEVUUiIsIChjb25zdCBGY0NoYXI4ICopICJsZXRyYXNldCJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTElOTyIsIChjb25zdCBGY0NoYXI4ICopICJsaW5vdHlwZSJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTUFDUiIsIChjb25zdCBGY0NoYXI4ICopICJtYWNyb21lZGlhIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJNT05PIiwgKGNvbnN0IEZjQ2hhcjggKikgIm1vbm90eXBlIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJNUyIsICAgKGNvbnN0IEZjQ2hhcjggKikgIm1pY3Jvc29mdCJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTVQiLCAgIChjb25zdCBGY0NoYXI4ICopICJtb25vdHlwZSJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiTkVDIiwgIChjb25zdCBGY0NoYXI4ICopICJuZWMifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIlBBUkEiLCAoY29uc3QgRmNDaGFyOCAqKSAicGFyYXR5cGUifSwKICAgIHsgKGNvbnN0IEZUX0NoYXIgKikgIlFNU0kiLCAoY29uc3QgRmNDaGFyOCAqKSAicW1zIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJSSUNPIiwgKGNvbnN0IEZjQ2hhcjggKikgInJpY29oIn0sCiAgICB7IChjb25zdCBGVF9DaGFyICopICJVUlciLCAgKGNvbnN0IEZjQ2hhcjggKikgInVydyJ9LAogICAgeyAoY29uc3QgRlRfQ2hhciAqKSAiWSZZIiwgIChjb25zdCBGY0NoYXI4ICopICJ5JnkifQp9OwoKI2RlZmluZSBOVU1fVkVORE9SX0ZPVU5EUklFUwkoc2l6ZW9mIChGY1ZlbmRvckZvdW5kcmllcykgLyBzaXplb2YgKEZjVmVuZG9yRm91bmRyaWVzWzBdKSkKCnN0YXRpYyBjb25zdCBGY0NoYXI4ICoKRmNWZW5kb3JGb3VuZHJ5KGNvbnN0IEZUX0NoYXIgdmVuZG9yWzRdKQp7CiAgICBpbnQgaTsKICAgIAogICAgaWYgKHZlbmRvcikKCWZvcihpID0gMDsgaSA8IE5VTV9WRU5ET1JfRk9VTkRSSUVTOyBpKyspCgkgICAgaWYgKEZjVmVuZG9yTWF0Y2ggKHZlbmRvciwgRmNWZW5kb3JGb3VuZHJpZXNbaV0udmVuZG9yKSkKCQlyZXR1cm4gRmNWZW5kb3JGb3VuZHJpZXNbaV0uZm91bmRyeTsKICAgIHJldHVybiAwOwp9Cgp0eXBlZGVmIHN0cnVjdCBfRmNTdHJpbmdDb25zdCB7CiAgICBjb25zdCBGY0NoYXI4ICAgKm5hbWU7CiAgICBpbnQJCSAgICB2YWx1ZTsKfSBGY1N0cmluZ0NvbnN0OwoKc3RhdGljIGludApGY1N0cmluZ0lzQ29uc3QgKGNvbnN0IEZjQ2hhcjgJCSpzdHJpbmcsCgkJIGNvbnN0IEZjU3RyaW5nQ29uc3QJKmMsCgkJIGludAkJCW5jKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbmM7IGkrKykKCWlmIChGY1N0ckNtcElnbm9yZUJsYW5rc0FuZENhc2UgKHN0cmluZywgY1tpXS5uYW1lKSA9PSAwKQoJICAgIHJldHVybiBjW2ldLnZhbHVlOwogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW50CkZjU3RyaW5nQ29udGFpbnNDb25zdCAoY29uc3QgRmNDaGFyOAkgICAgKnN0cmluZywKCQkgICAgICAgY29uc3QgRmNTdHJpbmdDb25zdCAgKmMsCgkJICAgICAgIGludAkJICAgIG5jKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbmM7IGkrKykKCWlmIChGY1N0ckNvbnRhaW5zSWdub3JlQmxhbmtzQW5kQ2FzZSAoc3RyaW5nLCBjW2ldLm5hbWUpKQoJICAgIHJldHVybiBjW2ldLnZhbHVlOwogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgY29uc3QgRmNTdHJpbmdDb25zdCAgd2VpZ2h0Q29uc3RzW10gPSB7CiAgICB7ICJ0aGluIiwJCUZDX1dFSUdIVF9USElOIH0sCiAgICB7ICJleHRyYWxpZ2h0IiwJRkNfV0VJR0hUX0VYVFJBTElHSFQgfSwKICAgIHsgInVsdHJhbGlnaHQiLAlGQ19XRUlHSFRfVUxUUkFMSUdIVCB9LAogICAgeyAibGlnaHQiLAkJRkNfV0VJR0hUX0xJR0hUIH0sCiAgICB7ICJib29rIiwJCUZDX1dFSUdIVF9CT09LIH0sCiAgICB7ICJyZWd1bGFyIiwJRkNfV0VJR0hUX1JFR1VMQVIgfSwKICAgIHsgIm5vcm1hbCIsCQlGQ19XRUlHSFRfTk9STUFMIH0sCiAgICB7ICJtZWRpdW0iLAkJRkNfV0VJR0hUX01FRElVTSB9LAogICAgeyAiZGVtaWJvbGQiLAlGQ19XRUlHSFRfREVNSUJPTEQgfSwKICAgIHsgImRlbWkiLAkJRkNfV0VJR0hUX0RFTUlCT0xEIH0sCiAgICB7ICJzZW1pYm9sZCIsCUZDX1dFSUdIVF9TRU1JQk9MRCB9LAogICAgeyAiYm9sZCIsCQlGQ19XRUlHSFRfQk9MRCB9LAogICAgeyAiZXh0cmFib2xkIiwJRkNfV0VJR0hUX0VYVFJBQk9MRCB9LAogICAgeyAidWx0cmFib2xkIiwJRkNfV0VJR0hUX1VMVFJBQk9MRCB9LAogICAgeyAiYmxhY2siLAkJRkNfV0VJR0hUX0JMQUNLIH0sCiAgICB7ICJoZWF2eSIsCQlGQ19XRUlHSFRfSEVBVlkgfSwKfTsKCiNkZWZpbmUgTlVNX1dFSUdIVF9DT05TVFMgIChzaXplb2YgKHdlaWdodENvbnN0cykgLyBzaXplb2YgKHdlaWdodENvbnN0c1swXSkpCgojZGVmaW5lIEZjSXNXZWlnaHQocykJICAgIEZjU3RyaW5nSXNDb25zdChzLHdlaWdodENvbnN0cyxOVU1fV0VJR0hUX0NPTlNUUykKI2RlZmluZSBGY0NvbnRhaW5zV2VpZ2h0KHMpIEZjU3RyaW5nQ29udGFpbnNDb25zdCAocyx3ZWlnaHRDb25zdHMsTlVNX1dFSUdIVF9DT05TVFMpCgpzdGF0aWMgY29uc3QgRmNTdHJpbmdDb25zdCAgd2lkdGhDb25zdHNbXSA9IHsKICAgIHsgInVsdHJhY29uZGVuc2VkIiwJRkNfV0lEVEhfVUxUUkFDT05ERU5TRUQgfSwKICAgIHsgImV4dHJhY29uZGVuc2VkIiwJRkNfV0lEVEhfRVhUUkFDT05ERU5TRUQgfSwKICAgIHsgInNlbWljb25kZW5zZWQiLCAgRkNfV0lEVEhfU0VNSUNPTkRFTlNFRCB9LAogICAgeyAiY29uZGVuc2VkIiwJRkNfV0lEVEhfQ09OREVOU0VEIH0sCS8qIG11c3QgYmUgYWZ0ZXIgKmNvbmRlbnNlZCAqLwogICAgeyAibm9ybWFsIiwJCUZDX1dJRFRIX05PUk1BTCB9LAogICAgeyAic2VtaWV4cGFuZGVkIiwJRkNfV0lEVEhfU0VNSUVYUEFOREVEIH0sCiAgICB7ICJleHRyYWV4cGFuZGVkIiwJRkNfV0lEVEhfRVhUUkFFWFBBTkRFRCB9LAogICAgeyAidWx0cmFleHBhbmRlZCIsCUZDX1dJRFRIX1VMVFJBRVhQQU5ERUQgfSwKICAgIHsgImV4cGFuZGVkIiwJRkNfV0lEVEhfRVhQQU5ERUQgfSwJLyogbXVzdCBiZSBhZnRlciAqZXhwYW5kZWQgKi8KfTsKCiNkZWZpbmUgTlVNX1dJRFRIX0NPTlNUUyAgICAoc2l6ZW9mICh3aWR0aENvbnN0cykgLyBzaXplb2YgKHdpZHRoQ29uc3RzWzBdKSkKCiNkZWZpbmUgRmNJc1dpZHRoKHMpCSAgICBGY1N0cmluZ0lzQ29uc3Qocyx3aWR0aENvbnN0cyxOVU1fV0lEVEhfQ09OU1RTKQojZGVmaW5lIEZjQ29udGFpbnNXaWR0aChzKSAgRmNTdHJpbmdDb250YWluc0NvbnN0IChzLHdpZHRoQ29uc3RzLE5VTV9XSURUSF9DT05TVFMpCgpzdGF0aWMgY29uc3QgRmNTdHJpbmdDb25zdCAgc2xhbnRDb25zdHNbXSA9IHsKICAgIHsgIml0YWxpYyIsCQlGQ19TTEFOVF9JVEFMSUMgfSwKICAgIHsgIm9ibGlxdWUiLAlGQ19TTEFOVF9PQkxJUVVFIH0sCn07CgojZGVmaW5lIE5VTV9TTEFOVF9DT05TVFMgICAgKHNpemVvZiAoc2xhbnRDb25zdHMpIC8gc2l6ZW9mIChzbGFudENvbnN0c1swXSkpCgojZGVmaW5lIEZjSXNTbGFudChzKQkgICAgRmNTdHJpbmdJc0NvbnN0KHMsc2xhbnRDb25zdHMsTlVNX1NMQU5UX0NPTlNUUykKI2RlZmluZSBGY0NvbnRhaW5zU2xhbnQocykgIEZjU3RyaW5nQ29udGFpbnNDb25zdCAocyxzbGFudENvbnN0cyxOVU1fU0xBTlRfQ09OU1RTKQoKc3RhdGljIGRvdWJsZQpGY0dldFBpeGVsU2l6ZSAoRlRfRmFjZSBmYWNlLCBpbnQgaSkKewojaWYgSEFWRV9GVF9HRVRfQkRGX1BST1BFUlRZCiAgICBpZiAoZmFjZS0+bnVtX2ZpeGVkX3NpemVzID09IDEpCiAgICB7CglCREZfUHJvcGVydHlSZWMJcHJvcDsKCWludAkJcmM7CgoJcmMgPSBNWV9HZXRfQkRGX1Byb3BlcnR5IChmYWNlLCAiUElYRUxfU0laRSIsICZwcm9wKTsKCWlmIChyYyA9PSAwICYmIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSKQoJICAgIHJldHVybiAoZG91YmxlKSBwcm9wLnUuaW50ZWdlcjsKICAgIH0KI2VuZGlmCiNpZiBIQVZFX0ZUX0JJVE1BUF9TSVpFX1lfUFBFTQogICAgcmV0dXJuIChkb3VibGUpIGZhY2UtPmF2YWlsYWJsZV9zaXplc1tpXS55X3BwZW0gLyA2NC4wOwojZWxzZQogICAgcmV0dXJuIChkb3VibGUpIGZhY2UtPmF2YWlsYWJsZV9zaXplc1tpXS5oZWlnaHQ7CiNlbmRpZgp9CgpzdGF0aWMgRmNCb29sCkZjU3RyaW5nSW5QYXR0ZXJuRWxlbWVudCAoRmNQYXR0ZXJuICpwYXQsIGNoYXIgKmVsdCwgRmNDaGFyOCAqc3RyaW5nKQp7CiAgICBpbnQJICAgIGU7CiAgICBGY0NoYXI4ICpvbGQ7CiAgICBmb3IgKGUgPSAwOyBGY1BhdHRlcm5HZXRTdHJpbmcgKHBhdCwgZWx0LCBlLCAmb2xkKSA9PSBGY1Jlc3VsdE1hdGNoOyBlKyspCglpZiAoIUZjU3RyQ21wSWdub3JlQmxhbmtzQW5kQ2FzZSAob2xkLCBzdHJpbmcpKQoJewoJICAgIHJldHVybiBGY1RydWU7CgkgICAgYnJlYWs7Cgl9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKRmNQYXR0ZXJuICoKRmNGcmVlVHlwZVF1ZXJ5IChjb25zdCBGY0NoYXI4CSpmaWxlLAoJCSBpbnQJCWlkLAoJCSBGY0JsYW5rcwkqYmxhbmtzLAoJCSBpbnQJCSpjb3VudCkKewogICAgRlRfRmFjZQkgICAgZmFjZTsKICAgIEZjUGF0dGVybgkgICAgKnBhdDsKICAgIGludAkJICAgIHNsYW50ID0gLTE7CiAgICBpbnQJCSAgICB3ZWlnaHQgPSAtMTsKICAgIGludAkJICAgIHdpZHRoID0gLTE7CiAgICBpbnQJCSAgICBpOwogICAgRmNDaGFyU2V0CSAgICAqY3M7CiAgICBGY0xhbmdTZXQJICAgICpsczsKICAgIEZUX0xpYnJhcnkJICAgIGZ0TGlicmFyeTsKI2lmIDAKICAgIEZjQ2hhcjgJICAgICpmYW1pbHkgPSAwOwojZW5kaWYKICAgIEZjQ2hhcjgJICAgICpjb21wbGV4OwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5ID0gMDsKICAgIGludAkJICAgIHNwYWNpbmc7CiAgICBUVF9PUzIJICAgICpvczI7CiNpZiBIQVZFX0ZUX0dFVF9QU19GT05UX0lORk8KICAgIFBTX0ZvbnRJbmZvUmVjICBwc2ZvbnRpbmZvOwojZW5kaWYKI2lmIEhBVkVfRlRfR0VUX0JERl9QUk9QRVJUWQogICAgQkRGX1Byb3BlcnR5UmVjIHByb3A7CiNlbmRpZgogICAgVFRfSGVhZGVyCSAgICAqaGVhZDsKICAgIGNvbnN0IEZjQ2hhcjggICAqZXhjbHVzaXZlTGFuZyA9IDA7CiAgICBGVF9TZm50TmFtZQkgICAgc25hbWU7CiAgICBGVF9VSW50ICAgIAkgICAgc25hbWVpLCBzbmFtZWM7CiAgICAKICAgIGludAkJICAgIG5mYW1pbHkgPSAwOwogICAgaW50CQkgICAgbmZhbWlseV9sYW5nID0gMDsKICAgIGludAkJICAgIG5zdHlsZSA9IDA7CiAgICBpbnQJCSAgICBuc3R5bGVfbGFuZyA9IDA7CiAgICBpbnQJCSAgICBuZnVsbG5hbWUgPSAwOwogICAgaW50CQkgICAgbmZ1bGxuYW1lX2xhbmcgPSAwOwoKICAgIEZjQ2hhcjgJICAgICpzdHlsZSA9IDA7CiAgICBpbnQJCSAgICBzdDsKICAgIAogICAgaWYgKEZUX0luaXRfRnJlZVR5cGUgKCZmdExpYnJhcnkpKQoJcmV0dXJuIDA7CiAgICAKICAgIGlmIChGVF9OZXdfRmFjZSAoZnRMaWJyYXJ5LCAoY2hhciAqKSBmaWxlLCBpZCwgJmZhY2UpKQoJZ290byBiYWlsOwoKICAgICpjb3VudCA9IGZhY2UtPm51bV9mYWNlczsKCiAgICBwYXQgPSBGY1BhdHRlcm5DcmVhdGUgKCk7CiAgICBpZiAoIXBhdCkKCWdvdG8gYmFpbDA7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRCb29sIChwYXQsIEZDX09VVExJTkUsCgkJCSAgIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSAhPSAwKSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRCb29sIChwYXQsIEZDX1NDQUxBQkxFLAoJCQkgICAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkgIT0gMCkpCglnb3RvIGJhaWwxOwoKCiAgICAvKgogICAgICogR2V0IHRoZSBPUy8yIHRhYmxlCiAgICAgKi8KICAgIG9zMiA9IChUVF9PUzIgKikgRlRfR2V0X1NmbnRfVGFibGUgKGZhY2UsIGZ0X3NmbnRfb3MyKTsKCiAgICAvKgogICAgICogTG9vayBmaXJzdCBpbiB0aGUgT1MvMiB0YWJsZSBmb3IgdGhlIGZvdW5kcnksIGlmCiAgICAgKiBub3QgZm91bmQgaGVyZSwgdGhlIHZhcmlvdXMgbm90aWNlcyB3aWxsIGJlIHNlYXJjaGVkIGZvcgogICAgICogdGhhdCBpbmZvcm1hdGlvbiwgZWl0aGVyIGZyb20gdGhlIHNmbnQgbmFtZSB0YWJsZXMgb3IKICAgICAqIHRoZSBQb3N0c2NyaXB0IEZvbnRJbmZvIGRpY3Rpb25hcnkuICBGaW5hbGx5LCB0aGUKICAgICAqIEJERiBwcm9wZXJ0aWVzIHdpbGwgcXVlcmllZC4KICAgICAqLwogICAgCiAgICBpZiAob3MyICYmIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgJiYgb3MyLT52ZXJzaW9uICE9IDB4ZmZmZikKICAgICAgICBmb3VuZHJ5ID0gRmNWZW5kb3JGb3VuZHJ5KG9zMi0+YWNoVmVuZElEKTsKCiAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19TQ0FOVikKCXByaW50ZiAoIlxuIik7CiAgICAvKgogICAgICogR3J1YiB0aHJvdWdoIHRoZSBuYW1lIHRhYmxlIGxvb2tpbmcgZm9yIGZhbWlseQogICAgICogYW5kIHN0eWxlIG5hbWVzLiAgRnJlZVR5cGUgbWFrZXMgcXVpdGUgYSBoYXNoCiAgICAgKiBvZiB0aGVtCiAgICAgKi8KICAgIHNuYW1lYyA9IEZUX0dldF9TZm50X05hbWVfQ291bnQgKGZhY2UpOwogICAgZm9yIChzbmFtZWkgPSAwOyBzbmFtZWkgPCBzbmFtZWM7IHNuYW1laSsrKQogICAgewoJRmNDaGFyOAkJKnV0Zjg7CglGY0NoYXI4CQkqbGFuZzsKCWNoYXIJCSplbHQgPSAwLCAqZWx0bGFuZyA9IDA7CglpbnQJCSpucCA9IDAsICpubGFuZ3AgPSAwOwoKCWlmIChGVF9HZXRfU2ZudF9OYW1lIChmYWNlLCBzbmFtZWksICZzbmFtZSkgIT0gMCkKCSAgICBjb250aW51ZTsKCQoJdXRmOCA9IEZjU2ZudE5hbWVUcmFuc2NvZGUgKCZzbmFtZSk7CglsYW5nID0gRmNTZm50TmFtZUxhbmd1YWdlICgmc25hbWUpOwoKCWlmICghdXRmOCkKCSAgICBjb250aW51ZTsKCQoJc3dpdGNoIChzbmFtZS5uYW1lX2lkKSB7CgljYXNlIFRUX05BTUVfSURfRk9OVF9GQU1JTFk6CiNpZiAwCSAgICAKCWNhc2UgVFRfTkFNRV9JRF9QU19OQU1FOgoJY2FzZSBUVF9OQU1FX0lEX1VOSVFVRV9JRDoKI2VuZGlmCgkgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfU0NBTlYpCgkJcHJpbnRmICgiZm91bmQgZmFtaWx5IChuICUyZCBwICVkIGUgJWQgbCAweCUwNHgpICVzXG4iLAoJCSAgICBzbmFtZS5uYW1lX2lkLCBzbmFtZS5wbGF0Zm9ybV9pZCwKCQkgICAgc25hbWUuZW5jb2RpbmdfaWQsIHNuYW1lLmxhbmd1YWdlX2lkLAoJCSAgICB1dGY4KTsKICAgIAoJICAgIGVsdCA9IEZDX0ZBTUlMWTsKCSAgICBlbHRsYW5nID0gRkNfRkFNSUxZTEFORzsKCSAgICBucCA9ICZuZmFtaWx5OwoJICAgIG5sYW5ncCA9ICZuZmFtaWx5X2xhbmc7CgkgICAgYnJlYWs7CgljYXNlIFRUX05BTUVfSURfRlVMTF9OQU1FOgoJY2FzZSBUVF9OQU1FX0lEX01BQ19GVUxMX05BTUU6CgkgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfU0NBTlYpCgkJcHJpbnRmICgiZm91bmQgZnVsbCAgIChuICUyZCBwICVkIGUgJWQgbCAweCUwNHgpICVzXG4iLAoJCSAgICBzbmFtZS5uYW1lX2lkLCBzbmFtZS5wbGF0Zm9ybV9pZCwKCQkgICAgc25hbWUuZW5jb2RpbmdfaWQsIHNuYW1lLmxhbmd1YWdlX2lkLAoJCSAgICB1dGY4KTsKICAgIAoJICAgIGVsdCA9IEZDX0ZVTExOQU1FOwoJICAgIGVsdGxhbmcgPSBGQ19GVUxMTkFNRUxBTkc7CgkgICAgbnAgPSAmbmZ1bGxuYW1lOwoJICAgIG5sYW5ncCA9ICZuZnVsbG5hbWVfbGFuZzsKCSAgICBicmVhazsKCWNhc2UgVFRfTkFNRV9JRF9GT05UX1NVQkZBTUlMWToKCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19TQ0FOVikKCQlwcmludGYgKCJmb3VuZCBzdHlsZSAgKG4gJTJkIHAgJWQgZSAlZCBsIDB4JTA0eCkgJXNcbiIsCgkJICAgIHNuYW1lLm5hbWVfaWQsIHNuYW1lLnBsYXRmb3JtX2lkLAoJCSAgICBzbmFtZS5lbmNvZGluZ19pZCwgc25hbWUubGFuZ3VhZ2VfaWQsCgkJICAgIHV0ZjgpOwogICAgCgkgICAgZWx0ID0gRkNfU1RZTEU7CgkgICAgZWx0bGFuZyA9IEZDX1NUWUxFTEFORzsKCSAgICBucCA9ICZuc3R5bGU7CgkgICAgbmxhbmdwID0gJm5zdHlsZV9sYW5nOwoJICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFRfTkFNRV9JRF9UUkFERU1BUks6CiAgICAgICAgY2FzZSBUVF9OQU1FX0lEX01BTlVGQUNUVVJFUjoKCSAgICAvKiBJZiB0aGUgZm91bmRyeSB3YXNuJ3QgZm91bmQgaW4gdGhlIE9TLzIgdGFibGUsIGxvb2sgaGVyZSAqLwogICAgICAgICAgICBpZighZm91bmRyeSkKICAgICAgICAgICAgICAgIGZvdW5kcnkgPSBGY05vdGljZUZvdW5kcnkoKEZUX1N0cmluZyAqKSB1dGY4KTsKICAgICAgICAgICAgYnJlYWs7Cgl9CglpZiAoZWx0KQoJewoJICAgIGlmIChGY1N0cmluZ0luUGF0dGVybkVsZW1lbnQgKHBhdCwgZWx0LCB1dGY4KSkKCSAgICB7CgkJZnJlZSAodXRmOCk7CgkJY29udGludWU7CgkgICAgfQoKCSAgICAvKiBhZGQgbmV3IGVsZW1lbnQgKi8KCSAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBlbHQsIHV0ZjgpKQoJICAgIHsKCQlmcmVlICh1dGY4KTsKCQlnb3RvIGJhaWwxOwoJICAgIH0KCSAgICBmcmVlICh1dGY4KTsKCSAgICBpZiAobGFuZykKCSAgICB7CgkJLyogcGFkIGxhbmcgbGlzdCB3aXRoICd4eCcgdG8gbGluZSB1cCB3aXRoIGVsdCAqLwoJCXdoaWxlICgqbmxhbmdwIDwgKm5wKQoJCXsKCQkgICAgaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgZWx0bGFuZywgInh4IikpCgkJCWdvdG8gYmFpbDE7CgkJICAgICsrKm5sYW5ncDsKCQl9CgkJaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgZWx0bGFuZywgbGFuZykpCgkJICAgIGdvdG8gYmFpbDE7CgkJKysqbmxhbmdwOwoJICAgIH0KCSAgICArKypucDsKCX0KICAgICAgICBlbHNlCgkgICAgZnJlZSAodXRmOCk7CiAgICB9CiAgICAKICAgIGlmICghbmZhbWlseSAmJiBmYWNlLT5mYW1pbHlfbmFtZSAmJiAKCUZjU3RyQ21wSWdub3JlQmxhbmtzQW5kQ2FzZSAoZmFjZS0+ZmFtaWx5X25hbWUsICIiKSAhPSAwKQogICAgewoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfU0NBTlYpCgkgICAgcHJpbnRmICgidXNpbmcgRnJlZVR5cGUgZmFtaWx5IFwiJXNcIlxuIiwgZmFjZS0+ZmFtaWx5X25hbWUpOwoJaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfRkFNSUxZLCBmYWNlLT5mYW1pbHlfbmFtZSkpCgkgICAgZ290byBiYWlsMTsKCSsrbmZhbWlseTsKICAgIH0KICAgIAogICAgaWYgKCFuc3R5bGUgJiYgZmFjZS0+c3R5bGVfbmFtZSAmJgoJRmNTdHJDbXBJZ25vcmVCbGFua3NBbmRDYXNlIChmYWNlLT5zdHlsZV9uYW1lLCAiIikgIT0gMCkKICAgIHsKCWlmIChGY0RlYnVnICgpICYgRkNfREJHX1NDQU5WKQoJICAgIHByaW50ZiAoInVzaW5nIEZyZWVUeXBlIHN0eWxlIFwiJXNcIlxuIiwgZmFjZS0+c3R5bGVfbmFtZSk7CglpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19TVFlMRSwgZmFjZS0+c3R5bGVfbmFtZSkpCgkgICAgZ290byBiYWlsMTsKCSsrbnN0eWxlOwogICAgfQogICAgCiAgICBpZiAoIW5mYW1pbHkpCiAgICB7CglGY0NoYXI4CSpzdGFydCwgKmVuZDsKCUZjQ2hhcjgJKmZhbWlseTsKCQoJc3RhcnQgPSAoRmNDaGFyOCAqKSBzdHJyY2hyICgoY2hhciAqKSBmaWxlLCAnLycpOwoJaWYgKHN0YXJ0KQoJICAgIHN0YXJ0Kys7CgllbHNlCgkgICAgc3RhcnQgPSAoRmNDaGFyOCAqKSBmaWxlOwoJZW5kID0gKEZjQ2hhcjggKikgc3RycmNociAoKGNoYXIgKikgc3RhcnQsICcuJyk7CglpZiAoIWVuZCkKCSAgICBlbmQgPSBzdGFydCArIHN0cmxlbiAoKGNoYXIgKikgc3RhcnQpOwoJLyogZnJlZWQgYmVsb3cgKi8KCWZhbWlseSA9IG1hbGxvYyAoZW5kIC0gc3RhcnQgKyAxKTsKCXN0cm5jcHkgKChjaGFyICopIGZhbWlseSwgKGNoYXIgKikgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKCWZhbWlseVtlbmQgLSBzdGFydF0gPSAnXDAnOwoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfU0NBTlYpCgkgICAgcHJpbnRmICgidXNpbmcgZmlsZW5hbWUgZm9yIGZhbWlseSAlc1xuIiwgZmFtaWx5KTsKCWlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX0ZBTUlMWSwgZmFtaWx5KSkKCXsKCSAgICBmcmVlIChmYW1pbHkpOwoJICAgIGdvdG8gYmFpbDE7Cgl9CglmcmVlIChmYW1pbHkpOwoJKytuZmFtaWx5OwogICAgfQoKICAgIC8qCiAgICAgKiBXYWxrIHRocm91Z2ggRkNfRlVMTE5BTUUgZW50cmllcyBlbGlkaW5nIHRob3NlIGluIEZDX0ZBTUlMWQogICAgICogb3Igd2hpY2ggYXJlIHNpbXBseSBhIEZDX0ZBTUlMWSBhbmQgRkNfU1RZTEUgZ2x1ZWQgdG9nZXRoZXIKICAgICAqLwogICAgewoJaW50CWZuLCBmYSwgc3Q7CglGY0NoYXI4CSpmdWxsOwoJRmNDaGFyOAkqZmFtOwoJRmNDaGFyOAkqc3R5bGU7CgoJZm9yIChmbiA9IDA7IEZjUGF0dGVybkdldFN0cmluZyAocGF0LCBGQ19GVUxMTkFNRSwgZm4sICZmdWxsKSA9PSBGY1Jlc3VsdE1hdGNoOyBmbisrKQoJewoJICAgIEZjQm9vbCAgcmVtb3ZlID0gRmNGYWxzZTsKCSAgICAvKgoJICAgICAqIENoZWNrIGVhY2ggZmFtaWx5CgkgICAgICovCgkgICAgZm9yIChmYSA9IDA7ICFyZW1vdmUgJiYgCgkJIEZjUGF0dGVybkdldFN0cmluZyAocGF0LCBGQ19GQU1JTFksIAoJCQkJICAgICBmYSwgJmZhbSkgPT0gRmNSZXN1bHRNYXRjaDsKCQkgZmErKykKCSAgICB7CgkJLyoKCQkgKiBmb3IgZXhhY3QgbWF0Y2gKCQkgKi8KCQlpZiAoIUZjU3RyQ21wSWdub3JlQmxhbmtzQW5kQ2FzZSAoZnVsbCwgZmFtKSkKCQl7CgkJICAgIHJlbW92ZSA9IEZjVHJ1ZTsKCQkgICAgYnJlYWs7CgkJfQoJCS8qCgkJICogSWYgdGhlIGZhbWlseSBpcyBpbiB0aGUgZnVsbCBuYW1lLCBjaGVjayB0aGUKCQkgKiBjb21iaW5hdGlvbiBvZiB0aGlzIGZhbWlseSB3aXRoIGV2ZXJ5IHN0eWxlCgkJICovCgkJaWYgKCFGY1N0ckNvbnRhaW5zSWdub3JlQmxhbmtzQW5kQ2FzZSAoZnVsbCwgZmFtKSkKCQkgICAgY29udGludWU7CgkJZm9yIChzdCA9IDA7ICFyZW1vdmUgJiYgCgkJICAgICBGY1BhdHRlcm5HZXRTdHJpbmcgKHBhdCwgRkNfU1RZTEUsIAoJCQkJCSBzdCwgJnN0eWxlKSA9PSBGY1Jlc3VsdE1hdGNoOwoJCSAgICAgc3QrKykKCQl7CgkJICAgIEZjQ2hhcjgJKmJvdGggPSBGY1N0clBsdXMgKGZhbSwgc3R5bGUpOwoKCQkgICAgaWYgKGJvdGgpCgkJICAgIHsKCQkJaWYgKEZjU3RyQ21wSWdub3JlQmxhbmtzQW5kQ2FzZSAoZnVsbCwgYm90aCkgPT0gMCkKCQkJICAgIHJlbW92ZSA9IEZjVHJ1ZTsKCQkJZnJlZSAoYm90aCk7CgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGlmIChyZW1vdmUpCgkgICAgewoJCUZjUGF0dGVyblJlbW92ZSAocGF0LCBGQ19GVUxMTkFNRSwgZm4pOwoJCUZjUGF0dGVyblJlbW92ZSAocGF0LCBGQ19GVUxMTkFNRUxBTkcsIGZuKTsKCQlmbi0tOwoJCW5mdWxsbmFtZS0tOwoJCW5mdWxsbmFtZV9sYW5nLS07CgkgICAgfQoJfQoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfU0NBTlYpCgkgICAgZm9yIChmbiA9IDA7IEZjUGF0dGVybkdldFN0cmluZyAocGF0LCBGQ19GVUxMTkFNRSwgZm4sICZmdWxsKSA9PSBGY1Jlc3VsdE1hdGNoOyBmbisrKQoJCXByaW50ZiAoIlNhdmluZyB1bmlxdWUgZnVsbG5hbWUgJXNcbiIsIGZ1bGwpOwogICAgfQoKICAgIGlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX0ZJTEUsIGZpbGUpKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfSU5ERVgsIGlkKSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfU09VUkNFLCAoRmNDaGFyOCAqKSAiRnJlZVR5cGUiKSkKCWdvdG8gYmFpbDE7CgojaWYgMAogICAgLyoKICAgICAqIGRvbid0IGV2ZW4gdHJ5IHRoaXMgLS0gQ0pLICdtb25vc3BhY2UnIGZvbnRzIGFyZSByZWFsbHkKICAgICAqIGR1YWwgd2lkdGgsIGFuZCBtb3N0IG90aGVyIGZvbnRzIGRvbid0IGJvdGhlciB0byBzZXQKICAgICAqIHRoZSBhdHRyaWJ1dGUuICBTaWdoLgogICAgICovCiAgICBpZiAoKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEgpICE9IDApCglpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfU1BBQ0lORywgRkNfTU9OTykpCgkgICAgZ290byBiYWlsMTsKI2VuZGlmCgogICAgLyoKICAgICAqIEZpbmQgdGhlIGZvbnQgcmV2aXNpb24gKGlmIGF2YWlsYWJsZSkKICAgICAqLwogICAgaGVhZCA9IChUVF9IZWFkZXIgKikgRlRfR2V0X1NmbnRfVGFibGUgKGZhY2UsIGZ0X3NmbnRfaGVhZCk7CiAgICBpZiAoaGVhZCkKICAgIHsKCWlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19GT05UVkVSU0lPTiwgaGVhZC0+Rm9udF9SZXZpc2lvbikpCgkgICAgZ290byBiYWlsMTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBGQ19GT05UVkVSU0lPTiwgMCkpCgkgICAgZ290byBiYWlsMTsKICAgIH0KCiAgICBpZiAob3MyICYmIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgJiYgb3MyLT52ZXJzaW9uICE9IDB4ZmZmZikKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09ERV9QQUdFX1JBTkdFOyBpKyspCgl7CgkgICAgRlRfVUxvbmcJYml0czsKCSAgICBpbnQJCWJpdDsKCSAgICBpZiAoRmNDb2RlUGFnZVJhbmdlW2ldLmJpdCA8IDMyKQoJICAgIHsKCQliaXRzID0gb3MyLT51bENvZGVQYWdlUmFuZ2UxOwoJCWJpdCA9IEZjQ29kZVBhZ2VSYW5nZVtpXS5iaXQ7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJYml0cyA9IG9zMi0+dWxDb2RlUGFnZVJhbmdlMjsKCQliaXQgPSBGY0NvZGVQYWdlUmFuZ2VbaV0uYml0IC0gMzI7CgkgICAgfQoJICAgIGlmIChiaXRzICYgKDEgPDwgYml0KSkKCSAgICB7CgkJLyogCgkJICogSWYgdGhlIGZvbnQgYWR2ZXJ0aXNlcyBzdXBwb3J0IGZvciBtdWx0aXBsZQoJCSAqICJleGNsdXNpdmUiIGxhbmd1YWdlcywgdGhlbiBpbmNsdWRlIHN1cHBvcnQKCQkgKiBmb3IgYW55IGxhbmd1YWdlIGZvdW5kIHRvIGhhdmUgY292ZXJhZ2UKCQkgKi8KCQlpZiAoZXhjbHVzaXZlTGFuZykKCQl7CgkJICAgIGV4Y2x1c2l2ZUxhbmcgPSAwOwoJCSAgICBicmVhazsKCQl9CgkJZXhjbHVzaXZlTGFuZyA9IEZjQ29kZVBhZ2VSYW5nZVtpXS5sYW5nOwoJICAgIH0KCX0KICAgIH0KCiAgICBpZiAob3MyICYmIG9zMi0+dmVyc2lvbiAhPSAweGZmZmYpCiAgICB7CglpZiAob3MyLT51c1dlaWdodENsYXNzID09IDApCgkgICAgOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgMTUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9USElOOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgMjUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9FWFRSQUxJR0hUOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgMzUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9MSUdIVDsKCWVsc2UgaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA8IDQ1MCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfUkVHVUxBUjsKCWVsc2UgaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA8IDU1MCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfTUVESVVNOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgNjUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9TRU1JQk9MRDsKCWVsc2UgaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA8IDc1MCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfQk9MRDsKCWVsc2UgaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA8IDg1MCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfRVhUUkFCT0xEOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgOTUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9CTEFDSzsKCglzd2l0Y2ggKG9zMi0+dXNXaWR0aENsYXNzKSB7CgljYXNlIDE6CXdpZHRoID0gRkNfV0lEVEhfVUxUUkFDT05ERU5TRUQ7IGJyZWFrOwoJY2FzZSAyOgl3aWR0aCA9IEZDX1dJRFRIX0VYVFJBQ09OREVOU0VEOyBicmVhazsKCWNhc2UgMzoJd2lkdGggPSBGQ19XSURUSF9DT05ERU5TRUQ7IGJyZWFrOwoJY2FzZSA0Ogl3aWR0aCA9IEZDX1dJRFRIX1NFTUlDT05ERU5TRUQ7IGJyZWFrOwoJY2FzZSA1Ogl3aWR0aCA9IEZDX1dJRFRIX05PUk1BTDsgYnJlYWs7CgljYXNlIDY6CXdpZHRoID0gRkNfV0lEVEhfU0VNSUVYUEFOREVEOyBicmVhazsKCWNhc2UgNzoJd2lkdGggPSBGQ19XSURUSF9FWFBBTkRFRDsgYnJlYWs7CgljYXNlIDg6CXdpZHRoID0gRkNfV0lEVEhfRVhUUkFFWFBBTkRFRDsgYnJlYWs7CgljYXNlIDk6CXdpZHRoID0gRkNfV0lEVEhfVUxUUkFFWFBBTkRFRDsgYnJlYWs7Cgl9CiAgICB9CiAgICBpZiAob3MyICYmIChjb21wbGV4ID0gRmNGb250Q2FwYWJpbGl0aWVzKGZhY2UpKSkKICAgIHsKCWlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX0NBUEFCSUxJVFksIGNvbXBsZXgpKQoJewoJICAgIGZyZWUgKGNvbXBsZXgpOwoJICAgIGdvdG8gYmFpbDE7Cgl9CglmcmVlIChjb21wbGV4KTsKICAgIH0KCiAgICAvKgogICAgICogVHlwZSAxOiBDaGVjayBmb3IgRm9udEluZm8gZGljdGlvbmFyeSBpbmZvcm1hdGlvbgogICAgICogQ29kZSBmcm9tIGcyQG1hZ2VzdHVkaW9zLm5ldCAoR2VyYXJkIEVzY2FsYW50ZSkKICAgICAqLwogICAgCiNpZiBIQVZFX0ZUX0dFVF9QU19GT05UX0lORk8KICAgIGlmIChGVF9HZXRfUFNfRm9udF9JbmZvKGZhY2UsICZwc2ZvbnRpbmZvKSA9PSAwKQogICAgewoJaWYgKHdlaWdodCA9PSAtMSAmJiBwc2ZvbnRpbmZvLndlaWdodCkKCXsKCSAgICB3ZWlnaHQgPSBGY0lzV2VpZ2h0IChwc2ZvbnRpbmZvLndlaWdodCk7CiAgICAJICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfU0NBTlYpCiAgICAJCXByaW50ZiAoIlx0VHlwZTEgd2VpZ2h0ICVzIG1hcHMgdG8gJWRcbiIsCgkJCXBzZm9udGluZm8ud2VpZ2h0LCB3ZWlnaHQpOwoJfQogICAgIAojaWYgMAoJLyogCgkgKiBEb24ndCBib3RoZXIgd2l0aCBpdGFsaWNfYW5nbGU7IEZyZWVUeXBlIGFscmVhZHkgZXh0cmFjdHMgdGhhdAoJICogaW5mb3JtYXRpb24gZm9yIHVzIGFuZCBzdGlja3MgaXQgaW50byBzdHlsZV9mbGFncwoJICovCiAgICAgICAgaWYgKHBzZm9udGluZm8uaXRhbGljX2FuZ2xlKQogICAgICAgICAgICBzbGFudCA9IEZDX1NMQU5UX0lUQUxJQzsgCiAgICAgICAgZWxzZQogICAgICAgICAgICBzbGFudCA9IEZDX1NMQU5UX1JPTUFOOyAKI2VuZGlmCgogICAgICAgIGlmKCFmb3VuZHJ5KQogICAgICAgICAgICBmb3VuZHJ5ID0gRmNOb3RpY2VGb3VuZHJ5KHBzZm9udGluZm8ubm90aWNlKTsKICAgIH0KI2VuZGlmIC8qIEhBVkVfRlRfR0VUX1BTX0ZPTlRfSU5GTyAqLwogICAgCiNpZiBIQVZFX0ZUX0dFVF9CREZfUFJPUEVSVFkKICAgIC8qCiAgICAgKiBGaW5hbGx5LCBsb29rIGZvciBhIEZPVU5EUlkgQkRGIHByb3BlcnR5IGlmIG5vIG90aGVyCiAgICAgKiBtZWNoYW5pc20gaGFzIG1hbmFnZWQgdG8gbG9jYXRlIGEgZm91bmRyeQogICAgICovCgogICAgaWYgKCFmb3VuZHJ5KQogICAgewoJaW50ICAgICAgICAgICAgIHJjOwoJQkRGX1Byb3BlcnR5UmVjIHByb3A7CglyYyA9IE1ZX0dldF9CREZfUHJvcGVydHkoZmFjZSwgIkZPVU5EUlkiLCAmcHJvcCk7CglpZihyYyA9PSAwICYmIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9BVE9NKQoJICAgIGZvdW5kcnkgPSBwcm9wLnUuYXRvbTsKICAgIH0KCiAgICBpZiAod2lkdGggPT0gLTEpCiAgICB7CglpZiAoTVlfR2V0X0JERl9Qcm9wZXJ0eShmYWNlLCAiUkVMQVRJVkVfU0VUV0lEVEgiLCAmcHJvcCkgPT0gMCAmJgoJICAgIChwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUiB8fAoJICAgICBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwpKQoJewoJICAgIEZUX0ludDMyCXZhbHVlOwoJICAgIAoJICAgIGlmIChwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUikKCQl2YWx1ZSA9IHByb3AudS5pbnRlZ2VyOwoJICAgIGVsc2UKCQl2YWx1ZSA9IChGVF9JbnQzMikgcHJvcC51LmNhcmRpbmFsOwoJICAgIHN3aXRjaCAoKHZhbHVlICsgNSkgLyAxMCkgewoJICAgIGNhc2UgMTogd2lkdGggPSBGQ19XSURUSF9VTFRSQUNPTkRFTlNFRDsgYnJlYWs7CgkgICAgY2FzZSAyOiB3aWR0aCA9IEZDX1dJRFRIX0VYVFJBQ09OREVOU0VEOyBicmVhazsKCSAgICBjYXNlIDM6IHdpZHRoID0gRkNfV0lEVEhfQ09OREVOU0VEOyBicmVhazsKCSAgICBjYXNlIDQ6IHdpZHRoID0gRkNfV0lEVEhfU0VNSUNPTkRFTlNFRDsgYnJlYWs7CgkgICAgY2FzZSA1OiB3aWR0aCA9IEZDX1dJRFRIX05PUk1BTDsgYnJlYWs7CgkgICAgY2FzZSA2OiB3aWR0aCA9IEZDX1dJRFRIX1NFTUlFWFBBTkRFRDsgYnJlYWs7CgkgICAgY2FzZSA3OiB3aWR0aCA9IEZDX1dJRFRIX0VYUEFOREVEOyBicmVhazsKCSAgICBjYXNlIDg6IHdpZHRoID0gRkNfV0lEVEhfRVhUUkFFWFBBTkRFRDsgYnJlYWs7CgkgICAgY2FzZSA5OiB3aWR0aCA9IEZDX1dJRFRIX1VMVFJBRVhQQU5ERUQ7IGJyZWFrOwoJICAgIH0KCX0KCWlmICh3aWR0aCA9PSAtMSAmJgoJICAgIE1ZX0dldF9CREZfUHJvcGVydHkgKGZhY2UsICJTRVRXSURUSF9OQU1FIiwgJnByb3ApID09IDAgJiYKCSAgICBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQVRPTSkKCXsKCSAgICB3aWR0aCA9IEZjSXNXaWR0aCAocHJvcC51LmF0b20pOwoJICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX1NDQU5WKQoJCXByaW50ZiAoIlx0c2V0d2lkdGggJXMgbWFwcyB0byAlZFxuIiwgcHJvcC51LmF0b20sIHdpZHRoKTsKCX0KICAgIH0KI2VuZGlmCgogICAgLyoKICAgICAqIExvb2sgZm9yIHdlaWdodCwgd2lkdGggYW5kIHNsYW50IG5hbWVzIGluIHRoZSBzdHlsZSB2YWx1ZQogICAgICovCiAgICBmb3IgKHN0ID0gMDsgRmNQYXR0ZXJuR2V0U3RyaW5nIChwYXQsIEZDX1NUWUxFLCBzdCwgJnN0eWxlKSA9PSBGY1Jlc3VsdE1hdGNoOyBzdCsrKQogICAgewoJaWYgKHdlaWdodCA9PSAtMSkKCXsKCSAgICB3ZWlnaHQgPSBGY0NvbnRhaW5zV2VpZ2h0IChzdHlsZSk7CgkgICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19TQ0FOVikKCQlwcmludGYgKCJcdFN0eWxlICVzIG1hcHMgdG8gd2VpZ2h0ICVkXG4iLCBzdHlsZSwgd2VpZ2h0KTsKCX0KCWlmICh3aWR0aCA9PSAtMSkKCXsKCSAgICB3aWR0aCA9IEZjQ29udGFpbnNXaWR0aCAoc3R5bGUpOwoJICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfU0NBTlYpCgkJcHJpbnRmICgiXHRTdHlsZSAlcyBtYXBzIHRvIHdpZHRoICVkXG4iLCBzdHlsZSwgd2lkdGgpOwoJfQoJaWYgKHNsYW50ID09IC0xKQoJewoJICAgIHNsYW50ID0gRmNDb250YWluc1NsYW50IChzdHlsZSk7CgkgICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19TQ0FOVikKCQlwcmludGYgKCJcdFN0eWxlICVzIG1hcHMgdG8gc2xhbnQgJWRcbiIsIHN0eWxlLCBzbGFudCk7Cgl9CiAgICB9CiAgICAvKgogICAgICogUHVsbCBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBGcmVlVHlwZSBmbGFncyBpZiBtb3JlCiAgICAgKiBzcGVjaWZpYyB2YWx1ZXMgbm90IGZvdW5kIGFib3ZlCiAgICAgKi8KICAgIGlmIChzbGFudCA9PSAtMSkKICAgIHsKCXNsYW50ID0gRkNfU0xBTlRfUk9NQU47CglpZiAoZmFjZS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0lUQUxJQykKCSAgICBzbGFudCA9IEZDX1NMQU5UX0lUQUxJQzsKICAgIH0KCiAgICBpZiAod2VpZ2h0ID09IC0xKQogICAgewoJd2VpZ2h0ID0gRkNfV0VJR0hUX01FRElVTTsKCWlmIChmYWNlLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfQk9MRCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfQk9MRDsKICAgIH0KCiAgICBpZiAod2lkdGggPT0gLTEpCgl3aWR0aCA9IEZDX1dJRFRIX05PUk1BTDsKCiAgICBpZiAoZm91bmRyeSA9PSAwKQoJZm91bmRyeSA9ICJ1bmtub3duIjsKCiAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfU0xBTlQsIHNsYW50KSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX1dFSUdIVCwgd2VpZ2h0KSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX1dJRFRILCB3aWR0aCkpCglnb3RvIGJhaWwxOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX0ZPVU5EUlksIGZvdW5kcnkpKQoJZ290byBiYWlsMTsKCiAgICAvKgogICAgICogQ29tcHV0ZSB0aGUgdW5pY29kZSBjb3ZlcmFnZSBmb3IgdGhlIGZvbnQKICAgICAqLwogICAgY3MgPSBGY0ZyZWVUeXBlQ2hhclNldEFuZFNwYWNpbmcgKGZhY2UsIGJsYW5rcywgJnNwYWNpbmcpOwogICAgaWYgKCFjcykKCWdvdG8gYmFpbDE7CgojaWYgSEFWRV9GVF9HRVRfQkRGX1BST1BFUlRZCiAgICAvKiBGb3IgUENGIGZvbnRzLCBvdmVycmlkZSB0aGUgY29tcHV0ZWQgc3BhY2luZyB3aXRoIHRoZSBvbmUgZnJvbQogICAgICAgdGhlIHByb3BlcnR5ICovCiAgICBpZihNWV9HZXRfQkRGX1Byb3BlcnR5KGZhY2UsICJTUEFDSU5HIiwgJnByb3ApID09IDAgJiYKICAgICAgIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9BVE9NKSB7CiAgICAgICAgaWYoIXN0cmNtcChwcm9wLnUuYXRvbSwgImMiKSB8fCAhc3RyY21wKHByb3AudS5hdG9tLCAiQyIpKQogICAgICAgICAgICBzcGFjaW5nID0gRkNfQ0hBUkNFTEw7CiAgICAgICAgZWxzZSBpZighc3RyY21wKHByb3AudS5hdG9tLCAibSIpIHx8ICFzdHJjbXAocHJvcC51LmF0b20sICJNIikpCiAgICAgICAgICAgIHNwYWNpbmcgPSBGQ19NT05POwogICAgICAgIGVsc2UgaWYoIXN0cmNtcChwcm9wLnUuYXRvbSwgInAiKSB8fCAhc3RyY21wKHByb3AudS5hdG9tLCAiUCIpKQogICAgICAgICAgICBzcGFjaW5nID0gRkNfUFJPUE9SVElPTkFMOwogICAgfQojZW5kaWYKCiAgICAvKgogICAgICogU2tpcCBvdmVyIFBDRiBmb250cyB0aGF0IGhhdmUgbm8gZW5jb2RlZCBjaGFyYWN0ZXJzOyB0aGV5J3JlCiAgICAgKiB1c3VhbGx5IGp1c3QgVW5pY29kZSBmb250cyB0cmFuc2NvZGVkIHRvIHNvbWUgbGVnYWN5IGVuY29kaW5nCiAgICAgKi8KICAgIGlmIChGY0NoYXJTZXRDb3VudCAoY3MpID09IDApCiAgICB7CglpZiAoIXN0cmNtcChGVF9NT0RVTEVfQ0xBU1MoJmZhY2UtPmRyaXZlci0+cm9vdCktPm1vZHVsZV9uYW1lLCAicGNmIikpCgkgICAgZ290byBiYWlsMjsKICAgIH0KCiAgICBpZiAoIUZjUGF0dGVybkFkZENoYXJTZXQgKHBhdCwgRkNfQ0hBUlNFVCwgY3MpKQoJZ290byBiYWlsMjsKCiAgICBscyA9IEZjRnJlZVR5cGVMYW5nU2V0IChjcywgZXhjbHVzaXZlTGFuZyk7CiAgICBpZiAoIWxzKQoJZ290byBiYWlsMjsKCiAgICBpZiAoIUZjUGF0dGVybkFkZExhbmdTZXQgKHBhdCwgRkNfTEFORywgbHMpKQogICAgewoJRmNMYW5nU2V0RGVzdHJveSAobHMpOwoJZ290byBiYWlsMjsKICAgIH0KCiAgICBGY0xhbmdTZXREZXN0cm95IChscyk7CgogICAgaWYgKHNwYWNpbmcgIT0gRkNfUFJPUE9SVElPTkFMKQoJaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX1NQQUNJTkcsIHNwYWNpbmcpKQoJICAgIGdvdG8gYmFpbDI7CgogICAgaWYgKCEoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkpCiAgICB7Cglmb3IgKGkgPSAwOyBpIDwgZmFjZS0+bnVtX2ZpeGVkX3NpemVzOyBpKyspCgkgICAgaWYgKCFGY1BhdHRlcm5BZGREb3VibGUgKHBhdCwgRkNfUElYRUxfU0laRSwKCQkJCSAgICAgRmNHZXRQaXhlbFNpemUgKGZhY2UsIGkpKSkKCQlnb3RvIGJhaWwxOwoJaWYgKCFGY1BhdHRlcm5BZGRCb29sIChwYXQsIEZDX0FOVElBTElBUywgRmNGYWxzZSkpCgkgICAgZ290byBiYWlsMTsKI2lmIEhBVkVfRlRfR0VUX0JERl9QUk9QRVJUWQogICAgICAgIGlmKGZhY2UtPm51bV9maXhlZF9zaXplcyA9PSAxKSB7CiAgICAgICAgICAgIGludCByYzsKICAgICAgICAgICAgaW50IHZhbHVlOwogICAgICAgICAgICBCREZfUHJvcGVydHlSZWMgcHJvcDsKCiAgICAgICAgICAgIHJjID0gTVlfR2V0X0JERl9Qcm9wZXJ0eShmYWNlLCAiUE9JTlRfU0laRSIsICZwcm9wKTsKICAgICAgICAgICAgaWYocmMgPT0gMCAmJiBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUikKICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcC51LmludGVnZXI7CiAgICAgICAgICAgIGVsc2UgaWYocmMgPT0gMCAmJiBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwpCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3AudS5jYXJkaW5hbDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBuZXZlcm1pbmQ7CiAgICAgICAgICAgIGlmKCFGY1BhdHRlcm5BZGREb3VibGUocGF0LCBGQ19TSVpFLCB2YWx1ZSAvIDEwLjApKQogICAgICAgICAgICAgICAgZ290byBuZXZlcm1pbmQ7CgogICAgICAgICAgICByYyA9IE1ZX0dldF9CREZfUHJvcGVydHkoZmFjZSwgIlJFU09MVVRJT05fWSIsICZwcm9wKTsKICAgICAgICAgICAgaWYocmMgPT0gMCAmJiBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUikKICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcC51LmludGVnZXI7CiAgICAgICAgICAgIGVsc2UgaWYocmMgPT0gMCAmJiBwcm9wLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwpCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3AudS5jYXJkaW5hbDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBuZXZlcm1pbmQ7CiAgICAgICAgICAgIGlmKCFGY1BhdHRlcm5BZGREb3VibGUocGF0LCBGQ19EUEksIChkb3VibGUpdmFsdWUpKQogICAgICAgICAgICAgICAgZ290byBuZXZlcm1pbmQ7CgogICAgICAgIH0KICAgIG5ldmVybWluZDoKICAgICAgICA7CiNlbmRpZgogICAgfQojaWYgSEFWRV9GVF9HRVRfWDExX0ZPTlRfRk9STUFUCiAgICAvKgogICAgICogVXNlIHRoZSAobm90IHdlbGwgZG9jdW1lbnRlZCBvciBzdXBwb3J0ZWQpIFgtc3BlY2lmaWMgZnVuY3Rpb24KICAgICAqIGZyb20gRnJlZVR5cGUgdG8gZmlndXJlIG91dCB0aGUgZm9udCBmb3JtYXQKICAgICAqLwogICAgewoJY29uc3QgY2hhciAqZm9udF9mb3JtYXQgPSBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0IChmYWNlKTsKCWlmIChmb250X2Zvcm1hdCkKCSAgICBGY1BhdHRlcm5BZGRTdHJpbmcgKHBhdCwgRkNfRk9OVEZPUk1BVCwgZm9udF9mb3JtYXQpOwogICAgfQojZW5kaWYKCiAgICAvKgogICAgICogRHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBjaGFyc2V0CiAgICAgKi8KICAgIEZjQ2hhclNldERlc3Ryb3kgKGNzKTsKICAgIAogICAgLyoKICAgICAqIERlYWxsb2NhdGUgZmFtaWx5L3N0eWxlIHZhbHVlcwogICAgICovCiAgICAKICAgIEZUX0RvbmVfRmFjZSAoZmFjZSk7CiAgICBGVF9Eb25lX0ZyZWVUeXBlIChmdExpYnJhcnkpOwogICAgcmV0dXJuIHBhdDsKCmJhaWwyOgogICAgRmNDaGFyU2V0RGVzdHJveSAoY3MpOwpiYWlsMToKICAgIEZjUGF0dGVybkRlc3Ryb3kgKHBhdCk7CmJhaWwwOgogICAgRlRfRG9uZV9GYWNlIChmYWNlKTsKYmFpbDoKICAgIEZUX0RvbmVfRnJlZVR5cGUgKGZ0TGlicmFyeSk7CiAgICByZXR1cm4gMDsKfQoKCi8qCiAqIEZvciBvdXIgcHVycG9zZXMsIHRoaXMgYXBwcm94aW1hdGlvbiBpcyBzdWZmaWNpZW50CiAqLwojaWYgIUhBVkVfRlRfR0VUX05FWFRfQ0hBUgojZGVmaW5lIEZUX0dldF9OZXh0X0NoYXIoZmFjZSwgdWNzNCwgZ2kpICgodWNzNCkgPj0gMHhmZmZmZmYgPyBcCgkJCQkJICAoKihnaSkgPSAwKSwgMCA6IFwKCQkJCQkgICgqKGdpKSA9IDEpLCAodWNzNCkgKyAxKQojd2FybmluZyAiTm8gRlRfR2V0X05leHRfQ2hhcjogUGxlYXNlIGluc3RhbGwgZnJlZXR5cGUgdmVyc2lvbiAyLjEuMCBvciBuZXdlciIKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyRW50IHsKICAgIEZjQ2hhcjE2CSAgICBibXA7CiAgICB1bnNpZ25lZCBjaGFyICAgZW5jb2RlOwp9IEZjQ2hhckVudDsKCnN0cnVjdCBfRmNDaGFyTWFwIHsKICAgIGNvbnN0IEZjQ2hhckVudCAqZW50OwogICAgaW50CQkgICAgbmVudDsKfTsKCnR5cGVkZWYgc3RydWN0IF9GY0ZvbnREZWNvZGUgewogICAgRlRfRW5jb2RpbmcJICAgIGVuY29kaW5nOwogICAgY29uc3QgRmNDaGFyTWFwICptYXA7CiAgICBGY0NoYXIzMgkgICAgbWF4Owp9IEZjRm9udERlY29kZTsKCnN0YXRpYyBjb25zdCBGY0NoYXJFbnQgQXBwbGVSb21hbkVudFtdID0gewogICAgeyAweDAwMjAsIDB4MjAgfSwgLyogU1BBQ0UgKi8KICAgIHsgMHgwMDIxLCAweDIxIH0sIC8qIEVYQ0xBTUFUSU9OIE1BUksgKi8KICAgIHsgMHgwMDIyLCAweDIyIH0sIC8qIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MDAyMywgMHgyMyB9LCAvKiBOVU1CRVIgU0lHTiAqLwogICAgeyAweDAwMjQsIDB4MjQgfSwgLyogRE9MTEFSIFNJR04gKi8KICAgIHsgMHgwMDI1LCAweDI1IH0sIC8qIFBFUkNFTlQgU0lHTiAqLwogICAgeyAweDAwMjYsIDB4MjYgfSwgLyogQU1QRVJTQU5EICovCiAgICB7IDB4MDAyNywgMHgyNyB9LCAvKiBBUE9TVFJPUEhFICovCiAgICB7IDB4MDAyOCwgMHgyOCB9LCAvKiBMRUZUIFBBUkVOVEhFU0lTICovCiAgICB7IDB4MDAyOSwgMHgyOSB9LCAvKiBSSUdIVCBQQVJFTlRIRVNJUyAqLwogICAgeyAweDAwMkEsIDB4MkEgfSwgLyogQVNURVJJU0sgKi8KICAgIHsgMHgwMDJCLCAweDJCIH0sIC8qIFBMVVMgU0lHTiAqLwogICAgeyAweDAwMkMsIDB4MkMgfSwgLyogQ09NTUEgKi8KICAgIHsgMHgwMDJELCAweDJEIH0sIC8qIEhZUEhFTi1NSU5VUyAqLwogICAgeyAweDAwMkUsIDB4MkUgfSwgLyogRlVMTCBTVE9QICovCiAgICB7IDB4MDAyRiwgMHgyRiB9LCAvKiBTT0xJRFVTICovCiAgICB7IDB4MDAzMCwgMHgzMCB9LCAvKiBESUdJVCBaRVJPICovCiAgICB7IDB4MDAzMSwgMHgzMSB9LCAvKiBESUdJVCBPTkUgKi8KICAgIHsgMHgwMDMyLCAweDMyIH0sIC8qIERJR0lUIFRXTyAqLwogICAgeyAweDAwMzMsIDB4MzMgfSwgLyogRElHSVQgVEhSRUUgKi8KICAgIHsgMHgwMDM0LCAweDM0IH0sIC8qIERJR0lUIEZPVVIgKi8KICAgIHsgMHgwMDM1LCAweDM1IH0sIC8qIERJR0lUIEZJVkUgKi8KICAgIHsgMHgwMDM2LCAweDM2IH0sIC8qIERJR0lUIFNJWCAqLwogICAgeyAweDAwMzcsIDB4MzcgfSwgLyogRElHSVQgU0VWRU4gKi8KICAgIHsgMHgwMDM4LCAweDM4IH0sIC8qIERJR0lUIEVJR0hUICovCiAgICB7IDB4MDAzOSwgMHgzOSB9LCAvKiBESUdJVCBOSU5FICovCiAgICB7IDB4MDAzQSwgMHgzQSB9LCAvKiBDT0xPTiAqLwogICAgeyAweDAwM0IsIDB4M0IgfSwgLyogU0VNSUNPTE9OICovCiAgICB7IDB4MDAzQywgMHgzQyB9LCAvKiBMRVNTLVRIQU4gU0lHTiAqLwogICAgeyAweDAwM0QsIDB4M0QgfSwgLyogRVFVQUxTIFNJR04gKi8KICAgIHsgMHgwMDNFLCAweDNFIH0sIC8qIEdSRUFURVItVEhBTiBTSUdOICovCiAgICB7IDB4MDAzRiwgMHgzRiB9LCAvKiBRVUVTVElPTiBNQVJLICovCiAgICB7IDB4MDA0MCwgMHg0MCB9LCAvKiBDT01NRVJDSUFMIEFUICovCiAgICB7IDB4MDA0MSwgMHg0MSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBICovCiAgICB7IDB4MDA0MiwgMHg0MiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCICovCiAgICB7IDB4MDA0MywgMHg0MyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDICovCiAgICB7IDB4MDA0NCwgMHg0NCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEICovCiAgICB7IDB4MDA0NSwgMHg0NSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFICovCiAgICB7IDB4MDA0NiwgMHg0NiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGICovCiAgICB7IDB4MDA0NywgMHg0NyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHICovCiAgICB7IDB4MDA0OCwgMHg0OCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBIICovCiAgICB7IDB4MDA0OSwgMHg0OSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJICovCiAgICB7IDB4MDA0QSwgMHg0QSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKICovCiAgICB7IDB4MDA0QiwgMHg0QiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLICovCiAgICB7IDB4MDA0QywgMHg0QyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMICovCiAgICB7IDB4MDA0RCwgMHg0RCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNICovCiAgICB7IDB4MDA0RSwgMHg0RSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOICovCiAgICB7IDB4MDA0RiwgMHg0RiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPICovCiAgICB7IDB4MDA1MCwgMHg1MCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQICovCiAgICB7IDB4MDA1MSwgMHg1MSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRICovCiAgICB7IDB4MDA1MiwgMHg1MiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSICovCiAgICB7IDB4MDA1MywgMHg1MyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTICovCiAgICB7IDB4MDA1NCwgMHg1NCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUICovCiAgICB7IDB4MDA1NSwgMHg1NSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVICovCiAgICB7IDB4MDA1NiwgMHg1NiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWICovCiAgICB7IDB4MDA1NywgMHg1NyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXICovCiAgICB7IDB4MDA1OCwgMHg1OCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYICovCiAgICB7IDB4MDA1OSwgMHg1OSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZICovCiAgICB7IDB4MDA1QSwgMHg1QSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaICovCiAgICB7IDB4MDA1QiwgMHg1QiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUICovCiAgICB7IDB4MDA1QywgMHg1QyB9LCAvKiBSRVZFUlNFIFNPTElEVVMgKi8KICAgIHsgMHgwMDVELCAweDVEIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUICovCiAgICB7IDB4MDA1RSwgMHg1RSB9LCAvKiBDSVJDVU1GTEVYIEFDQ0VOVCAqLwogICAgeyAweDAwNUYsIDB4NUYgfSwgLyogTE9XIExJTkUgKi8KICAgIHsgMHgwMDYwLCAweDYwIH0sIC8qIEdSQVZFIEFDQ0VOVCAqLwogICAgeyAweDAwNjEsIDB4NjEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgKi8KICAgIHsgMHgwMDYyLCAweDYyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBCICovCiAgICB7IDB4MDA2MywgMHg2MyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQyAqLwogICAgeyAweDAwNjQsIDB4NjQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEQgKi8KICAgIHsgMHgwMDY1LCAweDY1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFICovCiAgICB7IDB4MDA2NiwgMHg2NiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiAqLwogICAgeyAweDAwNjcsIDB4NjcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEcgKi8KICAgIHsgMHgwMDY4LCAweDY4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBIICovCiAgICB7IDB4MDA2OSwgMHg2OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSAqLwogICAgeyAweDAwNkEsIDB4NkEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEogKi8KICAgIHsgMHgwMDZCLCAweDZCIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBLICovCiAgICB7IDB4MDA2QywgMHg2QyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTCAqLwogICAgeyAweDAwNkQsIDB4NkQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE0gKi8KICAgIHsgMHgwMDZFLCAweDZFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBOICovCiAgICB7IDB4MDA2RiwgMHg2RiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyAqLwogICAgeyAweDAwNzAsIDB4NzAgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFAgKi8KICAgIHsgMHgwMDcxLCAweDcxIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBRICovCiAgICB7IDB4MDA3MiwgMHg3MiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUiAqLwogICAgeyAweDAwNzMsIDB4NzMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFMgKi8KICAgIHsgMHgwMDc0LCAweDc0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBUICovCiAgICB7IDB4MDA3NSwgMHg3NSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSAqLwogICAgeyAweDAwNzYsIDB4NzYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFYgKi8KICAgIHsgMHgwMDc3LCAweDc3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBXICovCiAgICB7IDB4MDA3OCwgMHg3OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWCAqLwogICAgeyAweDAwNzksIDB4NzkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFkgKi8KICAgIHsgMHgwMDdBLCAweDdBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBaICovCiAgICB7IDB4MDA3QiwgMHg3QiB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgKi8KICAgIHsgMHgwMDdDLCAweDdDIH0sIC8qIFZFUlRJQ0FMIExJTkUgKi8KICAgIHsgMHgwMDdELCAweDdEIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgKi8KICAgIHsgMHgwMDdFLCAweDdFIH0sIC8qIFRJTERFICovCiAgICB7IDB4MDBBMCwgMHhDQSB9LCAvKiBOTy1CUkVBSyBTUEFDRSAqLwogICAgeyAweDAwQTEsIDB4QzEgfSwgLyogSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSyAqLwogICAgeyAweDAwQTIsIDB4QTIgfSwgLyogQ0VOVCBTSUdOICovCiAgICB7IDB4MDBBMywgMHhBMyB9LCAvKiBQT1VORCBTSUdOICovCiAgICB7IDB4MDBBNSwgMHhCNCB9LCAvKiBZRU4gU0lHTiAqLwogICAgeyAweDAwQTcsIDB4QTQgfSwgLyogU0VDVElPTiBTSUdOICovCiAgICB7IDB4MDBBOCwgMHhBQyB9LCAvKiBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEE5LCAweEE5IH0sIC8qIENPUFlSSUdIVCBTSUdOICovCiAgICB7IDB4MDBBQSwgMHhCQiB9LCAvKiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUiAqLwogICAgeyAweDAwQUIsIDB4QzcgfSwgLyogTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgwMEFDLCAweEMyIH0sIC8qIE5PVCBTSUdOICovCiAgICB7IDB4MDBBRSwgMHhBOCB9LCAvKiBSRUdJU1RFUkVEIFNJR04gKi8KICAgIHsgMHgwMEFGLCAweEY4IH0sIC8qIE1BQ1JPTiAqLwogICAgeyAweDAwQjAsIDB4QTEgfSwgLyogREVHUkVFIFNJR04gKi8KICAgIHsgMHgwMEIxLCAweEIxIH0sIC8qIFBMVVMtTUlOVVMgU0lHTiAqLwogICAgeyAweDAwQjQsIDB4QUIgfSwgLyogQUNVVEUgQUNDRU5UICovCiAgICB7IDB4MDBCNSwgMHhCNSB9LCAvKiBNSUNSTyBTSUdOICovCiAgICB7IDB4MDBCNiwgMHhBNiB9LCAvKiBQSUxDUk9XIFNJR04gKi8KICAgIHsgMHgwMEI3LCAweEUxIH0sIC8qIE1JRERMRSBET1QgKi8KICAgIHsgMHgwMEI4LCAweEZDIH0sIC8qIENFRElMTEEgKi8KICAgIHsgMHgwMEJBLCAweEJDIH0sIC8qIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUiAqLwogICAgeyAweDAwQkIsIDB4QzggfSwgLyogUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MDBCRiwgMHhDMCB9LCAvKiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLICovCiAgICB7IDB4MDBDMCwgMHhDQiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEMxLCAweEU3IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwQzIsIDB4RTUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEMzLCAweENDIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERSAqLwogICAgeyAweDAwQzQsIDB4ODAgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwQzUsIDB4ODEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KICAgIHsgMHgwMEM2LCAweEFFIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEFFICovCiAgICB7IDB4MDBDNywgMHg4MiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLwogICAgeyAweDAwQzgsIDB4RTkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBDOSwgMHg4MyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMENBLCAweEU2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBDQiwgMHhFOCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBDQywgMHhFRCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMENELCAweEVBIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwQ0UsIDB4RUIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMENGLCAweEVDIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEQxLCAweDg0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRDIsIDB4RjEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBEMywgMHhFRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEQ0LCAweEVGIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBENSwgMHhDRCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEQ2LCAweDg1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEQ4LCAweEFGIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KICAgIHsgMHgwMEQ5LCAweEY0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwREEsIDB4RjIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBEQiwgMHhGMyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwREMsIDB4ODYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwREYsIDB4QTcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKi8KICAgIHsgMHgwMEUwLCAweDg4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEUxLCAweDg3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEUyLCAweDg5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRTMsIDB4OEIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERSAqLwogICAgeyAweDAwRTQsIDB4OEEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEU1LCAweDhDIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLwogICAgeyAweDAwRTYsIDB4QkUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEFFICovCiAgICB7IDB4MDBFNywgMHg4RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi8KICAgIHsgMHgwMEU4LCAweDhGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEU5LCAweDhFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEVBLCAweDkwIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRUIsIDB4OTEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEVDLCAweDkzIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEVELCAweDkyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEVFLCAweDk0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRUYsIDB4OTUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEYxLCAweDk2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEYyLCAweDk4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEYzLCAweDk3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEY0LCAweDk5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRjUsIDB4OUIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRjYsIDB4OUEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEY3LCAweEQ2IH0sIC8qIERJVklTSU9OIFNJR04gKi8KICAgIHsgMHgwMEY4LCAweEJGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFICovCiAgICB7IDB4MDBGOSwgMHg5RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBGQSwgMHg5QyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBGQiwgMHg5RSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEZDLCAweDlGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBGRiwgMHhEOCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAxMzEsIDB4RjUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSSAqLwogICAgeyAweDAxNTIsIDB4Q0UgfSwgLyogTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRSAqLwogICAgeyAweDAxNTMsIDB4Q0YgfSwgLyogTEFUSU4gU01BTEwgTElHQVRVUkUgT0UgKi8KICAgIHsgMHgwMTc4LCAweEQ5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMTkyLCAweEM0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSyAqLwogICAgeyAweDAyQzYsIDB4RjYgfSwgLyogTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UICovCiAgICB7IDB4MDJDNywgMHhGRiB9LCAvKiBDQVJPTiAqLwogICAgeyAweDAyRDgsIDB4RjkgfSwgLyogQlJFVkUgKi8KICAgIHsgMHgwMkQ5LCAweEZBIH0sIC8qIERPVCBBQk9WRSAqLwogICAgeyAweDAyREEsIDB4RkIgfSwgLyogUklORyBBQk9WRSAqLwogICAgeyAweDAyREIsIDB4RkUgfSwgLyogT0dPTkVLICovCiAgICB7IDB4MDJEQywgMHhGNyB9LCAvKiBTTUFMTCBUSUxERSAqLwogICAgeyAweDAyREQsIDB4RkQgfSwgLyogRE9VQkxFIEFDVVRFIEFDQ0VOVCAqLwogICAgeyAweDAzQTksIDB4QkQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgKi8KICAgIHsgMHgwM0MwLCAweEI5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQSSAqLwogICAgeyAweDIwMTMsIDB4RDAgfSwgLyogRU4gREFTSCAqLwogICAgeyAweDIwMTQsIDB4RDEgfSwgLyogRU0gREFTSCAqLwogICAgeyAweDIwMTgsIDB4RDQgfSwgLyogTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDE5LCAweEQ1IH0sIC8qIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMUEsIDB4RTIgfSwgLyogU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxQywgMHhEMiB9LCAvKiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMUQsIDB4RDMgfSwgLyogUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxRSwgMHhFMyB9LCAvKiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDIwLCAweEEwIH0sIC8qIERBR0dFUiAqLwogICAgeyAweDIwMjEsIDB4RTAgfSwgLyogRE9VQkxFIERBR0dFUiAqLwogICAgeyAweDIwMjIsIDB4QTUgfSwgLyogQlVMTEVUICovCiAgICB7IDB4MjAyNiwgMHhDOSB9LCAvKiBIT1JJWk9OVEFMIEVMTElQU0lTICovCiAgICB7IDB4MjAzMCwgMHhFNCB9LCAvKiBQRVIgTUlMTEUgU0lHTiAqLwogICAgeyAweDIwMzksIDB4REMgfSwgLyogU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDNBLCAweEREIH0sIC8qIFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwNDQsIDB4REEgfSwgLyogRlJBQ1RJT04gU0xBU0ggKi8KICAgIHsgMHgyMEFDLCAweERCIH0sIC8qIEVVUk8gU0lHTiAqLwogICAgeyAweDIxMjIsIDB4QUEgfSwgLyogVFJBREUgTUFSSyBTSUdOICovCiAgICB7IDB4MjIwMiwgMHhCNiB9LCAvKiBQQVJUSUFMIERJRkZFUkVOVElBTCAqLwogICAgeyAweDIyMDYsIDB4QzYgfSwgLyogSU5DUkVNRU5UICovCiAgICB7IDB4MjIwRiwgMHhCOCB9LCAvKiBOLUFSWSBQUk9EVUNUICovCiAgICB7IDB4MjIxMSwgMHhCNyB9LCAvKiBOLUFSWSBTVU1NQVRJT04gKi8KICAgIHsgMHgyMjFBLCAweEMzIH0sIC8qIFNRVUFSRSBST09UICovCiAgICB7IDB4MjIxRSwgMHhCMCB9LCAvKiBJTkZJTklUWSAqLwogICAgeyAweDIyMkIsIDB4QkEgfSwgLyogSU5URUdSQUwgKi8KICAgIHsgMHgyMjQ4LCAweEM1IH0sIC8qIEFMTU9TVCBFUVVBTCBUTyAqLwogICAgeyAweDIyNjAsIDB4QUQgfSwgLyogTk9UIEVRVUFMIFRPICovCiAgICB7IDB4MjI2NCwgMHhCMiB9LCAvKiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8gKi8KICAgIHsgMHgyMjY1LCAweEIzIH0sIC8qIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTyAqLwogICAgeyAweDI1Q0EsIDB4RDcgfSwgLyogTE9aRU5HRSAqLwogICAgeyAweEY4RkYsIDB4RjAgfSwgLyogQXBwbGUgbG9nbyAqLwogICAgeyAweEZCMDEsIDB4REUgfSwgLyogTEFUSU4gU01BTEwgTElHQVRVUkUgRkkgKi8KICAgIHsgMHhGQjAyLCAweERGIH0sIC8qIExBVElOIFNNQUxMIExJR0FUVVJFIEZMICovCn07CgpzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFwcGxlUm9tYW4gPSB7CiAgICBBcHBsZVJvbWFuRW50LAogICAgc2l6ZW9mIChBcHBsZVJvbWFuRW50KSAvIHNpemVvZiAoQXBwbGVSb21hbkVudFswXSkKfTsKCnN0YXRpYyBjb25zdCBGY0NoYXJFbnQgQWRvYmVTeW1ib2xFbnRbXSA9IHsKICAgIHsgMHgwMDIwLCAweDIwIH0sIC8qIFNQQUNFCSMgc3BhY2UgKi8KICAgIHsgMHgwMDIxLCAweDIxIH0sIC8qIEVYQ0xBTUFUSU9OIE1BUksJIyBleGNsYW0gKi8KICAgIHsgMHgwMDIzLCAweDIzIH0sIC8qIE5VTUJFUiBTSUdOCSMgbnVtYmVyc2lnbiAqLwogICAgeyAweDAwMjUsIDB4MjUgfSwgLyogUEVSQ0VOVCBTSUdOCSMgcGVyY2VudCAqLwogICAgeyAweDAwMjYsIDB4MjYgfSwgLyogQU1QRVJTQU5ECSMgYW1wZXJzYW5kICovCiAgICB7IDB4MDAyOCwgMHgyOCB9LCAvKiBMRUZUIFBBUkVOVEhFU0lTCSMgcGFyZW5sZWZ0ICovCiAgICB7IDB4MDAyOSwgMHgyOSB9LCAvKiBSSUdIVCBQQVJFTlRIRVNJUwkjIHBhcmVucmlnaHQgKi8KICAgIHsgMHgwMDJCLCAweDJCIH0sIC8qIFBMVVMgU0lHTgkjIHBsdXMgKi8KICAgIHsgMHgwMDJDLCAweDJDIH0sIC8qIENPTU1BCSMgY29tbWEgKi8KICAgIHsgMHgwMDJFLCAweDJFIH0sIC8qIEZVTEwgU1RPUAkjIHBlcmlvZCAqLwogICAgeyAweDAwMkYsIDB4MkYgfSwgLyogU09MSURVUwkjIHNsYXNoICovCiAgICB7IDB4MDAzMCwgMHgzMCB9LCAvKiBESUdJVCBaRVJPCSMgemVybyAqLwogICAgeyAweDAwMzEsIDB4MzEgfSwgLyogRElHSVQgT05FCSMgb25lICovCiAgICB7IDB4MDAzMiwgMHgzMiB9LCAvKiBESUdJVCBUV08JIyB0d28gKi8KICAgIHsgMHgwMDMzLCAweDMzIH0sIC8qIERJR0lUIFRIUkVFCSMgdGhyZWUgKi8KICAgIHsgMHgwMDM0LCAweDM0IH0sIC8qIERJR0lUIEZPVVIJIyBmb3VyICovCiAgICB7IDB4MDAzNSwgMHgzNSB9LCAvKiBESUdJVCBGSVZFCSMgZml2ZSAqLwogICAgeyAweDAwMzYsIDB4MzYgfSwgLyogRElHSVQgU0lYCSMgc2l4ICovCiAgICB7IDB4MDAzNywgMHgzNyB9LCAvKiBESUdJVCBTRVZFTgkjIHNldmVuICovCiAgICB7IDB4MDAzOCwgMHgzOCB9LCAvKiBESUdJVCBFSUdIVAkjIGVpZ2h0ICovCiAgICB7IDB4MDAzOSwgMHgzOSB9LCAvKiBESUdJVCBOSU5FCSMgbmluZSAqLwogICAgeyAweDAwM0EsIDB4M0EgfSwgLyogQ09MT04JIyBjb2xvbiAqLwogICAgeyAweDAwM0IsIDB4M0IgfSwgLyogU0VNSUNPTE9OCSMgc2VtaWNvbG9uICovCiAgICB7IDB4MDAzQywgMHgzQyB9LCAvKiBMRVNTLVRIQU4gU0lHTgkjIGxlc3MgKi8KICAgIHsgMHgwMDNELCAweDNEIH0sIC8qIEVRVUFMUyBTSUdOCSMgZXF1YWwgKi8KICAgIHsgMHgwMDNFLCAweDNFIH0sIC8qIEdSRUFURVItVEhBTiBTSUdOCSMgZ3JlYXRlciAqLwogICAgeyAweDAwM0YsIDB4M0YgfSwgLyogUVVFU1RJT04gTUFSSwkjIHF1ZXN0aW9uICovCiAgICB7IDB4MDA1QiwgMHg1QiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUCSMgYnJhY2tldGxlZnQgKi8KICAgIHsgMHgwMDVELCAweDVEIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUCSMgYnJhY2tldHJpZ2h0ICovCiAgICB7IDB4MDA1RiwgMHg1RiB9LCAvKiBMT1cgTElORQkjIHVuZGVyc2NvcmUgKi8KICAgIHsgMHgwMDdCLCAweDdCIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVAkjIGJyYWNlbGVmdCAqLwogICAgeyAweDAwN0MsIDB4N0MgfSwgLyogVkVSVElDQUwgTElORQkjIGJhciAqLwogICAgeyAweDAwN0QsIDB4N0QgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVAkjIGJyYWNlcmlnaHQgKi8KICAgIHsgMHgwMEEwLCAweDIwIH0sIC8qIE5PLUJSRUFLIFNQQUNFCSMgc3BhY2UgKi8KICAgIHsgMHgwMEFDLCAweEQ4IH0sIC8qIE5PVCBTSUdOCSMgbG9naWNhbG5vdCAqLwogICAgeyAweDAwQjAsIDB4QjAgfSwgLyogREVHUkVFIFNJR04JIyBkZWdyZWUgKi8KICAgIHsgMHgwMEIxLCAweEIxIH0sIC8qIFBMVVMtTUlOVVMgU0lHTgkjIHBsdXNtaW51cyAqLwogICAgeyAweDAwQjUsIDB4NkQgfSwgLyogTUlDUk8gU0lHTgkjIG11ICovCiAgICB7IDB4MDBENywgMHhCNCB9LCAvKiBNVUxUSVBMSUNBVElPTiBTSUdOCSMgbXVsdGlwbHkgKi8KICAgIHsgMHgwMEY3LCAweEI4IH0sIC8qIERJVklTSU9OIFNJR04JIyBkaXZpZGUgKi8KICAgIHsgMHgwMTkyLCAweEE2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSwkjIGZsb3JpbiAqLwogICAgeyAweDAzOTEsIDB4NDEgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEJIyBBbHBoYSAqLwogICAgeyAweDAzOTIsIDB4NDIgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQkjIEJldGEgKi8KICAgIHsgMHgwMzkzLCAweDQ3IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCSMgR2FtbWEgKi8KICAgIHsgMHgwMzk0LCAweDQ0IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCSMgRGVsdGEgKi8KICAgIHsgMHgwMzk1LCAweDQ1IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04JIyBFcHNpbG9uICovCiAgICB7IDB4MDM5NiwgMHg1QSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBCSMgWmV0YSAqLwogICAgeyAweDAzOTcsIDB4NDggfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCSMgRXRhICovCiAgICB7IDB4MDM5OCwgMHg1MSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQkjIFRoZXRhICovCiAgICB7IDB4MDM5OSwgMHg0OSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBCSMgSW90YSAqLwogICAgeyAweDAzOUEsIDB4NEIgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEJIyBLYXBwYSAqLwogICAgeyAweDAzOUIsIDB4NEMgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEJIyBMYW1iZGEgKi8KICAgIHsgMHgwMzlDLCAweDREIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCSMgTXUgKi8KICAgIHsgMHgwMzlELCAweDRFIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE5VCSMgTnUgKi8KICAgIHsgMHgwMzlFLCAweDU4IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCSMgWGkgKi8KICAgIHsgMHgwMzlGLCAweDRGIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04JIyBPbWljcm9uICovCiAgICB7IDB4MDNBMCwgMHg1MCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQkjIFBpICovCiAgICB7IDB4MDNBMSwgMHg1MiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8JIyBSaG8gKi8KICAgIHsgMHgwM0EzLCAweDUzIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCSMgU2lnbWEgKi8KICAgIHsgMHgwM0E0LCAweDU0IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFRBVQkjIFRhdSAqLwogICAgeyAweDAzQTUsIDB4NTUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTgkjIFVwc2lsb24gKi8KICAgIHsgMHgwM0E2LCAweDQ2IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQkjIFBoaSAqLwogICAgeyAweDAzQTcsIDB4NDMgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCSMgQ2hpICovCiAgICB7IDB4MDNBOCwgMHg1OSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kJIyBQc2kgKi8KICAgIHsgMHgwM0E5LCAweDU3IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCSMgT21lZ2EgKi8KICAgIHsgMHgwM0IxLCAweDYxIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQkjIGFscGhhICovCiAgICB7IDB4MDNCMiwgMHg2MiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQkjIGJldGEgKi8KICAgIHsgMHgwM0IzLCAweDY3IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQkjIGdhbW1hICovCiAgICB7IDB4MDNCNCwgMHg2NCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEJIyBkZWx0YSAqLwogICAgeyAweDAzQjUsIDB4NjUgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04JIyBlcHNpbG9uICovCiAgICB7IDB4MDNCNiwgMHg3QSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQkjIHpldGEgKi8KICAgIHsgMHgwM0I3LCAweDY4IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEJIyBldGEgKi8KICAgIHsgMHgwM0I4LCAweDcxIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQkjIHRoZXRhICovCiAgICB7IDB4MDNCOSwgMHg2OSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQkjIGlvdGEgKi8KICAgIHsgMHgwM0JBLCAweDZCIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQkjIGthcHBhICovCiAgICB7IDB4MDNCQiwgMHg2QyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEJIyBsYW1iZGEgKi8KICAgIHsgMHgwM0JDLCAweDZEIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBNVQkjIG11ICovCiAgICB7IDB4MDNCRCwgMHg2RSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgTlUJIyBudSAqLwogICAgeyAweDAzQkUsIDB4NzggfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFhJCSMgeGkgKi8KICAgIHsgMHgwM0JGLCAweDZGIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCSMgb21pY3JvbiAqLwogICAgeyAweDAzQzAsIDB4NzAgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBJCSMgcGkgKi8KICAgIHsgMHgwM0MxLCAweDcyIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBSSE8JIyByaG8gKi8KICAgIHsgMHgwM0MyLCAweDU2IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQkjIHNpZ21hMSAqLwogICAgeyAweDAzQzMsIDB4NzMgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCSMgc2lnbWEgKi8KICAgIHsgMHgwM0M0LCAweDc0IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUJIyB0YXUgKi8KICAgIHsgMHgwM0M1LCAweDc1IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCSMgdXBzaWxvbiAqLwogICAgeyAweDAzQzYsIDB4NjYgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBISQkjIHBoaSAqLwogICAgeyAweDAzQzcsIDB4NjMgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIENISQkjIGNoaSAqLwogICAgeyAweDAzQzgsIDB4NzkgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBTSQkjIHBzaSAqLwogICAgeyAweDAzQzksIDB4NzcgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBCSMgb21lZ2EgKi8KICAgIHsgMHgwM0QxLCAweDRBIH0sIC8qIEdSRUVLIFRIRVRBIFNZTUJPTAkjIHRoZXRhMSAqLwogICAgeyAweDAzRDIsIDB4QTEgfSwgLyogR1JFRUsgVVBTSUxPTiBXSVRIIEhPT0sgU1lNQk9MCSMgVXBzaWxvbjEgKi8KICAgIHsgMHgwM0Q1LCAweDZBIH0sIC8qIEdSRUVLIFBISSBTWU1CT0wJIyBwaGkxICovCiAgICB7IDB4MDNENiwgMHg3NiB9LCAvKiBHUkVFSyBQSSBTWU1CT0wJIyBvbWVnYTEgKi8KICAgIHsgMHgyMDIyLCAweEI3IH0sIC8qIEJVTExFVAkjIGJ1bGxldCAqLwogICAgeyAweDIwMjYsIDB4QkMgfSwgLyogSE9SSVpPTlRBTCBFTExJUFNJUwkjIGVsbGlwc2lzICovCiAgICB7IDB4MjAzMiwgMHhBMiB9LCAvKiBQUklNRQkjIG1pbnV0ZSAqLwogICAgeyAweDIwMzMsIDB4QjIgfSwgLyogRE9VQkxFIFBSSU1FCSMgc2Vjb25kICovCiAgICB7IDB4MjA0NCwgMHhBNCB9LCAvKiBGUkFDVElPTiBTTEFTSAkjIGZyYWN0aW9uICovCiAgICB7IDB4MjBBQywgMHhBMCB9LCAvKiBFVVJPIFNJR04JIyBFdXJvICovCiAgICB7IDB4MjExMSwgMHhDMSB9LCAvKiBCTEFDSy1MRVRURVIgQ0FQSVRBTCBJCSMgSWZyYWt0dXIgKi8KICAgIHsgMHgyMTE4LCAweEMzIH0sIC8qIFNDUklQVCBDQVBJVEFMIFAJIyB3ZWllcnN0cmFzcyAqLwogICAgeyAweDIxMUMsIDB4QzIgfSwgLyogQkxBQ0stTEVUVEVSIENBUElUQUwgUgkjIFJmcmFrdHVyICovCiAgICB7IDB4MjEyNiwgMHg1NyB9LCAvKiBPSE0gU0lHTgkjIE9tZWdhICovCiAgICB7IDB4MjEzNSwgMHhDMCB9LCAvKiBBTEVGIFNZTUJPTAkjIGFsZXBoICovCiAgICB7IDB4MjE5MCwgMHhBQyB9LCAvKiBMRUZUV0FSRFMgQVJST1cJIyBhcnJvd2xlZnQgKi8KICAgIHsgMHgyMTkxLCAweEFEIH0sIC8qIFVQV0FSRFMgQVJST1cJIyBhcnJvd3VwICovCiAgICB7IDB4MjE5MiwgMHhBRSB9LCAvKiBSSUdIVFdBUkRTIEFSUk9XCSMgYXJyb3dyaWdodCAqLwogICAgeyAweDIxOTMsIDB4QUYgfSwgLyogRE9XTldBUkRTIEFSUk9XCSMgYXJyb3dkb3duICovCiAgICB7IDB4MjE5NCwgMHhBQiB9LCAvKiBMRUZUIFJJR0hUIEFSUk9XCSMgYXJyb3dib3RoICovCiAgICB7IDB4MjFCNSwgMHhCRiB9LCAvKiBET1dOV0FSRFMgQVJST1cgV0lUSCBDT1JORVIgTEVGVFdBUkRTCSMgY2FycmlhZ2VyZXR1cm4gKi8KICAgIHsgMHgyMUQwLCAweERDIH0sIC8qIExFRlRXQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibGxlZnQgKi8KICAgIHsgMHgyMUQxLCAweEREIH0sIC8qIFVQV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmx1cCAqLwogICAgeyAweDIxRDIsIDB4REUgfSwgLyogUklHSFRXQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibHJpZ2h0ICovCiAgICB7IDB4MjFEMywgMHhERiB9LCAvKiBET1dOV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxkb3duICovCiAgICB7IDB4MjFENCwgMHhEQiB9LCAvKiBMRUZUIFJJR0hUIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsYm90aCAqLwogICAgeyAweDIyMDAsIDB4MjIgfSwgLyogRk9SIEFMTAkjIHVuaXZlcnNhbCAqLwogICAgeyAweDIyMDIsIDB4QjYgfSwgLyogUEFSVElBTCBESUZGRVJFTlRJQUwJIyBwYXJ0aWFsZGlmZiAqLwogICAgeyAweDIyMDMsIDB4MjQgfSwgLyogVEhFUkUgRVhJU1RTCSMgZXhpc3RlbnRpYWwgKi8KICAgIHsgMHgyMjA1LCAweEM2IH0sIC8qIEVNUFRZIFNFVAkjIGVtcHR5c2V0ICovCiAgICB7IDB4MjIwNiwgMHg0NCB9LCAvKiBJTkNSRU1FTlQJIyBEZWx0YSAqLwogICAgeyAweDIyMDcsIDB4RDEgfSwgLyogTkFCTEEJIyBncmFkaWVudCAqLwogICAgeyAweDIyMDgsIDB4Q0UgfSwgLyogRUxFTUVOVCBPRgkjIGVsZW1lbnQgKi8KICAgIHsgMHgyMjA5LCAweENGIH0sIC8qIE5PVCBBTiBFTEVNRU5UIE9GCSMgbm90ZWxlbWVudCAqLwogICAgeyAweDIyMEIsIDB4MjcgfSwgLyogQ09OVEFJTlMgQVMgTUVNQkVSCSMgc3VjaHRoYXQgKi8KICAgIHsgMHgyMjBGLCAweEQ1IH0sIC8qIE4tQVJZIFBST0RVQ1QJIyBwcm9kdWN0ICovCiAgICB7IDB4MjIxMSwgMHhFNSB9LCAvKiBOLUFSWSBTVU1NQVRJT04JIyBzdW1tYXRpb24gKi8KICAgIHsgMHgyMjEyLCAweDJEIH0sIC8qIE1JTlVTIFNJR04JIyBtaW51cyAqLwogICAgeyAweDIyMTUsIDB4QTQgfSwgLyogRElWSVNJT04gU0xBU0gJIyBmcmFjdGlvbiAqLwogICAgeyAweDIyMTcsIDB4MkEgfSwgLyogQVNURVJJU0sgT1BFUkFUT1IJIyBhc3Rlcmlza21hdGggKi8KICAgIHsgMHgyMjFBLCAweEQ2IH0sIC8qIFNRVUFSRSBST09UCSMgcmFkaWNhbCAqLwogICAgeyAweDIyMUQsIDB4QjUgfSwgLyogUFJPUE9SVElPTkFMIFRPCSMgcHJvcG9ydGlvbmFsICovCiAgICB7IDB4MjIxRSwgMHhBNSB9LCAvKiBJTkZJTklUWQkjIGluZmluaXR5ICovCiAgICB7IDB4MjIyMCwgMHhEMCB9LCAvKiBBTkdMRQkjIGFuZ2xlICovCiAgICB7IDB4MjIyNywgMHhEOSB9LCAvKiBMT0dJQ0FMIEFORAkjIGxvZ2ljYWxhbmQgKi8KICAgIHsgMHgyMjI4LCAweERBIH0sIC8qIExPR0lDQUwgT1IJIyBsb2dpY2Fsb3IgKi8KICAgIHsgMHgyMjI5LCAweEM3IH0sIC8qIElOVEVSU0VDVElPTgkjIGludGVyc2VjdGlvbiAqLwogICAgeyAweDIyMkEsIDB4QzggfSwgLyogVU5JT04JIyB1bmlvbiAqLwogICAgeyAweDIyMkIsIDB4RjIgfSwgLyogSU5URUdSQUwJIyBpbnRlZ3JhbCAqLwogICAgeyAweDIyMzQsIDB4NUMgfSwgLyogVEhFUkVGT1JFCSMgdGhlcmVmb3JlICovCiAgICB7IDB4MjIzQywgMHg3RSB9LCAvKiBUSUxERSBPUEVSQVRPUgkjIHNpbWlsYXIgKi8KICAgIHsgMHgyMjQ1LCAweDQwIH0sIC8qIEFQUFJPWElNQVRFTFkgRVFVQUwgVE8JIyBjb25ncnVlbnQgKi8KICAgIHsgMHgyMjQ4LCAweEJCIH0sIC8qIEFMTU9TVCBFUVVBTCBUTwkjIGFwcHJveGVxdWFsICovCiAgICB7IDB4MjI2MCwgMHhCOSB9LCAvKiBOT1QgRVFVQUwgVE8JIyBub3RlcXVhbCAqLwogICAgeyAweDIyNjEsIDB4QkEgfSwgLyogSURFTlRJQ0FMIFRPCSMgZXF1aXZhbGVuY2UgKi8KICAgIHsgMHgyMjY0LCAweEEzIH0sIC8qIExFU1MtVEhBTiBPUiBFUVVBTCBUTwkjIGxlc3NlcXVhbCAqLwogICAgeyAweDIyNjUsIDB4QjMgfSwgLyogR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCSMgZ3JlYXRlcmVxdWFsICovCiAgICB7IDB4MjI4MiwgMHhDQyB9LCAvKiBTVUJTRVQgT0YJIyBwcm9wZXJzdWJzZXQgKi8KICAgIHsgMHgyMjgzLCAweEM5IH0sIC8qIFNVUEVSU0VUIE9GCSMgcHJvcGVyc3VwZXJzZXQgKi8KICAgIHsgMHgyMjg0LCAweENCIH0sIC8qIE5PVCBBIFNVQlNFVCBPRgkjIG5vdHN1YnNldCAqLwogICAgeyAweDIyODYsIDB4Q0QgfSwgLyogU1VCU0VUIE9GIE9SIEVRVUFMIFRPCSMgcmVmbGV4c3Vic2V0ICovCiAgICB7IDB4MjI4NywgMHhDQSB9LCAvKiBTVVBFUlNFVCBPRiBPUiBFUVVBTCBUTwkjIHJlZmxleHN1cGVyc2V0ICovCiAgICB7IDB4MjI5NSwgMHhDNSB9LCAvKiBDSVJDTEVEIFBMVVMJIyBjaXJjbGVwbHVzICovCiAgICB7IDB4MjI5NywgMHhDNCB9LCAvKiBDSVJDTEVEIFRJTUVTCSMgY2lyY2xlbXVsdGlwbHkgKi8KICAgIHsgMHgyMkE1LCAweDVFIH0sIC8qIFVQIFRBQ0sJIyBwZXJwZW5kaWN1bGFyICovCiAgICB7IDB4MjJDNSwgMHhENyB9LCAvKiBET1QgT1BFUkFUT1IJIyBkb3RtYXRoICovCiAgICB7IDB4MjMyMCwgMHhGMyB9LCAvKiBUT1AgSEFMRiBJTlRFR1JBTAkjIGludGVncmFsdHAgKi8KICAgIHsgMHgyMzIxLCAweEY1IH0sIC8qIEJPVFRPTSBIQUxGIElOVEVHUkFMCSMgaW50ZWdyYWxidCAqLwogICAgeyAweDIzMjksIDB4RTEgfSwgLyogTEVGVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUCSMgYW5nbGVsZWZ0ICovCiAgICB7IDB4MjMyQSwgMHhGMSB9LCAvKiBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUCSMgYW5nbGVyaWdodCAqLwogICAgeyAweDI1Q0EsIDB4RTAgfSwgLyogTE9aRU5HRQkjIGxvemVuZ2UgKi8KICAgIHsgMHgyNjYwLCAweEFBIH0sIC8qIEJMQUNLIFNQQURFIFNVSVQJIyBzcGFkZSAqLwogICAgeyAweDI2NjMsIDB4QTcgfSwgLyogQkxBQ0sgQ0xVQiBTVUlUCSMgY2x1YiAqLwogICAgeyAweDI2NjUsIDB4QTkgfSwgLyogQkxBQ0sgSEVBUlQgU1VJVAkjIGhlYXJ0ICovCiAgICB7IDB4MjY2NiwgMHhBOCB9LCAvKiBCTEFDSyBESUFNT05EIFNVSVQJIyBkaWFtb25kICovCiAgICB7IDB4RjZEOSwgMHhEMyB9LCAvKiBDT1BZUklHSFQgU0lHTiBTRVJJRgkjIGNvcHlyaWdodHNlcmlmIChDVVMpICovCiAgICB7IDB4RjZEQSwgMHhEMiB9LCAvKiBSRUdJU1RFUkVEIFNJR04gU0VSSUYJIyByZWdpc3RlcnNlcmlmIChDVVMpICovCiAgICB7IDB4RjZEQiwgMHhENCB9LCAvKiBUUkFERSBNQVJLIFNJR04gU0VSSUYJIyB0cmFkZW1hcmtzZXJpZiAoQ1VTKSAqLwogICAgeyAweEY4RTUsIDB4NjAgfSwgLyogUkFESUNBTCBFWFRFTkRFUgkjIHJhZGljYWxleCAoQ1VTKSAqLwogICAgeyAweEY4RTYsIDB4QkQgfSwgLyogVkVSVElDQUwgQVJST1cgRVhURU5ERVIJIyBhcnJvd3ZlcnRleCAoQ1VTKSAqLwogICAgeyAweEY4RTcsIDB4QkUgfSwgLyogSE9SSVpPTlRBTCBBUlJPVyBFWFRFTkRFUgkjIGFycm93aG9yaXpleCAoQ1VTKSAqLwogICAgeyAweEY4RTgsIDB4RTIgfSwgLyogUkVHSVNURVJFRCBTSUdOIFNBTlMgU0VSSUYJIyByZWdpc3RlcnNhbnMgKENVUykgKi8KICAgIHsgMHhGOEU5LCAweEUzIH0sIC8qIENPUFlSSUdIVCBTSUdOIFNBTlMgU0VSSUYJIyBjb3B5cmlnaHRzYW5zIChDVVMpICovCiAgICB7IDB4RjhFQSwgMHhFNCB9LCAvKiBUUkFERSBNQVJLIFNJR04gU0FOUyBTRVJJRgkjIHRyYWRlbWFya3NhbnMgKENVUykgKi8KICAgIHsgMHhGOEVCLCAweEU2IH0sIC8qIExFRlQgUEFSRU4gVE9QCSMgcGFyZW5sZWZ0dHAgKENVUykgKi8KICAgIHsgMHhGOEVDLCAweEU3IH0sIC8qIExFRlQgUEFSRU4gRVhURU5ERVIJIyBwYXJlbmxlZnRleCAoQ1VTKSAqLwogICAgeyAweEY4RUQsIDB4RTggfSwgLyogTEVGVCBQQVJFTiBCT1RUT00JIyBwYXJlbmxlZnRidCAoQ1VTKSAqLwogICAgeyAweEY4RUUsIDB4RTkgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCBUT1AJIyBicmFja2V0bGVmdHRwIChDVVMpICovCiAgICB7IDB4RjhFRiwgMHhFQSB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIEVYVEVOREVSCSMgYnJhY2tldGxlZnRleCAoQ1VTKSAqLwogICAgeyAweEY4RjAsIDB4RUIgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCBCT1RUT00JIyBicmFja2V0bGVmdGJ0IChDVVMpICovCiAgICB7IDB4RjhGMSwgMHhFQyB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgVE9QCSMgYnJhY2VsZWZ0dHAgKENVUykgKi8KICAgIHsgMHhGOEYyLCAweEVEIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCBNSUQJIyBicmFjZWxlZnRtaWQgKENVUykgKi8KICAgIHsgMHhGOEYzLCAweEVFIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCBCT1RUT00JIyBicmFjZWxlZnRidCAoQ1VTKSAqLwogICAgeyAweEY4RjQsIDB4RUYgfSwgLyogQ1VSTFkgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNlZXggKENVUykgKi8KICAgIHsgMHhGOEY1LCAweEY0IH0sIC8qIElOVEVHUkFMIEVYVEVOREVSCSMgaW50ZWdyYWxleCAoQ1VTKSAqLwogICAgeyAweEY4RjYsIDB4RjYgfSwgLyogUklHSFQgUEFSRU4gVE9QCSMgcGFyZW5yaWdodHRwIChDVVMpICovCiAgICB7IDB4RjhGNywgMHhGNyB9LCAvKiBSSUdIVCBQQVJFTiBFWFRFTkRFUgkjIHBhcmVucmlnaHRleCAoQ1VTKSAqLwogICAgeyAweEY4RjgsIDB4RjggfSwgLyogUklHSFQgUEFSRU4gQk9UVE9NCSMgcGFyZW5yaWdodGJ0IChDVVMpICovCiAgICB7IDB4RjhGOSwgMHhGOSB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBUT1AJIyBicmFja2V0cmlnaHR0cCAoQ1VTKSAqLwogICAgeyAweEY4RkEsIDB4RkEgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgRVhURU5ERVIJIyBicmFja2V0cmlnaHRleCAoQ1VTKSAqLwogICAgeyAweEY4RkIsIDB4RkIgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgQk9UVE9NCSMgYnJhY2tldHJpZ2h0YnQgKENVUykgKi8KICAgIHsgMHhGOEZDLCAweEZDIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgVE9QCSMgYnJhY2VyaWdodHRwIChDVVMpICovCiAgICB7IDB4RjhGRCwgMHhGRCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUIE1JRAkjIGJyYWNlcmlnaHRtaWQgKENVUykgKi8KICAgIHsgMHhGOEZFLCAweEZFIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgQk9UVE9NCSMgYnJhY2VyaWdodGJ0IChDVVMpICovCn07CgpzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFkb2JlU3ltYm9sID0gewogICAgQWRvYmVTeW1ib2xFbnQsCiAgICBzaXplb2YgKEFkb2JlU3ltYm9sRW50KSAvIHNpemVvZiAoQWRvYmVTeW1ib2xFbnRbMF0pLAp9OwogICAgCnN0YXRpYyBjb25zdCBGY0ZvbnREZWNvZGUgZmNGb250RGVjb2RlcnNbXSA9IHsKICAgIHsgZnRfZW5jb2RpbmdfdW5pY29kZSwJMCwJCSgxIDw8IDIxKSAtIDEgfSwKICAgIHsgZnRfZW5jb2Rpbmdfc3ltYm9sLAkmQWRvYmVTeW1ib2wsCSgxIDw8IDE2KSAtIDEgfSwKICAgIHsgZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4sCSZBcHBsZVJvbWFuLAkoMSA8PCAxNikgLSAxIH0sCn07CgojZGVmaW5lIE5VTV9ERUNPREUgIChzaXplb2YgKGZjRm9udERlY29kZXJzKSAvIHNpemVvZiAoZmNGb250RGVjb2RlcnNbMF0pKQoKRmNDaGFyMzIKRmNGcmVlVHlwZVVjczRUb1ByaXZhdGUgKEZjQ2hhcjMyIHVjczQsIGNvbnN0IEZjQ2hhck1hcCAqbWFwKQp7CiAgICBpbnQJCWxvdywgaGlnaCwgbWlkOwogICAgRmNDaGFyMTYJYm1wOwoKICAgIGxvdyA9IDA7CiAgICBoaWdoID0gbWFwLT5uZW50IC0gMTsKICAgIGlmICh1Y3M0IDwgbWFwLT5lbnRbbG93XS5ibXAgfHwgbWFwLT5lbnRbaGlnaF0uYm1wIDwgdWNzNCkKCXJldHVybiB+MDsKICAgIHdoaWxlIChsb3cgPD0gaGlnaCkKICAgIHsKCW1pZCA9IChoaWdoICsgbG93KSA+PiAxOwoJYm1wID0gbWFwLT5lbnRbbWlkXS5ibXA7CglpZiAodWNzNCA9PSBibXApCgkgICAgcmV0dXJuIChGVF9VTG9uZykgbWFwLT5lbnRbbWlkXS5lbmNvZGU7CglpZiAodWNzNCA8IGJtcCkKCSAgICBoaWdoID0gbWlkIC0gMTsKCWVsc2UKCSAgICBsb3cgPSBtaWQgKyAxOwogICAgfQogICAgcmV0dXJuIH4wOwp9CgpGY0NoYXIzMgpGY0ZyZWVUeXBlUHJpdmF0ZVRvVWNzNCAoRmNDaGFyMzIgcHJpdmF0ZSwgY29uc3QgRmNDaGFyTWFwICptYXApCnsKICAgIGludAkgICAgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbWFwLT5uZW50OyBpKyspCglpZiAobWFwLT5lbnRbaV0uZW5jb2RlID09IHByaXZhdGUpCgkgICAgcmV0dXJuIChGY0NoYXIzMikgbWFwLT5lbnRbaV0uYm1wOwogICAgcmV0dXJuIH4wOwp9Cgpjb25zdCBGY0NoYXJNYXAgKgpGY0ZyZWVUeXBlR2V0UHJpdmF0ZU1hcCAoRlRfRW5jb2RpbmcgZW5jb2RpbmcpCnsKICAgIGludAlpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fREVDT0RFOyBpKyspCglpZiAoZmNGb250RGVjb2RlcnNbaV0uZW5jb2RpbmcgPT0gZW5jb2RpbmcpCgkgICAgcmV0dXJuIGZjRm9udERlY29kZXJzW2ldLm1hcDsKICAgIHJldHVybiAwOwp9CgojaW5jbHVkZSAiLi4vZmMtZ2x5cGhuYW1lL2ZjZ2x5cGhuYW1lLmgiCgpzdGF0aWMgRmNDaGFyMzIKRmNIYXNoR2x5cGhOYW1lIChjb25zdCBGY0NoYXI4ICpuYW1lKQp7CiAgICBGY0NoYXIzMgloID0gMDsKICAgIEZjQ2hhcjgJYzsKCiAgICB3aGlsZSAoKGMgPSAqbmFtZSsrKSkKICAgIHsKCWggPSAoKGggPDwgMSkgfCAoaCA+PiAzMSkpIF4gYzsKICAgIH0KICAgIHJldHVybiBoOwp9CgojaWYgSEFWRV9GVF9IQVNfUFNfR0xZUEhfTkFNRVMKLyoKICogVXNlIFR5cGUxIGdseXBoIG5hbWVzIGZvciBmb250cyB3aGljaCBoYXZlIHJlbGlhYmxlIG5hbWVzCiAqIGFuZCB3aGljaCBleHBvcnQgYW4gQWRvYmUgQ3VzdG9tIG1hcHBpbmcKICovCnN0YXRpYyBGY0Jvb2wKRmNGcmVlVHlwZVVzZU5hbWVzIChGVF9GYWNlIGZhY2UpCnsKICAgIEZUX0ludCAgbWFwOwogICAgCiAgICBpZiAoIUZUX0hhc19QU19HbHlwaF9OYW1lcyAoZmFjZSkpCglyZXR1cm4gRmNGYWxzZTsKICAgIGZvciAobWFwID0gMDsgbWFwIDwgZmFjZS0+bnVtX2NoYXJtYXBzOyBtYXArKykKCWlmIChmYWNlLT5jaGFybWFwc1ttYXBdLT5lbmNvZGluZyA9PSBmdF9lbmNvZGluZ19hZG9iZV9jdXN0b20pCgkgICAgcmV0dXJuIEZjVHJ1ZTsKICAgIHJldHVybiBGY0ZhbHNlOwp9CgpzdGF0aWMgRmNDaGFyOCAqCkZjVWNzNFRvR2x5cGhOYW1lIChGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJCWkgPSAoaW50KSAodWNzNCAlIEZDX0dMWVBITkFNRV9IQVNIKTsKICAgIGludAkJciA9IDA7CiAgICBGY0dseXBoTmFtZQkqZ247CgogICAgd2hpbGUgKChnbiA9IHVjc190b19uYW1lW2ldKSkKICAgIHsKCWlmIChnbi0+dWNzID09IHVjczQpCgkgICAgcmV0dXJuIGduLT5uYW1lOwoJaWYgKCFyKSAKCXsKCSAgICByID0gKGludCkgKHVjczQgJSBGQ19HTFlQSE5BTUVfUkVIQVNIKTsKCSAgICBpZiAoIXIpCgkJciA9IDE7Cgl9CglpICs9IHI7CglpZiAoaSA+PSBGQ19HTFlQSE5BTUVfSEFTSCkKCSAgICBpIC09IEZDX0dMWVBITkFNRV9IQVNIOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0NoYXIzMgpGY0dseXBoTmFtZVRvVWNzNCAoRmNDaGFyOCAqbmFtZSkKewogICAgRmNDaGFyMzIJaCA9IEZjSGFzaEdseXBoTmFtZSAobmFtZSk7CiAgICBpbnQJCWkgPSAoaW50KSAoaCAlIEZDX0dMWVBITkFNRV9IQVNIKTsKICAgIGludAkJciA9IDA7CiAgICBGY0dseXBoTmFtZQkqZ247CgogICAgd2hpbGUgKChnbiA9IG5hbWVfdG9fdWNzW2ldKSkKICAgIHsKCWlmICghc3RyY21wICgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBnbi0+bmFtZSkpCgkgICAgcmV0dXJuIGduLT51Y3M7CglpZiAoIXIpIAoJewoJICAgIHIgPSAoaW50KSAoaCAlIEZDX0dMWVBITkFNRV9SRUhBU0gpOwoJICAgIGlmICghcikKCQlyID0gMTsKCX0KCWkgKz0gcjsKCWlmIChpID49IEZDX0dMWVBITkFNRV9IQVNIKQoJICAgIGkgLT0gRkNfR0xZUEhOQU1FX0hBU0g7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9CgovKgogKiBTZWFyY2ggdGhyb3VnaCBhIGZvbnQgZm9yIGEgZ2x5cGggYnkgbmFtZS4gIFRoaXMgaXMKICogY3VycmVudGx5IGEgbGluZWFyIHNlYXJjaCBhcyB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZQogKiBhbnkgZGVmaW5lZCBvcmRlciB3aXRoaW4gdGhlIGZvbnQKICovCnN0YXRpYyBGVF9VSW50CkZjRnJlZVR5cGVHbHlwaE5hbWVJbmRleCAoRlRfRmFjZSBmYWNlLCBGY0NoYXI4ICpuYW1lKQp7CiAgICBGVF9VSW50IGdpbmRleDsKICAgIEZjQ2hhcjggbmFtZV9idWZbRkNfR0xZUEhOQU1FX01BWExFTiArIDJdOwoKICAgIGZvciAoZ2luZGV4ID0gMDsgZ2luZGV4IDwgZmFjZS0+bnVtX2dseXBoczsgZ2luZGV4KyspCiAgICB7CglpZiAoRlRfR2V0X0dseXBoX05hbWUgKGZhY2UsIGdpbmRleCwgbmFtZV9idWYsIEZDX0dMWVBITkFNRV9NQVhMRU4rMSkgPT0gMCkKCSAgICBpZiAoIXN0cmNtcCAoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmFtZV9idWYpKQoJCXJldHVybiBnaW5kZXg7CiAgICB9CiAgICByZXR1cm4gMDsKfQojZW5kaWYKCi8qCiAqIE1hcCBhIFVDUzQgZ2x5cGggdG8gYSBnbHlwaCBpbmRleC4gIFVzZSBhbGwgYXZhaWxhYmxlIGVuY29kaW5nCiAqIHRhYmxlcyB0byB0cnkgYW5kIGZpbmQgb25lIHRoYXQgd29ya3MuICBUaGlzIGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkCiAqIHRvIGJlIGNhY2hlZCBieSBoaWdoZXIgbGV2ZWxzLCBzbyBwZXJmb3JtYW5jZSBpc24ndCBjcml0aWNhbAogKi8KCkZUX1VJbnQKRmNGcmVlVHlwZUNoYXJJbmRleCAoRlRfRmFjZSBmYWNlLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJCSAgICBpbml0aWFsLCBvZmZzZXQsIGRlY29kZTsKICAgIEZUX1VJbnQJICAgIGdseXBoaW5kZXg7CiAgICBGY0NoYXIzMgkgICAgY2hhcmNvZGU7CgogICAgaW5pdGlhbCA9IDA7CiAgICAvKgogICAgICogRmluZCB0aGUgY3VycmVudCBlbmNvZGluZwogICAgICovCiAgICBpZiAoZmFjZS0+Y2hhcm1hcCkKICAgIHsKCWZvciAoOyBpbml0aWFsIDwgTlVNX0RFQ09ERTsgaW5pdGlhbCsrKQoJICAgIGlmIChmY0ZvbnREZWNvZGVyc1tpbml0aWFsXS5lbmNvZGluZyA9PSBmYWNlLT5jaGFybWFwLT5lbmNvZGluZykKCQlicmVhazsKCWlmIChpbml0aWFsID09IE5VTV9ERUNPREUpCgkgICAgaW5pdGlhbCA9IDA7CiAgICB9CiAgICAvKgogICAgICogQ2hlY2sgZWFjaCBlbmNvZGluZyBmb3IgdGhlIGdseXBoLCBzdGFydGluZyB3aXRoIHRoZSBjdXJyZW50IG9uZQogICAgICovCiAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IE5VTV9ERUNPREU7IG9mZnNldCsrKQogICAgewoJZGVjb2RlID0gKGluaXRpYWwgKyBvZmZzZXQpICUgTlVNX0RFQ09ERTsKCWlmICghZmFjZS0+Y2hhcm1hcCB8fCBmYWNlLT5jaGFybWFwLT5lbmNvZGluZyAhPSBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLmVuY29kaW5nKQoJICAgIGlmIChGVF9TZWxlY3RfQ2hhcm1hcCAoZmFjZSwgZmNGb250RGVjb2RlcnNbZGVjb2RlXS5lbmNvZGluZykgIT0gMCkKCQljb250aW51ZTsKCWlmIChmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCkKCXsKCSAgICBjaGFyY29kZSA9IEZjRnJlZVR5cGVVY3M0VG9Qcml2YXRlICh1Y3M0LCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCk7CgkgICAgaWYgKGNoYXJjb2RlID09IH4wKQoJCWNvbnRpbnVlOwoJfQoJZWxzZQoJICAgIGNoYXJjb2RlID0gdWNzNDsKCWdseXBoaW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgKEZUX1VMb25nKSBjaGFyY29kZSk7CglpZiAoZ2x5cGhpbmRleCkKCSAgICByZXR1cm4gZ2x5cGhpbmRleDsKICAgIH0KI2lmIEhBVkVfRlRfSEFTX1BTX0dMWVBIX05BTUVTCiAgICAvKgogICAgICogQ2hlY2sgcG9zdHNjcmlwdCBuYW1lIHRhYmxlIGlmIHByZXNlbnQKICAgICAqLwogICAgaWYgKEZjRnJlZVR5cGVVc2VOYW1lcyAoZmFjZSkpCiAgICB7CglGY0NoYXI4CSpuYW1lID0gRmNVY3M0VG9HbHlwaE5hbWUgKHVjczQpOwoJaWYgKG5hbWUpCgl7CgkgICAgZ2x5cGhpbmRleCA9IEZjRnJlZVR5cGVHbHlwaE5hbWVJbmRleCAoZmFjZSwgbmFtZSk7CgkgICAgaWYgKGdseXBoaW5kZXgpCgkJcmV0dXJuIGdseXBoaW5kZXg7Cgl9CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNGcmVlVHlwZUNoZWNrR2x5cGggKEZUX0ZhY2UgZmFjZSwgRmNDaGFyMzIgdWNzNCwgCgkJICAgICAgRlRfVUludCBnbHlwaCwgRmNCbGFua3MgKmJsYW5rcywKCQkgICAgICBGVF9Qb3MgKmFkdmFuY2UpCnsKICAgIEZUX0ludAkgICAgbG9hZF9mbGFncyA9IEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIIHwgRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORzsKICAgIEZUX0dseXBoU2xvdCAgICBzbG90OwogICAgCiAgICAvKgogICAgICogRm9yIGJpdG1hcC1vbmx5IGZvbnRzLCBhc3N1bWUgdGhhdCB0aGV5J3JlIE9LLgogICAgICovCiAgICBpZiAoKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUpID09IDApCglyZXR1cm4gRmNUcnVlOwoKICAgIC8qCiAgICAgKiBXaGVuIHVzaW5nIHNjYWxhYmxlIGZvbnRzLCBvbmx5IHJlcG9ydCB0aG9zZSBnbHlwaHMKICAgICAqIHdoaWNoIGNhbiBiZSBzY2FsZWQ7IG90aGVyd2lzZSB0aG9zZSBmb250cyB3aWxsCiAgICAgKiBvbmx5IGJlIGF2YWlsYWJsZSBhdCBzb21lIHNpemVzLCBhbmQgbmV2ZXIgd2hlbgogICAgICogdHJhbnNmb3JtZWQuICBBdm9pZCB0aGlzIGJ5IHNpbXBseSByZXBvcnRpbmcgYml0bWFwLW9ubHkKICAgICAqIGdseXBocyBhcyBtaXNzaW5nCiAgICAgKi8KICAgIGlmIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKQoJbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0JJVE1BUDsKICAgIAogICAgaWYgKEZUX0xvYWRfR2x5cGggKGZhY2UsIGdseXBoLCBsb2FkX2ZsYWdzKSkKCXJldHVybiBGY0ZhbHNlOwogICAgCiAgICBzbG90ID0gZmFjZS0+Z2x5cGg7CiAgICBpZiAoIWdseXBoKQoJcmV0dXJuIEZjRmFsc2U7CiAgICAKICAgICphZHZhbmNlID0gc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZTsKCiAgICBzd2l0Y2ggKHNsb3QtPmZvcm1hdCkgewogICAgY2FzZSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwOgoJLyoKCSAqIEJpdG1hcHMgYXJlIGFzc3VtZWQgdG8gYmUgcmVhc29uYWJsZTsgaWYKCSAqIHRoaXMgcHJvdmVzIHRvIGJlIGEgcmFzaCBhc3N1bXB0aW9uLCB0aGlzCgkgKiBjb2RlIGNhbiBiZSBlYXNpbHkgbW9kaWZpZWQKCSAqLwoJcmV0dXJuIEZjVHJ1ZTsKICAgIGNhc2UgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmU6CgkvKgoJICogR2x5cGhzIHdpdGggY29udG91cnMgYXJlIGFsd2F5cyBPSwoJICovCglpZiAoc2xvdC0+b3V0bGluZS5uX2NvbnRvdXJzICE9IDApCgkgICAgcmV0dXJuIEZjVHJ1ZTsKCS8qCgkgKiBHbHlwaHMgd2l0aCBubyBjb250b3VycyBhcmUgb25seSBPSyBpZgoJICogdGhleSdyZSBtZW1iZXJzIG9mIHRoZSBCbGFua3Mgc2V0IHNwZWNpZmllZAoJICogaW4gdGhlIGNvbmZpZ3VyYXRpb24uICBJZiBibGFua3MgaXNuJ3Qgc2V0LAoJICogdGhlbiBhbGxvdyBhbnkgZ2x5cGggdG8gYmUgYmxhbmsKCSAqLwoJaWYgKCFibGFua3MgfHwgRmNCbGFua3NJc01lbWJlciAoYmxhbmtzLCB1Y3M0KSkKCSAgICByZXR1cm4gRmNUcnVlOwoJLyogZmFsbCB0aHJvdWdoIC4uLiAqLwogICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCiNkZWZpbmUgRkNfTUlOKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKI2RlZmluZSBGQ19NQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQojZGVmaW5lIEZDX0FCUyhhKSAgICgoYSkgPCAwID8gLShhKSA6IChhKSkKI2RlZmluZSBBUFBST1hJTUFURUxZX0VRVUFMKHgseSkgKEZDX0FCUyAoKHgpIC0gKHkpKSA8PSBGQ19NQVggKEZDX0FCUyAoeCksIEZDX0FCUyAoeSkpIC8gMzMpCgpGY0NoYXJTZXQgKgpGY0ZyZWVUeXBlQ2hhclNldEFuZFNwYWNpbmcgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcywgaW50ICpzcGFjaW5nKQp7CiAgICBGY0NoYXIzMgkgICAgcGFnZSwgb2ZmLCBtYXgsIHVjczQ7CiNpZmRlZiBDSEVDSwogICAgRmNDaGFyMzIJICAgIGZvbnRfbWF4ID0gMDsKI2VuZGlmCiAgICBGY0NoYXJTZXQJICAgICpmY3M7CiAgICBGY0NoYXJMZWFmCSAgICAqbGVhZjsKICAgIGNvbnN0IEZjQ2hhck1hcCAqbWFwOwogICAgaW50CQkgICAgbzsKICAgIGludAkJICAgIGk7CiAgICBGVF9VSW50CSAgICBnbHlwaDsKICAgIEZUX1BvcwkgICAgYWR2YW5jZSwgYWR2YW5jZV9vbmUgPSAwLCBhZHZhbmNlX3R3byA9IDA7CiAgICBGY0Jvb2wJICAgIGhhc19hZHZhbmNlID0gRmNGYWxzZSwgZml4ZWRfYWR2YW5jZSA9IEZjVHJ1ZSwgZHVhbF9hZHZhbmNlID0gRmNGYWxzZTsKCiAgICBmY3MgPSBGY0NoYXJTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWZjcykKCWdvdG8gYmFpbDA7CiAgICAKI2lmZGVmIENIRUNLCiAgICBwcmludGYgKCJGYW1pbHkgJXMgc3R5bGUgJXNcbiIsIGZhY2UtPmZhbWlseV9uYW1lLCBmYWNlLT5zdHlsZV9uYW1lKTsKI2VuZGlmCiAgICBmb3IgKG8gPSAwOyBvIDwgTlVNX0RFQ09ERTsgbysrKQogICAgewoJaWYgKEZUX1NlbGVjdF9DaGFybWFwIChmYWNlLCBmY0ZvbnREZWNvZGVyc1tvXS5lbmNvZGluZykgIT0gMCkKCSAgICBjb250aW51ZTsKCW1hcCA9IGZjRm9udERlY29kZXJzW29dLm1hcDsKCWlmIChtYXApCgl7CgkgICAgLyoKCSAgICAgKiBOb24tVW5pY29kZSB0YWJsZXMgYXJlIGVhc3k7IHRoZXJlJ3MgYSBsaXN0IG9mIGFsbCBwb3NzaWJsZQoJICAgICAqIGNoYXJhY3RlcnMKCSAgICAgKi8KCSAgICBmb3IgKGkgPSAwOyBpIDwgbWFwLT5uZW50OyBpKyspCgkgICAgewoJCXVjczQgPSBtYXAtPmVudFtpXS5ibXA7CgkJZ2x5cGggPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgbWFwLT5lbnRbaV0uZW5jb2RlKTsKCQlpZiAoZ2x5cGggJiYgCgkJICAgIEZjRnJlZVR5cGVDaGVja0dseXBoIChmYWNlLCB1Y3M0LCBnbHlwaCwgYmxhbmtzLCAmYWR2YW5jZSkpCgkJewoJCSAgICBpZiAoIWhhc19hZHZhbmNlKQoJCSAgICB7CgkJCWhhc19hZHZhbmNlID0gRmNUcnVlOwoJCQlhZHZhbmNlX29uZSA9IGFkdmFuY2U7CgkJICAgIH0KCQkgICAgZWxzZSBpZiAoIUFQUFJPWElNQVRFTFlfRVFVQUwgKGFkdmFuY2UsIGFkdmFuY2Vfb25lKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZF9hZHZhbmNlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsX2FkdmFuY2UgPSBGY1RydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9hZHZhbmNlID0gRmNGYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VfdHdvID0gYWR2YW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQVBQUk9YSU1BVEVMWV9FUVVBTCAoYWR2YW5jZSwgYWR2YW5jZV90d28pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVhbF9hZHZhbmNlID0gRmNGYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgoJCSAgICBsZWFmID0gRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKGZjcywgdWNzNCk7CgkJICAgIGlmICghbGVhZikKCQkJZ290byBiYWlsMTsKCQkgICAgbGVhZi0+bWFwWyh1Y3M0ICYgMHhmZikgPj4gNV0gfD0gKDEgPDwgKHVjczQgJiAweDFmKSk7CiNpZmRlZiBDSEVDSwoJCSAgICBpZiAodWNzNCA+IGZvbnRfbWF4KQoJCQlmb250X21heCA9IHVjczQ7CiNlbmRpZgoJCX0KCSAgICB9Cgl9CgllbHNlCgl7CgkgICAgRlRfVUludCBnaW5kZXg7CgkgIAoJICAgIG1heCA9IGZjRm9udERlY29kZXJzW29dLm1heDsKCSAgICAvKgoJICAgICAqIEZpbmQgdGhlIGZpcnN0IGVuY29kZWQgY2hhcmFjdGVyIGluIHRoZSBmb250CgkgICAgICovCgkgICAgaWYgKEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCAwKSkKCSAgICB7CgkJdWNzNCA9IDA7CgkJZ2luZGV4ID0gMTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQl1Y3M0ID0gRlRfR2V0X05leHRfQ2hhciAoZmFjZSwgMCwgJmdpbmRleCk7CgkJaWYgKCF1Y3M0KQoJCSAgICBnaW5kZXggPSAwOwoJICAgIH0KCgkgICAgd2hpbGUgKGdpbmRleCkKCSAgICB7CgkJcGFnZSA9IHVjczQgPj4gODsKCQlsZWFmID0gMDsKCQl3aGlsZSAoKHVjczQgPj4gOCkgPT0gcGFnZSkKCQl7CgkJICAgIGdseXBoID0gRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIHVjczQpOwoJCSAgICBpZiAoZ2x5cGggJiYgRmNGcmVlVHlwZUNoZWNrR2x5cGggKGZhY2UsIHVjczQsIAoJCQkJCQkgICAgICAgZ2x5cGgsIGJsYW5rcywgJmFkdmFuY2UpKQoJCSAgICB7CgkJCWlmICghaGFzX2FkdmFuY2UpCgkJCXsKCQkJICAgIGhhc19hZHZhbmNlID0gRmNUcnVlOwoJCQkgICAgYWR2YW5jZV9vbmUgPSBhZHZhbmNlOwoJCQl9CgkJICAgICAgICBlbHNlIGlmICghQVBQUk9YSU1BVEVMWV9FUVVBTCAoYWR2YW5jZSwgYWR2YW5jZV9vbmUpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRfYWR2YW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsX2FkdmFuY2UgPSBGY1RydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfYWR2YW5jZSA9IEZjRmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZV90d28gPSBhZHZhbmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFQUFJPWElNQVRFTFlfRVFVQUwgKGFkdmFuY2UsIGFkdmFuY2VfdHdvKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsX2FkdmFuY2UgPSBGY0ZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoJCQlpZiAoIWxlYWYpCgkJCXsKCQkJICAgIGxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKCQkJICAgIGlmICghbGVhZikKCQkJCWdvdG8gYmFpbDE7CgkJCX0KCQkJb2ZmID0gdWNzNCAmIDB4ZmY7CgkJCWxlYWYtPm1hcFtvZmYgPj4gNV0gfD0gKDEgPDwgKG9mZiAmIDB4MWYpKTsKI2lmZGVmIENIRUNLCgkJCWlmICh1Y3M0ID4gZm9udF9tYXgpCgkJCSAgICBmb250X21heCA9IHVjczQ7CiNlbmRpZgoJCSAgICB9CgkJICAgIHVjczQrKzsKCQl9CgkJdWNzNCA9IEZUX0dldF9OZXh0X0NoYXIgKGZhY2UsIHVjczQgLSAxLCAmZ2luZGV4KTsKCQlpZiAoIXVjczQpCgkJICAgIGdpbmRleCA9IDA7CgkgICAgfQojaWZkZWYgQ0hFQ0sKCSAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDwgMHgxMDAwMDsgdWNzNCsrKQoJICAgIHsKCQlGY0Jvb2wJICAgIEZUX0hhcywgRkNfSGFzOwoKCQlGVF9IYXMgPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgdWNzNCkgIT0gMDsKCQlGQ19IYXMgPSBGY0NoYXJTZXRIYXNDaGFyIChmY3MsIHVjczQpOwoJCWlmIChGVF9IYXMgIT0gRkNfSGFzKQoJCXsKCQkgICAgcHJpbnRmICgiMHglMDh4IEZUIHNheXMgJWQgRkMgc2F5cyAlZFxuIiwgdWNzNCwgRlRfSGFzLCBGQ19IYXMpOwoJCX0KCSAgICB9CiNlbmRpZgoJfQogICAgfQojaWYgSEFWRV9GVF9IQVNfUFNfR0xZUEhfTkFNRVMKICAgIC8qCiAgICAgKiBBZGQgbWFwcGluZyBmcm9tIFBTIGdseXBoIG5hbWVzIGlmIGF2YWlsYWJsZQogICAgICovCiAgICBpZiAoRmNGcmVlVHlwZVVzZU5hbWVzIChmYWNlKSkKICAgIHsKCUZjQ2hhcjggbmFtZV9idWZbRkNfR0xZUEhOQU1FX01BWExFTiArIDJdOwoKCWZvciAoZ2x5cGggPSAwOyBnbHlwaCA8IGZhY2UtPm51bV9nbHlwaHM7IGdseXBoKyspCgl7CgkgICAgaWYgKEZUX0dldF9HbHlwaF9OYW1lIChmYWNlLCBnbHlwaCwgbmFtZV9idWYsIEZDX0dMWVBITkFNRV9NQVhMRU4rMSkgPT0gMCkKCSAgICB7CgkJdWNzNCA9IEZjR2x5cGhOYW1lVG9VY3M0IChuYW1lX2J1Zik7CgkJaWYgKHVjczQgIT0gMHhmZmZmICYmIAoJCSAgICBGY0ZyZWVUeXBlQ2hlY2tHbHlwaCAoZmFjZSwgdWNzNCwgZ2x5cGgsIGJsYW5rcywgJmFkdmFuY2UpKQoJCXsKCQkgICAgaWYgKCFoYXNfYWR2YW5jZSkKCQkgICAgewoJCQloYXNfYWR2YW5jZSA9IEZjVHJ1ZTsKCQkJYWR2YW5jZV9vbmUgPSBhZHZhbmNlOwoJCSAgICB9CgkJICAgIGVsc2UgaWYgKCFBUFBST1hJTUFURUxZX0VRVUFMIChhZHZhbmNlLCBhZHZhbmNlX29uZSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRfYWR2YW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVhbF9hZHZhbmNlID0gRmNUcnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfYWR2YW5jZSA9IEZjRmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlX3R3byA9IGFkdmFuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUFQUFJPWElNQVRFTFlfRVFVQUwgKGFkdmFuY2UsIGFkdmFuY2VfdHdvKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1YWxfYWR2YW5jZSA9IEZjRmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQoJCSAgICBsZWFmID0gRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKGZjcywgdWNzNCk7CgkJICAgIGlmICghbGVhZikKCQkJZ290byBiYWlsMTsKCQkgICAgbGVhZi0+bWFwWyh1Y3M0ICYgMHhmZikgPj4gNV0gfD0gKDEgPDwgKHVjczQgJiAweDFmKSk7CiNpZmRlZiBDSEVDSwoJCSAgICBpZiAodWNzNCA+IGZvbnRfbWF4KQoJCQlmb250X21heCA9IHVjczQ7CiNlbmRpZgoJCX0KCSAgICB9Cgl9CiAgICB9CiNlbmRpZgojaWZkZWYgQ0hFQ0sKICAgIHByaW50ZiAoIiVkIGdseXBocyAlZCBlbmNvZGVkXG4iLCAoaW50KSBmYWNlLT5udW1fZ2x5cGhzLCBGY0NoYXJTZXRDb3VudCAoZmNzKSk7CiAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDw9IGZvbnRfbWF4OyB1Y3M0KyspCiAgICB7CglGY0Jvb2wJaGFzX2NoYXIgPSAoZ2x5cGggPSBGY0ZyZWVUeXBlQ2hhckluZGV4IChmYWNlLCB1Y3M0KSkgIT0gMDsKCUZjQm9vbAloYXNfYml0ID0gRmNDaGFyU2V0SGFzQ2hhciAoZmNzLCB1Y3M0KTsKCglpZiAoaGFzX2NoYXIgJiYgIWhhc19iaXQpCgl7CgkgICAgaWYgKCFGY0ZyZWVUeXBlQ2hlY2tHbHlwaCAoZmFjZSwgdWNzNCwgZ2x5cGgsIGJsYW5rcywgJmFkdmFuY2UpKQoJCXByaW50ZiAoIkJpdG1hcCBtaXNzaW5nIGJyb2tlbiBjaGFyIDB4JXhcbiIsIHVjczQpOwoJICAgIGVsc2UKCQlwcmludGYgKCJCaXRtYXAgbWlzc2luZyBjaGFyIDB4JXhcbiIsIHVjczQpOwoJfQoJZWxzZSBpZiAoIWhhc19jaGFyICYmIGhhc19iaXQpCgkgICAgcHJpbnRmICgiQml0bWFwIGV4dHJhIGNoYXIgMHgleFxuIiwgdWNzNCk7CiAgICB9CiNlbmRpZgogICAgaWYgKGZpeGVkX2FkdmFuY2UpCgkqc3BhY2luZyA9IEZDX01PTk87CiAgICBlbHNlIGlmIChkdWFsX2FkdmFuY2UgJiYgQVBQUk9YSU1BVEVMWV9FUVVBTCAoMiAqIEZDX01JTiAoYWR2YW5jZV9vbmUsIGFkdmFuY2VfdHdvKSwgRkNfTUFYIChhZHZhbmNlX29uZSwgYWR2YW5jZV90d28pKSkKICAgICAgICAqc3BhY2luZyA9IEZDX0RVQUw7CiAgICBlbHNlCgkqc3BhY2luZyA9IEZDX1BST1BPUlRJT05BTDsKICAgIHJldHVybiBmY3M7CmJhaWwxOgogICAgRmNDaGFyU2V0RGVzdHJveSAoZmNzKTsKYmFpbDA6CiAgICByZXR1cm4gMDsKfQoKRmNDaGFyU2V0ICoKRmNGcmVlVHlwZUNoYXJTZXQgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcykKewogICAgaW50IHNwYWNpbmc7CgogICAgcmV0dXJuIEZjRnJlZVR5cGVDaGFyU2V0QW5kU3BhY2luZyAoZmFjZSwgYmxhbmtzLCAmc3BhY2luZyk7Cn0KCgojZGVmaW5lIFRUQUdfR1BPUyAgRlRfTUFLRV9UQUcoICdHJywgJ1AnLCAnTycsICdTJyApCiNkZWZpbmUgVFRBR19HU1VCICBGVF9NQUtFX1RBRyggJ0cnLCAnUycsICdVJywgJ0InICkKI2RlZmluZSBUVEFHX1NJTEYgIEZUX01BS0VfVEFHKCAnUycsICdpJywgJ2wnLCAnZicpCiNkZWZpbmUgVFRfRXJyX09rIEZUX0Vycl9PawojZGVmaW5lIFRUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlCiNkZWZpbmUgVFRPX0Vycl9FbXB0eV9TY3JpcHQgICAgICAgICAgICAgIDB4MTAwNQojZGVmaW5lIFRUT19FcnJfSW52YWxpZF9TdWJUYWJsZSAgICAgICAgICAweDEwMDEKCgpzdGF0aWMgdm9pZAphZGR0YWcoRmNDaGFyOCAqY29tcGxleCwgRlRfVUxvbmcgdGFnKQp7CiAgICBGY0NoYXI4IHRhZ3N0cmluZ1sxNV07CiAgICBzcHJpbnRmICh0YWdzdHJpbmcsICJvdGxheW91dDolYyVjJWMlYyAiLAogICAgICAgKHVuc2lnbmVkIGNoYXIpKHRhZyA+PiAyNCksCiAgICAgICAodW5zaWduZWQgY2hhcikoKHRhZyAmIDB4ZmYwMDAwKSA+PiAxNiksCiAgICAgICAodW5zaWduZWQgY2hhcikoKHRhZyAmIDB4ZmYwMCkgPj4gOCksCiAgICAgICAodW5zaWduZWQgY2hhcikodGFnICYgMHhmZikpOwogICAgc3RybmNhdChjb21wbGV4LCB0YWdzdHJpbmcsIDE0KTsKfQoKc3RhdGljIGludApjb21wYXJldWxvbmcgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCnsKICAgIGNvbnN0IEZUX1VMb25nICp1YSA9IChjb25zdCBGVF9VTG9uZyAqKSBhOwogICAgY29uc3QgRlRfVUxvbmcgKnViID0gKGNvbnN0IEZUX1VMb25nICopIGI7CiAgICByZXR1cm4gKnVhIC0gKnViOwp9CgoKc3RhdGljIEZUX0Vycm9yCkdldFNjcmlwdFRhZ3MoRlRfRmFjZSBmYWNlLCBGVF9VTG9uZyB0YWJsZXRhZywgRlRfVUxvbmcgKipzdGFncywgRlRfVVNob3J0ICpzY3JpcHRfY291bnQpCnsKICAgIEZUX1VMb25nICAgICAgICAgY3VyX29mZnNldCwgbmV3X29mZnNldCwgYmFzZV9vZmZzZXQ7CiAgICBUVF9GYWNlICAgICAgICAgIHR0X2ZhY2UgPSAoVFRfRmFjZSlmYWNlOwogICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5zdHJlYW07CiAgICBGVF9FcnJvciAgIGVycm9yOwogICAgRlRfVVNob3J0ICAgICAgICAgIG4sIHA7CiAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwoKICAgIGlmICggIXN0cmVhbSApCglyZXR1cm4gVFRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7CgogICAgaWYgKCggZXJyb3IgPSB0dF9mYWNlLT5nb3RvX3RhYmxlKCB0dF9mYWNlLCB0YWJsZXRhZywgc3RyZWFtLCAwICkgKSkKCXJldHVybiBlcnJvcjsKCiAgICBiYXNlX29mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKCiAgICAvKiBza2lwIHZlcnNpb24gKi8KCiAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBiYXNlX29mZnNldCArIDRMICkgfHwgRlRfRlJBTUVfRU5URVIoIDJMICkgKQoJcmV0dXJuIGVycm9yOwoKICAgIG5ld19vZmZzZXQgPSBGVF9HRVRfVVNIT1JUKCkgKyBiYXNlX29mZnNldDsKCiAgICBGVF9GUkFNRV9FWElUKCk7CgogICAgY3VyX29mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKCiAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBuZXdfb2Zmc2V0ICkgIT0gVFRfRXJyX09rICkKCXJldHVybiBlcnJvcjsKCiAgICBiYXNlX29mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKCiAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCAyTCApICkKCXJldHVybiBlcnJvcjsKCiAgICAqc2NyaXB0X2NvdW50ID0gRlRfR0VUX1VTSE9SVCgpOwoKICAgIEZUX0ZSQU1FX0VYSVQoKTsKCiAgICBpZiAoIEZUX1NFVF9FUlJPUiAoRlRfTUVNX0FMTE9DX0FSUkFZKCAqc3RhZ3MsICpzY3JpcHRfY291bnQsIEZUX1VMb25nICkpICkKCXJldHVybiBlcnJvcjsKCiAgICBwID0gMDsKICAgIGZvciAoIG4gPSAwOyBuIDwgKnNjcmlwdF9jb3VudDsgbisrICkKICAgIHsKCWlmICggRlRfRlJBTUVfRU5URVIoIDZMICkgKQoJICAgIGdvdG8gRmFpbDsKCgkoKnN0YWdzKVtwXSA9IEZUX0dFVF9VTE9ORygpOwoJbmV3X29mZnNldCA9IEZUX0dFVF9VU0hPUlQoKSArIGJhc2Vfb2Zmc2V0OwoKCUZUX0ZSQU1FX0VYSVQoKTsKCgljdXJfb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwoKCWlmICggRlRfU1RSRUFNX1NFRUsoIG5ld19vZmZzZXQgKSApCgkgICAgZ290byBGYWlsOwoKCWlmICggZXJyb3IgPT0gVFRfRXJyX09rICkKCSAgICBwKys7CgllbHNlIGlmICggZXJyb3IgIT0gVFRPX0Vycl9FbXB0eV9TY3JpcHQgKQoJICAgIGdvdG8gRmFpbDsKCgkodm9pZClGVF9TVFJFQU1fU0VFSyggY3VyX29mZnNldCApOwogICAgfQoKICAgIGlmICghcCkKICAgIHsKCWVycm9yID0gVFRPX0Vycl9JbnZhbGlkX1N1YlRhYmxlOwoJZ290byBGYWlsOwogICAgfQoKICAgIC8vIHNvcnQgdGhlIHRhZyBsaXN0IGJlZm9yZSByZXR1cm5pbmcgaXQKICAgIHFzb3J0KCpzdGFncywgKnNjcmlwdF9jb3VudCwgc2l6ZW9mKEZUX1VMb25nKSwgY29tcGFyZXVsb25nKTsKCiAgICByZXR1cm4gVFRfRXJyX09rOwoKRmFpbDoKICAgIEZUX0ZSRUUoICpzdGFncyApOwogICAgcmV0dXJuIGVycm9yOwp9CgpzdGF0aWMgRmNDaGFyOCAqCkZjRm9udENhcGFiaWxpdGllcyhGVF9GYWNlIGZhY2UpCnsKICAgIEZjQm9vbCBpc3NpbGdyYXBoaXRlZm9udCA9IDA7CiAgICBGVF9FcnJvciBlcnI7CiAgICBGVF9VTG9uZyBsZW4gPSAwOwogICAgRlRfVUxvbmcgKmdzdWJ0YWdzPU5VTEwsICpncG9zdGFncz1OVUxMOwogICAgRlRfVVNob3J0IGdzdWJfY291bnQ9MCwgZ3Bvc19jb3VudD0wLCBtYXhzaXplOwogICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5zdHJlYW0tPm1lbW9yeTsKICAgIEZjQ2hhcjggKmNvbXBsZXggPSBOVUxMOwogICAgaW50IGluZHgxID0gMCwgaW5keDIgPSAwOwoKICAgIGVyciA9IEZUX0xvYWRfU2ZudF9UYWJsZShmYWNlLCBUVEFHX1NJTEYsIDAsIDAsICZsZW4pOwogICAgaXNzaWxncmFwaGl0ZWZvbnQgPSAoIGVyciA9PSBGVF9FcnJfT2spOwoKICAgIGVyciA9IEdldFNjcmlwdFRhZ3MoZmFjZSwgVFRBR19HUE9TLCAmZ3Bvc3RhZ3MsICZncG9zX2NvdW50KTsKICAgIGVyciA9IEdldFNjcmlwdFRhZ3MoZmFjZSwgVFRBR19HU1VCLCAmZ3N1YnRhZ3MsICZnc3ViX2NvdW50KTsKICAgIGlmICghaXNzaWxncmFwaGl0ZWZvbnQgJiYgIWdzdWJfY291bnQgJiYgIWdwb3NfY291bnQpCiAgICB7CiAgICAJZ290byBiYWlsOwogICAgfQoKICAgIG1heHNpemUgPSAoKGdwb3NfY291bnQgKyBnc3ViX2NvdW50KSAqIDE1KSArIChpc3NpbGdyYXBoaXRlZm9udCA/IDEzIDogMCk7CiAgICBjb21wbGV4ID0gbWFsbG9jIChzaXplb2YgKEZjQ2hhcjgpICogbWF4c2l6ZSk7CiAgICBpZiAoaXNzaWxncmFwaGl0ZWZvbnQpCiAgICB7CiAgICAgICAgc3RyY3B5KGNvbXBsZXgsICJ0dGFibGU6U2lsZiAiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJjcHkoY29tcGxleCwgIiIpOwogICAgfQoKICAgIHdoaWxlICgoaW5keDEgPCBnc3ViX2NvdW50KSB8fCAoaW5keDIgPCBncG9zX2NvdW50KSkgewoJaWYgKGluZHgxID09IGdzdWJfY291bnQpIHsKCSAgICBhZGR0YWcoY29tcGxleCwgZ3Bvc3RhZ3NbaW5keDJdKTsKCSAgICBpbmR4MisrOwoJfSBlbHNlIGlmICgoaW5keDIgPT0gZ3Bvc19jb3VudCkgfHwgKGdzdWJ0YWdzW2luZHgxXSA8IGdwb3N0YWdzW2luZHgyXSkpIHsKCSAgICBhZGR0YWcoY29tcGxleCwgZ3N1YnRhZ3NbaW5keDFdKTsKCSAgICBpbmR4MSsrOwoJfSBlbHNlIGlmIChnc3VidGFnc1tpbmR4MV0gPT0gZ3Bvc3RhZ3NbaW5keDJdKSB7CgkgICAgYWRkdGFnKGNvbXBsZXgsIGdzdWJ0YWdzW2luZHgxXSk7CgkgICAgaW5keDErKzsKCSAgICBpbmR4MisrOwoJfSBlbHNlIHsKCSAgICBhZGR0YWcoY29tcGxleCwgZ3Bvc3RhZ3NbaW5keDJdKTsKCSAgICBpbmR4MisrOwoJfQogICAgfQogICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfU0NBTlYpCglwcmludGYoImNvbXBsZXggZmVhdHVyZXMgaW4gdGhpcyBmb250OiAlc1xuIiwgY29tcGxleCk7CmJhaWw6CiAgICBGVF9GUkVFKGdzdWJ0YWdzKTsKICAgIEZUX0ZSRUUoZ3Bvc3RhZ3MpOwogICAgcmV0dXJuIGNvbXBsZXg7Cn0K