LyoKICogIENvcHlyaWdodCCpIDIwMDEgRmxhZ2EgaGYuIE1lZGljYWwgRGV2aWNlcywgS+FyaSBEYXbt8HNzb24gPGtkQGZsYWdhLmlzPgogKgogKiAgJElkOiBjZmlfZmxhZ2FkbS5jLHYgMS4xNSAyMDA1LzExLzA3IDExOjE0OjI2IGdsZWl4bmVyIEV4cCAkCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAogKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCiAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCiAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwogKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CgoKLyogV2Ugc3BsaXQgdGhlIGZsYXNoIGNoaXAgdXAgaW50byBmb3VyIHBhcnRzLgogKiAxOiBib290bG9hZGVyIGZpcnRzIDEyOGsJCQkoMHgwMDAwMDAwMCAtIDB4MDAwMUZGRkYpIHNpemUgMHgwMjAwMDAKICogMjoga2VybmVsIDY0MGsJCQkJCSgweDAwMDIwMDAwIC0gMHgwMDBCRkZGRikgc2l6ZSAweDBBMDAwMAogKiAzOiBjb21wcmVzc2VkIDE1MzZrIHJvb3QgcmFtZGlzawkoMHgwMDBDMDAwMCAtIDB4MDAyM0ZGRkYpIHNpemUgMHgxODAwMDAKICogNDogd3JpdGVhYmxlIGRpc2twYXJ0aXRpb24gKGpmZnMpKDB4MDAyNDAwMDAgLSAweDAwM0ZGRkZGKSBzaXplIDB4MUMwMDAwCiAqLwoKI2RlZmluZSBGTEFTSF9QSFlTX0FERFIgMHg0MDAwMDAwMAojZGVmaW5lIEZMQVNIX1NJWkUgMHg0MDAwMDAKCiNkZWZpbmUgRkxBU0hfUEFSVElUSU9OMF9BRERSIDB4MDAwMDAwMDAKI2RlZmluZSBGTEFTSF9QQVJUSVRJT04wX1NJWkUgMHgwMDAyMDAwMAoKI2RlZmluZSBGTEFTSF9QQVJUSVRJT04xX0FERFIgMHgwMDAyMDAwMAojZGVmaW5lIEZMQVNIX1BBUlRJVElPTjFfU0laRSAweDAwMEEwMDAwCgojZGVmaW5lIEZMQVNIX1BBUlRJVElPTjJfQUREUiAweDAwMEMwMDAwCiNkZWZpbmUgRkxBU0hfUEFSVElUSU9OMl9TSVpFIDB4MDAxODAwMDAKCiNkZWZpbmUgRkxBU0hfUEFSVElUSU9OM19BRERSIDB4MDAyNDAwMDAKI2RlZmluZSBGTEFTSF9QQVJUSVRJT04zX1NJWkUgMHgwMDFDMDAwMAoKCnN0cnVjdCBtYXBfaW5mbyBmbGFnYWRtX21hcCA9IHsKCQkubmFtZSA9CQkiRmxhZ2FETSBmbGFzaCBkZXZpY2UiLAoJCS5zaXplID0JCUZMQVNIX1NJWkUsCgkJLmJhbmt3aWR0aCA9CTIsCn07CgpzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBmbGFnYWRtX3BhcnRzW10gPSB7Cgl7CgkJLm5hbWUgPQkJIkJvb3Rsb2FkZXIiLAoJCS5vZmZzZXQJPQlGTEFTSF9QQVJUSVRJT04wX0FERFIsCgkJLnNpemUgPQkJRkxBU0hfUEFSVElUSU9OMF9TSVpFCgl9LAoJewoJCS5uYW1lID0JCSJLZXJuZWwgaW1hZ2UiLAoJCS5vZmZzZXQgPQlGTEFTSF9QQVJUSVRJT04xX0FERFIsCgkJLnNpemUgPQkJRkxBU0hfUEFSVElUSU9OMV9TSVpFCgl9LAoJewoJCS5uYW1lID0JCSJJbml0aWFsIHJhbWRpc2sgaW1hZ2UiLAoJCS5vZmZzZXQgPQlGTEFTSF9QQVJUSVRJT04yX0FERFIsCgkJLnNpemUgPQkJRkxBU0hfUEFSVElUSU9OMl9TSVpFCgl9LAoJewoJCS5uYW1lID0JCSJQZXJzaXN0YW50IHN0b3JhZ2UiLAoJCS5vZmZzZXQgPQlGTEFTSF9QQVJUSVRJT04zX0FERFIsCgkJLnNpemUgPQkJRkxBU0hfUEFSVElUSU9OM19TSVpFCgl9Cn07CgojZGVmaW5lIFBBUlRJVElPTl9DT1VOVCBBUlJBWV9TSVpFKGZsYWdhZG1fcGFydHMpCgpzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKCmludCBfX2luaXQgaW5pdF9mbGFnYWRtKHZvaWQpCnsKCXByaW50ayhLRVJOX05PVElDRSAiRmxhZ2FETSBmbGFzaCBkZXZpY2U6ICV4IGF0ICV4XG4iLAoJCQlGTEFTSF9TSVpFLCBGTEFTSF9QSFlTX0FERFIpOwoKCWZsYWdhZG1fbWFwLnBoeXMgPSBGTEFTSF9QSFlTX0FERFI7CglmbGFnYWRtX21hcC52aXJ0ID0gaW9yZW1hcChGTEFTSF9QSFlTX0FERFIsCgkJCQkJRkxBU0hfU0laRSk7CgoJaWYgKCFmbGFnYWRtX21hcC52aXJ0KSB7CgkJcHJpbnRrKCJGYWlsZWQgdG8gaW9yZW1hcFxuIik7CgkJcmV0dXJuIC1FSU87Cgl9CgoJc2ltcGxlX21hcF9pbml0KCZmbGFnYWRtX21hcCk7CgoJbXltdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZmbGFnYWRtX21hcCk7CglpZiAobXltdGQpIHsKCQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKCQlhZGRfbXRkX3BhcnRpdGlvbnMobXltdGQsIGZsYWdhZG1fcGFydHMsIFBBUlRJVElPTl9DT1VOVCk7CgkJcHJpbnRrKEtFUk5fTk9USUNFICJGbGFnYURNIGZsYXNoIGRldmljZSBpbml0aWFsaXplZFxuIik7CgkJcmV0dXJuIDA7Cgl9CgoJaW91bm1hcCgodm9pZCAqKWZsYWdhZG1fbWFwLnZpcnQpOwoJcmV0dXJuIC1FTlhJTzsKfQoKc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfZmxhZ2FkbSh2b2lkKQp7CglpZiAobXltdGQpIHsKCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGQpOwoJCW1hcF9kZXN0cm95KG15bXRkKTsKCX0KCWlmIChmbGFnYWRtX21hcC52aXJ0KSB7CgkJaW91bm1hcCgodm9pZCAqKWZsYWdhZG1fbWFwLnZpcnQpOwoJCWZsYWdhZG1fbWFwLnZpcnQgPSAwOwoJfQp9Cgptb2R1bGVfaW5pdChpbml0X2ZsYWdhZG0pOwptb2R1bGVfZXhpdChjbGVhbnVwX2ZsYWdhZG0pOwoKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigiS+FyaSBEYXbt8HNzb24gPGtkQGZsYWdhLmlzPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBtYXAgZHJpdmVyIGZvciBGbGFnYSBkaWdpdGFsIG1vZHVsZSIpOwo=