KEEP K.I.S.S.

tk's blog

NDK实例

tk posted @ Apr 12, 2016 11:32:46 PM in C with tags NDK , 1374 阅读

本文通过编写一个算法类二进制库以及示例App应用来介绍NDK开发,重点是二进制库编写、编译以及自定义参数的传递。

1. Java层接口定义

在做so库之前,需要首先设计约定库的接口,包括实现哪些功能,具体函数以及接口参数等等,这也是Java层调用所使用的接口。

在这个例子中,我们准备实现一个算法库,其中实现2个函数,一个返回算法库版本号,另一个计算线段中点坐标,主要用来展示so库编写以及参数传递过程。如果有需要其他的接口实现,可以参照这两个函数来做。

要实现的接口文件 com/zhdgps/ts/TSMath.java,其中 tsmath 是要实现的so库名字。

package com.zhdgps.ts;

public class TSMath {
    static {
        System.loadLibrary("tsmath");
    }

    /* 获取版本信息 */
    public static native String getVersion();
    /* 计算两点连线中心点 */
    public static native TSCoord calcCenter(TSCoord a, TSCoord b);
}

System.loadLibrary 用来加载so库,static 表示这段代码要最先运行。

接口函数用 native 关键字修饰表明这是源生方法实现而不是 java 代码实现(JNI),在这里就是指在so库中实现的方法。

同时辅助用的 TSCoord 定义文件 com/zhdgps/ts/TSCoord.java

package com.zhdgps.ts;

public class TSCoord {
    public double N;
    public double E;
    public double Z;
}

两个文件都放属于包 com.zhdgps.ts

2. so库C代码实现和编译

完成库接口设计后,下面介绍如何用C来实现接口对应的功能。

新建文件夹 tsmath,用于存放 so 库工程。在 tsmath 下新建子文件夹 jni (命名为jni 是 NDK 编译的需要)用于存放 so 库的源文件。

jni 文件夹下新建文件 tsmath.htsmath.calgorithm.halgorithm.cAndroid.mk 以及 Application.mk 文件。

其中,tsmath.htsmath.c 是 so 库的实现文件,algorithm.halgorithm.c 是实际算法实现,相对来说 tsmath.c 是 JNI 接口层,而 algorithm.c 则是实际的算法C代码。这样区分有助于代码逻辑分层,当然都写在 tsmath.c 中也是可行的。

Android.mkApplication.mk 是用于编译so库所需要的 ndk-build 脚本文件,后面会进行详细叙述。

2.1 算法实现(Algorithm

Algorithm.h 文件内容:

#ifndef TS_ALGORITHM_H
#define TS_ALGORITHM_H

#ifdef __cplusplus
extern "C" {
#endif

typedef struct _TSCoord {
    double N;
    double E;
    double Z;
}TSCoord;

enum TSAlgo_ErrorCode {
    TSALGO_NOERROR,
};

int TSAlgo_CalcCenter(const TSCoord *a, const TSCoord *b, TSCoord *result);

#ifdef __cplusplus
}
#endif

#endif

头文件主要声明了一个计算中点的函数以及参数结构体类型,实现文件 Algorithm.c 内容如下:

#include "algorithm.h"

int TSAlgo_CalcCenter(const TSCoord *a, const TSCoord *b, TSCoord *result)
{
    result->N = (a->N + b->N) / 2;
    result->E = (a->E + b->E) / 2;
    result->Z = (a->Z + b->Z) / 2;

    return TSALGO_NOERROR;
}

如果有其他要实现的算法,都可以在这个模块内实现。此模块将被 JNI 接口层调用。

2.2 JNI 接口实现

JNI 接口部分是 so 库的核心,用于在 Java 调用和实际的 C/C++ 调用之间充当中间层。JNI 的实现有两种方法,一种是静态注册,一种是动态注册。

静态注册是指用 javah 工具来生成 C/C++ 头文件,获得正确的函数名。在运行时 JNI 按照指定规则的函数命名来调用对应的 C 函数。

动态注册是指在动态库模块被加载的时候,模块注册的函数功能到 JVM 中。在对应函数被调用时,JVM会按照指定的注册函数名去调用实际的函数。

静态注册生成的函数命名很长,而且如果要修改函数名,那么就要重新修改编译。静态注册的模块只有在被调用时才会被查找检查,如果函数命名有问题,会直接运行异常。

动态注册在向 JVM 注册函数时,可以指定函数名,在编写时可以使用自定义的函数命名,如果需要修改维护,则只需要修改注册时的命名即可。

NDK 推荐使用动态注册,在模块中定义 JNI_OnLoad 函数,此函数在模块被加载时(即System.loadLibrary)被调用,模块在此函数中注册所有函数。

综上,我们要在模块中实现3个主要函数:

/* 动态库加载时候被调用的方法,进行初始化并注册模块函数 */
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved);
/* 对应 TSMath.getVersion */
JNIEXPORT jstring JNICALL native_get_version(JNIEnv *env, jobject thiz);
/* 对应 TSMath.calcCenter */
JNIEXPORT jobject JNICALL native_calc_center(JNIEnv *env, jobject thiz, jobject coorda, jobject coordb);

native_get_versionnative_calc_centerTSMath 的 JNI 实现,函数参数和返回值也与之对应,每个函数的前两个参数 JNIEnv *jobject 是 JNI 函数固定传入的参数。jstring 对应 Java 的 String,而自定义类对象均用 jobject 来对应,完整的 JNI 类型匹配可以参见 Primitive Types.

要实现动态注册,我们需要编写注册方法:

/* ------------------------------------------------------------- */
/* 方法注册资源表 */
static JNINativeMethod native_methods[] = {
    {"getVersion", "()Ljava/lang/String;", (void *)native_get_version},
    {"calcCenter", "(Lcom/zhdgps/ts/TSCoord;Lcom/zhdgps/ts/TSCoord;)Lcom/zhdgps/ts/TSCoord;", (void *)native_calc_center},
};
#define NATIVE_METHODS_COUNT (sizeof(native_methods)/sizeof(native_methods[0]))

/* 为某一个类注册方法 */
static int register_navtive_methods(JNIEnv *env,
                                    const char *classname,
                                    JNINativeMethod *methods,
                                    int methods_num)
{
    jclass clazz;
    clazz = (*env)->FindClass(env, classname);
    if(clazz == NULL) {
        return JNI_FALSE;
    }

    if((*env)->RegisterNatives(env, clazz, methods, methods_num) < 0) {
        return JNI_FALSE;
    }

    return JNI_TRUE;
}

/* 为所有类注册本地方法 */
static int register_natives(JNIEnv *env)
{
    /* 指定要注册的类名 */
    const char *classname = "com/zhdgps/ts/TSMath";
    return register_navtive_methods(env, classname, native_methods, NATIVE_METHODS_COUNT);
}

JNINativeMethod 是在 <jni.h> 中定义的结构体,用于存储要动态注册的函数信息。第一个成员是字符串,用以表示要注册的函数所使用的函数名。第二个成员是字符串,用以表示函数的参数和返回值接口(Type Signatures),在这个字符串中,"()"内表示函数的参数类型,然后是函数的返回值类型,"()" 表示函数参数为空,而如果函数返回值为空,则用 "()V" 表示。 "Ljava/lang/String;" 表示为 java.lang.String"Lxxx;"xxx 类型的完整写法,包字段分隔用斜杠代替,比如 "Lcom/zhdgps/ts/TScoord;" 表示类型为 com.zhdgps.ts.TSCoord 。如果参数有多个,依次写出对应类型。Java 源生类型可以参考 Type Signatures.

register_natives 中,我们将这两个函数注册到了类 com/zhgps/ts/TSmath 中,这个类就是之前在 Java 层定义的 com.zhdgps.ts.TSMath

下面继续 native_get_versionnative_calc_center 两个函数的实现

#define TSMATH_VERSION  "v0.1 alpha"

JNIEXPORT jstring JNICALL native_get_version(JNIEnv *env, jobject thiz)
{
    return (*env)->NewStringUTF(env, TSMATH_VERSION);
}

native_get_version 比较简单,就返回一个版本文本字符串。这里需要注意的是,如果函数需要返回非ASCII的字符串,则不能直接使用 NewStringUTF,因为 JNI 使用了修改版的 UTF-8 编码,具体可以参考 Modified UTF-8 Strings.

/* 保存全局 TSCoord 的信息,便于后续检索成员 */
struct TSCoordJNIInfo {
    /* ICS 4.0 之后,jclass 可能会变化,所以在获取后,调用 NewGlobalRef 保存引用,然后就不再变化 */
    jclass cls;
    /* ID 一般不会变化 */
    jfieldID fid_n;
    jfieldID fid_e;
    jfieldID fid_z;
    jmethodID mid_init;
} g_tscoord_jni;

static int helper_init_tscoord_jniinfo(JNIEnv *env)
{
    jclass cls = (*env)->FindClass(env, "com/zhdgps/ts/TSCoord");
    jfieldID fid_n = (*env)->GetFieldID(env, cls, "N", "D");
    jfieldID fid_e = (*env)->GetFieldID(env, cls, "E", "D");
    jfieldID fid_z = (*env)->GetFieldID(env, cls, "Z", "D");
    jmethodID mid_init = (*env)->GetMethodID(env, cls, "<init>", "()V");

    /* ICS 4.0 之后保存全局引用需要调用此函数,后续需要解除引用,使用函数 DeleteGlobalRef */
    cls = (jclass)((*env)->NewGlobalRef(env, cls));
    g_tscoord_jni.cls = cls;
    g_tscoord_jni.fid_n = fid_n;
    g_tscoord_jni.fid_e = fid_e;
    g_tscoord_jni.fid_z = fid_z;
    g_tscoord_jni.mid_init = mid_init;

    return 0;
}

static jobject helper_new_tscoord(JNIEnv *env)
{
    jobject tscoord = (*env)->NewObject(env, g_tscoord_jni.cls, g_tscoord_jni.mid_init);
    return tscoord;
}

static TSCoord helper_get_tscoord(JNIEnv *env, jobject coord)
{
    TSCoord res_coord;

    jdouble n = (*env)->GetDoubleField(env, coord, g_tscoord_jni.fid_n);
    jdouble e = (*env)->GetDoubleField(env, coord, g_tscoord_jni.fid_e);
    jdouble z = (*env)->GetDoubleField(env, coord, g_tscoord_jni.fid_z);

    res_coord.N = n;
    res_coord.E = e;
    res_coord.Z = z;

    return res_coord;
}

static void helper_set_tscoord(JNIEnv *env, jobject coord, const TSCoord *source)
{
    (*env)->SetDoubleField(env, coord, g_tscoord_jni.fid_n, source->N);
    (*env)->SetDoubleField(env, coord, g_tscoord_jni.fid_e, source->E);
    (*env)->SetDoubleField(env, coord, g_tscoord_jni.fid_z, source->Z);
}

JNIEXPORT jobject JNICALL native_calc_center(JNIEnv *env, jobject thiz, jobject coorda, jobject coordb)
{
    TSCoord a, b, c;
    jobject obj;

    a = helper_get_tscoord(env, coorda);
    b = helper_get_tscoord(env, coordb);

    TSAlgo_CalcCenter(&a, &b, &c);

    obj = helper_new_tscoord(env);
    helper_set_tscoord(env, obj, &c);

    return obj;
}

我们定义了一个结构体 struct TSCoordJNIInfo 用于保存 Java 类 com.zhdgps.ts.TSCoord 保存在 JVM 中的信息,包括类句柄、各字段ID(N,E,Z)以及构造函数ID。这些信息到后面获取/设置类对象字段时会用到,用全局结构体保存这些信息是为了效率,对于 FieldIDMethodID 来说,一旦类初始化后就不再变化,如果每次需要获取类对象信息时都去调用 GetFieldIDGetMethodID ,会给 JVM 带来负担,而且代码也有冗余。这里需要注意的是类句柄,对于 ICS4.0 以后的安卓系统,内存中的句柄可能会因为内存整理而移动,这意味着类句柄是会变化的,需要使用函数 NewGlobalRef 来保证句柄不变。

函数 helper_init_tscoord_jniinfo 用于获取类信息,这个函数需要在 JNI_OnLoad 中调用,保证在函数被调用前初始化全局信息。

函数 helper_new_tscoordhelper_get_tscoordhelper_set_tscoord 是定义的三个辅助函数,用于新建 TSCoord Java 对象、TSCoord Java 对象与 C 结构体互相转换。

如上,要获取一个类对象信息,依次需要使用 FindClass 来获取类句柄,然后通过句柄来获取各个字段的 FieldID,之后就可以通过这些字段 ID 来获取实际的值。com.zhdgps.ts.TSCoord 字段均为 double 所以使用 GetDoubleField 来获取字段值,如果有其他类型,可以以此类推。

函数 native_calc_center 的逻辑就比较简单了,通过转换对象,然后转为调用 Algorithm 中的算法,然后再将结果转换为 Java 对象返回。

2.3 编译 so 库

编辑 Android.mk 文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# 架构
LOCAL_ARM_MODE := arm
# 模块名
LOCAL_MODULE := tsmath
# 模块编译源文件
LOCAL_SRC_FILES := tsmath.c algorithm.c
# 模块依赖的库,比如要使用 android log 库
LOCAL_LDLIBS := -llog

# 编译为动态库
include $(BUILD_SHARED_LIBRARY)

这个文件是用于 so 模块的编译,其中模块名为 tsmath,这样编译出的文件会自动加前后缀,输出为 libtsmath.so。源文件部分加上项目使用的所有 C 文件,头文件不必加入其中。如果有依赖的安卓库,则加到 LOCAL_LDLIBS 链接部分。

编辑 Application.mk 文件

APP_OPTIM := release

这里指定生成 release 版本的 so 库。如果这里如果需要生成其他平台库,则需要设置 APP_ABI 字段。比如要生成全平台,则添加一句 APP_ABI := all,这样会同时生成其他平台(x86 等)。

下载 NDK ,完成安装并设置好系统 Path 变量。下载地址 Android NDK.

jni 上一级目录 tsmath 下打开命令行,输入命令 ndk-build 进行编译,编译完成后的 so 文件自动会保存到 libs 目录下。

3. so 库的使用

下面来新建一个 Android 项目来测试一下 so 库。

使用 Android Studio 新建一个 Hello World 项目,这里可以设置项目命名空间为 com.zhdgps.ts 来方便后面的测试。在项目文件夹的 app/src/main 目录下,新建文件夹 jniLibs,然后复制 tsmath/libs 目录下的编译输出到该文件夹中,注意保留 so 库的目录结构,比如 arm 架构编译的为 jniLibs/armeabi/libtsmath.so。将 TSCoord.javaTSMath.java 文件复制到 app/src/main/java/com/zhdgps/ts 目录下。Android Studi 会自动将添加的文件加入到工程中。

修改 MainActivity.java 文件, 在 onCreate 中添加测试代码

TSCoord a = new TSCoord();
a.N = 1.0;
a.E = 2.0;
a.Z = 3.0;

TSCoord b = new TSCoord();

b.N = 3.0;
b.E = 6.0;
b.Z = 9.0;

TSCoord c = TSMath.calcCenter(a, b);
String output = String.format("A(%f, %f, %f), B(%f, %f, %f) center: (%f, %f, %f)",
                a.N, a.E, a.Z,
                b.N, b.E, b.Z,
                c.N, c.E, c.Z);

TextView view = (TextView)findViewById(R.id.message);
view.setText(output);

这里测试了函数 TSMath.calcCenter。编译项目并运行,就可以看到结果了。

源码可以点击这里下载

Liwovosa 说:
Apr 22, 2021 06:10:33 PM

You there, this is really good post here. Thanks for taking the time to post such valuable information. Quality content is what always gets the visitors coming. visit here

Liwovosa 说:
Apr 25, 2021 05:11:04 PM

I really like your writing style, great information, thankyou for posting. doglotto

Liwovosa 说:
Apr 27, 2021 06:17:10 PM

Superior post, keep up with this exceptional work. It's nice to know that this topic is being also covered on this web site so cheers for taking the time to discuss this! Thanks again and again! สมัคร FIFA55

Liwovosa 说:
Apr 28, 2021 05:24:59 PM

You made such an interesting piece to read, giving every subject enlightenment for us to gain knowledge. Thanks for sharing the such information with us to read this... uwynn888.com

online blackjack 说:
May 16, 2021 06:11:10 PM

I value the post. Really thank you! Keep writing.

dunder 说:
May 22, 2021 01:15:15 AM

Very neat blog. Thanks Again. Really Great.

jackjohnny 说:
May 27, 2021 04:23:14 PM

Hey what a brilliant post I have come across and believe me I have been searching out for this similar kind of post for past a week and hardly came across this. Thank you very much and will look for more postings from you. india tourist visa

biaakhan 说:
Jun 03, 2021 12:11:32 AM

It was wondering if I could use this write-up on my other website, I will link it back to your website though.Great Thanks. Job

best canvas tote bag 说:
Jun 10, 2021 01:16:14 AM

Very good blog article. Really looking forward to read more. Really Cool.

spielautomaten deuts 说:
Jun 22, 2021 01:56:15 AM

Awesome article. Much thanks again. Cool.

wildz 说:
Jul 02, 2021 07:35:17 PM

Fantastic article post. Really looking forward to read more. Really Cool.

spielautomaten deuts 说:
Jul 12, 2021 06:17:09 PM

Thanks so much for the article post. Thanks Again. Great.

jackpotcity 说:
Jul 25, 2021 05:16:17 PM

I truly appreciate this article post. Really looking forward to read more. Awesome.

www.spielautomaten-d 说:
Aug 03, 2021 11:40:47 PM

I think this is a real great post. Really looking forward to read more. Really Cool.

am i pretty 说:
Sep 08, 2021 06:16:42 PM

Great blog. Really looking forward to read more. Cool.

Digital Ali 说:
Oct 07, 2021 10:40:54 PM I know your expertise on this. I must say we should have an online discussion on this. Writing only comments will close the discussion straight away! And will restrict the benefits from this information. เว็บพนันออนไลน์ ดีที่สุด
Digital Ali 说:
Oct 08, 2021 02:16:33 PM

Thanks for the blog filled with so many information. Stopping by your blog helped me to get what I was looking for. Now my task has become as easy as ABC. online transcription services

Digital Ali 说:
Oct 09, 2021 06:34:16 PM

Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work. คาสิโนออนไลน์ฟรีเงิน

Digital Ali 说:
Oct 11, 2021 12:01:52 PM

We are really grateful for your blog post. You will find a lot of approaches after visiting your post. I was exactly searching for. Thanks for such post and please keep it up. Great work. the boys blindspot

link 说:
Oct 11, 2021 10:36:36 PM

Great post but I was wondering if you could write a little more on this subject? I’d be very thankful if you could elaborate a little bit further. Thanks in advance! North American Bancard ISO Program

johnyking 说:
Oct 16, 2021 11:04:15 PM

I’m going to read this. I’ll be sure to come back. thanks for sharing. and also This article gives the light in which we can observe the reality. this is very nice one and gives indepth information. thanks for this nice article... sport news

johnyking 说:
Oct 18, 2021 12:11:43 AM

I would like to say that this blog really convinced me to do it! Thanks, very good post. weed

seoservise 说:
Oct 26, 2021 01:57:23 AM

I'm glad I found this web site, I couldn't find any knowledge on this matter prior to.Also operate a site and if you are ever interested in doing some visitor writing for me if possible feel free to let me know, im always look for people to check out my web site. voyance telephone

Digital Ali 说:
Oct 27, 2021 12:49:35 PM I think this is an informative post and it is very beneficial and knowledgeable. Therefore, I would like to thank you for the endeavors that you have made in writing this article. All the content is absolutely well-researched. Thanks... bike for teenage girl
Harry 说:
Nov 02, 2021 05:13:12 PM

I think this is a real great post. Really looking forward to read more. Really Cool. buy instagram followers cheap

Digital Ali 说:
Nov 04, 2021 12:56:12 PM

I gotta favorite this website it seems very helpful . situs judi pkv games

jackseo 说:
Dec 13, 2021 12:28:55 AM
 

 

jackseo 说:
Dec 18, 2021 04:17:52 AM

You know your projects stand out of the herd. There is something special about them. It seems to me all of them are really brilliant! custom patches

johnyking 说:
Dec 20, 2021 06:48:37 PM

What a fantabulous post this has been. Never seen this kind of useful post. I am grateful to you and expect more number of posts like these. Thank you very much. podcast transcription service

johnyking 说:
Dec 22, 2021 12:33:14 AM

Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post. ARIZER XQ2

johnyking 说:
Dec 22, 2021 04:39:24 AM

Hello I am so delighted I located your blog, I really located you by mistake, while I was watching on google for something else, Anyways I am here now and could just like to say thank for a tremendous post and a all round entertaining website. Please do keep up the great work. 토토사이트

johnyking 说:
Dec 30, 2021 04:41:43 PM

This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free. 메이저사이트

johnyking 说:
Jan 02, 2022 03:58:54 AM

I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article. Okinawa Flat belly drink

johnyking 说:
Jan 04, 2022 03:30:49 AM

Wow, cool post. I'd like to write like this too - taking time and real hard work to make a great article... but I put things off too much and never seem to get started. Thanks though. Java burn supplement

johnyking 说:
Jan 05, 2022 04:17:54 AM

I definitely enjoying every little bit of it. It is a great website and nice share. I want to thank you. Good job! You guys do a great blog, and have some great contents. Keep up the good work. Exipure weight loss reviews

SEO 说:
Jan 05, 2022 09:53:58 PM

I am definitely enjoying your website. You definitely have some great insight and great stories. hgh to lose weight

johnyking 说:
Jan 09, 2022 07:40:30 PM

I definitely enjoying every little bit of it. It is a great website and nice share. I want to thank you. Good job! You guys do a great blog, and have some great contents. Keep up the good work. how to find a lost drone with gps

johnyking 说:
Jan 11, 2022 09:27:48 PM

Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! biofit supplement

johnyking 说:
Jan 18, 2022 11:55:02 PM What a fantabulous post this has been. Never seen this kind of useful post. I am grateful to you and expect more number of posts like these. Thank you very much. Cannaleafz cbd review
jackseo 说:
Jan 25, 2022 02:57:42 AM

 I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post. Starting a payment processing company

johny 说:
Jan 26, 2022 03:07:25 PM

If you are looking for more information about flat rate locksmith Las Vegas check that right away. selling credit card processing

johny 说:
Jan 27, 2022 11:11:21 PM Hey what a brilliant post I have come across and believe me I have been searching out for this similar kind of post for past a week and hardly came across this. Thank you very much and will look for more postings from you. NeuroPure reviews
jackseo 说:
Jan 28, 2022 12:20:48 AM

I found your this post while searching for some related information on blog search...Its a good post..keep posting and update the information. Blissy silk pillowcase

johny 说:
Jan 29, 2022 03:39:57 AM

Thank you very much for this useful article. I like it. Caresoles advanced knee sleeves review

johny 说:
Jan 31, 2022 12:09:11 AM

I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well. Thanks... North American Bancard ISO

johny 说:
Feb 01, 2022 02:24:57 PM

What a fantabulous post this has been. Never seen this kind of useful post. I am grateful to you and expect more number of posts like these. Thank you very much. starting a credit card processing company

jackseo 说:
Feb 02, 2022 12:19:11 AM

 

Took me time to read all the comments, but I really enjoyed the article.  North American Bancard Agent Program

Took me time to read all the comments, but I really enjoyed the article. 

johny 说:
Feb 02, 2022 11:46:25 PM

Please share more like that. Tvidler ear wax cleaner

johnyking 说:
Feb 03, 2022 10:17:40 PM

Thanks for the blog post buddy! Keep them coming... Starting a Merchant Services Business

johnyking 说:
Feb 04, 2022 07:45:35 PM

Thank you very much for this great post. Payment Processing Business for Sale

johnyking 说:
Feb 05, 2022 04:26:09 PM

I read that Post and got it fine and informative. North American Bancard Sales Partner

jackseo 说:
Feb 06, 2022 12:34:56 AM
It was wondering if I could use this write-up on my other website, I will link it back to your website though.Great Thanks. North American Bancard Agent Program
 

 

johnyking 说:
Feb 06, 2022 02:41:43 PM

Thanks for the blog loaded with so many information. Stopping by your blog helped me to get what I was looking for. top high risk merchant accoun

johny 说:
Feb 06, 2022 05:46:31 PM You make so many great points here that I read your article a couple of times. Your views are in accordance with my own for the most part. This is great content for your readers. Crypto Merchant Account
johnyking 说:
Feb 08, 2022 07:17:34 PM

I was surfing the Internet for information and came across your blog. I am impressed by the information you have on this blog. It shows how well you understand this subject. Credit Card Processing Sales Commission

johnyking 说:
Feb 09, 2022 02:45:20 PM

I was reading some of your content on this website and I conceive this internet site is really informative ! Keep on putting up. when to buy crypto

jackseo 说:
Feb 10, 2022 03:47:03 AM
Thank you a bunch for sharing this with all of us you actually realize what you are talking about! Bookmarked. Please also seek advice from my site =). We could have a hyperlink change contract between us! Bitcoin Payment Processor
 

 

jackseo 说:
Feb 10, 2022 03:54:37 AM

 Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! Merchant Services ISO Agent Program

jackseo 说:
Feb 13, 2022 03:46:29 PM

When you use a genuine service, you will be able to provide instructions, share materials and choose the formatting style. best time to buy crypto

jackseo 说:
Feb 16, 2022 09:11:04 PM

I am unable to read articles online very often, but I’m glad I did today. This is very well written and your points are well-expressed. Please, don’t ever stop writing. when to buy crypto

jackseo 说:
Feb 16, 2022 09:16:10 PM

 

Thank you so much for such a well-written article. It’s full of insightful information. Your point of view is the best among many without fail.For certain, It is one of the best blogs in my opinion. when to buy cryptocurrency

Thank you so much for such a well-written article. It’s full of insightful information. Your point of view is the best among many without fail.For certain, It is one of the best blogs in my opinion. when to buy cryptocurrency

jackseo 说:
Feb 17, 2022 03:34:21 AM

 

Interesting and amazing how your post is! It Is Useful and helpful for me That I like it very much, and I am looking forward to Hearing from your next.. https://Ibizaclub88.com

jackseo 说:
Feb 17, 2022 11:00:40 PM

 

Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. 

johny 说:
Feb 19, 2022 03:56:39 AM

Thank you very much for this useful article. I like it. how to be a payment processor

jackseo 说:
Feb 20, 2022 03:16:13 AM

I appreciate everything you have added to my knowledge base.Admiring the time and effort you put into your blog and detailed information you offer.Thanks. https://Ibiza55.com

jackseo 说:
Feb 21, 2022 12:28:26 AM

If you are looking for more information about flat rate locksmith Las Vegas check that right away. https://www.phuketthailand-travel.com

jackseo 说:
Feb 21, 2022 09:10:28 PM

Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place.. https://www.SEOFASTWORK.com

jackseo 说:
Feb 23, 2022 12:06:36 AM

 I love seeing websites that understand the value of providing a quality resource for free. It is the old what goes around comes around routine. weightlifting jewelry

jackseo 说:
Feb 24, 2022 05:09:44 AM

Nice to be visiting your blog once more, it has been months for me. Well this article that ive been waited for therefore long. i want this article to finish my assignment within the faculty, and it has same topic together with your article. Thanks, nice share. ดีจีแกรน

jackseo 说:
Feb 26, 2022 04:53:45 AM

 

Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post. <a href="https://oojalaoptical.com/wos0/?fbclid=IwAR3kYZjy7HCIHBcui4SPJz5jkggyxOY35Y_W-St0w3tRvtqz5KhpqYJ_chI" https:="" a-ufa888.net="" "="" style="box-sizing: border-box; font-family: Arial, Helvetica, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);">ufa vip

jackseo 说:
Feb 26, 2022 04:54:13 AM

 

Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post. ufa vip

jackseo 说:
Feb 27, 2022 05:54:19 AM

 

Your website is really cool and this is a great inspiring article. backlinks

jackseo 说:
Feb 27, 2022 10:16:32 PM

Awesome article, it was exceptionally helpful! I simply began in this and I'm becoming more acquainted with it better! Cheers, keep doing awesome! muama ryoko

SEO 说:
Mar 03, 2022 08:21:28 PM

You make so many great points here that I read your article a couple of times. Your views are in accordance with my own for the most part. This is great content for your readers. lawn services near me

johny 说:
Mar 03, 2022 11:41:12 PM

Very efficiently written information. It will be beneficial to anybody who utilizes it, including me. Keep up the good work. For sure i will check out more posts. This site seems to get a good amount of visitors. Altai balance supplement

jackseo 说:
Mar 04, 2022 05:45:49 PM

 

Cool stuff you have got and you keep update all of us. Dentitox review

jackseo 说:
Mar 08, 2022 10:47:52 PM

Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Thank you for sharing with us,I too always learn something new from your post. เกมสล็อต

Dave 说:
Mar 11, 2022 06:30:12 PM

Pretty good post. I have just stumbled upon your blog and enjoyed reading your blog posts very much. I am looking for new posts to get more precious info. Big thanks for the useful info. Kanādas vīzas pieteikums

jackseo 说:
Mar 13, 2022 02:15:49 AM

 

i love reading this article so beautiful!!great job! เสื้อกล้ามเด็ก

i love reading this article so beautiful!!great job! เสื้อกล้ามเด็ก

Dave 说:
Mar 13, 2022 07:25:09 PM

You delivered such an impressive piece to read, giving every subject enlightenment for us to gain information. Thanks for sharing such information with us due to which my several concepts have been cleared. انڈیا بزنس ویزا

johny 说:
Mar 13, 2022 08:54:21 PM Please share more like that. Miracle Bedsheets
johny 说:
Mar 14, 2022 02:11:35 PM

I wrote about a similar issue, I give you the link to my site. INDIA MEDICAL VISA

Dave 说:
Mar 15, 2022 06:46:14 PM

I know this is one of the most meaningful information for me. And I'm animated reading your article. But should remark on some general things, the website style is perfect; the articles are great. Thanks for the ton of tangible and attainable help. phnom penh hotels

johny 说:
Mar 16, 2022 11:05:31 PM

Thank you for taking the time to publish this information very useful! บาคาร่า99

Dave 说:
Mar 19, 2022 04:29:13 PM

Nice post mate, keep up the great work, just shared this with my friendz कनाडा वीज़ा सरकार की वेबसाइट

Dave 说:
Mar 20, 2022 05:34:57 PM

I just couldn't leave your website before telling you that I truly enjoyed the top quality info you present to your visitors? Will be back again frequently to check up on new posts. A KANADA VÍZUMKORMÁNY WEBOLDALA

johny 说:
Mar 21, 2022 07:51:36 PM

Amazing, this is great as you want to learn more, I invite to This is my page. UK FAKE ID

johnyking 说:
Mar 22, 2022 11:24:30 PM

Please share more like that. Can dogs eat cheese?

jackseo 说:
Mar 23, 2022 11:51:00 AM

A must-visit blog because it's so good! เกมสล็อต

Dave 说:
Mar 27, 2022 03:31:58 PM

Pretty nice post. I just stumbled upon your weblog and wanted to say that I have really enjoyed browsing your blog posts. After all I’ll be subscribing to your feed and I hope you write again soon! judi online terpercaya

johnyking 说:
Mar 29, 2022 01:24:54 PM

Really I enjoy your site with effective and useful information. It is included very nice post with a lot of our resources.thanks for share. i enjoy this post. Bottled and Jarred Packaged Goods

johnyking 说:
Mar 30, 2022 10:55:42 PM

Thank you for the update, very nice site.. golden revive plus reviews

SEO 说:
Mar 31, 2022 12:05:31 AM I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article. this guide
SEO 说:
Mar 31, 2022 02:58:52 AM

Thanks for the blog post buddy! Keep them coming... Golden Revive Plus Review

jackseo 说:
Mar 31, 2022 03:56:07 AM

This particular papers fabulous, and My spouse and i enjoy each of the perform that you have placed into this. I’m sure that you will be making a really useful place. I has been additionally pleased. Good perform! generic cialis

HHC carts 说:
Apr 02, 2022 08:31:00 PM

Pretty good post. I have just stumbled upon your blog and enjoyed reading your blog posts very much. I am looking for new posts to get more precious info. Big thanks for the useful info. 강남셔츠룸

jackseo 说:
Apr 02, 2022 09:09:32 PM

I have read all the comments and suggestions posted by the visitors for this article are very fine,We will wait for your next article so only.Thanks! detectives en españa

johnyking 说:
Apr 05, 2022 03:01:08 AM When you use a genuine service, you will be able to provide instructions, share materials and choose the formatting style. BLUE WORLD CITYWhen you use a genuine service, you will be able to provide instructions, share materials and choose the formatting style. BLUE WORLD CITY
jackseo 说:
Apr 06, 2022 07:23:48 PM

You understand your projects stand out of the crowd. There is something unique about them. It seems to me all of them are brilliant. Islamabad 1947 Housing

jackseo 说:
Apr 07, 2022 07:06:39 AM

Thanks for a very interesting blog. What else may I get that kind of info written in such a perfect approach? I’ve a undertaking that I am simply now operating on, and I have been at the look out for such info. Golden Revive Plus

Dave 说:
Apr 07, 2022 05:17:44 PM

Superior post, keep up with this exceptional work. It's nice to know that this topic is being also covered on this web site so cheers for taking the time to discuss this! Thanks again and again! Arctos Air Cooler

jackseo 说:
Apr 07, 2022 07:15:28 PM

You have a real talent for writing unique content. I like how you think and the way you express your views in this article. I am impressed by your writing style a lot. Thanks for making my experience more beautiful. detectives en málaga

johnyking 说:
Apr 08, 2022 03:14:06 AM

Very efficiently written information. It will be beneficial to anybody who utilizes it, including me. Keep up the good work. For sure i will check out more posts. This site seems to get a good amount of visitors. Oros CBD Gummies

jackseo 说:
Apr 08, 2022 06:22:21 PM

Fabulous post, you have denoted out some fantastic points, I likewise think this s a very wonderful website. I will visit again for more quality contents and also, recommend this site to all. Thanks. golden revive plus review

jackseo 说:
Apr 13, 2022 03:25:18 AM

I exactly got what you mean, thanks for posting. And, I am too much happy to find this website on the world of Google. kingdom valley islamabad website

Dave 说:
Apr 19, 2022 05:18:42 PM

A great content material as well as great layout. Your website deserves all of the positive feedback it’s been getting. I will be back soon for further quality contents. 먹튀사이트

HHC carts 说:
Apr 21, 2022 12:35:11 AM

Really a great addition. I have read this marvelous post. Thanks for sharing information about it. I really like that. Thanks so lot for your convene. 먹튀검증

HHC carts 说:
Apr 23, 2022 06:47:32 PM

This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value. Im glad to have found this post as its such an interesting one! I am always on the lookout for quality posts and articles so i suppose im lucky to have found this! I hope you will be adding more in the future... 카지노다나와

johny 说:
Apr 23, 2022 08:39:18 PM

If you are looking for more information about flat rate locksmith Las Vegas check that right away. smilz cbd gummies supplement

johny 说:
Apr 26, 2022 06:29:20 AM

You there, this is really good post here. Thanks for taking the time to post such valuable information. Quality content is what always gets the visitors coming. learn more about smilz cbd

johny 说:
Apr 27, 2022 12:41:10 AM

If more people that write articles really concerned themselves with writing great content like you, more readers would be interested in their writings. Thank you for caring about your content. Brisbane Website Designers

johny 说:
May 05, 2022 07:44:25 PM

Hey what a brilliant post I have come across and believe me I have been searching out for this similar kind of post for past a week and hardly came across this. Thank you very much and will look for more postings from you. 먹튀검증

johny 说:
May 07, 2022 02:14:20 PM

This is exciting, nevertheless it is vital for you to visit this specific url: mx graphics

HHC carts 说:
May 07, 2022 09:25:01 PM

Only strive to mention one's content can be as incredible. This clarity with your post is superb! Thanks a lot, hundreds of along with you should go on the pleasurable get the job done. 먹튀검증

johny 说:
May 08, 2022 07:26:39 PM

Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! 토토사이트

HHC carts 说:
May 08, 2022 08:07:38 PM

I was looking at some of your posts on this website and I conceive this web site is really instructive! Keep putting up.. 카지노다나와

johny 说:
May 11, 2022 12:24:12 AM On this page, you'll see my profile, please read this information. Tummy Trimmer In Pakistan
HHC carts 说:
May 13, 2022 10:52:07 PM

What a thrilling post, you have pointed out some excellent points, I as well believe this is a superb website. I have planned to visit it again and again. เกมคาสิโน

HHC carts 说:
May 13, 2022 10:52:24 PM

I think this is one of the most significant information for me. And i’m glad reading your article. But should remark on some general things, The web site style is perfect, the articles is really great : D. Good job, cheers www.uwin99.xyz

Dave 说:
May 14, 2022 11:50:30 PM

Very good points you wrote here..Great stuff...I think you've made some truly interesting points.Keep up the good work. Loans and insurance

johnyking 说:
May 21, 2022 06:54:02 PM

Hey what a brilliant post I have come across and believe me I have been searching out for this similar kind of post for past a week and hardly came across this. Thank you very much and will look for more postings from you. golf club

johny 说:
May 23, 2022 04:52:39 PM

Great article Lot's of information to Read...Great Man Keep Posting and update to People..Thanks เว็บรีวิวเว็บพนัน

johny 说:
May 25, 2022 04:50:18 PM

I am definitely enjoying your website. You definitely have some great insight and great stories. ทางเข้า ufabet มือถือ

Slot Online 说:
May 25, 2022 06:26:05 PM

I am definitely enjoying your website. You definitely have some great insight and great stories.

HHC carts 说:
May 25, 2022 07:46:50 PM

No doubt this is an excellent post I got a lot of knowledge after reading good luck. Theme of blog is excellent there is almost everything to read, Brilliant post. 먹튀검증업체

Namokhabar In 说:
May 25, 2022 10:23:14 PM

I admit, I have not been on this web page in a long time... however it was another joy to see It is such an important topic and ignored by so many, even professionals. I thank you to help making people more aware of possible issues.

professional writing 说:
May 26, 2022 04:02:35 PM

This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free.

HHC carts 说:
May 28, 2022 09:08:48 PM

That is the excellent mindset, nonetheless is just not help to make every sence whatsoever preaching about that mather. Virtually any method many thanks in addition to i had endeavor to promote your own article in to delicius nevertheless it is apparently a dilemma using your information sites can you please recheck the idea. thanks once more. 출장안마

johny 说:
May 28, 2022 11:46:37 PM

Thank you very much for this useful article. I like it. Chillwell AC

HHC carts 说:
May 29, 2022 11:04:27 PM

Great job for publishing such a beneficial web site. Your web log isn’t only useful but it is additionally really creative too. There tend to be not many people who can certainly write not so simple posts that artistically. Continue the nice writing 수원홈타이

johnyking 说:
May 29, 2022 11:30:25 PM

Its a great pleasure reading your post.Its full of information I am looking for and I love to post a comment that "The content of your post is awesome" Great work. talk to strangers video call

johnyking 说:
May 30, 2022 12:43:43 PM

Thank you because you have been willing to share information with us. we will always appreciate all you have done here because I know you are very concerned with our. random video chat online

johnyking 说:
May 31, 2022 03:37:33 PM

This is my first time i visit here. I found so many interesting stuff in your blog especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here keep up the good work Chillwell AC reviews

johnyking 说:
May 31, 2022 08:48:46 PM

Thanks for sharing us. Chillwell AC

johnyking 说:
Jun 01, 2022 03:53:35 AM

I was reading some of your content on this website and I conceive this internet site is really informative ! Keep on putting up. track one location

johny 说:
Jun 02, 2022 03:20:52 PM This is a great article thanks for sharing this informative information. I will visit your blog regularly for some latest post. I will visit your blog regularly for Some latest post. tavor ts12 for sale
johny 说:
Jun 05, 2022 10:53:29 PM This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free. prima diet reviews
HHC carts 说:
Jun 09, 2022 09:09:57 PM

I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article. 온라인홀덤

HHC carts 说:
Jun 14, 2022 09:14:51 PM

The writer has outdone himself this time. It is not at all enough; the website is also utmost perfect. I will never forget to visit your site again and again. Buy MDMA online

johny 说:
Jun 15, 2022 12:46:31 AM

Thanks for a very interesting blog. What else may I get that kind of info written in such a perfect approach? I’ve a undertaking that I am simply now operating on, and I have been at the look out for such info. Chillwell Portable AC reviews

HHC carts 说:
Jun 16, 2022 10:21:56 PM

I wanted to thank you for this excellent read!! I definitely loved every little bit of it. I have you bookmarked your site to check out the new stuff you post. All-terrain folding ebike

สล็อต 999 说:
Jun 17, 2022 04:33:45 AM

I am often seeking some no cost styles of things over the internet. There's also some organizations which give no cost samples. But immediately after viewing your blog site, I do not take a look at a lot of weblogs. Many thanks.

สล็อตแตกง่าย 说:
Jun 17, 2022 07:26:10 AM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended.<a href="https://ipro998.com/">สล็อตแตกง่าย</a>

<a href="https://beo 说:
Jun 17, 2022 04:19:28 PM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended.

เว็บ ตรง 说:
Jun 17, 2022 04:20:12 PM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended.

สล็อตออนไลน์ 说:
Jun 17, 2022 05:14:27 PM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended./a28

สล็อตเว็บใหญ่ 说:
Jun 17, 2022 06:47:10 PM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended./koko

บาร์บีม 说:
Jun 18, 2022 04:20:37 AM

Excellent Web page! I adore how it is easy on my eyes it truly is. I'm questioning how I might be notified Anytime a brand new post has become produced. Looking for more new updates. Have an incredible day! <a href="https://beo998.com/">เกมสล็อต</a>

บาร์บีม 说:
Jun 18, 2022 04:21:16 AM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended. <a href="https://beo998.com/">เกมสล็อต</a>

บาร์บีม 说:
Jun 18, 2022 04:22:25 AM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended.เกมสล็อตhttps://beo998.com/

neng 说:
Jun 18, 2022 05:37:29 AM

Beautifully penned post, if only all bloggers provided the identical posts while you, the online entire world is going to be a Considerably considerably superior location..

บา คา ร่า วอ เลท 说:
Jun 18, 2022 08:32:04 AM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended.

tom 说:
Jun 19, 2022 04:27:27 AM

Thank you A lot for sharing this good web site internet site.Very inspiring and helpful far too.Hope you keep it up to share much more within your Tips.I will definitely choose to search.

สล็อตxo 说:
Jun 19, 2022 04:28:00 AM

Fantastic report with superb notion!Thank you for such a worthwhile submitting. I really identify for this good details..

Bear 说:
Jun 19, 2022 10:33:56 AM

Fantastic put up. I had been normally checking this website, And that i’m impressed! Exceptionally beneficial facts specially the final element, I take care of such information a whole lot. I used to be Discovering this individual information for a very long time. Because of this web site my exploration has ended.[url=https://beo369.com/]สล็อต เว็บ ตรง[/url]

หมี 说:
Jun 19, 2022 10:35:23 AM

It is my very first take a look at on your website, and I am really amazed Along with the posts that you provide. Give ample expertise for me. Thanks for sharing useful materials. I are going to be back again for the more fantastic post.<a href="https://beo369.com/">สล็อต เว็บ ตรง</a>

สล็อตวอเลท 说:
Jun 19, 2022 06:07:45 PM

I'm able to’t consider concentrating extended more than enough to research; much less create this kind of article. You’ve outdone you using this substance without a doubt. It is one of the biggest contents.

สล็อตวอเลท 说:
Jun 20, 2022 05:53:31 AM

Excellent Web page! I adore how it is easy on my eyes it truly is. I'm questioning how I might be notified Anytime a brand new post has become produced. Looking for more new updates. Have an incredible day!

บา คา ร่า วอ เลท 说:
Jun 24, 2022 09:01:13 AM

You there, this is de facto very good submit in this article. Thanks for finding the time to write-up such worthwhile facts. High quality articles is exactly what generally will get the visitors coming.

สล็อตแตกง่าย 说:
Jun 25, 2022 10:50:26 PM

You there, this is de facto very good submit in this article. Thanks for finding the time to write-up such worthwhile facts. High quality articles is exactly what generally will get the visitors coming.<a href="https://ipro998.com/">สล็อตแตกง่าย</a>

johnyking 说:
Jun 26, 2022 05:54:19 PM

I found so many interesting stuff in your blog especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here! keep up the good work... project finance modeling

johnyking 说:
Jun 29, 2022 02:09:30 AM Great article Lot's of information to Read...Great Man Keep Posting and update to People..Thanks e student
johny 说:
Jun 30, 2022 02:15:14 AM

For many people this is the best solution here see how to do it. 안전놀이터

narrowsecurity 说:
Jul 01, 2022 08:06:34 AM

Thanks for sharing an informative article.

johny 说:
Jul 01, 2022 01:49:40 PM

Just Imagine Wallpaper is a prominent and leading company that provides the best quality home painting services in Kolkata. They have the best painting contractors in Kolkata who will reach your doorstep within 24 hours and discuss all your requirements. They will also start the work on the very next day and can complete the work within a short time. Their house painters in Kolkata are very timely and quick; they can finish home renovation work, interior and exterior paints within less duration. Their home painting contractors in Kolkata provide all type of painting works that cover everything that is needed for your dream house. house painters in Kolkata

สล็อตวอเลท 说:
Jul 02, 2022 05:38:57 AM

When you use a genuine provider, you will be able to give Guidance, share components and pick the formatting fashion.

<a href="https://ipr 说:
Jul 03, 2022 12:44:34 PM

You there, this is de facto very good submit in this article. Thanks for finding the time to write-up such worthwhile facts. High quality articles is exactly what generally will get the visitors coming. <a href="https://ipro998.com/">สล็อตแตกง่าย</a>


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter