<%
'=======================================================
' 欢迎使用《阿赛大型门户网站系统V3.0》，简称“AsaiMHV3”
' 技术支持、商业版咨询、官方唯一指定联系QQ“4941172”
' 官方网站：http://77ya.com      程序负责人：阿赛
'=======================================================

Dim Tmp1,pay_number,pay_signa,pay_back,pay_currency,pay_url,v_moneytype
Dim pay_alipay_number,pay_alipay_PartnerID,pay_alipay_signa,pay_alipay_url,pay_alipay_ConnectType,pay_alipay_Type
Tmp1 = Split(Cls.Web_Payment,"|")
pay_number=Tmp1(0)		'网银商户代号
pay_signa=Tmp1(1)		'网银商户支付私钥，要与网银管理中心里设置的值相同
pay_currency=Tmp1(2)		'网银货币种类（该值请勿乱改动）
pay_url=Tmp1(3)			'网银支付网关入口（请不要随意更改）
pay_back=Tmp1(4)		'网银支付成功后默认的返回(URL)地址
pay_alipay_number=Tmp1(5)	'支付宝商户代号
pay_alipay_PartnerID=Tmp1(6)	'支付宝商户PartnerID，要与网银管理中心里设置的值相同
pay_alipay_signa=Tmp1(7)	'支付宝商户支付私钥，要与网银管理中心里设置的值相同
pay_alipay_url=Tmp1(8)		'支付宝支付网关入口（请不要随意更改）
pay_alipay_ConnectType=Tmp1(9)	'支付宝接口类型（该值请勿乱改动）
pay_alipay_Type=Tmp1(10)	'支付宝支付类型（该值请勿乱改动）

Function Fm_Price(pvar,pt)
	if not isnumeric(pvar) then
		fm_price=0
		exit function
	end if
	Dim nvar,ni
	nvar=formatnumber(pvar)
	nvar=replace(nvar,",","")
	if left(nvar,1)="." then
		nvar="0"&nvar
	end if
	if pt=1 then
		fm_price=nvar
		exit function
	end if
	for ni=0 to 1
		if cstr(right(nvar,1))="0" then
			nvar=left(nvar,len(nvar)-1)
		else
			ni=1
		end if
	next
	if cstr(right(nvar,1))="." then
		nvar=left(nvar,len(nvar)-1)
	end if
	if not isnumeric(nvar) then nvar=0
	Fm_Price=csng(nvar)
End Function

Function Pay_Encrypt(pvar)
	pay_encrypt=AsaiMHMd5(pvar,"long")
End Function

Class AsaiMHPay
	Public back_url,frm_target,frm_js,val_num
	Public pay_sort,pay_ordernum,pay_amount,pay_username,pay_address,pay_post,pay_phone,pay_email,pay_carry,pay_remark
	Private Sub Class_Initialize()
		back_url=""
		frm_target=true
		frm_js=true
		val_num=0
	End Sub

	Public Function Sort_Type(ts)
		dim temp1
		ts=replace(ts,"'","")
		ts=replace(ts,"""","")
		ts=replace(ts,"*","")
		ts=replace(ts,"#","")
		ts=replace(ts,"$","")
		ts=replace(ts,"%","")
		ts=replace(ts," ","")
		Select Case ts
		Case "emoney"
			temp1=ts
		Case "shop"
			temp1=ts
		Case else
			temp1=ts
		End Select
		sort_type=temp1
	End Function

	Public Sub Pay_Return()
		dim re_safety,var_tmp,v_pstatus,v_moneytype,v_pmode
		pay_ordernum=trim(request.form("v_oid"))       '定单号
		pay_amount=trim(request.form("v_amount"))      '订单实际支付金额
		re_safety=request.form("v_md5str")             'Md5校验串
		v_pstatus=trim(request.form("v_pstatus"))      '支付状态
		pay_currency=trim(request.form("v_moneytype")) '货币种类
		if request.form("v_md5str")="" then
			val_num=1
			exit sub
		End If
		var_tmp=Ucase(pay_encrypt(cstr(pay_ordernum)&cstr(v_pstatus)&cstr(pay_amount)&cstr(pay_currency)&cstr(pay_signa)))   '顺序为定单号，支付状态，订单实际支付金额，货币种类，私匙
		If re_safety<>var_tmp Then
			val_num=2
			Exit Sub
		End If
	End Sub

	Public Sub Pay_Frm(ftype)
		dim temp1
		pay_amount=fm_price(pay_amount,1)
		dim var_tmp,pay_safety
		pay_sort=sort_type(pay_sort)
		var_tmp=cstr(fm_price(pay_amount,1))&cstr(pay_currency)&cstr(pay_ordernum)&cstr(pay_number)&cstr(back_url)&cstr(pay_signa)
		pay_safety=Ucase(pay_encrypt(var_tmp))
		if back_url="" then back_url=pay_back
		temp1=vbcrlf&"<form name=AsaiMHPay_Frm action='"&pay_url&"' method=post"
		if frm_target then temp1=temp1&" target=pay_win"
		temp1=temp1&">" & _
		vbcrlf&"<input type=hidden name=v_mid value='"&pay_number&"'>" & _
		vbcrlf&"<input type=hidden name=v_moneytype value='"&pay_currency&"'>" & _
		vbcrlf&"<input type=hidden name=v_oid value='"&pay_ordernum&"'>" & _
		vbcrlf&"<input type=hidden name=v_amount value='"&pay_amount&"'>" & _
		vbcrlf&"<input type=hidden name=v_rcvname value='"&pay_username&"'>" & _
		vbcrlf&"<input type=hidden name=v_rcvaddr value='"&pay_address&"'>" & _
		vbcrlf&"<input type=hidden name=v_rcvpost value='"&pay_post&"'>" & _
		vbcrlf&"<input type=hidden name=v_rcvtel value='"&pay_phone&"'>" & _
		vbcrlf&"<input type=hidden name=v_orderemail value='"&pay_email&"'>" & _
		vbcrlf&"<input type=hidden name=remark2 value='"&pay_carry&"'>" & _
		vbcrlf&"<input type=hidden name=remark1 value='"&pay_remark&"'>" & _
		vbcrlf&"<input type=hidden name=v_url value='"&back_url&"'>" & _
		vbcrlf&"<input type=hidden name=v_md5info value='"&pay_safety&"'>" & _
		vbcrlf&"</form>"
		if frm_js then
			temp1=temp1&vbcrlf&"<script language=javascript>" & _
			vbcrlf&"<!--"
		End If
		temp1=temp1&vbcrlf&"function AsaiMHOnline_Pay()" & _
		vbcrlf&"{"
		if frm_target then temp1=temp1&vbcrlf&"  window.open('about:blank','pay_win');"
		temp1=temp1&vbcrlf&"  document.AsaiMHPay_Frm.submit();" & _
		vbcrlf&"}"
		if ftype=1 then temp1=temp1&vbcrlf&"AsaiMHOnline_Pay();"
		if frm_js then
			temp1=temp1&vbcrlf&"-->" & _
			vbcrlf&"</script>"
		End If
		response.write temp1
	End Sub
End Class

Class AsaiMHalipay
	'subject：商品名称
	'body：商品描述
	'out_trade_no：客户网站订单号
	'price：商品单价0.01～50000.00

	'show_url：商品展示地址（可以直接写网站首页网址）
   	'quantity：商品数量
    'payment_type：支付类型，（1代表商品购买）
    'logistics_type：物流种类（快递）
    'logistics_fee：物流费用
   	'logistics_payment：物流费用承担(卖家付)

	Public md5Obj
	Public Sub myAlipay_Initialize()
		Set md5Obj	= New MD5
		md5Obj.MD5_Initialize()
	End Sub

	'获得最终的购买url
	Public Function CreatAlipayItemURL(subject,body,out_trade_no,price,show_url,quantity,logistics_type,logistics_fee,logistics_payment,notify_url,return_url)
		Dim itemURL,minmax,minmaxSlot,j,mark,temp,value,md5str,mystr,Count,sign,temp1,discount
		Dim INTERFACE_URL,imgsrc,imgtitle,service,agent,partner,sign_type,seller_email,key,payment_type
		'初始化各必要变量
		service         = pay_alipay_ConnectType		'接口类型
		agent           = "" 					'合作厂商ID(代理商ID)
		partner		= pay_alipay_PartnerID			'partner合作伙伴ID(必须填)
		sign_type       = "MD5"
		discount	= "0" 					'discount：商品折扣
		seller_email    = pay_alipay_number			'商家Email(必须填)
		key             = pay_alipay_signa			'商家私钥(必须填)
		payment_type    = pay_alipay_Type                	'支付类型（1商品购买，2服务购买）
		INTERFACE_URL	= pay_alipay_url			'支付接口
		imgsrc		= Cls.Web_Dir&"Images/AliPay_Bwrx.gif"	'支付宝按钮图片
		imgtitle	= "推荐使用支付宝付款"			'按钮悬停说明
		mystr = Array("service="&service,"agent="&agent,"partner="&partner,"subject="&subject,"body="&body,"out_trade_no="&out_trade_no,"price="&price,"discount="&discount,"show_url="&show_url,"quantity="&quantity,"payment_type="&payment_type,"logistics_type="&logistics_type,"logistics_fee="&logistics_fee,"logistics_payment="&logistics_payment,"seller_email="&seller_email,"notify_url="&notify_url,"return_url="&return_url)
		Count=ubound(mystr)
		For i = Count TO 0 Step -1
			minmax = mystr( 0 )
			minmaxSlot = 0
			For j = 1 To i
				mark = (mystr( j ) > minmax)
				If mark Then 
					minmax = mystr( j )
					minmaxSlot = j
				End If
			Next
			If minmaxSlot <> i Then 
				temp = mystr( minmaxSlot )
				mystr( minmaxSlot ) = mystr( i )
				mystr( i ) = temp
			End If
		Next
		For j = 0 To Count Step 1
			value = SPLIT(mystr( j ), "=")
			If value(1)<>"" then
				If j=Count Then
					md5str= md5str&mystr( j )
				Else 
					md5str= md5str&mystr( j )&"&"
				End If 
			End If 
		Next
		md5str=md5str&key
		'response.write md5str
		sign=CreatAlipayItemMD5(md5str,0)
		itemURL	= itemURL&INTERFACE_URL 
		For j = 0 To Count Step 1
			value = SPLIT(mystr( j ), "=")
			If  value(1)<>"" then
				itemURL= itemURL&mystr( j )&"&"
			End If 	     
		Next
		itemURL	= itemURL&"sign="&sign&"&sign_type="&sign_type
		'response.write  itemURL  
		'CreatAlipayItemURL	= get_AlipayButtonURL(itemURL,imgtitle,imgsrc)
		temp1=vbcrlf&"<form name=AsaiMHalipay_frm action='"&itemURL&"' method=post target=alipay_win>" & _
		vbcrlf&"</form>" & _
		vbcrlf&"<script language=javascript>" & _
		vbcrlf&"<!--" & _
		vbcrlf&"function AsaiMHOnline_alipay()" & _
		vbcrlf&"{" & _
		vbcrlf&" window.open('about:blank','alipay_win');" & _
		vbcrlf&" document.AsaiMHalipay_frm.submit();" & _
		vbcrlf&"}" & _
		vbcrlf&"AsaiMHOnline_alipay();" & _
		vbcrlf&"-->" & _
		vbcrlf&"</script>"
		response.write temp1
	End Function

	'取得交易的MD5加密串
	Public Function CreatAlipayItemMD5(strTemp,ty)
		CreatAlipayItemMD5	= md5Obj.md5(strTemp)
		if ty=1 then set md5Obj=nothing
	End Function

	Public Function get_AlipayButtonURL(itemURL,imgtitle,imgsrc)
		Dim responseText1
		responseText1	=	responseText1 & "<a href='" & itemURL & "' target='_blank'>"		'购买网址
		responseText1	=	responseText1 & "<img alt='" & imgtitle & "' src='"			'图片说明
		responseText1	=	responseText1 & imgsrc							'图片地址
		responseText1	=	responseText1 & "' align='absmiddle' border='0'/></a>"
		get_AlipayButtonURL=responseText1
	End Function
End Class

Class MD5
	Private BITS_TO_A_BYTE
	Private BYTES_TO_A_WORD
	Private BITS_TO_A_WORD
	Private m_lOnBits(30)
	Private m_l2Power(30)
	'初始化变量
	Public Sub MD5_Initialize()
		BITS_TO_A_BYTE		= 8
		BYTES_TO_A_WORD		= 4
		BITS_TO_A_WORD		= 32
	End Sub

	Private Function LShift(lValue, iShiftBits)
		If iShiftBits = 0 Then
			LShift = lValue
			Exit Function
		ElseIf iShiftBits = 31 Then
			If lValue And 1 Then
				LShift = &H80000000
			Else
				LShift = 0
			End If
			Exit Function
		ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
			Err.Raise 6
		End If
		If (lValue And m_l2Power(31 - iShiftBits)) Then
			LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
		Else
			LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
		End If
	End Function

	Private Function str2bin(varstr) 
		Dim varasc
		Dim i
		Dim varchar
		Dim varlow
		Dim varhigh
		str2bin="" 
		For i=1 To Len(varstr) 
			varchar=mid(varstr,i,1) 
			varasc = Asc(varchar) 
			If varasc<0 Then 
			varasc = varasc + 65535 
			End If 
			If varasc>255 Then 
			varlow = Left(Hex(Asc(varchar)),2) 
			varhigh = right(Hex(Asc(varchar)),2) 
			str2bin = str2bin & chrB("&H" & varlow) & chrB("&H" & varhigh) 
			Else 
			str2bin = str2bin & chrB(AscB(varchar)) 
			End If 
		Next 
	End Function

	Private Function RShift(lValue, iShiftBits)
		If iShiftBits = 0 Then
			RShift = lValue
			Exit Function
		ElseIf iShiftBits = 31 Then
			If lValue And &H80000000 Then
				RShift = 1
			Else
				RShift = 0
			End If
			Exit Function
		ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
			Err.Raise 6
		End If
		RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)
		If (lValue And &H80000000) Then
			RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))
		End If
	End Function

	Private Function RotateLeft(lValue, iShiftBits)
		RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
	End Function

	Private Function AddUnsigned(lX, lY)
		Dim lX4
		Dim lY4
		Dim lX8
		Dim lY8
		Dim lResult
		lX8 = lX And &H80000000
		lY8 = lY And &H80000000
		lX4 = lX And &H40000000
		lY4 = lY And &H40000000	
		lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)
		If lX4 And lY4 Then
			lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
		ElseIf lX4 Or lY4 Then
			If lResult And &H40000000 Then
				lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
			Else
				lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
			End If
		Else
			lResult = lResult Xor lX8 Xor lY8
		End If
		AddUnsigned = lResult
	End Function

	Private Function md5_F(x, y, z)
		md5_F = (x And y) Or ((Not x) And z)
	End Function

	Private Function md5_G(x, y, z)
		md5_G = (x And z) Or (y And (Not z))
	End Function

	Private Function md5_H(x, y, z)
		md5_H = (x Xor y Xor z)
	End Function

	Private Function md5_I(x, y, z)
		md5_I = (y Xor (x Or (Not z)))
	End Function

	Private Sub md5_FF(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End Sub

	Private Sub md5_GG(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End Sub

	Private Sub md5_HH(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End Sub

	Private Sub md5_II(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End Sub

	Private Function ConvertToWordArray(sMessage)
		Dim lMessageLength
		Dim lNumberOfWords
		Dim lWordArray()
		Dim lBytePosition
		Dim lByteCount
		Dim lWordCount
		Const MODULUS_BITS = 512
		Const CONGRUENT_BITS = 448
		lMessageLength = LenB(sMessage)
		lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)
		ReDim lWordArray(lNumberOfWords - 1)
		lBytePosition = 0
		lByteCount = 0
		Do Until lByteCount >= lMessageLength
			lWordCount = lByteCount \ BYTES_TO_A_WORD
			lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
			lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(AscB(MidB(sMessage, lByteCount + 1, 1)), lBytePosition)
			lByteCount = lByteCount + 1
		Loop
		lWordCount = lByteCount \ BYTES_TO_A_WORD
		lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE	
		lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)
		lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
		lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
		ConvertToWordArray = lWordArray
	End Function

	Private Function WordToHex(lValue)
		Dim lByte
		Dim lCount
		For lCount = 0 To 3
			lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)
			WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
		Next
	End Function

	Public Function MD5(sMessage)
		m_lOnBits(0) = CLng(1)
		m_lOnBits(1) = CLng(3)
		m_lOnBits(2) = CLng(7)
		m_lOnBits(3) = CLng(15)
		m_lOnBits(4) = CLng(31)
		m_lOnBits(5) = CLng(63)
		m_lOnBits(6) = CLng(127)
		m_lOnBits(7) = CLng(255)
		m_lOnBits(8) = CLng(511)
		m_lOnBits(9) = CLng(1023)
		m_lOnBits(10) = CLng(2047)
		m_lOnBits(11) = CLng(4095)
		m_lOnBits(12) = CLng(8191)
		m_lOnBits(13) = CLng(16383)
		m_lOnBits(14) = CLng(32767)
		m_lOnBits(15) = CLng(65535)
		m_lOnBits(16) = CLng(131071)
		m_lOnBits(17) = CLng(262143)
		m_lOnBits(18) = CLng(524287)
		m_lOnBits(19) = CLng(1048575)
		m_lOnBits(20) = CLng(2097151)
		m_lOnBits(21) = CLng(4194303)
		m_lOnBits(22) = CLng(8388607)
		m_lOnBits(23) = CLng(16777215)
		m_lOnBits(24) = CLng(33554431)
		m_lOnBits(25) = CLng(67108863)
		m_lOnBits(26) = CLng(134217727)
		m_lOnBits(27) = CLng(268435455)
		m_lOnBits(28) = CLng(536870911)
		m_lOnBits(29) = CLng(1073741823)
		m_lOnBits(30) = CLng(2147483647)
		m_l2Power(0) = CLng(1)
		m_l2Power(1) = CLng(2)
		m_l2Power(2) = CLng(4)
		m_l2Power(3) = CLng(8)
		m_l2Power(4) = CLng(16)
		m_l2Power(5) = CLng(32)
		m_l2Power(6) = CLng(64)
		m_l2Power(7) = CLng(128)
		m_l2Power(8) = CLng(256)
		m_l2Power(9) = CLng(512)
		m_l2Power(10) = CLng(1024)
		m_l2Power(11) = CLng(2048)
		m_l2Power(12) = CLng(4096)
		m_l2Power(13) = CLng(8192)
		m_l2Power(14) = CLng(16384)
		m_l2Power(15) = CLng(32768)
		m_l2Power(16) = CLng(65536)
		m_l2Power(17) = CLng(131072)
		m_l2Power(18) = CLng(262144)
		m_l2Power(19) = CLng(524288)
		m_l2Power(20) = CLng(1048576)
		m_l2Power(21) = CLng(2097152)
		m_l2Power(22) = CLng(4194304)
		m_l2Power(23) = CLng(8388608)
		m_l2Power(24) = CLng(16777216)
		m_l2Power(25) = CLng(33554432)
		m_l2Power(26) = CLng(67108864)
		m_l2Power(27) = CLng(134217728)
		m_l2Power(28) = CLng(268435456)
		m_l2Power(29) = CLng(536870912)
		m_l2Power(30) = CLng(1073741824)
		Dim x
		Dim k
		Dim AA
		Dim BB
		Dim CC
		Dim DD
		Dim a
		Dim b
		Dim c
		Dim d
		Const S11 = 7
		Const S12 = 12
		Const S13 = 17
		Const S14 = 22
		Const S21 = 5
		Const S22 = 9
		Const S23 = 14
		Const S24 = 20
		Const S31 = 4
		Const S32 = 11
		Const S33 = 16
		Const S34 = 23
		Const S41 = 6
		Const S42 = 10
		Const S43 = 15
		Const S44 = 21
		x = ConvertToWordArray(str2bin(sMessage))
		a = &H67452301
		b = &HEFCDAB89
		c = &H98BADCFE
		d = &H10325476
		For k = 0 To UBound(x) Step 16
			AA = a
			BB = b
			CC = c
			DD = d
			md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478
			md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756
			md5_FF c, d, a, b, x(k + 2), S13, &H242070DB
			md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
			md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
			md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A
			md5_FF c, d, a, b, x(k + 6), S13, &HA8304613
			md5_FF b, c, d, a, x(k + 7), S14, &HFD469501
			md5_FF a, b, c, d, x(k + 8), S11, &H698098D8
			md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
			md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
			md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE
			md5_FF a, b, c, d, x(k + 12), S11, &H6B901122
			md5_FF d, a, b, c, x(k + 13), S12, &HFD987193
			md5_FF c, d, a, b, x(k + 14), S13, &HA679438E
			md5_FF b, c, d, a, x(k + 15), S14, &H49B40821	
			md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562
			md5_GG d, a, b, c, x(k + 6), S22, &HC040B340
			md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51
			md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
			md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D
			md5_GG d, a, b, c, x(k + 10), S22, &H2441453
			md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681
			md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
			md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
			md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6
			md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87
			md5_GG b, c, d, a, x(k + 8), S24, &H455A14ED
			md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905
			md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
			md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9
			md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A
			md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942
			md5_HH d, a, b, c, x(k + 8), S32, &H8771F681
			md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122
			md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C
			md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
			md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
			md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
			md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
			md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6
			md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA
			md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085
			md5_HH b, c, d, a, x(k + 6), S34, &H4881D05
			md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039
			md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
			md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
			md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665
			md5_II a, b, c, d, x(k + 0), S41, &HF4292244
			md5_II d, a, b, c, x(k + 7), S42, &H432AFF97
			md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7
			md5_II b, c, d, a, x(k + 5), S44, &HFC93A039
			md5_II a, b, c, d, x(k + 12), S41, &H655B59C3
			md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92
			md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D
			md5_II b, c, d, a, x(k + 1), S44, &H85845DD1
			md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F
			md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
			md5_II c, d, a, b, x(k + 6), S43, &HA3014314
			md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1
			md5_II a, b, c, d, x(k + 4), S41, &HF7537E82
			md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235
			md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
			md5_II b, c, d, a, x(k + 9), S44, &HEB86D391
			a = AddUnsigned(a, AA)
			b = AddUnsigned(b, BB)
			c = AddUnsigned(c, CC)
			d = AddUnsigned(d, DD)
		Next
		MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
	End Function
End Class
%>
