LyoqCiogQGZpbGUgTWFpbmN0bF9tc2cuaAoqIEBicmllZiDM4bmp1ve/2KGizfjC58/gudjP+8+ivdO/2goqCiogQ29weXJpZ2h0IChDKSAyMDE3IFNhbmVjaGlwcyBUZWNobm9sb2d5IENvLiwgTHRkLgoqIEBhdXRob3IgTGlueHUgR2ViaW4KKgoqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgX19NQUlOQ1RSTF9NU0dfSF9fCiNkZWZpbmUgX19NQUlOQ1RSTF9NU0dfSF9fCgojaW5jbHVkZSAibWVzc2FnZS5oIgoKLyoqCiogQGJyaWVmILao0uXW97/Yz/vPogoqIEBwYXJhbSBNU0dfQ01EX1JFU0VUX1JFUVVFU1Qgu9a4tLP2s6fJ6NbDx+vH8woqIEBwYXJhbSBNU0dfQ01EX1BPV0VST0ZGX1JFUVVFU1Qgudi7+sfrx/MKKiBAcGFyYW0gTVNHX0NNRF9SRVNUQVJUX1JFUVVFU1Qg1tjG9Mfrx/MKKiBAcGFyYW0gTVNHX0NNRF9ORVRfSVBQT1JUX0ZJTFRFUiC3wLvwx70ttsu/2rn9wsvP+8+iCiogQHBhcmFtIE1TR19DTURfTkVUX0lQUE9SVF9GT1JXQVJEILfAu/DHvS22y7/a16q3os/7z6IKKiBAcGFyYW0gTVNHX0NNRF9ORVRfRE1aILfAu/DHvS1ETVrP+8+iCiogQHBhcmFtIE1TR19DTURfTkVUX0lQUE9SVF9NQVBQSU5HILfAu/DHvS22y7/a07PJ5M/7z6IKKiBAcGFyYW0gTVNHX0NNRF9ORVRfVVBOUCC3wLvwx70tVVBOUM/7z6IKKiBAcGFyYW0gTVNHX0NNRF9ORVRfVVJMX0ZJTFRFUiC3wLvwx70tVVJMuf3Cy8/7z6IKKiBAcGFyYW0gTVNHX0NNRF9ORVRfTVRVIE1UVc/gudjF5NbDz/vPogoqIEBwYXJhbSBNU0dfQ01EX05FVF9TVEFUSUNfREhDUCBESENQtdjWt7PY1tC1xL6yzKxJUM/gudjJ6NbDz/vPogoqIEBwYXJhbSBNU0dfQ01EX05FVF9QTFVHSU4gyMiy5bDOyeixuLLlyOvP+8+iCiogQHBhcmFtIE1TR19DTURfTkVUX1BMVUdPVVQgyMiy5bDOyeixuLDOs/bP+8+iCiogQHBhcmFtIE1TR19DTURfTkVUX0NPTk5FQ1Qgcmo0NbrNd2lmabXIyeixuMGsvdPN+MLnz/vPogoqIEBwYXJhbSBNU0dfQ01EX05FVF9ESVNDT04gcmo0NbrNd2lmabXIyeixuLbPv6rN+MLnz/vPogoqIEBwYXJhbSBNU0dfQ01EX05FVF9QRFBfQUNUIHBkcLyku+7P+8+iCiogQHBhcmFtIE1TR19DTURfTkVUX1BEUF9ERUFDVCBwZHDIpbyku+7P+8+iCiogQHBhcmFtIE1TR19DTURfTkVUX1RDX0NUUkwgwffBv7/Y1sbP+8+iCiogQHBhcmFtIE1TR19DTURfTkVUX0dFVF9IT1NUTkFNRSDQ3rjEvdPI68nosbi1xGhvc3RuYW1lz/vPogoqIEBwYXJhbSBNU0dfQ01EX05FVF9CSU5EX1NUQVRJQ19BRERSRVNTIL6yzKy12Na3sPO2qM/7z6IKKiBAcGFyYW0gTVNHX0NNRF9ORVRfQklORF9TVEFUSUNfQUREUkVTU19BREQgzO28076yzKy12Na3sPO2qM/7z6IKKiBAcGFyYW0gTVNHX0NNRF9ORVRfQklORF9TVEFUSUNfQUREUkVTU19ERUwgyb6z/b6yzKy12Na3sPO2qM/7z6IKKiBAcGFyYW0gTVNHX0NNRF9ORVRfUElOR19ESUFHTk9TVElDUyBwaW5n1e+2z7LZ1/fP+8+iCiogQHBhcmFtIE1TR19DTURfTkVUX0RIQ1BfU0VUVElOR19SRVEgREhDUMno1sPH68fzz/vPogoqLwojaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUwovKtb3v9jP4LnYz/vPosP8we4qLwp0eXBlZGVmIGVudW0gewoJLyrW97/Yv9jWxs/gudgqLwoJTVNHX0NNRF9NQUlOQ1RSTF9CRUcgPSBNU0dfQ01EX01BSU5DVFJMX0JBU0UsCgoJLyog1ve/2MrVtb3H68fzuvOjrM2o1qrQ6NKqtcTEo7/p1/bP4NOmstnX96OsytW1vbXExKO/6bHY0Ou72Li0cmVzdWx0CgkgICog1ve/2MrVtb3L+dPQcmVzdWx0uvPU2da00NDX7rrztcSy2df3KLGjtOZOVqOs1tjG9KGiudi7+qGicmVzZXS1yCkKCSAgKi8KCU1TR19DTURfUkVTRVRfUkVRVUVTVCwgICAgICAgICAgICAgICAvKsfrx/O71ri0s/azp8no1sMgMjExRCwgss7K/TrO3iAqLwoJTVNHX0NNRF9QT1dFUk9GRl9SRVFVRVNULCAgICAgICAgICAgIC8qx+vH87nYu/oyMTFFLCCyzsr9Os7eICovCglNU0dfQ01EX1JFU1RBUlRfUkVRVUVTVCwgICAgICAgICAgICAgLyrH68fz1tjG9DIxMUYsILLOyv06zt4gKi8KCU1TR19DTURfUkVTRVRfTk9USUZZLCAgICAgICAgICAgICAgICAvKs2o1qq71ri0s/azp8no1sMyMTIwLCCyzsr9Os7eLCC0psDtxKO/6bHY0Ou72Li0TVNHX0NNRF9SRVNFVF9SU1AgKi8KCU1TR19DTURfUE9XRVJPRkZfTk9USUZZLCAgICAgICAgICAgICAvKs2o1qq52Lv6MjEyMSwgss7K/TrO3iwgtKbA7cSjv+mx2NDru9i4tE1TR19DTURfUE9XRVJPRkZfUlNQICovCglNU0dfQ01EX1JFU1RBUlRfTk9USUZZLCAgICAgICAgICAgICAgLyrNqNaq1tjG9DIxMjIsILLOyv06zt4sILSmwO3Eo7/psdjQ67vYuLRNU0dfQ01EX1JFU1RBUlRfUlNQICovCglNU0dfQ01EX1JFU0VUX1JTUCwgICAgICAgICAgICAgICAgICAgLyq71ri0s/azp8no1sO72Li0z/vPoiwgss7K/TrO3iAqLwoJTVNHX0NNRF9QT1dFUk9GRl9SU1AsICAgICAgICAgICAgICAgIC8qudi7+sno1sO94bn7u9i4tM/7z6IsILLOyv06zt4gKi8KCU1TR19DTURfUkVTVEFSVF9SU1AsICAgICAgICAgICAgICAgICAvKtbYxvTJ6NbDveG5+7vYuLTP+8+iLCCyzsr9Os7eICovCgoJLy/N+MLnz+C52AoJTVNHX0NNRF9ORVRfSVBQT1JUX0ZJTFRFUiwgICAgICAgICAgIC8qt8C78Me9LbbLv9q5/cLLLCCyzsr9Os7eLCDQ6NKqt6LLzcewyejWw8/gudhOViwgvPtOVrHtICovCglNU0dfQ01EX05FVF9JUFBPUlRfRk9SV0FSRCwgICAgICAgICAgLyq3wLvwx70ttsu/2teqt6IsILLOyv06zt4sINDo0qq3osvNx7DJ6NbDz+C52E5WLCC8+05Wse0gKi8KCU1TR19DTURfTkVUX0RNWiwgICAgICAgICAgICAgICAgICAgICAvKrfAu/DHvS1ETVosICAgICAgss7K/TrO3iwg0OjSqreiy83HsMno1sPP4LnYTlYsILz7Tlax7SAqLwoJTVNHX0NNRF9ORVRfSVBQT1JUX01BUFBJTkcsICAgICAgICAgIC8qt8C78Me9LbbLv9rTs8nkLCCyzsr9Os7eLCDQ6NKqt6LLzcewyejWw8/gudhOViwgvPtOVrHtICovCglNU0dfQ01EX05FVF9VUE5QLCAgICAgICAgICAgICAgICAgICAgLyp1cG5wLCCyzsr9Os7eLCDQ6NKqt6LLzcewyejWw8/gudhOViwgvPtOVrHtICovCglNU0dfQ01EX05FVF9VUkxfRklMVEVSLCAgICAgICAgICAgICAgLyq3wLvwx70tVVJMuf3Cyywgss7K/TrO3iwg0OjSqreiy83HsMno1sPP4LnYTlYsILz7Tlax7SwgsrvWp7PWSFRUUFMgKi8KCU1TR19DTURfTkVUX01UVSwgICAgICAgICAgICAgICAgICAgICAvKk1UVc/gudjF5NbDLCCyu7T4ss7K/aOs0OjSqreiy83HsMno1sNOViBtdHXWtSAqLwoJTVNHX0NNRF9ORVRfU1RBVElDX0RIQ1AsICAgICAgICAgICAgIC8qREhDULXY1rez2NbQtcS+ssysSVDP4LnYyejWwywgss7K/TrO3iwg0OjSqreiy83HsMno1sPP4LnYTlYsILz7Tlax7SAqLwoJTVNHX0NNRF9ORVRfUExVR0lOLCAgICAgICAgICAgICAgICAgIC8qyMiy5bDOyeixuLLlyOujrLmpbmV0ZGV2X3BsdWdpbl9wcm9jX2J5bmFtZS9uZXRkZXZfcGx1Z2luX3Byb2PKudPDICovCglNU0dfQ01EX05FVF9QTFVHT1VULCAgICAgICAgICAgICAgICAgLyrIyLLlsM7J6LG4sM6z9qOsualuZXRkZXZfcGx1Z291dF9wcm9jX2J5bmFtZS9uZXRkZXZfcGx1Z291dF9wcm9jyrnTwyAqLwoJTVNHX0NNRF9ORVRfQ09OTkVDVCwgICAgICAgICAgICAgICAgIC8qcmo0NbrNd2lmabXIyeixuMGsvdPN+MLno6y5qW5ldGRldl9jb25uZWN0X2ludGVybmV0yrnTwyAqLwoJTVNHX0NNRF9ORVRfRElTQ09OLCAgICAgICAgICAgICAgICAgIC8qcmo0NbrNd2lmabXIyeixuLbPv6rN+MLno6y5qW5ldGRldl9kaXNjb25uZWN0X2ludGVybmV0yrnTwyAqLwoJTVNHX0NNRF9ORVRfUERQX0FDVCwgICAgICAgICAgICAgICAgIC8qcGRwvKS77iy5qXBkcF9hY3RfcHJvY8q508MgKi8KCU1TR19DTURfTkVUX1BEUF9ERUFDVCwgICAgICAgICAgICAgICAvKnBkcMilvKS77iy5qXBkcF9kZWFjdF9wcm9jyrnTwyAqLwoJTVNHX0NNRF9ORVRfVENfQ1RSTCwgICAgICAgICAgICAgICAgIC8qwffBv7/Y1sYsual0Y19jb250cm9syrnTwyAqLwoJTVNHX0NNRF9ORVRfR0VUX0hPU1ROQU1FLCAgICAgICAgICAgIC8q0N64xL3TyOvJ6LG4tcRob3N0bmFtZSwgss7K/TpzdHJ1Y3QgbWFjX2hvc3RuYW1lX2luZm8gKi8KCU1TR19DTURfTkVUX0JJTkRfU1RBVElDX0FERFJFU1MsICAgICAvKr6yzKy12Na3sPO2qCwgss7K/TrO3iDQ6NKqt6LLzcewyejWw8/gudhOViwgvPtOVrHtICovCglNU0dfQ01EX05FVF9CSU5EX1NUQVRJQ19BRERSRVNTX0FERCwgLyrM7bzTvrLMrLXY1rew87aoLCCyzsr9OiBzdHJ1Y3Qgc3RhdGljX21hY2lwX2luZm8gKi8KCU1TR19DTURfTkVUX0JJTkRfU1RBVElDX0FERFJFU1NfREVMLCAvKsm+s/2+ssystdjWt7DztqgsILLOyv06IG1hY7XY1rcgKi8KCU1TR19DTURfTkVUX1BJTkdfRElBR05PU1RJQ1MsCQkgLypwaW5n1e+2z7LZ1/csILLOyv06zt4sINDo0qq3osvNx7DJ6NbDz+C52E5WLCC8+05Wse0gKi8KCglNU0dfQ01EX05FVF9ESENQX1NFVFRJTkdfUkVRLCAgICAgICAgLyrN+MLnREhDULv5tKGyzsr9xeTWw8frx/MqLwoJTVNHX0NNRF9ORVRfREhDUF9TRVRUSU5HX1JTUCwgICAgICAgIC8qzfjC50RIQ1C7+bShss7K/cXk1sO72Li0Ki8KCiNpZiAoTU9ERU1fVFlQRSA9PSB2ZWhpY2xlX2RjKQoJTVNHX0NNRF9ORVRfRklSRVdBTExfQUREX1JFUSwJCSAvKsXk1sO3wLvwx72juta4tqhJULK71MrQ7bfDzsrJ6LG4Ki8KCU1TR19DTURfTkVUX0ZJUkVXQUxMX0RFTF9SRVEsCQkgLyrJvrP9t8C78Me9o7rWuLaoSVCyu9TK0O23w87KyeixuCovCglNU0dfQ01EX05FVF9GSVJFV0FMTF9DTEVBTlVQX1JFUSwJIC8qx+Wz/sv509DS0bfAu/DHvaO61ri2qElQsrvUytDtt8POysnosbgqLwojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0g0tTPwsrHxNqyv8q508PP+8+iIC0tLS0tLS0tLS0tLS0tLS0gKi8KCU1TR19DTURfTkVUX1dBTjRfQ0hBTkdFLCAgICAgICAgICAgICAvKmlwdjTN4s34v9q3osn6seS7rywgss7K/TrO3iAqLwoJTVNHX0NNRF9ORVRfV0FONl9DSEFOR0UsICAgICAgICAgICAgIC8qaXB2Ns3izfi/2reiyfqx5LuvLCCyzsr9Os7eICovCglNU0dfQ01EX05FVF9USU1FUl9ERUwsICAgICAgICAgICAgICAgLyrJvrP9tqjKscb3stnX9ywgss7K/TrN4s34v9rA4NDNZXRod2FuoaJ3aWZpd2FuICovCglNU0dfQ01EX05FVF9USU1FUl9PVVQsICAgICAgICAgICAgICAgLyq2qMqxxvezrMqxstnX9ywgss7K/TrJ6LG4ZGV2X0lEICovCglNU0dfQ01EX05FVF9TRVRfUko0NV9MQU4sICAgICAgICAgICAgLyq9q3JqNDXJ6NbDzqrE2s34v9osILLOyv06zt4gKi8KCU1TR19DTURfTkVUX0FERF9DSElMRFJFTl9ERVZJQ0UsICAgICAvKrzSs6TEo8q9uabE3NbQLCDM7bzTyeixuLW9tvnNr9fpyeixuCwgss7K/Togc3RydWN0IG1hY19ob3N0bmFtZV9pbmZvKi8KCU1TR19DTURfTkVUX0RFTF9DSElMRFJFTl9ERVZJQ0UsICAgICAvKrzSs6TEo8q9uabE3NbQLCDJvrP9tvnNr9fpyeixuCwgss7K/TogbWFjtdjWtyAqLwoJTVNHX0NNRF9ORVRfQUREX1dISVRFX1NJVEUsICAgICAgICAgIC8qvNKzpMSjyr25psTc1tAsIMztvNPN+NW+tb2w18P7taUsILLOyv06IHN0cnVjdCB3aGl0ZV9zaXRlX2luZm8gKi8KCU1TR19DTURfTkVUX1JFTU9WRV9XSElURV9TSVRFLCAgICAgICAvKrzSs6TEo8q9uabE3NbQLCDJvrP9sNfD+7Wl1tC1xM341rcsILLOyv06ILDXw/u1pc341b4gKi8KCU1TR19DTURfTkVUX1NUQVJUX05PTkVULCAgICAgICAgICAgICAvKrzSs6TEo8q9uabE3NbQLCC9+9a5yc/N+MqxvOS/qsq8LCCyzsr9Os7eLCDQ6NKqt6LLzcewyejWw8/gudhOViwgvPtOVrHtICovCglNU0dfQ01EX05FVF9TVE9QX05PTkVULCAgICAgICAgICAgICAgLyq80rOkxKPKvbmmxNzW0KOsvfvWucnPzfjKsbzkveHK+Cwgss7K/TrO3iwg0OjSqreiy83HsMno1sPP4LnYTlYsILz7Tlax7SAqLwoJTVNHX0NNRF9ORVRfV0FOX0RJQUxfRkFJTCwgICAgICAgICAgIC8qzajWqs3izfi/2sGqzfizrMqxLCCyzsr9Os7eICovCglNU0dfQ01EX1NFQ1VSSVRZX0xPR19TQVZFLCAgICAgICAgICAgICAgICAvKrCyyKvI1da+tOa0oiwgss7K/TrI1da+19a3+7SucyAqLwp9IGVtTVNHX0NNRF9NYWluQ3RybDsKI2VuZGlmCgovKiogKiBAYnJpZWYgZGhjcLf+zvHG99DFz6IKICogQHBhcmFtIGxhbl9pcCAgICAgICAgzfi52GlwCiAqIEBwYXJhbSBsYW5fbmV0bWFzayAgINHawusKICogQHBhcmFtIGRoY3BfZW5hYmxlZCAgZGhjcCC3/s7xxvfKucTcserWvgogKiBAcGFyYW0gZGNocF9zdGFydCAgICBkaGNwILXY1rez2Mbwyry12Na3CiAqIEBwYXJhbSBkY2hwX2VuZCAgICAgIGRoY3AgtdjWt7PYveHK+LXY1rcKICogQHBhcmFtIGRjaHBfZG5zICAgICAgZG5ztdjWtwogKiBAcGFyYW0gZGNocF9sZWFzZSAgICBkaGNw1+LUvM7EvP4KICovCnR5cGVkZWYgc3RydWN0IHsKCWNoYXIgbGFuX2lwW1NPRlRBUF9JUF9NQVhfTEVOXTsKCWNoYXIgbGFuX25ldG1hc2tbU09GVEFQX0lQX01BWF9MRU5dOwoJaW50ICBkaGNwX2VuYWJsZWQ7CgljaGFyIGRoY3Bfc3RhcnRbU09GVEFQX0lQX01BWF9MRU5dOwoJY2hhciBkaGNwX2VuZFtTT0ZUQVBfSVBfTUFYX0xFTl07CgljaGFyIGRoY3BfZG5zW1NPRlRBUF9JUF9NQVhfTEVOXTsKCWNoYXIgZGhjcF9sZWFzZVtTT0ZUQVBfU1RSX0xFTl8xNl07Cn0gZGhjcF9zZXR0aW5nX3JlcTsKCi8qKiAqIEBicmllZiByZXN0YXJ0IHJlcXVlc3QgbWVzc2FnZSBpbmZvCiAqIEBwYXJhbSBhY3Rpb24gICAgICAgIHJlc3RhcnQgb3IgcmVzZXQKICogQHBhcmFtIHN1YmFjdHVvbiAgIGZpbmFsbHkgcmVhbGl6ZWQgYnkgTUNVIG9yIG1haW5DdHJsCiAqLwp0eXBlZGVmIHN0cnVjdCB7CglpbnQgYWN0aW9uOwoJaW50IHN1YmFjdGlvbjsKfSByZXN0YXJ0X2luZm87Cgp0eXBlZGVmIGVudW0gewoJUmVzdGFydF9BY3Rpb25fUkVTVEFSVCA9IDAsCglSZXN0YXJ0X0FjdGlvbl9SRVNFVCwKfSBlbUFDVElPTl9SRVNUQVJUX01haW5DdHJsOwoKdHlwZWRlZiBlbnVtIHsKCU9wZXJhdGVfQnlfTUNVID0gMCwKCU9wZXJhdGVfQnlfU09DLAp9IGVtU1VCQUNUSU9OX1JFU1RBUlRfTWFpbkN0cmw7CgoKI2VuZGlmCg==