Imports System.Net.NetworkInformation

Module Pub

    Structure s_Project
        Dim FileName As String
        Dim MakeTime As String
        Dim Desc As String
        Dim Opened As Boolean
        Dim UIVersion As String
        Dim LGVersino As String
        Dim Name As String
        Dim MaxUI As String
        Dim MaxLG As String
        Dim SFType As String    '//저장파일 형태
        Dim EditTime As String
        Dim Admin As Boolean    '//현재프로그램이 관리자 모드인가?
        Dim Password As String  '//해당프로젝트가 엄호로 보호되어있는가?
        Dim IsError As Boolean  '//로드시 에러가 발생하였는가?
        Dim CUrIP As String
        Dim CUrMac As String
        Dim LoginTime As String '//로그인시간
        Dim UserId As String
        Dim UserName As String
        Dim UserPass As String
        Dim UserIp As String
        Dim UserMac As String
        Dim UserAuthType As String
    End Structure

    Public Enum EProgram
        총량평가
        친환경평가
    End Enum

    Public Prj As New s_Project : Public StartVersion As String = "2010032000"
    Public Setting As arUtil.Setting
    Public Program As EProgram

    ' Public Uselov As Lov.ModLov
    Public PreFile(10) As String
    Public msgf As Frm_Work = Nothing   '201130830

    Public DSET1 As New DS   '//일반데이터
    Public DSET2 As New DS   '//일반데이터(임시)
    Public DSETR1 As New DSR    '//결과데이터(결과)
    Public DSETR2 As New DSR    '//결과데이터(임시)

    Public DataDir As New System.IO.DirectoryInfo(My.Application.Info.DirectoryPath)
    Public TemplateDir As New System.IO.DirectoryInfo(DataDir.FullName & "\template")

    '//eco2-od
    Public CalcO As CalculatorOD  '//계산로직이다.파일열릴떄 할당됨
    Public Result1o As New CResultOD()    '//기본데이터결과

    Public Log As New System.Text.StringBuilder

    Public EnDec As New ArinLogin.EnDec("tindevil.com")

    Public Sub NOTICE(ByVal MSG As String, ByVal Src As Windows.Forms.ToolStripStatusLabel, ByVal FCOLOR As Drawing.Color)
        If Not Src Is Nothing Then
            Src.Text = "▶ " & MSG & Space(1) & "[" & Format(Now, "HH시mm분ss초") & "]"
            Src.ForeColor = FCOLOR
        End If
        If FCOLOR = Drawing.Color.Red Then My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Beep)
    End Sub

    ''' <summary>
    ''' 인터넷에 연결되었는지를 체크합니다.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CheckInternet()
        Try

            Dim myping As New Ping()
            Dim host As String = "google.com"
            Dim buffer(31) As Byte
            Dim timeout As Integer = 1000
            Dim pingOpt As New PingOptions()
            Dim rep As PingReply = myping.Send(host, timeout, buffer, pingOpt)
            If rep.Status = IPStatus.Success Then
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            Return False
        End Try
    End Function

    Public Sub ClearfGridColWidth(grid As C1.Win.C1FlexGrid.C1FlexGrid)
        For i As Integer = 0 To grid.Cols.Count - 1
            If Not grid.Cols(i).Visible Then Continue For
            grid.Cols(i).Width = -1
        Next
    End Sub
    Public Sub SavefGridColWidth(fName As String, grid As C1.Win.C1FlexGrid.C1FlexGrid)
        Dim keyname As String = fName + "_" + grid.Name
        If Pub.Program = EProgram.친환경평가 Then
            keyname = fName + "_1_" + grid.Name
        End If
        For i As Integer = 0 To grid.Cols.Count - 1
            If Not grid.Cols(i).Visible Then Continue For
            If String.IsNullOrEmpty(grid.Cols(i).Name) Then Continue For
            Pub.Setting.Data(keyname, grid.Cols(i).Name) = grid.Cols(i).Width
        Next
    End Sub

    Public Sub ReadfGridColWidth(fName As String, grid As C1.Win.C1FlexGrid.C1FlexGrid)
        Dim keyname As String = fName + "_" + grid.Name
        If Pub.Program = EProgram.친환경평가 Then
            keyname = fName + "_1_" + grid.Name
        End If
        For i As Integer = 0 To grid.Cols.Count - 1
            If Not grid.Cols(i).Visible Then Continue For
            If String.IsNullOrEmpty(grid.Cols(i).Name) Then Continue For
            Dim wid As String = Pub.Setting.Data(keyname, grid.Cols(i).Name, "-1")
            grid.Cols(i).Width = Integer.Parse(wid)
        Next
    End Sub


    Public Function getColCaption(ByVal dt As DataTable) As String()
        Dim Clist(dt.Columns.Count - 1) As String
        For i As Integer = 1 To dt.Columns.Count
            If dt.Columns(i - 1).Caption.ToString <> "" Then Clist(i - 1) = dt.Columns(i - 1).Caption.ToString
        Next
        Return Clist
    End Function

    Public Function getColName(ByVal dt As DataTable) As String()
        Dim Clist(dt.Columns.Count - 1) As String
        For i As Integer = 1 To dt.Columns.Count
            If dt.Columns(i - 1).ColumnName.ToString <> "" Then Clist(i - 1) = dt.Columns(i - 1).ColumnName.ToString
        Next
        Return Clist
    End Function

    Public Function STB(ByVal src As String) As Byte()
        Return System.Text.Encoding.Default.GetBytes(src)
    End Function
    Public Function STB(ByVal src As Byte()) As String
        Return System.Text.Encoding.Default.GetString(src)
    End Function

    '''공용코드의코드반환
    Public Function Get_CCode(ByVal gubun As String, ByVal name As String) As String
        Dim DR() As DS.tbl_common_odRow = CType(DSET1.tbl_common_od.Select("gubun='" & gubun & "' and name='" & name & "'"), DS.tbl_common_odRow())
        If DR.GetUpperBound(0) = -1 Then Return ""
        Return DR(0).code
    End Function

    '''공용코드의이름반환
    Public Function Get_CName(ByVal gubun As String, ByVal code As String) As String
        Dim DR() As DS.tbl_common_odRow = CType(DSET1.tbl_common_od.Select("gubun='" & gubun & "' and code='" & code & "'"), DS.tbl_common_odRow())
        If DR.GetUpperBound(0) = -1 Then Return ""
        Return DR(0).name
    End Function

    Public Function NVL(ByVal src As Object, Optional ByVal DefVal As Object = "") As Object
        Try
            If src.ToString = "" Or src Is DBNull.Value Then
                Return DefVal
            Else
                Return src
            End If
        Catch ex As Exception
            Return DefVal
        End Try
    End Function


    Public Sub Read_CommonCode_OD(Optional ByVal Version As String = "")
        Work_msg("공용코드 확인중")
        If Version = "" Then
            Dim L As New ArinLogin.ArinLOgin
            Dim VersionInfo As ArinLogin.ArinLOgin.sVersionInfo = Nothing
            VersionInfo = L.Get_LastVersion("CO")   '//버젼을 가져오는데  eco 버젼만 가져오게 바꺼야겟죵 ^^ 구분자를 넣도록 합시닷!
            Version = VersionInfo.Ver
        End If

        Try
            Dim TaC As New DSTableAdapters.tbl_common_odTableAdapter
            TaC.Fill(DSET1.tbl_common_od)
            'DSET1.tbl_common_od.Clear()
            'DSET1.tbl_common_od.AcceptChanges()
            'DSET1.tbl_common_od.Merge(DSET1.tbl_common_od)
            'DSET1.tbl_common_od.Clear()
            DSET1.tbl_common_od.AcceptChanges()

            DSET1.tbl_Desc.Rows(0)("versionc") = Version
            DSET1.AcceptChanges()
        Catch ex As Exception
            MsgBox("공용코드 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
        End Try

        'MsgBox(Version)


        Work_msg("")
    End Sub

    Public Sub Read_Profile_OD(Optional ByVal Version As String = "")
        Work_msg("표준프로파일(OD) 확인중")
        If Version = "" Then
            Dim L As New ArinLogin.ArinLOgin
            Dim VersionInfo As ArinLogin.ArinLOgin.sVersionInfo = Nothing
            VersionInfo = L.Get_LastVersion("PO")   '//버젼을 가져오는데  eco 버젼만 가져오게 바꺼야겟죵 ^^ 구분자를 넣도록 합시닷!
            Version = VersionInfo.Ver
        End If
        Try
            Dim TaC As New DSTableAdapters.tbl_profile_odTableAdapter
            TaC.Fill(DSET1.tbl_profile_od)

            'DSET1.tbl_profile_od.Clear()
            'DSET1.tbl_profile_od.AcceptChanges()
            'DSET1.tbl_profile_od.Merge(DSET1.tbl_profile_od)
            'DSET1.tbl_profile_od.Clear()
            DSET1.tbl_profile_od.AcceptChanges()

            DSET1.tbl_Desc.Rows(0)("versionp") = Version
            DSET1.AcceptChanges()
        Catch ex As Exception
            MsgBox("표준프로파일(OD) 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
        End Try

        'MsgBox(Version)


        Work_msg("")
    End Sub

    Public Sub Read_WatherGroup()
        DSET1.weather_group.Clear()
        DSET1.weather_group.AcceptChanges()
        Try
            Dim TaC As New DSTableAdapters.weather_groupTableAdapter
            TaC.Fill(DSET1.weather_group)
        Catch ex As Exception
            MsgBox("기상데이터(그룹) 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
        End Try
    End Sub

    Public Sub Read_WeatherData_OD(Optional ByVal Version As String = "")
        Work_msg("기상데이터 확인중")
        Dim Iserror As Boolean = False
        If Version = "" Then
            Dim L As New ArinLogin.ArinLOgin
            Dim VersionInfo As ArinLogin.ArinLOgin.sVersionInfo = Nothing
            VersionInfo = L.Get_LastVersion("W")   '//버젼을 가져오는데  eco 버젼만 가져오게 바꺼야겟죵 ^^ 구분자를 넣도록 합시닷!
            Version = VersionInfo.Ver
        End If

        DSET1.tbl_weather_od.Clear()
        DSET1.weather_cha_od.Clear()
        DSET1.weather_ilsa_od.Clear()
        DSET1.weather_temp_od.Clear()
        DSET1.weather_supdo_od.Clear()

        DSET1.AcceptChanges()

        Try
            Dim TaC As New DSTableAdapters.tbl_weather_odTableAdapter
            TaC.Fill(DSET1.tbl_weather_od)
        Catch ex As Exception
            MsgBox("기상데이터0 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
            Iserror = True
        End Try
        Try
            Dim TaC As New DSTableAdapters.weather_cha_odTableAdapter
            TaC.Fill(DSET1.weather_cha_od)
        Catch ex As Exception
            MsgBox("기상데이터1 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
            Iserror = True
        End Try
        Try
            Dim TaC As New DSTableAdapters.weather_ilsa_odTableAdapter
            TaC.Fill(DSET1.weather_ilsa_od)
        Catch ex As Exception
            MsgBox("기상데이터2 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
            Iserror = True
        End Try
        Try
            Dim TaC As New DSTableAdapters.weather_supdo_odTableAdapter
            TaC.Fill(DSET1.weather_supdo_od)
        Catch ex As Exception
            MsgBox("기상데이터3 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
            Iserror = True
        End Try
        Try
            Dim TaC As New DSTableAdapters.weather_temp_odTableAdapter
            TaC.Fill(DSET1.weather_temp_od)
        Catch ex As Exception
            MsgBox("기상데이터4 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
            Iserror = True
        End Try

        'DSET1.tbl_weather.Merge(DSET1.tbl_weather_od)
        'DSET1.weather_cha.Merge(DSET1.weather_cha_od)
        'DSET1.weather_ilsa.Merge(DSET1.weather_ilsa_od)
        'DSET1.weather_temp.Merge(DSET1.weather_temp_od)
        'DSET1.weather_supdo.Merge(DSET1.weather_supdo_od)

        'DSET1.tbl_weather_od.Clear()
        'DSET1.weather_cha_od.Clear()
        'DSET1.weather_ilsa_od.Clear()
        'DSET1.weather_temp_od.Clear()
        'DSET1.weather_supdo_od.Clear()

        DSET1.AcceptChanges()

        If Iserror = False Then
            DSET1.tbl_Desc.Rows(0)("versionw") = Version
            'MsgBox(Version)
            DSET1.AcceptChanges()
        End If

        Work_msg("")
    End Sub


    Public Sub Read_ProfileData(Optional ByVal Version As String = "") '//2010.12.06 추가
        Work_msg("표준프로파일 확인중")
        If Version = "" Then
            Dim L As New ArinLogin.ArinLOgin
            Dim VersionInfo As ArinLogin.ArinLOgin.sVersionInfo = Nothing
            VersionInfo = L.Get_LastVersion("P2")   '//버젼을 가져오는데  eco 버젼만 가져오게 바꺼야겟죵 ^^ 구분자를 넣도록 합시닷!
            Version = VersionInfo.Ver
        End If
        Try
            Dim TaC As New DSTableAdapters.tbl_profile_odTableAdapter
            TaC.Fill(DSET1.tbl_profile_od)
            DSET1.tbl_Desc.Rows(0)("versionp") = Version
            DSET1.AcceptChanges()

            'TaC.Fill(DSET2.tbl_profile)
            'DSET2.tbl_Desc.Rows(0)("versionp") = Version
            DSET2.AcceptChanges()
        Catch ex As Exception
            MsgBox("표준프로파일 업데이트실패" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
        End Try

        'MsgBox(Version)


        Work_msg("")
    End Sub

    Public Function TOIT(ByVal obj As Object) As Integer
        If obj Is DBNull.Value Then
            Return 0
        ElseIf obj.ToString = "" Then
            Return 0
        Else
            If IsNumeric(obj) Then
                Return CInt(obj)
            Else
                ' MsgBox("[TOIT]숫자형식이 요구되지만 문자가 들어있습니다" & vbCrLf & obj.ToString, MsgBoxStyle.Critical, "확인")
                Throw New Exception("[TOIT]숫자형식이 요구되지만 문자가 들어있습니다" & vbCrLf & obj.ToString)
                '  Return 0
            End If

        End If
    End Function
    Public Function TOSG(T As String, ByVal obj As Object) As Decimal
        If obj Is DBNull.Value Then
            Return 0
        ElseIf obj.ToString = "" Then
            Return 0
        Else
            If IsNumeric(obj) Then
                Try
                    Return CDec(obj)
                Catch ex As Exception
                    MsgBox("[TOSG:" + T + "]에서 '" & obj & "'")
                    Throw New Exception("TOSG Error")
                    Return 0
                End Try
            Else
                'MsgBox( & vbCrLf & obj.ToString, MsgBoxStyle.Critical, "확인")
                Throw New Exception("[TOSG" + T + "]숫자형식이 요구되지만 문자(" + obj.ToString() + ")가 들어있습니다")
                'Return 0
            End If
        End If
    End Function
    Public Function TOSG(ByVal obj As Object) As Decimal
        If obj Is DBNull.Value Then
            Return 0
        ElseIf obj.ToString = "" Then
            Return 0
        Else
            If IsNumeric(obj) Then
                Try
                    Return CDec(obj)
                Catch ex As Exception
                    'MsgBox("[TOSG]에서 '" & obj & "'")
                    Throw New Exception("[TOSG]에서 '" & obj & "'")
                    Return 0
                End Try
            Else
                'MsgBox("[TOSG]숫자형식이 요구되지만 문자(" + obj.ToString() + ")가 들어있습니다" & vbCrLf & obj.ToString, MsgBoxStyle.Critical, "확인")
                Throw New Exception("[TOSG]숫자형식이 요구되지만 문자(" + obj.ToString() + ")가 들어있습니다" & vbCrLf & obj.ToString)
            End If
        End If
    End Function
    'Public Function TOSG(T,ByVal obj As Object, Optional tag As Integer = 0) As Decimal
    '    If obj Is DBNull.Value Then
    '        Return 0
    '    ElseIf obj.ToString = "" Then
    '        Return 0
    '    Else
    '        If IsNumeric(obj) Then
    '            Try
    '                Return CDec(obj)
    '            Catch ex As Exception
    '                MsgBox("[TOSG:" + tag.ToString() + "]에서 '" & obj & "'")
    '                Return 0
    '            End Try
    '        Else
    '            MsgBox("[TOSG" + tag.ToString() + "]숫자형식이 요구되지만 문자가 들어있습니다" & vbCrLf & obj.ToString, MsgBoxStyle.Critical, "확인")
    '            Return 0
    '        End If
    '    End If
    'End Function
    Public Function TOST(ByVal obj As Object) As String
        If obj Is DBNull.Value Then
            Return ""
        Else
            Return CStr(obj)
        End If
    End Function


    ''' <summary>
    ''' 데이터를 모두 되돌립니다.
    ''' </summary>
    ''' <param name="SrcDs"></param>
    ''' <param name="DisplayLabel"></param>
    ''' <remarks></remarks>
    Public Sub Data_Cancel(ByRef SrcDs As DataTable, Optional ByVal DisplayLabel As ToolStripStatusLabel = Nothing)
        Dim Change As Integer
        Try
            Change = SrcDs.GetChanges.Rows.Count
        Catch ex As Exception
            Change = 0
        End Try

        If Change > 0 Then
            If MsgBox("변경된 내용을 취소하시겠습니까?", CType(MsgBoxStyle.Critical + MsgBoxStyle.OkCancel, MsgBoxStyle), "확인") = MsgBoxResult.Ok Then
                SrcDs.RejectChanges()
                If Not DisplayLabel Is Nothing Then
                    NOTICE("변경된 내용이 취소되었습니다", DisplayLabel, Color.Red)
                Else
                    MsgBox("변경된 내용이 취소되었습니다", MsgBoxStyle.Information, "확인")
                End If
            Else
                If Not DisplayLabel Is Nothing Then NOTICE("취소되었습니다", DisplayLabel, Color.Blue)
            End If
        End If
        If Not DisplayLabel Is Nothing Then
            NOTICE("변경된 내용이 없습니다.", DisplayLabel, Color.Red)
        Else
            MsgBox("변경된 내용이 없습니다", MsgBoxStyle.Information, "확인")
        End If
    End Sub

    Public Function EndEdit(ByRef bs As BindingSource) As Boolean
        Try
            bs.EndEdit()
        Catch ex As System.Data.NoNullAllowedException
            MsgBox("반드시입력해야할 데이터가 없습니다" & vbCrLf & ex.Message, MsgBoxStyle.Critical, "입력오류")
            Return False
        Catch ex As Exception
            MsgBox(ex.Message.ToString, MsgBoxStyle.Critical, "처리되지않은 오류발생")
            Return False
        End Try
        Return True
    End Function

    Public Sub Check_Modify(ByRef DT As DataTable, Optional ByVal prompt As Boolean = True)
        Dim Cnt As Integer
        Try
            Cnt = DT.GetChanges.Rows.Count
        Catch ex As Exception
            Cnt = 0
        End Try

        If Cnt < 1 Then
            NOTICE("변경된 내용이 없습니다", Nothing, Color.Red)
            Return
        End If
        If prompt Then
            If MsgBox("변경된 데이터를 저장하시겠습니까?", CType(MsgBoxStyle.Information + MsgBoxStyle.OkCancel, MsgBoxStyle), "저장확인") <> MsgBoxResult.Ok Then Return
        End If
        Try
            DT.AcceptChanges()    '//Set All Green        
            NOTICE("저장완료", Nothing, Color.Blue)
            My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Exclamation)
        Catch ex As Exception
            MsgBox("데이터베이스 업데이트중 오류가 발생했습니다" & vbCrLf & vbCrLf & ex.ToString, MsgBoxStyle.Critical, "ERROR-")
            NOTICE("저장 실패!", Nothing, Color.Red)
        Finally
            'view1.ActiveSheet.GetDataView(True) '//화면을 갱신한다.
        End Try
    End Sub


    '//지정된개체내의 컨트롤의 값을 초기화한다.
    Public Sub Clear_Control(ByVal Ctl As Control)
        Ctl.Focus()
        For Each C As Control In Ctl.Controls
            MsgBox(C.GetType.ToString)
            If C.Controls.Count > 1 Then
                Clear_Control(C)
            Else
                If C.GetType.ToString.ToUpper.IndexOf("TEXTBOX") <> -1 OrElse _
                 C.GetType.ToString.ToUpper.IndexOf("MYTB") <> -1 OrElse _
                  C.GetType.ToString.ToUpper.IndexOf("NTB") <> -1 Then
                    If CType(C, TextBox).ReadOnly = False Then CType(C, TextBox).Text = ""
                ElseIf C.GetType.ToString.ToUpper.IndexOf("COMBOBOX") <> -1 OrElse _
                C.GetType.ToString.ToUpper.IndexOf("MYCMB") <> -1 Then
                    'MsgBox("cb")
                    CType(C, ComboBox).SelectedIndex = -1
                End If

            End If
        Next
    End Sub

    Public Sub Work_msg(Optional ByVal P_m As String = "잠시만 기다려주세요", Optional ByVal pbar As Boolean = False)
        If P_m = "" Then
            Frm_Work.Dispose()
        Else
            If Frm_Work.Visible = False Then Frm_Work.Visible = True
            If Frm_Work.ProgressBar1.Visible <> pbar Then Frm_Work.ProgressBar1.Visible = pbar
            Frm_Work.Label1.Text = P_m
            My.Application.DoEvents()
        End If
    End Sub


    '''화면에메세지를 표시할때사용한다.    
    Public Sub Work_msg_timer(Optional ByVal P_m As String = "잠시만 기다려주세요", Optional ByVal time As Short = 5)
        Frm_Warning.Left = CInt(MdiMain.Left + ((MdiMain.Width - Frm_Warning.Width) / 2))
        Frm_Warning.Top = CInt(MdiMain.Top + ((MdiMain.Height - Frm_Warning.Height) / 2))
        Frm_Warning.Term = time
        Frm_Warning.Second = time
        Frm_Warning.Label1.Text = P_m
        Frm_Warning.Timer1.Enabled = True
        Frm_Warning.Show()
        My.Application.DoEvents()
    End Sub

    Public Sub Work_plus()
        If Frm_Work.ProgressBar1.Visible = False Then Frm_Work.ProgressBar1.Visible = True
        Frm_Work.ProgressBar1.Value += 1
        My.Application.DoEvents()
    End Sub

    Public Sub INitRow(ByVal Ctl As Control.ControlCollection)
        For Each C As Control In Ctl
            If C.Controls.Count > 1 Then
                INitRow(C.Controls)
            Else
                If C.GetType.ToString.ToUpper.IndexOf("MYTB") <> -1 Then
                    If CType(C, MyTb).Text = "" Then CType(C, MyTb).Text = "0"
                ElseIf C.GetType.ToString.ToUpper.IndexOf("MYCMB") <> -1 Then
                    If CType(C, MyCmb).Text = "" AndAlso CType(C, MyCmb).Items.Count > 0 Then CType(C, MyCmb).SelectedIndex = 0
                End If
            End If
        Next
    End Sub

    Public Function DeCryptArea(ByRef data As Byte(), Optional ByVal pxorkey() As Byte = Nothing) As Byte()
        Dim out(data.Length - 1) As Byte
        Dim pos As Integer = 0


        '//처음4바이트확인해서 보낸다.
        Dim XorKey() As Byte
        If pxorkey Is Nothing Then   '//없으면 자동검출
            XorKey = New Byte() {data(0), data(1), data(2), data(3)}
        Else  '//있으면 그걸 사용한다.
            XorKey = New Byte() {pxorkey(0), pxorkey(1), pxorkey(2), pxorkey(3)}
        End If

        For i As Integer = 0 To data.Length - 1
            out(i) = EnCryptByte(data(i), i, XorKey)
        Next
        Return out
    End Function
    Public Function DeCryptByte(ByVal num As Byte, ByVal column As Integer, Optional ByVal a() As Byte = Nothing) As Byte
        If a Is Nothing Then a = New Byte() {&HAC, &H29, &H55, &H42}
        Dim mok As Integer = column Mod 4
        Return (num Xor a(mok))
    End Function
    Public Function EnctryArea(ByRef data As Byte()) As Byte()
        Dim out(data.Length - 1) As Byte

        For i As Integer = 0 To data.Length - 1
            Dim b As Byte = EnCryptByte(data(i), i)
            out(i) = b
        Next
        Return out
    End Function

    Public Function EnCryptByte(ByVal num As Byte, ByVal column As Integer, Optional ByVal a() As Byte = Nothing) As Byte
        If a Is Nothing Then a = New Byte() {&HAC, &H29, &H55, &H42}
        Dim mok As Integer = column Mod 4

        Return (num Xor a(mok))
    End Function
End Module
