-- Prosody IM
-- Copyright (C) 2008-2010 Matthew Wild
-- Copyright (C) 2008-2010 Waqas Hussain
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
local type = type ;
local tonumber = tonumber ;
local setmetatable = setmetatable ;
local error = error ;
local tostring = tostring ;
local print = print ;
local xor_map = { [ 0 ] = 0 ; [ 1 ] = 1 ; [ 2 ] = 2 ; [ 3 ] = 3 ; [ 4 ] = 4 ; [ 5 ] = 5 ; [ 6 ] = 6 ; [ 7 ] = 7 ; [ 8 ] = 8 ; [ 9 ] = 9 ; [ 10 ] = 10 ; [ 11 ] = 11 ; [ 12 ] = 12 ; [ 13 ] = 13 ; [ 14 ] = 14 ; [ 15 ] = 15 ; [ 16 ] = 1 ; [ 17 ] = 0 ; [ 18 ] = 3 ; [ 19 ] = 2 ; [ 20 ] = 5 ; [ 21 ] = 4 ; [ 22 ] = 7 ; [ 23 ] = 6 ; [ 24 ] = 9 ; [ 25 ] = 8 ; [ 26 ] = 11 ; [ 27 ] = 10 ; [ 28 ] = 13 ; [ 29 ] = 12 ; [ 30 ] = 15 ; [ 31 ] = 14 ; [ 32 ] = 2 ; [ 33 ] = 3 ; [ 34 ] = 0 ; [ 35 ] = 1 ; [ 36 ] = 6 ; [ 37 ] = 7 ; [ 38 ] = 4 ; [ 39 ] = 5 ; [ 40 ] = 10 ; [ 41 ] = 11 ; [ 42 ] = 8 ; [ 43 ] = 9 ; [ 44 ] = 14 ; [ 45 ] = 15 ; [ 46 ] = 12 ; [ 47 ] = 13 ; [ 48 ] = 3 ; [ 49 ] = 2 ; [ 50 ] = 1 ; [ 51 ] = 0 ; [ 52 ] = 7 ; [ 53 ] = 6 ; [ 54 ] = 5 ; [ 55 ] = 4 ; [ 56 ] = 11 ; [ 57 ] = 10 ; [ 58 ] = 9 ; [ 59 ] = 8 ; [ 60 ] = 15 ; [ 61 ] = 14 ; [ 62 ] = 13 ; [ 63 ] = 12 ; [ 64 ] = 4 ; [ 65 ] = 5 ; [ 66 ] = 6 ; [ 67 ] = 7 ; [ 68 ] = 0 ; [ 69 ] = 1 ; [ 70 ] = 2 ; [ 71 ] = 3 ; [ 72 ] = 12 ; [ 73 ] = 13 ; [ 74 ] = 14 ; [ 75 ] = 15 ; [ 76 ] = 8 ; [ 77 ] = 9 ; [ 78 ] = 10 ; [ 79 ] = 11 ; [ 80 ] = 5 ; [ 81 ] = 4 ; [ 82 ] = 7 ; [ 83 ] = 6 ; [ 84 ] = 1 ; [ 85 ] = 0 ; [ 86 ] = 3 ; [ 87 ] = 2 ; [ 88 ] = 13 ; [ 89 ] = 12 ; [ 90 ] = 15 ; [ 91 ] = 14 ; [ 92 ] = 9 ; [ 93 ] = 8 ; [ 94 ] = 11 ; [ 95 ] = 10 ; [ 96 ] = 6 ; [ 97 ] = 7 ; [ 98 ] = 4 ; [ 99 ] = 5 ; [ 100 ] = 2 ; [ 101 ] = 3 ; [ 102 ] = 0 ; [ 103 ] = 1 ; [ 104 ] = 14 ; [ 105 ] = 15 ; [ 106 ] = 12 ; [ 107 ] = 13 ; [ 108 ] = 10 ; [ 109 ] = 11 ; [ 110 ] = 8 ; [ 111 ] = 9 ; [ 112 ] = 7 ; [ 113 ] = 6 ; [ 114 ] = 5 ; [ 115 ] = 4 ; [ 116 ] = 3 ; [ 117 ] = 2 ; [ 118 ] = 1 ; [ 119 ] = 0 ; [ 120 ] = 15 ; [ 121 ] = 14 ; [ 122 ] = 13 ; [ 123 ] = 12 ; [ 124 ] = 11 ; [ 125 ] = 10 ; [ 126 ] = 9 ; [ 127 ] = 8 ; [ 128 ] = 8 ; [ 129 ] = 9 ; [ 130 ] = 10 ; [ 131 ] = 11 ; [ 132 ] = 12 ; [ 133 ] = 13 ; [ 134 ] = 14 ; [ 135 ] = 15 ; [ 136 ] = 0 ; [ 137 ] = 1 ; [ 138 ] = 2 ; [ 139 ] = 3 ; [ 140 ] = 4 ; [ 141 ] = 5 ; [ 142 ] = 6 ; [ 143 ] = 7 ; [ 144 ] = 9 ; [ 145 ] = 8 ; [ 146 ] = 11 ; [ 147 ] = 10 ; [ 148 ] = 13 ; [ 149 ] = 12 ; [ 150 ] = 15 ; [ 151 ] = 14 ; [ 152 ] = 1 ; [ 153 ] = 0 ; [ 154 ] = 3 ; [ 155 ] = 2 ; [ 156 ] = 5 ; [ 157 ] = 4 ; [ 158 ] = 7 ; [ 159 ] = 6 ; [ 160 ] = 10 ; [ 161 ] = 11 ; [ 162 ] = 8 ; [ 163 ] = 9 ; [ 164 ] = 14 ; [ 165 ] = 15 ; [ 166 ] = 12 ; [ 167 ] = 13 ; [ 168 ] = 2 ; [ 169 ] = 3 ; [ 170 ] = 0 ; [ 171 ] = 1 ; [ 172 ] = 6 ; [ 173 ] = 7 ; [ 174 ] = 4 ; [ 175 ] = 5 ; [ 176 ] = 11 ; [ 177 ] = 10 ; [ 178 ] = 9 ; [ 179 ] = 8 ; [ 180 ] = 15 ; [ 181 ] = 14 ; [ 182 ] = 13 ; [ 183 ] = 12 ; [ 184 ] = 3 ; [ 185 ] = 2 ; [ 186 ] = 1 ; [ 187 ] = 0 ; [ 188 ] = 7 ; [ 189 ] = 6 ; [ 190 ] = 5 ; [ 191 ] = 4 ; [ 192 ] = 12 ; [ 193 ] = 13 ; [ 194 ] = 14 ; [ 195 ] = 15 ; [ 196 ] = 8 ; [ 197 ] = 9 ; [ 198 ] = 10 ; [ 199 ] = 11 ; [ 200 ] = 4 ; [ 201 ] = 5 ; [ 202 ] = 6 ; [ 203 ] = 7 ; [ 204 ] = 0 ; [ 205 ] = 1 ; [ 206 ] = 2 ; [ 207 ] = 3 ; [ 208 ] = 13 ; [ 209 ] = 12 ; [ 210 ] = 15 ; [ 211 ] = 14 ; [ 212 ] = 9 ; [ 213 ] = 8 ; [ 214 ] = 11 ; [ 215 ] = 10 ; [ 216 ] = 5 ; [ 217 ] = 4 ; [ 218 ] = 7 ; [ 219 ] = 6 ; [ 220 ] = 1 ; [ 221 ] = 0 ; [ 222 ] = 3 ; [ 223 ] = 2 ; [ 224 ] = 14 ; [ 225 ] = 15 ; [ 226 ] = 12 ; [ 227 ] = 13 ; [ 228 ] = 10 ; [ 229 ] = 11 ; [ 230 ] = 8 ; [ 231 ] = 9 ; [ 232 ] = 6 ; [ 233 ] = 7 ; [ 234 ] = 4 ; [ 235 ] = 5 ; [ 236 ] = 2 ; [ 237 ] = 3 ; [ 238 ] = 0 ; [ 239 ] = 1 ; [ 240 ] = 15 ; [ 241 ] = 14 ; [ 242 ] = 13 ; [ 243 ] = 12 ; [ 244 ] = 11 ; [ 245 ] = 10 ; [ 246 ] = 9 ; [ 247 ] = 8 ; [ 248 ] = 7 ; [ 249 ] = 6 ; [ 250 ] = 5 ; [ 251 ] = 4 ; [ 252 ] = 3 ; [ 253 ] = 2 ; [ 254 ] = 1 ; [ 255 ] = 0 ; } ;
local or_map = { [ 0 ] = 0 ; [ 1 ] = 1 ; [ 2 ] = 2 ; [ 3 ] = 3 ; [ 4 ] = 4 ; [ 5 ] = 5 ; [ 6 ] = 6 ; [ 7 ] = 7 ; [ 8 ] = 8 ; [ 9 ] = 9 ; [ 10 ] = 10 ; [ 11 ] = 11 ; [ 12 ] = 12 ; [ 13 ] = 13 ; [ 14 ] = 14 ; [ 15 ] = 15 ; [ 16 ] = 1 ; [ 17 ] = 1 ; [ 18 ] = 3 ; [ 19 ] = 3 ; [ 20 ] = 5 ; [ 21 ] = 5 ; [ 22 ] = 7 ; [ 23 ] = 7 ; [ 24 ] = 9 ; [ 25 ] = 9 ; [ 26 ] = 11 ; [ 27 ] = 11 ; [ 28 ] = 13 ; [ 29 ] = 13 ; [ 30 ] = 15 ; [ 31 ] = 15 ; [ 32 ] = 2 ; [ 33 ] = 3 ; [ 34 ] = 2 ; [ 35 ] = 3 ; [ 36 ] = 6 ; [ 37 ] = 7 ; [ 38 ] = 6 ; [ 39 ] = 7 ; [ 40 ] = 10 ; [ 41 ] = 11 ; [ 42 ] = 10 ; [ 43 ] = 11 ; [ 44 ] = 14 ; [ 45 ] = 15 ; [ 46 ] = 14 ; [ 47 ] = 15 ; [ 48 ] = 3 ; [ 49 ] = 3 ; [ 50 ] = 3 ; [ 51 ] = 3 ; [ 52 ] = 7 ; [ 53 ] = 7 ; [ 54 ] = 7 ; [ 55 ] = 7 ; [ 56 ] = 11 ; [ 57 ] = 11 ; [ 58 ] = 11 ; [ 59 ] = 11 ; [ 60 ] = 15 ; [ 61 ] = 15 ; [ 62 ] = 15 ; [ 63 ] = 15 ; [ 64 ] = 4 ; [ 65 ] = 5 ; [ 66 ] = 6 ; [ 67 ] = 7 ; [ 68 ] = 4 ; [ 69 ] = 5 ; [ 70 ] = 6 ; [ 71 ] = 7 ; [ 72 ] = 12 ; [ 73 ] = 13 ; [ 74 ] = 14 ; [ 75 ] = 15 ; [ 76 ] = 12 ; [ 77 ] = 13 ; [ 78 ] = 14 ; [ 79 ] = 15 ; [ 80 ] = 5 ; [ 81 ] = 5 ; [ 82 ] = 7 ; [ 83 ] = 7 ; [ 84 ] = 5 ; [ 85 ] = 5 ; [ 86 ] = 7 ; [ 87 ] = 7 ; [ 88 ] = 13 ; [ 89 ] = 13 ; [ 90 ] = 15 ; [ 91 ] = 15 ; [ 92 ] = 13 ; [ 93 ] = 13 ; [ 94 ] = 15 ; [ 95 ] = 15 ; [ 96 ] = 6 ; [ 97 ] = 7 ; [ 98 ] = 6 ; [ 99 ] = 7 ; [ 100 ] = 6 ; [ 101 ] = 7 ; [ 102 ] = 6 ; [ 103 ] = 7 ; [ 104 ] = 14 ; [ 105 ] = 15 ; [ 106 ] = 14 ; [ 107 ] = 15 ; [ 108 ] = 14 ; [ 109 ] = 15 ; [ 110 ] = 14 ; [ 111 ] = 15 ; [ 112 ] = 7 ; [ 113 ] = 7 ; [ 114 ] = 7 ; [ 115 ] = 7 ; [ 116 ] = 7 ; [ 117 ] = 7 ; [ 118 ] = 7 ; [ 119 ] = 7 ; [ 120 ] = 15 ; [ 121 ] = 15 ; [ 122 ] = 15 ; [ 123 ] = 15 ; [ 124 ] = 15 ; [ 125 ] = 15 ; [ 126 ] = 15 ; [ 127 ] = 15 ; [ 128 ] = 8 ; [ 129 ] = 9 ; [ 130 ] = 10 ; [ 131 ] = 11 ; [ 132 ] = 12 ; [ 133 ] = 13 ; [ 134 ] = 14 ; [ 135 ] = 15 ; [ 136 ] = 8 ; [ 137 ] = 9 ; [ 138 ] = 10 ; [ 139 ] = 11 ; [ 140 ] = 12 ; [ 141 ] = 13 ; [ 142 ] = 14 ; [ 143 ] = 15 ; [ 144 ] = 9 ; [ 145 ] = 9 ; [ 146 ] = 11 ; [ 147 ] = 11 ; [ 148 ] = 13 ; [ 149 ] = 13 ; [ 150 ] = 15 ; [ 151 ] = 15 ; [ 152 ] = 9 ; [ 153 ] = 9 ; [ 154 ] = 11 ; [ 155 ] = 11 ; [ 156 ] = 13 ; [ 157 ] = 13 ; [ 158 ] = 15 ; [ 159 ] = 15 ; [ 160 ] = 10 ; [ 161 ] = 11 ; [ 162 ] = 10 ; [ 163 ] = 11 ; [ 164 ] = 14 ; [ 165 ] = 15 ; [ 166 ] = 14 ; [ 167 ] = 15 ; [ 168 ] = 10 ; [ 169 ] = 11 ; [ 170 ] = 10 ; [ 171 ] = 11 ; [ 172 ] = 14 ; [ 173 ] = 15 ; [ 174 ] = 14 ; [ 175 ] = 15 ; [ 176 ] = 11 ; [ 177 ] = 11 ; [ 178 ] = 11 ; [ 179 ] = 11 ; [ 180 ] = 15 ; [ 181 ] = 15 ; [ 182 ] = 15 ; [ 183 ] = 15 ; [ 184 ] = 11 ; [ 185 ] = 11 ; [ 186 ] = 11 ; [ 187 ] = 11 ; [ 188 ] = 15 ; [ 189 ] = 15 ; [ 190 ] = 15 ; [ 191 ] = 15 ; [ 192 ] = 12 ; [ 193 ] = 13 ; [ 194 ] = 14 ; [ 195 ] = 15 ; [ 196 ] = 12 ; [ 197 ] = 13 ; [ 198 ] = 14 ; [ 199 ] = 15 ; [ 200 ] = 12 ; [ 201 ] = 13 ; [ 202 ] = 14 ; [ 203 ] = 15 ; [ 204 ] = 12 ; [ 205 ] = 13 ; [ 206 ] = 14 ; [ 207 ] = 15 ; [ 208 ] = 13 ; [ 209 ] = 13 ; [ 210 ] = 15 ; [ 211 ] = 15 ; [ 212 ] = 13 ; [ 213 ] = 13 ; [ 214 ] = 15 ; [ 215 ] = 15 ; [ 216 ] = 13 ; [ 217 ] = 13 ; [ 218 ] = 15 ; [ 219 ] = 15 ; [ 220 ] = 13 ; [ 221 ] = 13 ; [ 222 ] = 15 ; [ 223 ] = 15 ; [ 224 ] = 14 ; [ 225 ] = 15 ; [ 226 ] = 14 ; [ 227 ] = 15 ; [ 228 ] = 14 ; [ 229 ] = 15 ; [ 230 ] = 14 ; [ 231 ] = 15 ; [ 232 ] = 14 ; [ 233 ] = 15 ; [ 234 ] = 14 ; [ 235 ] = 15 ; [ 236 ] = 14 ; [ 237 ] = 15 ; [ 238 ] = 14 ; [ 239 ] = 15 ; [ 240 ] = 15 ; [ 241 ] = 15 ; [ 242 ] = 15 ; [ 243 ] = 15 ; [ 244 ] = 15 ; [ 245 ] = 15 ; [ 246 ] = 15 ; [ 247 ] = 15 ; [ 248 ] = 15 ; [ 249 ] = 15 ; [ 250 ] = 15 ; [ 251 ] = 15 ; [ 252 ] = 15 ; [ 253 ] = 15 ; [ 254 ] = 15 ; [ 255 ] = 15 ; } ;
local and_map = { [ 0 ] = 0 ; [ 1 ] = 0 ; [ 2 ] = 0 ; [ 3 ] = 0 ; [ 4 ] = 0 ; [ 5 ] = 0 ; [ 6 ] = 0 ; [ 7 ] = 0 ; [ 8 ] = 0 ; [ 9 ] = 0 ; [ 10 ] = 0 ; [ 11 ] = 0 ; [ 12 ] = 0 ; [ 13 ] = 0 ; [ 14 ] = 0 ; [ 15 ] = 0 ; [ 16 ] = 0 ; [ 17 ] = 1 ; [ 18 ] = 0 ; [ 19 ] = 1 ; [ 20 ] = 0 ; [ 21 ] = 1 ; [ 22 ] = 0 ; [ 23 ] = 1 ; [ 24 ] = 0 ; [ 25 ] = 1 ; [ 26 ] = 0 ; [ 27 ] = 1 ; [ 28 ] = 0 ; [ 29 ] = 1 ; [ 30 ] = 0 ; [ 31 ] = 1 ; [ 32 ] = 0 ; [ 33 ] = 0 ; [ 34 ] = 2 ; [ 35 ] = 2 ; [ 36 ] = 0 ; [ 37 ] = 0 ; [ 38 ] = 2 ; [ 39 ] = 2 ; [ 40 ] = 0 ; [ 41 ] = 0 ; [ 42 ] = 2 ; [ 43 ] = 2 ; [ 44 ] = 0 ; [ 45 ] = 0 ; [ 46 ] = 2 ; [ 47 ] = 2 ; [ 48 ] = 0 ; [ 49 ] = 1 ; [ 50 ] = 2 ; [ 51 ] = 3 ; [ 52 ] = 0 ; [ 53 ] = 1 ; [ 54 ] = 2 ; [ 55 ] = 3 ; [ 56 ] = 0 ; [ 57 ] = 1 ; [ 58 ] = 2 ; [ 59 ] = 3 ; [ 60 ] = 0 ; [ 61 ] = 1 ; [ 62 ] = 2 ; [ 63 ] = 3 ; [ 64 ] = 0 ; [ 65 ] = 0 ; [ 66 ] = 0 ; [ 67 ] = 0 ; [ 68 ] = 4 ; [ 69 ] = 4 ; [ 70 ] = 4 ; [ 71 ] = 4 ; [ 72 ] = 0 ; [ 73 ] = 0 ; [ 74 ] = 0 ; [ 75 ] = 0 ; [ 76 ] = 4 ; [ 77 ] = 4 ; [ 78 ] = 4 ; [ 79 ] = 4 ; [ 80 ] = 0 ; [ 81 ] = 1 ; [ 82 ] = 0 ; [ 83 ] = 1 ; [ 84 ] = 4 ; [ 85 ] = 5 ; [ 86 ] = 4 ; [ 87 ] = 5 ; [ 88 ] = 0 ; [ 89 ] = 1 ; [ 90 ] = 0 ; [ 91 ] = 1 ; [ 92 ] = 4 ; [ 93 ] = 5 ; [ 94 ] = 4 ; [ 95 ] = 5 ; [ 96 ] = 0 ; [ 97 ] = 0 ; [ 98 ] = 2 ; [ 99 ] = 2 ; [ 100 ] = 4 ; [ 101 ] = 4 ; [ 102 ] = 6 ; [ 103 ] = 6 ; [ 104 ] = 0 ; [ 105 ] = 0 ; [ 106 ] = 2 ; [ 107 ] = 2 ; [ 108 ] = 4 ; [ 109 ] = 4 ; [ 110 ] = 6 ; [ 111 ] = 6 ; [ 112 ] = 0 ; [ 113 ] = 1 ; [ 114 ] = 2 ; [ 115 ] = 3 ; [ 116 ] = 4 ; [ 117 ] = 5 ; [ 118 ] = 6 ; [ 119 ] = 7 ; [ 120 ] = 0 ; [ 121 ] = 1 ; [ 122 ] = 2 ; [ 123 ] = 3 ; [ 124 ] = 4 ; [ 125 ] = 5 ; [ 126 ] = 6 ; [ 127 ] = 7 ; [ 128 ] = 0 ; [ 129 ] = 0 ; [ 130 ] = 0 ; [ 131 ] = 0 ; [ 132 ] = 0 ; [ 133 ] = 0 ; [ 134 ] = 0 ; [ 135 ] = 0 ; [ 136 ] = 8 ; [ 137 ] = 8 ; [ 138 ] = 8 ; [ 139 ] = 8 ; [ 140 ] = 8 ; [ 141 ] = 8 ; [ 142 ] = 8 ; [ 143 ] = 8 ; [ 144 ] = 0 ; [ 145 ] = 1 ; [ 146 ] = 0 ; [ 147 ] = 1 ; [ 148 ] = 0 ; [ 149 ] = 1 ; [ 150 ] = 0 ; [ 151 ] = 1 ; [ 152 ] = 8 ; [ 153 ] = 9 ; [ 154 ] = 8 ; [ 155 ] = 9 ; [ 156 ] = 8 ; [ 157 ] = 9 ; [ 158 ] = 8 ; [ 159 ] = 9 ; [ 160 ] = 0 ; [ 161 ] = 0 ; [ 162 ] = 2 ; [ 163 ] = 2 ; [ 164 ] = 0 ; [ 165 ] = 0 ; [ 166 ] = 2 ; [ 167 ] = 2 ; [ 168 ] = 8 ; [ 169 ] = 8 ; [ 170 ] = 10 ; [ 171 ] = 10 ; [ 172 ] = 8 ; [ 173 ] = 8 ; [ 174 ] = 10 ; [ 175 ] = 10 ; [ 176 ] = 0 ; [ 177 ] = 1 ; [ 178 ] = 2 ; [ 179 ] = 3 ; [ 180 ] = 0 ; [ 181 ] = 1 ; [ 182 ] = 2 ; [ 183 ] = 3 ; [ 184 ] = 8 ; [ 185 ] = 9 ; [ 186 ] = 10 ; [ 187 ] = 11 ; [ 188 ] = 8 ; [ 189 ] = 9 ; [ 190 ] = 10 ; [ 191 ] = 11 ; [ 192 ] = 0 ; [ 193 ] = 0 ; [ 194 ] = 0 ; [ 195 ] = 0 ; [ 196 ] = 4 ; [ 197 ] = 4 ; [ 198 ] = 4 ; [ 199 ] = 4 ; [ 200 ] = 8 ; [ 201 ] = 8 ; [ 202 ] = 8 ; [ 203 ] = 8 ; [ 204 ] = 12 ; [ 205 ] = 12 ; [ 206 ] = 12 ; [ 207 ] = 12 ; [ 208 ] = 0 ; [ 209 ] = 1 ; [ 210 ] = 0 ; [ 211 ] = 1 ; [ 212 ] = 4 ; [ 213 ] = 5 ; [ 214 ] = 4 ; [ 215 ] = 5 ; [ 216 ] = 8 ; [ 217 ] = 9 ; [ 218 ] = 8 ; [ 219 ] = 9 ; [ 220 ] = 12 ; [ 221 ] = 13 ; [ 222 ] = 12 ; [ 223 ] = 13 ; [ 224 ] = 0 ; [ 225 ] = 0 ; [ 226 ] = 2 ; [ 227 ] = 2 ; [ 228 ] = 4 ; [ 229 ] = 4 ; [ 230 ] = 6 ; [ 231 ] = 6 ; [ 232 ] = 8 ; [ 233 ] = 8 ; [ 234 ] = 10 ; [ 235 ] = 10 ; [ 236 ] = 12 ; [ 237 ] = 12 ; [ 238 ] = 14 ; [ 239 ] = 14 ; [ 240 ] = 0 ; [ 241 ] = 1 ; [ 242 ] = 2 ; [ 243 ] = 3 ; [ 244 ] = 4 ; [ 245 ] = 5 ; [ 246 ] = 6 ; [ 247 ] = 7 ; [ 248 ] = 8 ; [ 249 ] = 9 ; [ 250 ] = 10 ; [ 251 ] = 11 ; [ 252 ] = 12 ; [ 253 ] = 13 ; [ 254 ] = 14 ; [ 255 ] = 15 ; }
local not_map = { [ 0 ] = 15 ; [ 1 ] = 14 ; [ 2 ] = 13 ; [ 3 ] = 12 ; [ 4 ] = 11 ; [ 5 ] = 10 ; [ 6 ] = 9 ; [ 7 ] = 8 ; [ 8 ] = 7 ; [ 9 ] = 6 ; [ 10 ] = 5 ; [ 11 ] = 4 ; [ 12 ] = 3 ; [ 13 ] = 2 ; [ 14 ] = 1 ; [ 15 ] = 0 ; } ;
local rshift1_map = { [ 0 ] = 0 ; [ 1 ] = 0 ; [ 2 ] = 1 ; [ 3 ] = 1 ; [ 4 ] = 2 ; [ 5 ] = 2 ; [ 6 ] = 3 ; [ 7 ] = 3 ; [ 8 ] = 4 ; [ 9 ] = 4 ; [ 10 ] = 5 ; [ 11 ] = 5 ; [ 12 ] = 6 ; [ 13 ] = 6 ; [ 14 ] = 7 ; [ 15 ] = 7 ; } ;
local rshift1carry_map = { [ 0 ] = 0 ; [ 1 ] = 8 ; [ 2 ] = 0 ; [ 3 ] = 8 ; [ 4 ] = 0 ; [ 5 ] = 8 ; [ 6 ] = 0 ; [ 7 ] = 8 ; [ 8 ] = 0 ; [ 9 ] = 8 ; [ 10 ] = 0 ; [ 11 ] = 8 ; [ 12 ] = 0 ; [ 13 ] = 8 ; [ 14 ] = 0 ; [ 15 ] = 8 ; } ;
local lshift1_map = { [ 0 ] = 0 ; [ 1 ] = 2 ; [ 2 ] = 4 ; [ 3 ] = 6 ; [ 4 ] = 8 ; [ 5 ] = 10 ; [ 6 ] = 12 ; [ 7 ] = 14 ; [ 8 ] = 0 ; [ 9 ] = 2 ; [ 10 ] = 4 ; [ 11 ] = 6 ; [ 12 ] = 8 ; [ 13 ] = 10 ; [ 14 ] = 12 ; [ 15 ] = 14 ; } ;
local lshift1carry_map = { [ 0 ] = 0 ; [ 1 ] = 0 ; [ 2 ] = 0 ; [ 3 ] = 0 ; [ 4 ] = 0 ; [ 5 ] = 0 ; [ 6 ] = 0 ; [ 7 ] = 0 ; [ 8 ] = 1 ; [ 9 ] = 1 ; [ 10 ] = 1 ; [ 11 ] = 1 ; [ 12 ] = 1 ; [ 13 ] = 1 ; [ 14 ] = 1 ; [ 15 ] = 1 ; } ;
local arshift1carry_map = { [ 0 ] = 0 ; [ 1 ] = 0 ; [ 2 ] = 0 ; [ 3 ] = 0 ; [ 4 ] = 0 ; [ 5 ] = 0 ; [ 6 ] = 0 ; [ 7 ] = 0 ; [ 8 ] = 8 ; [ 9 ] = 8 ; [ 10 ] = 8 ; [ 11 ] = 8 ; [ 12 ] = 8 ; [ 13 ] = 8 ; [ 14 ] = 8 ; [ 15 ] = 8 ; } ;
module " bit "
local bit_mt = { __tostring = function ( t ) return ( " %x%x%x%x%x%x%x%x " ) : format ( t [ 1 ] , t [ 2 ] , t [ 3 ] , t [ 4 ] , t [ 5 ] , t [ 6 ] , t [ 7 ] , t [ 8 ] ) ; end } ;
local function do_bop ( a , b , op )
return setmetatable ( {
op [ a [ 1 ] * 16 + b [ 1 ] ] ;
op [ a [ 2 ] * 16 + b [ 2 ] ] ;
op [ a [ 3 ] * 16 + b [ 3 ] ] ;
op [ a [ 4 ] * 16 + b [ 4 ] ] ;
op [ a [ 5 ] * 16 + b [ 5 ] ] ;
op [ a [ 6 ] * 16 + b [ 6 ] ] ;
op [ a [ 7 ] * 16 + b [ 7 ] ] ;
op [ a [ 8 ] * 16 + b [ 8 ] ] ;
} , bit_mt ) ;
end
local function do_uop ( a , op )
return setmetatable ( {
op [ a [ 1 ] ] ;
op [ a [ 2 ] ] ;
op [ a [ 3 ] ] ;
op [ a [ 4 ] ] ;
op [ a [ 5 ] ] ;
op [ a [ 6 ] ] ;
op [ a [ 7 ] ] ;
op [ a [ 8 ] ] ;
} , bit_mt ) ;
end
function bxor ( a , b ) return do_bop ( a , b , xor_map ) ; end
function bor ( a , b ) return do_bop ( a , b , or_map ) ; end
function band ( a , b ) return do_bop ( a , b , and_map ) ; end
function bnot ( a ) return do_uop ( a , not_map ) ; end
local function _rshift1 ( t )
local carry = 0 ;
for i = 1 , 8 do
local t_i = rshift1_map [ t [ i ] ] + carry ;
carry = rshift1carry_map [ t [ i ] ] ;
t [ i ] = t_i ;
end
end
function rshift ( a , i )
local t = { a [ 1 ] , a [ 2 ] , a [ 3 ] , a [ 4 ] , a [ 5 ] , a [ 6 ] , a [ 7 ] , a [ 8 ] } ;
for _ = 1 , i do _rshift1 ( t ) ; end
return setmetatable ( t , bit_mt ) ;
end
local function _arshift1 ( t )
local carry = arshift1carry_map [ t [ 1 ] ] ;
for i = 1 , 8 do
local t_i = rshift1_map [ t [ i ] ] + carry ;
carry = rshift1carry_map [ t [ i ] ] ;
t [ i ] = t_i ;
end
end
function arshift ( a , i )
local t = { a [ 1 ] , a [ 2 ] , a [ 3 ] , a [ 4 ] , a [ 5 ] , a [ 6 ] , a [ 7 ] , a [ 8 ] } ;
for _ = 1 , i do _arshift1 ( t ) ; end
return setmetatable ( t , bit_mt ) ;
end
local function _lshift1 ( t )
local carry = 0 ;
for i = 8 , 1 , - 1 do
local t_i = lshift1_map [ t [ i ] ] + carry ;
carry = lshift1carry_map [ t [ i ] ] ;
t [ i ] = t_i ;
end
end
function lshift ( a , i )
local t = { a [ 1 ] , a [ 2 ] , a [ 3 ] , a [ 4 ] , a [ 5 ] , a [ 6 ] , a [ 7 ] , a [ 8 ] } ;
for _ = 1 , i do _lshift1 ( t ) ; end
return setmetatable ( t , bit_mt ) ;
end
local function _cast ( a )
if type ( a ) == " number " then a = ( " %x " ) : format ( a ) ;
elseif type ( a ) == " table " then return a ;
elseif type ( a ) ~= " string " then error ( " string expected, got " .. type ( a ) , 2 ) ; end
local t = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
a = " 00000000 " .. a ;
a = a : sub ( - 8 ) ;
for i = 1 , 8 do
t [ i ] = tonumber ( a : sub ( i , i ) , 16 ) or error ( " Number format error " , 2 ) ;
end
return setmetatable ( t , bit_mt ) ;
end
local function wrap1 ( f )
return function ( a , ... )
if type ( a ) ~= " table " then a = _cast ( a ) ; end
a = f ( a , ... ) ;
a = tonumber ( tostring ( a ) , 16 ) ;
if a > 0x7fffffff then a = a - 1 - 0xffffffff ; end
return a ;
end ;
end
local function wrap2 ( f )
return function ( a , b , ... )
if type ( a ) ~= " table " then a = _cast ( a ) ; end
if type ( b ) ~= " table " then b = _cast ( b ) ; end
a = f ( a , b , ... ) ;
a = tonumber ( tostring ( a ) , 16 ) ;
if a > 0x7fffffff then a = a - 1 - 0xffffffff ; end
return a ;
end ;
end
bxor = wrap2 ( bxor ) ;
bor = wrap2 ( bor ) ;
band = wrap2 ( band ) ;
bnot = wrap1 ( bnot ) ;
lshift = wrap1 ( lshift ) ;
rshift = wrap1 ( rshift ) ;
arshift = wrap1 ( arshift ) ;
cast = wrap1 ( _cast ) ;
bits = 32 ;
return _M ;