#ifndef GLOBALS
#define GLOBALS 1

#ifndef NFACTOR
#define NFACTOR 10
#endif

#if NFACTOR == 1
#  define __NF__ 2u
#elif NFACTOR == 2
# define __NF__ 4u
#elif NFACTOR == 3
#  define __NF__ 8u
#elif NFACTOR == 4
#  define __NF__ 16u
#elif NFACTOR == 5
#  define __NF__ 32u
#elif NFACTOR == 6
#  define __NF__ 64u
#elif NFACTOR == 7
#  define __NF__ 128u
#elif NFACTOR == 8
#  define __NF__ 256u
#elif NFACTOR == 9
#  define __NF__ 512u
#elif NFACTOR == 10
#  define __NF__ 1024u
#elif NFACTOR == 11
#  define __NF__ 2048u
#elif NFACTOR == 12
#  define __NF__ 4096u
#elif NFACTOR == 13
#  define __NF__ 8192u
#elif NFACTOR == 14
#  define __NF__ 16384u
#elif NFACTOR == 15
#  define __NF__ 32768u
#elif NFACTOR == 16
#  define __NF__ 65536u
#elif NFACTOR == 17
#  define __NF__ 131072u
#elif NFACTOR == 18
#  define __NF__ 262144u
#elif NFACTOR == 19
#  define __NF__ 524288u
#elif NFACTOR == 20
#  define __NF__ 1048576u
#else
# define __NF__ 1024u
#endif

#define DEFNFACTOR(n) \
	const uint n = __NF__;

#define E0 0x00FF00FFU
#define E1 0xFF00FF00U

#define SK00 0x80000000U
#define SK01 0x00000280U
#define SK02 0x5C5C5C5CU
#define SK03 0x36363636U
#define SK04 0x000004a0U
#define SK05 0x00000300U

#define zero   0x0U
#define one    0x1U
#define two    0x2U
#define three  0x3U
#define four   0x4U
#define five   0x5U
#define six    0x6U
#define seven  0x7U
#define eight  0x8U



//0x00000001, 0x80000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000620

__constant uint16 Kc[8] = {
(uint16)(0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U),
(uint16)(0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, 0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U),
(uint16)(0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U, 0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U),
(uint16)(0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U, 0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U)
};


/*
(uint16)(0x428a2f99U, 0xf1374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf794U),
(uint16)(0xf59b89c2U, 0x73924787U, 0x23c6886eU, 0xa42ca65cU, 0x15ed3627U, 0x4d6edcbfU, 0xe28217fcU, 0xef02488fU, 0xb707775cU, 0x0468c23fU, 0xe7e72b4cU, 0x49e1f1a2U, 0x4b99c816U, 0x926d1570U, 0xaa0fc072U, 0xadb36e2cU),
(uint16)(0xad87a3eaU, 0xbcb1d3a3U, 0x7b993186U, 0x562b9420U, 0xbff3ca0cU, 0xda4b0c23U, 0x6cd8711aU, 0x8f337caaU, 0xc91b1417U, 0xc359dce1U, 0xa83253a7U, 0x3b13c12dU, 0x9d3d725dU, 0xd9031a84U, 0xb1a03340U, 0x16f58012U),
(uint16)(0xe64fb6a2U, 0xe84d923aU, 0xe93a5730U, 0x09837686U, 0x078ff753U, 0x29833341U, 0xd5de0b7eU, 0x6948ccf4U, 0xe0a1adbeU, 0x7c728e11U, 0x511c78e4U, 0x315b45bdU, 0xfca71413U, 0xea28f96aU, 0x79703128U, 0x4e1ef848U)
};
*/

/*
__constant uint16 Kc[7] = {
(uint16)(0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U, 0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U),
(uint16)(0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U, 0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U),
(uint16)(0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, 0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U),

(uint16)(0x428a2f99U, 0xf1374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf794U),
(uint16)(0xf59b89c2U, 0x73924787U, 0x23c6886eU, 0xa42ca65cU, 0x15ed3627U, 0x4d6edcbfU, 0xe28217fcU, 0xef02488fU, 0xb707775cU, 0x0468c23fU, 0xe7e72b4cU, 0x49e1f1a2U, 0x4b99c816U, 0x926d1570U, 0xaa0fc072U, 0xadb36e2cU),
(uint16)(0xad87a3eaU, 0xbcb1d3a3U, 0x7b993186U, 0x562b9420U, 0xbff3ca0cU, 0xda4b0c23U, 0x6cd8711aU, 0x8f337caaU, 0xc91b1417U, 0xc359dce1U, 0xa83253a7U, 0x3b13c12dU, 0x9d3d725dU, 0xd9031a84U, 0xb1a03340U, 0x16f58012U),
(uint16)(0xe64fb6a2U, 0xe84d923aU, 0xe93a5730U, 0x09837686U, 0x078ff753U, 0x29833341U, 0xd5de0b7eU, 0x6948ccf4U, 0xe0a1adbeU, 0x7c728e11U, 0x511c78e4U, 0x315b45bdU, 0xfca71413U, 0xea28f96aU, 0x79703128U, 0x4e1ef848U) };



(uint16)(0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U),
(uint16)(0x428a2f99U, 0xf1374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf794U),


0x428a2f99U 0xf1374491U 0xb5c0fbcfU 0xe9b5dba5U 0x3956c25bU 0x59f111f1U 0x923f82a4U 0xab1c5ed5U 0xd807aa98U 0x12835b01U 0x243185beU 0x550c7dc3U 0x72be5d74U 0x80deb1feU 0x9bdc06a7U 0xc19bf794U 
0xf59b89c2U 0x73924787U 0x23c6886eU 0xa42ca65cU 0x15ed3627U 0x4d6edcbfU 0xe28217fcU 0xef02488fU 0xb707775cU 0x0468c23fU 0xe7e72b4cU 0x49e1f1a2U 0x4b99c816U 0x926d1570U 0xaa0fc072U 0xadb36e2cU 
0xad87a3eaU 0xbcb1d3a3U 0x7b993186U 0x562b9420U 0xbff3ca0cU 0xda4b0c23U 0x6cd8711aU 0x8f337caaU 0xc91b1417U 0xc359dce1U 0xa83253a7U 0x3b13c12dU 0x9d3d725dU 0xd9031a84U 0xb1a03340U 0x16f58012U 
0xe64fb6a2U 0xe84d923aU 0xe93a5730U 0x09837686U 0x078ff753U 0x29833341U 0xd5de0b7eU 0x6948ccf4U 0xe0a1adbeU 0x7c728e11U 0x511c78e4U 0x315b45bdU 0xfca71413U 0xea28f96aU 0x79703128U 0x4e1ef848U 



0x428a2f99U 0xf1374491U 0xb5c0fbcfU 0xe9b5dba5U 0x3956c25bU 0x59f111f1U 0x923f82a4U 0xab1c5ed5U 0xd807aa98U 0x12835b01U 0x243185beU 0x550c7dc3U 0x72be5d74U 0x80deb1feU 0x9bdc06a7U 0xc19bf794U 
0xf59b89c2U 0x73924787U 0x23c6886eU 0xa42ca65cU 0xfdf13fdfU 0x4d6edcbfU 0xee6487fdU 0x560ae843U 0x4bf80d74U 0x40a4c152U 0x19dd0e1cU 0xb169f6c0U 0x99d533b6U 0x9cfab2bfU 0xc04e4e48U 0x560fd9d9U 
0x6cb2b96bU 0x11f2aa71U 0x26210439U 0xdb4d9823U 0x92b51189U 0x4e4e1645U 0x11bb301fU 0x7719eaf2U 0xe05e12cbU 0x1ec1f405U 0x74b28e80U 0xf2aafd3fU 0xff6de5deU 0xb19a82caU 0xf42eafe9U 0x5190058aU 
0x95b9ac80U 0x17d42816U 0x6719e648U 0x7cbd57ecU 0xea289076U 0xf1291e46U 0x27374579U 0xd9d6e1beU 0xb7e4664bU 0x5dcb201fU 0x04e8963eU 0x039af9f5U 0x77da257bU 0xa6a055b9U 0x8cec0fedU 0x360a3fbbU 

0x428a2f99U 0xf1374491U 0xb5c0fbcfU 0xe9b5dba5U 0x3956c25bU 0x59f111f1U 0x923f82a4U 0xab1c5ed5U 0xd807aa98U 0x12835b01U 0x243185beU 0x550c7dc3U 0x72be5d74U 0x80deb1feU 0x9bdc06a7U 0xc19bf174U 
0xf59b89c2U 0x6fbe4786U 0x23c6886eU 0x242cf1ccU 0xfdf13fdfU 0x6c748caaU 0xee6481ddU 0x920ad35fU 0x48840d73U 0x484b9bcdU 0x19dc770dU 0x5f95d5b1U 0x77308377U 0x07bb7454U 0x4a82fb2cU 0x37a41aa1U 
0x42d74774U 0xa6a98d6cU 0x2f5ea031U 0xfea88baeU 0xcc8f3534U 0xf3eca03bU 0x8bbcbd6cU 0x1b7356baU 0x3049edb4U 0xaf1e64caU 0xeddb895eU 0x52aa8f16U 0xe58b3f89U 0x86e30c20U 0xae821046U 0xd646f496U 
0xcecd4282U 0x5e0bfe18U 0x230d72f7U 0xcba70852U 0xddb4912eU 0x738b2dd3U 0xaecdd903U 0x70036dcdU 0xe9f843c1U 0x83237e6dU 0x38eaa8e3U 0x82451eaaU 0x95d3f7b2U 0xd84eefa3U 0xa6a64702U 0x8252da70U 



0x428a2f99U 0xf1374491U 0xb5c0fbcfU 0xe9b5dba5U 0x3956c25bU 0x59f111f1U 0x923f82a4U 0xab1c5ed5U 0xd807aa98U 0x12835b01U 0x243185beU 0x550c7dc3U 0x72be5d74U 0x80deb1feU 0x9bdc06a7U 0xc19bf174U 
0xf59b89c2U 0x6fbe4786U 0x23c6886eU 0x242cf1ccU 0x15ed3627U 0x6c748caaU 0xe28211dcU 0x8d023e1dU 0xb15f775aU 0x08431cfdU 0x67e6bfc5U 0x28dfc1deU 0xa20ca9dbU 0x44cc31aaU 0xfa52d668U 0xf972a2cdU 
0xe19e86bfU 0x61a84709U 0x30705773U 0xd3a20b1eU 0x4be50432U 0x9888debcU 0xb0e885e6U 0x6d7ef1c0U 0xd295200eU 0xede8d450U 0xeb50077cU 0x004a9aaaU 0x638e3144U 0x8fe4928bU 0x1f723673U 0x9a5c59b8U 
0x871da745U 0x706b39b9U 0x2bc2bb1bU 0xebb17223U 0xf5e955c9U 0x0327c3adU 0x7fd472eaU 0xb2e3223bU 0xb1a383f2U 0x94df239bU 0x80a7413bU 0xf1dd93d9U 0xcfd56074U 0xf5a1403fU 0x1fcfeb45U 0x6c4a604bU 

0x428a2f99U 0xf1374491U 0xb5c0fbcfU 0xe9b5dba5U 0x3956c25bU 0x59f111f1U 0x923f82a4U 0xab1c5ed5U 0xd807aa98U 0x12835b01U 0x243185beU 0x550c7dc3U 0x72be5d74U 0x80deb1feU 0x9bdc06a7U 0xc19bf174U 
0xf59b89c2U 0x6fbe4786U 0x23c6886eU 0x242cf1ccU 0x15ed3627U 0x6c748caaU 0xe28211dcU 0x8d023e1dU 0xb15f775aU 0x08431cfdU 0x67e6bfc5U 0x28dfc1deU 0xa20ca9dbU 0x44cc31aaU 0xfa52d668U 0xf972a2cdU 
0xe19e86bfU 0x61a84709U 0x30705773U 0xd3a20b1eU 0x4be50432U 0x9888debcU 0xb0e885e6U 0x6d7ef1c0U 0xd295200eU 0xede8d450U 0xeb50077cU 0x004a9aaaU 0x638e3144U 0x8fe4928bU 0x1f723673U 0x9a5c59b8U 
0x871da745U 0x706b39b9U 0x2bc2bb1bU 0xebb17223U 0xf5e955c9U 0x0327c3adU 0x7fd472eaU 0xb2e3223bU 0xb1a383f2U 0x94df239bU 0x80a7413bU 0xf1dd93d9U 0xcfd56074U 0xf5a1403fU 0x1fcfeb45U 0x6c4a604bU 



0x428a2f99U 0xf1374491U 0xb5c0fbcfU 0xe9b5dba5U 0x3956c25bU 0x59f111f1U 0x923f82a4U 0xab1c5ed5U 0xd807aa98U 0x12835b01U 0x243185beU 0x550c7dc3U 0x72be5d74U 0x80deb1feU 0x9bdc06a7U 0xc19bf794U
0x538a4f99U 0xf50b4492U 0xc9c5e677U 0x69d5e035U 0x215acc13U 0x5ceb6a06U 0x1810f0c4U 0x23251e8aU 0xf6d0d0a2U 0x6eba56d3U 0x5c158942U 0xdf94ef9eU 0xf7781997U 0x3da43627U 0x3f2163c8U 0x5b263639U
0xc85ac8fdU 0xffcdf6fcU 0xe42dbf59U 0xeca962b2U 0x94401913U 0xbdd21359U 0x7d552a90U 0xa7ddaefaU 0xfe62d60eU 0x2dc2d197U 0x0a184df5U 0xc8b3ed4dU 0x3e68e7b8U 0x8348c65eU 0x596e0462U 0xc826d116U
0x0f352524U 0x3b4d6ac3U 0x77b2dbb3U 0xbe889576U 0x07caacfbU 0x349b9ae8U 0x0c80c3d3U 0xac36bbd6U 0x4419d568U 0x165085a3U 0xf085868eU 0xf9a0c178U 0xdea6718dU 0xc6b73e7dU 0x565293d8U 0x494970caU



*/

/*
volatile  uint16 Kc[4] = { (uint16)(0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U,
                                    0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U),
                            (uint16)(0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU,
                                    0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U),
                            (uint16)(0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U,
                                    0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U),
                            (uint16)(0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U,
                                    0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U) };

*/


/*
__constant uint16 Kc[4] = { (uint16)(0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U,
									0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U),
							(uint16)(0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU,
									0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U),
							(uint16)(0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U,
									0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U),
							(uint16)(0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U,
									0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U) };

*/
/*

                                (uint8)(0xf59b89c2U,0x73924787U,0x23c6886eU,0xa42ca65cU,0x15ed3627U,0x4d6edcbfU,0xe28217fcU,0xef02488fU),
                                (uint8)(0xb707775cU,0x0468c23fU,0xe7e72b4cU,0x49e1f1a2U,0x4b99c816U,0x926d1570U,0xaa0fc072U,0xadb36e2cU),
                                (uint8)(0xad87a3eaU,0xbcb1d3a3U,0x7b993186U,0x562b9420U,0xbff3ca0cU,0xda4b0c23U,0x6cd8711aU,0x8f337caaU),
                                (uint8)(0xc91b1417U,0xc359dce1U,0xa83253a7U,0x3b13c12dU,0x9d3d725dU,0xd9031a84U,0xb1a03340U,0x16f58012U),
                                (uint8)(0xe64fb6a2U,0xe84d923aU,0xe93a5730U,0x09837686U,0x078ff753U,0x29833341U,0xd5de0b7eU,0x6948ccf4U),
                                (uint8)(0xe0a1adbeU,0x7c728e11U,0x511c78e4U,0x315b45bdU,0xfca71413U,0xea28f96aU,0x79703128U,0x4e1ef848U)};

0x428a2f99,0xf1374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf794,
0xf59b89c2,0x73924787,0x23c6886e,0xa42ca65c,0x15ed3627,0x4d6edcbf,0xe28217fc,0xef02488f,
0xb707775c,0x0468c23f,0xe7e72b4c,0x49e1f1a2,0x4b99c816,0x926d1570,0xaa0fc072,0xadb36e2c,
0xad87a3ea,0xbcb1d3a3,0x7b993186,0x562b9420,0xbff3ca0c,0xda4b0c23,0x6cd8711a,0x8f337caa,
0xc91b1417,0xc359dce1,0xa83253a7,0x3b13c12d,0x9d3d725d,0xd9031a84,0xb1a03340,0x16f58012,
0xe64fb6a2,0xe84d923a,0xe93a5730,0x09837686,0x078ff753,0x29833341,0xd5de0b7e,0x6948ccf4,
0xe0a1adbe,0x7c728e11,0x511c78e4,0x315b45bd,0xfca71413,0xea28f96a,0x79703128,0x4e1ef848,
};


*/
/*
__constant uint16 Kc[7] = { (uint16)(0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U,
								0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U),
							(uint16)(0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U,
								0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U),
							(uint16)(0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU,
								0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U),
							(uint16)(0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U,
								0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U),
							(uint16)(0xf59b89c2U, 0x73924787U, 0x23c6886eU, 0xa42ca65cU, 0x15ed3627U, 0x4d6edcbfU, 0xe28217fcU, 0xef02488fU,
								0xb707775cU, 0x0468c23fU, 0xe7e72b4cU, 0x49e1f1a2U, 0x4b99c816U, 0x926d1570U, 0xaa0fc072U, 0xadb36e2cU),
							(uint16)(0xad87a3eaU, 0xbcb1d3a3U, 0x7b993186U, 0x562b9420U, 0xbff3ca0cU, 0xda4b0c23U, 0x6cd8711aU, 0x8f337caaU,
								0xc91b1417U, 0xc359dce1U, 0xa83253a7U, 0x3b13c12dU, 0x9d3d725dU, 0xd9031a84U, 0xb1a03340U, 0x16f58012U),
							(uint16)(0xe64fb6a2U, 0xe84d923aU, 0xe93a5730U, 0x09837686U, 0x078ff753U, 0x29833341U, 0xd5de0b7eU, 0x6948ccf4U,
								0xe0a1adbeU, 0x7c728e11U, 0x511c78e4U, 0x315b45bdU, 0xfca71413U, 0xea28f96aU, 0x79703128U, 0x4e1ef848U) };

*/


/*
__constant uint Kc[112] = { 0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U,
							0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U,
							0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U,
							0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U,
							0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU,
							0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U};


							0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U,
							0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U,



							0xf59b89c2U, 0x73924787U, 0x23c6886eU, 0xa42ca65cU, 0x15ed3627U, 0x4d6edcbfU, 0xe28217fcU, 0xef02488fU,
							0xb707775cU, 0x0468c23fU, 0xe7e72b4cU, 0x49e1f1a2U, 0x4b99c816U, 0x926d1570U, 0xaa0fc072U, 0xadb36e2cU,
							0xad87a3eaU, 0xbcb1d3a3U, 0x7b993186U, 0x562b9420U, 0xbff3ca0cU, 0xda4b0c23U, 0x6cd8711aU, 0x8f337caaU,
							0xc91b1417U, 0xc359dce1U, 0xa83253a7U, 0x3b13c12dU, 0x9d3d725dU, 0xd9031a84U, 0xb1a03340U, 0x16f58012U,
							0xe64fb6a2U, 0xe84d923aU, 0xe93a5730U, 0x09837686U, 0x078ff753U, 0x29833341U, 0xd5de0b7eU, 0x6948ccf4U,
							0xe0a1adbeU, 0x7c728e11U, 0x511c78e4U, 0x315b45bdU, 0xfca71413U, 0xea28f96aU, 0x79703128U, 0x4e1ef848U };


*/







//__constant uint Ka[16] = {  0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U,
//							0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U};

/*
__constant uint16 Kc[3] = { (uint16)(0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU,
									0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U),
							(uint16)(0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U,
									0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U),
							(uint16)(0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U,
									0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U) };

*/




/*
    0x428a2f99,0xf1374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
    0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf794,

    0xf59b89c2,0x73924787,0x23c6886e,0xa42ca65c,0x15ed3627,0x4d6edcbf,0xe28217fc,0xef02488f,
    0xb707775c,0x0468c23f,0xe7e72b4c,0x49e1f1a2,0x4b99c816,0x926d1570,0xaa0fc072,0xadb36e2c,
    0xad87a3ea,0xbcb1d3a3,0x7b993186,0x562b9420,0xbff3ca0c,0xda4b0c23,0x6cd8711a,0x8f337caa,
    0xc91b1417,0xc359dce1,0xa83253a7,0x3b13c12d,0x9d3d725d,0xd9031a84,0xb1a03340,0x16f58012,
    0xe64fb6a2,0xe84d923a,0xe93a5730,0x09837686,0x078ff753,0x29833341,0xd5de0b7e,0x6948ccf4,
    0xe0a1adbe,0x7c728e11,0x511c78e4,0x315b45bd,0xfca71413,0xea28f96a,0x79703128,0x4e1ef848,
*/




#define rotl(x,y) rotate(x,y)
#define Ch(x,y,z) bitselect(z,y,x)
#define Maj(x,y,z) Ch((x^z),y,z)

#define EndianSwapa(n) (Ch(E0, rotl(n, 8U), rotl(n, 24U)))
#define EndianSwapb(n) (rotl(n & E0, 24U)|rotl(n & E1, 8U))

#define Tr2(x)		(rotl(x, 30U) ^ rotl(x, 19U) ^ rotl(x, 10U))
#define Tr1(x)		(rotl(x, 26U) ^ rotl(x, 21U) ^ rotl(x, 7U))

#define Wr2(x)		(rotl(x, 25U) ^ rotl(x, 14U) ^ (x>>3U))
#define Wr1(x)		(rotl(x, 15U) ^ rotl(x, 13U) ^ (x>>10U))

#define RND(a, b, c, d, e, f, g, h, k)  \
	h += Tr1(e); 			\
	h += Ch(e, f, g); 		\
	h += k;				\
	d += h;				\
	h += Tr2(a); 			\
	h += Maj(a, b, c);


#define FXRD(a, b, c, d, e, f, g, h, k)  \
    h += Tr1(e);            \
    h += Ch(e, f, g) + k;       \
    d += h;             \
    h += Tr2(a);            \
    h += Maj(a, b, c);

#define CLSIZE 64

#if (CLSIZE == 64)
# define CO_0 ((y*xSIZE+x)<<1)
# define CO_1 ((y*xSIZE+x)<<1)+1

//# define CO_W0 (y+x)<<1
//# define CO_W1 ((y+x)<<1)+1

# define CO_W0 (idx=(y+x)<<1)
# define CO_W1 idx+1

//# define CO_0 (idx=(y+x)<<1)
//# define CO_1 idx+1

//# define CO_0 (idx=(y*xSIZE+x)<<1)
//# define CO_1 idx+1

#else

//# define CO (idx+z)
# define CO ((y*xSIZE+x)<<2)+z
//# define CO_0 ((y*xSIZE+x)<<2)
//# define CO_1 ((y*xSIZE+x)<<2)+1
//# define CO_2 ((y*xSIZE+x)<<2)+2
//# define CO_3 ((y*xSIZE+x)<<2)+3
#endif



/*
__constant uint fixedWa[8] = {0x428a2f99U,0xd807aa98U,0xf59b89c2U,0xb707775cU,0xad87a3eaU,0xc91b1417U,0xe64fb6a2U,0xe0a1adbeU};
__constant uint fixedWb[8] = {0xf1374491U,0x12835b01U,0x73924787U,0x0468c23fU,0xbcb1d3a3U,0xc359dce1U,0xe84d923aU,0x7c728e11U};
__constant uint fixedWc[8] = {0xb5c0fbcfU,0x243185beU,0x23c6886eU,0xe7e72b4cU,0x7b993186U,0xa83253a7U,0xe93a5730U,0x511c78e4U};
__constant uint fixedWd[8] = {0xe9b5dba5U,0x550c7dc3U,0xa42ca65cU,0x49e1f1a2U,0x562b9420U,0x3b13c12dU,0x09837686U,0x315b45bdU};
__constant uint fixedWe[8] = {0x3956c25bU,0x72be5d74U,0x15ed3627U,0x4b99c816U,0xbff3ca0cU,0x9d3d725dU,0x078ff753U,0xfca71413U};
__constant uint fixedWf[8] = {0x59f111f1U,0x80deb1feU,0x4d6edcbfU,0x926d1570U,0xda4b0c23U,0xd9031a84U,0x29833341U,0xea28f96aU};
__constant uint fixedWg[8] = {0x923f82a4U,0x9bdc06a7U,0xe28217fcU,0xaa0fc072U,0x6cd8711aU,0xb1a03340U,0xd5de0b7eU,0x79703128U};
__constant uint fixedWh[8] = {0xab1c5ed5U,0xc19bf794U,0xef02488fU,0xadb36e2cU,0x8f337caaU,0x16f58012U,0x6948ccf4U,0x4e1ef848U};
*/


/*
__constant uint8 fixedW[8] = {(uint8)(0x428a2f99U,0xf1374491U,0xb5c0fbcfU,0xe9b5dba5U,0x3956c25bU,0x59f111f1U,0x923f82a4U,0xab1c5ed5U),
								(uint8)(0xd807aa98U,0x12835b01U,0x243185beU,0x550c7dc3U,0x72be5d74U,0x80deb1feU,0x9bdc06a7U,0xc19bf794U),
								(uint8)(0xf59b89c2U,0x73924787U,0x23c6886eU,0xa42ca65cU,0x15ed3627U,0x4d6edcbfU,0xe28217fcU,0xef02488fU),
								(uint8)(0xb707775cU,0x0468c23fU,0xe7e72b4cU,0x49e1f1a2U,0x4b99c816U,0x926d1570U,0xaa0fc072U,0xadb36e2cU),
								(uint8)(0xad87a3eaU,0xbcb1d3a3U,0x7b993186U,0x562b9420U,0xbff3ca0cU,0xda4b0c23U,0x6cd8711aU,0x8f337caaU),
								(uint8)(0xc91b1417U,0xc359dce1U,0xa83253a7U,0x3b13c12dU,0x9d3d725dU,0xd9031a84U,0xb1a03340U,0x16f58012U),
								(uint8)(0xe64fb6a2U,0xe84d923aU,0xe93a5730U,0x09837686U,0x078ff753U,0x29833341U,0xd5de0b7eU,0x6948ccf4U),
								(uint8)(0xe0a1adbeU,0x7c728e11U,0x511c78e4U,0x315b45bdU,0xfca71413U,0xea28f96aU,0x79703128U,0x4e1ef848U)};

*/



#define FOUND (0xFF)
#define SETFOUND(Xnonce) output[output[FOUND]++] = Xnonce

#endif