///
/// This file is part of ILNumerics Community Edition.
///
/// ILNumerics Community Edition - high performance computing for applications.
/// Copyright (C) 2006 - 2012 Haymo Kutschbach, http://ilnumerics.net
///
/// ILNumerics Community Edition is free software: you can redistribute it and/or modify
/// it under the terms of the GNU General Public License version 3 as published by
/// the Free Software Foundation.
///
/// ILNumerics Community Edition is distributed in the hope that it will be useful,
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
/// GNU General Public License for more details.
///
/// You should have received a copy of the GNU General Public License
/// along with ILNumerics Community Edition. See the file License.txt in the root
/// of your distribution package. If not, see .
///
/// In addition this software uses the following components and/or licenses:
///
/// =================================================================================
/// The Open Toolkit Library License
///
/// Copyright (c) 2006 - 2009 the Open Toolkit library.
///
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the "Software"), to deal
/// in the Software without restriction, including without limitation the rights to
/// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
/// the Software, and to permit persons to whom the Software is furnished to do
/// so, subject to the following conditions:
///
/// The above copyright notice and this permission notice shall be included in all
/// copies or substantial portions of the Software.
///
/// =================================================================================
///
using System;
using System.Collections.Generic;
using System.Text;
using ILNumerics;
using ILNumerics.Exceptions;
using ILNumerics.Storage;
using ILNumerics.Misc;
namespace ILNumerics {
public partial class ILMath {
#region HYCALPER AUTO GENERATED CODE
/// Arctangent of array elements
/// Input array
/// Arctangent of array elements
/// If the input array is empty, an empty array will be returned.
/// The array returned will be a dense array.
public unsafe static ILRetArray atan (ILInArray< complex > A) {
using (ILScope.Enter(A)) {
if (A.IsEmpty)
return new ILRetArray(A.Size);
ILSize inDim = A.Size;
complex[] arrA = A.GetArrayForRead();
complex [] retArr;
int outLen = inDim.NumberOfElements;
bool inplace = true;
if (!A.TryGetStorage4InplaceOp(out retArr)) {
retArr = ILMemoryPool.Pool.New(outLen);
inplace = false;
}
int i = 0, workItemCount = Settings.s_maxNumberThreads, workItemLength, workerCount = 1;
if (Settings.s_maxNumberThreads > 1 && outLen / 2 > Settings.s_minParallelElement1Count) {
if (outLen / workItemCount > Settings.s_minParallelElement1Count) {
workItemLength = outLen / workItemCount;
//workItemLength = (int)((double)outLen / workItemCount * 1.05);
} else {
workItemLength = outLen / 2;
workItemCount = 2;
}
} else {
workItemLength = outLen;
workItemCount = 1;
}
ILDenseStorage retStorage = new ILDenseStorage(retArr, inDim);
Action worker = data => {
Tuple range = (Tuple)data;
complex* cp = ((complex*)range.Item4 + range.Item1);
int len = range.Item2;
if (range.Item5) {
// inplace
while (len > 20) {
cp[0] = complex.Atan(cp[0] ) /*dummy*/;
cp[1] = complex.Atan(cp[1] ) /*dummy*/;
cp[2] = complex.Atan(cp[2] ) /*dummy*/;
cp[3] = complex.Atan(cp[3] ) /*dummy*/;
cp[4] = complex.Atan(cp[4] ) /*dummy*/;
cp[5] = complex.Atan(cp[5] ) /*dummy*/;
cp[6] = complex.Atan(cp[6] ) /*dummy*/;
cp[7] = complex.Atan(cp[7] ) /*dummy*/;
cp[8] = complex.Atan(cp[8] ) /*dummy*/;
cp[9] = complex.Atan(cp[9] ) /*dummy*/;
cp[10] = complex.Atan(cp[10] ) /*dummy*/;
cp[11] = complex.Atan(cp[11] ) /*dummy*/;
cp[12] = complex.Atan(cp[12] ) /*dummy*/;
cp[13] = complex.Atan(cp[13] ) /*dummy*/;
cp[14] = complex.Atan(cp[14] ) /*dummy*/;
cp[15] = complex.Atan(cp[15] ) /*dummy*/;
cp[16] = complex.Atan(cp[16] ) /*dummy*/;
cp[17] = complex.Atan(cp[17] ) /*dummy*/;
cp[18] = complex.Atan(cp[18] ) /*dummy*/;
cp[19] = complex.Atan(cp[19] ) /*dummy*/;
cp[20] = complex.Atan(cp[20] ) /*dummy*/;
cp+=21; len -= 21;
}
while (len-- > 0) {
*cp = complex.Atan(*cp ) /*dummy*/;
cp++;
}
} else {
complex* ap = ((complex*)range.Item3 + range.Item1);
while (len > 20) {
cp[0] = complex.Atan(ap[0] ) /*dummy*/;
cp[1] = complex.Atan(ap[1] ) /*dummy*/;
cp[2] = complex.Atan(ap[2] ) /*dummy*/;
cp[3] = complex.Atan(ap[3] ) /*dummy*/;
cp[4] = complex.Atan(ap[4] ) /*dummy*/;
cp[5] = complex.Atan(ap[5] ) /*dummy*/;
cp[6] = complex.Atan(ap[6] ) /*dummy*/;
cp[7] = complex.Atan(ap[7] ) /*dummy*/;
cp[8] = complex.Atan(ap[8] ) /*dummy*/;
cp[9] = complex.Atan(ap[9] ) /*dummy*/;
cp[10] = complex.Atan(ap[10] ) /*dummy*/;
cp[11] = complex.Atan(ap[11] ) /*dummy*/;
cp[12] = complex.Atan(ap[12] ) /*dummy*/;
cp[13] = complex.Atan(ap[13] ) /*dummy*/;
cp[14] = complex.Atan(ap[14] ) /*dummy*/;
cp[15] = complex.Atan(ap[15] ) /*dummy*/;
cp[16] = complex.Atan(ap[16] ) /*dummy*/;
cp[17] = complex.Atan(ap[17] ) /*dummy*/;
cp[18] = complex.Atan(ap[18] ) /*dummy*/;
cp[19] = complex.Atan(ap[19] ) /*dummy*/;
cp[20] = complex.Atan(ap[20] ) /*dummy*/;
ap += 21;
cp += 21;
len -= 21;
}
while (len-- > 0) {
*cp = complex.Atan(*ap ) /*dummy*/;
ap++;
cp++;
}
}
System.Threading.Interlocked.Decrement(ref workerCount);
};
fixed ( complex* arrAP = arrA)
fixed ( complex* retArrP = retArr) {
for (; i < workItemCount - 1; i++) {
Tuple range
= new Tuple
(i * workItemLength, workItemLength, (IntPtr)arrAP, (IntPtr)retArrP, inplace);
System.Threading.Interlocked.Increment(ref workerCount);
ILThreadPool.QueueUserWorkItem(i,worker, range);
}
// the last (or may the only) chunk is done right here
worker(new Tuple
(i * workItemLength, outLen - i * workItemLength, (IntPtr)arrAP, (IntPtr)retArrP, inplace));
ILThreadPool.Wait4Workers(ref workerCount);
}
return new ILRetArray(retStorage);
}
}
/// Arctangent of array elements
/// Input array
/// Arctangent of array elements
/// If the input array is empty, an empty array will be returned.
/// The array returned will be a dense array.
public unsafe static ILRetArray atan (ILInArray< fcomplex > A) {
using (ILScope.Enter(A)) {
if (A.IsEmpty)
return new ILRetArray(A.Size);
ILSize inDim = A.Size;
fcomplex[] arrA = A.GetArrayForRead();
fcomplex [] retArr;
int outLen = inDim.NumberOfElements;
bool inplace = true;
if (!A.TryGetStorage4InplaceOp(out retArr)) {
retArr = ILMemoryPool.Pool.New(outLen);
inplace = false;
}
int i = 0, workItemCount = Settings.s_maxNumberThreads, workItemLength, workerCount = 1;
if (Settings.s_maxNumberThreads > 1 && outLen / 2 > Settings.s_minParallelElement1Count) {
if (outLen / workItemCount > Settings.s_minParallelElement1Count) {
workItemLength = outLen / workItemCount;
//workItemLength = (int)((double)outLen / workItemCount * 1.05);
} else {
workItemLength = outLen / 2;
workItemCount = 2;
}
} else {
workItemLength = outLen;
workItemCount = 1;
}
ILDenseStorage retStorage = new ILDenseStorage(retArr, inDim);
Action worker = data => {
Tuple range = (Tuple)data;
fcomplex* cp = ((fcomplex*)range.Item4 + range.Item1);
int len = range.Item2;
if (range.Item5) {
// inplace
while (len > 20) {
cp[0] = fcomplex.Atan(cp[0] ) /*dummy*/;
cp[1] = fcomplex.Atan(cp[1] ) /*dummy*/;
cp[2] = fcomplex.Atan(cp[2] ) /*dummy*/;
cp[3] = fcomplex.Atan(cp[3] ) /*dummy*/;
cp[4] = fcomplex.Atan(cp[4] ) /*dummy*/;
cp[5] = fcomplex.Atan(cp[5] ) /*dummy*/;
cp[6] = fcomplex.Atan(cp[6] ) /*dummy*/;
cp[7] = fcomplex.Atan(cp[7] ) /*dummy*/;
cp[8] = fcomplex.Atan(cp[8] ) /*dummy*/;
cp[9] = fcomplex.Atan(cp[9] ) /*dummy*/;
cp[10] = fcomplex.Atan(cp[10] ) /*dummy*/;
cp[11] = fcomplex.Atan(cp[11] ) /*dummy*/;
cp[12] = fcomplex.Atan(cp[12] ) /*dummy*/;
cp[13] = fcomplex.Atan(cp[13] ) /*dummy*/;
cp[14] = fcomplex.Atan(cp[14] ) /*dummy*/;
cp[15] = fcomplex.Atan(cp[15] ) /*dummy*/;
cp[16] = fcomplex.Atan(cp[16] ) /*dummy*/;
cp[17] = fcomplex.Atan(cp[17] ) /*dummy*/;
cp[18] = fcomplex.Atan(cp[18] ) /*dummy*/;
cp[19] = fcomplex.Atan(cp[19] ) /*dummy*/;
cp[20] = fcomplex.Atan(cp[20] ) /*dummy*/;
cp+=21; len -= 21;
}
while (len-- > 0) {
*cp = fcomplex.Atan(*cp ) /*dummy*/;
cp++;
}
} else {
fcomplex* ap = ((fcomplex*)range.Item3 + range.Item1);
while (len > 20) {
cp[0] = fcomplex.Atan(ap[0] ) /*dummy*/;
cp[1] = fcomplex.Atan(ap[1] ) /*dummy*/;
cp[2] = fcomplex.Atan(ap[2] ) /*dummy*/;
cp[3] = fcomplex.Atan(ap[3] ) /*dummy*/;
cp[4] = fcomplex.Atan(ap[4] ) /*dummy*/;
cp[5] = fcomplex.Atan(ap[5] ) /*dummy*/;
cp[6] = fcomplex.Atan(ap[6] ) /*dummy*/;
cp[7] = fcomplex.Atan(ap[7] ) /*dummy*/;
cp[8] = fcomplex.Atan(ap[8] ) /*dummy*/;
cp[9] = fcomplex.Atan(ap[9] ) /*dummy*/;
cp[10] = fcomplex.Atan(ap[10] ) /*dummy*/;
cp[11] = fcomplex.Atan(ap[11] ) /*dummy*/;
cp[12] = fcomplex.Atan(ap[12] ) /*dummy*/;
cp[13] = fcomplex.Atan(ap[13] ) /*dummy*/;
cp[14] = fcomplex.Atan(ap[14] ) /*dummy*/;
cp[15] = fcomplex.Atan(ap[15] ) /*dummy*/;
cp[16] = fcomplex.Atan(ap[16] ) /*dummy*/;
cp[17] = fcomplex.Atan(ap[17] ) /*dummy*/;
cp[18] = fcomplex.Atan(ap[18] ) /*dummy*/;
cp[19] = fcomplex.Atan(ap[19] ) /*dummy*/;
cp[20] = fcomplex.Atan(ap[20] ) /*dummy*/;
ap += 21;
cp += 21;
len -= 21;
}
while (len-- > 0) {
*cp = fcomplex.Atan(*ap ) /*dummy*/;
ap++;
cp++;
}
}
System.Threading.Interlocked.Decrement(ref workerCount);
};
fixed ( fcomplex* arrAP = arrA)
fixed ( fcomplex* retArrP = retArr) {
for (; i < workItemCount - 1; i++) {
Tuple range
= new Tuple
(i * workItemLength, workItemLength, (IntPtr)arrAP, (IntPtr)retArrP, inplace);
System.Threading.Interlocked.Increment(ref workerCount);
ILThreadPool.QueueUserWorkItem(i,worker, range);
}
// the last (or may the only) chunk is done right here
worker(new Tuple
(i * workItemLength, outLen - i * workItemLength, (IntPtr)arrAP, (IntPtr)retArrP, inplace));
ILThreadPool.Wait4Workers(ref workerCount);
}
return new ILRetArray(retStorage);
}
}
/// Arctangent of array elements
/// Input array
/// Arctangent of array elements
/// If the input array is empty, an empty array will be returned.
/// The array returned will be a dense array.
public unsafe static ILRetArray atan (ILInArray< float > A) {
using (ILScope.Enter(A)) {
if (A.IsEmpty)
return new ILRetArray(A.Size);
ILSize inDim = A.Size;
float[] arrA = A.GetArrayForRead();
float [] retArr;
int outLen = inDim.NumberOfElements;
bool inplace = true;
if (!A.TryGetStorage4InplaceOp(out retArr)) {
retArr = ILMemoryPool.Pool.New(outLen);
inplace = false;
}
int i = 0, workItemCount = Settings.s_maxNumberThreads, workItemLength, workerCount = 1;
if (Settings.s_maxNumberThreads > 1 && outLen / 2 > Settings.s_minParallelElement1Count) {
if (outLen / workItemCount > Settings.s_minParallelElement1Count) {
workItemLength = outLen / workItemCount;
//workItemLength = (int)((double)outLen / workItemCount * 1.05);
} else {
workItemLength = outLen / 2;
workItemCount = 2;
}
} else {
workItemLength = outLen;
workItemCount = 1;
}
ILDenseStorage retStorage = new ILDenseStorage(retArr, inDim);
Action worker = data => {
Tuple range = (Tuple)data;
float* cp = ((float*)range.Item4 + range.Item1);
int len = range.Item2;
if (range.Item5) {
// inplace
while (len > 20) {
cp[0] = (float)Math.Atan(cp[0] ) /*dummy*/;
cp[1] = (float)Math.Atan(cp[1] ) /*dummy*/;
cp[2] = (float)Math.Atan(cp[2] ) /*dummy*/;
cp[3] = (float)Math.Atan(cp[3] ) /*dummy*/;
cp[4] = (float)Math.Atan(cp[4] ) /*dummy*/;
cp[5] = (float)Math.Atan(cp[5] ) /*dummy*/;
cp[6] = (float)Math.Atan(cp[6] ) /*dummy*/;
cp[7] = (float)Math.Atan(cp[7] ) /*dummy*/;
cp[8] = (float)Math.Atan(cp[8] ) /*dummy*/;
cp[9] = (float)Math.Atan(cp[9] ) /*dummy*/;
cp[10] = (float)Math.Atan(cp[10] ) /*dummy*/;
cp[11] = (float)Math.Atan(cp[11] ) /*dummy*/;
cp[12] = (float)Math.Atan(cp[12] ) /*dummy*/;
cp[13] = (float)Math.Atan(cp[13] ) /*dummy*/;
cp[14] = (float)Math.Atan(cp[14] ) /*dummy*/;
cp[15] = (float)Math.Atan(cp[15] ) /*dummy*/;
cp[16] = (float)Math.Atan(cp[16] ) /*dummy*/;
cp[17] = (float)Math.Atan(cp[17] ) /*dummy*/;
cp[18] = (float)Math.Atan(cp[18] ) /*dummy*/;
cp[19] = (float)Math.Atan(cp[19] ) /*dummy*/;
cp[20] = (float)Math.Atan(cp[20] ) /*dummy*/;
cp+=21; len -= 21;
}
while (len-- > 0) {
*cp = (float)Math.Atan(*cp ) /*dummy*/;
cp++;
}
} else {
float* ap = ((float*)range.Item3 + range.Item1);
while (len > 20) {
cp[0] = (float)Math.Atan(ap[0] ) /*dummy*/;
cp[1] = (float)Math.Atan(ap[1] ) /*dummy*/;
cp[2] = (float)Math.Atan(ap[2] ) /*dummy*/;
cp[3] = (float)Math.Atan(ap[3] ) /*dummy*/;
cp[4] = (float)Math.Atan(ap[4] ) /*dummy*/;
cp[5] = (float)Math.Atan(ap[5] ) /*dummy*/;
cp[6] = (float)Math.Atan(ap[6] ) /*dummy*/;
cp[7] = (float)Math.Atan(ap[7] ) /*dummy*/;
cp[8] = (float)Math.Atan(ap[8] ) /*dummy*/;
cp[9] = (float)Math.Atan(ap[9] ) /*dummy*/;
cp[10] = (float)Math.Atan(ap[10] ) /*dummy*/;
cp[11] = (float)Math.Atan(ap[11] ) /*dummy*/;
cp[12] = (float)Math.Atan(ap[12] ) /*dummy*/;
cp[13] = (float)Math.Atan(ap[13] ) /*dummy*/;
cp[14] = (float)Math.Atan(ap[14] ) /*dummy*/;
cp[15] = (float)Math.Atan(ap[15] ) /*dummy*/;
cp[16] = (float)Math.Atan(ap[16] ) /*dummy*/;
cp[17] = (float)Math.Atan(ap[17] ) /*dummy*/;
cp[18] = (float)Math.Atan(ap[18] ) /*dummy*/;
cp[19] = (float)Math.Atan(ap[19] ) /*dummy*/;
cp[20] = (float)Math.Atan(ap[20] ) /*dummy*/;
ap += 21;
cp += 21;
len -= 21;
}
while (len-- > 0) {
*cp = (float)Math.Atan(*ap ) /*dummy*/;
ap++;
cp++;
}
}
System.Threading.Interlocked.Decrement(ref workerCount);
};
fixed ( float* arrAP = arrA)
fixed ( float* retArrP = retArr) {
for (; i < workItemCount - 1; i++) {
Tuple range
= new Tuple
(i * workItemLength, workItemLength, (IntPtr)arrAP, (IntPtr)retArrP, inplace);
System.Threading.Interlocked.Increment(ref workerCount);
ILThreadPool.QueueUserWorkItem(i,worker, range);
}
// the last (or may the only) chunk is done right here
worker(new Tuple
(i * workItemLength, outLen - i * workItemLength, (IntPtr)arrAP, (IntPtr)retArrP, inplace));
ILThreadPool.Wait4Workers(ref workerCount);
}
return new ILRetArray(retStorage);
}
}
/// Arctangent of array elements
/// Input array
/// Arctangent of array elements
/// If the input array is empty, an empty array will be returned.
/// The array returned will be a dense array.
public unsafe static ILRetArray atan (ILInArray< double > A) {
using (ILScope.Enter(A)) {
if (A.IsEmpty)
return new ILRetArray(A.Size);
ILSize inDim = A.Size;
double[] arrA = A.GetArrayForRead();
double [] retArr;
int outLen = inDim.NumberOfElements;
bool inplace = true;
if (!A.TryGetStorage4InplaceOp(out retArr)) {
retArr = ILMemoryPool.Pool.New(outLen);
inplace = false;
}
int i = 0, workItemCount = Settings.s_maxNumberThreads, workItemLength, workerCount = 1;
if (Settings.s_maxNumberThreads > 1 && outLen / 2 > Settings.s_minParallelElement1Count) {
if (outLen / workItemCount > Settings.s_minParallelElement1Count) {
workItemLength = outLen / workItemCount;
//workItemLength = (int)((double)outLen / workItemCount * 1.05);
} else {
workItemLength = outLen / 2;
workItemCount = 2;
}
} else {
workItemLength = outLen;
workItemCount = 1;
}
ILDenseStorage retStorage = new ILDenseStorage(retArr, inDim);
Action worker = data => {
Tuple range = (Tuple)data;
double* cp = ((double*)range.Item4 + range.Item1);
int len = range.Item2;
if (range.Item5) {
// inplace
while (len > 20) {
cp[0] = Math.Atan(cp[0] ) /*dummy*/;
cp[1] = Math.Atan(cp[1] ) /*dummy*/;
cp[2] = Math.Atan(cp[2] ) /*dummy*/;
cp[3] = Math.Atan(cp[3] ) /*dummy*/;
cp[4] = Math.Atan(cp[4] ) /*dummy*/;
cp[5] = Math.Atan(cp[5] ) /*dummy*/;
cp[6] = Math.Atan(cp[6] ) /*dummy*/;
cp[7] = Math.Atan(cp[7] ) /*dummy*/;
cp[8] = Math.Atan(cp[8] ) /*dummy*/;
cp[9] = Math.Atan(cp[9] ) /*dummy*/;
cp[10] = Math.Atan(cp[10] ) /*dummy*/;
cp[11] = Math.Atan(cp[11] ) /*dummy*/;
cp[12] = Math.Atan(cp[12] ) /*dummy*/;
cp[13] = Math.Atan(cp[13] ) /*dummy*/;
cp[14] = Math.Atan(cp[14] ) /*dummy*/;
cp[15] = Math.Atan(cp[15] ) /*dummy*/;
cp[16] = Math.Atan(cp[16] ) /*dummy*/;
cp[17] = Math.Atan(cp[17] ) /*dummy*/;
cp[18] = Math.Atan(cp[18] ) /*dummy*/;
cp[19] = Math.Atan(cp[19] ) /*dummy*/;
cp[20] = Math.Atan(cp[20] ) /*dummy*/;
cp+=21; len -= 21;
}
while (len-- > 0) {
*cp = Math.Atan(*cp ) /*dummy*/;
cp++;
}
} else {
double* ap = ((double*)range.Item3 + range.Item1);
while (len > 20) {
cp[0] = Math.Atan(ap[0] ) /*dummy*/;
cp[1] = Math.Atan(ap[1] ) /*dummy*/;
cp[2] = Math.Atan(ap[2] ) /*dummy*/;
cp[3] = Math.Atan(ap[3] ) /*dummy*/;
cp[4] = Math.Atan(ap[4] ) /*dummy*/;
cp[5] = Math.Atan(ap[5] ) /*dummy*/;
cp[6] = Math.Atan(ap[6] ) /*dummy*/;
cp[7] = Math.Atan(ap[7] ) /*dummy*/;
cp[8] = Math.Atan(ap[8] ) /*dummy*/;
cp[9] = Math.Atan(ap[9] ) /*dummy*/;
cp[10] = Math.Atan(ap[10] ) /*dummy*/;
cp[11] = Math.Atan(ap[11] ) /*dummy*/;
cp[12] = Math.Atan(ap[12] ) /*dummy*/;
cp[13] = Math.Atan(ap[13] ) /*dummy*/;
cp[14] = Math.Atan(ap[14] ) /*dummy*/;
cp[15] = Math.Atan(ap[15] ) /*dummy*/;
cp[16] = Math.Atan(ap[16] ) /*dummy*/;
cp[17] = Math.Atan(ap[17] ) /*dummy*/;
cp[18] = Math.Atan(ap[18] ) /*dummy*/;
cp[19] = Math.Atan(ap[19] ) /*dummy*/;
cp[20] = Math.Atan(ap[20] ) /*dummy*/;
ap += 21;
cp += 21;
len -= 21;
}
while (len-- > 0) {
*cp = Math.Atan(*ap ) /*dummy*/;
ap++;
cp++;
}
}
System.Threading.Interlocked.Decrement(ref workerCount);
};
fixed ( double* arrAP = arrA)
fixed ( double* retArrP = retArr) {
for (; i < workItemCount - 1; i++) {
Tuple range
= new Tuple
(i * workItemLength, workItemLength, (IntPtr)arrAP, (IntPtr)retArrP, inplace);
System.Threading.Interlocked.Increment(ref workerCount);
ILThreadPool.QueueUserWorkItem(i,worker, range);
}
// the last (or may the only) chunk is done right here
worker(new Tuple
(i * workItemLength, outLen - i * workItemLength, (IntPtr)arrAP, (IntPtr)retArrP, inplace));
ILThreadPool.Wait4Workers(ref workerCount);
}
return new ILRetArray(retStorage);
}
}
#endregion HYCALPER AUTO GENERATED CODE
}
}