PGh0bWw+Cgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KPHRpdGxlPkN1c3RvbSBQb2ludDwvdGl0bGU+CjwvaGVhZD4KCjxib2R5PgoKPHA+PGZvbnQgZmFjZT0iQ291cmllciBOZXciPi8qPGJyPgpDb3B5cmlnaHQgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbjxicj4KPGJyPgpVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLDxicj4KVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQ8YnI+Cmh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkuPGJyPgoqLzxicj4KI2luY2x1ZGUgJmx0O2Jvb3N0L3BvbHlnb24vcG9seWdvbi5ocHAmZ3Q7PGJyPgojaW5jbHVkZSAmbHQ7Y2Fzc2VydCZndDs8YnI+Cm5hbWVzcGFjZSBndGwgPSBib29zdDo6cG9seWdvbjs8YnI+CnVzaW5nIG5hbWVzcGFjZSBib29zdDo6cG9seWdvbjo6b3BlcmF0b3JzOzxicj48YnI+Ci8vbGV0cyBtYWtlIHRoZSBib2R5IG9mIG1haW4gZnJvbSBwb2ludF91c2FnZS5jcHA8YnI+Ly9hIGdlbmVyaWMgZnVuY3Rpb24gcGFyYW1ldGVyaXplZCBieSBwb2ludCB0eXBlPGJyPnRlbXBsYXRlICZsdDt0eXBlbmFtZSBQb2ludCZndDs8YnI+dm9pZCB0ZXN0X3BvaW50KCkgezxicj4mbmJzcDsgCiZuYnNwOyAvL2NvbnN0cnVjdGluZyBhIGd0bCBwb2ludDxicj4mbmJzcDsgJm5ic3A7IAppbnQgeCA9IDEwOzxicj4mbmJzcDsgJm5ic3A7IAppbnQgeSA9IDIwOzxicj4mbmJzcDsgJm5ic3A7IAovL1BvaW50IHB0KHgsIHkpOzxicj4mbmJzcDsgJm5ic3A7IApQb2ludCBwdCA9IGd0bDo6Y29uc3RydWN0Jmx0O1BvaW50Jmd0Oyh4LCB5KTs8YnI+Jm5ic3A7ICZuYnNwOyAKYXNzZXJ0KGd0bDo6eChwdCkgPT0gMTApOzxicj4mbmJzcDsgJm5ic3A7IAphc3NlcnQoZ3RsOjp5KHB0KSA9PSAyMCk7PGJyPiZuYnNwOyAmbmJzcDsgCjxicj4mbmJzcDsgJm5ic3A7IAovL2EgcXVpY2sgcHJpbWVyIGluIGlzb3Ryb3BpYyBwb2ludCBhY2Nlc3M8YnI+Jm5ic3A7ICZuYnNwOyAKdHlwZWRlZiBndGw6Om9yaWVudGF0aW9uXzJkIE87PGJyPiZuYnNwOyAmbmJzcDsgCnVzaW5nIGd0bDo6SE9SSVpPTlRBTDs8YnI+Jm5ic3A7ICZuYnNwOyAKdXNpbmcgZ3RsOjpWRVJUSUNBTDs8YnI+Jm5ic3A7ICZuYnNwOyAKTyBvID0gSE9SSVpPTlRBTDs8YnI+Jm5ic3A7ICZuYnNwOyAKYXNzZXJ0KGd0bDo6eChwdCkgPT0gZ3RsOjpnZXQocHQsIG8pKTs8YnI+Jm5ic3A7ICZuYnNwOyAKPGJyPiZuYnNwOyAmbmJzcDsgCm8gPSBvLmdldF9wZXJwZW5kaWN1bGFyKCk7PGJyPiZuYnNwOyAmbmJzcDsgCmFzc2VydChvID09IFZFUlRJQ0FMKTs8YnI+Jm5ic3A7ICZuYnNwOyAKYXNzZXJ0KGd0bDo6eShwdCkgPT0gZ3RsOjpnZXQocHQsIG8pKTs8YnI+Jm5ic3A7ICZuYnNwOyAKPGJyPiZuYnNwOyAmbmJzcDsgCmd0bDo6c2V0KHB0LCBvLCAzMCk7PGJyPiZuYnNwOyAmbmJzcDsgCmFzc2VydChndGw6OnkocHQpID09IDMwKTs8YnI+Jm5ic3A7ICZuYnNwOyAKPGJyPiZuYnNwOyAmbmJzcDsgCi8vdXNpbmcgc29tZSBvZiB0aGUgbGlicmFyeSBmdW5jdGlvbnM8YnI+Jm5ic3A7ICZuYnNwOyAKLy9Qb2ludCBwdDIoMTAsIDMwKTs8YnI+Jm5ic3A7ICZuYnNwOyAKUG9pbnQgcHQyID0gZ3RsOjpjb25zdHJ1Y3QmbHQ7UG9pbnQmZ3Q7KDEwLCAzMCk7PGJyPiZuYnNwOyAmbmJzcDsgCmFzc2VydChndGw6OmVxdWl2YWxlbmNlKHB0LCBwdDIpKTs8YnI+Jm5ic3A7ICZuYnNwOyAKPGJyPiZuYnNwOyAmbmJzcDsgCmd0bDo6dHJhbnNmb3JtYXRpb24mbHQ7aW50Jmd0OyB0cihndGw6OmF4aXNfdHJhbnNmb3JtYXRpb246OlNXQVBfWFkpOzxicj4mbmJzcDsgJm5ic3A7IApndGw6OnRyYW5zZm9ybShwdCwgdHIpOzxicj4mbmJzcDsgJm5ic3A7IAphc3NlcnQoZ3RsOjplcXVpdmFsZW5jZShwdCwgZ3RsOjpjb25zdHJ1Y3QmbHQ7UG9pbnQmZ3Q7KDMwLCAxMCkpKTs8YnI+Jm5ic3A7ICZuYnNwOyAKPGJyPiZuYnNwOyAmbmJzcDsgCmd0bDo6dHJhbnNmb3JtYXRpb24mbHQ7aW50Jmd0OyB0cjIgPSB0ci5pbnZlcnNlKCk7PGJyPiZuYnNwOyAmbmJzcDsgCmFzc2VydCh0ciA9PSB0cjIpOyAvL1NXQVBfWFkgaXMgaXRzIG93biBpbnZlcnNlIHRyYW5zZm9ybTxicj4mbmJzcDsgJm5ic3A7IAo8YnI+Jm5ic3A7ICZuYnNwOyAKZ3RsOjp0cmFuc2Zvcm0ocHQsIHRyMik7PGJyPiZuYnNwOyAmbmJzcDsgCmFzc2VydChndGw6OmVxdWl2YWxlbmNlKHB0LCBwdDIpKTsgLy90aGUgdHdvIHBvaW50cyBhcmUgZXF1YWwgYWdhaW48YnI+Jm5ic3A7ICZuYnNwOyAKPGJyPiZuYnNwOyAmbmJzcDsgCmd0bDo6bW92ZShwdCwgbywgMTApOyAvL21vdmUgcHQgMTAgdW5pdHMgaW4geTxicj4mbmJzcDsgJm5ic3A7IAphc3NlcnQoZ3RsOjpldWNsaWRlYW5fZGlzdGFuY2UocHQsIHB0MikgPT0gMTAuMGYpOzxicj4mbmJzcDsgJm5ic3A7IAo8YnI+Jm5ic3A7ICZuYnNwOyAKZ3RsOjptb3ZlKHB0LCBvLmdldF9wZXJwZW5kaWN1bGFyKCksIDEwKTsgLy9tb3ZlIHB0IDEwIHVuaXRzIGluIHg8YnI+Jm5ic3A7ICZuYnNwOyAKYXNzZXJ0KGd0bDo6bWFuaGF0dGFuX2Rpc3RhbmNlKHB0LCBwdDIpID09IDIwKTs8YnI+fTxicj4mbmJzcDsgJm5ic3A7IAo8YnI+Ly9Ob3cgbGV0cyBkZWNsYXJlIG91ciBvd24gcG9pbnQgdHlwZTxicj4vL0JqYXJuZSBzYXlzIHRoYXQgaWYgYSBjbGFzcyBkb2Vzbid0IG1haW50YWluIGFuPGJyPi8vaW52YXJpYW50IGp1c3QgdXNlIGEgc3RydWN0Ljxicj5zdHJ1Y3QgQ1BvaW50IHs8YnI+Jm5ic3A7ICZuYnNwOyAKaW50IHg7PGJyPiZuYnNwOyAmbmJzcDsgCmludCB5Ozxicj59Ozxicj4mbmJzcDsgJm5ic3A7IAo8YnI+Ly9UaGVyZSwgbmljZSBhIHNpbXBsZS4uLmJ1dCB3YWl0LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nPGJyPi8vaG93IGRvIHdlIHVzZSBpdCB0byBkbyBhbGwgdGhlIHRoaW5ncyBhIHBvaW50IG5lZWRzIHRvIGRvPzxicj4mbmJzcDsgJm5ic3A7IAo8YnI+Jm5ic3A7ICZuYnNwOyAKPGJyPi8vRmlyc3Qgd2UgcmVnaXN0ZXIgaXQgYXMgYSBwb2ludCB3aXRoIGJvb3N0IHBvbHlnb248YnI+bmFtZXNwYWNlIGJvb3N0IHsgCm5hbWVzcGFjZSBwb2x5Z29uIHs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IAp0ZW1wbGF0ZSAmbHQ7Jmd0Ozxicj4mbmJzcDsgJm5ic3A7IApzdHJ1Y3QgZ2VvbWV0cnlfY29uY2VwdCZsdDtDUG9pbnQmZ3Q7IHsgdHlwZWRlZiBwb2ludF9jb25jZXB0IHR5cGU7IH07PGJyPiZuYnNwOzxicj4mbmJzcDsgJm5ic3A7IAo8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vVGhlbiB3ZSBzcGVjaWFsaXplIHRoZSBndGwgcG9pbnQgdHJhaXRzIGZvciBvdXIgcG9pbnQgdHlwZTxicj4mbmJzcDsgJm5ic3A7IAp0ZW1wbGF0ZSAmbHQ7Jmd0Ozxicj4mbmJzcDsgJm5ic3A7IApzdHJ1Y3QgcG9pbnRfdHJhaXRzJmx0O0NQb2ludCZndDsgezxicj4mbmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IAp0eXBlZGVmIGludCBjb29yZGluYXRlX3R5cGU7PGJyPiZuYnNwOyAmbmJzcDsgCjxicj4mbmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IApzdGF0aWMgaW5saW5lIGNvb3JkaW5hdGVfdHlwZSBnZXQoY29uc3QgQ1BvaW50JmFtcDsgcG9pbnQsIDxicj4mbmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IApvcmllbnRhdGlvbl8yZCBvcmllbnQpIHs8YnI+Jm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKaWYob3JpZW50ID09IEhPUklaT05UQUwpPGJyPiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCnJldHVybiBwb2ludC54Ozxicj4mbmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IApyZXR1cm4gcG9pbnQueTs8YnI+Jm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKfTxicj4mbmJzcDsgJm5ic3A7IAp9Ozxicj4mbmJzcDsgJm5ic3A7IAo8YnI+Jm5ic3A7ICZuYnNwOyAKdGVtcGxhdGUgJmx0OyZndDs8YnI+Jm5ic3A7ICZuYnNwOyAKc3RydWN0IHBvaW50X211dGFibGVfdHJhaXRzJmx0O0NQb2ludCZndDsgezxicj4mbmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IApzdGF0aWMgaW5saW5lIHZvaWQgc2V0KENQb2ludCZhbXA7IHBvaW50LCBvcmllbnRhdGlvbl8yZCBvcmllbnQsIGludCB2YWx1ZSkgezxicj4mbmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IAppZihvcmllbnQgPT0gSE9SSVpPTlRBTCk8YnI+Jm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKcG9pbnQueCA9IHZhbHVlOzxicj4mbmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IAplbHNlPGJyPiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCnBvaW50LnkgPSB2YWx1ZTs8YnI+Jm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKfTxicj4mbmJzcDsgJm5ic3A7IAombmJzcDsgJm5ic3A7IApzdGF0aWMgaW5saW5lIENQb2ludCBjb25zdHJ1Y3QoaW50IHhfdmFsdWUsIGludCB5X3ZhbHVlKSB7PGJyPiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCkNQb2ludCByZXR2YWw7PGJyPiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCiZuYnNwOyAmbmJzcDsgCnJldHZhbC54ID0geF92YWx1ZTs8YnI+Jm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKcmV0dmFsLnkgPSB5X3ZhbHVlOyA8YnI+Jm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKcmV0dXJuIHJldHZhbDs8YnI+Jm5ic3A7ICZuYnNwOyAKJm5ic3A7ICZuYnNwOyAKfTxicj4mbmJzcDsgJm5ic3A7IAp9Ozxicj59IH08YnI+Jm5ic3A7ICZuYnNwOyAKPGJyPi8vTm93IGxldHMgc2VlIGlmIHRoZSBDUG9pbnQgd29ya3Mgd2l0aCB0aGUgbGlicmFyeSBmdW5jdGlvbnM8YnI+aW50IG1haW4oKSB7PGJyPiZuYnNwOyAmbmJzcDsgCnRlc3RfcG9pbnQmbHQ7Q1BvaW50Jmd0OygpOyAvL3lheSEgQWxsIHlvdXIgdGVzdGluZyBpcyBkb25lIGZvciB5b3UuPGJyPiZuYnNwOyAmbmJzcDsgCnJldHVybiAwOzxicj59PGJyPiZuYnNwOyAmbmJzcDsgCjxicj4vL05vdyB5b3Uga25vdyBob3cgdG8gbWFwIGEgdXNlciB0eXBlIHRvIHRoZSBsaWJyYXJ5IHBvaW50IGNvbmNlcHQ8YnI+Ly9hbmQgaG93IHRvIHdyaXRlIGEgZ2VuZXJpYyBmdW5jdGlvbiBwYXJhbWV0ZXJpemVkIGJ5IHBvaW50IHR5cGU8YnI+Ly91c2luZyB0aGUgbGlicmFyeSBpbnRlcmZhY2VzIHRvIGFjY2VzcyBpdC48YnI+Jm5ic3A7ICZuYnNwOyAKJm5ic3A7PC9mb250PjwvcD4KCgo8dGFibGUgY2xhc3M9ImRvY2luZm8iIHJ1bGVzPSJub25lIiBmcmFtZT0idm9pZCIgaWQ9InRhYmxlMSI+Cgk8Y29sZ3JvdXA+CgkJPGNvbCBjbGFzcz0iZG9jaW5mby1uYW1lIj48Y29sIGNsYXNzPSJkb2NpbmZvLWNvbnRlbnQiPgoJPC9jb2xncm91cD4KCTx0Ym9keSB2QWxpZ249InRvcCI+CgkJPHRyPgoJCQk8dGggY2xhc3M9ImRvY2luZm8tbmFtZSI+Q29weXJpZ2h0OjwvdGg+CgkJCTx0ZD5Db3B5cmlnaHQgqSBJbnRlbCBDb3Jwb3JhdGlvbiAyMDA4LTIwMTAuPC90ZD4KCQk8L3RyPgoJCTx0ciBjbGFzcz0iZmllbGQiPgoJCQk8dGggY2xhc3M9ImRvY2luZm8tbmFtZSI+TGljZW5zZTo8L3RoPgoJCQk8dGQgY2xhc3M9ImZpZWxkLWJvZHkiPkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCAKCQkJVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgPHR0IGNsYXNzPSJsaXRlcmFsIj4KCQkJPHNwYW4gY2xhc3M9InByZSI+TElDRU5TRV8xXzAudHh0PC9zcGFuPjwvdHQ+IG9yIGNvcHkgYXQKCQkJPGEgY2xhc3M9InJlZmVyZW5jZSIgdGFyZ2V0PSJfdG9wIiBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPgoJCQlodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvdGQ+CgkJPC90cj4KPC90YWJsZT4KCjwvYm9keT4KCjwvaHRtbD4K