Thursday, November 28, 2013

cocos2d-x c++ implement auto object point release

1.why

because some class liked "cs::CSJsonDictionary" is not derive from CCObject,so when i new it,need manual release it later.

2. todo

implement one plan.that can auto release those class who are not derive from CCObject.

3. code

Single ton and Memory pool class


template<class _Ty>
class pkSingleTon{
public:
pkSingleTon(){}
public:
static _Ty* Instance(){
static _Ty s_val;
return &s_val;
}
};

#include <string>
#include <set>
#include <map>
#include <list>
#include <vector>

template<class _Ty>
class pkObserver : public std::set<_Ty>{
};

template<class _Ty>
class pkMemoryPool : private pkSingleTon<pkMemoryPool<_Ty> >{
private:
typedef pkObserver<_Ty*> CON;
CON mdatas;
private:
void _add(_Ty* v){
mdatas.insert(v);
}
void _remove(_Ty* v){
typename CON::iterator b = mdatas.find(v);
if(b == mdatas.end())
return;
delete (*b);
mdatas.erase(b);
}
public:
static _Ty* create(){
_Ty* ret = new _Ty();
add(ret);
return ret;
}
static void add(_Ty* v){
pkMemoryPool<_Ty>::Instance()->_add(v);
}
static void remove(_Ty* v){
pkMemoryPool<_Ty>::Instance()->_remove(v);
}
};




Auto memory pool code:


#include "cocos2d.h"

template<class _Ty>
class pkAutoMemoryPool{
private:
class pkObjectMemoryPool_Helper : public cocos2d::CCObject{
private:
_Ty* m_value;
public:
static void create(_Ty* v){
pkObjectMemoryPool_Helper* ret = new pkObjectMemoryPool_Helper();
ret->m_value = v;
ret->autorelease();
}
virtual ~pkObjectMemoryPool_Helper(){
pkAutoMemoryPool<_Ty>::remove(m_value);
}
};
public:
static _Ty* create(){
_Ty* ret = pkMemoryPool<_Ty>::create();
pkObjectMemoryPool_Helper::create(ret);
return ret;
}
static void remove(_Ty* v){
pkMemoryPool<_Ty>::remove(v);
}
};




4 used

cs::CSJsonDictionary* ret = pkAutoMemoryPool<cs::CSJsonDictionary>::create();

Monday, November 25, 2013

恭喜,您对软件"语音设置皇"的新

尊敬的用户连德亮,您好!
    感谢您使用我们的网络服务,您在我们网站上的软件"语音设置皇"的新增描述审核操作已经被管理员通过。
    具体详情请登录http://www.appchina.com/market/dev/dev_app.action?applicationId=1022542 查看。
    此邮箱无人职守,请勿回复此邮箱。
                    AppChina 应用汇团队

恭喜,您对软件"pktts"的

尊敬的用户连德亮,您好!
    感谢您使用我们的网络服务,您在我们网站上的软件"pktts"的更新包审核操作已经被管理员通过。
    具体详情请登录http://www.appchina.com/market/dev/dev_app.action?applicationId=1022543 查看。
    此邮箱无人职守,请勿回复此邮箱。
                    AppChina 应用汇团队

Friday, November 22, 2013

恭喜,您对软件"语音新闻王2"的

尊敬的用户连德亮,您好!
    感谢您使用我们的网络服务,您在我们网站上的软件"语音新闻王2"的更新包审核操作已经被管理员通过。
    具体详情请登录http://www.appchina.com/market/dev/dev_app.action?applicationId=1022602 查看。
    此邮箱无人职守,请勿回复此邮箱。
                    AppChina 应用汇团队

恭喜,您对软件"语音新闻王2"的

尊敬的用户连德亮,您好!
    感谢您使用我们的网络服务,您在我们网站上的软件"语音新闻王2"的更新描述审核操作已经被管理员通过。
    具体详情请登录http://www.appchina.com/market/dev/dev_app.action?applicationId=875710 查看。
    此邮箱无人职守,请勿回复此邮箱。
                    AppChina 应用汇团队

十字猫通知: lian456 您好, 请按

Content-Type: text/html; charset = "utf-8"
Content-Transfer-Encoding: 8bit

lian456,您好:



请点击这里修改您的密码,如果您点击上述链接无效,
请把下面的代码拷贝到浏览器的地址栏中:http://dev.crossmo.com?id=%2B%8CK%DBX%8A%1D%B7&code=%2F%2F%ED%01%94%EC%21%AF&r=provider/reset



  感谢您对十字猫的支持,如果您在这个过程中遇到任何问题请随时和我们联系。
  我们的联系方式是:
  客服邮箱:help@crossmo.com   客服电话:(+86)4000552533
  开发者论坛:http://bbs.crossmo.com/ 




北京欧乐吧技术有限公司
2013-11-22 20:37:24

Saturday, November 16, 2013

android develop log – share by email sms and other

1.normal share

    private void sendShare(String subject, String body, String type) {
final Intent shareIntent = new Intent(Intent.ACTION_SEND);
try {
if (type == null || type.length() == 0) {
type = "text";
}
shareIntent.setType(type + "/*");
if (subject != null && subject.length() > 0) {
shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
}
if (body != null && body.length() > 0) {
shareIntent.putExtra(Intent.EXTRA_TEXT, body);
}
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
} catch (Exception e) {

} finally {
PkrssActivity.s_pkrss.startActivity(Intent.createChooser(shareIntent, PkrssActivity.s_pkrss.getTitle()));
}
}



2.email share

    private void sendEmail(String address, String body, String subject, boolean isHTML, String cc, String bcc, String attachment) {
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
try {
if (isHTML) {
emailIntent.setType("text/html");
} else {
emailIntent.setType("text/plain");
}

if (subject != null && subject.length() > 0) {
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
}
if (body != null && body.length() > 0) {
if (isHTML) {
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml(body));
} else {
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, body);
}
}
if (address != null && address.length() > 0) {
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, address.split(";"));
} else{
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, "pkrss@gmail.com");
}

if (cc != null && cc.length() > 0 && cc!="null") {
emailIntent.putExtra(android.content.Intent.EXTRA_CC, address.split(";"));
}
if (bcc != null && bcc.length() > 0 && bcc!="null") {
emailIntent.putExtra(android.content.Intent.EXTRA_BCC, address.split(";"));
}
if (attachment != null && attachment.length() > 0 && attachment!="null") {
String[] attachments = attachment.split(";");

ArrayList<Uri> uris = new ArrayList<Uri>();
//convert from paths to Android friendly Parcelable Uri's
for (int i = 0; i < attachments.length; i++) {
File file = new File(attachments[i]);
if (file.exists()) {
uris.add(Uri.fromFile(file));
}
}
if (uris.size() > 0) {
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
}
}

} catch (Exception e) {

} finally {
PkrssActivity.s_pkrss.startActivity(Intent.createChooser(emailIntent, PkrssActivity.s_pkrss.getTitle()));
}
}



3.sms share

    private void sendSMS(String phoneNumber, String message) {
try {
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + phoneNumber));//Intent.ACTION_MAIN
//intent.setData(Uri.parse("content://mms-sms/"));
intent.putExtra("sms_body", message);
PkrssActivity.s_pkrss.startActivity(intent);
return;
} catch (Exception e) {
e.printStackTrace();
}
}

android develop log–enum activity and start activity

1.check has installed app

public static Boolean hasApp(String packageName, String className) {
Boolean f = false;
try {
if ((null != className) && (className.length() > 0)) {
if (null != PkrssActivity.s_pkrss.getPackageManager().getPackageInfo(packageName, 0))
f = true;
return f;
}

try {
PackageInfo pi = PkrssActivity.s_pkrss.getPackageManager().getPackageInfo(packageName, 0);

Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);

List<ResolveInfo> apps = PkrssActivity.s_pkrss.getPackageManager().queryIntentActivities(resolveIntent, 0);

ResolveInfo ri = apps.iterator().next();
if (ri != null) {
if (ri.activityInfo.name == className)
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {

}
return f;
}



2.enum installed application list

    private static JSONArray fetch_installed_apps() {
List<ApplicationInfo> packages = PkrssActivity.s_pkrss.getPackageManager().getInstalledApplications(0);
JSONArray ret = new JSONArray();
Iterator<ApplicationInfo> l = packages.iterator();
while (l.hasNext()) {
try {
ApplicationInfo app = (ApplicationInfo) l.next();
String label = "";
label = PkrssActivity.s_pkrss.getPackageManager().getApplicationLabel(app).toString();
JSONObject obj = new JSONObject();
obj.put("name", label); // app.name
obj.put("id", app.packageName);

obj.put("backupAgentName", app.backupAgentName);
obj.put("className", app.className);
obj.put("dataDir", app.dataDir);
obj.put("descriptionRes", app.descriptionRes);
obj.put("enabled", app.enabled);
obj.put("flags", app.flags);
obj.put("icon", app.icon);
//obj.put("installLocation", app.installLocation);
obj.put("labelRes", app.labelRes);
//obj.put("logo", app.logo);
obj.put("manageSpaceActivityName", app.manageSpaceActivityName);
obj.put("metaData", app.metaData);
//obj.put("name", (app.name!=null ? app.name : ""));
//obj.put("nativeLibraryDir", app.nativeLibraryDir);
obj.put("nonLocalizedLabel", app.nonLocalizedLabel);
obj.put("packageName", app.packageName);
obj.put("permission", app.permission);
obj.put("processName", app.processName);
obj.put("publicSourceDir", app.publicSourceDir);
//obj.put("resourceDirs", app.resourceDirs());
obj.put("sharedLibraryFiles", app.sharedLibraryFiles);
obj.put("sourceDir", app.sourceDir);
obj.put("targetSdkVersion", app.targetSdkVersion);
obj.put("taskAffinity", app.taskAffinity);
obj.put("theme", app.theme);
obj.put("uid", app.uid);

ret.put(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
return ret;
}



3.enum activity in package

    private static JSONArray fetch_app_class(String packageName) {
JSONArray ret = new JSONArray();

PackageManager pManager = PkrssActivity.s_pkrss.getPackageManager();
PackageInfo packageInfo = pManager.getPackageArchiveInfo(packageName,PackageManager.GET_ACTIVITIES);
ActivityInfo[] activityInfos = packageInfo.activities;
ActivityInfo activityInfo;
try{
for(int i=0,c=activityInfos.length;i<c;++i){
activityInfo = activityInfos[i];
JSONObject obj = new JSONObject();
obj.put("packageName", activityInfo.packageName);
obj.put("name",activityInfo.name);
ret.put(obj);
}
}catch (Exception e) {
e.printStackTrace();
}
return ret;
}



4.start activity by package name and class name

String packageName = args.getString(0);
String className = args.optString(1);
// openApp(packageName,className);

Intent intent = new Intent();
if(className.isEmpty() || (className=="null")){
intent = PkrssActivity.s_pkrss.getPackageManager().getLaunchIntentForPackage(packageName);
}else{
intent = new Intent();
intent.setClassName(packageName, className);
}
if(intent != null)
PkrssActivity.s_pkrss.startActivity(intent);
return true;




 


5.start activity by action name

String actionName = args.getString(0);
Intent intent = new Intent();
intent.setAction(actionName);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PkrssActivity.s_pkrss.startActivity(intent);
return true;


6.open url activity

    private static void openIntentUrl(String url) {
if ((url == null) || (url.length() == 0))
return;
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
PkrssActivity.s_pkrss.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}



7.install apk by url

    public static void installWebApk(String url) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse(url), "application/vnd.android.package-archive");
PkrssActivity.s_pkrss.startActivity(i);
}

用于主题检测的临时日志(f18ccd1f-f4a3-4438-b2f2-3568de5022da - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

这是一个未删除的临时日志。请手动删除它。(ae3b4256-dfea-4d7b-939a-3c5e6e3dc579 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

Friday, November 8, 2013

add login for owncloud with your system - developer

1.why

   our project need implement cloud store,then we found owncloud and found there are many same requirement with our needs.

   but owncloud is one private cloud store program,there is not easy way to used in our project.our project have ourself user back-end.

2.Finding solutions

   by search engine,there is only asked for how to used openid plugin in owncloud,no other people can answer it perfect.

3.draft solution 1 – openid plugin

this set of solution is the subjective ideals,no confirm it can worked.

3.1 our project access the owncloud's open id url a,this url have username and password param,and it can register and verify login in background.

3.2 our log

      login in owncloud with administrate account,and create one new user by manual,with browser trace,we found it access "owncloud/index.php/settings/ajax/createuser.php", look this source file,found "OC_User::createUser" keywords,the search "createUser" keyword in owncloud\ director,we only found some create user login and some hook logics.

4.design our sourtion 2 – write code

4.1 ideas

    createuser.php

         params:

    username: string eg:"abc"

    passsword: string eg:"password"

description: program background create user and password

    login.php

          params:

    username: string eg:"abc"

    passsword: string eg:"password"

description:program backoung login

4.2 implememts:

index.php

<?php

// this value need same as in your owncloud\config\config.php key:instanceid
session_name("5257a5ababba4");

session_start();

// this value need same as createuser.htm find string "requesttoken"
$_SESSION['requesttoken'] = "a68ad041fd5e5f1ac439";

if(isset($_GET["type"]) && ($_GET["type"]=="login")){
// this value need same as your admin account
unset($_SESSION['user_id']);
}else{
// this value need same as your admin account
$_SESSION['user_id'] = "admin";
include( "createuser.htm" );
}

?>




createuser.htm:

<!DOCTYPE html>
<head>
<title>ownCloud</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
<script src="http://malsup.github.com/jquery.form.js"></script>

</head>

<body id="body-login">
<div>
<pre>
This sample is only to test for owncloud's register and login system.
1.change the source file "createuser.htm",find and replace "../owncloud2" to your owncloud path.
change the source file "index.php",find and change "session_name","user_id" by your owncloud setting.
2.write new user name and password,then click regist, this step can register one new account for your owncloud.
3.then click login,this step can used your writed user name and password to login in owncloud.
Write by pkrss,mail to:liandeliang@gmail.com
</pre>
</div>
<div id="register">
<form id="myForm" method="post" action="../owncloud2/index.php/settings/ajax/createuser.php">
<fieldset>
<ul>
</ul>
<p class="infield grouptop">
<label for="user" class="infield" for="username">User name</label>
<input type="text" name="username" id="username" placeholder="" value="" autofocus autocomplete="on" required/>
</p>

<p class="infield groupbottom">
<label for="password" class="infield" for="password">Password</label>
<input type="password" name="password" id="password" value="" placeholder="" required />
<input type="hidden" name="requesttoken" id="requesttoken" value="a68ad041fd5e5f1ac439" placeholder="" required />
</p>
<input type="submit" id="submit" value="Register"/> &nbsp;&nbsp;
</fieldset>
</form>

<input type="submit" id="refresh" value="Refresh"/> &nbsp;&nbsp;
<input type="submit" id="submit2" value="Login"/>
</div>

<div style="display:none">
<form id="loginForm" method="post" action="../owncloud2/">
<input type="hidden" name="user" id="username2" required/>
<input type="password" name="password" id="password2" required style="display:none"/>
<input type="hidden" name="remember_login" value="1" id="remember_login" checked="true" original-title="">
<input type="hidden" name="timezone-offset" value="8" required/>
<input type="hidden" name="requesttoken" value="a68ad041fd5e5f1ac439" placeholder="" required />
<input type="submit" id="submit3" value="Login" style="display:none"/>
</form>
</div>

<script type="text/javascript">
$(document).ready(function() {
$('
#refresh').click(function(){
location.reload();
return false;
});
$('
#submit2').click(function(){
$.ajax({
type: "POST",
url: "index.php?type=login",
complete: function(msg){
$("#username2").val($("#username").val());
$("#password2").val($("#password").val());
setTimeout(function(){
// return;
if(1){
$('
#submit3').click();
}else if(1){
$('
#loginForm').ajaxForm();
}else{
$.ajax({
type: "POST",
url: "../owncloud2/",
data: {
"username":$("#username").val(),
"password":$("#password").val(),
"remember_login":1,
"timezone-offset":8
}
});
}
});
}
});
// 1. index.php?type=login
// 2. http://localhost/t/owncloud2/
return false;
});
$('
#myForm').ajaxForm(function(data) {
alert(data.data.message || "Operator OK");
});
});
</script>
</body>
</html>




about this code:

                This sample is only to test for owncloud's register and login system.
1.change the source file "createuser.htm",find and replace "../owncloud2" to your owncloud path.
change the source file "index.php",find and change "session_name","user_id" by your owncloud setting.
2.write new user name and password,then click regist, this step can register one new account for your owncloud.
3.then click login,this step can used your writed user name and password to login in owncloud.
Write by pkrss,mail to:liandeliang@gmail.com

Tuesday, November 5, 2013

php openid test log

1.test examples/discover.php

1.1 error

when i test http://localhost/t/php-openid/examples/discover.php

and used bellow for "Enter an OpenID URL to begin discovery":

http://localhost/t/php-openid/examples/server/server.php



,get this error:

Got no response code when fetching https://localhost:80/t/php-openid/examples/server/server.php/idpXrds
CURL error (35): error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

fixed:


then i changed above URL to:

https://localhost/t/php-openid/examples/server/server.php






1.2 error


then get bellow error message:

Got no response code when fetching https://localhost/t/php-openid/examples/server/server.php
CURL error (60): SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
fixed:
add one line in php-openid\Auth\Yadis\ParanoidHTTPFetcher.php line:130
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);



windows8 javascript metro application cannot debug (draft)

1.error

1>框架: Microsoft.WinJS.1.0/neutral,当前未安装应用程序包版本 1.0.9200.20789。
1>正在安装缺少的框架...
1>错误 : DEP0800 : 所需框架“C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\Microsoft.WinJS.1.0\1.0\Microsoft.WinJS.1.0.appx”安装失败。
1>错误 0xC0020017: 在安装 Microsoft.WinJS.1.0_1.0.9200.20789_neutral__8wekyb3d8bbwe 时,windows.licensing 无法启动 WSService。请重试,如果问题仍然存在,请联系程序包发布者。
1>将应用程序部署到目标设备失败。
========== 部署: 成功 0 个,失败 1 个,跳过 0 个 ==========



2.fixed:


no method now


3.other try method log



3.1 run

wsreset.exe

not fixed it.


3.2 clean up all files in

C:\Windows\SoftwareDistribution\Download

not fixed it


3.3 Run the Modern UI App troubleshooter and check if it helps.


http://download.microsoft.com/download/F/2/4/F24D0C03-4181-4E5B-A23B-5C3A6B5974E3/apps.diagcab

not fixed it

3.4 remove package by powershell

For futur people that will have this issue I found a clean solution with no need to logout or to change the GUID:

Run powershell as administrator :

Get-AppxPackage

and copy the package name of your app

Remove-AppxPackage yourpackagename

result:

PS C:\Users\德亮> Remove-AppxPackage  Microsoft.WinJS.1.0_1.0.9200.20602_neutral__8wekyb3d8bbwe
Remove-AppxPackage : 部署失败,原因是 HRESULT: 0x80073CF3, 包无法进行更新、相关性或冲突验证。 (异常来自 HRESULT:0x80073
CF3)
Windows 无法删除框架 Microsoft.WinJS.1.0_1.0.9200.20602_neutral__8wekyb3d8bbwe,因为程序包 microsoft.windowscommunicat
ionsapps Microsoft.ZuneMusic Microsoft.XboxLIVEGames Microsoft.BingSports Microsoft.ZuneVideo Microsoft.Bing microsoft.
microsoftskydrive Microsoft.BingWeather Microsoft.BingFinance Microsoft.BingNews microsoft.windowsphotos Microsoft.Bing
Travel 19534Dalmatian.25365C9F24890 当前依赖于该框架。如果删除所有依赖于该框架的程序包,则会自动删除该框架。
注: 有关其他信息,请在事件日志中查找 [ActivityId] b05497fe-c8ca-0003-3a2d-75b0cac8ce01,或使用命令行 Get-AppxLog -Activ
ityID b05497fe-c8ca-0003-3a2d-75b0cac8ce01
所在位置 行:1 字符: 1
+ Remove-AppxPackage Microsoft.WinJS.1.0_1.0.9200.20602_neutral__8wekyb3d8bbwe
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (Microsoft.WinJS...__8wekyb3d8bbwe:String) [Remove-AppxPackage], IOException
+ FullyQualifiedErrorId : DeploymentError,Microsoft.Windows.Appx.PackageManager.Commands.RemoveAppxPackageCommand



 





not successed to operatored this

2013年中国移动全球合作伙伴大会,诚邀您出席!

Content-Type: text/html; charset = "GB2312"
Content-Transfer-Encoding: base64

PHRhYmxlIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hLCBnZW5ldmEsIHNhbnMtc2VyaWY7IiBh
bGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZjZmNmY2IiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIw
IiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjcwMCI+DQo8dGJvZHk+DQo8dHI+DQo8dGQ+PGltZyBz
cmM9Imh0dHA6Ly9kZXYuMTAwODYuY24vY21kbi9zdXBlc2l0ZS9hdHRhY2htZW50cy9sYXJnZWlu
Zm9ybV9hdHRhY2htZW50cy8xMzEwMjkvMjAxMzEwMjlfNTM4ZTE4NDQwNmZhMzEyMmQwYjg2OTM5
ODRfMzc1NTM2Mi5qcGciIGhlaWdodD0iMjAwIiB3aWR0aD0iNzAwIiAvPg0KIDwvdGQ+PC90cj4N
Cjx0cj4NCjx0ZD48aW1nIGFsdD0i0fvH67qvLUludml0YXRpb24iIHNyYz0iaHR0cDovL2Rldi4x
MDA4Ni5jbi9kZXZfbXVsdV9zY195dW55aW5nL25ld3NsZXR0ZXIvMjAxMTExL2NnZGMvY2dkY3lx
aF8wNi5wbmciIGhlaWdodD0iMTE2IiB3aWR0aD0iNzAwIiAvPg0KIDwvdGQ+PC90cj4NCjx0cj4N
Cjx0ZD4NCjx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIxIiBj
ZWxsc3BhY2luZz0iMSIgd2lkdGg9Ijk1JSI+DQo8dGJvZHk+DQo8dHI+DQo8dGQgc3R5bGU9ImZv
bnQtZmFtaWx5OnZlcmRhbmEsIGdlbmV2YSwgc2Fucy1zZXJpZjtjb2xvcjojNjY2O2ZvbnQtc2l6
ZToxNHB4OyI+DQo8cCBzdHlsZT0iY29sb3I6I2VkNWIwYjtmb250LXNpemU6MThweDsiPtfwvrS1
xLrP1/e777Dpo7o8L3A+DQo8cCBzdHlsZT0idGV4dC1pbmRlbnQ6MjhweDtjb2xvcjojNjY2OyI+
zqq9+NK7sr2808e/svrStcn6zKy6z9f3o6zTrb3TNEfKsbT6us3Sxravu6XBqs340MK8zdSqtcS1
vcC0o6zW0Ln60sa2r82o0MW8r83FuavLvr2r09oyMDEzxOoxMtTCMTctMTnI1dTa1tC5+rnj1t2x
o8D7ysDDs7KpwMC53dXZv6qhsDIwMTPW0Ln60sa2r8irx/K6z9f3u++w6bTzu+GhsaOs0tQi0sa2
r7jEseTJ+rvub7vjvtu0tNDCtcTBpsG/Is6q1vfM4qOsubLJzLzTx7+6z9f3o6y02b341tC5+jRH
svrStbrN0sa2r7ulwarN+L2hv7W3otW5o6zKtc/WsvrStbrP1/e5stOuo6zNrMbavavX6davyKu5
+tbVtsuy+sa3vbvS17Tzu+GhozwvcD4NCjxwIHN0eWxlPSJ0ZXh0LWluZGVudDoyOHB4O2NvbG9y
OiM2NjY7Ij7O0sPH1eazz7XY0fvH68T61/fOqrzOsfaz9s+vsb60zrTzu+GjrLKiuae68sT6tcS1
vcC0o6E8L3A+DQo8cCBzdHlsZT0idGV4dC1pbmRlbnQ6MjhweDtjb2xvcjojZjAwOyI+wu3Jz7Go
w/ujujxhIGhyZWY9Imh0dHA6Ly9kZXYuMTAwODYuY24vMjAxMy8iPmh0dHA6Ly9kZXYuMTAwODYu
Y24vMjAxMy88L2E+IDwvcD4NCjxiciAvPg0KPC90ZD48L3RyPg0KPC90Ym9keT48L3RhYmxlPjwv
dGQ+PC90cj4NCjx0cj4NCjx0ZD48aW1nIGFsdD0itPO74dLps8wiIHNyYz0iaHR0cDovL2Rldi4x
MDA4Ni5jbi9jbWRuL3N1cGVzaXRlL2F0dGFjaG1lbnRzL2xhcmdlaW5mb3JtX2F0dGFjaG1lbnRz
LzEzMTAzMS8yMDEzMTAzMV8wMzY0NjgwN2JkMmMwNjQyMGJiMDk2NDQ5OF8zNzU1MzYyLnBuZyIg
aGVpZ2h0PSI1MDAiIHdpZHRoPSI3MDAiIC8+DQogPC90ZD48L3RyPg0KPHRyPg0KPHRkIHN0eWxl
PSJmb250LWZhbWlseTp2ZXJkYW5hLCBnZW5ldmEsIHNhbnMtc2VyaWY7Y29sb3I6IzY2Njtmb250
LXNpemU6MTRweDsiPjxwIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0O2NvbG9yOiM2NjY7Ij7W0Ln6
0sa2r7+qt6LV38nnx/g8L3A+PC90ZD4NCjwvdHI+DQo8L3Rib2R5PjwvdGFibGU+DQo8dGFibGUg
YWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2Y2ZjZmNiIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0i
MSIgY2VsbHNwYWNpbmc9IjEiIHdpZHRoPSI3MDAiPg0KPHRib2R5Pg0KPHRyPg0KPHRkIGhlaWdo
dD0iMTIiPiZuYnNwOzwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PGJyLz48YnIvPtLyzqrE+tT4
vq3XorLhs8nOqtbQufrSxravv6q3otXfyefH+LXE08O7p6Osy/nS1MT6u+HK1bW91eK34tPKvP6h
o87Sw8exo9akvfbP8sT6t6LLzbnY09rW0Ln60sa2r7+qt6LV38nnx/jXytG2vLC3/s7xtcS159fT
08q8/qGj1tC5+tLGtq+/qrei1d/J58f41/DW2LKisaO7pMT6tcTS/su9oaMNCs6qyLexo87Sw8e1
xLf+zvHQxc+isruxu7Wx1/bArLv408q8/rSmwO2jrMfrsNEgYXBzZXJ2aWNlQDEzOS5jb20gzO28
086qxPq1xMGqz7XIy6GjDQrI57n7xPqyu9S40uK8zND4vdPK1cC019TW0Ln60sa2r7+qt6LV38nn
x/i1xNfUtq+2qdTE08q8/qOsx+u147v3PGEgaHJlZj0naHR0cDovL2Rldi4xMDA4Ni5jbi9jbWRu
L3N1cGVzaXRlL25ld2Rldi5sb2dpbm91dC5waHA/ZnJvbT1vcmRlcmVtYWlsJyB0YXJnZXQ9J19i
bGFuayc+zcu2qdPKvP48L2E+oaMNCsjnufvE+s/rtqnUxLj8tuC78rj80MLE+sv5tqnUxLXE08q8
/sHQse2jrMfrteO79zxhIGhyZWY9J2h0dHA6Ly9kZXYuMTAwODYuY24vY21kbi9zdXBlc2l0ZS9u
ZXdkZXYubG9naW5vdXQucGhwP2Zyb209b3JkZXJlbWFpbCcgdGFyZ2V0PSdfYmxhbmsnPrj80MLO
0rXE08q8/rap1MQ8L2E+oaMNCg==