From 4b5dd81ec26f55d1ef6e80639a7a147771981e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 9 Jun 2020 19:57:17 +0200 Subject: [PATCH] proto97: Make loading blobs dynamically dependent on opened USB device So we can support both 90 and 97 together --- proto97/blobs.py | 445 ++---------------------------------------- proto97/blobs_90.py | 368 +++++++++++++++++++++++++++++++++++ proto97/blobs_97.py | 459 ++++++++++++++++++++++++++++++++++++++++++++ proto97/tls.py | 1 + proto97/usb.py | 39 +--- 5 files changed, 859 insertions(+), 453 deletions(-) create mode 100644 proto97/blobs_90.py create mode 100644 proto97/blobs_97.py diff --git a/proto97/blobs.py b/proto97/blobs.py index 1386408..2de6c48 100644 --- a/proto97/blobs.py +++ b/proto97/blobs.py @@ -1,430 +1,27 @@ +from enum import Enum, auto -from .util import unhex +class Blobs(Enum): + init_hardcoded = auto() + init_hardcoded_clean_slate = auto() + reset_blob = auto() + db_write_enable = auto() + identify_prg = auto() + enroll_prg = auto() + calibrate_prg = auto() -reset_blob=unhex(''' -06020000013920c0cdd8e7e68d6ef897ee686fbf657f83b9514341e1d3c0835a28c9cd1ccd0016644f74d -d02a73b85d95f4d352417cee76ba0bca3ce474159c62ade3e10797715a13f15a292f5d57c6d46cf8f5ef6 -587a3c55244f2258ffd08b351dc14af0da36121ba0aa4f1147ffd0cccdc1d6dc1d5fa7adb9841ff79c753 -e2528dc27344be84a2655ab01039c74999b90a7f008f626791d68a76a57b07180129bad2c0a67daf6a3a5 -ebadd6a429fc087b1e68f1e6535290b7f94e9a9800330d866c5a67b4e974029164f8c6fca8d93c86211ac -47d96fe386faf206f92f4afd32d3a90c4287377e8896aa9ae930543864539df833345d0a1869169d69100 -8510c91dc1a0ec138669c2efb812c7b9b7f201891cdebe9c80eb671ac8a854bdcb9990cc23950f9f1dda0 -d0119b8c5c2d8446310e8599efd248075bad6613ceb13f0310ceab6ad17b18c8a245c26363ba7a7f24f17 -972861c6a96e728d1be81a68d66418ee2dbdc00d240bde29c781069f93a06dff89ba4039b980d3c9c2a26 -a7f41a02a4b9f1c0e0f75f0a59c5c5003d2e90a209cd9f8bdf69414262e238dbe8e1bacf6c880f59843dd -8111293e24e99c964538842dcb0b4a8cab6d227cbfe0647cea763496425152aed507b2228e79c8e9bcaaf -6380c1d2e7f56c5563706cb5da5b238371ca4b2627ca00f9bc9d71cd73ccf02f02f42e856f9e8defa0195 -c8647cb1a0a63e6996a1b5906080851f1648cd061a585ddda05fc8f37a99a0dac92dfabbfade8f89157cf -11d356782689838c358f4790480fd341c993ae4cc8a8c93cf11578c0571e0c3c8a4964286eac3fae27507 -d9fb2ee961953d86574e6e5f6d38cf2507a714adbc221867bd701bdffae0b27ce47ae8d06685e534342d1 -1aef07f2c998fffe8673c2806e8384738b8f4ba401d417cabe088ed2fa09c42e97af72f878753ffc50b87 -fd292662f421bc6cc8da131957c84f4ce4b69266065d35d3ab91362b13edac27231ea1b6485faa6644c64 -6747b86341b6d031f6a52b6ad855396b7b8cf9485f50365cdce203355bf2fceebfa59b266772ff2578bb5 -03f92ca35ca2bc046d63aeb4fbb0f477ef41c65d10c5cdcff5de10afa9e7bc08b026f0fa649629f259c5c -2978d26dfc2cbf48f59616ada4bf2fc7a7219fc37d9f5026709e7b472b6f97f78d47e1c5a6af8e23aebb8 -a88f64f005abc93251aeb8561b0d855941b33ac608413405381fecd0154db93812843f15b8e5e118ba7a7 -cdc051ef203a7721b769abb3c17c704eb0acf6a2cde267776dfb1ff8d82ba2341d0346cd80cd4480767a3 -d0edb643c1d9045f24096bd1fc324c03efc0977736725b2770998ea920c19a1fa9add474714a5b7a2a318 -7e94cf1a3492814ad145a7b204e0b3d35dc4cab2424a891f76160ba722a25bf9906bb3a476250b756249c -aed3c4d52c4046012da280ec71898e8e393559979a74432f1df2692616c761c676a0260c7e4042bba7387 -d3c683d4e08454c7f509b7960a1db2a1cf007538a38a1e39b0a0310c9b77fbf21ab2b3f2e76f3ec9084c6 -f47f4fb2fc1dbcab40a9d1f6c8e404126193d26ed98270824611c4840087893b3204837e282bf29623080 -439336435e801de053cebb066bc7a440a3f34fafc2bb7252c5dd846af3404e93f1172ebe2b7861e09d58b -cbee0400df8fe627adc42be2860a33d40748bab2f34262ee32409bced9cf8fea90bc32d247dc2787d7289 -65373063851a991c63c480b67cd301a9c312037c72ffc04120a09b1413756d4e5bb0bccb550c6cf76e2c6 -35c8498f4e653beee2fb683db0466280bbd297838a8d1f2459a58db77446020cd20b82a52ee5cbf0aa908 -14a199ae61dca69d0bc90986a2c26b8d65357e3925774a3876ed0eb80124a0bed4c2c0bc632e1b3c1a812 -2b54b023b05e846d78172b97424ff607b67c2c11f21ceadf82020129e62fb0918e85b623134f4e5e18870 -42b632662a3d33c6effa4a967e09a4d988dd084fde8c9d4b39dd0e6521b8e2d376807adbb5b86d914eca2 -38a349d9b0fb23b64668bdfd45f6a735523a31878e4975a42ebe2d3c920f550881818c8139cda34df3669 -b89aa5fc8b3bad460de2d76d431435c83b6fc0efbaaaa84818e990be36b72826f00f1f2b97d63b680d83d -03f2ac5325f8dfc5d460abcbf27ed4ff205542702974eb9bfba456401786578efd93d69ec76a41df43798 -76891e39acdce7a32e94811157d48829f46b5755d9721d935c73a28423080bc8a48882b4439e92ac68413 -6a52b078e06a730596eacab8768d0784b0fca63f8a247f2523ea5d4679a8957af6b314594681759ede769 -76937c5f99c7fc9326579d90fe7a7fe0d512858e3221b50c4e1d9ff16f38d49c52a524ef895dab24059ac -7a2b9dc24e59d8b38e4958d51fc309deecf987dd79697fe6ccf955e06bbd0ebe69aa18df39b452ff9ebe8 -f2f761c1be272141ebe65d0a625b5f1398ac2ae129ee5c1e520beeb492748f9364742978249470be45279 -11bd9aafbcbfa5e90a56ce40e42b995c82f6c5df51cfedc41a6963475e2d39641e2d7ac624d184aaec303 -465d4441b1b0acfccf9b45cc3e1825a01be94e93ee16918793a809cef222480377558ee18bc2801e31f24 -3d609ead015a0a6cec743f7dd0d951a7e0bf56d45ef20177373972602417024412c2adef44b881da42138 -5286c9e31fcf98b8f8ee10a9ee2730429579825ac159bdee29d1c4cdb9073427d0924174d04818b6586d2 -d2ac5318156b6139bec3b1959d0d1a8b46603f0ae9862214fff30c133d463cdabf875ef841e01976ad06c -bf74c9987839e8a0e41b6a2411e542a061b23bf5b261df7a0cc844c510c102b4e03fbc44c44e998a51699 -907d252e91e3e89c0728f5db0b868ff2c55fc53d9230dd0dcd01086379a8821a0cb2b7dfb90b25a8c452f -285185457827dea2f5b3cf1138e23e9a8d23ba1f2234d233c0c7f0595471e7e3a62d8fbb8a5fb900a3cf0 -3ee4943e4a4ba5b51200f02a6217ec29d7d5177ba395c77540b7111c5428ab069613c7e17094c5d798049 -3ce2d945393f3fc11765629597817499cf6585635a3db8d6471af509380224dc04b574891ebce80cb7ea4 -d0789ffd7b76637fd460ee701b60be9174eeb51f96c6811a4e4dc55ee545a9d9d23b80059084616521742 -d9b7a47d60b77dd0ed12f10327553448655ed7b7a9d7366854d908a4c762fe9048e4e4a3776f2e22f90de -014643101de4715754efd62762500c6de90435fcde78e9fb864045cf8749b93907baeb4f47230547e78be -a0e01d918426c3c7a3bdbbf2b54394c44273aaf163306450505862af4778f667d7c34a894c8824effe124 -b9993690d1519015566849652d86e158830465fd1fab08e4cf5cfff1f437ae0c713abe1b8e1fd15b1a796 -3751504ea02e4ff1469300a689d4ca4d796be229b4cc041296f9672bb2383442d492eaee0a17d174ac699 -4d2c1b1a117e54da2bef43347129d94bf4ea029271564f05fc3f607bac5e06e741ed5e9d51a2efafec05d -7926c693bed05ee0bc81c1b6aa6d57f58b01aad2d69613c201e86312bdd2e8117eded970e298c096c52ae -d21fd7f8aa03e3bf3d280fe3b3ca4e49dbfc90dbdfcae59ba03eb38458cd01f6637843526881b8df0b019 -e90e2b05bb4154dbac69e82ef4d8f83343fa2b0f10f71f1f0c314f41ca366c296fc41830ab1998829cf55 -01d8afa090b8803aa1ef94dc8a06c231ebb3e42cabaedc50fdc40832091307b4dc46398c890d71863522a -927e1d90cb72d38afbc74ffe8813ab36a168822b5caf7550af92824061d076b5e1f628b6e4a36849c5182 -58905e734a2dd53258df37305a16c0b844dec711800a822dbf691327b7fac815cef33d59363d56c246d04 -e877ba09c4fc1aa70937d46adea4b1ba418695a7b86c0d9332b71d44b2dd8c88c93a8efc264b1c29820bb -5b66b397136d9715961dbf7d5b59508015b2938edb1938e68f4e354eb7dd60b08b4460c05d1f291e56aca -32bf30a59b1d849993750498df7be8101d38cb2781cb52a640dfd09ad469bdaa069eb37b7462343819ce2 -024bcdd1940f97eec044f7fe41793fda6edf53acc92d2883fdb144de0baa6fff19c59b3b5a673a6be202d -8afb436fc6bcf3a5bce2ec9919a9d2f4aafcf2f83698d56fa43efa7b07fd1074b915344d6ce24ffdea58e -b3afd95d911187b1070cf1c97a80ec5a5d609869e262b347f24b7e33404e6daa06c89d45db644cc6e29df -41198bc8ef699415629b91b6ba52e5cccfc367654ba4fc0c7c6f40a2d9ce519c84a6315dc6e951f828b1f -5d3a7c6e7e4a3271dc21c82329a163315a763c25710dbc33f9b79db33eeeaecfb8345d503fdb069160451 -67cd5451c5feb5358b07b085cb710f348150c92948aef7eca1bf4f51cb31b7429d28ad544cfd325691524 -ea5a13fb276967ff78719eae6c735d37d7206ba951cf115210ee0c3a0b07268c57a926a4ef8dbd8423190 -8d15ca9a2f1b519ee982a539eea6e874a6b04cbb65c62ceeb44d7ccf14791bdf5f056bae592830688f03a -67d92a8b6b8ab6c40c651eb4e2366fb31434475068839466fff8e5279cbafa713b8d51dcf68001363dad4 -ac42946ebd79493fca1a868398063193b4f0aca3a5af2fabf868813b91f8f13ebff3430d31ea0d4f43ed3 -f4b620cd555e685d4ada88cd1df2dc108e1c6202531b63deeb47fc56cf5034a31f6009dbc21ba392464ce -c0f410756705d402dc05572236c291eca7f2de1315b9d120f5e90272d2643ee4f941b387b3dda516de4a9 -a09b3407ceceb015206edd6ef6449fd3304fca2f306e455c6daee470edb19732b76c1982ca03e325d8563 -c7531abdbe99e8a7742a9802afe43bc46fd795d46052b527d1125f65427c60e6bbfe5e4d391c391a62118 -ae1ce651622ea9f2a6f4f6a57271b35bc907ded5ee7026adc8f77f50168b75741984e9cc788acc8ff4de7 -a1aa976466a45948d8b40e3a9ce32ecae381c3376692012456b76ff9b58d70b277e564a2edae34b459476 -08e660eed03c3d2f4f7112a0bc7b9628d86694f8dd1fb5d9ad8c62c957c1640aad6d0106b1c9d089cfd1c -30f155a1e84a2a809f08e212b8b06a81543f2fbded09620782bf8e2bc70461b45a567727c74c1703a23b2 -3d3014db6a05a368ff9acc84d4fde73f1763603bdcd899b61cb3bcebb900268c93fbd0f12f702661d7582 -b188ae01922c95dce32d0469e30386774afcf89e4f107a949ba6dedd17d828e480ac653c07ea30f780879 -be572bdad635c0f9f87d88360b5023e58b661f35df98b7b1a0b1779179e614281147d9c6a4f0853e4d435 -432b4d6be3879315e2c4fce0ba32a9be43fac22b4f12a97caeba8ba4770c89447dbd902287ffabfa3d270 -64a45060a2fa458e950f34569ca4cbfdee9b3ff6391bc5a0903e66f5b99526fe75c10a8ab4fa9a100948d -71ab96d51e3076e84ac00460eb493b418130f6ff92c0c0a2bba39a14b3f5f003583f481abf35d39dba4ef -e41712a6eb1f8021f18d206993c685d806a8c8415cbbc15332ceabeaa8d8f0de9af037c1128fa0207ae5e -915c79276e23252fa8255448feb00d79931948967db93f8c95336237761d2eb9cde0eb3ddbf2b0e698136 -7ac6c5843902670a5bb3a7fb3cc338f7b498cc07db6454e7c8c9b2035e1e21fb1046693a39fe27fc04a38 -0a209c7ce67c238bb227a9bee07407a9fe65b0914976af513ed2f9964574bf24162940269f8e34d6fed0c -0769c81a5dd890e2b7d92c4ad51126ec8158679fa5c014428d67e485fdcdbe24e9a8f7bd46ad3b02354ed -febc7133cf198a841a163a6580ad89badaee7620419e30234ca94744d936bad9ffa468bcf669741fadb7e -7da12908e4903eba485cde036725fc4ffaef6e7a1500f40428418ef570b355810ba4981fdfb039b4e5d84 -50e979ab8f676d1b1c84897fc5cd7ed57e4962686a91687f04932f690ad55a85a7f235ea99d3ee0ee9a8d -5ef0e84d43c2ec8ef3b3da80a5c3c973e41e6d85cfa28f53c3cce3117b05662f23f8f37923518a77e5408 -76abb03b6b1bdd606ee9127ed6c03a8b90a30e772ae9fdd287cff1df87d2ca3b344f615afdccf09f9aae6 -115fb99b7a4da857c30d73e08c7cb474a65564536738f64630013e6e7a375ef2b721ceeb77c2bee0be730 -5f4beaf9fd048ccc03e2a536e57afe06cb981b8d788c0114b1422ccd025205a92d1d98b7de5f604e3e55e -2621f2d8933169615c9e5a6f354396e184ab69722b33eace77fde03c67b553084dbd35ca860f8e1798827 -9539eda36bf63bf8b1345491ced4c6c89ddcd709ddecc764a86565b8ba49368c4a4034302acfc0184c3c2 -d9f8ba34fde40cef6d3869fe6a5d1af17e059445d3bf9c950470cdac062e2986877ec72a79333089b2ce6 -9ffab8c5438a1298bc50e0e9c2e286e55b1936ab0903257d52db14fedeeb67da7a1df1506b0fdc4a50d2c -721450150b25fe8cb74c39298f620c029dd8a9f1f9b175c5083a6437d0a8f5d05489aa2ff31dfc8ed83aa -dbee192b11169e3dd6bd496eacc42c46a952f81f8c39f88ba31ec08f1060d2f2e49c0b900508b4e9e5703 -003099bc9485e09e5c6a8c9f05389124095b1c9693a30e4b75b7f2e839eb252237a55007ac61fb5268982 -083d29e757b74c4c310aa1cb03adcafe17afd50a53e4f539fb57a6c5c93ee94cabf36d2375cf0d99ad0dc -cabb650f468737745cd0d5e66ca991bfdb46e05371bfa18a034669e967192a53bffce26bf2619a365c21f -9f7c54801780c12ad3ff7198e916a1a4451bdcb248aa997d25f312a292c9ae1f70efa6ef1e5df24e48cb4 -1243ccbee736dc9d32476506126500906db396f312db3d6710669064711709597220dc3367e720819105a -f78bfc5a109571b763f44873f4b820af8279d42bff9b5f9da409e0ecb9d6a3485d9bbaf2641461c1cf144 -eaa2cada36b38beaec87737dd70158735bb9c0ae7de4ddbed353411b8435c80cb2e66a701469c6e65f437 -1d114775c73d8bfa0ca04b38811b2b31261b86dc2795388577376501aad9658c630d7ac9fa4c1f262d53a -91cef7c2990d9597fb2a130985e04233cf178c611be685623ffe5b659af6aad10da3235331fc6f6822fd5 -cdad3f96e3e1195bcb3c0104ffacf940b570f94ae689924cbba86521af15be9b1148f331ddfa37ad410b8 -ef99979a56ef1c3c789ffb996507d85383559a229493ad0bab90478d123f0c577ef01c5dc5a3ea28f60d0 -8409544ea6e44724240b2879f9c2560270e0cc3949af9e22899377635f44cc3fd0120554503d06f4a2b41 -e42129e7184265b4480edd5031d57368789203fb9a666c1be6692451f684119d85ed4cd88fe63dc1d16fd -dc4b8508d04671f837f413a653483f0eee7b5300021735de246ee24d462c5d332c55d4c35c1ab9bd7c9a3 -d009076a838baa8a88c6fce72f0805ed73221fe98a5941d21a97ab5641d2e54df83c2437fa9cd88dec024 -1f1254c6a0ca3e85f678eafab8b013459590f87fd580fc0c05f5967a58f4dfe6a89ac1e47e4dc09adc942 -4336dd355c6f783c2698b8539c3f801f999ce5db3f041cca86b75e3e92e3d98922ef2c191282a7516024d -f2949c1e88ea6b53b5d713b57d3edd5c78a978f7d854e487eddc60c7685120980a5cdc259cfb2de591875 -d88f9b898ef60d6da810b1a07252a56993bb5bba723f4f838ec648e19bf63dedb33eb1dbf07f456b41563 -c0102cb18220b308ef60908e75a77e6954a4f2993b60c10464dafb40e79e3cf5dce392207e473913e61e2 -75b090793fe0bc1856b6574cbc6fd1295448b34caa325df832a095266beec91604a2726f33e54e25e9478 -d859c348ad45ba5b51eda93cba7d957c5d0d76f2de84d225a5cbe6a5553c1311c35f12281d98acc7eec95 -d7f5e0ff3a0b27c0032b59a656f70d0cc5a042ee5b72365c0c8ee03ab6c48e18f87e050fd9707104924c1 -59b48edafc57cbb56722f62702390e688a0bd463c95318d3bb13b44033ea78d19c665aea20c67cd7896ff -cf2c8e2806e5380f0d53b0b8d30fdb35d496a891dab54d3a4ab1b2a6f4b4091b48b339c5213a6f8c3f8ab -9a9873a605494cedf22b17a6defb8ec1a88f471ce7c073ce264fffcf9af0c6a37398491652fae2c29a496 -6b022fe608c51f28503dcced1d5961186c3889e4d5ea8bc94667c80cf0d6b5f4ccf3d8addbf56b6c78028 -0850e078f39d2377376e120ad05e930e1c58f50bcf980814c2e38215db50567c8870bdfa9940104591384 -55fdbb2e260190dfac1743a5d6dc9031b0c89bfeed9f70ffa84a964a185834b4e2d3f299f2c4fea605f4a -5a97c51fcc0fad21ead2867dcb8fb6cd6ae2ae271e89477d7dd03c34508d719a037fca0c6cb028112d8be -93fa865ba60c7d7e1e017f3f49a9f0114c6fab8fe797cc3a4cc80c2351880347ebd8288895fc210431c8d -27ef350588a81c382de3a100f8f8458eebb61e33336b179ae24e397661d622c82169c1081fdb929b9f21b -4410a09fab9938c40573757d89a4450a4246deadfe4e5a20f04b6162f06bb0ca4c658a88880df139a5641 -350edf1d19123cce164d5760b6806ba8ec5584effbb87cd284150ed6a73354f9829f5d22508da40bf8f9c -7351c45cf169a3f4e7354faed2f42d9cc08ce051e902f8137a8f79b924e2b3000ed25154e617b5d066ff1 -a3540eed0a4a3da0618d961115091a6ad9f831c25e2ec9fb1ddfa3c28f365b608fa1dafbb0ba9fe340014 -60e6af2c2da1e90aedcfb07da4e6603a9879834f16fa45cbe6c2206459058c750e534dfb8fefba9bb473d -0f307f2e746f4c4f6f7db41bdcc7eb5d7e4c9d5028ce143cd88ebc1efa56f0e9f3ef939526a3f56ae015b -5e42fcb7353f5496cb70baf316c8b1bfc7f26872de3f421e87ac81d4a2f51b6c44dce38a6dc9d93009490 -d84d81807e517f06c896f8adbaac3d5d8d8b83b220114d0da49dffbc5e2cd1e2b715e671b05aa1fd3b0bc -dfdad56f65d0393dd9d1fa384b82ccf9b10b36d929f6b8e433999448f23c6c228bff904c0b91d0490af31 -3623a76fcc4258e9c8efa7ceb4b82aa0cfc6c362eac5b1e61f2a55ec5d3f401a748acb6b8f2dc4641ef9b -d4eaf3d20e399956d36c338902c5e3b7ad13249b03bf248f41bb26de70db4d0b0b4c8dd51f92b5c1e9f3c -cc7cb4ae36945a16f6b428caed3514af83885312a6e176d9c555199cf7cf444915362184d82d21538697b -10326d0c5bb1e99b44ad644de25edbdd2ba404a45258d0e1682e73a42595b797f5e7a0f8b24159047d98d -8fc58ee9e47a5068d791bafecee6422d7bc847757c0800c95e23f3470f41500bc08ab71d671765cda7422 -7535ba05696c703b90ddaaa6e6973389abbea81600e36229d756f7edcc1aceaaa010f1c5aaa1e6f0def4e -b3a04613ce82527a67f8be50d072cbca685922d492df81cf737a69e29bb4248076464ac3fbe88db35864e -69b71d1ed5b83f2045f680d9cc5d447f09e5405a5939943511eac648c10aca735209612eab589d2d2716a -19059248ce4847f3a809ff04477b8378da77e796109fef7d686a5f067cf3d91aab97bd518f388173d9535 -26a3a77af043427bc2b2a466735a45846c11204b56a84394d724511efb467722ffde80899d3868a31c7ce -4c8c2100bcab717f12eea1eb11a7f28abadbc819ceef1132a57f902aabd43337172b3aec8fc7577bca293 -50551070615735499b2758b2d9c77d391497393b6ad39e3395834185a76f6ce93fca5376e6f5aa78b11a7 -63f504781ae3e8a773c91e3899574c4b3bb0221ce8a927d443d5292f3ad13e843146736f457b4477ba6d8 -f462505b7d3d0fa76dff52f01924e00df97944f69a3abe6564793bba2850b0084e4f8d2ace474a1249daf -1a4ffdd4a8df84c8d5ead6909929992ca1b6e58476ff388bf978d091921dda2db3b1121e573eee682e22c -d01818ae0b7347e2591dedf20ac857746b82c0d4498744744ccb44ff96857a9609d7a500f243a62106e61 -8eadffeb5355d5e5e7452f5f50b3de48e75adc2be249b20ccc4aa3f4ea357bf4320d8f42e5a3bad1bd3e4 -2c659f71caa3736871f9b95887adbc04affecf1076598d898917c0b54c63317478b8b8e65fa2e6b243d7d -497cebfef615c9974553feb3d33289577886697b6fb01a8849d4714ddf9688080fb0af0e6fcba733b8019 -28e7664b3840a02b9aab6307af1dd3fa814045733b53e0adab1ec430c40e184db1ceca1bbd58c4dab244f -8683bd4edb6e59470deedebe96080be666b779106de5d6acef113a6c75002424e4812e2d9997dec5391d3 -aaba00320314f44fac9e7ca9b8996bd0a61b00139a8c1d2c9fc52e6ab9f90eba248ab0b3c4444d4ad1f07 -ac36878ee68bce6c53801a3019b0fc1f1caa3ea761da821753a949724d3b1dca2457fd2b1df7c7f3879c4 -dab41a20ab4ced8dd9e8b2ecf554fa412153dbcab52cc68ab4d83f7f310e0c5361f9c780160908816ff2e -f457db9aa93807da96de3068bfb63a18660d29d6efeb21b36c3c34abf83ff5847711eb85e052854498474 -6965ceab0caae4fab0ae83bda024bf17d091132fdbf217f13d1c42e0671e324357c6d668492df202797f4 -1a4a9be3d7598ee4d4530ca0fea76da94a225d93729eebee40f217a9d0a0dbdf28563a184eb1a71f8c6b0 -0aa550fb21b0b1af62f98a5a165fb3e79d4265962e976c50875fbd374026e7fbe886eeee146d368899bad -54f97308f158ee3c33b290445497414186c47f3b54e78ed4fc8b5bf379b0169908cac2c654edb715f9b1a -3bc50992ffe9d4d5ba034b3a7128c50aaf2ec50497e68db2261b78f155900def3ece5d86b86f4a892a846 -483ace0e008728627219bb71d897c726e9a90259c6fc61e4612ae76e41aa302e3193a0cf5d68d380fc7b0 -7d41a757a459fc81fabc6336d21206b58f3ff06e390475f4e2b99ca3f0e4c82bb2d353375076d987d0a46 -54aec2438a4c1dc17bd2dfc45a680fcb3b5144d860424b8890b83be8dba8c30ecb06cddd416e01d1917d2 -eded83012bc19ae856dae5a6713895338a1f10c76260d61d25cc640292cbbe80897913e69c39a04d7c6b5 -5e9b54dd661bf4f2fc9900283a6c668f82b8e25d0c750fa2fd00de1355e655b8e690d3d2dd1118d6199b1 -a2723bc402fb38549bf13cacb217f42ab057fb2610d0f7306765d2c3644ee9384b1a8c0ccf847fdec7386 -efb25ba2e3ad6a1b489aed02cd8a28be43855e4bb718e7647e299c150173e53855a199fef2a797d2d5e0c -454494cc175cdb205117614d1aebe6f402e21eed9dff22cfbcab47ededf6ae22717e83f0b4904c4051df6 -03fd2ce44bf59f0ca07c065d08113bdf87b6c19891e07832d7d93a6845ddbd15d41cd416dddc8de81dbba -ade29c6f48c093c8df3c64aa69f8b1a36b79bc41cde01ab1758878b6dbb6b30c4d3cc5826bcf8ee3d159d -20289bf01ddca53c7978e8ca1180924fe3274cf855e2861645b24c527ea3f928e428a578c6cb791c8dc2a -96862aff4f0b383cfeaf325748f99510bbbc17158f038103157e293951db33b0307791b45e3750b781678 -3e8a1eb9d2cffbb619bba9b40d55b3e19643acc3486d8c85e75c536033db333d83be39d5cffc02e1c48c7 -ed56158365a50e9497474bedf48621f8c1ecb58bb87d99127e7d3b44d9ffdf49a967378b8e4a796f9ba1f -62d93433afa53443dcb145a27d2bc0d92b99be04f4142a1c94d497ff9477218caa0b318a04d676447a853 -a51e725419f58374ed6823cd69ef7421d81009d2151fb4799781da7893177d46e9e39a3d2e5b7a2ef1ee4 -585a606700a2e387dd4e261ce7840f817f5e80af8852689085ce27157ee2cb5398a78feffff635ab26350 -11d739455c3fefdf16bd7b1d665a7daeb33019bbc7b4688786e58118f77a41e3879b68124d04a8de72479 -428d222890cf07608fe56f9ad094c20d668d56d985083cd0c23a85da57e37095afb06c60c2c3664a13747 -8f03438be98b78baa9af5e4d7fcde06b83952a59f4581ac51471fbc4203032f1fa52de74d804f24d99e3b -1ebd7177795f81a996225dbdfaedbaf007f6e92fd1e05f59c8864b55614b3d0a1adddc03198f7310ace88 -254f71e115b8982d1701f6c4818a35f7c13523b81e2996fdd912c0160abbc2ef5b70c8e0bc5c3588b7269 -e5152afaeb2cf84d106e2e8b1247754789e5714c600fa3df3502374c53e5bd6bd2bfe4533a3d0bc1ae7a4 -368e811c1cc1047a0a8c085b2852e365735140404ca72c0e689848c3c4409037924118c59e7791f804152 -00ea282df22aa541e28d271a27b2e50de4485675bb3c8461ff105a17daea67f2b699a42db0298d44d57ae -1dab3294399694f30fd2bdc30fb76637381e941c0f07736638cf8e532076160cd6c2a3810abd6d8ebbac4 -7491021d878b593b854e41a9786e0dec869a7b038649becb63ee65ba9e20e309020068bb54269c442c542 -5c0cb1d94785e2e1d98f142320e314010794ad009735fe274cb87e160d55baa8ff9ab8e0fc09f07953fec -afb1191fdd9b80d0c493baf72c4797feb7b5349c762d00d48d6c5322c7e58bd34d69fbf47ef9d8f1374c8 -01198b8c59b97baf58c68a42581f9ff0a98cfd587f2707457e0a2df29616a750fe6877dc35d4e9066a67a -9d4b89560bd9fcfd3a896fc8e2b9d944efc4043d0301bdd7ce597c62da276a348adb4c837e925aa95318e -c20e305a194511f5cfb91076ac244dd4ee09179584241828134bbba779d16f09b8e54413462ae3a6aab5e -ca1340ae5314abe946e1674ad4f3d56b677c226727ca8009229441c5ac10cfeb8ce580629393178d42da0 -7db214ac6596408353ada7b21f9e0d5d2388308042132d5cfac7940237d2acf9d4b873e0cf804c75412d7 -fb5736e2cf6461d40009ecdb76ed0ee23d59e08d2be29e5229888a3d102faa676ccfd2cf44ad1dafd7101 -98087fce312ccf89aaf93d6dbe1f32ee5f745d04018d0ba792281972b35ae99cf9ec3974a3ee233985cb9 -a065d8219b285f181de26a1f154c73871d9164fc068cf86b97ceedbc0f4ef534efa2ab1e8df7cd850173b -24b8e6b3b5e683cbc3f50e79a674e89d51ff0a82a15e0e9952fc5d9468c2301f2fb4f3245692eddf6c690 -6100640ab1d31acad8d834e55fdbcd7c82ab4334466ce761ee775fddb128a8308773346b73d7e472641b2 -c7335855d6548d3a1edba40eb98a982694b503bc43fa61c91db1f2e18fce5cf8068be156c31b66554137d -cab75b034f18d4933acd5ec95d6d97146d327eadc8afaf00c3917418e421e4151c18d771bd79a7d8b860a -1fa9315c8bd847306b07e307c69faeeb0679c12cf4761ee21d809c58c2fa3b729904bc6175f755bce0930 -ee2203591ff57e87b1ca577c1d7d75b5bf7f8d3215fd57af0f3d35a00c76f702c716ca2b9694ef185ee9d -2440cd28e2aa8e2e221c475c866699aa1ed7cc5c2c5e0d98bebab8bfd62aa33002c8ca3a58af1c3668c0b -fefcdea7388b9227d3155a06cf94b27ff93b5cf86331915c6c132fe1c092000b5e5f17d36193613ee70f1 -8f672ab6543a65ab653cd47d13fcc138ae485e41710bb96903a7902a40fd1270697eff8e304bdc5c4797e -46c8837b7f644ec9acb11e146706f3a1254928373dc7df81d973dcc6d6b0b0443527a34bc31f9b1af586f -a667107ab5577c881aaae1b4725d02233a335be4d419c892a31eb397b9965f59f1532853bf456ad132a40 -b3ea9d20b079ae07727f18918e5534b528ac5bc18f36a0880b7e29e0eac96456fd09e714ea63a8f79554d -9d38fe7033a143c01974e23d44e7e763f8dc193c018572afd4303b40af2bc2a91e6353264b6bd95e8f0a9 -f683eb1e6e9d1ccabceabe9ff569b4d1d658d81c268a6837ed27b675d1adb1f79878828769778bb92649e -a29010509ec07d9d8403a21acdbc0f6032645f02908314537b15c7814092f783adea56561b6de27f7a7e4 -a50f6014d6b3a7a4b56aef01a7fd3f90d829c77493b3505132a3afd275bb8d8debd2758cc3b574a78db81 -b5ab1794192090ba341ae33a905fc138e4bb189275babe75a9ac1c94a477a65f70811e62f904cdbaaec9d -d8d200571d98308986b748974d9dedfaecad9c6dcfb514aadb1a0dadc351ef2b752ea6e8f31859aff8531 -9be89de9b76107c4d1fe93e9063e9864559f477498922b1271fb4792c594c942dc7fe8de2c2423804cdb0 -985dfdc7a68ff2eaf3323e38d5ce269d790cc7fcbe124025e7613e80dbd8edd3cf7ca106bd8650e1531eb -2fccac7b1fa5e66f7a94ccca1ed903b1d87500be464280c326167689fd4e99eaa25fd10904afdb9888e94 -bf505483e26eb3fcaae078d9b4d8b47f0104cb572e12fd4854bd908939a6b714b1ef983f38de0408acddb -f560cc1beaf92b1c54f278b13d256011a915ea5ac7085134dd08d9b37ad08e6330891e0010b5809022b13 -9394127b90a25c0cb5e521cef81c9650d5e976c88dfce8bfc6024f28e8ec0b8a0dd1b6036994e89c5506e -75af1a43b033bd55f38f6e37830da7ffc265ae85566927a993c7ac49f7e31a5a2795f198757a6f850d76c -2d4770336a73f05709603f660ff24e938454ec9f32b7fd873ab645cab0a82f1b865f5e277723fbe1adeab -c17784be0fc90fe7d44fdc6aa5938a6da20045cec6acdca7a15d301ab52f289c6172c1ce4bd19a5d94886 -2413d2bd975534bc56dfecd733065d7db5df03a6dd807785b95c4acc763a2b570e1983633a446a3740e4a -a30e0e065d120560532f673b18f5bb33f9ca949a90850da679bf192c76b72b8a684cbbd17fe6740ef28d9 -9788c69391e5489dc52f950e6f2d3df79e835d84fa0bcb8d4e0015f4b7e8fc6889db37d2438f9e91c8539 -1d5785920ae05aeb391dd4a8875326b4b20aad9be2dc5b2127e3e5ab46158140026ed1ecef9ed9d2b1668 -60d0df8e0b59082f64318c075d08bb5d6d03170261510f8f8996ec8195a4ee7a017c8060da2072673fb62 -4f49fc542e5c605966a5eaa3cb26ad91721b101a21455c7b34823472cb11d05df5a767daf753e333c6141 -bce8d5d166cc6aa9b52c298ce0464cbda39d5983bdc3b57bdbb01215e225e275e03914cb1262d07a5086b -9ac24b337eae21b1277c6a4937a94c21c44759cb2d8ac5f8cac59caa25d103245c4b462bfe955c927f235 -1b086bc557baaf187a3fff06999a337b2a45d1cda8002feb0defe27e463050ba93a8474f4540fc22034ef -311a054fbe15f03643de443575808244134d5e9dbf7bd6cd939d592453ab3b7accf42cc797a276e63c581 -63ab521bd1bdad3566bd1b1e10248cf7eeb5757c1f7c8ca9f976f4721b3ff780e7edfe2f37f20116fa090 -5deb4fef0e5c5f2a303a865e6a0a6090afe237ba4b2c1437b569ec457d48c60dd5d878a93aafe3b3c626a -5368fedc33f32696fc88ca4a43b3646aad27a6241bdb5b1c273e57ddebaaa88449c54e63a1c8bc386c918 -3d7b71bb95b0629e8a8f86973726f16b266c6393e3192f812554e73574679cbf3a67b3bbf969e00c904c9 -89eb9c9fb19f3608810c72eb528253ac8606b1730b5ce4c3928a763da1399ea3ab531d3174a0a221f95de -ebc087b3b230734341b85c618f09865ab7c1dd66c74effa2b573de24b14f1385525873e15ab9d90f0c33d -fdcfa19de497675f5a3d9956bc2d66942325017e4132176922f08b478907f0a9e45ec64b23353db1d44e8 -bb7f4060251afeb9e80dceab454eae609a3f5def899a2a42e4e7b62e7d6ae0735072d268bf7de73573070 -c03546f57214a1e4ea1035bacba81c14147db07e0675ef87b88c14dd64f23c7e9b45d4dc68ac48e294221 -af0b0d7b747373b03b7b922620e91ca810a13de10b02d13e139f68204d7ce0a2f8db69335b22b15e0bda4 -9545435cc769e30273ee40d6d54a45256186ff348a52c0c82c8829fbf79d4e3edcc3f42c08b026b98dba9 -e985d7597e085a767c3234182a0be06cd0435e40a5af588993f82c34e7651ea17ebee8f7035f29a378964 -0913d812130e76460ec368c9a9a9607e0ecb66866311044b7f950dac488cd4479baa9a0b728f4c2925f04 -e7bba448e8913b71178026789b3bf48713f619159a8c4c8347d5ea75e795e66c6662a24c4cd1325ba3bec -b127848779badddd62fa895df040135b2983c6c529e2bc097bc4c6c144853940903cecd3e0c8695f14d65 -08a88c135a332b8def181bb0665d76cb6905cc7b87b2ca298cedc035d716be906a18da568351d3631a46c -42beb6925cbec36e3877b42fe660c45983a26230654b1a00e464576ecc4e9e98e3183915bc0bec1d724b6 -4a7de15520e7f82bec8355d38878b3b2f80b731af2029a0f38c310c75a69b53af4f856c46f9772f028356 -9dfb581e2caf1595414f3f0d74aa609483c1b -''') -db_write_enable=unhex(''' -0602000001648445315dac4d9c91edfb3c327ec18aee87a1fd5e0993fe74b56ee9a70f0eb4d65bfc877060728ad26e695be98899ef76b85 -2162cc5e6ccded51e5a26e7e345c4a8e83aafa2e10fa4cc78f0f34575b0565089b4c78ce1ac7fe3744f4721aa73209fa4a8699e7161bfd7 -ee58dee33f1af15ba3b9ce9a469c5c82eda2b2a2f01658ee14118304e865bc2ad415bec9f06757bb3f2263bd0349a3c089380b72a30edf8 -db01db75586c60ddc9e7bedc8cf9006fcc6825b0ec9dc8782b95f53325bfb6a6945644f2803a4c7fd35574d8b7b089102fb072dfa883049 -f9484a789ff763a029f78adfceac92db195573c65986e38aec2135b5da3c0797939154135be5227515602c0148dbcb8c8a3760dad71f877 -471244cf1053a3cc4bc73c437589a1a47e08c260ea40d3259138e754a556a23e09bf926ad90ff36096c27c460ebdd28f20f31e9f42a1925 -26d79b94e7f2c36b66db69946d93edf8fbd516e3ae59a0b81400c39f6bc1feb209924bc04703fd36ab53dd5658b2dd91633823917c37e94 -4e740409c5fd66974ed42b73d5d7db519c7037b1ed32e471750da95299463cb070c80cea4a03bf20351716ee14423f84670c53ef7b998c1 -79b84ae91cff6ca6b33a372e9947eebc873c6a98c6bcda68e5278b6f799a468bd1a33ae07bf717fbfc20f4d019f0fb25a5d6cb75a97fbd9 -b8490e6204d272d93f62ad393307cad3e24d292040e61fce6f1104c42dc4260de15f42971bbab18064b5dd6ceb12a32d9d25614d9326048 -052bc178b5a0aed3f350cbbec021c4b1ac6ed383f7f4eca0e475cf56caefc3edd3cde6526401936cc095b2df8e0008b2d9bd78c82af0a1e -c0a71f047dd06b4ce6e91886607c55536f0d8712eae4ccb890008ccc27f2d6f6cb9b9bb88ec205019ec722160ffb1c65ca3177cff09c4bd -ae8c40be5bf91488a600ed199d0aad40510afe580802c56c0241a8b2a836800e8a0d07ae37176934252f92fc0e501aee29e6c3567e37b3e -1992ff00b561fd1b3ae37caecc3a1fea7720b0806d3b39cf8a3fb46087b43775b9e473e65cb18af1c9d87a5140a5edf8b7843524910d631 -79c436b6a806d100eb066db889768f7da603631d75a6d79e3d0eb1fe9ba55401b828d4a367f695f3922b982be10fdb1f139a0b1438abc91 -1db5da00ed464d80e3086d368dd131985a21610cd485740599afa772b5dc44d1906ea4c13b8e10b8db896fb81b706038a3328cd07aeb049 -e6ec92ecd30044c54eb171e9cf7a0034cd24614616048491f576826af5ca6afe4bc01f86dc01c2ea25efb32bc9b1c8d56cc7d4d86adf8f1 -f3bb6a649f98bae686ef93524721c618fad85a8125a8ac7d72bfeb7de9f590e8f43535e59259a7a1d13a12a1af91c8ba0dd45ddad02e5b8 -6224fc00dcbc143b0e1d2da638d6798fcc340bda8f1e3abf21cadb2161c4c4be7001371dc56f0d112b42b113288effea6cab8c4b610f730 -37643de21f433774d9fb28cfd213a62dcafab8b662b57e77239dc2fb69f026fcb773f09129c8db04b82dce68734516ffcb938d43deeeeda -a02cc08d7d06f34ec55ba4b224d3270265001df114b946d4238d51cfbfb84cf715b745ec918259c1165ee12ab82b4373eaa2b0c7e68da3e -b869ff033d5953800012bb006d1cf17dcbbe2fb2e129614351c000cab8ccc7c389df33dbe504a0c1df37868b839ef84a6c04072d69fc866 -33055b2569c9c04f1994758987fc7063b97853c727809185a25cd69bfebf6a4367760fd21e7942b997bb2b7098dbec715769d13413c1c93 -185409e54a2c9a97daf63114c71348f19549fb3a8551afbbb7476842f7045a0ec8e6d97fb4bb6de76090687ab4e9991a31e7625ba7088a3 -263797be4787db02573b72100b3ba117e8897b939548715bcfa11d98861b60fa2a4759630b47cbbf329fbc675c4cfc2f963cc9ba72cbe67 -13aff1851869917ba0b761f6532d1dee95331c4c621bb0513e993f7e6dda6da1e3076829b24093c8338c125aa2f5a0730f9e5631f7a9594 -c13025fde9bb4f2431540a1c743c7fc55fc8909d85847fe71af8a68d2981b0eee84a308e0160fc4226aa679ca9b35d0aacae8240aabd5b2 -17c5e66ac4795596f8742acb9869c3f52a96b1d946ff72f403ba491c1a0e4be778efab9d61a250562d705c2b459fc3a420143daf9355226 -4bb8c7caa64143697961fab1b6af9e852d43a94736e1e75e4b9a7c2bee73598360c7e4c648e47ba9400dbe22b3eea6d9ab87fe677b36242 -57f81d26b87536a642a7840bdccd8fce05c23891a4fa4ce2156fba2856313653207bf225b8114005432824d16a93473deb81721c77196af -d80cf723e8cdea81aaed19f55a09a8986f2950c49f4eebfb142d5e4815632d93ccb0106c156b47efca25dc3d7f31eb9b2dee0d2d83a51cb -e5d1270222920f2c87e5acc884c11b0df7a7e1bb49b06fa4f936964d3f2782fa46eec3e430815f82ab0fb5eb82377277f8fe3ae5b33732d -7d76ba3de284c66fba372f04f9ad6a39fa669a00583313d51c8e6b1eb960bf1e82ae8e0504b2d3035b371d5ecf638c1cc0c1dd67eff286f -c9ee0950da53f339a85fbbcbacf61fcdadee8cdba0950d23ec71e2239ae7ab5be1bf56364897af990428822d23deed81fbbe622420234de -d92b8fc3073bfa0a9677cd9e24b9f81278c50584bdc880fa2cd5c5c4b03bd78be872a656f3ef74b30d4e66f1ff091a343f75f096e64ab25 -b64d426862ed3f21dc54c6b6a8cb90b065c7b33b03e97acde7d58a2fa35664ec03ef1f82a30441a021ec008bee9444bbe50ec8ff457d32d -06a63b9dc84fd82fa110a30dd849bf9f8cb4d3599b9aa09a76ad1b7c52bb972e5b16670670994ef7471f2d738ba9430664b7a1c259745ba -8b2b9d98e695bad0b59e1fd989475a61570b2b677734c3f1887f9555b760811e20caba91eff59e9fb328561e12749c32f603bd50da5c449 -7393ccd560e88f367a664c5f2f9fe73107e2664a07a0f015877ce085f469dd24be1a20ce9544692e23094650a991e5bd7ab7d3b575d5ef7 -1549fa442fe75a79a6c9f598eb1396e9332878c73f8af9e8f9f0cc11a4b42245acbb421646d6181c8f7f602298042a37d8b57520a1d68d6 -e3d473d5f1897e05db677c7ff6e260048255fdbe35fae42c791ea57ac0f2334e6ab5c650f59f3b27b1af30347314510a29fe19e20ac6e8e -eb1e84deb687d2dc3d5cf4b03dbe35d165e -''') +def __load_blob(blob): + from .usb import usb -# FIXME this must be very specific to a particular device and constructed on the fly from multiple hardcoded tables: -identify_prg=unhex(''' -02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210 -000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020 -0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2 -0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014 -0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0 -6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80 -0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800 -b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a -ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7 -00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3 -08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0 -97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808 -d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098 -7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc -800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928 -00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180 -0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800 -abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a -020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260 -02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090 -0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131 -415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b -4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828 -38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f -201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341 -c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c -2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818 -08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180 -81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e -''') + if usb.usb_dev().idVendor == 0x138a: + if usb.usb_dev().idProduct == 0x0090: + from . import blobs_90 as blobs + elif usb.usb_dev().idProduct == 0x0097: + from . import blobs_97 as blobs -# The following blob has only 1 byte difference from the above -enroll_prg=unhex(''' -02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210 -000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020 -0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2 -0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014 -0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0 -6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80 -0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800 -b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a -ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7 -00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3 -08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0 -97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808 -d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098 -7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc -800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928 -00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180 -0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800 -abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a -020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260 -02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090 -0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131 -415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b -4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828 -38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f -201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341 -c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c -2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818 -08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180 -81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e -''') - -calibrate_prg=unhex(''' -0298006103230000002000080000200080000001003200700000000080202005002420000050207736282 -0010030200100082170000c210000482102004c210000582000005c20000060200000682005006c200129 -70200121742001887820018084202000942001809c200902a0200b19b4200000b8203b04bc201400c0200 -200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc20e803e0 -206401e420d002e8200001f0200500f8200500fc200000b8203b000008040014080000080800000808000 -01408300008080000140831001c081a0032000c0000000080501101004c1126003400080310071d10071d -10071d10071d10071c01065810080101000007c8078c06100000204f80007f000003070107010c07032c0 -8fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d800af908f8800b5d -095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b6109628 -00af408f3800b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af0 -08ef800b660967800aef08ee800b670968800aee08ed800b68096c800aed08ec800b6c096d800aec08eb8 -00b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b700971800ae808e7800b71 -0972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b7509768 -00ae308e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf -08de800b7a097b800ade08dd800b7b097c800add08dc800b7c097d800adc08db800b7d097e800adb08da8 -00b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808d7800b810982800ad708d6800b82 -0983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b8609878 -00ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace -08cd800b8b098c800acd08cc800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c98 -00b8f0990800ac908c8800b900991800ac808c7800b910992800ac708c6800b920993800ac608c5800b93 -0994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c1800b9709988 -00ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd -08bc800b9c099d800abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b88 -00ba00801800ab808b7800a010802800ab708b6800a020803800ab608b5800a0308048020030704040200 -00000000002f0004009000000029000400000000003500040010000000170000003000cc0103000000ff0 -000001d000003ff00000025000003ff00000022000003101112131415161718191a1b1c1d1e1f20212223 -2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4 -e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778 -797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203 -c2d182e1e30182e1c321d341d341e321c301e1e241e201f201d1c321a301e1c211e21341f1e202024201f -1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341c1e1e1c221f2 -01d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220 -301d2d302f2d2c2b23223a211c7e7f807f808080808080808080808080808080808080818081808180818 -080808080818081808080818081808180818081808180818081808180808081808180808081807f808081 -8080808180818081808080818081808180818081808180808081808180818081808180818081808180818 -0818081808180818081808080808080808080807f807f807f807f7f7e7e -''') + globals()[blob] = getattr(blobs, blob) + return globals()[blob] +for p in dir(Blobs): + if isinstance(getattr(Blobs, p), Blobs): + globals()[p] = lambda bname=p: __load_blob(bname) diff --git a/proto97/blobs_90.py b/proto97/blobs_90.py new file mode 100644 index 0000000..222fedf --- /dev/null +++ b/proto97/blobs_90.py @@ -0,0 +1,368 @@ + +from .util import unhex + +init_hardcoded=unhex(''' +06020000013917b3dda91383b5bcac64fa4ad35dce96570a9d2d974b80926a431f9cd46248980a263c6fcef6a82839a90b59ac590848859 +afac817b7d53bf51cd3205c1b8f43048be8253c3bd247937c837aca8b18d3cc8ee8c8971ac4f688813cf3d8550d71496985b7ec07ff2dc7 +896d330fdab263a0ee433a5c4bc910439d1c6161853feb03f5502209502e7308beb7919473cfe69f422c30502d226a4d0a34d96c8c77956 +cf69db8ef6cf927a3b57849d4aa8ad4b44266923e34b82a39c8146ba3cd708c70dfedb50c2de61feb45b1d4f19584297203f5fdc865795f +ec9d6449f3ba9b6f1e4bed698ee151e83d4d8702f76a4006cfa24d9b797888203b2269f8a77d524034ac32e4af58b86ebc63552cb35b12b +285255deaf3a32bf46cdc5ad3bc1c9ed1bcc112c72143f9aec568e2cacfa89ba0c7bb65590d8b93e6871a33c6c6983c0acd04e737ff55ee +e024ca6b9a48332c1a69a5a3fdd24b964cf7e7c55229bb0b48a6e339eb2c42d07ec850a4ee780660ad6c77ffa302a63bd19426134c4533d +6f967441163fb78b73547c68a493b2f800d3cdab827b116762789992aae3c8ab345a49edd312dfd2a27bc501427dc7fa00ac3c5c36551db +b3d5cad8d5bd7cea37e58a31307a6d50e6ae379a53f1366678c0741a3d872b8dcfefa7f63128dc8245 +''') + +init_hardcoded_clean_slate=unhex('') + +reset_blob=unhex(''' +0602000001d6123241376f110935a7ae38b614ced9952eaa38e2984842d0552d984b69ab5c1a70175513319970225d9ca25be063a7d70a2 +9dff803240c099ba5386910b69c3b7ca8d0b26ec9a5684fe92af9c6d8068ace0954eb8582adc6208aa6c116b1778ff531dd2b6817a10d66 +7e0385d18ac7ccb47eb67f1f54b5b94c84d65529c6e9fe9039218ae9cde123f38ffa52a953ed589d0d8bb48680aeea6544b7ceedbea3216 +615404921b43859facf8ed4448e585354c568fe8d9561efb3fc9b88af8e6c3c7c02ac9b44adbf780d23730135c1f9840b67b302b6efe9db +19ee1f5918740dc0259b3cbdd4f10e59d1a517f54e932bf01d2b1e5ad5c4f71af23373632e06160f83799a0a1b2479d9bad01892667d136 +e27463a0eac485541f24018bd80463cea17ada264cc760b38a0ac87b27539b72e1c4f05d73f6c9c777b2e70c366f1b79d31ae2dd1eebbda +992390c64c988c5e04e3b4ababa8c0fbaa33da18a097b609562f609ecde2443fa9b315667c95fb62abedbb8887dbcd965a1cf351c795ca4 +f5cc6e22e844cc813fcceb34741f5c988dd38d31ea3bd3cb373162efd3d5744268c1c9a5b679c97e2356c7b1de146eb675597884fda01e6 +6360b807e04c4e557ccde2a29df1030c0da4750c9314c551b6a5061711c6aa1a01564933218e2a9938d8a158a17da154969dcb3aedfb8bc +e12024b908e7e75b9a8f44383a4a7c3a35632054ef1bffa4137e0f4d724c3a06a96fe986a339ca4f27744708feb6523a31aa4e2a19d1567 +964d52b568259cdcc602c7ebb468bc5846a9183a56917e3f440e522206e7e0e06a07aed6b680e0bc818217bb4dfb2010ff503be6d3e555e +e1af32edb3f02f6906cdcef6053a851e799913157220c563ddcc47cf7665fede1336f152df1d1c6d145a535e59dc41b7963bb520e66dc12 +a21eb5a900f939b7838f274d9ebb7cd0c2951f2b9379b54f20bc50ee6ec2dd09d7af7b9f027261c38f056f3f1b953cf21bda1f5a9caf3b0 +7d160f80c186fc5eaa42074d041eaee81518fd2b463112ae6a6c07a185e8c24101ee14dddc4409ce7fcf9a18955bbeb8c7146dcd92ab165 +e20484c2b316acb3d9dd2215c5b7f4eb8954202628635a46b463e1b2d35c466eedc3c49951222840959db8eb1112f32fa952d72f2ce2f62 +97646ebaf53dc1c0ec484fb703938f4341f21c157fb58dc101e3918053d8abab75c9300b2912f840bacdfb4e27416bfa3a945de6cea14a6 +0f09d57e6ec7ee83f5616a9fbf0952017420f857b35fcaafdf7af50446c1e7d2624f9cc4a187af0c6ce6c118ccd4234d991402c0b81dd38 +bb523a2ecfcb16896fe16aefe7bab3ded4f746049e1d38e6f8d7130bccbac4b33bf543d9c4929b7a6247d1d4f9d5724e6040f5d4a357041 +fa07a8ad998110ca30a3ce6ac9fed580034adb66df8fa8643ad3eccfcff6ccb8df0756ff426aa9dee01d656fe699f091611c5d68688b3ee +28e320d9ee2966a5cf146c13013fc4ce353c203689a38e0437805711141900ddfa13c5425e5c6aa5447c13a35893696ae04587901992071 +dedce8155f273581f0ba35b7b23c7b865149945be1bda2233a7b5b4e2f5530170ddd8fee44229a2bbca2622172b36831445d4c9ec9be1dd +b14de7eab8593a6e5389cc260fb453e3062b5862ceba83dd355ab50d859bd47215c844086ef0f8d074412590eb8d1633bc21345dc1aaca9 +420fcf354ae43efcdb9a0b3c9422c6634c6e15a01d21d1cc645bb6f3e556de2c17471d4c68aca86ebc700efd31fe9eba3c31d18c33d4b94 +8441bc6f6682962018dd0704bdeb78fdfb457c70075a45397668c85ac26e13c890d1c980c2b85602f99538c649fe97a01542f112918b68c +dc0b9e59f814e25e3dbea24c8a36b064ed7f2c924c0c45e712a9ec9339eebbe4278b1ed7fefcd7d60c27ad80a978161e36f718f3b52fd78 +37454f04b43438ea78dbe7badf356ce99e4dc3c9749d90de6d630c88e58d8f6f828759dc14d742ea4b6232efd05da4cc200732a4fab8b9b +c8896233432333d344acbdeba7eb64634e8a91919efd81f4b848511c181f3f45ba45841cb235b47745882cdd44baa44ec8f7247c470f412 +31b2c663243068cc309aa890ef1b79f8fc438a517b903d4e35a1dbe1ecbaa2df887a1fa18af39c4cfe90104d330fa1b99ef3f1ee8276cad +45074bfb5ec5fd72cf5b9969cbc479375bd2be271d0a8322e50f1b0c3b2c66cc0088a3e4ca6d727679833243386c441e46c25084e37621c +4a3a6774568f65b9d2f506fe698322973ddcb94886159f55a967880f56933b066ada7fdeb861ee431369cd926ee3b088f9c5e852aed064f +a4004fc658efacc3fec6cdc1150bd1b3183ff52cb62d598baf172126afb3d8b3eba65db880f3307078d9f263bf261bec797db705300f635 +796775d0e8d2a964f2b51ad769561b2244a48b5f9767f71da4856c329eb5a8a58ccab1993fc0f93f3491991312406c2797e5b08a0ef7172 +8e8cc3adcd23d29b7248c328b192489bec81c56be0087cf38653e4148a8065121ff7c6ad4f8aa4bcaa375f566a8c617d59abcd6c3b0aa13 +ea4590e5e37f47bc276f0f3cbfbcc0f159e4e411e3b42a5fd2c440bab916117710208ef6f113ea82709d5e0f5cdb68fc376fe707f2600db +2f5bbef6569fbd6cec364621f30445b161d3faef69fa840c87a301604e351b6b25db6a7d20c86c1d3d4d28ebf88850f60d7ac0c1e36e1d6 +29f76f07aa65de78bc9b33324ae53312cd15d5cf54175dd0dc9b2b90583d29290a72569a5e3f1d7edec3195da0ddc547567c948b1b8bed5 +df3fcdb56f9b0c625aa288fd57815961014298da72d516ce020dc73563c0d34a7463fa869adbe24963d8f12c80d708b8f8510abd66d9047 +bd6d14db5815948fe2708ac584a6e0a6a0be66bd315ae1fb7dac0be365910ab0eeec78c9f4b4209415943ff055bce11c621628c5932060e +b516c260d4c3da41b046a2876cc11eb59078d550bc883aa5722139a076123c4dd2debb7da792bcdaa5ace368f8f7d5c95ba0e7397393afe +1d005cb89bba287b6ca2440295bd9c3e83a195ffcd3a853617b1d4c8b9fe1a7f5e4d4817e7e22d0d41255d044b271a653de5c6ab31b17d6 +79c5227d1fba14f5de53125424a5fafc7cedbdf560374c7d4e52d04b6fcbb725108ddc8e08e5b4fefe9ef565fb02cfaa3e56de4377c6cb8 +36cd0207bfd002522cc850380c39fb66bb92e309c26cd05c97d54ba055ad500f23c2cac8ce1fce29b4c623657a42058196c3fe635ecdb7e +77a01a2114adac63f141169df1f3cdf1c86fb6e34fc419d686e620a427df4d9034970d6618896473b213f1933c533985f45c9197679ca03 +a6c6b9b9893492ef8a712b38d317618b6ca000bf0b5134845d6da83c9d93c3785b36ad9155cce63f74fdec88e03b69b6db32265cbf57344 +cda57e5f55d26e26576125feddaeac0141cd43dc5e906babc5162ad9c90bf623816ee21de2914c9142f32e28f489858cf931edae30e5b53 +a5e6ad8c6d74fcd0f490cd8d01904d07a8df31c6938f792319bf7d03a04b69c58b96b23d4993d10846d436c618401ff97558841489c0b7b +1be5a8d452d4070026d4e240a9ad749b44cf8011b1aef37b789782b0f8e17460d3c43e92555c413489baf2ba1e01ca64eb58f3db61b3921 +981bdc7f005858015a987c457a9df8a35cfb70b27777e7043eb0ca06a65473ab3c503955b5a743c89d341c0a32e69047e5d9cdaca901e06 +c1b2d11fe1eb275b8d292a992a5bdfbe29d436c03fc0c85f2e5c5da3ba8a18a8b395aef869cc217afd64dd2a748d21535d89a94f64d3704 +5f0b28f73315f3d8f420d3082bc3c33a96151812ae683fcde4c9b64e96ce5c463c93c15af02649c7c56ed308c9d386216c88b1eaa87717c +96852e80e6e544d4c3731ec34affe43bd59d1e5a3e286f23ac596c301d1311e98616b6870ae41dc3f4b62c1e8019c7d94bfbcac812a74da +d0e12efdd0842a750c4e65e311c0b7687c180475acca570988f1399f85dec169f4674895f9ba21719b752f4b5134f036af8a6250caf0692 +8c5d4c63bab25a9f530f6f6b3b8cc4befaefac68a2b100d64a9fc90004dc2c7ffe32ebaa31ca3714a47d32b23ccd34631943870cca989a1 +1e3988ad9a884491fdaeceadd08e6eab8761d6e40b5c6bb5c6be57d879635c7899aff67d3e0ce02fcea2bcffd437434e98480a7388e86be +96c08be01d38157a2021e6b6e7767b253e5e490d19c007d3a55f54d42d5068d574e94c252241dd0ba637e81b35255d26c4011564dc04b8e +824c51c0635c45be6568ca3e4b8fe4b18ef259fdf0598005f153d7c880294445647c293a791ae63fa0bc7188588a4a80acf08a8d25eb376 +043a591c6dbd91e3ede155bbba2dad764ac478087e0bf5db54c1e36a751d4d1fbe04ffd5dfa60dadf6d5d4cbe1724a6bcc6376b72c0ee90 +1d2444819d4d6d368a7ec539200a66a2a85420a23cc40cdd5b6b7abcec543f0e77a2cac8f9165f17d0bcb8d64c8d17951ae64d3e3cc4054 +eb2b56265164ce17f7810f6736835e7ad6653dcb4826121ab3c3482c9c47aecd708a96875efcd744e61fd884549e09c969f78d74be12336 +f7c0a3861710dde88783aedb9975ce0ea97df46600a24dbd1580aa33ddf6cfcf845013d2b1d8f271287813c4ef56d358e6d9ce5311beabb +9f978115ece80210c397b9bdddb0aa060c1845a8efb7b4672c8fbeccbb992f8b5a1d8cd4ba9db59f7a513368ef6ead104e3cde8a0df7898 +647b89f4f7a7d9a3a8a49e5b3467e9959e63f6ecc18fe8db37e0e3fff24685be43174a62457cac876c1bd7667671562f5989111561e76c0 +166bd50b80764861f2e893dd3c183e85f538be504e24467c633ee630aaa1162bb77beda78d8fe812cb503a3c5b9b2ae1d8d08bd8b551a93 +d1c11f9e0dadcb23032e9ddb5164a9f7f7f405b13d4c6b4348cd1aab236d2461e62c16c4be9cb7b13f227f94e588fa1b469e3f8813ef488 +b1813f99b4eea2a4bc4a01ba6a8d91efc7d49ec61414b415915515344d085369918e28320bf0827001dd044f5d2b362326eedcd1ec30893 +fccb0e7ea4d064eab96d4d948424c738af494b95ca6b581127b09c79117b4eb1fb0084084ad954b99660eb0bb1e4dfb8b3916457ecf7b00 +ae37b46e1468fe4c27368334ada48647ad511539d9a4e044cf7808bc3d9cc5cd3a6609d3f0b7c24705e6cd9558d2fc8d054102aa13c8bae +4feb6f99854f5d51a556afaa754a4eb2825bd0b188f22dacb1921529353354fbc76e34e504815f86fa3ec7fec2ff8bcac70fed8dd8b4d35 +c5d4c40b2bbe8fb0f66a01d8250e248f91ec938fa3436d40e9bc42b5c10aaf00cda166d084210222f03c594b28c6c381431eb562dfdcd06 +4a003c230571df8d5817047d79c64a10c71b45cc35462794b4374b4f33566b0dd35aba9142c16d8b449a4845c11ccac5ace613764a2d367 +655fa0c3f61851bd78f3c1ec9be3363b55052d997286b93de7299fec7292592510acb12164538959fe0985ded8e9b3e8ad3573091f64f2a +ba3d266e400360d9559592965e2bb090f15a79b0e18e25d5e53136cbf46f8d5c92f963b0345e4b4a953dfe62d87c8d19bf12078893f3ff7 +504b7d87e1cb22988e50bcda330944d6e21b31339c54a9f1f62f74d64e42c4ce9ea11cb28370620ddd019d72cf86f23f8d6392feba71040 +e6711f6b87d4574b3531230c2cd42811bebd42731daa3fbc22437fcbcd453d5496245d8e1d8d41a44d3388fdc5f44d5a6c2efd50aced0c3 +9182b9e13cee5afd257269a752152d2c1ad32276aedd10543d4a43c936a817f97e8504c9829a5ee7191efc6588e0fc51b68bedbc571d026 +e88e56df0cf58079ecc9f79e1da3862e197f65129cbb88cd328daa33cbdc84a10e79ec54dfb16d095d6a17661788a5b11c9b33b60180155 +a28d58e51c1bab325ec736923a5c5e68a332fccefc15e804260e0e28d2bbca5dee308429b262a1afcff57494706d7b6af55f9d1d297148b +9cb0da0191f71a63990a69d742bcdaccca45e3b870618b87a34ab545c9fe56d8abf0595053eb34daa9d805c94cdbd7664d4b6deefacd61f +305c6d34514d8af7e49c1fee3e61b2d5655fe1da9cd02be10a56090ecb656330f1dcc99c9dacf92db21797f8c683ea72a823f3f4916d1cf +43a5f550e4167a6b2faadc4c76b3996e7c388e9e213356f3f55d11b65451ce82275ba73bec51220107c3aef6c16a59a8bc45c1cd18dad20 +1e967e95a0b5a1d5e79a654b8c8e8dd490d7443a3fdc3c5cc296cf161bcf7f5f11ae5e6e283b0aaacfc47e34002ab474fabd907b3b7d3fd +e6e0d70572c72e6120688d4d2d6b527e3f2efbaf43b2c8b98acba51342d1343c2359e7e9977847941bfe4ec45960a73ac7e27f11bdd9d03 +14c4607510d9a3988504980728d94672ef5d0ced3b26318aa0d6505d27d6853c1351194b162616497a90a4811158e887f85e43c1447cd7b +15f1cb914ef5f00756933f21781f6d50528f27e65e73063f2c9cbc31cdffd07729276ef30715c07b70203348f16fc79457f8313b41bb4bc +c2297ce9072dd39d9cf572d77b63390df5cdc71a531470b0a03114422091bdbb9287035bc7e8883bc06515fd85d5f6a4ff6c28c0fc174bb +f2a6deb39264e9d4d0a157f7a82160d19ca3d3320e277c67a1450597ee4ef17136908657292fb1535c54e0f33a74c2df98808dc5f0572a2 +c872f2abe3c26b61eaa51a1f431f38c1731477e56d0b7294f82450f81d3b4e24ac3b918cdafd657076dc04d0d2478c66177c52f32e63578 +ff91cf4b9c3479ff9e50d011325675b0f061f9f39a066709ec2e04799d8c6b7f5c0e6cb0f4736a9c30c2965dd1b6d130c4619c0642bf464 +779147524055003d7d106e33b8d4f2878ca1036dc26ba7c043feec62f23e5e614ed216a7688fd491141f2f0ff03901e27188c4c10ca63c9 +b16c681811946b709443fec717c0293cf956fe10f1cbc4949e90d6022e1df5187a4a9f33757b532e7afd708cd920c8cd3fb9706976ef925 +3099aea257ba89a27d015f2fad5e413fc90b1501d0bf332ae72975acb694657958ac58063b9503940bd0b5da8667d14a6f14778de42fc5b +49aa2f31d63823b458d9d30c9cac2de6437ba07a4dc7f64c58505f8490066b8a308272afdc5f52f9d3847d45adcb4987a57e51e7f87e7b9 +7be0864cad5c32fd7d7a523b707d62fe4271b699cca423d88a7b03208615466b37e914d11bf0ac09af27bdafdb8881f594afaca9af804fb +399357f78428a6146f4177029430ae8144efaace1396a67553501159c6b28f519fa2b6c526d0592bd769ebb8ef8d4a9cb06015a3cbbe490 +238ed5409c5c6d5c76d050afb81e794edb0cae2b5b32de7936a6dfc55bdf9629c7439ca6e0abc5a72639de5e499884f00d3893216f3b7af +5306ea1e1c6528ffb6d216748c48e66e38195bae12b18e1dfebcdb94a769786c0d5f117692718b2e421cb6cecc31ae303a3cbf0d091aa66 +e0868531a206edc80b6b82cbdec468ee5f6995e1781fdfafeebf6e9dc29bedb852d31ab250b6114ea7914db57f2a29005c75d699f96cf67 +3c08fc8184afa71a1d1d574fdb4790ba1b903e4be7dab6759419dd5e2676e3674673517666fc2a6dff15ceb63b68898c2c04105a654ccdd +a3004961e2fa04bbd64be6d17e072033137e9139b408e5627afce4086ef3b62ebc10d793ddae623ca685571384b72020c361a3c65737ada +0a99626e1cc4edbf3a2d5ea7b79ee52a29399c83e3337501f11ebe19677884fc547d4856e0c056b309c9c06936b76e59179b6234dd297ad +206a44e367938874c620d304465008cde3b9cd961fe0a2194633b60da9ffa3acdcde56ddd2e9d531c88254c1abfc82eb32d176fd6ee7ef4 +88e55ff9146e351d3f88f86458b7d1c015cbeb9a2830c94c139b88dd3722f21ffa0ed5f0fe2f52292d63e7a4e8296aaf6e7c676d50fae02 +74633b322b117a25b4ef14de3eba71c8f71c3f1d7b2b6e0a72872168d9fb4dc7736f07f74f061e9793dc11b928fbcf0640f507f258415e2 +704e590d8d8a7a3c301509a9480386e9c0dbeda03aa6ee639d321a068f1ff464de5cb8c9e1d8a18544489ebe4a10bf2a38d6b6758da979d +d9d57cb34bf06aa039f8c28ff482f777fdf49bb0e23fd5a13997e74268bd34157b8e9759745446620b67c07a631eded4da64fd52a843252 +2a8cbef463cf342c29d824eab6dda3beae4fa865a91bb93bcf19dcbf83c30a463f2722237ec6c3219e4ea1a5c8332cd31a672816c6d6a3a +025a2d4fe2465a70fe31e408174914901f9cd25555ad35ee447bedb46079a10e28d45dc1ddc089501cf6d2897ef5604cfb926b1f91eea87 +b3b4b5cf1de1f19de0cac590ee322b901019935650d7401f8594f07d0c5b45ff2a070c2aa99ceb579f9234d40a084bac2d327e39e4696c5 +709e8143311f8cbb1b9a9e90542f2a5c7bc31ba55fc75040ccdbb019df60f9f5be3462952c53ed5ae5d2b963e209aeec9152285b57459d9 +c30f13f0824d4df7391cd37f4c01bacca23be86522d89a3cea30d530870194c5b9f3e26854fd5c560ed8c1278727de19ecbcc98e70681f7 +f502300177bec56c7592dcaea9de7dc84e3a5bfe84518aadee912441f36a21ea72d02ad646b5627a57fa2a936f354a83de8c720bfb77500 +75652162815241de1eca2b82b26695a5be54681a352726c05f921192e2617c152ba1b3ea9886d21bdd9fa1af5ca716db253337549497552 +fa8a88d90b3aa29cc883bd6b70c3b484d61cb13a48a198d66fde544d2220853023428a472b3950a7e2454a964245e941d3afd17961e7715 +a8fcb573daf5aabad00c04f2063762b042cbddbf70e247205800cc3f683744328d36fb099de9a55f160113034f2f07d6b17bdbfca8c900d +8ff46542836fece814f23de9c0eb1ff4d7b2ac19404aeee4ccd730479715eb68eba290f14d4e59bfffef6b32cfdccdb1887e5ac5275edee +510d8f15c4019f8d81b5067eef86d7e0e5a22a5d9c3f9f02a3f127b790734222b35c6b58500d9e71c52af72cc857e81d674acb5a20f8899 +37b11fcd1afef357199593d4dc1ed3bd330a9884dc2ec63289aa46bc78c3ecc8bce6b233073f19838d533daecc396e4dedeaad64fe2df5b +18ec9e5d6ffb986c2ec995e396ce4eaea867d1a37a0e37b05d62da3e33f1886fe494407c281a576656d9e877475cdde83724a74139a1a0d +7f46c2bfe50bdf54eefc378fc5989bf3cfb8a50c767e9f387319c63ae3a19baa1f9b2ecdcd1c520cf89812f5afb7b9e1f8c4430d30ef2ad +9ab44ec9040e004c34a98aa5365aa2c47fef4d61ae4460315695db1d9b5c209edb3bb2a19c0d3936d926de49eb38871ab49168876df13e1 +2297a0ba4735945cdfbd8e7f9213538f279f1e73962c1d93cf093c641a5e892fea0bee34981795431ec58874ca3324682e294c5919ae542 +c9a24c5517653da873a6c808f6e2ee17bf97fb096af3027ba73ff3bbe73b6666bcbf5fb343dedcca608d754253024fc1cbf745be30b9e19 +260837e7dfc018735124e321b493ae356ea682ed8b3e543f8ea78efa6fcc670a6f08b7690ef640358563dca8437c8124b54ec5c818c40fd +0e9001ef579c8cee7ded90a0eb57f0be6a77a8bf460131ba700299188d6850e0b6bfe61ac5088cc425fe4b49de058f7b771e97f10851f3e +f4d73f18368f206d66c46cf14d53509eeb2b0e0f7917e0424721729a624f4979f99ad06a6ebc5bfff88df86731395ee8ffdfa2f6f890450 +4ffcac2ca833db95abed61d36a611a0f2d8e911fa31e9b3d7c3b93e810298e674e1275c34789cbb4db0ad81453f79806900c7a6cf4d2bc3 +b376c3b3a85b87a96d0f391132e67beaf0efc2efe6797c8c9667b0b8a9e366747ab433056e68ceb4423b12c0e9547dd7993bb45794b3e3f +e3ea8263af967a319496755b6dcbaba889ff3a8a63c19de97607fb0a4907f05e6c1b8751d170d5e479e22ee9aca002e3afe564129e20a35 +c6de7725d4565e354c00c0dd46a78d3bf64bee3766ab1e9713307816dca44473cf08a41db614dfe24a1f85829ec3b32d8ac299362996d89 +63d06213219dcc77057ecceb8b87238900462faa16d24138c24e9f000e40e6c2986d00d4c9e2daa5f88228921d40055c34b12a4c0a95e12 +f4261dac024a8057cfa00cc7513f7a6f7f8eec5638f561ff4ef24d7ff8e8ccacd833fd641d7de42cee3d88e92dded6db82c947b20d0e99d +d91a4f464a3e84920a4e79b2f4bc5368c131ad2d1d36a448dd1c35e3a763a9ea77ce1ae501e5c3a3ff654d7b7f3572003aeb1eb3b9c7615 +dd1fceab65205278c43a937fe45d8ae44de67bfd69f406b55eb92f1b22bdaf71be9c40b1ce2e490ee7a3d0efe2eb8db0945c4d9f9879594 +cf15b2d2ad0e608237977a3b8109af5995a4d04a782e74acaa512c6f4124758facb7fe82b4f11ed4e1d009d4fd72c104c1f8af43bc6ee8e +72bedbdd806066404656ff6657f6a896141e8e3c64d29462f7d9a5a8547f8e70eecd879ab3ce3a83853f686f3057796a65ddc9528e774e8 +da5a58e5b95cab51d1630c11076800c102e3a9aeddbc6393fcbf45336e380b2c243b2654abe2c60f14982174dc451e0d2cca2c2875f28de +5dd33015d30083e4e757339ee4e8a8beea16706e0fa40505794cb6add99d4c47d3fd474c6dc6b7c12be07635f88520a396d68c1ed46cf58 +d12c5cbd71e8fd611b1814c9b6570f862376e10801b09f2a96f9fe2fb30704573552b6daf5fe225956eebf6670dfec598881774883fb71f +1079caa7610ab316b49045282bcb95d674cb97f755db08adfb3dd48c759c1f3b846645f6e598d40d781cf90f9f6b4b68c6e4eafb04ca121 +0c3e32c9bdbbc5cc00e5cb73f6f7a8989b9f77173cf9c48e563d25c08e6421902bbf6eda178eba038a58b6314b9928e05b415274065a294 +e797d69ae030ccaf3527e5be9e7793152e34179524191d8fb034f65894c862afb9f5277355588930d06f5e1ecdd161244c5620c7927e558 +7fe7859a3c9f553a60c61dbdbb50700e94fac299688c825698738fc9057a03427491ab3cf23060d1d9e651848cf3346673ba64e252013a5 +e91fa1f208446d65120e98586e07a3f6c6b70bc10c4fdc8aaba169eb6e467d2cc12c3d5fe16b2730d12da8b30dd168f3f9174e1dc940890 +3f9b8d7dfa02cb5f5ddb014f0e4604c4920057261a4d38b62b9c0b365c6b067d10e6b71bccae65284802f3a402a0e4106bab6a2f1d3908c +a87e8001150949e86c18d7169d0e2f96e46eca56059dfa543f121999b734561c4813e6893bcf180a0ed97dcf51c254170d991a8da792a25 +e2bb40f6e5819350cd5f19ba46634b8c7e734b6631a90f0bf7be8ac658a6ab74119c24ccc808a2ae0908722bc71a51495b232698014d9cc +86658b7d01b5f2d3dbc402719a750c6737d0ab4d38890f361236c17d8d42a993922063a19c59a199c92310d472743f2317921246a009d6b +8b33856583d98bcf028fed0c906e054a0fd83d3724d535f1fc7c06e03c504aa1d5254ea9d100658ba42771aa41717a7666c11b7cfcc21db +52b598f9754621372107f06f435d01f624b258f9d987a8e3c4699fc1c8eaefbbb2c6bfa52c24f2e7fa61a8894a598c6eca124978b566131 +cb23a1ea29d5a877156726954b4e025e9cdc6615baf34af6192c5ee9f23fc48c8ca9cbf66290e52c93503925b8df6718fc9820c84480bf1 +50cd0679c0042b52ad5dd97d3cbf59ccce7ffc168bfd49de2f00034f9c2d16f6c438e6c1d156186ff15950a1b829abcbb6c339f443cd23e +6d0be60e818fa0571c1cfc22d11f60423f54f884e4939d7b742a0af3a14531d9341e4e88c98f800ee5d05c9ff29daae165db0aa48e4ad79 +25e25ee0acf03bf09393c5ccbbd62343656bedb3a68d7826b01bf9deeebeb32e32058853923f235095cbf5fe9099185ef9601b1e59e96cb +e812a8ee818a5ae1135de863f5241fbccd6277ce0261487ac5925c8a6d303666a045665385b3177e4f4945bac6fe4ba1e3bfa407b964b8d +02f5dd122e1806ebd8c5f92a260b635248d6fbd993c03ae92f75c16a14ce240b1742ea5d0c25ef1629ab0c6bb59ba849cd7a0c15284a780 +0ae3b61b13becbed1337d37987e36ebd9b75a8e64754a8109b5efce08306244aa62cf7d0ff73b73f2eaa363d6cfb993be1196ecb43edf51 +e702e7575fc3940a36c2075223a7ea6c06466f8d689d6a8f9b2309d893073ad6ad0bb44044b1bc7d0c093b049c07772e39d9e4717733887 +157460332241e807e07b0a848715ae8eb085eb96116d1e5e3e98b70321af069c52d34f5e8f99198d18c0a7e0e702fe4a1241956b09ab6b9 +e5040ba2a9f0d9c5fe87eae988913c5e08554d32feeb3e60148b1fb1ea67b2ff55285e928efe9039197fe9783eb0ec13d28aa74fcf9e554 +9b48ab7098927df50a6cb1bad0dedf8236cb099c1746855b180be40154aca88b4e966cb89ca2813e57dcb0fb7d36f4fbab5ad82a98522df +ddd9e50b9f6335c97b7d36cf8f082d4efdf887cf09dfa42a4926bbb1b58d033c6ad34373045e0e2c9ea83a537127c3c7b2c99b53187623a +a5b429c6ce47499adecdeb536ebe3d884d4109bc06de2f54c221258c15d658ea5dd02039d44af44ca6541e6f4eb7242ed1973ddb5cb0d08 +aa78db6ac14d7efd2b20db298ad9bc1cd6c8b3620c8f035496ca386450a81b73022bb9d6bdf7b5142ea8e49e923a6515404f166c24d1e01 +3b1b040759e083212dd9f2dd0b9bcd7d66f2eaae71b4da533dbaad18f34c86e72d0b836d8a78c0ab0e9fe657616c67c021b99313f0661ff +e4628a9d3caf75c54727c1720ac71bb484fae167b24d2c197a07cfa10343dbebb02a23e45c7e6cea8f8fe242a3d7407cbcb1553d05a643c +609c9783b43581b957e473569c3b2cf88c1ef91eb4a62392b20a15297f8c85cd7a1cc20b794abae302e3cd3ca869b4dc2258c57ea2849e8 +1f31ff2961ef1f02bd7170677848c1d2aa5f4b854682148e651f34bb90fbad9606bf1b096f47c0a662d03869ab963308b7454d921bcf04c +35272d5684b31c6182a4b446eb991a92ffe783b497aa09bc969169a843e795c577c94ddfb2781bdea0f23bcb5b98c12cac376085219ec53 +54bfb1986bf9e8e2369f4dc1cc59f0e4971d2710037e35cfa228482fbc8fc197fc8a483937e72c54728efbb7e26b3b7122143e62e0f96c6 +bf7a5673444f55af3a224f980ece97cb3152ea3a36a45a47a8190d255e8f8983aa353b99d8441969b5ba7f8c2130766052b7d9aa4962d73 +2d618b561b38ba4a7d5851cb1baa6d032d4078114f5e943bc53af0eb52e422361acd6e088c98a477000ae91b11242f083554a921837b69f +be571ee7460e8877a74d50f02d3c8061591c73591cc67f13a4c5ee8ee00211a4142408a7530c0de5c606d7d76479bec4d9c0ed8d96a1274 +b589488fe0e73c8be1f69b1a5650ffda224c263544357b22561f64ec9e3b82525022af207610073d6b26ecb3a3f534c95c5bb0536eecafa +f7d83586e88e7174becc82eeec7d8ab52f86caf55fb12d6e08d29242a38cc7b4b94a6219e463426e5a4b38a9f33932c1da2de02ac96a5fb +a25002790ab95cfe61d720dc29cbac8adca48da51bbd22cb79a81fec9e9a3af21e7d22581c4ffb7375920ba798871a0cb69ce6c98fcec09 +b4520d27d4d062c151865704ca63de90b733c7b49b6a94ba5477e2c585a1e81fffc5d491d85027a9cb77334988a915e5a79917607a00354 +f1ece6334d9f3ecffb5b8c10f1d059c2f63baad95c239a9546553045cf3c9f318d7169d24db36ce3b088609e766882040011b7bc05bd271 +b67bf8b372fbc750bc3edd134d3c59e87ee13abb4c2ae32f66b42c5b48ac382102c7039619a94f8bab8ff56ed5fec6b44cec3ebdf74c7c1 +862b334cab340202d1a86b56b4981e25d83a33f5bcbc48b260c0b0f092f133c65dd1dd6450c0ae5c04d4ed44b16237f0618e4d810dfccab +1e884693e683a46c79b76e7028f0a12ffca9115df65e7e7d5249cc85eeb1d5b5a736f47226895c0445ddd714eaa636ef4d866b54b7f7187 +38f539c063f6e84ed8255390e410b2400ae390a907b2d428de5c10f78e499d8f433f1d3ead0872f6f8469b35baa4c702a7b69ea9a6e657d +6422c00f300bc15cdfa9a41eab53096bdf3dcfb2d80ed70219818cd697bf03759aa888bcee86a01741e316cd28441207c12fc9b36ee8cbd +c2d774656b58441799fa05155c1614c4b735c081c5af2e18d9ad8abc733d2924fb8d6ce8b733d56d67d9482aa49bac974e7de109bf6d32c +924e96172455c4bcb0aa85b6812c704a2af87c683a1f2a9a9101d0fe0ca70a6a6d5ca1fff045b823235c334536b9c429da3272327be745e +fd912040a6445c245f5afa146350f9f193651f8db41ae4d4afa7ab81198043be7cf59dc6de0283f27fe848cbdb2962cacfb96803d9e7ebb +497ab1b0e65f802bdd27b9a36333ee24ae7f5e94a8cfadde40e17b01d6c72d1463f68ef98169eec313f97a02e0634cbe89e2dd4c4d53217 +fab8bbece82b1ce9dff25ccc6f7c86f8e743e269492aa5cd7fae7b0ec5ff323b53d70ecf0bd8529898531c6b85f42a304b152bccfae92ba +ed9732d68584c507b510cb27c73277388eea9567b7c3b1f7611d2e2562a86930281e815c0919e87c9ab923cd8be7175b7dbe8413e37fc51 +2e0d4a0a8d47ac53df1e19576369539f7b5d74be7f93a2a866a041fe3a8d23196057099afdcb41353c6eba769edae13e502c8a33310f700 +9faf5b858b9fda982c3ccd28db2c9cecb7022d981c47967bafb8cb4be54f0d426d5ec7e414e3ea0eb9a0e4218ced00ceb393f4ebeade224 +df16af55305155ab2af8fc8a983ba64faee53aaf1cb6e5a1794d3fd0506e0685e4b002d69148aaa795a28d3106edd9a6a001ead88c221ac +539cc44a8a282455c25804a6c26ddabbeb0c917e835a1f71acf6920a33c2732d75465077cda205ae87c9d23d8b8f67d565881ce3b4c48b6 +e06d93e310fb1f2fa0085493682ee124d582d85361e29c0cdc2f68e93a124671d9e70c4328793406c5622864dd903c7a5a0244cd24d4a8b +61f4d1647d524e5de8acd571219455d57438b0907a230ed3e47a9bd3f291548aa15a8006308e7f1a8593e27f9fa55ef280266a3f1016212 +db2921e80ae9c5d838a24071ac873fe8245e2e877d466f69eb7c87dd9176f31d38476ebfa9f287a699b7d4634902d22b843c575714c84ab +f02f04edf7f56d7646df65c155933b643dca2a2e7621660635e215401ee7004ded4aa9e023b13bf1cdf44720218a02975b9c14707a5baf2 +25bfc4937ead5193d533ec78246de1dd94a23f56ad47de9d5b6a47ce60af33324f5afdf1981c2b460da884ecbe4a7f082527fceba6dfbdf +a5dd32d7cbc08a0f4f24b8411821c0b22e1053029dfb9b0d0e61c997f9b4efd9783c8c384cb72a042c1ff23d3eb802a367502ff73e952ec +cfd9b6fa422193defc9f040df291ee198b931fe376b5a4acc56cae472c734b08a4eba293503bd534a14e935b925322d5bb083cfd2ec1600 +893ace9e0772339d17f724f4e54f1d9a998fa93dcef407ae4bfc144938a7cacbbf506327b6ef761f6b8bcda139b2852b5d10f325effb71c +bb19425c6a212261604b3ab229fa991d8c0011fc3bc3592d0bee2243db7485ab0fba3520538ab9f527cd5a1dab5205de3261c8283c93a9b +6aaf1e66c32b7a445526cffc142ddeff1c172c583def9bdc2d9f73882e65b9cc7490739a064c62e04f4ddba4957badd6b50c64a13d8790e +2820dd20d6c1218462af6a070c768e8c953b779c732de4ff756f87ecf2695caed49461216883bf5539415359691a57e69b08c0630fb2732 +eeee2d6e6d99df1cbffc2212e79c8cd2ab4f8052acf0bd2bdea1d3337cf5b1773f5a1a095e431ed7e467fb386dbab83d30b4924f6bb4d9e +f0851f3cd218c48441af9520e2bdc12db9e4d3b22ca685e9547d2a24a5b9aef06edb4944fde879a8ca7fd2522fca7591017e16881637d12 +01f13547b777fee849eec6cd95d2bb18859b5367e1ea78728bc7a7cdc8deb7b92103f65fd799d23dc7e31adbe62b729dd222fbf3e15a97e +f72aea07e183577f591a081845ea340797b79c6c8742e8826a6d7df773ec8564025fbb570bfbc001740e3437384df6324c7605526d9a630 +a5d4483f1 +''') + +db_write_enable=unhex(''' +06020000015ddf5d76a8e3bab8b10d9f82f0b31652d5b208dff1d20745b7c5442e09db880c80ca103d5b2071d8bdcaab452b900d1785be2 +de478669e72a9d082273f0f6176b700ffb65a026af052e76de5f9e247e994bed7c79e34815b465a8070a76da7d365525d7285dfb152d24c +732a471f031d22ebb67d6e27bfff74b3ab1c4780461a460c0ea5710fbd32ab59a6ca9ca3e3e24264640b15245a6c48b6bd20c6848c2307e +854af75b059e86793dc7a30474a1b1b5484c58dc5a4535eb71911bf9b10f82c27362d68b4baa1ace63a33b7cf3de616810ee5033601febb +cc08b0f55166f4ca08d42d3361426712f7e5a4842e9d2e906c87e4c5c6694eec448c109abe3238128fbbb8b8f383e3b66133f0c9d38ca53 +5d47ee9dd8841fcb205510452bd0f733d416b6c763f0b7a647e1992ede714b6c4569de329440549a5a1f6646dc88b08288fc6f9c4f55d90 +ccc86487af195ed635e4c9a5a2df5df3bc4e39ff0ad6bc70a54d142a01ba9ef22839859ea1cb9b227cf9407a9f61b3cf8273549d759c3ff +b6db4b33bf9a40f6de2680cde8ad01158ed1c6771bba9fbe230c9e9b8a4edff941f43c4e629097c6149a5ac13ebe757b43a52af3f263f8a +a36ec69989c62539b656a49dfdb14ea066ffec203c41411de29251bc40f75860976834acf368db991d0c88cc5d9f8229be691f55c1dc298 +dd0690aa09f46a7a0dcb92909a654a54cb584ed65280236bf368ab2ae909086dcbafa6fbe26556cd724ee9e6b7b3ce2290c5cb832bd4301 +66047ab2281c55e7d9d29637bbadfa40b4b9a5008e86239a5998d39a5dda6cfeb7d0bff10bf56c523878db6de81b7ed824fdfdd9515f5d4 +90345b47172bdc9db6bbb10f19d39f061fbe53c3397dcb8fe30d5ca032ccf2d26184635b691705b471d81dc86ee31f144512072d9ef7559 +e9ef9db8a08fea98abb6706833a9684855578ec04b72ae1bc4e559c87dc1dcbac3115c2c6697cdb45762402836580f29330cb0fe8e4116b +dcd4da603082ca420f5de71b92657c5a6ca96f51e6ed9945ffd39e9c79441ba5cba40b2c09af4d16c3d7957a2d8ab7469819c0c6dd177e3 +e7dea2240a1d96756b5fde207543167417a74e702df1781f65165c4ed7bc993e72789af03c2cdcdaa7b558423fd064328d57f2ec9a8ab2b +ca9bda6f625e103a79a12561675e05b448f5dec7554649fb10ee3d28599306de19f63ce50e4c346cabff9f5ccd36072831664c308e63184 +cbf31e5541f46e01500d6ed045d7d44eb8087355c5bd5a65c58c705b5299e52cebcbc79254d20b6835c76cfd47d99f9b1f4a96169249a5e +28d6ca753efdb8a008edffe2a7f68ae23bb7d6f84f40751f0232251d4ad4dedf0fb4b8b5f8fc4701bc4578cd8e1c4bb491d16196e952e0c +e684e63ce9b608ef61551011328866545a6999e0881ffc758e41b451e1c2c8f571294eb1d5828131af9735003d00488200dc3b9f6cb6a7d +2bc1239367b372914d4a3a3ecafc89372497d9621c1629c1aeb40d9b6f17efe1fdf19583ae2867efaf0c682d59ef72397c7d709da80425c +30b91b1716893039205b9dc46ef8979aa5f8004c6bb698b35c4b600b45cd9dfc2a929fec37d392ce9e3b83240707226402d89bb034c3a23 +07413ba39eb1afdcabbabe9742fe2c62acb679a57ee903de0a788fee19d550b78c4f2095e388766724061b39a1e54c585ddbce238a385e5 +0c4ba9866c16ea8f438cc58aedacd6c2652b0ab0847794f80968daaf8a70422c28545caf3e95c38c54e142c8ebf26d5b5adcf905d8f105d +ef1df70997ccaf59e256e7b178e4bc9ee8d6437f23f59e7dcc8fb3f18769fa67bba0b4791cf8c0a4e330751e671be3235a9ffd83272eceb +af2d3b91a91599b1d4f84aca5660dca24acfe5fa78e95f944b4930db9e81a6f3ed23c90b2a446ad7832b6f4bd8e6b932116f4aedab500a4 +dfe311d54b3ff9ddd3c73819b5c88a47c87a117c3a008e49361ba1ad4632d38ee4f2fd8822c079a278b491ed5b9488cdfff5ea48dbf8aee +793a2d2e837a9f5fd195833c104da32c3a1363ac846d2a59ffca0c3b1293415069db5e459edf60d704de47138c315df3a8440b378ee88e1 +cdb8889b08e0cbeb4ed98311e5218369535e03062507d7c1d13b522e3eec020ffd4cb1b2297760adb4ef7c76a5fd2e78a60bee3cf246f24 +8fad7fe6fa8e9c65b52515a7ce73c47c20c04c32f377e1d0ddc20e7e96f7fea55fd85d8456849ffe4cc3c6a03c5b9f21d055e4d498934be +ff14deec1e77f857004d929409e23e54eb19e72a733a3fb3abd035b72a4a4c2076874061baa5526e855be24b413758cdcbe1150bc916514 +254ecb95848fc717718265a6901966f22c33dd6ae48ff9cb5731446addb3ff2ea17b1c3586e52afa23bb44ea6c2bec062c59adcb791736a +a2da95eb8445a6381f3941917bed7fcf01ab199228eadd1968847e4b9a40022d2b0ec68318abf97c6d46286a5 +''') + +# FIXME this must be very specific to a particular device and constructed on the fly from multiple hardcoded tables: +identify_prg=unhex(''' +02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210 +000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020 +0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2 +0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014 +0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0 +6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80 +0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800 +b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a +ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7 +00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3 +08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0 +97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808 +d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098 +7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc +800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928 +00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180 +0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800 +abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a +020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260 +02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090 +0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131 +415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b +4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828 +38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f +201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341 +c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c +2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818 +08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180 +81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e +''') + +# The following blob has only 1 byte difference from the above +enroll_prg=unhex(''' +02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210 +000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020 +0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2 +0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014 +0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0 +6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80 +0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800 +b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a +ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7 +00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3 +08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0 +97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808 +d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098 +7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc +800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928 +00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180 +0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800 +abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a +020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260 +02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090 +0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131 +415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b +4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828 +38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f +201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341 +c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c +2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818 +08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180 +81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e +''') + +calibrate_prg=unhex(''' +0298006103230000002000080000200080000001003200700000000080202005002420000050207736282 +0010030200100082170000c210000482102004c210000582000005c20000060200000682005006c200129 +70200121742001887820018084202000942001809c200902a0200b19b4200000b8203b04bc201400c0200 +200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc20e803e0 +206401e420d002e8200001f0200500f8200500fc200000b8203b000008040014080000080800000808000 +01408300008080000140831001c081a0032000c0000000080501101004c1126003400080310071d10071d +10071d10071d10071c01065810080101000007c8078c06100000204f80007f000003070107010c07032c0 +8fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d800af908f8800b5d +095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b6109628 +00af408f3800b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af0 +08ef800b660967800aef08ee800b670968800aee08ed800b68096c800aed08ec800b6c096d800aec08eb8 +00b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b700971800ae808e7800b71 +0972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b7509768 +00ae308e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf +08de800b7a097b800ade08dd800b7b097c800add08dc800b7c097d800adc08db800b7d097e800adb08da8 +00b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808d7800b810982800ad708d6800b82 +0983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b8609878 +00ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace +08cd800b8b098c800acd08cc800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c98 +00b8f0990800ac908c8800b900991800ac808c7800b910992800ac708c6800b920993800ac608c5800b93 +0994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c1800b9709988 +00ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd +08bc800b9c099d800abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b88 +00ba00801800ab808b7800a010802800ab708b6800a020803800ab608b5800a0308048020030704040200 +00000000002f0004009000000029000400000000003500040010000000170000003000cc0103000000ff0 +000001d000003ff00000025000003ff00000022000003101112131415161718191a1b1c1d1e1f20212223 +2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4 +e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778 +797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203 +c2d182e1e30182e1c321d341d341e321c301e1e241e201f201d1c321a301e1c211e21341f1e202024201f +1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341c1e1e1c221f2 +01d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220 +301d2d302f2d2c2b23223a211c7e7f807f808080808080808080808080808080808080818081808180818 +080808080818081808080818081808180818081808180818081808180808081808180808081807f808081 +8080808180818081808080818081808180818081808180808081808180818081808180818081808180818 +0818081808180818081808080808080808080807f807f807f807f7f7e7e +''') + diff --git a/proto97/blobs_97.py b/proto97/blobs_97.py new file mode 100644 index 0000000..28ee998 --- /dev/null +++ b/proto97/blobs_97.py @@ -0,0 +1,459 @@ + +from .util import unhex + +init_hardcoded=unhex(''' +06020000015cb560afa595d0dcf4fca09ebb69301e2b9e24a5dfb6f2602833427d3bd65222c418ff15b54587ab2854c4fe9aea74fa55567 +2036fa3ec73c6912c58b1b49cbdcc7664165482cd70d5bb95d9d469626fdc2e012d74157c5792260968a2a4572b1ccccc26ec2e2ed0ddda +1b0931d3d0566460915d43e0a654a0582706be9113ea88f0c15ba058507efb0dadecb4a4cc64444dddf050b6e8d4ebb34ebba33e8651c75 +e5fb28f85c83197df1de460d9e1cb82208753ceff0ef60a823dba75d05548f5b3a5a0e2972232f7403bd6869da90e5371a0ab8ad23972f1 +597630f5ff7c8b8272800563477288b5591bbb0341d3975efc1778225767fa35480ff7f8dd633e4034ac32e4af58b86ebc63552cb35b12b +285255deaf3a32bf46cdc5ad3bc1c9ed1bcc112c72143f9aec568e2cacfa89ba0c7bb65590d8b93e6871a33c6c6983c0acd04e737ff55ee +e024ca6b9a48332c1a69a5a3fdd24b964cf7e7c55229bb0b48a6e339eb2c42d07ec850a4ee780660ad6c77ffa302a63bd19426134c4533d +69192ef2e16591df26394791a4ecb994a24f5a7f70f1eb2604e6bfb67a452cb74ead8b0d9808f890ac386750cbac06ee03a852145094053 +b2b074b9905de5cdbf2272b67e51f159164778d6d2ef7a1ccb81df9f896ddb38ce11e8140cf6cb9c82 +''') + +init_hardcoded_clean_slate=unhex(''' +06020000012c40c9d271378bc0912ef5dced69bd81b7fc16972c7b46e621af54a00e2cc6baca6eb83ea30222dfc6c925262006ae93412ea +cf482f2034ee7b13297474b7e1e91f279cac2ccb7195443e4dd3328cfd292ade073fcc2eaa8f07b77231130ba997f921b9be7b4fb6cc691 +0d2976b3e050913b27dbe73afd6e964260b9435ebab5117e71f7cb68464d4b6f8afc7e1a421f671f5854a1d0c8ab93ed3b88b2bc1a42875 +e40b15f0e78496ac40e4a4a7fd39a97534ce1866479e0384f0789bbfc2fea0ce982bf7a9df97d60b237edbe1b26c9791043a96b81e435d6 +de5971c758d374905df95b0cddabfbf531749ba191f07a6f5e2722852f137a53513a9ec6ab30c3f09aa6ce21b391e55cf81dcda6422011b +f163317a9a4382546141d45f2274bd660103bd3af705f3ed12e493bc4f834d5d7f162e2c3405cf857b00129789a3353bf7fab7796e267e3 +062d55660dbbb857911ac8e871c460dd31c56a86a5631475f0f2ee5e9ce2af0faec0931a640ba2394025f29ffeca3a7e99c15a78ce1f1f7 +808cedd7601b9b6382d72ca873257d4f6af70e29e22afea15e36e0282b8f0bfc68ffa3417d212b8bbe11bb73b363a19872e6e947d45de30 +fbc493ca083a0a4650615d8628606362081ca6df5d67527971d1776ad76a7a28c932f0317b59cb4a82a14b2bcb7b01fb662be1496d24d91 +9140ec80068b21a818daa2fb8e05f63edbd4bd5797c74a28b3e7cf81c9045248584977711341fca3f08ba91ff853b62dc24ce4bba4ed57f +47bd458545d805b6bb14fe0cde01440b60bf7be937f6444a8e2a10ed8fa9ddb8604bb95fe411b97112e78dbf5a4a0f004669c93765a9f38 +665cb55f5658895c1c06a7aedf694bfb3afa9b8b1dea5ab85c821ac20b0663b95023642fda36ad78e3e00140b966f404f7e55f0b416ea43 +b4c74c39900830abc6906a1004bef1b5b7dbbbeb5ec1b22604ac86429b9f56511b746a7124c449b8c9498f49144abc2d64f6a114f1d7f91 +aa41249faeef4d838e280cb5d6fc19cfe86c75f +''') + +reset_blob=unhex(''' +06020000013920c0cdd8e7e68d6ef897ee686fbf657f83b9514341e1d3c0835a28c9cd1ccd0016644f74d +d02a73b85d95f4d352417cee76ba0bca3ce474159c62ade3e10797715a13f15a292f5d57c6d46cf8f5ef6 +587a3c55244f2258ffd08b351dc14af0da36121ba0aa4f1147ffd0cccdc1d6dc1d5fa7adb9841ff79c753 +e2528dc27344be84a2655ab01039c74999b90a7f008f626791d68a76a57b07180129bad2c0a67daf6a3a5 +ebadd6a429fc087b1e68f1e6535290b7f94e9a9800330d866c5a67b4e974029164f8c6fca8d93c86211ac +47d96fe386faf206f92f4afd32d3a90c4287377e8896aa9ae930543864539df833345d0a1869169d69100 +8510c91dc1a0ec138669c2efb812c7b9b7f201891cdebe9c80eb671ac8a854bdcb9990cc23950f9f1dda0 +d0119b8c5c2d8446310e8599efd248075bad6613ceb13f0310ceab6ad17b18c8a245c26363ba7a7f24f17 +972861c6a96e728d1be81a68d66418ee2dbdc00d240bde29c781069f93a06dff89ba4039b980d3c9c2a26 +a7f41a02a4b9f1c0e0f75f0a59c5c5003d2e90a209cd9f8bdf69414262e238dbe8e1bacf6c880f59843dd +8111293e24e99c964538842dcb0b4a8cab6d227cbfe0647cea763496425152aed507b2228e79c8e9bcaaf +6380c1d2e7f56c5563706cb5da5b238371ca4b2627ca00f9bc9d71cd73ccf02f02f42e856f9e8defa0195 +c8647cb1a0a63e6996a1b5906080851f1648cd061a585ddda05fc8f37a99a0dac92dfabbfade8f89157cf +11d356782689838c358f4790480fd341c993ae4cc8a8c93cf11578c0571e0c3c8a4964286eac3fae27507 +d9fb2ee961953d86574e6e5f6d38cf2507a714adbc221867bd701bdffae0b27ce47ae8d06685e534342d1 +1aef07f2c998fffe8673c2806e8384738b8f4ba401d417cabe088ed2fa09c42e97af72f878753ffc50b87 +fd292662f421bc6cc8da131957c84f4ce4b69266065d35d3ab91362b13edac27231ea1b6485faa6644c64 +6747b86341b6d031f6a52b6ad855396b7b8cf9485f50365cdce203355bf2fceebfa59b266772ff2578bb5 +03f92ca35ca2bc046d63aeb4fbb0f477ef41c65d10c5cdcff5de10afa9e7bc08b026f0fa649629f259c5c +2978d26dfc2cbf48f59616ada4bf2fc7a7219fc37d9f5026709e7b472b6f97f78d47e1c5a6af8e23aebb8 +a88f64f005abc93251aeb8561b0d855941b33ac608413405381fecd0154db93812843f15b8e5e118ba7a7 +cdc051ef203a7721b769abb3c17c704eb0acf6a2cde267776dfb1ff8d82ba2341d0346cd80cd4480767a3 +d0edb643c1d9045f24096bd1fc324c03efc0977736725b2770998ea920c19a1fa9add474714a5b7a2a318 +7e94cf1a3492814ad145a7b204e0b3d35dc4cab2424a891f76160ba722a25bf9906bb3a476250b756249c +aed3c4d52c4046012da280ec71898e8e393559979a74432f1df2692616c761c676a0260c7e4042bba7387 +d3c683d4e08454c7f509b7960a1db2a1cf007538a38a1e39b0a0310c9b77fbf21ab2b3f2e76f3ec9084c6 +f47f4fb2fc1dbcab40a9d1f6c8e404126193d26ed98270824611c4840087893b3204837e282bf29623080 +439336435e801de053cebb066bc7a440a3f34fafc2bb7252c5dd846af3404e93f1172ebe2b7861e09d58b +cbee0400df8fe627adc42be2860a33d40748bab2f34262ee32409bced9cf8fea90bc32d247dc2787d7289 +65373063851a991c63c480b67cd301a9c312037c72ffc04120a09b1413756d4e5bb0bccb550c6cf76e2c6 +35c8498f4e653beee2fb683db0466280bbd297838a8d1f2459a58db77446020cd20b82a52ee5cbf0aa908 +14a199ae61dca69d0bc90986a2c26b8d65357e3925774a3876ed0eb80124a0bed4c2c0bc632e1b3c1a812 +2b54b023b05e846d78172b97424ff607b67c2c11f21ceadf82020129e62fb0918e85b623134f4e5e18870 +42b632662a3d33c6effa4a967e09a4d988dd084fde8c9d4b39dd0e6521b8e2d376807adbb5b86d914eca2 +38a349d9b0fb23b64668bdfd45f6a735523a31878e4975a42ebe2d3c920f550881818c8139cda34df3669 +b89aa5fc8b3bad460de2d76d431435c83b6fc0efbaaaa84818e990be36b72826f00f1f2b97d63b680d83d +03f2ac5325f8dfc5d460abcbf27ed4ff205542702974eb9bfba456401786578efd93d69ec76a41df43798 +76891e39acdce7a32e94811157d48829f46b5755d9721d935c73a28423080bc8a48882b4439e92ac68413 +6a52b078e06a730596eacab8768d0784b0fca63f8a247f2523ea5d4679a8957af6b314594681759ede769 +76937c5f99c7fc9326579d90fe7a7fe0d512858e3221b50c4e1d9ff16f38d49c52a524ef895dab24059ac +7a2b9dc24e59d8b38e4958d51fc309deecf987dd79697fe6ccf955e06bbd0ebe69aa18df39b452ff9ebe8 +f2f761c1be272141ebe65d0a625b5f1398ac2ae129ee5c1e520beeb492748f9364742978249470be45279 +11bd9aafbcbfa5e90a56ce40e42b995c82f6c5df51cfedc41a6963475e2d39641e2d7ac624d184aaec303 +465d4441b1b0acfccf9b45cc3e1825a01be94e93ee16918793a809cef222480377558ee18bc2801e31f24 +3d609ead015a0a6cec743f7dd0d951a7e0bf56d45ef20177373972602417024412c2adef44b881da42138 +5286c9e31fcf98b8f8ee10a9ee2730429579825ac159bdee29d1c4cdb9073427d0924174d04818b6586d2 +d2ac5318156b6139bec3b1959d0d1a8b46603f0ae9862214fff30c133d463cdabf875ef841e01976ad06c +bf74c9987839e8a0e41b6a2411e542a061b23bf5b261df7a0cc844c510c102b4e03fbc44c44e998a51699 +907d252e91e3e89c0728f5db0b868ff2c55fc53d9230dd0dcd01086379a8821a0cb2b7dfb90b25a8c452f +285185457827dea2f5b3cf1138e23e9a8d23ba1f2234d233c0c7f0595471e7e3a62d8fbb8a5fb900a3cf0 +3ee4943e4a4ba5b51200f02a6217ec29d7d5177ba395c77540b7111c5428ab069613c7e17094c5d798049 +3ce2d945393f3fc11765629597817499cf6585635a3db8d6471af509380224dc04b574891ebce80cb7ea4 +d0789ffd7b76637fd460ee701b60be9174eeb51f96c6811a4e4dc55ee545a9d9d23b80059084616521742 +d9b7a47d60b77dd0ed12f10327553448655ed7b7a9d7366854d908a4c762fe9048e4e4a3776f2e22f90de +014643101de4715754efd62762500c6de90435fcde78e9fb864045cf8749b93907baeb4f47230547e78be +a0e01d918426c3c7a3bdbbf2b54394c44273aaf163306450505862af4778f667d7c34a894c8824effe124 +b9993690d1519015566849652d86e158830465fd1fab08e4cf5cfff1f437ae0c713abe1b8e1fd15b1a796 +3751504ea02e4ff1469300a689d4ca4d796be229b4cc041296f9672bb2383442d492eaee0a17d174ac699 +4d2c1b1a117e54da2bef43347129d94bf4ea029271564f05fc3f607bac5e06e741ed5e9d51a2efafec05d +7926c693bed05ee0bc81c1b6aa6d57f58b01aad2d69613c201e86312bdd2e8117eded970e298c096c52ae +d21fd7f8aa03e3bf3d280fe3b3ca4e49dbfc90dbdfcae59ba03eb38458cd01f6637843526881b8df0b019 +e90e2b05bb4154dbac69e82ef4d8f83343fa2b0f10f71f1f0c314f41ca366c296fc41830ab1998829cf55 +01d8afa090b8803aa1ef94dc8a06c231ebb3e42cabaedc50fdc40832091307b4dc46398c890d71863522a +927e1d90cb72d38afbc74ffe8813ab36a168822b5caf7550af92824061d076b5e1f628b6e4a36849c5182 +58905e734a2dd53258df37305a16c0b844dec711800a822dbf691327b7fac815cef33d59363d56c246d04 +e877ba09c4fc1aa70937d46adea4b1ba418695a7b86c0d9332b71d44b2dd8c88c93a8efc264b1c29820bb +5b66b397136d9715961dbf7d5b59508015b2938edb1938e68f4e354eb7dd60b08b4460c05d1f291e56aca +32bf30a59b1d849993750498df7be8101d38cb2781cb52a640dfd09ad469bdaa069eb37b7462343819ce2 +024bcdd1940f97eec044f7fe41793fda6edf53acc92d2883fdb144de0baa6fff19c59b3b5a673a6be202d +8afb436fc6bcf3a5bce2ec9919a9d2f4aafcf2f83698d56fa43efa7b07fd1074b915344d6ce24ffdea58e +b3afd95d911187b1070cf1c97a80ec5a5d609869e262b347f24b7e33404e6daa06c89d45db644cc6e29df +41198bc8ef699415629b91b6ba52e5cccfc367654ba4fc0c7c6f40a2d9ce519c84a6315dc6e951f828b1f +5d3a7c6e7e4a3271dc21c82329a163315a763c25710dbc33f9b79db33eeeaecfb8345d503fdb069160451 +67cd5451c5feb5358b07b085cb710f348150c92948aef7eca1bf4f51cb31b7429d28ad544cfd325691524 +ea5a13fb276967ff78719eae6c735d37d7206ba951cf115210ee0c3a0b07268c57a926a4ef8dbd8423190 +8d15ca9a2f1b519ee982a539eea6e874a6b04cbb65c62ceeb44d7ccf14791bdf5f056bae592830688f03a +67d92a8b6b8ab6c40c651eb4e2366fb31434475068839466fff8e5279cbafa713b8d51dcf68001363dad4 +ac42946ebd79493fca1a868398063193b4f0aca3a5af2fabf868813b91f8f13ebff3430d31ea0d4f43ed3 +f4b620cd555e685d4ada88cd1df2dc108e1c6202531b63deeb47fc56cf5034a31f6009dbc21ba392464ce +c0f410756705d402dc05572236c291eca7f2de1315b9d120f5e90272d2643ee4f941b387b3dda516de4a9 +a09b3407ceceb015206edd6ef6449fd3304fca2f306e455c6daee470edb19732b76c1982ca03e325d8563 +c7531abdbe99e8a7742a9802afe43bc46fd795d46052b527d1125f65427c60e6bbfe5e4d391c391a62118 +ae1ce651622ea9f2a6f4f6a57271b35bc907ded5ee7026adc8f77f50168b75741984e9cc788acc8ff4de7 +a1aa976466a45948d8b40e3a9ce32ecae381c3376692012456b76ff9b58d70b277e564a2edae34b459476 +08e660eed03c3d2f4f7112a0bc7b9628d86694f8dd1fb5d9ad8c62c957c1640aad6d0106b1c9d089cfd1c +30f155a1e84a2a809f08e212b8b06a81543f2fbded09620782bf8e2bc70461b45a567727c74c1703a23b2 +3d3014db6a05a368ff9acc84d4fde73f1763603bdcd899b61cb3bcebb900268c93fbd0f12f702661d7582 +b188ae01922c95dce32d0469e30386774afcf89e4f107a949ba6dedd17d828e480ac653c07ea30f780879 +be572bdad635c0f9f87d88360b5023e58b661f35df98b7b1a0b1779179e614281147d9c6a4f0853e4d435 +432b4d6be3879315e2c4fce0ba32a9be43fac22b4f12a97caeba8ba4770c89447dbd902287ffabfa3d270 +64a45060a2fa458e950f34569ca4cbfdee9b3ff6391bc5a0903e66f5b99526fe75c10a8ab4fa9a100948d +71ab96d51e3076e84ac00460eb493b418130f6ff92c0c0a2bba39a14b3f5f003583f481abf35d39dba4ef +e41712a6eb1f8021f18d206993c685d806a8c8415cbbc15332ceabeaa8d8f0de9af037c1128fa0207ae5e +915c79276e23252fa8255448feb00d79931948967db93f8c95336237761d2eb9cde0eb3ddbf2b0e698136 +7ac6c5843902670a5bb3a7fb3cc338f7b498cc07db6454e7c8c9b2035e1e21fb1046693a39fe27fc04a38 +0a209c7ce67c238bb227a9bee07407a9fe65b0914976af513ed2f9964574bf24162940269f8e34d6fed0c +0769c81a5dd890e2b7d92c4ad51126ec8158679fa5c014428d67e485fdcdbe24e9a8f7bd46ad3b02354ed +febc7133cf198a841a163a6580ad89badaee7620419e30234ca94744d936bad9ffa468bcf669741fadb7e +7da12908e4903eba485cde036725fc4ffaef6e7a1500f40428418ef570b355810ba4981fdfb039b4e5d84 +50e979ab8f676d1b1c84897fc5cd7ed57e4962686a91687f04932f690ad55a85a7f235ea99d3ee0ee9a8d +5ef0e84d43c2ec8ef3b3da80a5c3c973e41e6d85cfa28f53c3cce3117b05662f23f8f37923518a77e5408 +76abb03b6b1bdd606ee9127ed6c03a8b90a30e772ae9fdd287cff1df87d2ca3b344f615afdccf09f9aae6 +115fb99b7a4da857c30d73e08c7cb474a65564536738f64630013e6e7a375ef2b721ceeb77c2bee0be730 +5f4beaf9fd048ccc03e2a536e57afe06cb981b8d788c0114b1422ccd025205a92d1d98b7de5f604e3e55e +2621f2d8933169615c9e5a6f354396e184ab69722b33eace77fde03c67b553084dbd35ca860f8e1798827 +9539eda36bf63bf8b1345491ced4c6c89ddcd709ddecc764a86565b8ba49368c4a4034302acfc0184c3c2 +d9f8ba34fde40cef6d3869fe6a5d1af17e059445d3bf9c950470cdac062e2986877ec72a79333089b2ce6 +9ffab8c5438a1298bc50e0e9c2e286e55b1936ab0903257d52db14fedeeb67da7a1df1506b0fdc4a50d2c +721450150b25fe8cb74c39298f620c029dd8a9f1f9b175c5083a6437d0a8f5d05489aa2ff31dfc8ed83aa +dbee192b11169e3dd6bd496eacc42c46a952f81f8c39f88ba31ec08f1060d2f2e49c0b900508b4e9e5703 +003099bc9485e09e5c6a8c9f05389124095b1c9693a30e4b75b7f2e839eb252237a55007ac61fb5268982 +083d29e757b74c4c310aa1cb03adcafe17afd50a53e4f539fb57a6c5c93ee94cabf36d2375cf0d99ad0dc +cabb650f468737745cd0d5e66ca991bfdb46e05371bfa18a034669e967192a53bffce26bf2619a365c21f +9f7c54801780c12ad3ff7198e916a1a4451bdcb248aa997d25f312a292c9ae1f70efa6ef1e5df24e48cb4 +1243ccbee736dc9d32476506126500906db396f312db3d6710669064711709597220dc3367e720819105a +f78bfc5a109571b763f44873f4b820af8279d42bff9b5f9da409e0ecb9d6a3485d9bbaf2641461c1cf144 +eaa2cada36b38beaec87737dd70158735bb9c0ae7de4ddbed353411b8435c80cb2e66a701469c6e65f437 +1d114775c73d8bfa0ca04b38811b2b31261b86dc2795388577376501aad9658c630d7ac9fa4c1f262d53a +91cef7c2990d9597fb2a130985e04233cf178c611be685623ffe5b659af6aad10da3235331fc6f6822fd5 +cdad3f96e3e1195bcb3c0104ffacf940b570f94ae689924cbba86521af15be9b1148f331ddfa37ad410b8 +ef99979a56ef1c3c789ffb996507d85383559a229493ad0bab90478d123f0c577ef01c5dc5a3ea28f60d0 +8409544ea6e44724240b2879f9c2560270e0cc3949af9e22899377635f44cc3fd0120554503d06f4a2b41 +e42129e7184265b4480edd5031d57368789203fb9a666c1be6692451f684119d85ed4cd88fe63dc1d16fd +dc4b8508d04671f837f413a653483f0eee7b5300021735de246ee24d462c5d332c55d4c35c1ab9bd7c9a3 +d009076a838baa8a88c6fce72f0805ed73221fe98a5941d21a97ab5641d2e54df83c2437fa9cd88dec024 +1f1254c6a0ca3e85f678eafab8b013459590f87fd580fc0c05f5967a58f4dfe6a89ac1e47e4dc09adc942 +4336dd355c6f783c2698b8539c3f801f999ce5db3f041cca86b75e3e92e3d98922ef2c191282a7516024d +f2949c1e88ea6b53b5d713b57d3edd5c78a978f7d854e487eddc60c7685120980a5cdc259cfb2de591875 +d88f9b898ef60d6da810b1a07252a56993bb5bba723f4f838ec648e19bf63dedb33eb1dbf07f456b41563 +c0102cb18220b308ef60908e75a77e6954a4f2993b60c10464dafb40e79e3cf5dce392207e473913e61e2 +75b090793fe0bc1856b6574cbc6fd1295448b34caa325df832a095266beec91604a2726f33e54e25e9478 +d859c348ad45ba5b51eda93cba7d957c5d0d76f2de84d225a5cbe6a5553c1311c35f12281d98acc7eec95 +d7f5e0ff3a0b27c0032b59a656f70d0cc5a042ee5b72365c0c8ee03ab6c48e18f87e050fd9707104924c1 +59b48edafc57cbb56722f62702390e688a0bd463c95318d3bb13b44033ea78d19c665aea20c67cd7896ff +cf2c8e2806e5380f0d53b0b8d30fdb35d496a891dab54d3a4ab1b2a6f4b4091b48b339c5213a6f8c3f8ab +9a9873a605494cedf22b17a6defb8ec1a88f471ce7c073ce264fffcf9af0c6a37398491652fae2c29a496 +6b022fe608c51f28503dcced1d5961186c3889e4d5ea8bc94667c80cf0d6b5f4ccf3d8addbf56b6c78028 +0850e078f39d2377376e120ad05e930e1c58f50bcf980814c2e38215db50567c8870bdfa9940104591384 +55fdbb2e260190dfac1743a5d6dc9031b0c89bfeed9f70ffa84a964a185834b4e2d3f299f2c4fea605f4a +5a97c51fcc0fad21ead2867dcb8fb6cd6ae2ae271e89477d7dd03c34508d719a037fca0c6cb028112d8be +93fa865ba60c7d7e1e017f3f49a9f0114c6fab8fe797cc3a4cc80c2351880347ebd8288895fc210431c8d +27ef350588a81c382de3a100f8f8458eebb61e33336b179ae24e397661d622c82169c1081fdb929b9f21b +4410a09fab9938c40573757d89a4450a4246deadfe4e5a20f04b6162f06bb0ca4c658a88880df139a5641 +350edf1d19123cce164d5760b6806ba8ec5584effbb87cd284150ed6a73354f9829f5d22508da40bf8f9c +7351c45cf169a3f4e7354faed2f42d9cc08ce051e902f8137a8f79b924e2b3000ed25154e617b5d066ff1 +a3540eed0a4a3da0618d961115091a6ad9f831c25e2ec9fb1ddfa3c28f365b608fa1dafbb0ba9fe340014 +60e6af2c2da1e90aedcfb07da4e6603a9879834f16fa45cbe6c2206459058c750e534dfb8fefba9bb473d +0f307f2e746f4c4f6f7db41bdcc7eb5d7e4c9d5028ce143cd88ebc1efa56f0e9f3ef939526a3f56ae015b +5e42fcb7353f5496cb70baf316c8b1bfc7f26872de3f421e87ac81d4a2f51b6c44dce38a6dc9d93009490 +d84d81807e517f06c896f8adbaac3d5d8d8b83b220114d0da49dffbc5e2cd1e2b715e671b05aa1fd3b0bc +dfdad56f65d0393dd9d1fa384b82ccf9b10b36d929f6b8e433999448f23c6c228bff904c0b91d0490af31 +3623a76fcc4258e9c8efa7ceb4b82aa0cfc6c362eac5b1e61f2a55ec5d3f401a748acb6b8f2dc4641ef9b +d4eaf3d20e399956d36c338902c5e3b7ad13249b03bf248f41bb26de70db4d0b0b4c8dd51f92b5c1e9f3c +cc7cb4ae36945a16f6b428caed3514af83885312a6e176d9c555199cf7cf444915362184d82d21538697b +10326d0c5bb1e99b44ad644de25edbdd2ba404a45258d0e1682e73a42595b797f5e7a0f8b24159047d98d +8fc58ee9e47a5068d791bafecee6422d7bc847757c0800c95e23f3470f41500bc08ab71d671765cda7422 +7535ba05696c703b90ddaaa6e6973389abbea81600e36229d756f7edcc1aceaaa010f1c5aaa1e6f0def4e +b3a04613ce82527a67f8be50d072cbca685922d492df81cf737a69e29bb4248076464ac3fbe88db35864e +69b71d1ed5b83f2045f680d9cc5d447f09e5405a5939943511eac648c10aca735209612eab589d2d2716a +19059248ce4847f3a809ff04477b8378da77e796109fef7d686a5f067cf3d91aab97bd518f388173d9535 +26a3a77af043427bc2b2a466735a45846c11204b56a84394d724511efb467722ffde80899d3868a31c7ce +4c8c2100bcab717f12eea1eb11a7f28abadbc819ceef1132a57f902aabd43337172b3aec8fc7577bca293 +50551070615735499b2758b2d9c77d391497393b6ad39e3395834185a76f6ce93fca5376e6f5aa78b11a7 +63f504781ae3e8a773c91e3899574c4b3bb0221ce8a927d443d5292f3ad13e843146736f457b4477ba6d8 +f462505b7d3d0fa76dff52f01924e00df97944f69a3abe6564793bba2850b0084e4f8d2ace474a1249daf +1a4ffdd4a8df84c8d5ead6909929992ca1b6e58476ff388bf978d091921dda2db3b1121e573eee682e22c +d01818ae0b7347e2591dedf20ac857746b82c0d4498744744ccb44ff96857a9609d7a500f243a62106e61 +8eadffeb5355d5e5e7452f5f50b3de48e75adc2be249b20ccc4aa3f4ea357bf4320d8f42e5a3bad1bd3e4 +2c659f71caa3736871f9b95887adbc04affecf1076598d898917c0b54c63317478b8b8e65fa2e6b243d7d +497cebfef615c9974553feb3d33289577886697b6fb01a8849d4714ddf9688080fb0af0e6fcba733b8019 +28e7664b3840a02b9aab6307af1dd3fa814045733b53e0adab1ec430c40e184db1ceca1bbd58c4dab244f +8683bd4edb6e59470deedebe96080be666b779106de5d6acef113a6c75002424e4812e2d9997dec5391d3 +aaba00320314f44fac9e7ca9b8996bd0a61b00139a8c1d2c9fc52e6ab9f90eba248ab0b3c4444d4ad1f07 +ac36878ee68bce6c53801a3019b0fc1f1caa3ea761da821753a949724d3b1dca2457fd2b1df7c7f3879c4 +dab41a20ab4ced8dd9e8b2ecf554fa412153dbcab52cc68ab4d83f7f310e0c5361f9c780160908816ff2e +f457db9aa93807da96de3068bfb63a18660d29d6efeb21b36c3c34abf83ff5847711eb85e052854498474 +6965ceab0caae4fab0ae83bda024bf17d091132fdbf217f13d1c42e0671e324357c6d668492df202797f4 +1a4a9be3d7598ee4d4530ca0fea76da94a225d93729eebee40f217a9d0a0dbdf28563a184eb1a71f8c6b0 +0aa550fb21b0b1af62f98a5a165fb3e79d4265962e976c50875fbd374026e7fbe886eeee146d368899bad +54f97308f158ee3c33b290445497414186c47f3b54e78ed4fc8b5bf379b0169908cac2c654edb715f9b1a +3bc50992ffe9d4d5ba034b3a7128c50aaf2ec50497e68db2261b78f155900def3ece5d86b86f4a892a846 +483ace0e008728627219bb71d897c726e9a90259c6fc61e4612ae76e41aa302e3193a0cf5d68d380fc7b0 +7d41a757a459fc81fabc6336d21206b58f3ff06e390475f4e2b99ca3f0e4c82bb2d353375076d987d0a46 +54aec2438a4c1dc17bd2dfc45a680fcb3b5144d860424b8890b83be8dba8c30ecb06cddd416e01d1917d2 +eded83012bc19ae856dae5a6713895338a1f10c76260d61d25cc640292cbbe80897913e69c39a04d7c6b5 +5e9b54dd661bf4f2fc9900283a6c668f82b8e25d0c750fa2fd00de1355e655b8e690d3d2dd1118d6199b1 +a2723bc402fb38549bf13cacb217f42ab057fb2610d0f7306765d2c3644ee9384b1a8c0ccf847fdec7386 +efb25ba2e3ad6a1b489aed02cd8a28be43855e4bb718e7647e299c150173e53855a199fef2a797d2d5e0c +454494cc175cdb205117614d1aebe6f402e21eed9dff22cfbcab47ededf6ae22717e83f0b4904c4051df6 +03fd2ce44bf59f0ca07c065d08113bdf87b6c19891e07832d7d93a6845ddbd15d41cd416dddc8de81dbba +ade29c6f48c093c8df3c64aa69f8b1a36b79bc41cde01ab1758878b6dbb6b30c4d3cc5826bcf8ee3d159d +20289bf01ddca53c7978e8ca1180924fe3274cf855e2861645b24c527ea3f928e428a578c6cb791c8dc2a +96862aff4f0b383cfeaf325748f99510bbbc17158f038103157e293951db33b0307791b45e3750b781678 +3e8a1eb9d2cffbb619bba9b40d55b3e19643acc3486d8c85e75c536033db333d83be39d5cffc02e1c48c7 +ed56158365a50e9497474bedf48621f8c1ecb58bb87d99127e7d3b44d9ffdf49a967378b8e4a796f9ba1f +62d93433afa53443dcb145a27d2bc0d92b99be04f4142a1c94d497ff9477218caa0b318a04d676447a853 +a51e725419f58374ed6823cd69ef7421d81009d2151fb4799781da7893177d46e9e39a3d2e5b7a2ef1ee4 +585a606700a2e387dd4e261ce7840f817f5e80af8852689085ce27157ee2cb5398a78feffff635ab26350 +11d739455c3fefdf16bd7b1d665a7daeb33019bbc7b4688786e58118f77a41e3879b68124d04a8de72479 +428d222890cf07608fe56f9ad094c20d668d56d985083cd0c23a85da57e37095afb06c60c2c3664a13747 +8f03438be98b78baa9af5e4d7fcde06b83952a59f4581ac51471fbc4203032f1fa52de74d804f24d99e3b +1ebd7177795f81a996225dbdfaedbaf007f6e92fd1e05f59c8864b55614b3d0a1adddc03198f7310ace88 +254f71e115b8982d1701f6c4818a35f7c13523b81e2996fdd912c0160abbc2ef5b70c8e0bc5c3588b7269 +e5152afaeb2cf84d106e2e8b1247754789e5714c600fa3df3502374c53e5bd6bd2bfe4533a3d0bc1ae7a4 +368e811c1cc1047a0a8c085b2852e365735140404ca72c0e689848c3c4409037924118c59e7791f804152 +00ea282df22aa541e28d271a27b2e50de4485675bb3c8461ff105a17daea67f2b699a42db0298d44d57ae +1dab3294399694f30fd2bdc30fb76637381e941c0f07736638cf8e532076160cd6c2a3810abd6d8ebbac4 +7491021d878b593b854e41a9786e0dec869a7b038649becb63ee65ba9e20e309020068bb54269c442c542 +5c0cb1d94785e2e1d98f142320e314010794ad009735fe274cb87e160d55baa8ff9ab8e0fc09f07953fec +afb1191fdd9b80d0c493baf72c4797feb7b5349c762d00d48d6c5322c7e58bd34d69fbf47ef9d8f1374c8 +01198b8c59b97baf58c68a42581f9ff0a98cfd587f2707457e0a2df29616a750fe6877dc35d4e9066a67a +9d4b89560bd9fcfd3a896fc8e2b9d944efc4043d0301bdd7ce597c62da276a348adb4c837e925aa95318e +c20e305a194511f5cfb91076ac244dd4ee09179584241828134bbba779d16f09b8e54413462ae3a6aab5e +ca1340ae5314abe946e1674ad4f3d56b677c226727ca8009229441c5ac10cfeb8ce580629393178d42da0 +7db214ac6596408353ada7b21f9e0d5d2388308042132d5cfac7940237d2acf9d4b873e0cf804c75412d7 +fb5736e2cf6461d40009ecdb76ed0ee23d59e08d2be29e5229888a3d102faa676ccfd2cf44ad1dafd7101 +98087fce312ccf89aaf93d6dbe1f32ee5f745d04018d0ba792281972b35ae99cf9ec3974a3ee233985cb9 +a065d8219b285f181de26a1f154c73871d9164fc068cf86b97ceedbc0f4ef534efa2ab1e8df7cd850173b +24b8e6b3b5e683cbc3f50e79a674e89d51ff0a82a15e0e9952fc5d9468c2301f2fb4f3245692eddf6c690 +6100640ab1d31acad8d834e55fdbcd7c82ab4334466ce761ee775fddb128a8308773346b73d7e472641b2 +c7335855d6548d3a1edba40eb98a982694b503bc43fa61c91db1f2e18fce5cf8068be156c31b66554137d +cab75b034f18d4933acd5ec95d6d97146d327eadc8afaf00c3917418e421e4151c18d771bd79a7d8b860a +1fa9315c8bd847306b07e307c69faeeb0679c12cf4761ee21d809c58c2fa3b729904bc6175f755bce0930 +ee2203591ff57e87b1ca577c1d7d75b5bf7f8d3215fd57af0f3d35a00c76f702c716ca2b9694ef185ee9d +2440cd28e2aa8e2e221c475c866699aa1ed7cc5c2c5e0d98bebab8bfd62aa33002c8ca3a58af1c3668c0b +fefcdea7388b9227d3155a06cf94b27ff93b5cf86331915c6c132fe1c092000b5e5f17d36193613ee70f1 +8f672ab6543a65ab653cd47d13fcc138ae485e41710bb96903a7902a40fd1270697eff8e304bdc5c4797e +46c8837b7f644ec9acb11e146706f3a1254928373dc7df81d973dcc6d6b0b0443527a34bc31f9b1af586f +a667107ab5577c881aaae1b4725d02233a335be4d419c892a31eb397b9965f59f1532853bf456ad132a40 +b3ea9d20b079ae07727f18918e5534b528ac5bc18f36a0880b7e29e0eac96456fd09e714ea63a8f79554d +9d38fe7033a143c01974e23d44e7e763f8dc193c018572afd4303b40af2bc2a91e6353264b6bd95e8f0a9 +f683eb1e6e9d1ccabceabe9ff569b4d1d658d81c268a6837ed27b675d1adb1f79878828769778bb92649e +a29010509ec07d9d8403a21acdbc0f6032645f02908314537b15c7814092f783adea56561b6de27f7a7e4 +a50f6014d6b3a7a4b56aef01a7fd3f90d829c77493b3505132a3afd275bb8d8debd2758cc3b574a78db81 +b5ab1794192090ba341ae33a905fc138e4bb189275babe75a9ac1c94a477a65f70811e62f904cdbaaec9d +d8d200571d98308986b748974d9dedfaecad9c6dcfb514aadb1a0dadc351ef2b752ea6e8f31859aff8531 +9be89de9b76107c4d1fe93e9063e9864559f477498922b1271fb4792c594c942dc7fe8de2c2423804cdb0 +985dfdc7a68ff2eaf3323e38d5ce269d790cc7fcbe124025e7613e80dbd8edd3cf7ca106bd8650e1531eb +2fccac7b1fa5e66f7a94ccca1ed903b1d87500be464280c326167689fd4e99eaa25fd10904afdb9888e94 +bf505483e26eb3fcaae078d9b4d8b47f0104cb572e12fd4854bd908939a6b714b1ef983f38de0408acddb +f560cc1beaf92b1c54f278b13d256011a915ea5ac7085134dd08d9b37ad08e6330891e0010b5809022b13 +9394127b90a25c0cb5e521cef81c9650d5e976c88dfce8bfc6024f28e8ec0b8a0dd1b6036994e89c5506e +75af1a43b033bd55f38f6e37830da7ffc265ae85566927a993c7ac49f7e31a5a2795f198757a6f850d76c +2d4770336a73f05709603f660ff24e938454ec9f32b7fd873ab645cab0a82f1b865f5e277723fbe1adeab +c17784be0fc90fe7d44fdc6aa5938a6da20045cec6acdca7a15d301ab52f289c6172c1ce4bd19a5d94886 +2413d2bd975534bc56dfecd733065d7db5df03a6dd807785b95c4acc763a2b570e1983633a446a3740e4a +a30e0e065d120560532f673b18f5bb33f9ca949a90850da679bf192c76b72b8a684cbbd17fe6740ef28d9 +9788c69391e5489dc52f950e6f2d3df79e835d84fa0bcb8d4e0015f4b7e8fc6889db37d2438f9e91c8539 +1d5785920ae05aeb391dd4a8875326b4b20aad9be2dc5b2127e3e5ab46158140026ed1ecef9ed9d2b1668 +60d0df8e0b59082f64318c075d08bb5d6d03170261510f8f8996ec8195a4ee7a017c8060da2072673fb62 +4f49fc542e5c605966a5eaa3cb26ad91721b101a21455c7b34823472cb11d05df5a767daf753e333c6141 +bce8d5d166cc6aa9b52c298ce0464cbda39d5983bdc3b57bdbb01215e225e275e03914cb1262d07a5086b +9ac24b337eae21b1277c6a4937a94c21c44759cb2d8ac5f8cac59caa25d103245c4b462bfe955c927f235 +1b086bc557baaf187a3fff06999a337b2a45d1cda8002feb0defe27e463050ba93a8474f4540fc22034ef +311a054fbe15f03643de443575808244134d5e9dbf7bd6cd939d592453ab3b7accf42cc797a276e63c581 +63ab521bd1bdad3566bd1b1e10248cf7eeb5757c1f7c8ca9f976f4721b3ff780e7edfe2f37f20116fa090 +5deb4fef0e5c5f2a303a865e6a0a6090afe237ba4b2c1437b569ec457d48c60dd5d878a93aafe3b3c626a +5368fedc33f32696fc88ca4a43b3646aad27a6241bdb5b1c273e57ddebaaa88449c54e63a1c8bc386c918 +3d7b71bb95b0629e8a8f86973726f16b266c6393e3192f812554e73574679cbf3a67b3bbf969e00c904c9 +89eb9c9fb19f3608810c72eb528253ac8606b1730b5ce4c3928a763da1399ea3ab531d3174a0a221f95de +ebc087b3b230734341b85c618f09865ab7c1dd66c74effa2b573de24b14f1385525873e15ab9d90f0c33d +fdcfa19de497675f5a3d9956bc2d66942325017e4132176922f08b478907f0a9e45ec64b23353db1d44e8 +bb7f4060251afeb9e80dceab454eae609a3f5def899a2a42e4e7b62e7d6ae0735072d268bf7de73573070 +c03546f57214a1e4ea1035bacba81c14147db07e0675ef87b88c14dd64f23c7e9b45d4dc68ac48e294221 +af0b0d7b747373b03b7b922620e91ca810a13de10b02d13e139f68204d7ce0a2f8db69335b22b15e0bda4 +9545435cc769e30273ee40d6d54a45256186ff348a52c0c82c8829fbf79d4e3edcc3f42c08b026b98dba9 +e985d7597e085a767c3234182a0be06cd0435e40a5af588993f82c34e7651ea17ebee8f7035f29a378964 +0913d812130e76460ec368c9a9a9607e0ecb66866311044b7f950dac488cd4479baa9a0b728f4c2925f04 +e7bba448e8913b71178026789b3bf48713f619159a8c4c8347d5ea75e795e66c6662a24c4cd1325ba3bec +b127848779badddd62fa895df040135b2983c6c529e2bc097bc4c6c144853940903cecd3e0c8695f14d65 +08a88c135a332b8def181bb0665d76cb6905cc7b87b2ca298cedc035d716be906a18da568351d3631a46c +42beb6925cbec36e3877b42fe660c45983a26230654b1a00e464576ecc4e9e98e3183915bc0bec1d724b6 +4a7de15520e7f82bec8355d38878b3b2f80b731af2029a0f38c310c75a69b53af4f856c46f9772f028356 +9dfb581e2caf1595414f3f0d74aa609483c1b +''') + +db_write_enable=unhex(''' +0602000001648445315dac4d9c91edfb3c327ec18aee87a1fd5e0993fe74b56ee9a70f0eb4d65bfc877060728ad26e695be98899ef76b85 +2162cc5e6ccded51e5a26e7e345c4a8e83aafa2e10fa4cc78f0f34575b0565089b4c78ce1ac7fe3744f4721aa73209fa4a8699e7161bfd7 +ee58dee33f1af15ba3b9ce9a469c5c82eda2b2a2f01658ee14118304e865bc2ad415bec9f06757bb3f2263bd0349a3c089380b72a30edf8 +db01db75586c60ddc9e7bedc8cf9006fcc6825b0ec9dc8782b95f53325bfb6a6945644f2803a4c7fd35574d8b7b089102fb072dfa883049 +f9484a789ff763a029f78adfceac92db195573c65986e38aec2135b5da3c0797939154135be5227515602c0148dbcb8c8a3760dad71f877 +471244cf1053a3cc4bc73c437589a1a47e08c260ea40d3259138e754a556a23e09bf926ad90ff36096c27c460ebdd28f20f31e9f42a1925 +26d79b94e7f2c36b66db69946d93edf8fbd516e3ae59a0b81400c39f6bc1feb209924bc04703fd36ab53dd5658b2dd91633823917c37e94 +4e740409c5fd66974ed42b73d5d7db519c7037b1ed32e471750da95299463cb070c80cea4a03bf20351716ee14423f84670c53ef7b998c1 +79b84ae91cff6ca6b33a372e9947eebc873c6a98c6bcda68e5278b6f799a468bd1a33ae07bf717fbfc20f4d019f0fb25a5d6cb75a97fbd9 +b8490e6204d272d93f62ad393307cad3e24d292040e61fce6f1104c42dc4260de15f42971bbab18064b5dd6ceb12a32d9d25614d9326048 +052bc178b5a0aed3f350cbbec021c4b1ac6ed383f7f4eca0e475cf56caefc3edd3cde6526401936cc095b2df8e0008b2d9bd78c82af0a1e +c0a71f047dd06b4ce6e91886607c55536f0d8712eae4ccb890008ccc27f2d6f6cb9b9bb88ec205019ec722160ffb1c65ca3177cff09c4bd +ae8c40be5bf91488a600ed199d0aad40510afe580802c56c0241a8b2a836800e8a0d07ae37176934252f92fc0e501aee29e6c3567e37b3e +1992ff00b561fd1b3ae37caecc3a1fea7720b0806d3b39cf8a3fb46087b43775b9e473e65cb18af1c9d87a5140a5edf8b7843524910d631 +79c436b6a806d100eb066db889768f7da603631d75a6d79e3d0eb1fe9ba55401b828d4a367f695f3922b982be10fdb1f139a0b1438abc91 +1db5da00ed464d80e3086d368dd131985a21610cd485740599afa772b5dc44d1906ea4c13b8e10b8db896fb81b706038a3328cd07aeb049 +e6ec92ecd30044c54eb171e9cf7a0034cd24614616048491f576826af5ca6afe4bc01f86dc01c2ea25efb32bc9b1c8d56cc7d4d86adf8f1 +f3bb6a649f98bae686ef93524721c618fad85a8125a8ac7d72bfeb7de9f590e8f43535e59259a7a1d13a12a1af91c8ba0dd45ddad02e5b8 +6224fc00dcbc143b0e1d2da638d6798fcc340bda8f1e3abf21cadb2161c4c4be7001371dc56f0d112b42b113288effea6cab8c4b610f730 +37643de21f433774d9fb28cfd213a62dcafab8b662b57e77239dc2fb69f026fcb773f09129c8db04b82dce68734516ffcb938d43deeeeda +a02cc08d7d06f34ec55ba4b224d3270265001df114b946d4238d51cfbfb84cf715b745ec918259c1165ee12ab82b4373eaa2b0c7e68da3e +b869ff033d5953800012bb006d1cf17dcbbe2fb2e129614351c000cab8ccc7c389df33dbe504a0c1df37868b839ef84a6c04072d69fc866 +33055b2569c9c04f1994758987fc7063b97853c727809185a25cd69bfebf6a4367760fd21e7942b997bb2b7098dbec715769d13413c1c93 +185409e54a2c9a97daf63114c71348f19549fb3a8551afbbb7476842f7045a0ec8e6d97fb4bb6de76090687ab4e9991a31e7625ba7088a3 +263797be4787db02573b72100b3ba117e8897b939548715bcfa11d98861b60fa2a4759630b47cbbf329fbc675c4cfc2f963cc9ba72cbe67 +13aff1851869917ba0b761f6532d1dee95331c4c621bb0513e993f7e6dda6da1e3076829b24093c8338c125aa2f5a0730f9e5631f7a9594 +c13025fde9bb4f2431540a1c743c7fc55fc8909d85847fe71af8a68d2981b0eee84a308e0160fc4226aa679ca9b35d0aacae8240aabd5b2 +17c5e66ac4795596f8742acb9869c3f52a96b1d946ff72f403ba491c1a0e4be778efab9d61a250562d705c2b459fc3a420143daf9355226 +4bb8c7caa64143697961fab1b6af9e852d43a94736e1e75e4b9a7c2bee73598360c7e4c648e47ba9400dbe22b3eea6d9ab87fe677b36242 +57f81d26b87536a642a7840bdccd8fce05c23891a4fa4ce2156fba2856313653207bf225b8114005432824d16a93473deb81721c77196af +d80cf723e8cdea81aaed19f55a09a8986f2950c49f4eebfb142d5e4815632d93ccb0106c156b47efca25dc3d7f31eb9b2dee0d2d83a51cb +e5d1270222920f2c87e5acc884c11b0df7a7e1bb49b06fa4f936964d3f2782fa46eec3e430815f82ab0fb5eb82377277f8fe3ae5b33732d +7d76ba3de284c66fba372f04f9ad6a39fa669a00583313d51c8e6b1eb960bf1e82ae8e0504b2d3035b371d5ecf638c1cc0c1dd67eff286f +c9ee0950da53f339a85fbbcbacf61fcdadee8cdba0950d23ec71e2239ae7ab5be1bf56364897af990428822d23deed81fbbe622420234de +d92b8fc3073bfa0a9677cd9e24b9f81278c50584bdc880fa2cd5c5c4b03bd78be872a656f3ef74b30d4e66f1ff091a343f75f096e64ab25 +b64d426862ed3f21dc54c6b6a8cb90b065c7b33b03e97acde7d58a2fa35664ec03ef1f82a30441a021ec008bee9444bbe50ec8ff457d32d +06a63b9dc84fd82fa110a30dd849bf9f8cb4d3599b9aa09a76ad1b7c52bb972e5b16670670994ef7471f2d738ba9430664b7a1c259745ba +8b2b9d98e695bad0b59e1fd989475a61570b2b677734c3f1887f9555b760811e20caba91eff59e9fb328561e12749c32f603bd50da5c449 +7393ccd560e88f367a664c5f2f9fe73107e2664a07a0f015877ce085f469dd24be1a20ce9544692e23094650a991e5bd7ab7d3b575d5ef7 +1549fa442fe75a79a6c9f598eb1396e9332878c73f8af9e8f9f0cc11a4b42245acbb421646d6181c8f7f602298042a37d8b57520a1d68d6 +e3d473d5f1897e05db677c7ff6e260048255fdbe35fae42c791ea57ac0f2334e6ab5c650f59f3b27b1af30347314510a29fe19e20ac6e8e +eb1e84deb687d2dc3d5cf4b03dbe35d165e +''') + +# FIXME this must be very specific to a particular device and constructed on the fly from multiple hardcoded tables: +identify_prg=unhex(''' +02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210 +000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020 +0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2 +0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014 +0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0 +6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80 +0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800 +b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a +ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7 +00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3 +08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0 +97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808 +d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098 +7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc +800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928 +00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180 +0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800 +abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a +020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260 +02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090 +0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131 +415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b +4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828 +38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f +201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341 +c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c +2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818 +08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180 +81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e +''') + +# The following blob has only 1 byte difference from the above +enroll_prg=unhex(''' +02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210 +000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020 +0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2 +0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014 +0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0 +6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80 +0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800 +b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a +ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7 +00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3 +08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0 +97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808 +d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098 +7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc +800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928 +00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180 +0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800 +abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a +020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260 +02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090 +0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131 +415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b +4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828 +38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f +201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341 +c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c +2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818 +08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180 +81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e +''') + +calibrate_prg=unhex(''' +0298006103230000002000080000200080000001003200700000000080202005002420000050207736282 +0010030200100082170000c210000482102004c210000582000005c20000060200000682005006c200129 +70200121742001887820018084202000942001809c200902a0200b19b4200000b8203b04bc201400c0200 +200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc20e803e0 +206401e420d002e8200001f0200500f8200500fc200000b8203b000008040014080000080800000808000 +01408300008080000140831001c081a0032000c0000000080501101004c1126003400080310071d10071d +10071d10071d10071c01065810080101000007c8078c06100000204f80007f000003070107010c07032c0 +8fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d800af908f8800b5d +095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b6109628 +00af408f3800b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af0 +08ef800b660967800aef08ee800b670968800aee08ed800b68096c800aed08ec800b6c096d800aec08eb8 +00b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b700971800ae808e7800b71 +0972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b7509768 +00ae308e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf +08de800b7a097b800ade08dd800b7b097c800add08dc800b7c097d800adc08db800b7d097e800adb08da8 +00b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808d7800b810982800ad708d6800b82 +0983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b8609878 +00ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace +08cd800b8b098c800acd08cc800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c98 +00b8f0990800ac908c8800b900991800ac808c7800b910992800ac708c6800b920993800ac608c5800b93 +0994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c1800b9709988 +00ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd +08bc800b9c099d800abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b88 +00ba00801800ab808b7800a010802800ab708b6800a020803800ab608b5800a0308048020030704040200 +00000000002f0004009000000029000400000000003500040010000000170000003000cc0103000000ff0 +000001d000003ff00000025000003ff00000022000003101112131415161718191a1b1c1d1e1f20212223 +2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4 +e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778 +797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203 +c2d182e1e30182e1c321d341d341e321c301e1e241e201f201d1c321a301e1c211e21341f1e202024201f +1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341c1e1e1c221f2 +01d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220 +301d2d302f2d2c2b23223a211c7e7f807f808080808080808080808080808080808080818081808180818 +080808080818081808080818081808180818081808180818081808180808081808180808081807f808081 +8080808180818081808080818081808180818081808180808081808180818081808180818081808180818 +0818081808180818081808080808080808080807f807f807f807f7f7e7e +''') + diff --git a/proto97/tls.py b/proto97/tls.py index b146531..ca5a67b 100644 --- a/proto97/tls.py +++ b/proto97/tls.py @@ -133,6 +133,7 @@ class Tls(): print(s) def app(self, b): + b = b() if callable(b) else b return self.parse_tls_response(self.usb.cmd(self.make_app_data(b))) def update_neg(self, b): diff --git a/proto97/usb.py b/proto97/usb.py index 0d837cb..7bdfed3 100644 --- a/proto97/usb.py +++ b/proto97/usb.py @@ -7,34 +7,8 @@ from usb.util import claim_interface, release_interface from queue import Queue from threading import Thread from usb.core import USBError +from .blobs import init_hardcoded, init_hardcoded_clean_slate -init_hardcoded=unhex(''' -06020000015cb560afa595d0dcf4fca09ebb69301e2b9e24a5dfb6f2602833427d3bd65222c418ff15b54587ab2854c4fe9aea74fa55567 -2036fa3ec73c6912c58b1b49cbdcc7664165482cd70d5bb95d9d469626fdc2e012d74157c5792260968a2a4572b1ccccc26ec2e2ed0ddda -1b0931d3d0566460915d43e0a654a0582706be9113ea88f0c15ba058507efb0dadecb4a4cc64444dddf050b6e8d4ebb34ebba33e8651c75 -e5fb28f85c83197df1de460d9e1cb82208753ceff0ef60a823dba75d05548f5b3a5a0e2972232f7403bd6869da90e5371a0ab8ad23972f1 -597630f5ff7c8b8272800563477288b5591bbb0341d3975efc1778225767fa35480ff7f8dd633e4034ac32e4af58b86ebc63552cb35b12b -285255deaf3a32bf46cdc5ad3bc1c9ed1bcc112c72143f9aec568e2cacfa89ba0c7bb65590d8b93e6871a33c6c6983c0acd04e737ff55ee -e024ca6b9a48332c1a69a5a3fdd24b964cf7e7c55229bb0b48a6e339eb2c42d07ec850a4ee780660ad6c77ffa302a63bd19426134c4533d -69192ef2e16591df26394791a4ecb994a24f5a7f70f1eb2604e6bfb67a452cb74ead8b0d9808f890ac386750cbac06ee03a852145094053 -b2b074b9905de5cdbf2272b67e51f159164778d6d2ef7a1ccb81df9f896ddb38ce11e8140cf6cb9c82 -''') -init_hardcoded_clean_slate=unhex(''' -06020000012c40c9d271378bc0912ef5dced69bd81b7fc16972c7b46e621af54a00e2cc6baca6eb83ea30222dfc6c925262006ae93412ea -cf482f2034ee7b13297474b7e1e91f279cac2ccb7195443e4dd3328cfd292ade073fcc2eaa8f07b77231130ba997f921b9be7b4fb6cc691 -0d2976b3e050913b27dbe73afd6e964260b9435ebab5117e71f7cb68464d4b6f8afc7e1a421f671f5854a1d0c8ab93ed3b88b2bc1a42875 -e40b15f0e78496ac40e4a4a7fd39a97534ce1866479e0384f0789bbfc2fea0ce982bf7a9df97d60b237edbe1b26c9791043a96b81e435d6 -de5971c758d374905df95b0cddabfbf531749ba191f07a6f5e2722852f137a53513a9ec6ab30c3f09aa6ce21b391e55cf81dcda6422011b -f163317a9a4382546141d45f2274bd660103bd3af705f3ed12e493bc4f834d5d7f162e2c3405cf857b00129789a3353bf7fab7796e267e3 -062d55660dbbb857911ac8e871c460dd31c56a86a5631475f0f2ee5e9ce2af0faec0931a640ba2394025f29ffeca3a7e99c15a78ce1f1f7 -808cedd7601b9b6382d72ca873257d4f6af70e29e22afea15e36e0282b8f0bfc68ffa3417d212b8bbe11bb73b363a19872e6e947d45de30 -fbc493ca083a0a4650615d8628606362081ca6df5d67527971d1776ad76a7a28c932f0317b59cb4a82a14b2bcb7b01fb662be1496d24d91 -9140ec80068b21a818daa2fb8e05f63edbd4bd5797c74a28b3e7cf81c9045248584977711341fca3f08ba91ff853b62dc24ce4bba4ed57f -47bd458545d805b6bb14fe0cde01440b60bf7be937f6444a8e2a10ed8fa9ddb8604bb95fe411b97112e78dbf5a4a0f004669c93765a9f38 -665cb55f5658895c1c06a7aedf694bfb3afa9b8b1dea5ab85c821ac20b0663b95023642fda36ad78e3e00140b966f404f7e55f0b416ea43 -b4c74c39900830abc6906a1004bef1b5b7dbbbeb5ec1b22604ac86429b9f56511b746a7124c449b8c9498f49144abc2d64f6a114f1d7f91 -aa41249faeef4d838e280cb5d6fc19cfe86c75f -''') class Usb(): def __init__(self): @@ -49,13 +23,16 @@ class Usb(): except: pass - def open(self): - self.dev = ucore.find(idVendor=0x138a, idProduct=0x0097) + def open(self, vendor=0x138a, product=0x0097): + self.dev = ucore.find(idVendor=vendor, idProduct=product) self.dev.default_timeout = 15000 self.thread = Thread(target=lambda: self.int_thread()) self.thread.daemon = True self.thread.start() + def usb_dev(self): + return self.dev + def send_init(self): #self.dev.set_configuration() @@ -76,6 +53,10 @@ class Usb(): self.cmd(init_hardcoded_clean_slate) def cmd(self, out): + if callable(out): + out = out() + if not out: + return 0 self.trace('>cmd> %s' % hexlify(out).decode()) self.dev.write(1, out) resp = self.dev.read(129, 100*1024)