From a07e6a000df6ce6ed5a60d11b21ad134991a3c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=AE=9A=E8=A1=A2?= <1945594101@qq.com> Date: Tue, 11 Apr 2023 21:23:08 +0800 Subject: [PATCH 01/20] 1 --- 测试.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 测试.txt diff --git a/测试.txt b/测试.txt new file mode 100644 index 0000000..e69de29 -- 2.34.1 From 41ccecf5b1729db581067a1d87efa28489041868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=AE=9A=E8=A1=A2?= <1945594101@qq.com> Date: Tue, 11 Apr 2023 21:39:38 +0800 Subject: [PATCH 02/20] 1551 --- doc/doc.txt | 1 + 测试.txt | 0 2 files changed, 1 insertion(+) delete mode 100644 测试.txt diff --git a/doc/doc.txt b/doc/doc.txt index e69de29..033c203 100644 --- a/doc/doc.txt +++ b/doc/doc.txt @@ -0,0 +1 @@ +bhbhjbh \ No newline at end of file diff --git a/测试.txt b/测试.txt deleted file mode 100644 index e69de29..0000000 -- 2.34.1 From 7e2591d69a133611eb4c49ea5443fb7948488a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=AE=9A=E8=A1=A2?= <1945594101@qq.com> Date: Tue, 11 Apr 2023 21:57:19 +0800 Subject: [PATCH 03/20] wo --- gitproject | 1 + 1 file changed, 1 insertion(+) create mode 160000 gitproject diff --git a/gitproject b/gitproject new file mode 160000 index 0000000..4f1a66f --- /dev/null +++ b/gitproject @@ -0,0 +1 @@ +Subproject commit 4f1a66f8d4d3a661930220f342dcc488ea2d5b6d -- 2.34.1 From c983c124eb1742958c768f9cce68ab5a77b52878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=AE=9A=E8=A1=A2?= <1945594101@qq.com> Date: Tue, 11 Apr 2023 21:59:23 +0800 Subject: [PATCH 04/20] 123 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1607337..e473f5f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# gitproject +61561# gitproject -- 2.34.1 From 6757a90bda48cc92301630c5b46db33ea233e93c Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Tue, 11 Apr 2023 22:29:45 +0800 Subject: [PATCH 05/20] 1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e473f5f..9ac76bf 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -61561# gitproject +161561# gitproject -- 2.34.1 From 3cd340d5880b22f06edb69d75cec6b8585e9080a Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Wed, 19 Apr 2023 20:12:56 +0800 Subject: [PATCH 06/20] 1 --- gtask/data/MetaData.java | 104 +++ gtask/data/Node.java | 90 ++ gtask/data/SqlData.java | 224 +++++ gtask/data/SqlNote.java | 577 +++++++++++++ gtask/data/Task.java | 323 +++++++ gtask/data/TaskList.java | 370 ++++++++ gtask/exception/ActionFailureException.java | 32 + gtask/exception/NetworkFailureException.java | 33 + gtask/remote/GTaskASyncTask.java | 102 +++ gtask/remote/GTaskClient.java | 612 ++++++++++++++ gtask/remote/GTaskManager.java | 846 +++++++++++++++++++ gtask/remote/GTaskSyncService.java | 124 +++ 12 files changed, 3437 insertions(+) create mode 100644 gtask/data/MetaData.java create mode 100644 gtask/data/Node.java create mode 100644 gtask/data/SqlData.java create mode 100644 gtask/data/SqlNote.java create mode 100644 gtask/data/Task.java create mode 100644 gtask/data/TaskList.java create mode 100644 gtask/exception/ActionFailureException.java create mode 100644 gtask/exception/NetworkFailureException.java create mode 100644 gtask/remote/GTaskASyncTask.java create mode 100644 gtask/remote/GTaskClient.java create mode 100644 gtask/remote/GTaskManager.java create mode 100644 gtask/remote/GTaskSyncService.java diff --git a/gtask/data/MetaData.java b/gtask/data/MetaData.java new file mode 100644 index 0000000..0f33467 --- /dev/null +++ b/gtask/data/MetaData.java @@ -0,0 +1,104 @@ +package net.micode.notes.gtask.data; + +public class MetaData extends Task { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + */ + private final static String TAG = MetaData.class.getSimpleName(); + private String mRelatedGid = null; + /* + * 功能描述:设置数据,即生成元数据库 + * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 + * 参数注解: + */ + public void setMeta(String gid, JSONObject metaInfo) + { + //对函数块进行注释 + try { + metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); + /* + * 将这对键值放入metaInfo这个jsonobject对象中 + */ + } catch (JSONException e) { + Log.e(TAG, "failed to put related gid"); + /* + * 输出错误信息 + */ + } + setNotes(metaInfo.toString()); + setName(GTaskStringUtils.META_NOTE_NAME); + } + /* + * 功能描述:获取相关联的Gid + */ + public String getRelatedGid() { + return mRelatedGid; + } + /* + * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 + * Made By CuiCan + */ + @Override + public boolean isWorthSaving() { + return getNotes() != null; + } + /* + * 功能描述:使用远程json数据对象设置元数据内容 + * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 + * 参数注解: + */ + @Override + public void setContentByRemoteJSON(JSONObject js) { + super.setContentByRemoteJSON(js); + if (getNotes() != null) { + try { + JSONObject metaInfo = new JSONObject(getNotes().trim()); + mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); + } catch (JSONException e) { + Log.w(TAG, "failed to get related gid"); + /* + * 输出警告信息 + */ + mRelatedGid = null; + } + } + } + /* + * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public void setContentByLocalJSON(JSONObject js) { + // this function should not be called + throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); + /* + * 传递非法参数异常 + */ + } + /* + * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public JSONObject getLocalJSONFromContent() { + throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); + /* + * 传递非法参数异常 + * Made By Cui Can + */ + } + /* + * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public int getSyncAction(Cursor c) { + throw new IllegalAccessError("MetaData:getSyncAction should not be called"); + /* + * 传递非法参数异常 + * Made By Cui Can + */ + } + +} \ No newline at end of file diff --git a/gtask/data/Node.java b/gtask/data/Node.java new file mode 100644 index 0000000..47f7461 --- /dev/null +++ b/gtask/data/Node.java @@ -0,0 +1,90 @@ +package net.micode.notes.gtask.data; + +import android.database.Cursor; + +import org.json.JSONObject; + +/** + * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 + * 关键字:abstract + */ +public abstract class Node { + //定义了各种用于表征同步状态的常量 + public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) + + public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 + + public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 + + public static final int SYNC_ACTION_DEL_REMOTE = 3;// 需要在远程云端删除内容 + + public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 + + public static final int SYNC_ACTION_UPDATE_REMOTE = 5;// 需要将本地内容更新到远程云端 + + public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 + + public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 + + public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 + + private String mGid; + + private String mName; + + private long mLastModified;//记录最后一次修改时间 + + private boolean mDeleted;//表征是否被删除 + + public Node() { + mGid = null; + mName = ""; + mLastModified = 0; + mDeleted = false; + } + + public abstract JSONObject getCreateAction(int actionId); + + public abstract JSONObject getUpdateAction(int actionId); + + public abstract void setContentByRemoteJSON(JSONObject js); + + public abstract void setContentByLocalJSON(JSONObject js); + + public abstract JSONObject getLocalJSONFromContent(); + + public abstract int getSyncAction(Cursor c); + + public void setGid(String gid) { + this.mGid = gid; + } + + public void setName(String name) { + this.mName = name; + } + + public void setLastModified(long lastModified) { + this.mLastModified = lastModified; + } + + public void setDeleted(boolean deleted) { + this.mDeleted = deleted; + } + + public String getGid() { + return this.mGid; + } + + public String getName() { + return this.mName; + } + + public long getLastModified() { + return this.mLastModified; + } + + public boolean getDeleted() { + return this.mDeleted; + } + +} \ No newline at end of file diff --git a/gtask/data/SqlData.java b/gtask/data/SqlData.java new file mode 100644 index 0000000..f47546a --- /dev/null +++ b/gtask/data/SqlData.java @@ -0,0 +1,224 @@ +/* + * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 + * SqlData其实就是也就是所谓数据中的数据 + */ + +package net.micode.notes.gtask.data; +/* + * 功能描述: + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + +public class SqlData { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + * Made By CuiCan + */ + private static final String TAG = SqlData.class.getSimpleName(); + + private static final int INVALID_ID = -99999;//为mDataId置初始值-99999 + + + /** + * 来自Notes类中定义的DataColumn中的一些常量 + */ + + // 集合了interface DataColumns中所有SF常量 + public static final String[] PROJECTION_DATA = new String[] { + DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, + DataColumns.DATA3 + }; + + /** + * 以下五个变量作为sql表中5列的编号 + */ + public static final int DATA_ID_COLUMN = 0; + + public static final int DATA_MIME_TYPE_COLUMN = 1; + + public static final int DATA_CONTENT_COLUMN = 2; + + public static final int DATA_CONTENT_DATA_1_COLUMN = 3; + + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; + + private ContentResolver mContentResolver; + //判断是否直接用Content生成,是为true,否则为false + private boolean mIsCreate; + + private long mDataId; + + private String mDataMimeType; + + private String mDataContent; + + private long mDataContentData1; + + private String mDataContentData3; + + private ContentValues mDiffDataValues; + + /* + * 功能描述:构造函数,用于初始化数据 + * 参数注解:mContentResolver用于获取ContentProvider提供的数据 + * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) + * 参数注解: + * Made By CuiCan + */ + public SqlData(Context context) { + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mDataId = INVALID_ID;//mDataId置初始值-99999 + mDataMimeType = DataConstants.NOTE; + mDataContent = ""; + mDataContentData1 = 0; + mDataContentData3 = ""; + mDiffDataValues = new ContentValues(); + } + + + /* + * 功能描述:构造函数,初始化数据 + * 参数注解:mContentResolver用于获取ContentProvider提供的数据 + * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) + * 参数注解: + * Made By CuiCan + */ + public SqlData(Context context, Cursor c) { + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDiffDataValues = new ContentValues(); + } + + /* + * 功能描述:从光标处加载数据 + * 从当前的光标处将五列的数据加载到该类的对象 + * Made By CuiCan + */ + private void loadFromCursor(Cursor c) { + mDataId = c.getLong(DATA_ID_COLUMN); + mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); + mDataContent = c.getString(DATA_CONTENT_COLUMN); + mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); + mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); + } + + + /* + * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 + * 参数注解: + * Made By CuiCan + */ + public void setContent(JSONObject js) throws JSONException { + //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + if (mIsCreate || mDataId != dataId) { + mDiffDataValues.put(DataColumns.ID, dataId); + } + mDataId = dataId; + + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) + : DataConstants.NOTE; + if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { + mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); + } + mDataMimeType = dataMimeType; + + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; + if (mIsCreate || !mDataContent.equals(dataContent)) { + mDiffDataValues.put(DataColumns.CONTENT, dataContent); + } + mDataContent = dataContent; + + long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; + if (mIsCreate || mDataContentData1 != dataContentData1) { + mDiffDataValues.put(DataColumns.DATA1, dataContentData1); + } + mDataContentData1 = dataContentData1; + + String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; + if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { + mDiffDataValues.put(DataColumns.DATA3, dataContentData3); + } + mDataContentData3 = dataContentData3; + } + + + /* + * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 + * 参数注解: + * Made By CuiCan + */ + public JSONObject getContent() throws JSONException { + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + //创建JSONObject对象。并将相关数据放入其中,并返回。 + JSONObject js = new JSONObject(); + js.put(DataColumns.ID, mDataId); + js.put(DataColumns.MIME_TYPE, mDataMimeType); + js.put(DataColumns.CONTENT, mDataContent); + js.put(DataColumns.DATA1, mDataContentData1); + js.put(DataColumns.DATA3, mDataContentData3); + return js; + } + + /* + * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 + * 参数注解: + * Made By CuiCan + */ + public void commit(long noteId, boolean validateVersion, long version) { + + if (mIsCreate) { + if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { + mDiffDataValues.remove(DataColumns.ID); + } + + mDiffDataValues.put(DataColumns.NOTE_ID, noteId); + Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); + try { + mDataId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + } else { + if (mDiffDataValues.size() > 0) { + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); + } else { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { + String.valueOf(noteId), String.valueOf(version) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + } + + mDiffDataValues.clear(); + mIsCreate = false; + } + + /* + * 功能描述:获取当前id + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + public long getId() { + return mDataId; + } +} \ No newline at end of file diff --git a/gtask/data/SqlNote.java b/gtask/data/SqlNote.java new file mode 100644 index 0000000..c669db2 --- /dev/null +++ b/gtask/data/SqlNote.java @@ -0,0 +1,577 @@ +/* + * Description:用于支持小米便签最底层的数据库相关操作,和sqldata的关系上是父集关系,即note是data的子父集。 + * 和SqlData相比,SqlNote算是真正意义上的数据了。 + */ + +package net.micode.notes.gtask.data; +/* + * 功能描述: + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + +public class SqlNote { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + * Made By CuiCan + */ + private static final String TAG = SqlNote.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + // 集合了interface NoteColumns中所有SF常量(17个) + public static final String[] PROJECTION_NOTE = new String[] { + NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, + NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, + NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, + NoteColumns.VERSION + }; + + //以下设置17个列的编号 + public static final int ID_COLUMN = 0; + + public static final int ALERTED_DATE_COLUMN = 1; + + public static final int BG_COLOR_ID_COLUMN = 2; + + public static final int CREATED_DATE_COLUMN = 3; + + public static final int HAS_ATTACHMENT_COLUMN = 4; + + public static final int MODIFIED_DATE_COLUMN = 5; + + public static final int NOTES_COUNT_COLUMN = 6; + + public static final int PARENT_ID_COLUMN = 7; + + public static final int SNIPPET_COLUMN = 8; + + public static final int TYPE_COLUMN = 9; + + public static final int WIDGET_ID_COLUMN = 10; + + public static final int WIDGET_TYPE_COLUMN = 11; + + public static final int SYNC_ID_COLUMN = 12; + + public static final int LOCAL_MODIFIED_COLUMN = 13; + + public static final int ORIGIN_PARENT_ID_COLUMN = 14; + + public static final int GTASK_ID_COLUMN = 15; + + public static final int VERSION_COLUMN = 16; + + //一下定义了17个内部的变量,其中12个可以由content中获得,5个需要初始化为0或者new + private Context mContext; + + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + private long mId; + + private long mAlertDate; + + private int mBgColorId; + + private long mCreatedDate; + + private int mHasAttachment; + + private long mModifiedDate; + + private long mParentId; + + private String mSnippet; + + private int mType; + + private int mWidgetId; + + private int mWidgetType; + + private long mOriginParent; + + private long mVersion; + + private ContentValues mDiffNoteValues; + + private ArrayList mDataList; + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + //构造函数只有context,对所有的变量进行初始化 + public SqlNote(Context context) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mId = INVALID_ID; + mAlertDate = 0; + mBgColorId = ResourceParser.getDefaultBgId(context); + mCreatedDate = System.currentTimeMillis();//调用系统函数获得创建时间 + mHasAttachment = 0; + mModifiedDate = System.currentTimeMillis();//最后一次修改时间初始化为创建时间 + mParentId = 0; + mSnippet = ""; + mType = Notes.TYPE_NOTE; + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + mOriginParent = 0; + mVersion = 0; + mDiffNoteValues = new ContentValues(); + mDataList = new ArrayList(); + } + + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + //构造函数有context和一个数据库的cursor,多数变量通过cursor指向的一条记录直接进行初始化 + public SqlNote(Context context, Cursor c) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDataList = new ArrayList(); + // + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + } + + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + public SqlNote(Context context, long id) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(id); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + + } + + /* + * 功能描述:通过id从光标处加载数据 + * Made By CuiCan + */ + private void loadFromCursor(long id) { + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(id) + }, null);//通过id获得对应的ContentResolver中的cursor + if (c != null) { + c.moveToNext(); + loadFromCursor(c);//然后加载数据进行初始化,这样函数 + //SqlNote(Context context, long id)与SqlNote(Context context, long id)的实现方式基本相同 + } else { + Log.w(TAG, "loadFromCursor: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + /* + * 功能描述:通过游标从光标处加载数据 + * Made By CuiCan + */ + private void loadFromCursor(Cursor c) { + //直接从一条记录中的获得以下变量的初始值 + mId = c.getLong(ID_COLUMN); + mAlertDate = c.getLong(ALERTED_DATE_COLUMN); + mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = c.getLong(CREATED_DATE_COLUMN); + mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); + mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); + mParentId = c.getLong(PARENT_ID_COLUMN); + mSnippet = c.getString(SNIPPET_COLUMN); + mType = c.getInt(TYPE_COLUMN); + mWidgetId = c.getInt(WIDGET_ID_COLUMN); + mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); + mVersion = c.getLong(VERSION_COLUMN); + } + + /* + * 功能描述:通过content机制获取共享数据并加载到数据库当前游标处 + * 参数注解: + * Made By CuiCan + */ + private void loadDataContent() { + Cursor c = null; + mDataList.clear(); + try { + c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, + "(note_id=?)", new String[] { + String.valueOf(mId) + }, null); + if (c != null) { + if (c.getCount() == 0) { + Log.w(TAG, "it seems that the note has not data"); + return; + } + while (c.moveToNext()) { + SqlData data = new SqlData(mContext, c); + mDataList.add(data); + } + } else { + Log.w(TAG, "loadDataContent: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + /* + * 功能描述:设置通过content机制用于共享的数据信息 + * 参数注解: + * Made By CuiCan + */ + public boolean setContent(JSONObject js) { + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + Log.w(TAG, "cannot set system folder"); + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + // for folder we can only update the snnipet and type + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; + if (mIsCreate || mId != id) { + mDiffNoteValues.put(NoteColumns.ID, id); + } + mId = id; + + long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note + .getLong(NoteColumns.ALERTED_DATE) : 0; + if (mIsCreate || mAlertDate != alertDate) { + mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); + } + mAlertDate = alertDate; + + int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note + .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); + if (mIsCreate || mBgColorId != bgColorId) { + mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); + } + mBgColorId = bgColorId; + long createDate = note.has(NoteColumns.CREATED_DATE) ? note + .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mCreatedDate != createDate) { + mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); + } + mCreatedDate = createDate; + + int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note + .getInt(NoteColumns.HAS_ATTACHMENT) : 0; + if (mIsCreate || mHasAttachment != hasAttachment) { + mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); + } + mHasAttachment = hasAttachment; + + long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note + .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mModifiedDate != modifiedDate) { + mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); + } + mModifiedDate = modifiedDate; + + long parentId = note.has(NoteColumns.PARENT_ID) ? note + .getLong(NoteColumns.PARENT_ID) : 0; + if (mIsCreate || mParentId != parentId) { + mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); + } + mParentId = parentId; + + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + + int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) + : AppWidgetManager.INVALID_APPWIDGET_ID; + if (mIsCreate || mWidgetId != widgetId) { + mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); + } + mWidgetId = widgetId; + + int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note + .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; + if (mIsCreate || mWidgetType != widgetType) { + mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); + } + mWidgetType = widgetType; + + long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note + .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; + if (mIsCreate || mOriginParent != originParent) { + mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); + } + mOriginParent = originParent; + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + SqlData sqlData = null; + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + for (SqlData temp : mDataList) { + if (dataId == temp.getId()) { + sqlData = temp; + } + } + } + + if (sqlData == null) { + sqlData = new SqlData(mContext); + mDataList.add(sqlData); + } + + sqlData.setContent(data); + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } + return true; + } + + /* + * 功能描述:获取content机制提供的数据并加载到note中 + * 参数注解: + * Made By CuiCan + */ + public JSONObject getContent() { + try { + JSONObject js = new JSONObject(); + + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + + JSONObject note = new JSONObject(); + if (mType == Notes.TYPE_NOTE) {//类型为note时 + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.ALERTED_DATE, mAlertDate); + note.put(NoteColumns.BG_COLOR_ID, mBgColorId); + note.put(NoteColumns.CREATED_DATE, mCreatedDate); + note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); + note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); + note.put(NoteColumns.PARENT_ID, mParentId); + note.put(NoteColumns.SNIPPET, mSnippet); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.WIDGET_ID, mWidgetId); + note.put(NoteColumns.WIDGET_TYPE, mWidgetType); + note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + + JSONArray dataArray = new JSONArray(); + for (SqlData sqlData : mDataList) { + JSONObject data = sqlData.getContent(); + if (data != null) { + dataArray.put(data); + } + } + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {//类型为文件夹或者 + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.SNIPPET, mSnippet); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + } + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + return null; + } + + /* + * 功能描述:给当前id设置父id + * 参数注解: + * Made By CuiCan + */ + public void setParentId(long id) { + mParentId = id; + mDiffNoteValues.put(NoteColumns.PARENT_ID, id); + } + + /* + * 功能描述:给当前id设置Gtaskid + * 参数注解: + * Made By CuiCan + */ + public void setGtaskId(String gid) { + mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); + } + + /* + * 功能描述:给当前id设置同步id + * 参数注解: + * Made By CuiCan + */ + public void setSyncId(long syncId) { + mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); + } + + /* + * 功能描述:初始化本地修改,即撤销所有当前修改 + * 参数注解: + * Made By CuiCan + */ + public void resetLocalModified() { + mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); + } + + /* + * 功能描述:获得当前id + * 参数注解: + * Made By CuiCan + */ + public long getId() { + return mId; + } + + /* + * 功能描述:获得当前id的父id + * 参数注解: + * Made By CuiCan + */ + public long getParentId() { + return mParentId; + } + + /* + * 功能描述:获取小片段即用于显示的部分便签内容 + * 参数注解: + * Made By CuiCan + */ + public String getSnippet() { + return mSnippet; + } + + /* + * 功能描述:判断是否为便签类型 + * 参数注解: + * Made By CuiCan + */ + public boolean isNoteType() { + return mType == Notes.TYPE_NOTE; + } + + /* + * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 + * 参数注解: + * Made By CuiCan + */ + public void commit(boolean validateVersion) { + if (mIsCreate) { + if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { + mDiffNoteValues.remove(NoteColumns.ID); + } + + Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); + try { + mId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + if (mId == 0) { + throw new IllegalStateException("Create thread id failed"); + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) {//直接使用sqldata中的实现 + sqlData.commit(mId, false, -1); + } + } + } else { + if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { + Log.e(TAG, "No such note"); + throw new IllegalStateException("Try to update note with invalid id"); + } + if (mDiffNoteValues.size() > 0) { + mVersion ++; + int result = 0; + if (!validateVersion) {//构造字符串 + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?)", new String[] { + String.valueOf(mId) + }); + } else { + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", + new String[] { + String.valueOf(mId), String.valueOf(mVersion) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, validateVersion, mVersion); + } + } + } + + // refresh local info + loadFromCursor(mId); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + + mDiffNoteValues.clear(); + mIsCreate = false; + } +} \ No newline at end of file diff --git a/gtask/data/Task.java b/gtask/data/Task.java new file mode 100644 index 0000000..3c890b3 --- /dev/null +++ b/gtask/data/Task.java @@ -0,0 +1,323 @@ +package net.micode.notes.gtask.data; + +public class Task extends Node { + private static final String TAG = Task.class.getSimpleName(); + + private boolean mCompleted;//是否完成 + + private String mNotes; + + private JSONObject mMetaInfo;//将在实例中存储数据的类型 + + private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善) + + private TaskList mParent;//所在的任务列表的指针 + + public Task() { + super(); + mCompleted = false; + mNotes = null; + mPriorSibling = null;//TaskList中当前Task前面的Task的指针 + mParent = null;//当前Task所在的TaskList + mMetaInfo = null; + } + + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_TASK); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + // parent_id + if (mParent!= null) { + js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); + } + + // dest_parent_type + js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + + // list_id + if (mParent!= null) { + js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); + } + + // prior_sibling_id + if (mPriorSibling != null) { + js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-create jsonobject"); + } + + return js; + } + + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + // notes + if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { + setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); + } + + // deleted + if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { + setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); + } + + // completed + if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { + setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get task content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { //��metadata����ʵʩ + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) + || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { + Log.e(TAG, "invalid type"); + return; + } + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + setName(data.getString(DataColumns.CONTENT)); + break; + } + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + String name = getName(); + try { + if (mMetaInfo == null) { + // new task created from web + if (name == null) { + Log.w(TAG, "the note seems to be an empty one"); + return null; + } + + JSONObject js = new JSONObject(); + JSONObject note = new JSONObject(); + JSONArray dataArray = new JSONArray(); + JSONObject data = new JSONObject(); + data.put(DataColumns.CONTENT, name); + dataArray.put(data); + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + return js; + } else { + // synced task + JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + data.put(DataColumns.CONTENT, getName()); + break; + } + } + + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + return mMetaInfo; + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public void setMetaInfo(MetaData metaData) { + if (metaData != null && metaData.getNotes() != null) { + try { + mMetaInfo = new JSONObject(metaData.getNotes()); + } catch (JSONException e) { + Log.w(TAG, e.toString()); + mMetaInfo = null; + } + } + } + + public int getSyncAction(Cursor c) { + try { + JSONObject noteInfo = null; + if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + } + + if (noteInfo == null) { + Log.w(TAG, "it seems that note meta has been deleted"); + return SYNC_ACTION_UPDATE_REMOTE; + } + + if (!noteInfo.has(NoteColumns.ID)) { + Log.w(TAG, "remote note id seems to be deleted"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + // validate the note id now + if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { + Log.w(TAG, "note id doesn't match"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + return SYNC_ACTION_UPDATE_CONFLICT; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + public boolean isWorthSaving() { + return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) + || (getNotes() != null && getNotes().trim().length() > 0); + } + + public void setCompleted(boolean completed) { + this.mCompleted = completed; + } + + public void setNotes(String notes) { + this.mNotes = notes; + } + + public void setPriorSibling(Task priorSibling) { + this.mPriorSibling = priorSibling; + } + + public void setParent(TaskList parent) { + this.mParent = parent; + } + + public boolean getCompleted() { + return this.mCompleted; + } + + public String getNotes() { + return this.mNotes; + } + + public Task getPriorSibling() { + return this.mPriorSibling; + } + + public TaskList getParent() { + return this.mParent; + } + +} \ No newline at end of file diff --git a/gtask/data/TaskList.java b/gtask/data/TaskList.java new file mode 100644 index 0000000..4922bb4 --- /dev/null +++ b/gtask/data/TaskList.java @@ -0,0 +1,370 @@ +package net.micode.notes.gtask.data; + +public class TaskList extends Node { + private static final String TAG = TaskList.class.getSimpleName();//tag标记 + + private int mIndex;//当前TaskList的指针 + + private ArrayList mChildren;//类中主要的保存数据的单元,用来实现一个以Task为元素的ArrayList + + public TaskList() { + super(); + mChildren = new ArrayList(); + mIndex = 1; + } + + /* (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getCreateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); + + // entity_delta + JSONObject entity = new JSONObject();//entity实体 + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-create jsonobject"); + } + + return js; + } + + /* (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get tasklist content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + + if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + String name = folder.getString(NoteColumns.SNIPPET); + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); + } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); + else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE); + else + Log.e(TAG, "invalid system folder"); + } else { + Log.e(TAG, "error type"); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + try { + JSONObject js = new JSONObject(); + JSONObject folder = new JSONObject(); + + String folderName = getName(); + if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) + folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), + folderName.length()); + folder.put(NoteColumns.SNIPPET, folderName); + if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) + || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) + folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + else + folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + + js.put(GTaskStringUtils.META_HEAD_NOTE, folder); + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public int getSyncAction(Cursor c) { + try { + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + // for folder conflicts, just apply local modification + return SYNC_ACTION_UPDATE_REMOTE; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + /** + * @return + * 功能:获得TaskList的大小,即mChildren的大小 + */ + public int getChildTaskCount() { + return mChildren.size(); + } + + /** + * @param task + * @return 返回值为是否成功添加任务。 + * 功能:在当前任务表末尾添加新的任务。 + */ + public boolean addChildTask(Task task) { + boolean ret = false; + if (task != null && !mChildren.contains(task)) { + ret = mChildren.add(task); + if (ret) { + // need to set prior sibling and parent + task.setPriorSibling(mChildren.isEmpty() ? null : mChildren + .get(mChildren.size() - 1)); + task.setParent(this); + //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改 + //,接下来几个函数都有相关操作 + } + } + return ret; + } + + /** + * @param task + * @param index + * @return + * 功能:在当前任务表的指定位置添加新的任务。 + */ + public boolean addChildTask(Task task, int index) { + if (index < 0 || index > mChildren.size()) { + Log.e(TAG, "add child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (task != null && pos == -1) { + mChildren.add(index, task); + + // update the task list + Task preTask = null; + Task afterTask = null; + if (index != 0) + preTask = mChildren.get(index - 1); + if (index != mChildren.size() - 1) + afterTask = mChildren.get(index + 1); + + task.setPriorSibling(preTask); + if (afterTask != null) + afterTask.setPriorSibling(task); + } + + return true; + } + + /** + * @param task + * @return 返回删除是否成功 + * 功能:删除TaskList中的一个Task + */ + public boolean removeChildTask(Task task) { + boolean ret = false; + int index = mChildren.indexOf(task); + if (index != -1) { + ret = mChildren.remove(task); + + if (ret) { + // reset prior sibling and parent + task.setPriorSibling(null); + task.setParent(null); + + // update the task list + if (index != mChildren.size()) { + mChildren.get(index).setPriorSibling( + index == 0 ? null : mChildren.get(index - 1)); + } + } + } + return ret; + } + + /** + * @param task + * @param index + * @return + * 功能:将当前TaskList中含有的某个Task移到index位置 + */ + public boolean moveChildTask(Task task, int index) { + + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "move child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (pos == -1) { + Log.e(TAG, "move child task: the task should in the list"); + return false; + } + + if (pos == index) + return true; + return (removeChildTask(task) && addChildTask(task, index)); + //利用已实现好的功能完成当下功能; + } + + /** + * @param gid + * @return返回寻找结果 + * 功能:按gid寻找Task + */ + public Task findChildTaskByGid(String gid) { + for (int i = 0; i < mChildren.size(); i++) { + Task t = mChildren.get(i); + if (t.getGid().equals(gid)) { + return t; + } + } + return null; + } + + /** + * @param task + * @return + * 功能:返回指定Task的index + */ + public int getChildTaskIndex(Task task) { + return mChildren.indexOf(task); + } + + /** + * @param index + * @return + * 功能:返回指定index的Task + */ + public Task getChildTaskByIndex(int index) { + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "getTaskByIndex: invalid index"); + return null; + } + return mChildren.get(index); + } + + /** + * @param gid + * @return + * 功能:返回指定gid的Task + */ + public Task getChilTaskByGid(String gid) { + for (Task task : mChildren) {//一种常见的ArrayList的遍历方法(四种,见精读笔记) + if (task.getGid().equals(gid)) + return task; + } + return null; + } + + public ArrayList getChildTaskList() { + return this.mChildren; + } + + public void setIndex(int index) { + this.mIndex = index; + } + + public int getIndex() { + return this.mIndex; + } +} \ No newline at end of file diff --git a/gtask/exception/ActionFailureException.java b/gtask/exception/ActionFailureException.java new file mode 100644 index 0000000..f455c7a --- /dev/null +++ b/gtask/exception/ActionFailureException.java @@ -0,0 +1,32 @@ +/* + * Description:支持小米便签运行过程中的运行异常处理。 + */ + +package net.micode.notes.gtask.exception; + +public class ActionFailureException extends RuntimeException { + private static final long serialVersionUID = 4425249765923293627L; + /* + * serialVersionUID相当于java类的身份证。主要用于版本控制。 + * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + * Made By Cuican + */ + + public ActionFailureException() { + super(); + } + /* + * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. + * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 + * 怎么去引用里面的父类对象呢?使用super来引用 + * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) + * Made By Cuican + */ + public ActionFailureException(String paramString) { + super(paramString); + } + + public ActionFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} \ No newline at end of file diff --git a/gtask/exception/NetworkFailureException.java b/gtask/exception/NetworkFailureException.java new file mode 100644 index 0000000..63a1adb --- /dev/null +++ b/gtask/exception/NetworkFailureException.java @@ -0,0 +1,33 @@ +/* + * Description:支持小米便签运行过程中的网络异常处理。 + */ + +package net.micode.notes.gtask.exception; + +public class NetworkFailureException extends Exception { + private static final long serialVersionUID = 2107610287180234136L; + /* + * serialVersionUID相当于java类的身份证。主要用于版本控制。 + * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + * Made By Cuican + */ + + public NetworkFailureException() { + super(); + } + + /* + * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. + * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 + * 怎么去引用里面的父类对象呢?使用super来引用 + * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) + * Made By Cuican + */ + public NetworkFailureException(String paramString) { + super(paramString); + } + + public NetworkFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} \ No newline at end of file diff --git a/gtask/remote/GTaskASyncTask.java b/gtask/remote/GTaskASyncTask.java new file mode 100644 index 0000000..364a604 --- /dev/null +++ b/gtask/remote/GTaskASyncTask.java @@ -0,0 +1,102 @@ +package net.micode.notes.gtask.remote; + +/*异步操作类,实现GTask的异步操作过程 + * 主要方法: + * private void showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法 + * protected Integer doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间 + * protected void onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 + * protected void onPostExecute(Integer result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI + */ +public class GTaskASyncTask extends AsyncTask { + + + private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; + + public interface OnCompleteListener { + void onComplete(); + } + + private Context mContext; + + private NotificationManager mNotifiManager; + + private GTaskManager mTaskManager; + + private OnCompleteListener mOnCompleteListener; + + public GTaskASyncTask(Context context, OnCompleteListener listener) { + mContext = context; + mOnCompleteListener = listener; + mNotifiManager = (NotificationManager) mContext + .getSystemService(Context.NOTIFICATION_SERVICE); + mTaskManager = GTaskManager.getInstance(); + } + + public void cancelSync() { + mTaskManager.cancelSync(); + } + + public void publishProgess(String message) { // 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 + publishProgress(new String[] { + message + }); + } + + private void showNotification(int tickerId, String content) { + Notification notification = new Notification(R.drawable.notification, mContext + .getString(tickerId), System.currentTimeMillis()); + notification.defaults = Notification.DEFAULT_LIGHTS; // 调用系统自带灯光 + notification.flags = Notification.FLAG_AUTO_CANCEL; // 点击清除按钮或点击通知后会自动消失 + PendingIntent pendingIntent; //一个描述了想要启动一个Activity、Broadcast或是Service的意图 + if (tickerId != R.string.ticker_success) { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesPreferenceActivity.class), 0); //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象 + + } else { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesListActivity.class), 0); //如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象 + } + notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, + pendingIntent); + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//通过NotificationManager对象的notify()方法来执行一个notification的消息 + } + + @Override + protected Integer doInBackground(Void... unused) { + publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity + .getSyncAccountName(mContext))); //利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext))的字符串内容传进sync_progress_login中 + return mTaskManager.sync(mContext, this); //进行后台同步具体操作 + } + + @Override + protected void onProgressUpdate(String... progress) { + showNotification(R.string.ticker_syncing, progress[0]); + if (mContext instanceof GTaskSyncService) { //instanceof 判断mContext是否是GTaskSyncService的实例 + ((GTaskSyncService) mContext).sendBroadcast(progress[0]); + } + } + + @Override + protected void onPostExecute(Integer result) { //用于在执行完后台任务后更新UI,显示结果 + if (result == GTaskManager.STATE_SUCCESS) { + showNotification(R.string.ticker_success, mContext.getString( + R.string.success_sync_account, mTaskManager.getSyncAccount())); + NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); //设置最新同步的时间 + } else if (result == GTaskManager.STATE_NETWORK_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); + } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); + } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { + showNotification(R.string.ticker_cancel, mContext + .getString(R.string.error_sync_cancelled)); + } //几种不同情况下的结果显示 + if (mOnCompleteListener != null) { + new Thread(new Runnable() { //这里好像是方法内的一个线程,但是并不太懂什么意思 + + public void run() { //完成后的操作,使用onComplete()将所有值都重新初始化,相当于完成一次操作 + mOnCompleteListener.onComplete(); + } + }).start(); + } + } +} \ No newline at end of file diff --git a/gtask/remote/GTaskClient.java b/gtask/remote/GTaskClient.java new file mode 100644 index 0000000..f15dc85 --- /dev/null +++ b/gtask/remote/GTaskClient.java @@ -0,0 +1,612 @@ +package net.micode.notes.gtask.remote; + +/* + * 主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容 + * 主要使用类或技术:accountManager JSONObject HttpParams authToken Gid + */ +public class GTaskClient { + private static final String TAG = GTaskClient.class.getSimpleName(); + + private static final String GTASK_URL = "https://mail.google.com/tasks/"; //这个是指定的URL + + private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; + + private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; + + private static GTaskClient mInstance = null; + + private DefaultHttpClient mHttpClient; + + private String mGetUrl; + + private String mPostUrl; + + private long mClientVersion; + + private boolean mLoggedin; + + private long mLastLoginTime; + + private int mActionId; + + private Account mAccount; + + private JSONArray mUpdateArray; + + private GTaskClient() { + mHttpClient = null; + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + mClientVersion = -1; + mLoggedin = false; + mLastLoginTime = 0; + mActionId = 1; + mAccount = null; + mUpdateArray = null; + } + + /*用来获取的实例化对象 + * 使用 getInstance() + * 返回mInstance这个实例化对象 + */ + public static synchronized GTaskClient getInstance() { + if (mInstance == null) { + mInstance = new GTaskClient(); + } + return mInstance; + } + + /*用来实现登录操作的函数,传入的参数是一个Activity + * 设置登录操作限制时间,如果超时则需要重新登录 + * 有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录 + * 返回true或者false,即最后是否登陆成功 + */ + public boolean login(Activity activity) { + // we suppose that the cookie would expire after 5 minutes + // then we need to re-login + //判断距离最后一次登录操作是否超过5分钟 + final long interval = 1000 * 60 * 5; + if (mLastLoginTime + interval < System.currentTimeMillis()) { + mLoggedin = false; + } + + // need to re-login after account switch 重新登录操作 + if (mLoggedin + && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity + .getSyncAccountName(activity))) { + mLoggedin = false; + } + + //如果没超过时间,则不需要重新登录 + if (mLoggedin) { + Log.d(TAG, "already logged in"); + return true; + } + + mLastLoginTime = System.currentTimeMillis();//更新最后登录时间,改为系统当前的时间 + String authToken = loginGoogleAccount(activity, false);//判断是否登录到谷歌账户 + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + // login with custom domain if necessary + //尝试使用用户自己的域名登录 + if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() //将用户账号名改为统一格式(小写)后判断是否为一个谷歌账号地址 + .endsWith("googlemail.com"))) { + StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); + int index = mAccount.name.indexOf('@') + 1; + String suffix = mAccount.name.substring(index); + url.append(suffix + "/"); + mGetUrl = url.toString() + "ig"; //设置用户对应的getUrl + mPostUrl = url.toString() + "r/ig"; //设置用户对应的postUrl + + if (tryToLoginGtask(activity, authToken)) { + mLoggedin = true; + } + } + + // try to login with google official url + //如果用户账户无法登录,则使用谷歌官方的URI进行登录 + if (!mLoggedin) { + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + if (!tryToLoginGtask(activity, authToken)) { + return false; + } + } + + mLoggedin = true; + return true; + } + + /*具体实现登录谷歌账户的方法 + * 使用令牌机制 + * 使用AccountManager来管理注册账号 + * 返回值是账号的令牌 + */ + private String loginGoogleAccount(Activity activity, boolean invalidateToken) { + String authToken; //令牌,是登录操作保证安全性的一个方法 + AccountManager accountManager = AccountManager.get(activity);//AccountManager这个类给用户提供了集中注册账号的接口 + Account[] accounts = accountManager.getAccountsByType("com.google");//获取全部以com.google结尾的account + + if (accounts.length == 0) { + Log.e(TAG, "there is no available google account"); + return null; + } + + String accountName = NotesPreferenceActivity.getSyncAccountName(activity); + Account account = null; + //遍历获得的accounts信息,寻找已经记录过的账户信息 + for (Account a : accounts) { + if (a.name.equals(accountName)) { + account = a; + break; + } + } + if (account != null) { + mAccount = account; + } else { + Log.e(TAG, "unable to get an account with the same name in the settings"); + return null; + } + + // get the token now + //获取选中账号的令牌 + AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, + "goanna_mobile", null, activity, null, null); + try { + Bundle authTokenBundle = accountManagerFuture.getResult(); + authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); + //如果是invalidateToken,那么需要调用invalidateAuthToken(String, String)方法废除这个无效token + if (invalidateToken) { + accountManager.invalidateAuthToken("com.google", authToken); + loginGoogleAccount(activity, false); + } + } catch (Exception e) { + Log.e(TAG, "get auth token failed"); + authToken = null; + } + + return authToken; + } + + //尝试登陆Gtask,这只是一个预先判断令牌是否是有效以及是否能登上GTask的方法,而不是具体实现登陆的方法 + private boolean tryToLoginGtask(Activity activity, String authToken) { + if (!loginGtask(authToken)) { + // maybe the auth token is out of authTokedate, now let's invalidate the + // token and try again + //删除过一个无效的authToken,申请一个新的后再次尝试登陆 + authToken = loginGoogleAccount(activity, true); + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + if (!loginGtask(authToken)) { + Log.e(TAG, "login gtask failed"); + return false; + } + } + return true; + } + + //实现登录GTask的具体操作 + private boolean loginGtask(String authToken) { + int timeoutConnection = 10000; + int timeoutSocket = 15000; //socket是一种通信连接实现数据的交换的端口 + HttpParams httpParameters = new BasicHttpParams(); //实例化一个新的HTTP参数类 + HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//设置连接超时时间 + HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//设置设置端口超时时间 + mHttpClient = new DefaultHttpClient(httpParameters); + BasicCookieStore localBasicCookieStore = new BasicCookieStore(); //设置本地cookie + mHttpClient.setCookieStore(localBasicCookieStore); + HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); + + // login gtask + try { + String loginUrl = mGetUrl + "?auth=" + authToken; //设置登录的url + HttpGet httpGet = new HttpGet(loginUrl); //通过登录的uri实例化网页上资源的查找 + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the cookie now + //获取CookieStore里存放的cookie,看如果存有“GTL(不知道什么意思)”,则说明有验证成功的有效的cookie + List cookies = mHttpClient.getCookieStore().getCookies(); + boolean hasAuthCookie = false; + for (Cookie cookie : cookies) { + if (cookie.getName().contains("GTL")) { + hasAuthCookie = true; + } + } + if (!hasAuthCookie) { + Log.w(TAG, "it seems that there is no auth cookie"); + } + + // get the client version + //获取client的内容,具体操作是在返回的Content中截取从_setup(开始到)}中间的字符串内容,也就是gtask_url的内容 + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + mClientVersion = js.getLong("v"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } catch (Exception e) { + // simply catch all exceptions + Log.e(TAG, "httpget gtask_url failed"); + return false; + } + + return true; + } + + private int getActionId() { + return mActionId++; + } + + /*实例化创建一个用于向网络传输数据的对象 + * 使用HttpPost类 + * 返回一个httpPost实例化对象,但里面还没有内容 + */ + private HttpPost createHttpPost() { + HttpPost httpPost = new HttpPost(mPostUrl); + httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + httpPost.setHeader("AT", "1"); + return httpPost; + } + + /*通过URL获取响应后返回的数据,也就是网络上的数据和资源 + * 使用getContentEncoding()获取网络上的资源和数据 + * 返回值就是获取到的资源 + */ + private String getResponseContent(HttpEntity entity) throws IOException { + String contentEncoding = null; + if (entity.getContentEncoding() != null) {//通过URL得到HttpEntity对象,如果不为空则使用getContent()方法创建一个流将数据从网络都过来 + contentEncoding = entity.getContentEncoding().getValue(); + Log.d(TAG, "encoding: " + contentEncoding); + } + + InputStream input = entity.getContent(); + if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {//GZIP是使用DEFLATE进行压缩数据的另一个压缩库 + input = new GZIPInputStream(entity.getContent()); + } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {//DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩 + Inflater inflater = new Inflater(true); + input = new InflaterInputStream(entity.getContent(), inflater); + } + + try { + InputStreamReader isr = new InputStreamReader(input); + BufferedReader br = new BufferedReader(isr);//是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了时候,再读入内存,是为了提供读的效率而设计的 + StringBuilder sb = new StringBuilder(); + + while (true) { + String buff = br.readLine(); + if (buff == null) { + return sb.toString(); + } + sb = sb.append(buff); + } + } finally { + input.close(); + } + } + + /*通过JSON发送请求 + * 请求的具体内容在json的实例化对象js中然后传入 + * 利用UrlEncodedFormEntity entity和httpPost.setEntity(entity)方法把js中的内容放置到httpPost中 + * 执行请求后使用getResponseContent方法得到返回的数据和资源 + * 将资源再次放入json后返回 + */ + private JSONObject postRequest(JSONObject js) throws NetworkFailureException { + if (!mLoggedin) {//未登录 + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + //实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里 + HttpPost httpPost = createHttpPost(); + try { + LinkedList list = new LinkedList(); + list.add(new BasicNameValuePair("r", js.toString())); + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); //UrlEncodedFormEntity()的形式比较单一,是普通的键值对 + httpPost.setEntity(entity); + + // execute the post + //执行这个请求 + HttpResponse response = mHttpClient.execute(httpPost); + String jsString = getResponseContent(response.getEntity()); + return new JSONObject(jsString); + + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("unable to convert response content to jsonobject"); + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("error occurs when posting request"); + } + } + + /*创建单个任务 + * 传入参数是一个.gtask.data.Task包里Task类的对象 + * 利用json获取Task里的内容,并且创建相应的jsPost + * 利用postRequest得到任务的返回信息 + * 使用task.setGid设置task的new_ID + */ + public void createTask(Task task) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(task.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create task: handing jsonobject failed"); + } + } + + /* + * 创建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid + */ + public void createTaskList(TaskList tasklist) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(tasklist.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create tasklist: handing jsonobject failed"); + } + } + + /* + * 同步更新操作 + * 使用JSONObject进行数据存储,使用jsPost.put,Put的信息包括UpdateArray和ClientVersion + * 使用postRequest发送这个jspost,进行处理 + */ + public void commitUpdate() throws NetworkFailureException { + if (mUpdateArray != null) { + try { + JSONObject jsPost = new JSONObject(); + + // action_list + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("commit update: handing jsonobject failed"); + } + } + } + + /* + * 添加更新的事项 + * 调用commitUpdate()实现 + */ + public void addUpdateNode(Node node) throws NetworkFailureException { + if (node != null) { + // too many update items may result in an error + // set max to 10 items + if (mUpdateArray != null && mUpdateArray.length() > 10) { + commitUpdate(); + } + + if (mUpdateArray == null) + mUpdateArray = new JSONArray(); + mUpdateArray.put(node.getUpdateAction(getActionId())); + } + } + + /* + * 移动task,比如讲task移动到不同的task列表中去 + * 通过getGid获取task所属列表的gid + * 通过JSONObject.put(String name, Object value)函数设置移动后的task的相关属性值,从而达到移动的目的 + * 最后还是通过postRequest进行更新后的发送 + */ + public void moveTask(Task task, TaskList preParent, TaskList curParent) + throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); + if (preParent == curParent && task.getPriorSibling() != null) { + // put prioring_sibing_id only if moving within the tasklist and + // it is not the first one + //设置优先级ID,只有当移动是发生在文件中 + action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); + } + action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); //设置移动前所属列表 + action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); //设置当前所属列表 + if (preParent != curParent) { + // put the dest_list only if moving between tasklists + action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); + } + actionList.put(action); + //最后将ACTION_LIST加入到jsPost中 + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("move task: handing jsonobject failed"); + } + } + + /* + * 删除操作节点 + * 还是利用JSON + * 删除过后使用postRequest发送删除后的结果 + */ + public void deleteNode(Node node) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + node.setDeleted(true); + actionList.put(node.getUpdateAction(getActionId())); //这里会获取到删除操作的ID,加入到actionLiast中 + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("delete node: handing jsonobject failed"); + } + } + + /* + * 获取任务列表 + * 首先通过GetURI使用getResponseContent从网上获取数据 + * 然后筛选出"_setup("到)}的部分,并且从中获取GTASK_JSON_LISTS的内容返回 + */ + public JSONArray getTaskLists() throws NetworkFailureException { + if (!mLoggedin) { + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + try { + HttpGet httpGet = new HttpGet(mGetUrl); + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the task list + //筛选工作,把筛选出的字符串放入jsString + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + //获取GTASK_JSON_LISTS + return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task lists: handing jasonobject failed"); + } + } + + /* + * 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务 + */ + public JSONArray getTaskList(String listGid) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); //这里设置为传入的listGid + action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); + actionList.put(action); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + JSONObject jsResponse = postRequest(jsPost); + return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task list: handing jsonobject failed"); + } + } + + public Account getSyncAccount() { + return mAccount; + } + + //重置更新的内容 + public void resetUpdateArray() { + mUpdateArray = null; + } +} \ No newline at end of file diff --git a/gtask/remote/GTaskManager.java b/gtask/remote/GTaskManager.java new file mode 100644 index 0000000..a8c1f2a --- /dev/null +++ b/gtask/remote/GTaskManager.java @@ -0,0 +1,846 @@ +package net.micode.notes.gtask.remote; + +public class GTaskManager { + private static final String TAG = GTaskManager.class.getSimpleName(); + public static final int STATE_SUCCESS = 0; + public static final int STATE_NETWORK_ERROR = 1; + public static final int STATE_INTERNAL_ERROR = 2; + public static final int STATE_SYNC_IN_PROGRESS = 3; + public static final int STATE_SYNC_CANCELLED = 4; + private static GTaskManager mInstance = null; + + private Activity mActivity; + private Context mContext; + private ContentResolver mContentResolver; + private boolean mSyncing; + private boolean mCancelled; + private HashMap mGTaskListHashMap; + private HashMap mGTaskHashMap; + private HashMap mMetaHashMap; + private TaskList mMetaList; + private HashSet mLocalDeleteIdMap; + private HashMap mGidToNid; + private HashMap mNidToGid; + + private GTaskManager() { //对象初始化函数 + mSyncing = false; //正在同步,flase代表未执行 + mCancelled = false; //全局标识,flase代表可以执行 + mGTaskListHashMap = new HashMap(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。 + mGTaskHashMap = new HashMap(); + mMetaHashMap = new HashMap(); + mMetaList = null; + mLocalDeleteIdMap = new HashSet(); + mGidToNid = new HashMap(); //GoogleID to NodeID?? + mNidToGid = new HashMap(); //NodeID to GoogleID???通过hashmap散列表建立映射 + } + + /** + * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 + * 功能:类初始化函数 + * @author TTS + * @return GtaskManger + */ + public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized + if (mInstance == null) { + mInstance = new GTaskManager(); + } + return mInstance; + } + + /** + * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 + * @author TTS + * @param activity + */ + public synchronized void setActivityContext(Activity activity) { + // used for getting auth token + mActivity = activity; + } + + /** + * 核心函数 + * 功能:实现了本地同步操作和远端同步操作 + * @author TTS + * @param context-----获取上下文 + * @param asyncTask-------用于同步的异步操作类 + * @return int + */ + public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数 + if (mSyncing) { + Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug + return STATE_SYNC_IN_PROGRESS; + } + mContext = context; + mContentResolver = mContext.getContentResolver(); + mSyncing = true; + mCancelled = false; + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + + try { + GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机 + client.resetUpdateArray(); //JSONArray类型,reset即置为NULL + + // login google task + if (!mCancelled) { + if (!client.login(mActivity)) { + throw new NetworkFailureException("login google task failed"); + } + } + + // get the task list from google + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); + initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList + + // do content sync work + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); + syncContent(); + } catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常 + Log.e(TAG, e.toString()); //创建日志文件(调试信息),error + return STATE_NETWORK_ERROR; + } catch (ActionFailureException e) { //此类异常为操作异常 + Log.e(TAG, e.toString()); + return STATE_INTERNAL_ERROR; + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return STATE_INTERNAL_ERROR; + } finally { + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + mSyncing = false; + } + + return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; + } + + /** + *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。 + *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap + *@author TTS + *@exception NetworkFailureException + *@return void + */ + private void initGTaskList() throws NetworkFailureException { + if (mCancelled) + return; + GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机 + try { + //Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。 + //其格式为{"key1":value1,"key2",value2....};key 必须是字符串。 + //因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。 + JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list------lists??? + + // init meta list first + mMetaList = null; //TaskList类型 + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { + mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化 + mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname... + + // load meta data + JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list------list??? + for (int j = 0; j < jsMetas.length(); j++) { + object = (JSONObject) jsMetas.getJSONObject(j); + MetaData metaData = new MetaData(); //继承自Node + metaData.setContentByRemoteJSON(object); + if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList + mMetaList.addChildTask(metaData); + if (metaData.getGid() != null) { + mMetaHashMap.put(metaData.getRelatedGid(), metaData); + } + } + } + } + } + + // create meta list if not existed + if (mMetaList == null) { + mMetaList = new TaskList(); + mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META); + GTaskClient.getInstance().createTaskList(mMetaList); + } + + // init task list + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。 + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) + && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META)) { + TaskList tasklist = new TaskList(); //继承自Node + tasklist.setContentByRemoteJSON(object); + mGTaskListHashMap.put(gid, tasklist); + mGTaskHashMap.put(gid, tasklist); //为什么加两遍??? + + // load tasks + JSONArray jsTasks = client.getTaskList(gid); + for (int j = 0; j < jsTasks.length(); j++) { + object = (JSONObject) jsTasks.getJSONObject(j); + gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + Task task = new Task(); + task.setContentByRemoteJSON(object); + if (task.isWorthSaving()) { + task.setMetaInfo(mMetaHashMap.get(gid)); + tasklist.addChildTask(task); + mGTaskHashMap.put(gid, task); + } + } + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("initGTaskList: handing JSONObject failed"); + } + } + + /** + * 功能:本地内容同步操作 + * @throws NetworkFailureException + * @return 无返回值 + */ + private void syncContent() throws NetworkFailureException { //本地内容同步操作 + int syncType; + Cursor c = null; //数据库指针 + String gid; //GoogleID?? + Node node; //Node包含Sync_Action的不同类型 + + mLocalDeleteIdMap.clear(); //HashSet类型 + + if (mCancelled) { + return; + } + + // for local deleted note + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id=?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, null); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); + } + + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + } + } else { + Log.w(TAG, "failed to query trash folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // sync folder first + syncFolder(); + + // for note existing in database + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //通过hashmap建立联系 + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //通过hashmap建立联系 + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing note in database"); + } + + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // go through remaining items + Iterator> iter = mGTaskHashMap.entrySet().iterator(); //Iterator迭代器 + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + node = entry.getValue(); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + + // mCancelled can be set by another thread, so we neet to check one by //thread----线程 + // one + // clear local delete table + if (!mCancelled) { + if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { + throw new ActionFailureException("failed to batch-delete local deleted notes"); + } + } + + // refresh local sync id + if (!mCancelled) { + GTaskClient.getInstance().commitUpdate(); + refreshLocalSyncId(); + } + + } + + /** + * 功能: + * @author TTS + * @throws NetworkFailureException + */ + private void syncFolder() throws NetworkFailureException { + Cursor c = null; + String gid; + Node node; + int syncType; + + if (mCancelled) { + return; + } + + // for root folder + try { + c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, + Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); + if (c != null) { + c.moveToNext(); + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); + mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); + // for system folder, only update remote name if necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } else { + Log.w(TAG, "failed to query root folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for call-note folder + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(Notes.ID_CALL_RECORD_FOLDER) + }, null); + if (c != null) { + if (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); + mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); + // for system folder, only update remote name if + // necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } + } else { + Log.w(TAG, "failed to query call note folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for local existing folders + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for remote add folders + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + gid = entry.getKey(); + node = entry.getValue(); + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + } + + if (!mCancelled) + GTaskClient.getInstance().commitUpdate(); + } + + /** + * 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode + * @author TTS + * @param syncType + * @param node + * @param c + * @throws NetworkFailureException + */ + private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + MetaData meta; + switch (syncType) { + case Node.SYNC_ACTION_ADD_LOCAL: + addLocalNode(node); + break; + case Node.SYNC_ACTION_ADD_REMOTE: + addRemoteNode(node, c); + break; + case Node.SYNC_ACTION_DEL_LOCAL: + meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + break; + case Node.SYNC_ACTION_DEL_REMOTE: + meta = mMetaHashMap.get(node.getGid()); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + GTaskClient.getInstance().deleteNode(node); + break; + case Node.SYNC_ACTION_UPDATE_LOCAL: + updateLocalNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_REMOTE: + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_CONFLICT: + // merging both modifications maybe a good idea + // right now just use local update simply + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_NONE: + break; + case Node.SYNC_ACTION_ERROR: + default: + throw new ActionFailureException("unkown sync action type"); + } + } + + /** + * 功能:本地增加Node + * @author TTS + * @param node + * @throws NetworkFailureException + */ + private void addLocalNode(Node node) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + if (node instanceof TaskList) { + if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { + sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); + } else if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { + sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); + } else { + sqlNote = new SqlNote(mContext); + sqlNote.setContent(node.getLocalJSONFromContent()); + sqlNote.setParentId(Notes.ID_ROOT_FOLDER); + } + } else { + sqlNote = new SqlNote(mContext); + JSONObject js = node.getLocalJSONFromContent(); + try { + if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.has(NoteColumns.ID)) { + long id = note.getLong(NoteColumns.ID); + if (DataUtils.existInNoteDatabase(mContentResolver, id)) { + // the id is not available, have to create a new one + note.remove(NoteColumns.ID); + } + } + } + + if (js.has(GTaskStringUtils.META_HEAD_DATA)) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { + // the data id is not available, have to create + // a new one + data.remove(DataColumns.ID); + } + } + } + + } + } catch (JSONException e) { + Log.w(TAG, e.toString()); + e.printStackTrace(); + } + sqlNote.setContent(js); + + Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot add local node"); + } + sqlNote.setParentId(parentId.longValue()); + } + + // create the local node + sqlNote.setGtaskId(node.getGid()); + sqlNote.commit(false); + + // update gid-nid mapping + mGidToNid.put(node.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), node.getGid()); + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + } + + /** + * 功能:update本地node + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * ----Cursor + * @throws NetworkFailureException + */ + private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + // update the note locally + sqlNote = new SqlNote(mContext, c); + sqlNote.setContent(node.getLocalJSONFromContent()); + + Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) + : new Long(Notes.ID_ROOT_FOLDER); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot update local node"); + } + sqlNote.setParentId(parentId.longValue()); + sqlNote.commit(true); + + // update meta info + updateRemoteMeta(node.getGid(), sqlNote); + } + + /** + * 功能:远程增加Node + * 需要updateRemoteMeta + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * --Cursor + * @throws NetworkFailureException + */ + private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); //从本地mContext中获取内容 + Node n; + + // update remotely + if (sqlNote.isNoteType()) { + Task task = new Task(); + task.setContentByLocalJSON(sqlNote.getContent()); + + String parentGid = mNidToGid.get(sqlNote.getParentId()); + if (parentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); //调试信息 + throw new ActionFailureException("cannot add remote task"); + } + mGTaskListHashMap.get(parentGid).addChildTask(task); //在本地生成的GTaskList中增加子结点 + + //登录远程服务器,创建Task + GTaskClient.getInstance().createTask(task); + n = (Node) task; + + // add meta + updateRemoteMeta(task.getGid(), sqlNote); + } else { + TaskList tasklist = null; + + // we need to skip folder if it has already existed + String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; + if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) + folderName += GTaskStringUtils.FOLDER_DEFAULT; + else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) + folderName += GTaskStringUtils.FOLDER_CALL_NOTE; + else + folderName += sqlNote.getSnippet(); + + //iterator迭代器,通过统一的接口迭代所有的map元素 + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + String gid = entry.getKey(); + TaskList list = entry.getValue(); + + if (list.getName().equals(folderName)) { + tasklist = list; + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + } + break; + } + } + + // no match we can add now + if (tasklist == null) { + tasklist = new TaskList(); + tasklist.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().createTaskList(tasklist); + mGTaskListHashMap.put(tasklist.getGid(), tasklist); + } + n = (Node) tasklist; + } + + // update local note + sqlNote.setGtaskId(n.getGid()); + sqlNote.commit(false); + sqlNote.resetLocalModified(); + sqlNote.commit(true); + + // gid-id mapping //创建id间的映射 + mGidToNid.put(n.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), n.getGid()); + } + + /** + * 功能:更新远端的Node,包含meta更新(updateRemoteMeta) + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * --Cursor + * @throws NetworkFailureException + */ + private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + + // update remotely + node.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(node); //GTaskClient用途为从本地登陆远端服务器 + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + + // move task if necessary + if (sqlNote.isNoteType()) { + Task task = (Task) node; + TaskList preParentList = task.getParent(); + //preParentList为通过node获取的父节点列表 + + String curParentGid = mNidToGid.get(sqlNote.getParentId()); + //curParentGid为通过光标在数据库中找到sqlNote的mParentId,再通过mNidToGid由long类型转为String类型的Gid + + if (curParentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot update remote task"); + } + TaskList curParentList = mGTaskListHashMap.get(curParentGid); + //通过HashMap找到对应Gid的TaskList + + if (preParentList != curParentList) { //????????????? + preParentList.removeChildTask(task); + curParentList.addChildTask(task); + GTaskClient.getInstance().moveTask(task, preParentList, curParentList); + } + } + + // clear local modified flag + sqlNote.resetLocalModified(); + //commit到本地数据库 + sqlNote.commit(true); + } + + /** + * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。 + * @author TTS + * @param gid + * ---GoogleID为String类型 + * @param sqlNote + * ---同步前的数据库操作,故使用类SqlNote + * @throws NetworkFailureException + */ + private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { + if (sqlNote != null && sqlNote.isNoteType()) { + MetaData metaData = mMetaHashMap.get(gid); + if (metaData != null) { + metaData.setMeta(gid, sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(metaData); + } else { + metaData = new MetaData(); + metaData.setMeta(gid, sqlNote.getContent()); + mMetaList.addChildTask(metaData); + mMetaHashMap.put(gid, metaData); + GTaskClient.getInstance().createTask(metaData); + } + } + } + + /** + * 功能:刷新本地,给sync的ID对应上最后更改过的对象 + * @author TTS + * @return void + * @throws NetworkFailureException + */ + private void refreshLocalSyncId() throws NetworkFailureException { + if (mCancelled) { + return; + } + + // get the latest gtask list //获取最近的(最晚的)gtask list + mGTaskHashMap.clear(); + mGTaskListHashMap.clear(); + mMetaHashMap.clear(); + initGTaskList(); + + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); //query语句:五个参数,NoteColumns.TYPE + " DESC"-----为按类型递减顺序返回查询结果。new String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------为选择参数。"(type<>? AND parent_id<>?)"-------指明返回行过滤器。SqlNote.PROJECTION_NOTE--------应返回的数据列的名字。Notes.CONTENT_NOTE_URI--------contentProvider包含所有数据集所对应的uri + if (c != null) { + while (c.moveToNext()) { + String gid = c.getString(SqlNote.GTASK_ID_COLUMN); + Node node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + ContentValues values = new ContentValues(); //在ContentValues中创建键值对。准备通过contentResolver写入数据 + values.put(NoteColumns.SYNC_ID, node.getLastModified()); + mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //进行批量更改,选择参数为NULL,应该可以用insert替换,参数分别为表名和需要更新的value对象。 + c.getLong(SqlNote.ID_COLUMN)), values, null, null); + } else { + Log.e(TAG, "something is missed"); + throw new ActionFailureException( + "some local items don't have gid after sync"); + } + } + } else { + Log.w(TAG, "failed to query local note to refresh sync id"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + } + + /** + * 功能:获取同步账号,mAccount.name + * @author TTS + * @return String + */ + public String getSyncAccount() { + return GTaskClient.getInstance().getSyncAccount().name; + } + + /** + * 功能:取消同步,置mCancelled为true + * @author TTS + */ + public void cancelSync() { + mCancelled = true; + } +} \ No newline at end of file diff --git a/gtask/remote/GTaskSyncService.java b/gtask/remote/GTaskSyncService.java new file mode 100644 index 0000000..bf7fb43 --- /dev/null +++ b/gtask/remote/GTaskSyncService.java @@ -0,0 +1,124 @@ +package net.micode.notes.gtask.remote; + +/* + * Service是在一段不定的时间运行在后台,不和用户交互的应用组件 + * 主要方法: + * private void startSync() 启动一个同步工作 + * private void cancelSync() 取消同步 + * public void onCreate() + * public int onStartCommand(Intent intent, int flags, int startId) service生命周期的组成部分,相当于重启service(比如在被暂停之后),而不是创建一个新的service + * public void onLowMemory() 在没有内存的情况下如果存在service则结束掉这的service + * public IBinder onBind() + * public void sendBroadcast(String msg) 发送同步的相关通知 + * public static void startSync(Activity activity) + * public static void cancelSync(Context context) + * public static boolean isSyncing() 判读是否在进行同步 + * public static String getProgressString() 获取当前进度的信息 + */ + +public class GTaskSyncService extends Service { + public final static String ACTION_STRING_NAME = "sync_action_type"; + + public final static int ACTION_START_SYNC = 0; + + public final static int ACTION_CANCEL_SYNC = 1; + + public final static int ACTION_INVALID = 2; + + public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; + + public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; + + public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; + + private static GTaskASyncTask mSyncTask = null; + + private static String mSyncProgress = ""; + + //开始一个同步的工作 + private void startSync() { + if (mSyncTask == null) { + mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { + public void onComplete() { + mSyncTask = null; + sendBroadcast(""); + stopSelf(); + } + }); + sendBroadcast(""); + mSyncTask.execute(); //这个函数让任务是以单线程队列方式或线程池队列方式运行 + } + } + + + private void cancelSync() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + @Override + public void onCreate() { //初始化一个service + mSyncTask = null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Bundle bundle = intent.getExtras(); + if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { + switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { + //两种情况,开始同步或者取消同步 + case ACTION_START_SYNC: + startSync(); + break; + case ACTION_CANCEL_SYNC: + cancelSync(); + break; + default: + break; + } + return START_STICKY; //等待新的intent来是这个service继续运行 + } + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onLowMemory() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + public IBinder onBind(Intent intent) { //不知道干吗用的 + return null; + } + + public void sendBroadcast(String msg) { + mSyncProgress = msg; + Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); //创建一个新的Intent + intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); //附加INTENT中的相应参数的值 + intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); + sendBroadcast(intent); //发送这个通知 + } + + public static void startSync(Activity activity) {//执行一个service,service的内容里的同步动作就是开始同步 + GTaskManager.getInstance().setActivityContext(activity); + Intent intent = new Intent(activity, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); + activity.startService(intent); + } + + public static void cancelSync(Context context) {//执行一个service,service的内容里的同步动作就是取消同步 + Intent intent = new Intent(context, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); + context.startService(intent); + } + + public static boolean isSyncing() { + return mSyncTask != null; + } + + public static String getProgressString() { + return mSyncProgress; + } +} \ No newline at end of file -- 2.34.1 From 7b1e305303961a892ea19ae8cc913f1d9be0cb9d Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Wed, 19 Apr 2023 20:15:55 +0800 Subject: [PATCH 07/20] 1 --- 111.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 111.txt diff --git a/111.txt b/111.txt deleted file mode 100644 index 9d07aa0..0000000 --- a/111.txt +++ /dev/null @@ -1 +0,0 @@ -111 \ No newline at end of file -- 2.34.1 From ba0137d5fba382ec03aef0c100cab8571cc64512 Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Fri, 21 Apr 2023 13:37:08 +0800 Subject: [PATCH 08/20] 1 --- gtask/data/MetaData.java | 104 --- gtask/data/Node.java | 90 -- gtask/data/SqlData.java | 224 ----- gtask/data/SqlNote.java | 577 ------------- gtask/data/Task.java | 323 ------- gtask/data/TaskList.java | 370 -------- gtask/exception/ActionFailureException.java | 32 - gtask/exception/NetworkFailureException.java | 33 - gtask/remote/GTaskASyncTask.java | 102 --- gtask/remote/GTaskClient.java | 612 -------------- gtask/remote/GTaskManager.java | 846 ------------------- gtask/remote/GTaskSyncService.java | 124 --- 12 files changed, 3437 deletions(-) delete mode 100644 gtask/data/MetaData.java delete mode 100644 gtask/data/Node.java delete mode 100644 gtask/data/SqlData.java delete mode 100644 gtask/data/SqlNote.java delete mode 100644 gtask/data/Task.java delete mode 100644 gtask/data/TaskList.java delete mode 100644 gtask/exception/ActionFailureException.java delete mode 100644 gtask/exception/NetworkFailureException.java delete mode 100644 gtask/remote/GTaskASyncTask.java delete mode 100644 gtask/remote/GTaskClient.java delete mode 100644 gtask/remote/GTaskManager.java delete mode 100644 gtask/remote/GTaskSyncService.java diff --git a/gtask/data/MetaData.java b/gtask/data/MetaData.java deleted file mode 100644 index 0f33467..0000000 --- a/gtask/data/MetaData.java +++ /dev/null @@ -1,104 +0,0 @@ -package net.micode.notes.gtask.data; - -public class MetaData extends Task { - /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - */ - private final static String TAG = MetaData.class.getSimpleName(); - private String mRelatedGid = null; - /* - * 功能描述:设置数据,即生成元数据库 - * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 - * 参数注解: - */ - public void setMeta(String gid, JSONObject metaInfo) - { - //对函数块进行注释 - try { - metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); - /* - * 将这对键值放入metaInfo这个jsonobject对象中 - */ - } catch (JSONException e) { - Log.e(TAG, "failed to put related gid"); - /* - * 输出错误信息 - */ - } - setNotes(metaInfo.toString()); - setName(GTaskStringUtils.META_NOTE_NAME); - } - /* - * 功能描述:获取相关联的Gid - */ - public String getRelatedGid() { - return mRelatedGid; - } - /* - * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 - * Made By CuiCan - */ - @Override - public boolean isWorthSaving() { - return getNotes() != null; - } - /* - * 功能描述:使用远程json数据对象设置元数据内容 - * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 - * 参数注解: - */ - @Override - public void setContentByRemoteJSON(JSONObject js) { - super.setContentByRemoteJSON(js); - if (getNotes() != null) { - try { - JSONObject metaInfo = new JSONObject(getNotes().trim()); - mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); - } catch (JSONException e) { - Log.w(TAG, "failed to get related gid"); - /* - * 输出警告信息 - */ - mRelatedGid = null; - } - } - } - /* - * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - @Override - public void setContentByLocalJSON(JSONObject js) { - // this function should not be called - throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); - /* - * 传递非法参数异常 - */ - } - /* - * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - @Override - public JSONObject getLocalJSONFromContent() { - throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); - /* - * 传递非法参数异常 - * Made By Cui Can - */ - } - /* - * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - @Override - public int getSyncAction(Cursor c) { - throw new IllegalAccessError("MetaData:getSyncAction should not be called"); - /* - * 传递非法参数异常 - * Made By Cui Can - */ - } - -} \ No newline at end of file diff --git a/gtask/data/Node.java b/gtask/data/Node.java deleted file mode 100644 index 47f7461..0000000 --- a/gtask/data/Node.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.micode.notes.gtask.data; - -import android.database.Cursor; - -import org.json.JSONObject; - -/** - * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 - * 关键字:abstract - */ -public abstract class Node { - //定义了各种用于表征同步状态的常量 - public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) - - public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 - - public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 - - public static final int SYNC_ACTION_DEL_REMOTE = 3;// 需要在远程云端删除内容 - - public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 - - public static final int SYNC_ACTION_UPDATE_REMOTE = 5;// 需要将本地内容更新到远程云端 - - public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 - - public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 - - public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 - - private String mGid; - - private String mName; - - private long mLastModified;//记录最后一次修改时间 - - private boolean mDeleted;//表征是否被删除 - - public Node() { - mGid = null; - mName = ""; - mLastModified = 0; - mDeleted = false; - } - - public abstract JSONObject getCreateAction(int actionId); - - public abstract JSONObject getUpdateAction(int actionId); - - public abstract void setContentByRemoteJSON(JSONObject js); - - public abstract void setContentByLocalJSON(JSONObject js); - - public abstract JSONObject getLocalJSONFromContent(); - - public abstract int getSyncAction(Cursor c); - - public void setGid(String gid) { - this.mGid = gid; - } - - public void setName(String name) { - this.mName = name; - } - - public void setLastModified(long lastModified) { - this.mLastModified = lastModified; - } - - public void setDeleted(boolean deleted) { - this.mDeleted = deleted; - } - - public String getGid() { - return this.mGid; - } - - public String getName() { - return this.mName; - } - - public long getLastModified() { - return this.mLastModified; - } - - public boolean getDeleted() { - return this.mDeleted; - } - -} \ No newline at end of file diff --git a/gtask/data/SqlData.java b/gtask/data/SqlData.java deleted file mode 100644 index f47546a..0000000 --- a/gtask/data/SqlData.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 - * SqlData其实就是也就是所谓数据中的数据 - */ - -package net.micode.notes.gtask.data; -/* - * 功能描述: - * 实现过程: - * 参数注解: - * Made By CuiCan - */ - -public class SqlData { - /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - * Made By CuiCan - */ - private static final String TAG = SqlData.class.getSimpleName(); - - private static final int INVALID_ID = -99999;//为mDataId置初始值-99999 - - - /** - * 来自Notes类中定义的DataColumn中的一些常量 - */ - - // 集合了interface DataColumns中所有SF常量 - public static final String[] PROJECTION_DATA = new String[] { - DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, - DataColumns.DATA3 - }; - - /** - * 以下五个变量作为sql表中5列的编号 - */ - public static final int DATA_ID_COLUMN = 0; - - public static final int DATA_MIME_TYPE_COLUMN = 1; - - public static final int DATA_CONTENT_COLUMN = 2; - - public static final int DATA_CONTENT_DATA_1_COLUMN = 3; - - public static final int DATA_CONTENT_DATA_3_COLUMN = 4; - - private ContentResolver mContentResolver; - //判断是否直接用Content生成,是为true,否则为false - private boolean mIsCreate; - - private long mDataId; - - private String mDataMimeType; - - private String mDataContent; - - private long mDataContentData1; - - private String mDataContentData3; - - private ContentValues mDiffDataValues; - - /* - * 功能描述:构造函数,用于初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: - * Made By CuiCan - */ - public SqlData(Context context) { - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mDataId = INVALID_ID;//mDataId置初始值-99999 - mDataMimeType = DataConstants.NOTE; - mDataContent = ""; - mDataContentData1 = 0; - mDataContentData3 = ""; - mDiffDataValues = new ContentValues(); - } - - - /* - * 功能描述:构造函数,初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: - * Made By CuiCan - */ - public SqlData(Context context, Cursor c) { - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDiffDataValues = new ContentValues(); - } - - /* - * 功能描述:从光标处加载数据 - * 从当前的光标处将五列的数据加载到该类的对象 - * Made By CuiCan - */ - private void loadFromCursor(Cursor c) { - mDataId = c.getLong(DATA_ID_COLUMN); - mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); - mDataContent = c.getString(DATA_CONTENT_COLUMN); - mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); - mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); - } - - - /* - * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 - * 参数注解: - * Made By CuiCan - */ - public void setContent(JSONObject js) throws JSONException { - //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; - if (mIsCreate || mDataId != dataId) { - mDiffDataValues.put(DataColumns.ID, dataId); - } - mDataId = dataId; - - String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) - : DataConstants.NOTE; - if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { - mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); - } - mDataMimeType = dataMimeType; - - String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; - if (mIsCreate || !mDataContent.equals(dataContent)) { - mDiffDataValues.put(DataColumns.CONTENT, dataContent); - } - mDataContent = dataContent; - - long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; - if (mIsCreate || mDataContentData1 != dataContentData1) { - mDiffDataValues.put(DataColumns.DATA1, dataContentData1); - } - mDataContentData1 = dataContentData1; - - String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; - if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { - mDiffDataValues.put(DataColumns.DATA3, dataContentData3); - } - mDataContentData3 = dataContentData3; - } - - - /* - * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 - * 参数注解: - * Made By CuiCan - */ - public JSONObject getContent() throws JSONException { - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - //创建JSONObject对象。并将相关数据放入其中,并返回。 - JSONObject js = new JSONObject(); - js.put(DataColumns.ID, mDataId); - js.put(DataColumns.MIME_TYPE, mDataMimeType); - js.put(DataColumns.CONTENT, mDataContent); - js.put(DataColumns.DATA1, mDataContentData1); - js.put(DataColumns.DATA3, mDataContentData3); - return js; - } - - /* - * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 - * 参数注解: - * Made By CuiCan - */ - public void commit(long noteId, boolean validateVersion, long version) { - - if (mIsCreate) { - if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { - mDiffDataValues.remove(DataColumns.ID); - } - - mDiffDataValues.put(DataColumns.NOTE_ID, noteId); - Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); - try { - mDataId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - } else { - if (mDiffDataValues.size() > 0) { - int result = 0; - if (!validateVersion) { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); - } else { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, - " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { - String.valueOf(noteId), String.valueOf(version) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - } - - mDiffDataValues.clear(); - mIsCreate = false; - } - - /* - * 功能描述:获取当前id - * 实现过程: - * 参数注解: - * Made By CuiCan - */ - public long getId() { - return mDataId; - } -} \ No newline at end of file diff --git a/gtask/data/SqlNote.java b/gtask/data/SqlNote.java deleted file mode 100644 index c669db2..0000000 --- a/gtask/data/SqlNote.java +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Description:用于支持小米便签最底层的数据库相关操作,和sqldata的关系上是父集关系,即note是data的子父集。 - * 和SqlData相比,SqlNote算是真正意义上的数据了。 - */ - -package net.micode.notes.gtask.data; -/* - * 功能描述: - * 实现过程: - * 参数注解: - * Made By CuiCan - */ - -public class SqlNote { - /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - * Made By CuiCan - */ - private static final String TAG = SqlNote.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - // 集合了interface NoteColumns中所有SF常量(17个) - public static final String[] PROJECTION_NOTE = new String[] { - NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, - NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, - NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, - NoteColumns.VERSION - }; - - //以下设置17个列的编号 - public static final int ID_COLUMN = 0; - - public static final int ALERTED_DATE_COLUMN = 1; - - public static final int BG_COLOR_ID_COLUMN = 2; - - public static final int CREATED_DATE_COLUMN = 3; - - public static final int HAS_ATTACHMENT_COLUMN = 4; - - public static final int MODIFIED_DATE_COLUMN = 5; - - public static final int NOTES_COUNT_COLUMN = 6; - - public static final int PARENT_ID_COLUMN = 7; - - public static final int SNIPPET_COLUMN = 8; - - public static final int TYPE_COLUMN = 9; - - public static final int WIDGET_ID_COLUMN = 10; - - public static final int WIDGET_TYPE_COLUMN = 11; - - public static final int SYNC_ID_COLUMN = 12; - - public static final int LOCAL_MODIFIED_COLUMN = 13; - - public static final int ORIGIN_PARENT_ID_COLUMN = 14; - - public static final int GTASK_ID_COLUMN = 15; - - public static final int VERSION_COLUMN = 16; - - //一下定义了17个内部的变量,其中12个可以由content中获得,5个需要初始化为0或者new - private Context mContext; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mId; - - private long mAlertDate; - - private int mBgColorId; - - private long mCreatedDate; - - private int mHasAttachment; - - private long mModifiedDate; - - private long mParentId; - - private String mSnippet; - - private int mType; - - private int mWidgetId; - - private int mWidgetType; - - private long mOriginParent; - - private long mVersion; - - private ContentValues mDiffNoteValues; - - private ArrayList mDataList; - - /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: - * Made By CuiCan - */ - //构造函数只有context,对所有的变量进行初始化 - public SqlNote(Context context) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mId = INVALID_ID; - mAlertDate = 0; - mBgColorId = ResourceParser.getDefaultBgId(context); - mCreatedDate = System.currentTimeMillis();//调用系统函数获得创建时间 - mHasAttachment = 0; - mModifiedDate = System.currentTimeMillis();//最后一次修改时间初始化为创建时间 - mParentId = 0; - mSnippet = ""; - mType = Notes.TYPE_NOTE; - mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - mOriginParent = 0; - mVersion = 0; - mDiffNoteValues = new ContentValues(); - mDataList = new ArrayList(); - } - - - /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: - * Made By CuiCan - */ - //构造函数有context和一个数据库的cursor,多数变量通过cursor指向的一条记录直接进行初始化 - public SqlNote(Context context, Cursor c) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDataList = new ArrayList(); - // - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - } - - - /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: - * Made By CuiCan - */ - public SqlNote(Context context, long id) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(id); - mDataList = new ArrayList(); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - - } - - /* - * 功能描述:通过id从光标处加载数据 - * Made By CuiCan - */ - private void loadFromCursor(long id) { - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(id) - }, null);//通过id获得对应的ContentResolver中的cursor - if (c != null) { - c.moveToNext(); - loadFromCursor(c);//然后加载数据进行初始化,这样函数 - //SqlNote(Context context, long id)与SqlNote(Context context, long id)的实现方式基本相同 - } else { - Log.w(TAG, "loadFromCursor: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - /* - * 功能描述:通过游标从光标处加载数据 - * Made By CuiCan - */ - private void loadFromCursor(Cursor c) { - //直接从一条记录中的获得以下变量的初始值 - mId = c.getLong(ID_COLUMN); - mAlertDate = c.getLong(ALERTED_DATE_COLUMN); - mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); - mCreatedDate = c.getLong(CREATED_DATE_COLUMN); - mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); - mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); - mParentId = c.getLong(PARENT_ID_COLUMN); - mSnippet = c.getString(SNIPPET_COLUMN); - mType = c.getInt(TYPE_COLUMN); - mWidgetId = c.getInt(WIDGET_ID_COLUMN); - mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); - mVersion = c.getLong(VERSION_COLUMN); - } - - /* - * 功能描述:通过content机制获取共享数据并加载到数据库当前游标处 - * 参数注解: - * Made By CuiCan - */ - private void loadDataContent() { - Cursor c = null; - mDataList.clear(); - try { - c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, - "(note_id=?)", new String[] { - String.valueOf(mId) - }, null); - if (c != null) { - if (c.getCount() == 0) { - Log.w(TAG, "it seems that the note has not data"); - return; - } - while (c.moveToNext()) { - SqlData data = new SqlData(mContext, c); - mDataList.add(data); - } - } else { - Log.w(TAG, "loadDataContent: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - /* - * 功能描述:设置通过content机制用于共享的数据信息 - * 参数注解: - * Made By CuiCan - */ - public boolean setContent(JSONObject js) { - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - Log.w(TAG, "cannot set system folder"); - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - // for folder we can only update the snnipet and type - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; - if (mIsCreate || mId != id) { - mDiffNoteValues.put(NoteColumns.ID, id); - } - mId = id; - - long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note - .getLong(NoteColumns.ALERTED_DATE) : 0; - if (mIsCreate || mAlertDate != alertDate) { - mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); - } - mAlertDate = alertDate; - - int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note - .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); - if (mIsCreate || mBgColorId != bgColorId) { - mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); - } - mBgColorId = bgColorId; - long createDate = note.has(NoteColumns.CREATED_DATE) ? note - .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mCreatedDate != createDate) { - mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); - } - mCreatedDate = createDate; - - int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note - .getInt(NoteColumns.HAS_ATTACHMENT) : 0; - if (mIsCreate || mHasAttachment != hasAttachment) { - mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); - } - mHasAttachment = hasAttachment; - - long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note - .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mModifiedDate != modifiedDate) { - mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); - } - mModifiedDate = modifiedDate; - - long parentId = note.has(NoteColumns.PARENT_ID) ? note - .getLong(NoteColumns.PARENT_ID) : 0; - if (mIsCreate || mParentId != parentId) { - mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); - } - mParentId = parentId; - - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - - int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) - : AppWidgetManager.INVALID_APPWIDGET_ID; - if (mIsCreate || mWidgetId != widgetId) { - mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); - } - mWidgetId = widgetId; - - int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note - .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; - if (mIsCreate || mWidgetType != widgetType) { - mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); - } - mWidgetType = widgetType; - - long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note - .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; - if (mIsCreate || mOriginParent != originParent) { - mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); - } - mOriginParent = originParent; - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - SqlData sqlData = null; - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - for (SqlData temp : mDataList) { - if (dataId == temp.getId()) { - sqlData = temp; - } - } - } - - if (sqlData == null) { - sqlData = new SqlData(mContext); - mDataList.add(sqlData); - } - - sqlData.setContent(data); - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } - return true; - } - - /* - * 功能描述:获取content机制提供的数据并加载到note中 - * 参数注解: - * Made By CuiCan - */ - public JSONObject getContent() { - try { - JSONObject js = new JSONObject(); - - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - - JSONObject note = new JSONObject(); - if (mType == Notes.TYPE_NOTE) {//类型为note时 - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.ALERTED_DATE, mAlertDate); - note.put(NoteColumns.BG_COLOR_ID, mBgColorId); - note.put(NoteColumns.CREATED_DATE, mCreatedDate); - note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); - note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); - note.put(NoteColumns.PARENT_ID, mParentId); - note.put(NoteColumns.SNIPPET, mSnippet); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.WIDGET_ID, mWidgetId); - note.put(NoteColumns.WIDGET_TYPE, mWidgetType); - note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - - JSONArray dataArray = new JSONArray(); - for (SqlData sqlData : mDataList) { - JSONObject data = sqlData.getContent(); - if (data != null) { - dataArray.put(data); - } - } - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {//类型为文件夹或者 - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.SNIPPET, mSnippet); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - } - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - return null; - } - - /* - * 功能描述:给当前id设置父id - * 参数注解: - * Made By CuiCan - */ - public void setParentId(long id) { - mParentId = id; - mDiffNoteValues.put(NoteColumns.PARENT_ID, id); - } - - /* - * 功能描述:给当前id设置Gtaskid - * 参数注解: - * Made By CuiCan - */ - public void setGtaskId(String gid) { - mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); - } - - /* - * 功能描述:给当前id设置同步id - * 参数注解: - * Made By CuiCan - */ - public void setSyncId(long syncId) { - mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); - } - - /* - * 功能描述:初始化本地修改,即撤销所有当前修改 - * 参数注解: - * Made By CuiCan - */ - public void resetLocalModified() { - mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); - } - - /* - * 功能描述:获得当前id - * 参数注解: - * Made By CuiCan - */ - public long getId() { - return mId; - } - - /* - * 功能描述:获得当前id的父id - * 参数注解: - * Made By CuiCan - */ - public long getParentId() { - return mParentId; - } - - /* - * 功能描述:获取小片段即用于显示的部分便签内容 - * 参数注解: - * Made By CuiCan - */ - public String getSnippet() { - return mSnippet; - } - - /* - * 功能描述:判断是否为便签类型 - * 参数注解: - * Made By CuiCan - */ - public boolean isNoteType() { - return mType == Notes.TYPE_NOTE; - } - - /* - * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 - * 参数注解: - * Made By CuiCan - */ - public void commit(boolean validateVersion) { - if (mIsCreate) { - if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { - mDiffNoteValues.remove(NoteColumns.ID); - } - - Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); - try { - mId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - if (mId == 0) { - throw new IllegalStateException("Create thread id failed"); - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) {//直接使用sqldata中的实现 - sqlData.commit(mId, false, -1); - } - } - } else { - if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { - Log.e(TAG, "No such note"); - throw new IllegalStateException("Try to update note with invalid id"); - } - if (mDiffNoteValues.size() > 0) { - mVersion ++; - int result = 0; - if (!validateVersion) {//构造字符串 - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?)", new String[] { - String.valueOf(mId) - }); - } else { - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", - new String[] { - String.valueOf(mId), String.valueOf(mVersion) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) { - sqlData.commit(mId, validateVersion, mVersion); - } - } - } - - // refresh local info - loadFromCursor(mId); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - - mDiffNoteValues.clear(); - mIsCreate = false; - } -} \ No newline at end of file diff --git a/gtask/data/Task.java b/gtask/data/Task.java deleted file mode 100644 index 3c890b3..0000000 --- a/gtask/data/Task.java +++ /dev/null @@ -1,323 +0,0 @@ -package net.micode.notes.gtask.data; - -public class Task extends Node { - private static final String TAG = Task.class.getSimpleName(); - - private boolean mCompleted;//是否完成 - - private String mNotes; - - private JSONObject mMetaInfo;//将在实例中存储数据的类型 - - private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善) - - private TaskList mParent;//所在的任务列表的指针 - - public Task() { - super(); - mCompleted = false; - mNotes = null; - mPriorSibling = null;//TaskList中当前Task前面的Task的指针 - mParent = null;//当前Task所在的TaskList - mMetaInfo = null; - } - - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_TASK); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - // parent_id - if (mParent!= null) { - js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); - } - - // dest_parent_type - js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - - // list_id - if (mParent!= null) { - js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); - } - - // prior_sibling_id - if (mPriorSibling != null) { - js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-create jsonobject"); - } - - return js; - } - - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - // notes - if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { - setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); - } - - // deleted - if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { - setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); - } - - // completed - if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { - setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get task content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { //��metadata����ʵʩ - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) - || !js.has(GTaskStringUtils.META_HEAD_DATA)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { - Log.e(TAG, "invalid type"); - return; - } - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - setName(data.getString(DataColumns.CONTENT)); - break; - } - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - String name = getName(); - try { - if (mMetaInfo == null) { - // new task created from web - if (name == null) { - Log.w(TAG, "the note seems to be an empty one"); - return null; - } - - JSONObject js = new JSONObject(); - JSONObject note = new JSONObject(); - JSONArray dataArray = new JSONArray(); - JSONObject data = new JSONObject(); - data.put(DataColumns.CONTENT, name); - dataArray.put(data); - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - return js; - } else { - // synced task - JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - data.put(DataColumns.CONTENT, getName()); - break; - } - } - - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - return mMetaInfo; - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public void setMetaInfo(MetaData metaData) { - if (metaData != null && metaData.getNotes() != null) { - try { - mMetaInfo = new JSONObject(metaData.getNotes()); - } catch (JSONException e) { - Log.w(TAG, e.toString()); - mMetaInfo = null; - } - } - } - - public int getSyncAction(Cursor c) { - try { - JSONObject noteInfo = null; - if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { - noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - } - - if (noteInfo == null) { - Log.w(TAG, "it seems that note meta has been deleted"); - return SYNC_ACTION_UPDATE_REMOTE; - } - - if (!noteInfo.has(NoteColumns.ID)) { - Log.w(TAG, "remote note id seems to be deleted"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - // validate the note id now - if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { - Log.w(TAG, "note id doesn't match"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - return SYNC_ACTION_UPDATE_CONFLICT; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - public boolean isWorthSaving() { - return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) - || (getNotes() != null && getNotes().trim().length() > 0); - } - - public void setCompleted(boolean completed) { - this.mCompleted = completed; - } - - public void setNotes(String notes) { - this.mNotes = notes; - } - - public void setPriorSibling(Task priorSibling) { - this.mPriorSibling = priorSibling; - } - - public void setParent(TaskList parent) { - this.mParent = parent; - } - - public boolean getCompleted() { - return this.mCompleted; - } - - public String getNotes() { - return this.mNotes; - } - - public Task getPriorSibling() { - return this.mPriorSibling; - } - - public TaskList getParent() { - return this.mParent; - } - -} \ No newline at end of file diff --git a/gtask/data/TaskList.java b/gtask/data/TaskList.java deleted file mode 100644 index 4922bb4..0000000 --- a/gtask/data/TaskList.java +++ /dev/null @@ -1,370 +0,0 @@ -package net.micode.notes.gtask.data; - -public class TaskList extends Node { - private static final String TAG = TaskList.class.getSimpleName();//tag标记 - - private int mIndex;//当前TaskList的指针 - - private ArrayList mChildren;//类中主要的保存数据的单元,用来实现一个以Task为元素的ArrayList - - public TaskList() { - super(); - mChildren = new ArrayList(); - mIndex = 1; - } - - /* (non-Javadoc) - * @see net.micode.notes.gtask.data.Node#getCreateAction(int) - * 生成并返回一个包含了一定数据的JSONObject实体 - */ - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); - - // entity_delta - JSONObject entity = new JSONObject();//entity实体 - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-create jsonobject"); - } - - return js; - } - - /* (non-Javadoc) - * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) - * 生成并返回一个包含了一定数据的JSONObject实体 - */ - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get tasklist content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - - if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - String name = folder.getString(NoteColumns.SNIPPET); - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); - } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); - else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE); - else - Log.e(TAG, "invalid system folder"); - } else { - Log.e(TAG, "error type"); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - try { - JSONObject js = new JSONObject(); - JSONObject folder = new JSONObject(); - - String folderName = getName(); - if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) - folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), - folderName.length()); - folder.put(NoteColumns.SNIPPET, folderName); - if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) - || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) - folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - else - folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - - js.put(GTaskStringUtils.META_HEAD_NOTE, folder); - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public int getSyncAction(Cursor c) { - try { - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - // for folder conflicts, just apply local modification - return SYNC_ACTION_UPDATE_REMOTE; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - /** - * @return - * 功能:获得TaskList的大小,即mChildren的大小 - */ - public int getChildTaskCount() { - return mChildren.size(); - } - - /** - * @param task - * @return 返回值为是否成功添加任务。 - * 功能:在当前任务表末尾添加新的任务。 - */ - public boolean addChildTask(Task task) { - boolean ret = false; - if (task != null && !mChildren.contains(task)) { - ret = mChildren.add(task); - if (ret) { - // need to set prior sibling and parent - task.setPriorSibling(mChildren.isEmpty() ? null : mChildren - .get(mChildren.size() - 1)); - task.setParent(this); - //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改 - //,接下来几个函数都有相关操作 - } - } - return ret; - } - - /** - * @param task - * @param index - * @return - * 功能:在当前任务表的指定位置添加新的任务。 - */ - public boolean addChildTask(Task task, int index) { - if (index < 0 || index > mChildren.size()) { - Log.e(TAG, "add child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (task != null && pos == -1) { - mChildren.add(index, task); - - // update the task list - Task preTask = null; - Task afterTask = null; - if (index != 0) - preTask = mChildren.get(index - 1); - if (index != mChildren.size() - 1) - afterTask = mChildren.get(index + 1); - - task.setPriorSibling(preTask); - if (afterTask != null) - afterTask.setPriorSibling(task); - } - - return true; - } - - /** - * @param task - * @return 返回删除是否成功 - * 功能:删除TaskList中的一个Task - */ - public boolean removeChildTask(Task task) { - boolean ret = false; - int index = mChildren.indexOf(task); - if (index != -1) { - ret = mChildren.remove(task); - - if (ret) { - // reset prior sibling and parent - task.setPriorSibling(null); - task.setParent(null); - - // update the task list - if (index != mChildren.size()) { - mChildren.get(index).setPriorSibling( - index == 0 ? null : mChildren.get(index - 1)); - } - } - } - return ret; - } - - /** - * @param task - * @param index - * @return - * 功能:将当前TaskList中含有的某个Task移到index位置 - */ - public boolean moveChildTask(Task task, int index) { - - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "move child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (pos == -1) { - Log.e(TAG, "move child task: the task should in the list"); - return false; - } - - if (pos == index) - return true; - return (removeChildTask(task) && addChildTask(task, index)); - //利用已实现好的功能完成当下功能; - } - - /** - * @param gid - * @return返回寻找结果 - * 功能:按gid寻找Task - */ - public Task findChildTaskByGid(String gid) { - for (int i = 0; i < mChildren.size(); i++) { - Task t = mChildren.get(i); - if (t.getGid().equals(gid)) { - return t; - } - } - return null; - } - - /** - * @param task - * @return - * 功能:返回指定Task的index - */ - public int getChildTaskIndex(Task task) { - return mChildren.indexOf(task); - } - - /** - * @param index - * @return - * 功能:返回指定index的Task - */ - public Task getChildTaskByIndex(int index) { - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "getTaskByIndex: invalid index"); - return null; - } - return mChildren.get(index); - } - - /** - * @param gid - * @return - * 功能:返回指定gid的Task - */ - public Task getChilTaskByGid(String gid) { - for (Task task : mChildren) {//一种常见的ArrayList的遍历方法(四种,见精读笔记) - if (task.getGid().equals(gid)) - return task; - } - return null; - } - - public ArrayList getChildTaskList() { - return this.mChildren; - } - - public void setIndex(int index) { - this.mIndex = index; - } - - public int getIndex() { - return this.mIndex; - } -} \ No newline at end of file diff --git a/gtask/exception/ActionFailureException.java b/gtask/exception/ActionFailureException.java deleted file mode 100644 index f455c7a..0000000 --- a/gtask/exception/ActionFailureException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Description:支持小米便签运行过程中的运行异常处理。 - */ - -package net.micode.notes.gtask.exception; - -public class ActionFailureException extends RuntimeException { - private static final long serialVersionUID = 4425249765923293627L; - /* - * serialVersionUID相当于java类的身份证。主要用于版本控制。 - * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 - * Made By Cuican - */ - - public ActionFailureException() { - super(); - } - /* - * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. - * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 - * 怎么去引用里面的父类对象呢?使用super来引用 - * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) - * Made By Cuican - */ - public ActionFailureException(String paramString) { - super(paramString); - } - - public ActionFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} \ No newline at end of file diff --git a/gtask/exception/NetworkFailureException.java b/gtask/exception/NetworkFailureException.java deleted file mode 100644 index 63a1adb..0000000 --- a/gtask/exception/NetworkFailureException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Description:支持小米便签运行过程中的网络异常处理。 - */ - -package net.micode.notes.gtask.exception; - -public class NetworkFailureException extends Exception { - private static final long serialVersionUID = 2107610287180234136L; - /* - * serialVersionUID相当于java类的身份证。主要用于版本控制。 - * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 - * Made By Cuican - */ - - public NetworkFailureException() { - super(); - } - - /* - * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. - * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 - * 怎么去引用里面的父类对象呢?使用super来引用 - * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) - * Made By Cuican - */ - public NetworkFailureException(String paramString) { - super(paramString); - } - - public NetworkFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} \ No newline at end of file diff --git a/gtask/remote/GTaskASyncTask.java b/gtask/remote/GTaskASyncTask.java deleted file mode 100644 index 364a604..0000000 --- a/gtask/remote/GTaskASyncTask.java +++ /dev/null @@ -1,102 +0,0 @@ -package net.micode.notes.gtask.remote; - -/*异步操作类,实现GTask的异步操作过程 - * 主要方法: - * private void showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法 - * protected Integer doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间 - * protected void onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 - * protected void onPostExecute(Integer result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI - */ -public class GTaskASyncTask extends AsyncTask { - - - private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; - - public interface OnCompleteListener { - void onComplete(); - } - - private Context mContext; - - private NotificationManager mNotifiManager; - - private GTaskManager mTaskManager; - - private OnCompleteListener mOnCompleteListener; - - public GTaskASyncTask(Context context, OnCompleteListener listener) { - mContext = context; - mOnCompleteListener = listener; - mNotifiManager = (NotificationManager) mContext - .getSystemService(Context.NOTIFICATION_SERVICE); - mTaskManager = GTaskManager.getInstance(); - } - - public void cancelSync() { - mTaskManager.cancelSync(); - } - - public void publishProgess(String message) { // 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 - publishProgress(new String[] { - message - }); - } - - private void showNotification(int tickerId, String content) { - Notification notification = new Notification(R.drawable.notification, mContext - .getString(tickerId), System.currentTimeMillis()); - notification.defaults = Notification.DEFAULT_LIGHTS; // 调用系统自带灯光 - notification.flags = Notification.FLAG_AUTO_CANCEL; // 点击清除按钮或点击通知后会自动消失 - PendingIntent pendingIntent; //一个描述了想要启动一个Activity、Broadcast或是Service的意图 - if (tickerId != R.string.ticker_success) { - pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesPreferenceActivity.class), 0); //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象 - - } else { - pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesListActivity.class), 0); //如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象 - } - notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, - pendingIntent); - mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//通过NotificationManager对象的notify()方法来执行一个notification的消息 - } - - @Override - protected Integer doInBackground(Void... unused) { - publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity - .getSyncAccountName(mContext))); //利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext))的字符串内容传进sync_progress_login中 - return mTaskManager.sync(mContext, this); //进行后台同步具体操作 - } - - @Override - protected void onProgressUpdate(String... progress) { - showNotification(R.string.ticker_syncing, progress[0]); - if (mContext instanceof GTaskSyncService) { //instanceof 判断mContext是否是GTaskSyncService的实例 - ((GTaskSyncService) mContext).sendBroadcast(progress[0]); - } - } - - @Override - protected void onPostExecute(Integer result) { //用于在执行完后台任务后更新UI,显示结果 - if (result == GTaskManager.STATE_SUCCESS) { - showNotification(R.string.ticker_success, mContext.getString( - R.string.success_sync_account, mTaskManager.getSyncAccount())); - NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); //设置最新同步的时间 - } else if (result == GTaskManager.STATE_NETWORK_ERROR) { - showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); - } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { - showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); - } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { - showNotification(R.string.ticker_cancel, mContext - .getString(R.string.error_sync_cancelled)); - } //几种不同情况下的结果显示 - if (mOnCompleteListener != null) { - new Thread(new Runnable() { //这里好像是方法内的一个线程,但是并不太懂什么意思 - - public void run() { //完成后的操作,使用onComplete()将所有值都重新初始化,相当于完成一次操作 - mOnCompleteListener.onComplete(); - } - }).start(); - } - } -} \ No newline at end of file diff --git a/gtask/remote/GTaskClient.java b/gtask/remote/GTaskClient.java deleted file mode 100644 index f15dc85..0000000 --- a/gtask/remote/GTaskClient.java +++ /dev/null @@ -1,612 +0,0 @@ -package net.micode.notes.gtask.remote; - -/* - * 主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容 - * 主要使用类或技术:accountManager JSONObject HttpParams authToken Gid - */ -public class GTaskClient { - private static final String TAG = GTaskClient.class.getSimpleName(); - - private static final String GTASK_URL = "https://mail.google.com/tasks/"; //这个是指定的URL - - private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; - - private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; - - private static GTaskClient mInstance = null; - - private DefaultHttpClient mHttpClient; - - private String mGetUrl; - - private String mPostUrl; - - private long mClientVersion; - - private boolean mLoggedin; - - private long mLastLoginTime; - - private int mActionId; - - private Account mAccount; - - private JSONArray mUpdateArray; - - private GTaskClient() { - mHttpClient = null; - mGetUrl = GTASK_GET_URL; - mPostUrl = GTASK_POST_URL; - mClientVersion = -1; - mLoggedin = false; - mLastLoginTime = 0; - mActionId = 1; - mAccount = null; - mUpdateArray = null; - } - - /*用来获取的实例化对象 - * 使用 getInstance() - * 返回mInstance这个实例化对象 - */ - public static synchronized GTaskClient getInstance() { - if (mInstance == null) { - mInstance = new GTaskClient(); - } - return mInstance; - } - - /*用来实现登录操作的函数,传入的参数是一个Activity - * 设置登录操作限制时间,如果超时则需要重新登录 - * 有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录 - * 返回true或者false,即最后是否登陆成功 - */ - public boolean login(Activity activity) { - // we suppose that the cookie would expire after 5 minutes - // then we need to re-login - //判断距离最后一次登录操作是否超过5分钟 - final long interval = 1000 * 60 * 5; - if (mLastLoginTime + interval < System.currentTimeMillis()) { - mLoggedin = false; - } - - // need to re-login after account switch 重新登录操作 - if (mLoggedin - && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity - .getSyncAccountName(activity))) { - mLoggedin = false; - } - - //如果没超过时间,则不需要重新登录 - if (mLoggedin) { - Log.d(TAG, "already logged in"); - return true; - } - - mLastLoginTime = System.currentTimeMillis();//更新最后登录时间,改为系统当前的时间 - String authToken = loginGoogleAccount(activity, false);//判断是否登录到谷歌账户 - if (authToken == null) { - Log.e(TAG, "login google account failed"); - return false; - } - - // login with custom domain if necessary - //尝试使用用户自己的域名登录 - if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() //将用户账号名改为统一格式(小写)后判断是否为一个谷歌账号地址 - .endsWith("googlemail.com"))) { - StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); - int index = mAccount.name.indexOf('@') + 1; - String suffix = mAccount.name.substring(index); - url.append(suffix + "/"); - mGetUrl = url.toString() + "ig"; //设置用户对应的getUrl - mPostUrl = url.toString() + "r/ig"; //设置用户对应的postUrl - - if (tryToLoginGtask(activity, authToken)) { - mLoggedin = true; - } - } - - // try to login with google official url - //如果用户账户无法登录,则使用谷歌官方的URI进行登录 - if (!mLoggedin) { - mGetUrl = GTASK_GET_URL; - mPostUrl = GTASK_POST_URL; - if (!tryToLoginGtask(activity, authToken)) { - return false; - } - } - - mLoggedin = true; - return true; - } - - /*具体实现登录谷歌账户的方法 - * 使用令牌机制 - * 使用AccountManager来管理注册账号 - * 返回值是账号的令牌 - */ - private String loginGoogleAccount(Activity activity, boolean invalidateToken) { - String authToken; //令牌,是登录操作保证安全性的一个方法 - AccountManager accountManager = AccountManager.get(activity);//AccountManager这个类给用户提供了集中注册账号的接口 - Account[] accounts = accountManager.getAccountsByType("com.google");//获取全部以com.google结尾的account - - if (accounts.length == 0) { - Log.e(TAG, "there is no available google account"); - return null; - } - - String accountName = NotesPreferenceActivity.getSyncAccountName(activity); - Account account = null; - //遍历获得的accounts信息,寻找已经记录过的账户信息 - for (Account a : accounts) { - if (a.name.equals(accountName)) { - account = a; - break; - } - } - if (account != null) { - mAccount = account; - } else { - Log.e(TAG, "unable to get an account with the same name in the settings"); - return null; - } - - // get the token now - //获取选中账号的令牌 - AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, - "goanna_mobile", null, activity, null, null); - try { - Bundle authTokenBundle = accountManagerFuture.getResult(); - authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); - //如果是invalidateToken,那么需要调用invalidateAuthToken(String, String)方法废除这个无效token - if (invalidateToken) { - accountManager.invalidateAuthToken("com.google", authToken); - loginGoogleAccount(activity, false); - } - } catch (Exception e) { - Log.e(TAG, "get auth token failed"); - authToken = null; - } - - return authToken; - } - - //尝试登陆Gtask,这只是一个预先判断令牌是否是有效以及是否能登上GTask的方法,而不是具体实现登陆的方法 - private boolean tryToLoginGtask(Activity activity, String authToken) { - if (!loginGtask(authToken)) { - // maybe the auth token is out of authTokedate, now let's invalidate the - // token and try again - //删除过一个无效的authToken,申请一个新的后再次尝试登陆 - authToken = loginGoogleAccount(activity, true); - if (authToken == null) { - Log.e(TAG, "login google account failed"); - return false; - } - - if (!loginGtask(authToken)) { - Log.e(TAG, "login gtask failed"); - return false; - } - } - return true; - } - - //实现登录GTask的具体操作 - private boolean loginGtask(String authToken) { - int timeoutConnection = 10000; - int timeoutSocket = 15000; //socket是一种通信连接实现数据的交换的端口 - HttpParams httpParameters = new BasicHttpParams(); //实例化一个新的HTTP参数类 - HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//设置连接超时时间 - HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//设置设置端口超时时间 - mHttpClient = new DefaultHttpClient(httpParameters); - BasicCookieStore localBasicCookieStore = new BasicCookieStore(); //设置本地cookie - mHttpClient.setCookieStore(localBasicCookieStore); - HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); - - // login gtask - try { - String loginUrl = mGetUrl + "?auth=" + authToken; //设置登录的url - HttpGet httpGet = new HttpGet(loginUrl); //通过登录的uri实例化网页上资源的查找 - HttpResponse response = null; - response = mHttpClient.execute(httpGet); - - // get the cookie now - //获取CookieStore里存放的cookie,看如果存有“GTL(不知道什么意思)”,则说明有验证成功的有效的cookie - List cookies = mHttpClient.getCookieStore().getCookies(); - boolean hasAuthCookie = false; - for (Cookie cookie : cookies) { - if (cookie.getName().contains("GTL")) { - hasAuthCookie = true; - } - } - if (!hasAuthCookie) { - Log.w(TAG, "it seems that there is no auth cookie"); - } - - // get the client version - //获取client的内容,具体操作是在返回的Content中截取从_setup(开始到)}中间的字符串内容,也就是gtask_url的内容 - String resString = getResponseContent(response.getEntity()); - String jsBegin = "_setup("; - String jsEnd = ")}"; - int begin = resString.indexOf(jsBegin); - int end = resString.lastIndexOf(jsEnd); - String jsString = null; - if (begin != -1 && end != -1 && begin < end) { - jsString = resString.substring(begin + jsBegin.length(), end); - } - JSONObject js = new JSONObject(jsString); - mClientVersion = js.getLong("v"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } catch (Exception e) { - // simply catch all exceptions - Log.e(TAG, "httpget gtask_url failed"); - return false; - } - - return true; - } - - private int getActionId() { - return mActionId++; - } - - /*实例化创建一个用于向网络传输数据的对象 - * 使用HttpPost类 - * 返回一个httpPost实例化对象,但里面还没有内容 - */ - private HttpPost createHttpPost() { - HttpPost httpPost = new HttpPost(mPostUrl); - httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); - httpPost.setHeader("AT", "1"); - return httpPost; - } - - /*通过URL获取响应后返回的数据,也就是网络上的数据和资源 - * 使用getContentEncoding()获取网络上的资源和数据 - * 返回值就是获取到的资源 - */ - private String getResponseContent(HttpEntity entity) throws IOException { - String contentEncoding = null; - if (entity.getContentEncoding() != null) {//通过URL得到HttpEntity对象,如果不为空则使用getContent()方法创建一个流将数据从网络都过来 - contentEncoding = entity.getContentEncoding().getValue(); - Log.d(TAG, "encoding: " + contentEncoding); - } - - InputStream input = entity.getContent(); - if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {//GZIP是使用DEFLATE进行压缩数据的另一个压缩库 - input = new GZIPInputStream(entity.getContent()); - } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {//DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩 - Inflater inflater = new Inflater(true); - input = new InflaterInputStream(entity.getContent(), inflater); - } - - try { - InputStreamReader isr = new InputStreamReader(input); - BufferedReader br = new BufferedReader(isr);//是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了时候,再读入内存,是为了提供读的效率而设计的 - StringBuilder sb = new StringBuilder(); - - while (true) { - String buff = br.readLine(); - if (buff == null) { - return sb.toString(); - } - sb = sb.append(buff); - } - } finally { - input.close(); - } - } - - /*通过JSON发送请求 - * 请求的具体内容在json的实例化对象js中然后传入 - * 利用UrlEncodedFormEntity entity和httpPost.setEntity(entity)方法把js中的内容放置到httpPost中 - * 执行请求后使用getResponseContent方法得到返回的数据和资源 - * 将资源再次放入json后返回 - */ - private JSONObject postRequest(JSONObject js) throws NetworkFailureException { - if (!mLoggedin) {//未登录 - Log.e(TAG, "please login first"); - throw new ActionFailureException("not logged in"); - } - - //实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里 - HttpPost httpPost = createHttpPost(); - try { - LinkedList list = new LinkedList(); - list.add(new BasicNameValuePair("r", js.toString())); - UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); //UrlEncodedFormEntity()的形式比较单一,是普通的键值对 - httpPost.setEntity(entity); - - // execute the post - //执行这个请求 - HttpResponse response = mHttpClient.execute(httpPost); - String jsString = getResponseContent(response.getEntity()); - return new JSONObject(jsString); - - } catch (ClientProtocolException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("postRequest failed"); - } catch (IOException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("postRequest failed"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("unable to convert response content to jsonobject"); - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("error occurs when posting request"); - } - } - - /*创建单个任务 - * 传入参数是一个.gtask.data.Task包里Task类的对象 - * 利用json获取Task里的内容,并且创建相应的jsPost - * 利用postRequest得到任务的返回信息 - * 使用task.setGid设置task的new_ID - */ - public void createTask(Task task) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - actionList.put(task.getCreateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - // post - JSONObject jsResponse = postRequest(jsPost); - JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( - GTaskStringUtils.GTASK_JSON_RESULTS).get(0); - task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("create task: handing jsonobject failed"); - } - } - - /* - * 创建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid - */ - public void createTaskList(TaskList tasklist) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - actionList.put(tasklist.getCreateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - // post - JSONObject jsResponse = postRequest(jsPost); - JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( - GTaskStringUtils.GTASK_JSON_RESULTS).get(0); - tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("create tasklist: handing jsonobject failed"); - } - } - - /* - * 同步更新操作 - * 使用JSONObject进行数据存储,使用jsPost.put,Put的信息包括UpdateArray和ClientVersion - * 使用postRequest发送这个jspost,进行处理 - */ - public void commitUpdate() throws NetworkFailureException { - if (mUpdateArray != null) { - try { - JSONObject jsPost = new JSONObject(); - - // action_list - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - mUpdateArray = null; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("commit update: handing jsonobject failed"); - } - } - } - - /* - * 添加更新的事项 - * 调用commitUpdate()实现 - */ - public void addUpdateNode(Node node) throws NetworkFailureException { - if (node != null) { - // too many update items may result in an error - // set max to 10 items - if (mUpdateArray != null && mUpdateArray.length() > 10) { - commitUpdate(); - } - - if (mUpdateArray == null) - mUpdateArray = new JSONArray(); - mUpdateArray.put(node.getUpdateAction(getActionId())); - } - } - - /* - * 移动task,比如讲task移动到不同的task列表中去 - * 通过getGid获取task所属列表的gid - * 通过JSONObject.put(String name, Object value)函数设置移动后的task的相关属性值,从而达到移动的目的 - * 最后还是通过postRequest进行更新后的发送 - */ - public void moveTask(Task task, TaskList preParent, TaskList curParent) - throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - JSONObject action = new JSONObject(); - - // action_list - action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); - action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); - if (preParent == curParent && task.getPriorSibling() != null) { - // put prioring_sibing_id only if moving within the tasklist and - // it is not the first one - //设置优先级ID,只有当移动是发生在文件中 - action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); - } - action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); //设置移动前所属列表 - action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); //设置当前所属列表 - if (preParent != curParent) { - // put the dest_list only if moving between tasklists - action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); - } - actionList.put(action); - //最后将ACTION_LIST加入到jsPost中 - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("move task: handing jsonobject failed"); - } - } - - /* - * 删除操作节点 - * 还是利用JSON - * 删除过后使用postRequest发送删除后的结果 - */ - public void deleteNode(Node node) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - node.setDeleted(true); - actionList.put(node.getUpdateAction(getActionId())); //这里会获取到删除操作的ID,加入到actionLiast中 - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - mUpdateArray = null; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("delete node: handing jsonobject failed"); - } - } - - /* - * 获取任务列表 - * 首先通过GetURI使用getResponseContent从网上获取数据 - * 然后筛选出"_setup("到)}的部分,并且从中获取GTASK_JSON_LISTS的内容返回 - */ - public JSONArray getTaskLists() throws NetworkFailureException { - if (!mLoggedin) { - Log.e(TAG, "please login first"); - throw new ActionFailureException("not logged in"); - } - - try { - HttpGet httpGet = new HttpGet(mGetUrl); - HttpResponse response = null; - response = mHttpClient.execute(httpGet); - - // get the task list - //筛选工作,把筛选出的字符串放入jsString - String resString = getResponseContent(response.getEntity()); - String jsBegin = "_setup("; - String jsEnd = ")}"; - int begin = resString.indexOf(jsBegin); - int end = resString.lastIndexOf(jsEnd); - String jsString = null; - if (begin != -1 && end != -1 && begin < end) { - jsString = resString.substring(begin + jsBegin.length(), end); - } - JSONObject js = new JSONObject(jsString); - //获取GTASK_JSON_LISTS - return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); - } catch (ClientProtocolException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("gettasklists: httpget failed"); - } catch (IOException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("gettasklists: httpget failed"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("get task lists: handing jasonobject failed"); - } - } - - /* - * 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务 - */ - public JSONArray getTaskList(String listGid) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - JSONObject action = new JSONObject(); - - // action_list - action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); - action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); //这里设置为传入的listGid - action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); - actionList.put(action); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - JSONObject jsResponse = postRequest(jsPost); - return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("get task list: handing jsonobject failed"); - } - } - - public Account getSyncAccount() { - return mAccount; - } - - //重置更新的内容 - public void resetUpdateArray() { - mUpdateArray = null; - } -} \ No newline at end of file diff --git a/gtask/remote/GTaskManager.java b/gtask/remote/GTaskManager.java deleted file mode 100644 index a8c1f2a..0000000 --- a/gtask/remote/GTaskManager.java +++ /dev/null @@ -1,846 +0,0 @@ -package net.micode.notes.gtask.remote; - -public class GTaskManager { - private static final String TAG = GTaskManager.class.getSimpleName(); - public static final int STATE_SUCCESS = 0; - public static final int STATE_NETWORK_ERROR = 1; - public static final int STATE_INTERNAL_ERROR = 2; - public static final int STATE_SYNC_IN_PROGRESS = 3; - public static final int STATE_SYNC_CANCELLED = 4; - private static GTaskManager mInstance = null; - - private Activity mActivity; - private Context mContext; - private ContentResolver mContentResolver; - private boolean mSyncing; - private boolean mCancelled; - private HashMap mGTaskListHashMap; - private HashMap mGTaskHashMap; - private HashMap mMetaHashMap; - private TaskList mMetaList; - private HashSet mLocalDeleteIdMap; - private HashMap mGidToNid; - private HashMap mNidToGid; - - private GTaskManager() { //对象初始化函数 - mSyncing = false; //正在同步,flase代表未执行 - mCancelled = false; //全局标识,flase代表可以执行 - mGTaskListHashMap = new HashMap(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。 - mGTaskHashMap = new HashMap(); - mMetaHashMap = new HashMap(); - mMetaList = null; - mLocalDeleteIdMap = new HashSet(); - mGidToNid = new HashMap(); //GoogleID to NodeID?? - mNidToGid = new HashMap(); //NodeID to GoogleID???通过hashmap散列表建立映射 - } - - /** - * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 - * 功能:类初始化函数 - * @author TTS - * @return GtaskManger - */ - public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized - if (mInstance == null) { - mInstance = new GTaskManager(); - } - return mInstance; - } - - /** - * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 - * @author TTS - * @param activity - */ - public synchronized void setActivityContext(Activity activity) { - // used for getting auth token - mActivity = activity; - } - - /** - * 核心函数 - * 功能:实现了本地同步操作和远端同步操作 - * @author TTS - * @param context-----获取上下文 - * @param asyncTask-------用于同步的异步操作类 - * @return int - */ - public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数 - if (mSyncing) { - Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug - return STATE_SYNC_IN_PROGRESS; - } - mContext = context; - mContentResolver = mContext.getContentResolver(); - mSyncing = true; - mCancelled = false; - mGTaskListHashMap.clear(); - mGTaskHashMap.clear(); - mMetaHashMap.clear(); - mLocalDeleteIdMap.clear(); - mGidToNid.clear(); - mNidToGid.clear(); - - try { - GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机 - client.resetUpdateArray(); //JSONArray类型,reset即置为NULL - - // login google task - if (!mCancelled) { - if (!client.login(mActivity)) { - throw new NetworkFailureException("login google task failed"); - } - } - - // get the task list from google - asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); - initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList - - // do content sync work - asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); - syncContent(); - } catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常 - Log.e(TAG, e.toString()); //创建日志文件(调试信息),error - return STATE_NETWORK_ERROR; - } catch (ActionFailureException e) { //此类异常为操作异常 - Log.e(TAG, e.toString()); - return STATE_INTERNAL_ERROR; - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return STATE_INTERNAL_ERROR; - } finally { - mGTaskListHashMap.clear(); - mGTaskHashMap.clear(); - mMetaHashMap.clear(); - mLocalDeleteIdMap.clear(); - mGidToNid.clear(); - mNidToGid.clear(); - mSyncing = false; - } - - return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; - } - - /** - *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。 - *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap - *@author TTS - *@exception NetworkFailureException - *@return void - */ - private void initGTaskList() throws NetworkFailureException { - if (mCancelled) - return; - GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机 - try { - //Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。 - //其格式为{"key1":value1,"key2",value2....};key 必须是字符串。 - //因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。 - JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list------lists??? - - // init meta list first - mMetaList = null; //TaskList类型 - for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); - - if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { - mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化 - mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname... - - // load meta data - JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list------list??? - for (int j = 0; j < jsMetas.length(); j++) { - object = (JSONObject) jsMetas.getJSONObject(j); - MetaData metaData = new MetaData(); //继承自Node - metaData.setContentByRemoteJSON(object); - if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList - mMetaList.addChildTask(metaData); - if (metaData.getGid() != null) { - mMetaHashMap.put(metaData.getRelatedGid(), metaData); - } - } - } - } - } - - // create meta list if not existed - if (mMetaList == null) { - mMetaList = new TaskList(); - mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_META); - GTaskClient.getInstance().createTaskList(mMetaList); - } - - // init task list - for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。 - String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); - - if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) - && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_META)) { - TaskList tasklist = new TaskList(); //继承自Node - tasklist.setContentByRemoteJSON(object); - mGTaskListHashMap.put(gid, tasklist); - mGTaskHashMap.put(gid, tasklist); //为什么加两遍??? - - // load tasks - JSONArray jsTasks = client.getTaskList(gid); - for (int j = 0; j < jsTasks.length(); j++) { - object = (JSONObject) jsTasks.getJSONObject(j); - gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - Task task = new Task(); - task.setContentByRemoteJSON(object); - if (task.isWorthSaving()) { - task.setMetaInfo(mMetaHashMap.get(gid)); - tasklist.addChildTask(task); - mGTaskHashMap.put(gid, task); - } - } - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("initGTaskList: handing JSONObject failed"); - } - } - - /** - * 功能:本地内容同步操作 - * @throws NetworkFailureException - * @return 无返回值 - */ - private void syncContent() throws NetworkFailureException { //本地内容同步操作 - int syncType; - Cursor c = null; //数据库指针 - String gid; //GoogleID?? - Node node; //Node包含Sync_Action的不同类型 - - mLocalDeleteIdMap.clear(); //HashSet类型 - - if (mCancelled) { - return; - } - - // for local deleted note - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type<>? AND parent_id=?)", new String[] { - String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, null); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); - } - - mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); - } - } else { - Log.w(TAG, "failed to query trash folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // sync folder first - syncFolder(); - - // for note existing in database - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type=? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //通过hashmap建立联系 - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //通过hashmap建立联系 - syncType = node.getSyncAction(c); - } else { - if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add - syncType = Node.SYNC_ACTION_ADD_REMOTE; - } else { - // remote delete - syncType = Node.SYNC_ACTION_DEL_LOCAL; - } - } - doContentSync(syncType, node, c); - } - } else { - Log.w(TAG, "failed to query existing note in database"); - } - - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // go through remaining items - Iterator> iter = mGTaskHashMap.entrySet().iterator(); //Iterator迭代器 - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - node = entry.getValue(); - doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); - } - - // mCancelled can be set by another thread, so we neet to check one by //thread----线程 - // one - // clear local delete table - if (!mCancelled) { - if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { - throw new ActionFailureException("failed to batch-delete local deleted notes"); - } - } - - // refresh local sync id - if (!mCancelled) { - GTaskClient.getInstance().commitUpdate(); - refreshLocalSyncId(); - } - - } - - /** - * 功能: - * @author TTS - * @throws NetworkFailureException - */ - private void syncFolder() throws NetworkFailureException { - Cursor c = null; - String gid; - Node node; - int syncType; - - if (mCancelled) { - return; - } - - // for root folder - try { - c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, - Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); - if (c != null) { - c.moveToNext(); - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); - mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); - // for system folder, only update remote name if necessary - if (!node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) - doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); - } else { - doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); - } - } else { - Log.w(TAG, "failed to query root folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for call-note folder - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(Notes.ID_CALL_RECORD_FOLDER) - }, null); - if (c != null) { - if (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); - mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); - // for system folder, only update remote name if - // necessary - if (!node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE)) - doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); - } else { - doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); - } - } - } else { - Log.w(TAG, "failed to query call note folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for local existing folders - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type=? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); - syncType = node.getSyncAction(c); - } else { - if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add - syncType = Node.SYNC_ACTION_ADD_REMOTE; - } else { - // remote delete - syncType = Node.SYNC_ACTION_DEL_LOCAL; - } - } - doContentSync(syncType, node, c); - } - } else { - Log.w(TAG, "failed to query existing folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for remote add folders - Iterator> iter = mGTaskListHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - gid = entry.getKey(); - node = entry.getValue(); - if (mGTaskHashMap.containsKey(gid)) { - mGTaskHashMap.remove(gid); - doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); - } - } - - if (!mCancelled) - GTaskClient.getInstance().commitUpdate(); - } - - /** - * 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode - * @author TTS - * @param syncType - * @param node - * @param c - * @throws NetworkFailureException - */ - private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - MetaData meta; - switch (syncType) { - case Node.SYNC_ACTION_ADD_LOCAL: - addLocalNode(node); - break; - case Node.SYNC_ACTION_ADD_REMOTE: - addRemoteNode(node, c); - break; - case Node.SYNC_ACTION_DEL_LOCAL: - meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); - if (meta != null) { - GTaskClient.getInstance().deleteNode(meta); - } - mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); - break; - case Node.SYNC_ACTION_DEL_REMOTE: - meta = mMetaHashMap.get(node.getGid()); - if (meta != null) { - GTaskClient.getInstance().deleteNode(meta); - } - GTaskClient.getInstance().deleteNode(node); - break; - case Node.SYNC_ACTION_UPDATE_LOCAL: - updateLocalNode(node, c); - break; - case Node.SYNC_ACTION_UPDATE_REMOTE: - updateRemoteNode(node, c); - break; - case Node.SYNC_ACTION_UPDATE_CONFLICT: - // merging both modifications maybe a good idea - // right now just use local update simply - updateRemoteNode(node, c); - break; - case Node.SYNC_ACTION_NONE: - break; - case Node.SYNC_ACTION_ERROR: - default: - throw new ActionFailureException("unkown sync action type"); - } - } - - /** - * 功能:本地增加Node - * @author TTS - * @param node - * @throws NetworkFailureException - */ - private void addLocalNode(Node node) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote; - if (node instanceof TaskList) { - if (node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { - sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); - } else if (node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { - sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); - } else { - sqlNote = new SqlNote(mContext); - sqlNote.setContent(node.getLocalJSONFromContent()); - sqlNote.setParentId(Notes.ID_ROOT_FOLDER); - } - } else { - sqlNote = new SqlNote(mContext); - JSONObject js = node.getLocalJSONFromContent(); - try { - if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.has(NoteColumns.ID)) { - long id = note.getLong(NoteColumns.ID); - if (DataUtils.existInNoteDatabase(mContentResolver, id)) { - // the id is not available, have to create a new one - note.remove(NoteColumns.ID); - } - } - } - - if (js.has(GTaskStringUtils.META_HEAD_DATA)) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { - // the data id is not available, have to create - // a new one - data.remove(DataColumns.ID); - } - } - } - - } - } catch (JSONException e) { - Log.w(TAG, e.toString()); - e.printStackTrace(); - } - sqlNote.setContent(js); - - Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); - if (parentId == null) { - Log.e(TAG, "cannot find task's parent id locally"); - throw new ActionFailureException("cannot add local node"); - } - sqlNote.setParentId(parentId.longValue()); - } - - // create the local node - sqlNote.setGtaskId(node.getGid()); - sqlNote.commit(false); - - // update gid-nid mapping - mGidToNid.put(node.getGid(), sqlNote.getId()); - mNidToGid.put(sqlNote.getId(), node.getGid()); - - // update meta - updateRemoteMeta(node.getGid(), sqlNote); - } - - /** - * 功能:update本地node - * @author TTS - * @param node - * ----同步操作的基础数据类型 - * @param c - * ----Cursor - * @throws NetworkFailureException - */ - private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote; - // update the note locally - sqlNote = new SqlNote(mContext, c); - sqlNote.setContent(node.getLocalJSONFromContent()); - - Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) - : new Long(Notes.ID_ROOT_FOLDER); - if (parentId == null) { - Log.e(TAG, "cannot find task's parent id locally"); - throw new ActionFailureException("cannot update local node"); - } - sqlNote.setParentId(parentId.longValue()); - sqlNote.commit(true); - - // update meta info - updateRemoteMeta(node.getGid(), sqlNote); - } - - /** - * 功能:远程增加Node - * 需要updateRemoteMeta - * @author TTS - * @param node - * ----同步操作的基础数据类型 - * @param c - * --Cursor - * @throws NetworkFailureException - */ - private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote = new SqlNote(mContext, c); //从本地mContext中获取内容 - Node n; - - // update remotely - if (sqlNote.isNoteType()) { - Task task = new Task(); - task.setContentByLocalJSON(sqlNote.getContent()); - - String parentGid = mNidToGid.get(sqlNote.getParentId()); - if (parentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); //调试信息 - throw new ActionFailureException("cannot add remote task"); - } - mGTaskListHashMap.get(parentGid).addChildTask(task); //在本地生成的GTaskList中增加子结点 - - //登录远程服务器,创建Task - GTaskClient.getInstance().createTask(task); - n = (Node) task; - - // add meta - updateRemoteMeta(task.getGid(), sqlNote); - } else { - TaskList tasklist = null; - - // we need to skip folder if it has already existed - String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; - if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) - folderName += GTaskStringUtils.FOLDER_DEFAULT; - else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) - folderName += GTaskStringUtils.FOLDER_CALL_NOTE; - else - folderName += sqlNote.getSnippet(); - - //iterator迭代器,通过统一的接口迭代所有的map元素 - Iterator> iter = mGTaskListHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - String gid = entry.getKey(); - TaskList list = entry.getValue(); - - if (list.getName().equals(folderName)) { - tasklist = list; - if (mGTaskHashMap.containsKey(gid)) { - mGTaskHashMap.remove(gid); - } - break; - } - } - - // no match we can add now - if (tasklist == null) { - tasklist = new TaskList(); - tasklist.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().createTaskList(tasklist); - mGTaskListHashMap.put(tasklist.getGid(), tasklist); - } - n = (Node) tasklist; - } - - // update local note - sqlNote.setGtaskId(n.getGid()); - sqlNote.commit(false); - sqlNote.resetLocalModified(); - sqlNote.commit(true); - - // gid-id mapping //创建id间的映射 - mGidToNid.put(n.getGid(), sqlNote.getId()); - mNidToGid.put(sqlNote.getId(), n.getGid()); - } - - /** - * 功能:更新远端的Node,包含meta更新(updateRemoteMeta) - * @author TTS - * @param node - * ----同步操作的基础数据类型 - * @param c - * --Cursor - * @throws NetworkFailureException - */ - private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote = new SqlNote(mContext, c); - - // update remotely - node.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(node); //GTaskClient用途为从本地登陆远端服务器 - - // update meta - updateRemoteMeta(node.getGid(), sqlNote); - - // move task if necessary - if (sqlNote.isNoteType()) { - Task task = (Task) node; - TaskList preParentList = task.getParent(); - //preParentList为通过node获取的父节点列表 - - String curParentGid = mNidToGid.get(sqlNote.getParentId()); - //curParentGid为通过光标在数据库中找到sqlNote的mParentId,再通过mNidToGid由long类型转为String类型的Gid - - if (curParentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); - throw new ActionFailureException("cannot update remote task"); - } - TaskList curParentList = mGTaskListHashMap.get(curParentGid); - //通过HashMap找到对应Gid的TaskList - - if (preParentList != curParentList) { //????????????? - preParentList.removeChildTask(task); - curParentList.addChildTask(task); - GTaskClient.getInstance().moveTask(task, preParentList, curParentList); - } - } - - // clear local modified flag - sqlNote.resetLocalModified(); - //commit到本地数据库 - sqlNote.commit(true); - } - - /** - * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。 - * @author TTS - * @param gid - * ---GoogleID为String类型 - * @param sqlNote - * ---同步前的数据库操作,故使用类SqlNote - * @throws NetworkFailureException - */ - private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { - if (sqlNote != null && sqlNote.isNoteType()) { - MetaData metaData = mMetaHashMap.get(gid); - if (metaData != null) { - metaData.setMeta(gid, sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(metaData); - } else { - metaData = new MetaData(); - metaData.setMeta(gid, sqlNote.getContent()); - mMetaList.addChildTask(metaData); - mMetaHashMap.put(gid, metaData); - GTaskClient.getInstance().createTask(metaData); - } - } - } - - /** - * 功能:刷新本地,给sync的ID对应上最后更改过的对象 - * @author TTS - * @return void - * @throws NetworkFailureException - */ - private void refreshLocalSyncId() throws NetworkFailureException { - if (mCancelled) { - return; - } - - // get the latest gtask list //获取最近的(最晚的)gtask list - mGTaskHashMap.clear(); - mGTaskListHashMap.clear(); - mMetaHashMap.clear(); - initGTaskList(); - - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type<>? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); //query语句:五个参数,NoteColumns.TYPE + " DESC"-----为按类型递减顺序返回查询结果。new String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------为选择参数。"(type<>? AND parent_id<>?)"-------指明返回行过滤器。SqlNote.PROJECTION_NOTE--------应返回的数据列的名字。Notes.CONTENT_NOTE_URI--------contentProvider包含所有数据集所对应的uri - if (c != null) { - while (c.moveToNext()) { - String gid = c.getString(SqlNote.GTASK_ID_COLUMN); - Node node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - ContentValues values = new ContentValues(); //在ContentValues中创建键值对。准备通过contentResolver写入数据 - values.put(NoteColumns.SYNC_ID, node.getLastModified()); - mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //进行批量更改,选择参数为NULL,应该可以用insert替换,参数分别为表名和需要更新的value对象。 - c.getLong(SqlNote.ID_COLUMN)), values, null, null); - } else { - Log.e(TAG, "something is missed"); - throw new ActionFailureException( - "some local items don't have gid after sync"); - } - } - } else { - Log.w(TAG, "failed to query local note to refresh sync id"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - } - - /** - * 功能:获取同步账号,mAccount.name - * @author TTS - * @return String - */ - public String getSyncAccount() { - return GTaskClient.getInstance().getSyncAccount().name; - } - - /** - * 功能:取消同步,置mCancelled为true - * @author TTS - */ - public void cancelSync() { - mCancelled = true; - } -} \ No newline at end of file diff --git a/gtask/remote/GTaskSyncService.java b/gtask/remote/GTaskSyncService.java deleted file mode 100644 index bf7fb43..0000000 --- a/gtask/remote/GTaskSyncService.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.micode.notes.gtask.remote; - -/* - * Service是在一段不定的时间运行在后台,不和用户交互的应用组件 - * 主要方法: - * private void startSync() 启动一个同步工作 - * private void cancelSync() 取消同步 - * public void onCreate() - * public int onStartCommand(Intent intent, int flags, int startId) service生命周期的组成部分,相当于重启service(比如在被暂停之后),而不是创建一个新的service - * public void onLowMemory() 在没有内存的情况下如果存在service则结束掉这的service - * public IBinder onBind() - * public void sendBroadcast(String msg) 发送同步的相关通知 - * public static void startSync(Activity activity) - * public static void cancelSync(Context context) - * public static boolean isSyncing() 判读是否在进行同步 - * public static String getProgressString() 获取当前进度的信息 - */ - -public class GTaskSyncService extends Service { - public final static String ACTION_STRING_NAME = "sync_action_type"; - - public final static int ACTION_START_SYNC = 0; - - public final static int ACTION_CANCEL_SYNC = 1; - - public final static int ACTION_INVALID = 2; - - public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; - - public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; - - public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; - - private static GTaskASyncTask mSyncTask = null; - - private static String mSyncProgress = ""; - - //开始一个同步的工作 - private void startSync() { - if (mSyncTask == null) { - mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { - public void onComplete() { - mSyncTask = null; - sendBroadcast(""); - stopSelf(); - } - }); - sendBroadcast(""); - mSyncTask.execute(); //这个函数让任务是以单线程队列方式或线程池队列方式运行 - } - } - - - private void cancelSync() { - if (mSyncTask != null) { - mSyncTask.cancelSync(); - } - } - - @Override - public void onCreate() { //初始化一个service - mSyncTask = null; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - Bundle bundle = intent.getExtras(); - if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { - switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { - //两种情况,开始同步或者取消同步 - case ACTION_START_SYNC: - startSync(); - break; - case ACTION_CANCEL_SYNC: - cancelSync(); - break; - default: - break; - } - return START_STICKY; //等待新的intent来是这个service继续运行 - } - return super.onStartCommand(intent, flags, startId); - } - - @Override - public void onLowMemory() { - if (mSyncTask != null) { - mSyncTask.cancelSync(); - } - } - - public IBinder onBind(Intent intent) { //不知道干吗用的 - return null; - } - - public void sendBroadcast(String msg) { - mSyncProgress = msg; - Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); //创建一个新的Intent - intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); //附加INTENT中的相应参数的值 - intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); - sendBroadcast(intent); //发送这个通知 - } - - public static void startSync(Activity activity) {//执行一个service,service的内容里的同步动作就是开始同步 - GTaskManager.getInstance().setActivityContext(activity); - Intent intent = new Intent(activity, GTaskSyncService.class); - intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); - activity.startService(intent); - } - - public static void cancelSync(Context context) {//执行一个service,service的内容里的同步动作就是取消同步 - Intent intent = new Intent(context, GTaskSyncService.class); - intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); - context.startService(intent); - } - - public static boolean isSyncing() { - return mSyncTask != null; - } - - public static String getProgressString() { - return mSyncProgress; - } -} \ No newline at end of file -- 2.34.1 From b9cb3d959c47ec6eebca4e65e934da5bba973d77 Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Fri, 21 Apr 2023 13:38:03 +0800 Subject: [PATCH 09/20] 1 --- gtask注释/data/MetaData.java | 104 +++ gtask注释/data/Node.java | 90 ++ gtask注释/data/SqlData.java | 224 +++++ gtask注释/data/SqlNote.java | 577 ++++++++++++ gtask注释/data/Task.java | 323 +++++++ gtask注释/data/TaskList.java | 370 ++++++++ .../exception/ActionFailureException.java | 32 + .../exception/NetworkFailureException.java | 33 + gtask注释/remote/GTaskASyncTask.java | 102 +++ gtask注释/remote/GTaskClient.java | 612 +++++++++++++ gtask注释/remote/GTaskManager.java | 846 ++++++++++++++++++ gtask注释/remote/GTaskSyncService.java | 124 +++ 12 files changed, 3437 insertions(+) create mode 100644 gtask注释/data/MetaData.java create mode 100644 gtask注释/data/Node.java create mode 100644 gtask注释/data/SqlData.java create mode 100644 gtask注释/data/SqlNote.java create mode 100644 gtask注释/data/Task.java create mode 100644 gtask注释/data/TaskList.java create mode 100644 gtask注释/exception/ActionFailureException.java create mode 100644 gtask注释/exception/NetworkFailureException.java create mode 100644 gtask注释/remote/GTaskASyncTask.java create mode 100644 gtask注释/remote/GTaskClient.java create mode 100644 gtask注释/remote/GTaskManager.java create mode 100644 gtask注释/remote/GTaskSyncService.java diff --git a/gtask注释/data/MetaData.java b/gtask注释/data/MetaData.java new file mode 100644 index 0000000..0f33467 --- /dev/null +++ b/gtask注释/data/MetaData.java @@ -0,0 +1,104 @@ +package net.micode.notes.gtask.data; + +public class MetaData extends Task { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + */ + private final static String TAG = MetaData.class.getSimpleName(); + private String mRelatedGid = null; + /* + * 功能描述:设置数据,即生成元数据库 + * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 + * 参数注解: + */ + public void setMeta(String gid, JSONObject metaInfo) + { + //对函数块进行注释 + try { + metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); + /* + * 将这对键值放入metaInfo这个jsonobject对象中 + */ + } catch (JSONException e) { + Log.e(TAG, "failed to put related gid"); + /* + * 输出错误信息 + */ + } + setNotes(metaInfo.toString()); + setName(GTaskStringUtils.META_NOTE_NAME); + } + /* + * 功能描述:获取相关联的Gid + */ + public String getRelatedGid() { + return mRelatedGid; + } + /* + * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 + * Made By CuiCan + */ + @Override + public boolean isWorthSaving() { + return getNotes() != null; + } + /* + * 功能描述:使用远程json数据对象设置元数据内容 + * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 + * 参数注解: + */ + @Override + public void setContentByRemoteJSON(JSONObject js) { + super.setContentByRemoteJSON(js); + if (getNotes() != null) { + try { + JSONObject metaInfo = new JSONObject(getNotes().trim()); + mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); + } catch (JSONException e) { + Log.w(TAG, "failed to get related gid"); + /* + * 输出警告信息 + */ + mRelatedGid = null; + } + } + } + /* + * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public void setContentByLocalJSON(JSONObject js) { + // this function should not be called + throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); + /* + * 传递非法参数异常 + */ + } + /* + * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public JSONObject getLocalJSONFromContent() { + throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); + /* + * 传递非法参数异常 + * Made By Cui Can + */ + } + /* + * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public int getSyncAction(Cursor c) { + throw new IllegalAccessError("MetaData:getSyncAction should not be called"); + /* + * 传递非法参数异常 + * Made By Cui Can + */ + } + +} \ No newline at end of file diff --git a/gtask注释/data/Node.java b/gtask注释/data/Node.java new file mode 100644 index 0000000..47f7461 --- /dev/null +++ b/gtask注释/data/Node.java @@ -0,0 +1,90 @@ +package net.micode.notes.gtask.data; + +import android.database.Cursor; + +import org.json.JSONObject; + +/** + * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 + * 关键字:abstract + */ +public abstract class Node { + //定义了各种用于表征同步状态的常量 + public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) + + public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 + + public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 + + public static final int SYNC_ACTION_DEL_REMOTE = 3;// 需要在远程云端删除内容 + + public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 + + public static final int SYNC_ACTION_UPDATE_REMOTE = 5;// 需要将本地内容更新到远程云端 + + public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 + + public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 + + public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 + + private String mGid; + + private String mName; + + private long mLastModified;//记录最后一次修改时间 + + private boolean mDeleted;//表征是否被删除 + + public Node() { + mGid = null; + mName = ""; + mLastModified = 0; + mDeleted = false; + } + + public abstract JSONObject getCreateAction(int actionId); + + public abstract JSONObject getUpdateAction(int actionId); + + public abstract void setContentByRemoteJSON(JSONObject js); + + public abstract void setContentByLocalJSON(JSONObject js); + + public abstract JSONObject getLocalJSONFromContent(); + + public abstract int getSyncAction(Cursor c); + + public void setGid(String gid) { + this.mGid = gid; + } + + public void setName(String name) { + this.mName = name; + } + + public void setLastModified(long lastModified) { + this.mLastModified = lastModified; + } + + public void setDeleted(boolean deleted) { + this.mDeleted = deleted; + } + + public String getGid() { + return this.mGid; + } + + public String getName() { + return this.mName; + } + + public long getLastModified() { + return this.mLastModified; + } + + public boolean getDeleted() { + return this.mDeleted; + } + +} \ No newline at end of file diff --git a/gtask注释/data/SqlData.java b/gtask注释/data/SqlData.java new file mode 100644 index 0000000..f47546a --- /dev/null +++ b/gtask注释/data/SqlData.java @@ -0,0 +1,224 @@ +/* + * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 + * SqlData其实就是也就是所谓数据中的数据 + */ + +package net.micode.notes.gtask.data; +/* + * 功能描述: + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + +public class SqlData { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + * Made By CuiCan + */ + private static final String TAG = SqlData.class.getSimpleName(); + + private static final int INVALID_ID = -99999;//为mDataId置初始值-99999 + + + /** + * 来自Notes类中定义的DataColumn中的一些常量 + */ + + // 集合了interface DataColumns中所有SF常量 + public static final String[] PROJECTION_DATA = new String[] { + DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, + DataColumns.DATA3 + }; + + /** + * 以下五个变量作为sql表中5列的编号 + */ + public static final int DATA_ID_COLUMN = 0; + + public static final int DATA_MIME_TYPE_COLUMN = 1; + + public static final int DATA_CONTENT_COLUMN = 2; + + public static final int DATA_CONTENT_DATA_1_COLUMN = 3; + + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; + + private ContentResolver mContentResolver; + //判断是否直接用Content生成,是为true,否则为false + private boolean mIsCreate; + + private long mDataId; + + private String mDataMimeType; + + private String mDataContent; + + private long mDataContentData1; + + private String mDataContentData3; + + private ContentValues mDiffDataValues; + + /* + * 功能描述:构造函数,用于初始化数据 + * 参数注解:mContentResolver用于获取ContentProvider提供的数据 + * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) + * 参数注解: + * Made By CuiCan + */ + public SqlData(Context context) { + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mDataId = INVALID_ID;//mDataId置初始值-99999 + mDataMimeType = DataConstants.NOTE; + mDataContent = ""; + mDataContentData1 = 0; + mDataContentData3 = ""; + mDiffDataValues = new ContentValues(); + } + + + /* + * 功能描述:构造函数,初始化数据 + * 参数注解:mContentResolver用于获取ContentProvider提供的数据 + * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) + * 参数注解: + * Made By CuiCan + */ + public SqlData(Context context, Cursor c) { + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDiffDataValues = new ContentValues(); + } + + /* + * 功能描述:从光标处加载数据 + * 从当前的光标处将五列的数据加载到该类的对象 + * Made By CuiCan + */ + private void loadFromCursor(Cursor c) { + mDataId = c.getLong(DATA_ID_COLUMN); + mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); + mDataContent = c.getString(DATA_CONTENT_COLUMN); + mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); + mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); + } + + + /* + * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 + * 参数注解: + * Made By CuiCan + */ + public void setContent(JSONObject js) throws JSONException { + //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + if (mIsCreate || mDataId != dataId) { + mDiffDataValues.put(DataColumns.ID, dataId); + } + mDataId = dataId; + + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) + : DataConstants.NOTE; + if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { + mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); + } + mDataMimeType = dataMimeType; + + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; + if (mIsCreate || !mDataContent.equals(dataContent)) { + mDiffDataValues.put(DataColumns.CONTENT, dataContent); + } + mDataContent = dataContent; + + long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; + if (mIsCreate || mDataContentData1 != dataContentData1) { + mDiffDataValues.put(DataColumns.DATA1, dataContentData1); + } + mDataContentData1 = dataContentData1; + + String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; + if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { + mDiffDataValues.put(DataColumns.DATA3, dataContentData3); + } + mDataContentData3 = dataContentData3; + } + + + /* + * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 + * 参数注解: + * Made By CuiCan + */ + public JSONObject getContent() throws JSONException { + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + //创建JSONObject对象。并将相关数据放入其中,并返回。 + JSONObject js = new JSONObject(); + js.put(DataColumns.ID, mDataId); + js.put(DataColumns.MIME_TYPE, mDataMimeType); + js.put(DataColumns.CONTENT, mDataContent); + js.put(DataColumns.DATA1, mDataContentData1); + js.put(DataColumns.DATA3, mDataContentData3); + return js; + } + + /* + * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 + * 参数注解: + * Made By CuiCan + */ + public void commit(long noteId, boolean validateVersion, long version) { + + if (mIsCreate) { + if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { + mDiffDataValues.remove(DataColumns.ID); + } + + mDiffDataValues.put(DataColumns.NOTE_ID, noteId); + Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); + try { + mDataId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + } else { + if (mDiffDataValues.size() > 0) { + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); + } else { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { + String.valueOf(noteId), String.valueOf(version) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + } + + mDiffDataValues.clear(); + mIsCreate = false; + } + + /* + * 功能描述:获取当前id + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + public long getId() { + return mDataId; + } +} \ No newline at end of file diff --git a/gtask注释/data/SqlNote.java b/gtask注释/data/SqlNote.java new file mode 100644 index 0000000..c669db2 --- /dev/null +++ b/gtask注释/data/SqlNote.java @@ -0,0 +1,577 @@ +/* + * Description:用于支持小米便签最底层的数据库相关操作,和sqldata的关系上是父集关系,即note是data的子父集。 + * 和SqlData相比,SqlNote算是真正意义上的数据了。 + */ + +package net.micode.notes.gtask.data; +/* + * 功能描述: + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + +public class SqlNote { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + * Made By CuiCan + */ + private static final String TAG = SqlNote.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + // 集合了interface NoteColumns中所有SF常量(17个) + public static final String[] PROJECTION_NOTE = new String[] { + NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, + NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, + NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, + NoteColumns.VERSION + }; + + //以下设置17个列的编号 + public static final int ID_COLUMN = 0; + + public static final int ALERTED_DATE_COLUMN = 1; + + public static final int BG_COLOR_ID_COLUMN = 2; + + public static final int CREATED_DATE_COLUMN = 3; + + public static final int HAS_ATTACHMENT_COLUMN = 4; + + public static final int MODIFIED_DATE_COLUMN = 5; + + public static final int NOTES_COUNT_COLUMN = 6; + + public static final int PARENT_ID_COLUMN = 7; + + public static final int SNIPPET_COLUMN = 8; + + public static final int TYPE_COLUMN = 9; + + public static final int WIDGET_ID_COLUMN = 10; + + public static final int WIDGET_TYPE_COLUMN = 11; + + public static final int SYNC_ID_COLUMN = 12; + + public static final int LOCAL_MODIFIED_COLUMN = 13; + + public static final int ORIGIN_PARENT_ID_COLUMN = 14; + + public static final int GTASK_ID_COLUMN = 15; + + public static final int VERSION_COLUMN = 16; + + //一下定义了17个内部的变量,其中12个可以由content中获得,5个需要初始化为0或者new + private Context mContext; + + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + private long mId; + + private long mAlertDate; + + private int mBgColorId; + + private long mCreatedDate; + + private int mHasAttachment; + + private long mModifiedDate; + + private long mParentId; + + private String mSnippet; + + private int mType; + + private int mWidgetId; + + private int mWidgetType; + + private long mOriginParent; + + private long mVersion; + + private ContentValues mDiffNoteValues; + + private ArrayList mDataList; + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + //构造函数只有context,对所有的变量进行初始化 + public SqlNote(Context context) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mId = INVALID_ID; + mAlertDate = 0; + mBgColorId = ResourceParser.getDefaultBgId(context); + mCreatedDate = System.currentTimeMillis();//调用系统函数获得创建时间 + mHasAttachment = 0; + mModifiedDate = System.currentTimeMillis();//最后一次修改时间初始化为创建时间 + mParentId = 0; + mSnippet = ""; + mType = Notes.TYPE_NOTE; + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + mOriginParent = 0; + mVersion = 0; + mDiffNoteValues = new ContentValues(); + mDataList = new ArrayList(); + } + + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + //构造函数有context和一个数据库的cursor,多数变量通过cursor指向的一条记录直接进行初始化 + public SqlNote(Context context, Cursor c) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDataList = new ArrayList(); + // + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + } + + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + public SqlNote(Context context, long id) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(id); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + + } + + /* + * 功能描述:通过id从光标处加载数据 + * Made By CuiCan + */ + private void loadFromCursor(long id) { + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(id) + }, null);//通过id获得对应的ContentResolver中的cursor + if (c != null) { + c.moveToNext(); + loadFromCursor(c);//然后加载数据进行初始化,这样函数 + //SqlNote(Context context, long id)与SqlNote(Context context, long id)的实现方式基本相同 + } else { + Log.w(TAG, "loadFromCursor: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + /* + * 功能描述:通过游标从光标处加载数据 + * Made By CuiCan + */ + private void loadFromCursor(Cursor c) { + //直接从一条记录中的获得以下变量的初始值 + mId = c.getLong(ID_COLUMN); + mAlertDate = c.getLong(ALERTED_DATE_COLUMN); + mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = c.getLong(CREATED_DATE_COLUMN); + mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); + mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); + mParentId = c.getLong(PARENT_ID_COLUMN); + mSnippet = c.getString(SNIPPET_COLUMN); + mType = c.getInt(TYPE_COLUMN); + mWidgetId = c.getInt(WIDGET_ID_COLUMN); + mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); + mVersion = c.getLong(VERSION_COLUMN); + } + + /* + * 功能描述:通过content机制获取共享数据并加载到数据库当前游标处 + * 参数注解: + * Made By CuiCan + */ + private void loadDataContent() { + Cursor c = null; + mDataList.clear(); + try { + c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, + "(note_id=?)", new String[] { + String.valueOf(mId) + }, null); + if (c != null) { + if (c.getCount() == 0) { + Log.w(TAG, "it seems that the note has not data"); + return; + } + while (c.moveToNext()) { + SqlData data = new SqlData(mContext, c); + mDataList.add(data); + } + } else { + Log.w(TAG, "loadDataContent: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + /* + * 功能描述:设置通过content机制用于共享的数据信息 + * 参数注解: + * Made By CuiCan + */ + public boolean setContent(JSONObject js) { + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + Log.w(TAG, "cannot set system folder"); + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + // for folder we can only update the snnipet and type + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; + if (mIsCreate || mId != id) { + mDiffNoteValues.put(NoteColumns.ID, id); + } + mId = id; + + long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note + .getLong(NoteColumns.ALERTED_DATE) : 0; + if (mIsCreate || mAlertDate != alertDate) { + mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); + } + mAlertDate = alertDate; + + int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note + .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); + if (mIsCreate || mBgColorId != bgColorId) { + mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); + } + mBgColorId = bgColorId; + long createDate = note.has(NoteColumns.CREATED_DATE) ? note + .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mCreatedDate != createDate) { + mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); + } + mCreatedDate = createDate; + + int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note + .getInt(NoteColumns.HAS_ATTACHMENT) : 0; + if (mIsCreate || mHasAttachment != hasAttachment) { + mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); + } + mHasAttachment = hasAttachment; + + long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note + .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mModifiedDate != modifiedDate) { + mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); + } + mModifiedDate = modifiedDate; + + long parentId = note.has(NoteColumns.PARENT_ID) ? note + .getLong(NoteColumns.PARENT_ID) : 0; + if (mIsCreate || mParentId != parentId) { + mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); + } + mParentId = parentId; + + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + + int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) + : AppWidgetManager.INVALID_APPWIDGET_ID; + if (mIsCreate || mWidgetId != widgetId) { + mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); + } + mWidgetId = widgetId; + + int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note + .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; + if (mIsCreate || mWidgetType != widgetType) { + mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); + } + mWidgetType = widgetType; + + long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note + .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; + if (mIsCreate || mOriginParent != originParent) { + mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); + } + mOriginParent = originParent; + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + SqlData sqlData = null; + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + for (SqlData temp : mDataList) { + if (dataId == temp.getId()) { + sqlData = temp; + } + } + } + + if (sqlData == null) { + sqlData = new SqlData(mContext); + mDataList.add(sqlData); + } + + sqlData.setContent(data); + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } + return true; + } + + /* + * 功能描述:获取content机制提供的数据并加载到note中 + * 参数注解: + * Made By CuiCan + */ + public JSONObject getContent() { + try { + JSONObject js = new JSONObject(); + + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + + JSONObject note = new JSONObject(); + if (mType == Notes.TYPE_NOTE) {//类型为note时 + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.ALERTED_DATE, mAlertDate); + note.put(NoteColumns.BG_COLOR_ID, mBgColorId); + note.put(NoteColumns.CREATED_DATE, mCreatedDate); + note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); + note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); + note.put(NoteColumns.PARENT_ID, mParentId); + note.put(NoteColumns.SNIPPET, mSnippet); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.WIDGET_ID, mWidgetId); + note.put(NoteColumns.WIDGET_TYPE, mWidgetType); + note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + + JSONArray dataArray = new JSONArray(); + for (SqlData sqlData : mDataList) { + JSONObject data = sqlData.getContent(); + if (data != null) { + dataArray.put(data); + } + } + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {//类型为文件夹或者 + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.SNIPPET, mSnippet); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + } + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + return null; + } + + /* + * 功能描述:给当前id设置父id + * 参数注解: + * Made By CuiCan + */ + public void setParentId(long id) { + mParentId = id; + mDiffNoteValues.put(NoteColumns.PARENT_ID, id); + } + + /* + * 功能描述:给当前id设置Gtaskid + * 参数注解: + * Made By CuiCan + */ + public void setGtaskId(String gid) { + mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); + } + + /* + * 功能描述:给当前id设置同步id + * 参数注解: + * Made By CuiCan + */ + public void setSyncId(long syncId) { + mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); + } + + /* + * 功能描述:初始化本地修改,即撤销所有当前修改 + * 参数注解: + * Made By CuiCan + */ + public void resetLocalModified() { + mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); + } + + /* + * 功能描述:获得当前id + * 参数注解: + * Made By CuiCan + */ + public long getId() { + return mId; + } + + /* + * 功能描述:获得当前id的父id + * 参数注解: + * Made By CuiCan + */ + public long getParentId() { + return mParentId; + } + + /* + * 功能描述:获取小片段即用于显示的部分便签内容 + * 参数注解: + * Made By CuiCan + */ + public String getSnippet() { + return mSnippet; + } + + /* + * 功能描述:判断是否为便签类型 + * 参数注解: + * Made By CuiCan + */ + public boolean isNoteType() { + return mType == Notes.TYPE_NOTE; + } + + /* + * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 + * 参数注解: + * Made By CuiCan + */ + public void commit(boolean validateVersion) { + if (mIsCreate) { + if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { + mDiffNoteValues.remove(NoteColumns.ID); + } + + Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); + try { + mId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + if (mId == 0) { + throw new IllegalStateException("Create thread id failed"); + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) {//直接使用sqldata中的实现 + sqlData.commit(mId, false, -1); + } + } + } else { + if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { + Log.e(TAG, "No such note"); + throw new IllegalStateException("Try to update note with invalid id"); + } + if (mDiffNoteValues.size() > 0) { + mVersion ++; + int result = 0; + if (!validateVersion) {//构造字符串 + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?)", new String[] { + String.valueOf(mId) + }); + } else { + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", + new String[] { + String.valueOf(mId), String.valueOf(mVersion) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, validateVersion, mVersion); + } + } + } + + // refresh local info + loadFromCursor(mId); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + + mDiffNoteValues.clear(); + mIsCreate = false; + } +} \ No newline at end of file diff --git a/gtask注释/data/Task.java b/gtask注释/data/Task.java new file mode 100644 index 0000000..3c890b3 --- /dev/null +++ b/gtask注释/data/Task.java @@ -0,0 +1,323 @@ +package net.micode.notes.gtask.data; + +public class Task extends Node { + private static final String TAG = Task.class.getSimpleName(); + + private boolean mCompleted;//是否完成 + + private String mNotes; + + private JSONObject mMetaInfo;//将在实例中存储数据的类型 + + private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善) + + private TaskList mParent;//所在的任务列表的指针 + + public Task() { + super(); + mCompleted = false; + mNotes = null; + mPriorSibling = null;//TaskList中当前Task前面的Task的指针 + mParent = null;//当前Task所在的TaskList + mMetaInfo = null; + } + + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_TASK); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + // parent_id + if (mParent!= null) { + js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); + } + + // dest_parent_type + js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + + // list_id + if (mParent!= null) { + js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); + } + + // prior_sibling_id + if (mPriorSibling != null) { + js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-create jsonobject"); + } + + return js; + } + + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + // notes + if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { + setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); + } + + // deleted + if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { + setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); + } + + // completed + if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { + setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get task content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { //��metadata����ʵʩ + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) + || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { + Log.e(TAG, "invalid type"); + return; + } + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + setName(data.getString(DataColumns.CONTENT)); + break; + } + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + String name = getName(); + try { + if (mMetaInfo == null) { + // new task created from web + if (name == null) { + Log.w(TAG, "the note seems to be an empty one"); + return null; + } + + JSONObject js = new JSONObject(); + JSONObject note = new JSONObject(); + JSONArray dataArray = new JSONArray(); + JSONObject data = new JSONObject(); + data.put(DataColumns.CONTENT, name); + dataArray.put(data); + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + return js; + } else { + // synced task + JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + data.put(DataColumns.CONTENT, getName()); + break; + } + } + + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + return mMetaInfo; + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public void setMetaInfo(MetaData metaData) { + if (metaData != null && metaData.getNotes() != null) { + try { + mMetaInfo = new JSONObject(metaData.getNotes()); + } catch (JSONException e) { + Log.w(TAG, e.toString()); + mMetaInfo = null; + } + } + } + + public int getSyncAction(Cursor c) { + try { + JSONObject noteInfo = null; + if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + } + + if (noteInfo == null) { + Log.w(TAG, "it seems that note meta has been deleted"); + return SYNC_ACTION_UPDATE_REMOTE; + } + + if (!noteInfo.has(NoteColumns.ID)) { + Log.w(TAG, "remote note id seems to be deleted"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + // validate the note id now + if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { + Log.w(TAG, "note id doesn't match"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + return SYNC_ACTION_UPDATE_CONFLICT; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + public boolean isWorthSaving() { + return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) + || (getNotes() != null && getNotes().trim().length() > 0); + } + + public void setCompleted(boolean completed) { + this.mCompleted = completed; + } + + public void setNotes(String notes) { + this.mNotes = notes; + } + + public void setPriorSibling(Task priorSibling) { + this.mPriorSibling = priorSibling; + } + + public void setParent(TaskList parent) { + this.mParent = parent; + } + + public boolean getCompleted() { + return this.mCompleted; + } + + public String getNotes() { + return this.mNotes; + } + + public Task getPriorSibling() { + return this.mPriorSibling; + } + + public TaskList getParent() { + return this.mParent; + } + +} \ No newline at end of file diff --git a/gtask注释/data/TaskList.java b/gtask注释/data/TaskList.java new file mode 100644 index 0000000..4922bb4 --- /dev/null +++ b/gtask注释/data/TaskList.java @@ -0,0 +1,370 @@ +package net.micode.notes.gtask.data; + +public class TaskList extends Node { + private static final String TAG = TaskList.class.getSimpleName();//tag标记 + + private int mIndex;//当前TaskList的指针 + + private ArrayList mChildren;//类中主要的保存数据的单元,用来实现一个以Task为元素的ArrayList + + public TaskList() { + super(); + mChildren = new ArrayList(); + mIndex = 1; + } + + /* (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getCreateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); + + // entity_delta + JSONObject entity = new JSONObject();//entity实体 + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-create jsonobject"); + } + + return js; + } + + /* (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get tasklist content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + + if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + String name = folder.getString(NoteColumns.SNIPPET); + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); + } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); + else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE); + else + Log.e(TAG, "invalid system folder"); + } else { + Log.e(TAG, "error type"); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + try { + JSONObject js = new JSONObject(); + JSONObject folder = new JSONObject(); + + String folderName = getName(); + if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) + folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), + folderName.length()); + folder.put(NoteColumns.SNIPPET, folderName); + if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) + || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) + folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + else + folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + + js.put(GTaskStringUtils.META_HEAD_NOTE, folder); + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public int getSyncAction(Cursor c) { + try { + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + // for folder conflicts, just apply local modification + return SYNC_ACTION_UPDATE_REMOTE; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + /** + * @return + * 功能:获得TaskList的大小,即mChildren的大小 + */ + public int getChildTaskCount() { + return mChildren.size(); + } + + /** + * @param task + * @return 返回值为是否成功添加任务。 + * 功能:在当前任务表末尾添加新的任务。 + */ + public boolean addChildTask(Task task) { + boolean ret = false; + if (task != null && !mChildren.contains(task)) { + ret = mChildren.add(task); + if (ret) { + // need to set prior sibling and parent + task.setPriorSibling(mChildren.isEmpty() ? null : mChildren + .get(mChildren.size() - 1)); + task.setParent(this); + //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改 + //,接下来几个函数都有相关操作 + } + } + return ret; + } + + /** + * @param task + * @param index + * @return + * 功能:在当前任务表的指定位置添加新的任务。 + */ + public boolean addChildTask(Task task, int index) { + if (index < 0 || index > mChildren.size()) { + Log.e(TAG, "add child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (task != null && pos == -1) { + mChildren.add(index, task); + + // update the task list + Task preTask = null; + Task afterTask = null; + if (index != 0) + preTask = mChildren.get(index - 1); + if (index != mChildren.size() - 1) + afterTask = mChildren.get(index + 1); + + task.setPriorSibling(preTask); + if (afterTask != null) + afterTask.setPriorSibling(task); + } + + return true; + } + + /** + * @param task + * @return 返回删除是否成功 + * 功能:删除TaskList中的一个Task + */ + public boolean removeChildTask(Task task) { + boolean ret = false; + int index = mChildren.indexOf(task); + if (index != -1) { + ret = mChildren.remove(task); + + if (ret) { + // reset prior sibling and parent + task.setPriorSibling(null); + task.setParent(null); + + // update the task list + if (index != mChildren.size()) { + mChildren.get(index).setPriorSibling( + index == 0 ? null : mChildren.get(index - 1)); + } + } + } + return ret; + } + + /** + * @param task + * @param index + * @return + * 功能:将当前TaskList中含有的某个Task移到index位置 + */ + public boolean moveChildTask(Task task, int index) { + + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "move child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (pos == -1) { + Log.e(TAG, "move child task: the task should in the list"); + return false; + } + + if (pos == index) + return true; + return (removeChildTask(task) && addChildTask(task, index)); + //利用已实现好的功能完成当下功能; + } + + /** + * @param gid + * @return返回寻找结果 + * 功能:按gid寻找Task + */ + public Task findChildTaskByGid(String gid) { + for (int i = 0; i < mChildren.size(); i++) { + Task t = mChildren.get(i); + if (t.getGid().equals(gid)) { + return t; + } + } + return null; + } + + /** + * @param task + * @return + * 功能:返回指定Task的index + */ + public int getChildTaskIndex(Task task) { + return mChildren.indexOf(task); + } + + /** + * @param index + * @return + * 功能:返回指定index的Task + */ + public Task getChildTaskByIndex(int index) { + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "getTaskByIndex: invalid index"); + return null; + } + return mChildren.get(index); + } + + /** + * @param gid + * @return + * 功能:返回指定gid的Task + */ + public Task getChilTaskByGid(String gid) { + for (Task task : mChildren) {//一种常见的ArrayList的遍历方法(四种,见精读笔记) + if (task.getGid().equals(gid)) + return task; + } + return null; + } + + public ArrayList getChildTaskList() { + return this.mChildren; + } + + public void setIndex(int index) { + this.mIndex = index; + } + + public int getIndex() { + return this.mIndex; + } +} \ No newline at end of file diff --git a/gtask注释/exception/ActionFailureException.java b/gtask注释/exception/ActionFailureException.java new file mode 100644 index 0000000..f455c7a --- /dev/null +++ b/gtask注释/exception/ActionFailureException.java @@ -0,0 +1,32 @@ +/* + * Description:支持小米便签运行过程中的运行异常处理。 + */ + +package net.micode.notes.gtask.exception; + +public class ActionFailureException extends RuntimeException { + private static final long serialVersionUID = 4425249765923293627L; + /* + * serialVersionUID相当于java类的身份证。主要用于版本控制。 + * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + * Made By Cuican + */ + + public ActionFailureException() { + super(); + } + /* + * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. + * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 + * 怎么去引用里面的父类对象呢?使用super来引用 + * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) + * Made By Cuican + */ + public ActionFailureException(String paramString) { + super(paramString); + } + + public ActionFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} \ No newline at end of file diff --git a/gtask注释/exception/NetworkFailureException.java b/gtask注释/exception/NetworkFailureException.java new file mode 100644 index 0000000..63a1adb --- /dev/null +++ b/gtask注释/exception/NetworkFailureException.java @@ -0,0 +1,33 @@ +/* + * Description:支持小米便签运行过程中的网络异常处理。 + */ + +package net.micode.notes.gtask.exception; + +public class NetworkFailureException extends Exception { + private static final long serialVersionUID = 2107610287180234136L; + /* + * serialVersionUID相当于java类的身份证。主要用于版本控制。 + * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + * Made By Cuican + */ + + public NetworkFailureException() { + super(); + } + + /* + * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. + * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 + * 怎么去引用里面的父类对象呢?使用super来引用 + * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) + * Made By Cuican + */ + public NetworkFailureException(String paramString) { + super(paramString); + } + + public NetworkFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} \ No newline at end of file diff --git a/gtask注释/remote/GTaskASyncTask.java b/gtask注释/remote/GTaskASyncTask.java new file mode 100644 index 0000000..364a604 --- /dev/null +++ b/gtask注释/remote/GTaskASyncTask.java @@ -0,0 +1,102 @@ +package net.micode.notes.gtask.remote; + +/*异步操作类,实现GTask的异步操作过程 + * 主要方法: + * private void showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法 + * protected Integer doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间 + * protected void onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 + * protected void onPostExecute(Integer result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI + */ +public class GTaskASyncTask extends AsyncTask { + + + private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; + + public interface OnCompleteListener { + void onComplete(); + } + + private Context mContext; + + private NotificationManager mNotifiManager; + + private GTaskManager mTaskManager; + + private OnCompleteListener mOnCompleteListener; + + public GTaskASyncTask(Context context, OnCompleteListener listener) { + mContext = context; + mOnCompleteListener = listener; + mNotifiManager = (NotificationManager) mContext + .getSystemService(Context.NOTIFICATION_SERVICE); + mTaskManager = GTaskManager.getInstance(); + } + + public void cancelSync() { + mTaskManager.cancelSync(); + } + + public void publishProgess(String message) { // 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 + publishProgress(new String[] { + message + }); + } + + private void showNotification(int tickerId, String content) { + Notification notification = new Notification(R.drawable.notification, mContext + .getString(tickerId), System.currentTimeMillis()); + notification.defaults = Notification.DEFAULT_LIGHTS; // 调用系统自带灯光 + notification.flags = Notification.FLAG_AUTO_CANCEL; // 点击清除按钮或点击通知后会自动消失 + PendingIntent pendingIntent; //一个描述了想要启动一个Activity、Broadcast或是Service的意图 + if (tickerId != R.string.ticker_success) { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesPreferenceActivity.class), 0); //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象 + + } else { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesListActivity.class), 0); //如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象 + } + notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, + pendingIntent); + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//通过NotificationManager对象的notify()方法来执行一个notification的消息 + } + + @Override + protected Integer doInBackground(Void... unused) { + publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity + .getSyncAccountName(mContext))); //利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext))的字符串内容传进sync_progress_login中 + return mTaskManager.sync(mContext, this); //进行后台同步具体操作 + } + + @Override + protected void onProgressUpdate(String... progress) { + showNotification(R.string.ticker_syncing, progress[0]); + if (mContext instanceof GTaskSyncService) { //instanceof 判断mContext是否是GTaskSyncService的实例 + ((GTaskSyncService) mContext).sendBroadcast(progress[0]); + } + } + + @Override + protected void onPostExecute(Integer result) { //用于在执行完后台任务后更新UI,显示结果 + if (result == GTaskManager.STATE_SUCCESS) { + showNotification(R.string.ticker_success, mContext.getString( + R.string.success_sync_account, mTaskManager.getSyncAccount())); + NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); //设置最新同步的时间 + } else if (result == GTaskManager.STATE_NETWORK_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); + } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); + } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { + showNotification(R.string.ticker_cancel, mContext + .getString(R.string.error_sync_cancelled)); + } //几种不同情况下的结果显示 + if (mOnCompleteListener != null) { + new Thread(new Runnable() { //这里好像是方法内的一个线程,但是并不太懂什么意思 + + public void run() { //完成后的操作,使用onComplete()将所有值都重新初始化,相当于完成一次操作 + mOnCompleteListener.onComplete(); + } + }).start(); + } + } +} \ No newline at end of file diff --git a/gtask注释/remote/GTaskClient.java b/gtask注释/remote/GTaskClient.java new file mode 100644 index 0000000..f15dc85 --- /dev/null +++ b/gtask注释/remote/GTaskClient.java @@ -0,0 +1,612 @@ +package net.micode.notes.gtask.remote; + +/* + * 主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容 + * 主要使用类或技术:accountManager JSONObject HttpParams authToken Gid + */ +public class GTaskClient { + private static final String TAG = GTaskClient.class.getSimpleName(); + + private static final String GTASK_URL = "https://mail.google.com/tasks/"; //这个是指定的URL + + private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; + + private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; + + private static GTaskClient mInstance = null; + + private DefaultHttpClient mHttpClient; + + private String mGetUrl; + + private String mPostUrl; + + private long mClientVersion; + + private boolean mLoggedin; + + private long mLastLoginTime; + + private int mActionId; + + private Account mAccount; + + private JSONArray mUpdateArray; + + private GTaskClient() { + mHttpClient = null; + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + mClientVersion = -1; + mLoggedin = false; + mLastLoginTime = 0; + mActionId = 1; + mAccount = null; + mUpdateArray = null; + } + + /*用来获取的实例化对象 + * 使用 getInstance() + * 返回mInstance这个实例化对象 + */ + public static synchronized GTaskClient getInstance() { + if (mInstance == null) { + mInstance = new GTaskClient(); + } + return mInstance; + } + + /*用来实现登录操作的函数,传入的参数是一个Activity + * 设置登录操作限制时间,如果超时则需要重新登录 + * 有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录 + * 返回true或者false,即最后是否登陆成功 + */ + public boolean login(Activity activity) { + // we suppose that the cookie would expire after 5 minutes + // then we need to re-login + //判断距离最后一次登录操作是否超过5分钟 + final long interval = 1000 * 60 * 5; + if (mLastLoginTime + interval < System.currentTimeMillis()) { + mLoggedin = false; + } + + // need to re-login after account switch 重新登录操作 + if (mLoggedin + && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity + .getSyncAccountName(activity))) { + mLoggedin = false; + } + + //如果没超过时间,则不需要重新登录 + if (mLoggedin) { + Log.d(TAG, "already logged in"); + return true; + } + + mLastLoginTime = System.currentTimeMillis();//更新最后登录时间,改为系统当前的时间 + String authToken = loginGoogleAccount(activity, false);//判断是否登录到谷歌账户 + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + // login with custom domain if necessary + //尝试使用用户自己的域名登录 + if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() //将用户账号名改为统一格式(小写)后判断是否为一个谷歌账号地址 + .endsWith("googlemail.com"))) { + StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); + int index = mAccount.name.indexOf('@') + 1; + String suffix = mAccount.name.substring(index); + url.append(suffix + "/"); + mGetUrl = url.toString() + "ig"; //设置用户对应的getUrl + mPostUrl = url.toString() + "r/ig"; //设置用户对应的postUrl + + if (tryToLoginGtask(activity, authToken)) { + mLoggedin = true; + } + } + + // try to login with google official url + //如果用户账户无法登录,则使用谷歌官方的URI进行登录 + if (!mLoggedin) { + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + if (!tryToLoginGtask(activity, authToken)) { + return false; + } + } + + mLoggedin = true; + return true; + } + + /*具体实现登录谷歌账户的方法 + * 使用令牌机制 + * 使用AccountManager来管理注册账号 + * 返回值是账号的令牌 + */ + private String loginGoogleAccount(Activity activity, boolean invalidateToken) { + String authToken; //令牌,是登录操作保证安全性的一个方法 + AccountManager accountManager = AccountManager.get(activity);//AccountManager这个类给用户提供了集中注册账号的接口 + Account[] accounts = accountManager.getAccountsByType("com.google");//获取全部以com.google结尾的account + + if (accounts.length == 0) { + Log.e(TAG, "there is no available google account"); + return null; + } + + String accountName = NotesPreferenceActivity.getSyncAccountName(activity); + Account account = null; + //遍历获得的accounts信息,寻找已经记录过的账户信息 + for (Account a : accounts) { + if (a.name.equals(accountName)) { + account = a; + break; + } + } + if (account != null) { + mAccount = account; + } else { + Log.e(TAG, "unable to get an account with the same name in the settings"); + return null; + } + + // get the token now + //获取选中账号的令牌 + AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, + "goanna_mobile", null, activity, null, null); + try { + Bundle authTokenBundle = accountManagerFuture.getResult(); + authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); + //如果是invalidateToken,那么需要调用invalidateAuthToken(String, String)方法废除这个无效token + if (invalidateToken) { + accountManager.invalidateAuthToken("com.google", authToken); + loginGoogleAccount(activity, false); + } + } catch (Exception e) { + Log.e(TAG, "get auth token failed"); + authToken = null; + } + + return authToken; + } + + //尝试登陆Gtask,这只是一个预先判断令牌是否是有效以及是否能登上GTask的方法,而不是具体实现登陆的方法 + private boolean tryToLoginGtask(Activity activity, String authToken) { + if (!loginGtask(authToken)) { + // maybe the auth token is out of authTokedate, now let's invalidate the + // token and try again + //删除过一个无效的authToken,申请一个新的后再次尝试登陆 + authToken = loginGoogleAccount(activity, true); + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + if (!loginGtask(authToken)) { + Log.e(TAG, "login gtask failed"); + return false; + } + } + return true; + } + + //实现登录GTask的具体操作 + private boolean loginGtask(String authToken) { + int timeoutConnection = 10000; + int timeoutSocket = 15000; //socket是一种通信连接实现数据的交换的端口 + HttpParams httpParameters = new BasicHttpParams(); //实例化一个新的HTTP参数类 + HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//设置连接超时时间 + HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//设置设置端口超时时间 + mHttpClient = new DefaultHttpClient(httpParameters); + BasicCookieStore localBasicCookieStore = new BasicCookieStore(); //设置本地cookie + mHttpClient.setCookieStore(localBasicCookieStore); + HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); + + // login gtask + try { + String loginUrl = mGetUrl + "?auth=" + authToken; //设置登录的url + HttpGet httpGet = new HttpGet(loginUrl); //通过登录的uri实例化网页上资源的查找 + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the cookie now + //获取CookieStore里存放的cookie,看如果存有“GTL(不知道什么意思)”,则说明有验证成功的有效的cookie + List cookies = mHttpClient.getCookieStore().getCookies(); + boolean hasAuthCookie = false; + for (Cookie cookie : cookies) { + if (cookie.getName().contains("GTL")) { + hasAuthCookie = true; + } + } + if (!hasAuthCookie) { + Log.w(TAG, "it seems that there is no auth cookie"); + } + + // get the client version + //获取client的内容,具体操作是在返回的Content中截取从_setup(开始到)}中间的字符串内容,也就是gtask_url的内容 + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + mClientVersion = js.getLong("v"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } catch (Exception e) { + // simply catch all exceptions + Log.e(TAG, "httpget gtask_url failed"); + return false; + } + + return true; + } + + private int getActionId() { + return mActionId++; + } + + /*实例化创建一个用于向网络传输数据的对象 + * 使用HttpPost类 + * 返回一个httpPost实例化对象,但里面还没有内容 + */ + private HttpPost createHttpPost() { + HttpPost httpPost = new HttpPost(mPostUrl); + httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + httpPost.setHeader("AT", "1"); + return httpPost; + } + + /*通过URL获取响应后返回的数据,也就是网络上的数据和资源 + * 使用getContentEncoding()获取网络上的资源和数据 + * 返回值就是获取到的资源 + */ + private String getResponseContent(HttpEntity entity) throws IOException { + String contentEncoding = null; + if (entity.getContentEncoding() != null) {//通过URL得到HttpEntity对象,如果不为空则使用getContent()方法创建一个流将数据从网络都过来 + contentEncoding = entity.getContentEncoding().getValue(); + Log.d(TAG, "encoding: " + contentEncoding); + } + + InputStream input = entity.getContent(); + if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {//GZIP是使用DEFLATE进行压缩数据的另一个压缩库 + input = new GZIPInputStream(entity.getContent()); + } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {//DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩 + Inflater inflater = new Inflater(true); + input = new InflaterInputStream(entity.getContent(), inflater); + } + + try { + InputStreamReader isr = new InputStreamReader(input); + BufferedReader br = new BufferedReader(isr);//是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了时候,再读入内存,是为了提供读的效率而设计的 + StringBuilder sb = new StringBuilder(); + + while (true) { + String buff = br.readLine(); + if (buff == null) { + return sb.toString(); + } + sb = sb.append(buff); + } + } finally { + input.close(); + } + } + + /*通过JSON发送请求 + * 请求的具体内容在json的实例化对象js中然后传入 + * 利用UrlEncodedFormEntity entity和httpPost.setEntity(entity)方法把js中的内容放置到httpPost中 + * 执行请求后使用getResponseContent方法得到返回的数据和资源 + * 将资源再次放入json后返回 + */ + private JSONObject postRequest(JSONObject js) throws NetworkFailureException { + if (!mLoggedin) {//未登录 + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + //实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里 + HttpPost httpPost = createHttpPost(); + try { + LinkedList list = new LinkedList(); + list.add(new BasicNameValuePair("r", js.toString())); + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); //UrlEncodedFormEntity()的形式比较单一,是普通的键值对 + httpPost.setEntity(entity); + + // execute the post + //执行这个请求 + HttpResponse response = mHttpClient.execute(httpPost); + String jsString = getResponseContent(response.getEntity()); + return new JSONObject(jsString); + + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("unable to convert response content to jsonobject"); + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("error occurs when posting request"); + } + } + + /*创建单个任务 + * 传入参数是一个.gtask.data.Task包里Task类的对象 + * 利用json获取Task里的内容,并且创建相应的jsPost + * 利用postRequest得到任务的返回信息 + * 使用task.setGid设置task的new_ID + */ + public void createTask(Task task) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(task.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create task: handing jsonobject failed"); + } + } + + /* + * 创建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid + */ + public void createTaskList(TaskList tasklist) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(tasklist.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create tasklist: handing jsonobject failed"); + } + } + + /* + * 同步更新操作 + * 使用JSONObject进行数据存储,使用jsPost.put,Put的信息包括UpdateArray和ClientVersion + * 使用postRequest发送这个jspost,进行处理 + */ + public void commitUpdate() throws NetworkFailureException { + if (mUpdateArray != null) { + try { + JSONObject jsPost = new JSONObject(); + + // action_list + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("commit update: handing jsonobject failed"); + } + } + } + + /* + * 添加更新的事项 + * 调用commitUpdate()实现 + */ + public void addUpdateNode(Node node) throws NetworkFailureException { + if (node != null) { + // too many update items may result in an error + // set max to 10 items + if (mUpdateArray != null && mUpdateArray.length() > 10) { + commitUpdate(); + } + + if (mUpdateArray == null) + mUpdateArray = new JSONArray(); + mUpdateArray.put(node.getUpdateAction(getActionId())); + } + } + + /* + * 移动task,比如讲task移动到不同的task列表中去 + * 通过getGid获取task所属列表的gid + * 通过JSONObject.put(String name, Object value)函数设置移动后的task的相关属性值,从而达到移动的目的 + * 最后还是通过postRequest进行更新后的发送 + */ + public void moveTask(Task task, TaskList preParent, TaskList curParent) + throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); + if (preParent == curParent && task.getPriorSibling() != null) { + // put prioring_sibing_id only if moving within the tasklist and + // it is not the first one + //设置优先级ID,只有当移动是发生在文件中 + action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); + } + action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); //设置移动前所属列表 + action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); //设置当前所属列表 + if (preParent != curParent) { + // put the dest_list only if moving between tasklists + action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); + } + actionList.put(action); + //最后将ACTION_LIST加入到jsPost中 + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("move task: handing jsonobject failed"); + } + } + + /* + * 删除操作节点 + * 还是利用JSON + * 删除过后使用postRequest发送删除后的结果 + */ + public void deleteNode(Node node) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + node.setDeleted(true); + actionList.put(node.getUpdateAction(getActionId())); //这里会获取到删除操作的ID,加入到actionLiast中 + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("delete node: handing jsonobject failed"); + } + } + + /* + * 获取任务列表 + * 首先通过GetURI使用getResponseContent从网上获取数据 + * 然后筛选出"_setup("到)}的部分,并且从中获取GTASK_JSON_LISTS的内容返回 + */ + public JSONArray getTaskLists() throws NetworkFailureException { + if (!mLoggedin) { + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + try { + HttpGet httpGet = new HttpGet(mGetUrl); + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the task list + //筛选工作,把筛选出的字符串放入jsString + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + //获取GTASK_JSON_LISTS + return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task lists: handing jasonobject failed"); + } + } + + /* + * 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务 + */ + public JSONArray getTaskList(String listGid) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); //这里设置为传入的listGid + action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); + actionList.put(action); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + JSONObject jsResponse = postRequest(jsPost); + return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task list: handing jsonobject failed"); + } + } + + public Account getSyncAccount() { + return mAccount; + } + + //重置更新的内容 + public void resetUpdateArray() { + mUpdateArray = null; + } +} \ No newline at end of file diff --git a/gtask注释/remote/GTaskManager.java b/gtask注释/remote/GTaskManager.java new file mode 100644 index 0000000..a8c1f2a --- /dev/null +++ b/gtask注释/remote/GTaskManager.java @@ -0,0 +1,846 @@ +package net.micode.notes.gtask.remote; + +public class GTaskManager { + private static final String TAG = GTaskManager.class.getSimpleName(); + public static final int STATE_SUCCESS = 0; + public static final int STATE_NETWORK_ERROR = 1; + public static final int STATE_INTERNAL_ERROR = 2; + public static final int STATE_SYNC_IN_PROGRESS = 3; + public static final int STATE_SYNC_CANCELLED = 4; + private static GTaskManager mInstance = null; + + private Activity mActivity; + private Context mContext; + private ContentResolver mContentResolver; + private boolean mSyncing; + private boolean mCancelled; + private HashMap mGTaskListHashMap; + private HashMap mGTaskHashMap; + private HashMap mMetaHashMap; + private TaskList mMetaList; + private HashSet mLocalDeleteIdMap; + private HashMap mGidToNid; + private HashMap mNidToGid; + + private GTaskManager() { //对象初始化函数 + mSyncing = false; //正在同步,flase代表未执行 + mCancelled = false; //全局标识,flase代表可以执行 + mGTaskListHashMap = new HashMap(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。 + mGTaskHashMap = new HashMap(); + mMetaHashMap = new HashMap(); + mMetaList = null; + mLocalDeleteIdMap = new HashSet(); + mGidToNid = new HashMap(); //GoogleID to NodeID?? + mNidToGid = new HashMap(); //NodeID to GoogleID???通过hashmap散列表建立映射 + } + + /** + * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 + * 功能:类初始化函数 + * @author TTS + * @return GtaskManger + */ + public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized + if (mInstance == null) { + mInstance = new GTaskManager(); + } + return mInstance; + } + + /** + * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 + * @author TTS + * @param activity + */ + public synchronized void setActivityContext(Activity activity) { + // used for getting auth token + mActivity = activity; + } + + /** + * 核心函数 + * 功能:实现了本地同步操作和远端同步操作 + * @author TTS + * @param context-----获取上下文 + * @param asyncTask-------用于同步的异步操作类 + * @return int + */ + public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数 + if (mSyncing) { + Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug + return STATE_SYNC_IN_PROGRESS; + } + mContext = context; + mContentResolver = mContext.getContentResolver(); + mSyncing = true; + mCancelled = false; + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + + try { + GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机 + client.resetUpdateArray(); //JSONArray类型,reset即置为NULL + + // login google task + if (!mCancelled) { + if (!client.login(mActivity)) { + throw new NetworkFailureException("login google task failed"); + } + } + + // get the task list from google + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); + initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList + + // do content sync work + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); + syncContent(); + } catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常 + Log.e(TAG, e.toString()); //创建日志文件(调试信息),error + return STATE_NETWORK_ERROR; + } catch (ActionFailureException e) { //此类异常为操作异常 + Log.e(TAG, e.toString()); + return STATE_INTERNAL_ERROR; + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return STATE_INTERNAL_ERROR; + } finally { + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + mSyncing = false; + } + + return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; + } + + /** + *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。 + *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap + *@author TTS + *@exception NetworkFailureException + *@return void + */ + private void initGTaskList() throws NetworkFailureException { + if (mCancelled) + return; + GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机 + try { + //Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。 + //其格式为{"key1":value1,"key2",value2....};key 必须是字符串。 + //因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。 + JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list------lists??? + + // init meta list first + mMetaList = null; //TaskList类型 + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { + mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化 + mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname... + + // load meta data + JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list------list??? + for (int j = 0; j < jsMetas.length(); j++) { + object = (JSONObject) jsMetas.getJSONObject(j); + MetaData metaData = new MetaData(); //继承自Node + metaData.setContentByRemoteJSON(object); + if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList + mMetaList.addChildTask(metaData); + if (metaData.getGid() != null) { + mMetaHashMap.put(metaData.getRelatedGid(), metaData); + } + } + } + } + } + + // create meta list if not existed + if (mMetaList == null) { + mMetaList = new TaskList(); + mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META); + GTaskClient.getInstance().createTaskList(mMetaList); + } + + // init task list + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。 + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) + && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META)) { + TaskList tasklist = new TaskList(); //继承自Node + tasklist.setContentByRemoteJSON(object); + mGTaskListHashMap.put(gid, tasklist); + mGTaskHashMap.put(gid, tasklist); //为什么加两遍??? + + // load tasks + JSONArray jsTasks = client.getTaskList(gid); + for (int j = 0; j < jsTasks.length(); j++) { + object = (JSONObject) jsTasks.getJSONObject(j); + gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + Task task = new Task(); + task.setContentByRemoteJSON(object); + if (task.isWorthSaving()) { + task.setMetaInfo(mMetaHashMap.get(gid)); + tasklist.addChildTask(task); + mGTaskHashMap.put(gid, task); + } + } + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("initGTaskList: handing JSONObject failed"); + } + } + + /** + * 功能:本地内容同步操作 + * @throws NetworkFailureException + * @return 无返回值 + */ + private void syncContent() throws NetworkFailureException { //本地内容同步操作 + int syncType; + Cursor c = null; //数据库指针 + String gid; //GoogleID?? + Node node; //Node包含Sync_Action的不同类型 + + mLocalDeleteIdMap.clear(); //HashSet类型 + + if (mCancelled) { + return; + } + + // for local deleted note + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id=?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, null); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); + } + + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + } + } else { + Log.w(TAG, "failed to query trash folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // sync folder first + syncFolder(); + + // for note existing in database + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //通过hashmap建立联系 + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //通过hashmap建立联系 + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing note in database"); + } + + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // go through remaining items + Iterator> iter = mGTaskHashMap.entrySet().iterator(); //Iterator迭代器 + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + node = entry.getValue(); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + + // mCancelled can be set by another thread, so we neet to check one by //thread----线程 + // one + // clear local delete table + if (!mCancelled) { + if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { + throw new ActionFailureException("failed to batch-delete local deleted notes"); + } + } + + // refresh local sync id + if (!mCancelled) { + GTaskClient.getInstance().commitUpdate(); + refreshLocalSyncId(); + } + + } + + /** + * 功能: + * @author TTS + * @throws NetworkFailureException + */ + private void syncFolder() throws NetworkFailureException { + Cursor c = null; + String gid; + Node node; + int syncType; + + if (mCancelled) { + return; + } + + // for root folder + try { + c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, + Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); + if (c != null) { + c.moveToNext(); + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); + mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); + // for system folder, only update remote name if necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } else { + Log.w(TAG, "failed to query root folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for call-note folder + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(Notes.ID_CALL_RECORD_FOLDER) + }, null); + if (c != null) { + if (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); + mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); + // for system folder, only update remote name if + // necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } + } else { + Log.w(TAG, "failed to query call note folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for local existing folders + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for remote add folders + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + gid = entry.getKey(); + node = entry.getValue(); + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + } + + if (!mCancelled) + GTaskClient.getInstance().commitUpdate(); + } + + /** + * 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode + * @author TTS + * @param syncType + * @param node + * @param c + * @throws NetworkFailureException + */ + private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + MetaData meta; + switch (syncType) { + case Node.SYNC_ACTION_ADD_LOCAL: + addLocalNode(node); + break; + case Node.SYNC_ACTION_ADD_REMOTE: + addRemoteNode(node, c); + break; + case Node.SYNC_ACTION_DEL_LOCAL: + meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + break; + case Node.SYNC_ACTION_DEL_REMOTE: + meta = mMetaHashMap.get(node.getGid()); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + GTaskClient.getInstance().deleteNode(node); + break; + case Node.SYNC_ACTION_UPDATE_LOCAL: + updateLocalNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_REMOTE: + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_CONFLICT: + // merging both modifications maybe a good idea + // right now just use local update simply + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_NONE: + break; + case Node.SYNC_ACTION_ERROR: + default: + throw new ActionFailureException("unkown sync action type"); + } + } + + /** + * 功能:本地增加Node + * @author TTS + * @param node + * @throws NetworkFailureException + */ + private void addLocalNode(Node node) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + if (node instanceof TaskList) { + if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { + sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); + } else if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { + sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); + } else { + sqlNote = new SqlNote(mContext); + sqlNote.setContent(node.getLocalJSONFromContent()); + sqlNote.setParentId(Notes.ID_ROOT_FOLDER); + } + } else { + sqlNote = new SqlNote(mContext); + JSONObject js = node.getLocalJSONFromContent(); + try { + if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.has(NoteColumns.ID)) { + long id = note.getLong(NoteColumns.ID); + if (DataUtils.existInNoteDatabase(mContentResolver, id)) { + // the id is not available, have to create a new one + note.remove(NoteColumns.ID); + } + } + } + + if (js.has(GTaskStringUtils.META_HEAD_DATA)) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { + // the data id is not available, have to create + // a new one + data.remove(DataColumns.ID); + } + } + } + + } + } catch (JSONException e) { + Log.w(TAG, e.toString()); + e.printStackTrace(); + } + sqlNote.setContent(js); + + Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot add local node"); + } + sqlNote.setParentId(parentId.longValue()); + } + + // create the local node + sqlNote.setGtaskId(node.getGid()); + sqlNote.commit(false); + + // update gid-nid mapping + mGidToNid.put(node.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), node.getGid()); + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + } + + /** + * 功能:update本地node + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * ----Cursor + * @throws NetworkFailureException + */ + private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + // update the note locally + sqlNote = new SqlNote(mContext, c); + sqlNote.setContent(node.getLocalJSONFromContent()); + + Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) + : new Long(Notes.ID_ROOT_FOLDER); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot update local node"); + } + sqlNote.setParentId(parentId.longValue()); + sqlNote.commit(true); + + // update meta info + updateRemoteMeta(node.getGid(), sqlNote); + } + + /** + * 功能:远程增加Node + * 需要updateRemoteMeta + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * --Cursor + * @throws NetworkFailureException + */ + private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); //从本地mContext中获取内容 + Node n; + + // update remotely + if (sqlNote.isNoteType()) { + Task task = new Task(); + task.setContentByLocalJSON(sqlNote.getContent()); + + String parentGid = mNidToGid.get(sqlNote.getParentId()); + if (parentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); //调试信息 + throw new ActionFailureException("cannot add remote task"); + } + mGTaskListHashMap.get(parentGid).addChildTask(task); //在本地生成的GTaskList中增加子结点 + + //登录远程服务器,创建Task + GTaskClient.getInstance().createTask(task); + n = (Node) task; + + // add meta + updateRemoteMeta(task.getGid(), sqlNote); + } else { + TaskList tasklist = null; + + // we need to skip folder if it has already existed + String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; + if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) + folderName += GTaskStringUtils.FOLDER_DEFAULT; + else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) + folderName += GTaskStringUtils.FOLDER_CALL_NOTE; + else + folderName += sqlNote.getSnippet(); + + //iterator迭代器,通过统一的接口迭代所有的map元素 + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + String gid = entry.getKey(); + TaskList list = entry.getValue(); + + if (list.getName().equals(folderName)) { + tasklist = list; + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + } + break; + } + } + + // no match we can add now + if (tasklist == null) { + tasklist = new TaskList(); + tasklist.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().createTaskList(tasklist); + mGTaskListHashMap.put(tasklist.getGid(), tasklist); + } + n = (Node) tasklist; + } + + // update local note + sqlNote.setGtaskId(n.getGid()); + sqlNote.commit(false); + sqlNote.resetLocalModified(); + sqlNote.commit(true); + + // gid-id mapping //创建id间的映射 + mGidToNid.put(n.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), n.getGid()); + } + + /** + * 功能:更新远端的Node,包含meta更新(updateRemoteMeta) + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * --Cursor + * @throws NetworkFailureException + */ + private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + + // update remotely + node.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(node); //GTaskClient用途为从本地登陆远端服务器 + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + + // move task if necessary + if (sqlNote.isNoteType()) { + Task task = (Task) node; + TaskList preParentList = task.getParent(); + //preParentList为通过node获取的父节点列表 + + String curParentGid = mNidToGid.get(sqlNote.getParentId()); + //curParentGid为通过光标在数据库中找到sqlNote的mParentId,再通过mNidToGid由long类型转为String类型的Gid + + if (curParentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot update remote task"); + } + TaskList curParentList = mGTaskListHashMap.get(curParentGid); + //通过HashMap找到对应Gid的TaskList + + if (preParentList != curParentList) { //????????????? + preParentList.removeChildTask(task); + curParentList.addChildTask(task); + GTaskClient.getInstance().moveTask(task, preParentList, curParentList); + } + } + + // clear local modified flag + sqlNote.resetLocalModified(); + //commit到本地数据库 + sqlNote.commit(true); + } + + /** + * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。 + * @author TTS + * @param gid + * ---GoogleID为String类型 + * @param sqlNote + * ---同步前的数据库操作,故使用类SqlNote + * @throws NetworkFailureException + */ + private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { + if (sqlNote != null && sqlNote.isNoteType()) { + MetaData metaData = mMetaHashMap.get(gid); + if (metaData != null) { + metaData.setMeta(gid, sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(metaData); + } else { + metaData = new MetaData(); + metaData.setMeta(gid, sqlNote.getContent()); + mMetaList.addChildTask(metaData); + mMetaHashMap.put(gid, metaData); + GTaskClient.getInstance().createTask(metaData); + } + } + } + + /** + * 功能:刷新本地,给sync的ID对应上最后更改过的对象 + * @author TTS + * @return void + * @throws NetworkFailureException + */ + private void refreshLocalSyncId() throws NetworkFailureException { + if (mCancelled) { + return; + } + + // get the latest gtask list //获取最近的(最晚的)gtask list + mGTaskHashMap.clear(); + mGTaskListHashMap.clear(); + mMetaHashMap.clear(); + initGTaskList(); + + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); //query语句:五个参数,NoteColumns.TYPE + " DESC"-----为按类型递减顺序返回查询结果。new String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------为选择参数。"(type<>? AND parent_id<>?)"-------指明返回行过滤器。SqlNote.PROJECTION_NOTE--------应返回的数据列的名字。Notes.CONTENT_NOTE_URI--------contentProvider包含所有数据集所对应的uri + if (c != null) { + while (c.moveToNext()) { + String gid = c.getString(SqlNote.GTASK_ID_COLUMN); + Node node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + ContentValues values = new ContentValues(); //在ContentValues中创建键值对。准备通过contentResolver写入数据 + values.put(NoteColumns.SYNC_ID, node.getLastModified()); + mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //进行批量更改,选择参数为NULL,应该可以用insert替换,参数分别为表名和需要更新的value对象。 + c.getLong(SqlNote.ID_COLUMN)), values, null, null); + } else { + Log.e(TAG, "something is missed"); + throw new ActionFailureException( + "some local items don't have gid after sync"); + } + } + } else { + Log.w(TAG, "failed to query local note to refresh sync id"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + } + + /** + * 功能:获取同步账号,mAccount.name + * @author TTS + * @return String + */ + public String getSyncAccount() { + return GTaskClient.getInstance().getSyncAccount().name; + } + + /** + * 功能:取消同步,置mCancelled为true + * @author TTS + */ + public void cancelSync() { + mCancelled = true; + } +} \ No newline at end of file diff --git a/gtask注释/remote/GTaskSyncService.java b/gtask注释/remote/GTaskSyncService.java new file mode 100644 index 0000000..bf7fb43 --- /dev/null +++ b/gtask注释/remote/GTaskSyncService.java @@ -0,0 +1,124 @@ +package net.micode.notes.gtask.remote; + +/* + * Service是在一段不定的时间运行在后台,不和用户交互的应用组件 + * 主要方法: + * private void startSync() 启动一个同步工作 + * private void cancelSync() 取消同步 + * public void onCreate() + * public int onStartCommand(Intent intent, int flags, int startId) service生命周期的组成部分,相当于重启service(比如在被暂停之后),而不是创建一个新的service + * public void onLowMemory() 在没有内存的情况下如果存在service则结束掉这的service + * public IBinder onBind() + * public void sendBroadcast(String msg) 发送同步的相关通知 + * public static void startSync(Activity activity) + * public static void cancelSync(Context context) + * public static boolean isSyncing() 判读是否在进行同步 + * public static String getProgressString() 获取当前进度的信息 + */ + +public class GTaskSyncService extends Service { + public final static String ACTION_STRING_NAME = "sync_action_type"; + + public final static int ACTION_START_SYNC = 0; + + public final static int ACTION_CANCEL_SYNC = 1; + + public final static int ACTION_INVALID = 2; + + public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; + + public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; + + public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; + + private static GTaskASyncTask mSyncTask = null; + + private static String mSyncProgress = ""; + + //开始一个同步的工作 + private void startSync() { + if (mSyncTask == null) { + mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { + public void onComplete() { + mSyncTask = null; + sendBroadcast(""); + stopSelf(); + } + }); + sendBroadcast(""); + mSyncTask.execute(); //这个函数让任务是以单线程队列方式或线程池队列方式运行 + } + } + + + private void cancelSync() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + @Override + public void onCreate() { //初始化一个service + mSyncTask = null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Bundle bundle = intent.getExtras(); + if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { + switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { + //两种情况,开始同步或者取消同步 + case ACTION_START_SYNC: + startSync(); + break; + case ACTION_CANCEL_SYNC: + cancelSync(); + break; + default: + break; + } + return START_STICKY; //等待新的intent来是这个service继续运行 + } + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onLowMemory() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + public IBinder onBind(Intent intent) { //不知道干吗用的 + return null; + } + + public void sendBroadcast(String msg) { + mSyncProgress = msg; + Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); //创建一个新的Intent + intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); //附加INTENT中的相应参数的值 + intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); + sendBroadcast(intent); //发送这个通知 + } + + public static void startSync(Activity activity) {//执行一个service,service的内容里的同步动作就是开始同步 + GTaskManager.getInstance().setActivityContext(activity); + Intent intent = new Intent(activity, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); + activity.startService(intent); + } + + public static void cancelSync(Context context) {//执行一个service,service的内容里的同步动作就是取消同步 + Intent intent = new Intent(context, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); + context.startService(intent); + } + + public static boolean isSyncing() { + return mSyncTask != null; + } + + public static String getProgressString() { + return mSyncProgress; + } +} \ No newline at end of file -- 2.34.1 From 465530fa86f72ed3e3db66f2c2364abbee457559 Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Fri, 21 Apr 2023 13:39:42 +0800 Subject: [PATCH 10/20] 1 --- gtask注释_刘定衢/data/MetaData.java | 104 +++ gtask注释_刘定衢/data/Node.java | 90 ++ gtask注释_刘定衢/data/SqlData.java | 224 +++++ gtask注释_刘定衢/data/SqlNote.java | 577 ++++++++++++ gtask注释_刘定衢/data/Task.java | 323 +++++++ gtask注释_刘定衢/data/TaskList.java | 370 ++++++++ .../exception/ActionFailureException.java | 32 + .../exception/NetworkFailureException.java | 33 + .../remote/GTaskASyncTask.java | 102 +++ gtask注释_刘定衢/remote/GTaskClient.java | 612 +++++++++++++ .../remote/GTaskManager.java | 846 ++++++++++++++++++ .../remote/GTaskSyncService.java | 124 +++ 12 files changed, 3437 insertions(+) create mode 100644 gtask注释_刘定衢/data/MetaData.java create mode 100644 gtask注释_刘定衢/data/Node.java create mode 100644 gtask注释_刘定衢/data/SqlData.java create mode 100644 gtask注释_刘定衢/data/SqlNote.java create mode 100644 gtask注释_刘定衢/data/Task.java create mode 100644 gtask注释_刘定衢/data/TaskList.java create mode 100644 gtask注释_刘定衢/exception/ActionFailureException.java create mode 100644 gtask注释_刘定衢/exception/NetworkFailureException.java create mode 100644 gtask注释_刘定衢/remote/GTaskASyncTask.java create mode 100644 gtask注释_刘定衢/remote/GTaskClient.java create mode 100644 gtask注释_刘定衢/remote/GTaskManager.java create mode 100644 gtask注释_刘定衢/remote/GTaskSyncService.java diff --git a/gtask注释_刘定衢/data/MetaData.java b/gtask注释_刘定衢/data/MetaData.java new file mode 100644 index 0000000..0f33467 --- /dev/null +++ b/gtask注释_刘定衢/data/MetaData.java @@ -0,0 +1,104 @@ +package net.micode.notes.gtask.data; + +public class MetaData extends Task { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + */ + private final static String TAG = MetaData.class.getSimpleName(); + private String mRelatedGid = null; + /* + * 功能描述:设置数据,即生成元数据库 + * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 + * 参数注解: + */ + public void setMeta(String gid, JSONObject metaInfo) + { + //对函数块进行注释 + try { + metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); + /* + * 将这对键值放入metaInfo这个jsonobject对象中 + */ + } catch (JSONException e) { + Log.e(TAG, "failed to put related gid"); + /* + * 输出错误信息 + */ + } + setNotes(metaInfo.toString()); + setName(GTaskStringUtils.META_NOTE_NAME); + } + /* + * 功能描述:获取相关联的Gid + */ + public String getRelatedGid() { + return mRelatedGid; + } + /* + * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 + * Made By CuiCan + */ + @Override + public boolean isWorthSaving() { + return getNotes() != null; + } + /* + * 功能描述:使用远程json数据对象设置元数据内容 + * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 + * 参数注解: + */ + @Override + public void setContentByRemoteJSON(JSONObject js) { + super.setContentByRemoteJSON(js); + if (getNotes() != null) { + try { + JSONObject metaInfo = new JSONObject(getNotes().trim()); + mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); + } catch (JSONException e) { + Log.w(TAG, "failed to get related gid"); + /* + * 输出警告信息 + */ + mRelatedGid = null; + } + } + } + /* + * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public void setContentByLocalJSON(JSONObject js) { + // this function should not be called + throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); + /* + * 传递非法参数异常 + */ + } + /* + * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public JSONObject getLocalJSONFromContent() { + throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); + /* + * 传递非法参数异常 + * Made By Cui Can + */ + } + /* + * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常 + * Made By CuiCan + */ + @Override + public int getSyncAction(Cursor c) { + throw new IllegalAccessError("MetaData:getSyncAction should not be called"); + /* + * 传递非法参数异常 + * Made By Cui Can + */ + } + +} \ No newline at end of file diff --git a/gtask注释_刘定衢/data/Node.java b/gtask注释_刘定衢/data/Node.java new file mode 100644 index 0000000..47f7461 --- /dev/null +++ b/gtask注释_刘定衢/data/Node.java @@ -0,0 +1,90 @@ +package net.micode.notes.gtask.data; + +import android.database.Cursor; + +import org.json.JSONObject; + +/** + * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 + * 关键字:abstract + */ +public abstract class Node { + //定义了各种用于表征同步状态的常量 + public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) + + public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 + + public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 + + public static final int SYNC_ACTION_DEL_REMOTE = 3;// 需要在远程云端删除内容 + + public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 + + public static final int SYNC_ACTION_UPDATE_REMOTE = 5;// 需要将本地内容更新到远程云端 + + public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 + + public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 + + public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 + + private String mGid; + + private String mName; + + private long mLastModified;//记录最后一次修改时间 + + private boolean mDeleted;//表征是否被删除 + + public Node() { + mGid = null; + mName = ""; + mLastModified = 0; + mDeleted = false; + } + + public abstract JSONObject getCreateAction(int actionId); + + public abstract JSONObject getUpdateAction(int actionId); + + public abstract void setContentByRemoteJSON(JSONObject js); + + public abstract void setContentByLocalJSON(JSONObject js); + + public abstract JSONObject getLocalJSONFromContent(); + + public abstract int getSyncAction(Cursor c); + + public void setGid(String gid) { + this.mGid = gid; + } + + public void setName(String name) { + this.mName = name; + } + + public void setLastModified(long lastModified) { + this.mLastModified = lastModified; + } + + public void setDeleted(boolean deleted) { + this.mDeleted = deleted; + } + + public String getGid() { + return this.mGid; + } + + public String getName() { + return this.mName; + } + + public long getLastModified() { + return this.mLastModified; + } + + public boolean getDeleted() { + return this.mDeleted; + } + +} \ No newline at end of file diff --git a/gtask注释_刘定衢/data/SqlData.java b/gtask注释_刘定衢/data/SqlData.java new file mode 100644 index 0000000..f47546a --- /dev/null +++ b/gtask注释_刘定衢/data/SqlData.java @@ -0,0 +1,224 @@ +/* + * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 + * SqlData其实就是也就是所谓数据中的数据 + */ + +package net.micode.notes.gtask.data; +/* + * 功能描述: + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + +public class SqlData { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + * Made By CuiCan + */ + private static final String TAG = SqlData.class.getSimpleName(); + + private static final int INVALID_ID = -99999;//为mDataId置初始值-99999 + + + /** + * 来自Notes类中定义的DataColumn中的一些常量 + */ + + // 集合了interface DataColumns中所有SF常量 + public static final String[] PROJECTION_DATA = new String[] { + DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, + DataColumns.DATA3 + }; + + /** + * 以下五个变量作为sql表中5列的编号 + */ + public static final int DATA_ID_COLUMN = 0; + + public static final int DATA_MIME_TYPE_COLUMN = 1; + + public static final int DATA_CONTENT_COLUMN = 2; + + public static final int DATA_CONTENT_DATA_1_COLUMN = 3; + + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; + + private ContentResolver mContentResolver; + //判断是否直接用Content生成,是为true,否则为false + private boolean mIsCreate; + + private long mDataId; + + private String mDataMimeType; + + private String mDataContent; + + private long mDataContentData1; + + private String mDataContentData3; + + private ContentValues mDiffDataValues; + + /* + * 功能描述:构造函数,用于初始化数据 + * 参数注解:mContentResolver用于获取ContentProvider提供的数据 + * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) + * 参数注解: + * Made By CuiCan + */ + public SqlData(Context context) { + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mDataId = INVALID_ID;//mDataId置初始值-99999 + mDataMimeType = DataConstants.NOTE; + mDataContent = ""; + mDataContentData1 = 0; + mDataContentData3 = ""; + mDiffDataValues = new ContentValues(); + } + + + /* + * 功能描述:构造函数,初始化数据 + * 参数注解:mContentResolver用于获取ContentProvider提供的数据 + * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) + * 参数注解: + * Made By CuiCan + */ + public SqlData(Context context, Cursor c) { + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDiffDataValues = new ContentValues(); + } + + /* + * 功能描述:从光标处加载数据 + * 从当前的光标处将五列的数据加载到该类的对象 + * Made By CuiCan + */ + private void loadFromCursor(Cursor c) { + mDataId = c.getLong(DATA_ID_COLUMN); + mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); + mDataContent = c.getString(DATA_CONTENT_COLUMN); + mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); + mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); + } + + + /* + * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 + * 参数注解: + * Made By CuiCan + */ + public void setContent(JSONObject js) throws JSONException { + //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + if (mIsCreate || mDataId != dataId) { + mDiffDataValues.put(DataColumns.ID, dataId); + } + mDataId = dataId; + + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) + : DataConstants.NOTE; + if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { + mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); + } + mDataMimeType = dataMimeType; + + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; + if (mIsCreate || !mDataContent.equals(dataContent)) { + mDiffDataValues.put(DataColumns.CONTENT, dataContent); + } + mDataContent = dataContent; + + long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; + if (mIsCreate || mDataContentData1 != dataContentData1) { + mDiffDataValues.put(DataColumns.DATA1, dataContentData1); + } + mDataContentData1 = dataContentData1; + + String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; + if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { + mDiffDataValues.put(DataColumns.DATA3, dataContentData3); + } + mDataContentData3 = dataContentData3; + } + + + /* + * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 + * 参数注解: + * Made By CuiCan + */ + public JSONObject getContent() throws JSONException { + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + //创建JSONObject对象。并将相关数据放入其中,并返回。 + JSONObject js = new JSONObject(); + js.put(DataColumns.ID, mDataId); + js.put(DataColumns.MIME_TYPE, mDataMimeType); + js.put(DataColumns.CONTENT, mDataContent); + js.put(DataColumns.DATA1, mDataContentData1); + js.put(DataColumns.DATA3, mDataContentData3); + return js; + } + + /* + * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 + * 参数注解: + * Made By CuiCan + */ + public void commit(long noteId, boolean validateVersion, long version) { + + if (mIsCreate) { + if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { + mDiffDataValues.remove(DataColumns.ID); + } + + mDiffDataValues.put(DataColumns.NOTE_ID, noteId); + Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); + try { + mDataId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + } else { + if (mDiffDataValues.size() > 0) { + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); + } else { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { + String.valueOf(noteId), String.valueOf(version) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + } + + mDiffDataValues.clear(); + mIsCreate = false; + } + + /* + * 功能描述:获取当前id + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + public long getId() { + return mDataId; + } +} \ No newline at end of file diff --git a/gtask注释_刘定衢/data/SqlNote.java b/gtask注释_刘定衢/data/SqlNote.java new file mode 100644 index 0000000..c669db2 --- /dev/null +++ b/gtask注释_刘定衢/data/SqlNote.java @@ -0,0 +1,577 @@ +/* + * Description:用于支持小米便签最底层的数据库相关操作,和sqldata的关系上是父集关系,即note是data的子父集。 + * 和SqlData相比,SqlNote算是真正意义上的数据了。 + */ + +package net.micode.notes.gtask.data; +/* + * 功能描述: + * 实现过程: + * 参数注解: + * Made By CuiCan + */ + +public class SqlNote { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + * Made By CuiCan + */ + private static final String TAG = SqlNote.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + // 集合了interface NoteColumns中所有SF常量(17个) + public static final String[] PROJECTION_NOTE = new String[] { + NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, + NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, + NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, + NoteColumns.VERSION + }; + + //以下设置17个列的编号 + public static final int ID_COLUMN = 0; + + public static final int ALERTED_DATE_COLUMN = 1; + + public static final int BG_COLOR_ID_COLUMN = 2; + + public static final int CREATED_DATE_COLUMN = 3; + + public static final int HAS_ATTACHMENT_COLUMN = 4; + + public static final int MODIFIED_DATE_COLUMN = 5; + + public static final int NOTES_COUNT_COLUMN = 6; + + public static final int PARENT_ID_COLUMN = 7; + + public static final int SNIPPET_COLUMN = 8; + + public static final int TYPE_COLUMN = 9; + + public static final int WIDGET_ID_COLUMN = 10; + + public static final int WIDGET_TYPE_COLUMN = 11; + + public static final int SYNC_ID_COLUMN = 12; + + public static final int LOCAL_MODIFIED_COLUMN = 13; + + public static final int ORIGIN_PARENT_ID_COLUMN = 14; + + public static final int GTASK_ID_COLUMN = 15; + + public static final int VERSION_COLUMN = 16; + + //一下定义了17个内部的变量,其中12个可以由content中获得,5个需要初始化为0或者new + private Context mContext; + + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + private long mId; + + private long mAlertDate; + + private int mBgColorId; + + private long mCreatedDate; + + private int mHasAttachment; + + private long mModifiedDate; + + private long mParentId; + + private String mSnippet; + + private int mType; + + private int mWidgetId; + + private int mWidgetType; + + private long mOriginParent; + + private long mVersion; + + private ContentValues mDiffNoteValues; + + private ArrayList mDataList; + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + //构造函数只有context,对所有的变量进行初始化 + public SqlNote(Context context) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mId = INVALID_ID; + mAlertDate = 0; + mBgColorId = ResourceParser.getDefaultBgId(context); + mCreatedDate = System.currentTimeMillis();//调用系统函数获得创建时间 + mHasAttachment = 0; + mModifiedDate = System.currentTimeMillis();//最后一次修改时间初始化为创建时间 + mParentId = 0; + mSnippet = ""; + mType = Notes.TYPE_NOTE; + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + mOriginParent = 0; + mVersion = 0; + mDiffNoteValues = new ContentValues(); + mDataList = new ArrayList(); + } + + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + //构造函数有context和一个数据库的cursor,多数变量通过cursor指向的一条记录直接进行初始化 + public SqlNote(Context context, Cursor c) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDataList = new ArrayList(); + // + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + } + + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + * 参数注解: + * Made By CuiCan + */ + public SqlNote(Context context, long id) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(id); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + + } + + /* + * 功能描述:通过id从光标处加载数据 + * Made By CuiCan + */ + private void loadFromCursor(long id) { + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(id) + }, null);//通过id获得对应的ContentResolver中的cursor + if (c != null) { + c.moveToNext(); + loadFromCursor(c);//然后加载数据进行初始化,这样函数 + //SqlNote(Context context, long id)与SqlNote(Context context, long id)的实现方式基本相同 + } else { + Log.w(TAG, "loadFromCursor: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + /* + * 功能描述:通过游标从光标处加载数据 + * Made By CuiCan + */ + private void loadFromCursor(Cursor c) { + //直接从一条记录中的获得以下变量的初始值 + mId = c.getLong(ID_COLUMN); + mAlertDate = c.getLong(ALERTED_DATE_COLUMN); + mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = c.getLong(CREATED_DATE_COLUMN); + mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); + mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); + mParentId = c.getLong(PARENT_ID_COLUMN); + mSnippet = c.getString(SNIPPET_COLUMN); + mType = c.getInt(TYPE_COLUMN); + mWidgetId = c.getInt(WIDGET_ID_COLUMN); + mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); + mVersion = c.getLong(VERSION_COLUMN); + } + + /* + * 功能描述:通过content机制获取共享数据并加载到数据库当前游标处 + * 参数注解: + * Made By CuiCan + */ + private void loadDataContent() { + Cursor c = null; + mDataList.clear(); + try { + c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, + "(note_id=?)", new String[] { + String.valueOf(mId) + }, null); + if (c != null) { + if (c.getCount() == 0) { + Log.w(TAG, "it seems that the note has not data"); + return; + } + while (c.moveToNext()) { + SqlData data = new SqlData(mContext, c); + mDataList.add(data); + } + } else { + Log.w(TAG, "loadDataContent: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + /* + * 功能描述:设置通过content机制用于共享的数据信息 + * 参数注解: + * Made By CuiCan + */ + public boolean setContent(JSONObject js) { + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + Log.w(TAG, "cannot set system folder"); + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + // for folder we can only update the snnipet and type + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; + if (mIsCreate || mId != id) { + mDiffNoteValues.put(NoteColumns.ID, id); + } + mId = id; + + long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note + .getLong(NoteColumns.ALERTED_DATE) : 0; + if (mIsCreate || mAlertDate != alertDate) { + mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); + } + mAlertDate = alertDate; + + int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note + .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); + if (mIsCreate || mBgColorId != bgColorId) { + mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); + } + mBgColorId = bgColorId; + long createDate = note.has(NoteColumns.CREATED_DATE) ? note + .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mCreatedDate != createDate) { + mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); + } + mCreatedDate = createDate; + + int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note + .getInt(NoteColumns.HAS_ATTACHMENT) : 0; + if (mIsCreate || mHasAttachment != hasAttachment) { + mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); + } + mHasAttachment = hasAttachment; + + long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note + .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mModifiedDate != modifiedDate) { + mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); + } + mModifiedDate = modifiedDate; + + long parentId = note.has(NoteColumns.PARENT_ID) ? note + .getLong(NoteColumns.PARENT_ID) : 0; + if (mIsCreate || mParentId != parentId) { + mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); + } + mParentId = parentId; + + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + + int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) + : AppWidgetManager.INVALID_APPWIDGET_ID; + if (mIsCreate || mWidgetId != widgetId) { + mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); + } + mWidgetId = widgetId; + + int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note + .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; + if (mIsCreate || mWidgetType != widgetType) { + mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); + } + mWidgetType = widgetType; + + long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note + .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; + if (mIsCreate || mOriginParent != originParent) { + mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); + } + mOriginParent = originParent; + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + SqlData sqlData = null; + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + for (SqlData temp : mDataList) { + if (dataId == temp.getId()) { + sqlData = temp; + } + } + } + + if (sqlData == null) { + sqlData = new SqlData(mContext); + mDataList.add(sqlData); + } + + sqlData.setContent(data); + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } + return true; + } + + /* + * 功能描述:获取content机制提供的数据并加载到note中 + * 参数注解: + * Made By CuiCan + */ + public JSONObject getContent() { + try { + JSONObject js = new JSONObject(); + + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + + JSONObject note = new JSONObject(); + if (mType == Notes.TYPE_NOTE) {//类型为note时 + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.ALERTED_DATE, mAlertDate); + note.put(NoteColumns.BG_COLOR_ID, mBgColorId); + note.put(NoteColumns.CREATED_DATE, mCreatedDate); + note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); + note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); + note.put(NoteColumns.PARENT_ID, mParentId); + note.put(NoteColumns.SNIPPET, mSnippet); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.WIDGET_ID, mWidgetId); + note.put(NoteColumns.WIDGET_TYPE, mWidgetType); + note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + + JSONArray dataArray = new JSONArray(); + for (SqlData sqlData : mDataList) { + JSONObject data = sqlData.getContent(); + if (data != null) { + dataArray.put(data); + } + } + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {//类型为文件夹或者 + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.SNIPPET, mSnippet); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + } + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + return null; + } + + /* + * 功能描述:给当前id设置父id + * 参数注解: + * Made By CuiCan + */ + public void setParentId(long id) { + mParentId = id; + mDiffNoteValues.put(NoteColumns.PARENT_ID, id); + } + + /* + * 功能描述:给当前id设置Gtaskid + * 参数注解: + * Made By CuiCan + */ + public void setGtaskId(String gid) { + mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); + } + + /* + * 功能描述:给当前id设置同步id + * 参数注解: + * Made By CuiCan + */ + public void setSyncId(long syncId) { + mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); + } + + /* + * 功能描述:初始化本地修改,即撤销所有当前修改 + * 参数注解: + * Made By CuiCan + */ + public void resetLocalModified() { + mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); + } + + /* + * 功能描述:获得当前id + * 参数注解: + * Made By CuiCan + */ + public long getId() { + return mId; + } + + /* + * 功能描述:获得当前id的父id + * 参数注解: + * Made By CuiCan + */ + public long getParentId() { + return mParentId; + } + + /* + * 功能描述:获取小片段即用于显示的部分便签内容 + * 参数注解: + * Made By CuiCan + */ + public String getSnippet() { + return mSnippet; + } + + /* + * 功能描述:判断是否为便签类型 + * 参数注解: + * Made By CuiCan + */ + public boolean isNoteType() { + return mType == Notes.TYPE_NOTE; + } + + /* + * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 + * 参数注解: + * Made By CuiCan + */ + public void commit(boolean validateVersion) { + if (mIsCreate) { + if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { + mDiffNoteValues.remove(NoteColumns.ID); + } + + Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); + try { + mId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + if (mId == 0) { + throw new IllegalStateException("Create thread id failed"); + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) {//直接使用sqldata中的实现 + sqlData.commit(mId, false, -1); + } + } + } else { + if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { + Log.e(TAG, "No such note"); + throw new IllegalStateException("Try to update note with invalid id"); + } + if (mDiffNoteValues.size() > 0) { + mVersion ++; + int result = 0; + if (!validateVersion) {//构造字符串 + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?)", new String[] { + String.valueOf(mId) + }); + } else { + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", + new String[] { + String.valueOf(mId), String.valueOf(mVersion) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, validateVersion, mVersion); + } + } + } + + // refresh local info + loadFromCursor(mId); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + + mDiffNoteValues.clear(); + mIsCreate = false; + } +} \ No newline at end of file diff --git a/gtask注释_刘定衢/data/Task.java b/gtask注释_刘定衢/data/Task.java new file mode 100644 index 0000000..3c890b3 --- /dev/null +++ b/gtask注释_刘定衢/data/Task.java @@ -0,0 +1,323 @@ +package net.micode.notes.gtask.data; + +public class Task extends Node { + private static final String TAG = Task.class.getSimpleName(); + + private boolean mCompleted;//是否完成 + + private String mNotes; + + private JSONObject mMetaInfo;//将在实例中存储数据的类型 + + private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善) + + private TaskList mParent;//所在的任务列表的指针 + + public Task() { + super(); + mCompleted = false; + mNotes = null; + mPriorSibling = null;//TaskList中当前Task前面的Task的指针 + mParent = null;//当前Task所在的TaskList + mMetaInfo = null; + } + + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_TASK); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + // parent_id + if (mParent!= null) { + js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); + } + + // dest_parent_type + js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + + // list_id + if (mParent!= null) { + js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); + } + + // prior_sibling_id + if (mPriorSibling != null) { + js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-create jsonobject"); + } + + return js; + } + + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + // notes + if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { + setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); + } + + // deleted + if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { + setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); + } + + // completed + if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { + setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get task content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { //��metadata����ʵʩ + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) + || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { + Log.e(TAG, "invalid type"); + return; + } + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + setName(data.getString(DataColumns.CONTENT)); + break; + } + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + String name = getName(); + try { + if (mMetaInfo == null) { + // new task created from web + if (name == null) { + Log.w(TAG, "the note seems to be an empty one"); + return null; + } + + JSONObject js = new JSONObject(); + JSONObject note = new JSONObject(); + JSONArray dataArray = new JSONArray(); + JSONObject data = new JSONObject(); + data.put(DataColumns.CONTENT, name); + dataArray.put(data); + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + return js; + } else { + // synced task + JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + data.put(DataColumns.CONTENT, getName()); + break; + } + } + + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + return mMetaInfo; + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public void setMetaInfo(MetaData metaData) { + if (metaData != null && metaData.getNotes() != null) { + try { + mMetaInfo = new JSONObject(metaData.getNotes()); + } catch (JSONException e) { + Log.w(TAG, e.toString()); + mMetaInfo = null; + } + } + } + + public int getSyncAction(Cursor c) { + try { + JSONObject noteInfo = null; + if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + } + + if (noteInfo == null) { + Log.w(TAG, "it seems that note meta has been deleted"); + return SYNC_ACTION_UPDATE_REMOTE; + } + + if (!noteInfo.has(NoteColumns.ID)) { + Log.w(TAG, "remote note id seems to be deleted"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + // validate the note id now + if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { + Log.w(TAG, "note id doesn't match"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + return SYNC_ACTION_UPDATE_CONFLICT; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + public boolean isWorthSaving() { + return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) + || (getNotes() != null && getNotes().trim().length() > 0); + } + + public void setCompleted(boolean completed) { + this.mCompleted = completed; + } + + public void setNotes(String notes) { + this.mNotes = notes; + } + + public void setPriorSibling(Task priorSibling) { + this.mPriorSibling = priorSibling; + } + + public void setParent(TaskList parent) { + this.mParent = parent; + } + + public boolean getCompleted() { + return this.mCompleted; + } + + public String getNotes() { + return this.mNotes; + } + + public Task getPriorSibling() { + return this.mPriorSibling; + } + + public TaskList getParent() { + return this.mParent; + } + +} \ No newline at end of file diff --git a/gtask注释_刘定衢/data/TaskList.java b/gtask注释_刘定衢/data/TaskList.java new file mode 100644 index 0000000..4922bb4 --- /dev/null +++ b/gtask注释_刘定衢/data/TaskList.java @@ -0,0 +1,370 @@ +package net.micode.notes.gtask.data; + +public class TaskList extends Node { + private static final String TAG = TaskList.class.getSimpleName();//tag标记 + + private int mIndex;//当前TaskList的指针 + + private ArrayList mChildren;//类中主要的保存数据的单元,用来实现一个以Task为元素的ArrayList + + public TaskList() { + super(); + mChildren = new ArrayList(); + mIndex = 1; + } + + /* (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getCreateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); + + // entity_delta + JSONObject entity = new JSONObject();//entity实体 + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-create jsonobject"); + } + + return js; + } + + /* (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get tasklist content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + + if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + String name = folder.getString(NoteColumns.SNIPPET); + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); + } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); + else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE); + else + Log.e(TAG, "invalid system folder"); + } else { + Log.e(TAG, "error type"); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + try { + JSONObject js = new JSONObject(); + JSONObject folder = new JSONObject(); + + String folderName = getName(); + if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) + folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), + folderName.length()); + folder.put(NoteColumns.SNIPPET, folderName); + if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) + || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) + folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + else + folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + + js.put(GTaskStringUtils.META_HEAD_NOTE, folder); + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public int getSyncAction(Cursor c) { + try { + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + // for folder conflicts, just apply local modification + return SYNC_ACTION_UPDATE_REMOTE; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + /** + * @return + * 功能:获得TaskList的大小,即mChildren的大小 + */ + public int getChildTaskCount() { + return mChildren.size(); + } + + /** + * @param task + * @return 返回值为是否成功添加任务。 + * 功能:在当前任务表末尾添加新的任务。 + */ + public boolean addChildTask(Task task) { + boolean ret = false; + if (task != null && !mChildren.contains(task)) { + ret = mChildren.add(task); + if (ret) { + // need to set prior sibling and parent + task.setPriorSibling(mChildren.isEmpty() ? null : mChildren + .get(mChildren.size() - 1)); + task.setParent(this); + //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改 + //,接下来几个函数都有相关操作 + } + } + return ret; + } + + /** + * @param task + * @param index + * @return + * 功能:在当前任务表的指定位置添加新的任务。 + */ + public boolean addChildTask(Task task, int index) { + if (index < 0 || index > mChildren.size()) { + Log.e(TAG, "add child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (task != null && pos == -1) { + mChildren.add(index, task); + + // update the task list + Task preTask = null; + Task afterTask = null; + if (index != 0) + preTask = mChildren.get(index - 1); + if (index != mChildren.size() - 1) + afterTask = mChildren.get(index + 1); + + task.setPriorSibling(preTask); + if (afterTask != null) + afterTask.setPriorSibling(task); + } + + return true; + } + + /** + * @param task + * @return 返回删除是否成功 + * 功能:删除TaskList中的一个Task + */ + public boolean removeChildTask(Task task) { + boolean ret = false; + int index = mChildren.indexOf(task); + if (index != -1) { + ret = mChildren.remove(task); + + if (ret) { + // reset prior sibling and parent + task.setPriorSibling(null); + task.setParent(null); + + // update the task list + if (index != mChildren.size()) { + mChildren.get(index).setPriorSibling( + index == 0 ? null : mChildren.get(index - 1)); + } + } + } + return ret; + } + + /** + * @param task + * @param index + * @return + * 功能:将当前TaskList中含有的某个Task移到index位置 + */ + public boolean moveChildTask(Task task, int index) { + + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "move child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (pos == -1) { + Log.e(TAG, "move child task: the task should in the list"); + return false; + } + + if (pos == index) + return true; + return (removeChildTask(task) && addChildTask(task, index)); + //利用已实现好的功能完成当下功能; + } + + /** + * @param gid + * @return返回寻找结果 + * 功能:按gid寻找Task + */ + public Task findChildTaskByGid(String gid) { + for (int i = 0; i < mChildren.size(); i++) { + Task t = mChildren.get(i); + if (t.getGid().equals(gid)) { + return t; + } + } + return null; + } + + /** + * @param task + * @return + * 功能:返回指定Task的index + */ + public int getChildTaskIndex(Task task) { + return mChildren.indexOf(task); + } + + /** + * @param index + * @return + * 功能:返回指定index的Task + */ + public Task getChildTaskByIndex(int index) { + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "getTaskByIndex: invalid index"); + return null; + } + return mChildren.get(index); + } + + /** + * @param gid + * @return + * 功能:返回指定gid的Task + */ + public Task getChilTaskByGid(String gid) { + for (Task task : mChildren) {//一种常见的ArrayList的遍历方法(四种,见精读笔记) + if (task.getGid().equals(gid)) + return task; + } + return null; + } + + public ArrayList getChildTaskList() { + return this.mChildren; + } + + public void setIndex(int index) { + this.mIndex = index; + } + + public int getIndex() { + return this.mIndex; + } +} \ No newline at end of file diff --git a/gtask注释_刘定衢/exception/ActionFailureException.java b/gtask注释_刘定衢/exception/ActionFailureException.java new file mode 100644 index 0000000..f455c7a --- /dev/null +++ b/gtask注释_刘定衢/exception/ActionFailureException.java @@ -0,0 +1,32 @@ +/* + * Description:支持小米便签运行过程中的运行异常处理。 + */ + +package net.micode.notes.gtask.exception; + +public class ActionFailureException extends RuntimeException { + private static final long serialVersionUID = 4425249765923293627L; + /* + * serialVersionUID相当于java类的身份证。主要用于版本控制。 + * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + * Made By Cuican + */ + + public ActionFailureException() { + super(); + } + /* + * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. + * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 + * 怎么去引用里面的父类对象呢?使用super来引用 + * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) + * Made By Cuican + */ + public ActionFailureException(String paramString) { + super(paramString); + } + + public ActionFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} \ No newline at end of file diff --git a/gtask注释_刘定衢/exception/NetworkFailureException.java b/gtask注释_刘定衢/exception/NetworkFailureException.java new file mode 100644 index 0000000..63a1adb --- /dev/null +++ b/gtask注释_刘定衢/exception/NetworkFailureException.java @@ -0,0 +1,33 @@ +/* + * Description:支持小米便签运行过程中的网络异常处理。 + */ + +package net.micode.notes.gtask.exception; + +public class NetworkFailureException extends Exception { + private static final long serialVersionUID = 2107610287180234136L; + /* + * serialVersionUID相当于java类的身份证。主要用于版本控制。 + * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + * Made By Cuican + */ + + public NetworkFailureException() { + super(); + } + + /* + * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. + * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 + * 怎么去引用里面的父类对象呢?使用super来引用 + * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) + * Made By Cuican + */ + public NetworkFailureException(String paramString) { + super(paramString); + } + + public NetworkFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} \ No newline at end of file diff --git a/gtask注释_刘定衢/remote/GTaskASyncTask.java b/gtask注释_刘定衢/remote/GTaskASyncTask.java new file mode 100644 index 0000000..364a604 --- /dev/null +++ b/gtask注释_刘定衢/remote/GTaskASyncTask.java @@ -0,0 +1,102 @@ +package net.micode.notes.gtask.remote; + +/*异步操作类,实现GTask的异步操作过程 + * 主要方法: + * private void showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法 + * protected Integer doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间 + * protected void onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 + * protected void onPostExecute(Integer result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI + */ +public class GTaskASyncTask extends AsyncTask { + + + private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; + + public interface OnCompleteListener { + void onComplete(); + } + + private Context mContext; + + private NotificationManager mNotifiManager; + + private GTaskManager mTaskManager; + + private OnCompleteListener mOnCompleteListener; + + public GTaskASyncTask(Context context, OnCompleteListener listener) { + mContext = context; + mOnCompleteListener = listener; + mNotifiManager = (NotificationManager) mContext + .getSystemService(Context.NOTIFICATION_SERVICE); + mTaskManager = GTaskManager.getInstance(); + } + + public void cancelSync() { + mTaskManager.cancelSync(); + } + + public void publishProgess(String message) { // 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 + publishProgress(new String[] { + message + }); + } + + private void showNotification(int tickerId, String content) { + Notification notification = new Notification(R.drawable.notification, mContext + .getString(tickerId), System.currentTimeMillis()); + notification.defaults = Notification.DEFAULT_LIGHTS; // 调用系统自带灯光 + notification.flags = Notification.FLAG_AUTO_CANCEL; // 点击清除按钮或点击通知后会自动消失 + PendingIntent pendingIntent; //一个描述了想要启动一个Activity、Broadcast或是Service的意图 + if (tickerId != R.string.ticker_success) { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesPreferenceActivity.class), 0); //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象 + + } else { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesListActivity.class), 0); //如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象 + } + notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, + pendingIntent); + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//通过NotificationManager对象的notify()方法来执行一个notification的消息 + } + + @Override + protected Integer doInBackground(Void... unused) { + publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity + .getSyncAccountName(mContext))); //利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext))的字符串内容传进sync_progress_login中 + return mTaskManager.sync(mContext, this); //进行后台同步具体操作 + } + + @Override + protected void onProgressUpdate(String... progress) { + showNotification(R.string.ticker_syncing, progress[0]); + if (mContext instanceof GTaskSyncService) { //instanceof 判断mContext是否是GTaskSyncService的实例 + ((GTaskSyncService) mContext).sendBroadcast(progress[0]); + } + } + + @Override + protected void onPostExecute(Integer result) { //用于在执行完后台任务后更新UI,显示结果 + if (result == GTaskManager.STATE_SUCCESS) { + showNotification(R.string.ticker_success, mContext.getString( + R.string.success_sync_account, mTaskManager.getSyncAccount())); + NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); //设置最新同步的时间 + } else if (result == GTaskManager.STATE_NETWORK_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); + } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); + } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { + showNotification(R.string.ticker_cancel, mContext + .getString(R.string.error_sync_cancelled)); + } //几种不同情况下的结果显示 + if (mOnCompleteListener != null) { + new Thread(new Runnable() { //这里好像是方法内的一个线程,但是并不太懂什么意思 + + public void run() { //完成后的操作,使用onComplete()将所有值都重新初始化,相当于完成一次操作 + mOnCompleteListener.onComplete(); + } + }).start(); + } + } +} \ No newline at end of file diff --git a/gtask注释_刘定衢/remote/GTaskClient.java b/gtask注释_刘定衢/remote/GTaskClient.java new file mode 100644 index 0000000..f15dc85 --- /dev/null +++ b/gtask注释_刘定衢/remote/GTaskClient.java @@ -0,0 +1,612 @@ +package net.micode.notes.gtask.remote; + +/* + * 主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容 + * 主要使用类或技术:accountManager JSONObject HttpParams authToken Gid + */ +public class GTaskClient { + private static final String TAG = GTaskClient.class.getSimpleName(); + + private static final String GTASK_URL = "https://mail.google.com/tasks/"; //这个是指定的URL + + private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; + + private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; + + private static GTaskClient mInstance = null; + + private DefaultHttpClient mHttpClient; + + private String mGetUrl; + + private String mPostUrl; + + private long mClientVersion; + + private boolean mLoggedin; + + private long mLastLoginTime; + + private int mActionId; + + private Account mAccount; + + private JSONArray mUpdateArray; + + private GTaskClient() { + mHttpClient = null; + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + mClientVersion = -1; + mLoggedin = false; + mLastLoginTime = 0; + mActionId = 1; + mAccount = null; + mUpdateArray = null; + } + + /*用来获取的实例化对象 + * 使用 getInstance() + * 返回mInstance这个实例化对象 + */ + public static synchronized GTaskClient getInstance() { + if (mInstance == null) { + mInstance = new GTaskClient(); + } + return mInstance; + } + + /*用来实现登录操作的函数,传入的参数是一个Activity + * 设置登录操作限制时间,如果超时则需要重新登录 + * 有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录 + * 返回true或者false,即最后是否登陆成功 + */ + public boolean login(Activity activity) { + // we suppose that the cookie would expire after 5 minutes + // then we need to re-login + //判断距离最后一次登录操作是否超过5分钟 + final long interval = 1000 * 60 * 5; + if (mLastLoginTime + interval < System.currentTimeMillis()) { + mLoggedin = false; + } + + // need to re-login after account switch 重新登录操作 + if (mLoggedin + && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity + .getSyncAccountName(activity))) { + mLoggedin = false; + } + + //如果没超过时间,则不需要重新登录 + if (mLoggedin) { + Log.d(TAG, "already logged in"); + return true; + } + + mLastLoginTime = System.currentTimeMillis();//更新最后登录时间,改为系统当前的时间 + String authToken = loginGoogleAccount(activity, false);//判断是否登录到谷歌账户 + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + // login with custom domain if necessary + //尝试使用用户自己的域名登录 + if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() //将用户账号名改为统一格式(小写)后判断是否为一个谷歌账号地址 + .endsWith("googlemail.com"))) { + StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); + int index = mAccount.name.indexOf('@') + 1; + String suffix = mAccount.name.substring(index); + url.append(suffix + "/"); + mGetUrl = url.toString() + "ig"; //设置用户对应的getUrl + mPostUrl = url.toString() + "r/ig"; //设置用户对应的postUrl + + if (tryToLoginGtask(activity, authToken)) { + mLoggedin = true; + } + } + + // try to login with google official url + //如果用户账户无法登录,则使用谷歌官方的URI进行登录 + if (!mLoggedin) { + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + if (!tryToLoginGtask(activity, authToken)) { + return false; + } + } + + mLoggedin = true; + return true; + } + + /*具体实现登录谷歌账户的方法 + * 使用令牌机制 + * 使用AccountManager来管理注册账号 + * 返回值是账号的令牌 + */ + private String loginGoogleAccount(Activity activity, boolean invalidateToken) { + String authToken; //令牌,是登录操作保证安全性的一个方法 + AccountManager accountManager = AccountManager.get(activity);//AccountManager这个类给用户提供了集中注册账号的接口 + Account[] accounts = accountManager.getAccountsByType("com.google");//获取全部以com.google结尾的account + + if (accounts.length == 0) { + Log.e(TAG, "there is no available google account"); + return null; + } + + String accountName = NotesPreferenceActivity.getSyncAccountName(activity); + Account account = null; + //遍历获得的accounts信息,寻找已经记录过的账户信息 + for (Account a : accounts) { + if (a.name.equals(accountName)) { + account = a; + break; + } + } + if (account != null) { + mAccount = account; + } else { + Log.e(TAG, "unable to get an account with the same name in the settings"); + return null; + } + + // get the token now + //获取选中账号的令牌 + AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, + "goanna_mobile", null, activity, null, null); + try { + Bundle authTokenBundle = accountManagerFuture.getResult(); + authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); + //如果是invalidateToken,那么需要调用invalidateAuthToken(String, String)方法废除这个无效token + if (invalidateToken) { + accountManager.invalidateAuthToken("com.google", authToken); + loginGoogleAccount(activity, false); + } + } catch (Exception e) { + Log.e(TAG, "get auth token failed"); + authToken = null; + } + + return authToken; + } + + //尝试登陆Gtask,这只是一个预先判断令牌是否是有效以及是否能登上GTask的方法,而不是具体实现登陆的方法 + private boolean tryToLoginGtask(Activity activity, String authToken) { + if (!loginGtask(authToken)) { + // maybe the auth token is out of authTokedate, now let's invalidate the + // token and try again + //删除过一个无效的authToken,申请一个新的后再次尝试登陆 + authToken = loginGoogleAccount(activity, true); + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + if (!loginGtask(authToken)) { + Log.e(TAG, "login gtask failed"); + return false; + } + } + return true; + } + + //实现登录GTask的具体操作 + private boolean loginGtask(String authToken) { + int timeoutConnection = 10000; + int timeoutSocket = 15000; //socket是一种通信连接实现数据的交换的端口 + HttpParams httpParameters = new BasicHttpParams(); //实例化一个新的HTTP参数类 + HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//设置连接超时时间 + HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//设置设置端口超时时间 + mHttpClient = new DefaultHttpClient(httpParameters); + BasicCookieStore localBasicCookieStore = new BasicCookieStore(); //设置本地cookie + mHttpClient.setCookieStore(localBasicCookieStore); + HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); + + // login gtask + try { + String loginUrl = mGetUrl + "?auth=" + authToken; //设置登录的url + HttpGet httpGet = new HttpGet(loginUrl); //通过登录的uri实例化网页上资源的查找 + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the cookie now + //获取CookieStore里存放的cookie,看如果存有“GTL(不知道什么意思)”,则说明有验证成功的有效的cookie + List cookies = mHttpClient.getCookieStore().getCookies(); + boolean hasAuthCookie = false; + for (Cookie cookie : cookies) { + if (cookie.getName().contains("GTL")) { + hasAuthCookie = true; + } + } + if (!hasAuthCookie) { + Log.w(TAG, "it seems that there is no auth cookie"); + } + + // get the client version + //获取client的内容,具体操作是在返回的Content中截取从_setup(开始到)}中间的字符串内容,也就是gtask_url的内容 + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + mClientVersion = js.getLong("v"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } catch (Exception e) { + // simply catch all exceptions + Log.e(TAG, "httpget gtask_url failed"); + return false; + } + + return true; + } + + private int getActionId() { + return mActionId++; + } + + /*实例化创建一个用于向网络传输数据的对象 + * 使用HttpPost类 + * 返回一个httpPost实例化对象,但里面还没有内容 + */ + private HttpPost createHttpPost() { + HttpPost httpPost = new HttpPost(mPostUrl); + httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + httpPost.setHeader("AT", "1"); + return httpPost; + } + + /*通过URL获取响应后返回的数据,也就是网络上的数据和资源 + * 使用getContentEncoding()获取网络上的资源和数据 + * 返回值就是获取到的资源 + */ + private String getResponseContent(HttpEntity entity) throws IOException { + String contentEncoding = null; + if (entity.getContentEncoding() != null) {//通过URL得到HttpEntity对象,如果不为空则使用getContent()方法创建一个流将数据从网络都过来 + contentEncoding = entity.getContentEncoding().getValue(); + Log.d(TAG, "encoding: " + contentEncoding); + } + + InputStream input = entity.getContent(); + if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {//GZIP是使用DEFLATE进行压缩数据的另一个压缩库 + input = new GZIPInputStream(entity.getContent()); + } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {//DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩 + Inflater inflater = new Inflater(true); + input = new InflaterInputStream(entity.getContent(), inflater); + } + + try { + InputStreamReader isr = new InputStreamReader(input); + BufferedReader br = new BufferedReader(isr);//是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了时候,再读入内存,是为了提供读的效率而设计的 + StringBuilder sb = new StringBuilder(); + + while (true) { + String buff = br.readLine(); + if (buff == null) { + return sb.toString(); + } + sb = sb.append(buff); + } + } finally { + input.close(); + } + } + + /*通过JSON发送请求 + * 请求的具体内容在json的实例化对象js中然后传入 + * 利用UrlEncodedFormEntity entity和httpPost.setEntity(entity)方法把js中的内容放置到httpPost中 + * 执行请求后使用getResponseContent方法得到返回的数据和资源 + * 将资源再次放入json后返回 + */ + private JSONObject postRequest(JSONObject js) throws NetworkFailureException { + if (!mLoggedin) {//未登录 + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + //实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里 + HttpPost httpPost = createHttpPost(); + try { + LinkedList list = new LinkedList(); + list.add(new BasicNameValuePair("r", js.toString())); + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); //UrlEncodedFormEntity()的形式比较单一,是普通的键值对 + httpPost.setEntity(entity); + + // execute the post + //执行这个请求 + HttpResponse response = mHttpClient.execute(httpPost); + String jsString = getResponseContent(response.getEntity()); + return new JSONObject(jsString); + + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("unable to convert response content to jsonobject"); + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("error occurs when posting request"); + } + } + + /*创建单个任务 + * 传入参数是一个.gtask.data.Task包里Task类的对象 + * 利用json获取Task里的内容,并且创建相应的jsPost + * 利用postRequest得到任务的返回信息 + * 使用task.setGid设置task的new_ID + */ + public void createTask(Task task) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(task.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create task: handing jsonobject failed"); + } + } + + /* + * 创建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid + */ + public void createTaskList(TaskList tasklist) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(tasklist.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create tasklist: handing jsonobject failed"); + } + } + + /* + * 同步更新操作 + * 使用JSONObject进行数据存储,使用jsPost.put,Put的信息包括UpdateArray和ClientVersion + * 使用postRequest发送这个jspost,进行处理 + */ + public void commitUpdate() throws NetworkFailureException { + if (mUpdateArray != null) { + try { + JSONObject jsPost = new JSONObject(); + + // action_list + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("commit update: handing jsonobject failed"); + } + } + } + + /* + * 添加更新的事项 + * 调用commitUpdate()实现 + */ + public void addUpdateNode(Node node) throws NetworkFailureException { + if (node != null) { + // too many update items may result in an error + // set max to 10 items + if (mUpdateArray != null && mUpdateArray.length() > 10) { + commitUpdate(); + } + + if (mUpdateArray == null) + mUpdateArray = new JSONArray(); + mUpdateArray.put(node.getUpdateAction(getActionId())); + } + } + + /* + * 移动task,比如讲task移动到不同的task列表中去 + * 通过getGid获取task所属列表的gid + * 通过JSONObject.put(String name, Object value)函数设置移动后的task的相关属性值,从而达到移动的目的 + * 最后还是通过postRequest进行更新后的发送 + */ + public void moveTask(Task task, TaskList preParent, TaskList curParent) + throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); + if (preParent == curParent && task.getPriorSibling() != null) { + // put prioring_sibing_id only if moving within the tasklist and + // it is not the first one + //设置优先级ID,只有当移动是发生在文件中 + action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); + } + action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); //设置移动前所属列表 + action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); //设置当前所属列表 + if (preParent != curParent) { + // put the dest_list only if moving between tasklists + action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); + } + actionList.put(action); + //最后将ACTION_LIST加入到jsPost中 + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("move task: handing jsonobject failed"); + } + } + + /* + * 删除操作节点 + * 还是利用JSON + * 删除过后使用postRequest发送删除后的结果 + */ + public void deleteNode(Node node) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + node.setDeleted(true); + actionList.put(node.getUpdateAction(getActionId())); //这里会获取到删除操作的ID,加入到actionLiast中 + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("delete node: handing jsonobject failed"); + } + } + + /* + * 获取任务列表 + * 首先通过GetURI使用getResponseContent从网上获取数据 + * 然后筛选出"_setup("到)}的部分,并且从中获取GTASK_JSON_LISTS的内容返回 + */ + public JSONArray getTaskLists() throws NetworkFailureException { + if (!mLoggedin) { + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + try { + HttpGet httpGet = new HttpGet(mGetUrl); + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the task list + //筛选工作,把筛选出的字符串放入jsString + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + //获取GTASK_JSON_LISTS + return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task lists: handing jasonobject failed"); + } + } + + /* + * 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务 + */ + public JSONArray getTaskList(String listGid) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); //这里设置为传入的listGid + action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); + actionList.put(action); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + JSONObject jsResponse = postRequest(jsPost); + return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task list: handing jsonobject failed"); + } + } + + public Account getSyncAccount() { + return mAccount; + } + + //重置更新的内容 + public void resetUpdateArray() { + mUpdateArray = null; + } +} \ No newline at end of file diff --git a/gtask注释_刘定衢/remote/GTaskManager.java b/gtask注释_刘定衢/remote/GTaskManager.java new file mode 100644 index 0000000..a8c1f2a --- /dev/null +++ b/gtask注释_刘定衢/remote/GTaskManager.java @@ -0,0 +1,846 @@ +package net.micode.notes.gtask.remote; + +public class GTaskManager { + private static final String TAG = GTaskManager.class.getSimpleName(); + public static final int STATE_SUCCESS = 0; + public static final int STATE_NETWORK_ERROR = 1; + public static final int STATE_INTERNAL_ERROR = 2; + public static final int STATE_SYNC_IN_PROGRESS = 3; + public static final int STATE_SYNC_CANCELLED = 4; + private static GTaskManager mInstance = null; + + private Activity mActivity; + private Context mContext; + private ContentResolver mContentResolver; + private boolean mSyncing; + private boolean mCancelled; + private HashMap mGTaskListHashMap; + private HashMap mGTaskHashMap; + private HashMap mMetaHashMap; + private TaskList mMetaList; + private HashSet mLocalDeleteIdMap; + private HashMap mGidToNid; + private HashMap mNidToGid; + + private GTaskManager() { //对象初始化函数 + mSyncing = false; //正在同步,flase代表未执行 + mCancelled = false; //全局标识,flase代表可以执行 + mGTaskListHashMap = new HashMap(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。 + mGTaskHashMap = new HashMap(); + mMetaHashMap = new HashMap(); + mMetaList = null; + mLocalDeleteIdMap = new HashSet(); + mGidToNid = new HashMap(); //GoogleID to NodeID?? + mNidToGid = new HashMap(); //NodeID to GoogleID???通过hashmap散列表建立映射 + } + + /** + * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 + * 功能:类初始化函数 + * @author TTS + * @return GtaskManger + */ + public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized + if (mInstance == null) { + mInstance = new GTaskManager(); + } + return mInstance; + } + + /** + * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 + * @author TTS + * @param activity + */ + public synchronized void setActivityContext(Activity activity) { + // used for getting auth token + mActivity = activity; + } + + /** + * 核心函数 + * 功能:实现了本地同步操作和远端同步操作 + * @author TTS + * @param context-----获取上下文 + * @param asyncTask-------用于同步的异步操作类 + * @return int + */ + public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数 + if (mSyncing) { + Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug + return STATE_SYNC_IN_PROGRESS; + } + mContext = context; + mContentResolver = mContext.getContentResolver(); + mSyncing = true; + mCancelled = false; + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + + try { + GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机 + client.resetUpdateArray(); //JSONArray类型,reset即置为NULL + + // login google task + if (!mCancelled) { + if (!client.login(mActivity)) { + throw new NetworkFailureException("login google task failed"); + } + } + + // get the task list from google + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); + initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList + + // do content sync work + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); + syncContent(); + } catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常 + Log.e(TAG, e.toString()); //创建日志文件(调试信息),error + return STATE_NETWORK_ERROR; + } catch (ActionFailureException e) { //此类异常为操作异常 + Log.e(TAG, e.toString()); + return STATE_INTERNAL_ERROR; + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return STATE_INTERNAL_ERROR; + } finally { + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + mSyncing = false; + } + + return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; + } + + /** + *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。 + *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap + *@author TTS + *@exception NetworkFailureException + *@return void + */ + private void initGTaskList() throws NetworkFailureException { + if (mCancelled) + return; + GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机 + try { + //Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。 + //其格式为{"key1":value1,"key2",value2....};key 必须是字符串。 + //因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。 + JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list------lists??? + + // init meta list first + mMetaList = null; //TaskList类型 + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { + mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化 + mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname... + + // load meta data + JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list------list??? + for (int j = 0; j < jsMetas.length(); j++) { + object = (JSONObject) jsMetas.getJSONObject(j); + MetaData metaData = new MetaData(); //继承自Node + metaData.setContentByRemoteJSON(object); + if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList + mMetaList.addChildTask(metaData); + if (metaData.getGid() != null) { + mMetaHashMap.put(metaData.getRelatedGid(), metaData); + } + } + } + } + } + + // create meta list if not existed + if (mMetaList == null) { + mMetaList = new TaskList(); + mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META); + GTaskClient.getInstance().createTaskList(mMetaList); + } + + // init task list + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。 + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) + && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META)) { + TaskList tasklist = new TaskList(); //继承自Node + tasklist.setContentByRemoteJSON(object); + mGTaskListHashMap.put(gid, tasklist); + mGTaskHashMap.put(gid, tasklist); //为什么加两遍??? + + // load tasks + JSONArray jsTasks = client.getTaskList(gid); + for (int j = 0; j < jsTasks.length(); j++) { + object = (JSONObject) jsTasks.getJSONObject(j); + gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + Task task = new Task(); + task.setContentByRemoteJSON(object); + if (task.isWorthSaving()) { + task.setMetaInfo(mMetaHashMap.get(gid)); + tasklist.addChildTask(task); + mGTaskHashMap.put(gid, task); + } + } + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("initGTaskList: handing JSONObject failed"); + } + } + + /** + * 功能:本地内容同步操作 + * @throws NetworkFailureException + * @return 无返回值 + */ + private void syncContent() throws NetworkFailureException { //本地内容同步操作 + int syncType; + Cursor c = null; //数据库指针 + String gid; //GoogleID?? + Node node; //Node包含Sync_Action的不同类型 + + mLocalDeleteIdMap.clear(); //HashSet类型 + + if (mCancelled) { + return; + } + + // for local deleted note + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id=?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, null); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); + } + + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + } + } else { + Log.w(TAG, "failed to query trash folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // sync folder first + syncFolder(); + + // for note existing in database + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //通过hashmap建立联系 + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //通过hashmap建立联系 + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing note in database"); + } + + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // go through remaining items + Iterator> iter = mGTaskHashMap.entrySet().iterator(); //Iterator迭代器 + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + node = entry.getValue(); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + + // mCancelled can be set by another thread, so we neet to check one by //thread----线程 + // one + // clear local delete table + if (!mCancelled) { + if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { + throw new ActionFailureException("failed to batch-delete local deleted notes"); + } + } + + // refresh local sync id + if (!mCancelled) { + GTaskClient.getInstance().commitUpdate(); + refreshLocalSyncId(); + } + + } + + /** + * 功能: + * @author TTS + * @throws NetworkFailureException + */ + private void syncFolder() throws NetworkFailureException { + Cursor c = null; + String gid; + Node node; + int syncType; + + if (mCancelled) { + return; + } + + // for root folder + try { + c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, + Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); + if (c != null) { + c.moveToNext(); + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); + mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); + // for system folder, only update remote name if necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } else { + Log.w(TAG, "failed to query root folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for call-note folder + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(Notes.ID_CALL_RECORD_FOLDER) + }, null); + if (c != null) { + if (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); + mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); + // for system folder, only update remote name if + // necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } + } else { + Log.w(TAG, "failed to query call note folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for local existing folders + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for remote add folders + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + gid = entry.getKey(); + node = entry.getValue(); + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + } + + if (!mCancelled) + GTaskClient.getInstance().commitUpdate(); + } + + /** + * 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode + * @author TTS + * @param syncType + * @param node + * @param c + * @throws NetworkFailureException + */ + private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + MetaData meta; + switch (syncType) { + case Node.SYNC_ACTION_ADD_LOCAL: + addLocalNode(node); + break; + case Node.SYNC_ACTION_ADD_REMOTE: + addRemoteNode(node, c); + break; + case Node.SYNC_ACTION_DEL_LOCAL: + meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + break; + case Node.SYNC_ACTION_DEL_REMOTE: + meta = mMetaHashMap.get(node.getGid()); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + GTaskClient.getInstance().deleteNode(node); + break; + case Node.SYNC_ACTION_UPDATE_LOCAL: + updateLocalNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_REMOTE: + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_CONFLICT: + // merging both modifications maybe a good idea + // right now just use local update simply + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_NONE: + break; + case Node.SYNC_ACTION_ERROR: + default: + throw new ActionFailureException("unkown sync action type"); + } + } + + /** + * 功能:本地增加Node + * @author TTS + * @param node + * @throws NetworkFailureException + */ + private void addLocalNode(Node node) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + if (node instanceof TaskList) { + if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { + sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); + } else if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { + sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); + } else { + sqlNote = new SqlNote(mContext); + sqlNote.setContent(node.getLocalJSONFromContent()); + sqlNote.setParentId(Notes.ID_ROOT_FOLDER); + } + } else { + sqlNote = new SqlNote(mContext); + JSONObject js = node.getLocalJSONFromContent(); + try { + if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.has(NoteColumns.ID)) { + long id = note.getLong(NoteColumns.ID); + if (DataUtils.existInNoteDatabase(mContentResolver, id)) { + // the id is not available, have to create a new one + note.remove(NoteColumns.ID); + } + } + } + + if (js.has(GTaskStringUtils.META_HEAD_DATA)) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { + // the data id is not available, have to create + // a new one + data.remove(DataColumns.ID); + } + } + } + + } + } catch (JSONException e) { + Log.w(TAG, e.toString()); + e.printStackTrace(); + } + sqlNote.setContent(js); + + Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot add local node"); + } + sqlNote.setParentId(parentId.longValue()); + } + + // create the local node + sqlNote.setGtaskId(node.getGid()); + sqlNote.commit(false); + + // update gid-nid mapping + mGidToNid.put(node.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), node.getGid()); + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + } + + /** + * 功能:update本地node + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * ----Cursor + * @throws NetworkFailureException + */ + private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + // update the note locally + sqlNote = new SqlNote(mContext, c); + sqlNote.setContent(node.getLocalJSONFromContent()); + + Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) + : new Long(Notes.ID_ROOT_FOLDER); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot update local node"); + } + sqlNote.setParentId(parentId.longValue()); + sqlNote.commit(true); + + // update meta info + updateRemoteMeta(node.getGid(), sqlNote); + } + + /** + * 功能:远程增加Node + * 需要updateRemoteMeta + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * --Cursor + * @throws NetworkFailureException + */ + private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); //从本地mContext中获取内容 + Node n; + + // update remotely + if (sqlNote.isNoteType()) { + Task task = new Task(); + task.setContentByLocalJSON(sqlNote.getContent()); + + String parentGid = mNidToGid.get(sqlNote.getParentId()); + if (parentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); //调试信息 + throw new ActionFailureException("cannot add remote task"); + } + mGTaskListHashMap.get(parentGid).addChildTask(task); //在本地生成的GTaskList中增加子结点 + + //登录远程服务器,创建Task + GTaskClient.getInstance().createTask(task); + n = (Node) task; + + // add meta + updateRemoteMeta(task.getGid(), sqlNote); + } else { + TaskList tasklist = null; + + // we need to skip folder if it has already existed + String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; + if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) + folderName += GTaskStringUtils.FOLDER_DEFAULT; + else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) + folderName += GTaskStringUtils.FOLDER_CALL_NOTE; + else + folderName += sqlNote.getSnippet(); + + //iterator迭代器,通过统一的接口迭代所有的map元素 + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + String gid = entry.getKey(); + TaskList list = entry.getValue(); + + if (list.getName().equals(folderName)) { + tasklist = list; + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + } + break; + } + } + + // no match we can add now + if (tasklist == null) { + tasklist = new TaskList(); + tasklist.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().createTaskList(tasklist); + mGTaskListHashMap.put(tasklist.getGid(), tasklist); + } + n = (Node) tasklist; + } + + // update local note + sqlNote.setGtaskId(n.getGid()); + sqlNote.commit(false); + sqlNote.resetLocalModified(); + sqlNote.commit(true); + + // gid-id mapping //创建id间的映射 + mGidToNid.put(n.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), n.getGid()); + } + + /** + * 功能:更新远端的Node,包含meta更新(updateRemoteMeta) + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * --Cursor + * @throws NetworkFailureException + */ + private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + + // update remotely + node.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(node); //GTaskClient用途为从本地登陆远端服务器 + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + + // move task if necessary + if (sqlNote.isNoteType()) { + Task task = (Task) node; + TaskList preParentList = task.getParent(); + //preParentList为通过node获取的父节点列表 + + String curParentGid = mNidToGid.get(sqlNote.getParentId()); + //curParentGid为通过光标在数据库中找到sqlNote的mParentId,再通过mNidToGid由long类型转为String类型的Gid + + if (curParentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot update remote task"); + } + TaskList curParentList = mGTaskListHashMap.get(curParentGid); + //通过HashMap找到对应Gid的TaskList + + if (preParentList != curParentList) { //????????????? + preParentList.removeChildTask(task); + curParentList.addChildTask(task); + GTaskClient.getInstance().moveTask(task, preParentList, curParentList); + } + } + + // clear local modified flag + sqlNote.resetLocalModified(); + //commit到本地数据库 + sqlNote.commit(true); + } + + /** + * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。 + * @author TTS + * @param gid + * ---GoogleID为String类型 + * @param sqlNote + * ---同步前的数据库操作,故使用类SqlNote + * @throws NetworkFailureException + */ + private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { + if (sqlNote != null && sqlNote.isNoteType()) { + MetaData metaData = mMetaHashMap.get(gid); + if (metaData != null) { + metaData.setMeta(gid, sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(metaData); + } else { + metaData = new MetaData(); + metaData.setMeta(gid, sqlNote.getContent()); + mMetaList.addChildTask(metaData); + mMetaHashMap.put(gid, metaData); + GTaskClient.getInstance().createTask(metaData); + } + } + } + + /** + * 功能:刷新本地,给sync的ID对应上最后更改过的对象 + * @author TTS + * @return void + * @throws NetworkFailureException + */ + private void refreshLocalSyncId() throws NetworkFailureException { + if (mCancelled) { + return; + } + + // get the latest gtask list //获取最近的(最晚的)gtask list + mGTaskHashMap.clear(); + mGTaskListHashMap.clear(); + mMetaHashMap.clear(); + initGTaskList(); + + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); //query语句:五个参数,NoteColumns.TYPE + " DESC"-----为按类型递减顺序返回查询结果。new String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------为选择参数。"(type<>? AND parent_id<>?)"-------指明返回行过滤器。SqlNote.PROJECTION_NOTE--------应返回的数据列的名字。Notes.CONTENT_NOTE_URI--------contentProvider包含所有数据集所对应的uri + if (c != null) { + while (c.moveToNext()) { + String gid = c.getString(SqlNote.GTASK_ID_COLUMN); + Node node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + ContentValues values = new ContentValues(); //在ContentValues中创建键值对。准备通过contentResolver写入数据 + values.put(NoteColumns.SYNC_ID, node.getLastModified()); + mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //进行批量更改,选择参数为NULL,应该可以用insert替换,参数分别为表名和需要更新的value对象。 + c.getLong(SqlNote.ID_COLUMN)), values, null, null); + } else { + Log.e(TAG, "something is missed"); + throw new ActionFailureException( + "some local items don't have gid after sync"); + } + } + } else { + Log.w(TAG, "failed to query local note to refresh sync id"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + } + + /** + * 功能:获取同步账号,mAccount.name + * @author TTS + * @return String + */ + public String getSyncAccount() { + return GTaskClient.getInstance().getSyncAccount().name; + } + + /** + * 功能:取消同步,置mCancelled为true + * @author TTS + */ + public void cancelSync() { + mCancelled = true; + } +} \ No newline at end of file diff --git a/gtask注释_刘定衢/remote/GTaskSyncService.java b/gtask注释_刘定衢/remote/GTaskSyncService.java new file mode 100644 index 0000000..bf7fb43 --- /dev/null +++ b/gtask注释_刘定衢/remote/GTaskSyncService.java @@ -0,0 +1,124 @@ +package net.micode.notes.gtask.remote; + +/* + * Service是在一段不定的时间运行在后台,不和用户交互的应用组件 + * 主要方法: + * private void startSync() 启动一个同步工作 + * private void cancelSync() 取消同步 + * public void onCreate() + * public int onStartCommand(Intent intent, int flags, int startId) service生命周期的组成部分,相当于重启service(比如在被暂停之后),而不是创建一个新的service + * public void onLowMemory() 在没有内存的情况下如果存在service则结束掉这的service + * public IBinder onBind() + * public void sendBroadcast(String msg) 发送同步的相关通知 + * public static void startSync(Activity activity) + * public static void cancelSync(Context context) + * public static boolean isSyncing() 判读是否在进行同步 + * public static String getProgressString() 获取当前进度的信息 + */ + +public class GTaskSyncService extends Service { + public final static String ACTION_STRING_NAME = "sync_action_type"; + + public final static int ACTION_START_SYNC = 0; + + public final static int ACTION_CANCEL_SYNC = 1; + + public final static int ACTION_INVALID = 2; + + public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; + + public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; + + public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; + + private static GTaskASyncTask mSyncTask = null; + + private static String mSyncProgress = ""; + + //开始一个同步的工作 + private void startSync() { + if (mSyncTask == null) { + mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { + public void onComplete() { + mSyncTask = null; + sendBroadcast(""); + stopSelf(); + } + }); + sendBroadcast(""); + mSyncTask.execute(); //这个函数让任务是以单线程队列方式或线程池队列方式运行 + } + } + + + private void cancelSync() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + @Override + public void onCreate() { //初始化一个service + mSyncTask = null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Bundle bundle = intent.getExtras(); + if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { + switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { + //两种情况,开始同步或者取消同步 + case ACTION_START_SYNC: + startSync(); + break; + case ACTION_CANCEL_SYNC: + cancelSync(); + break; + default: + break; + } + return START_STICKY; //等待新的intent来是这个service继续运行 + } + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onLowMemory() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + public IBinder onBind(Intent intent) { //不知道干吗用的 + return null; + } + + public void sendBroadcast(String msg) { + mSyncProgress = msg; + Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); //创建一个新的Intent + intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); //附加INTENT中的相应参数的值 + intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); + sendBroadcast(intent); //发送这个通知 + } + + public static void startSync(Activity activity) {//执行一个service,service的内容里的同步动作就是开始同步 + GTaskManager.getInstance().setActivityContext(activity); + Intent intent = new Intent(activity, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); + activity.startService(intent); + } + + public static void cancelSync(Context context) {//执行一个service,service的内容里的同步动作就是取消同步 + Intent intent = new Intent(context, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); + context.startService(intent); + } + + public static boolean isSyncing() { + return mSyncTask != null; + } + + public static String getProgressString() { + return mSyncProgress; + } +} \ No newline at end of file -- 2.34.1 From 5b2b5179dcfaa679004a5b09f56cac72797a0bf5 Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Fri, 21 Apr 2023 13:41:33 +0800 Subject: [PATCH 11/20] 1 --- gtask注释/data/MetaData.java | 104 --- gtask注释/data/Node.java | 90 -- gtask注释/data/SqlData.java | 224 ----- gtask注释/data/SqlNote.java | 577 ------------ gtask注释/data/Task.java | 323 ------- gtask注释/data/TaskList.java | 370 -------- .../exception/ActionFailureException.java | 32 - .../exception/NetworkFailureException.java | 33 - gtask注释/remote/GTaskASyncTask.java | 102 --- gtask注释/remote/GTaskClient.java | 612 ------------- gtask注释/remote/GTaskManager.java | 846 ------------------ gtask注释/remote/GTaskSyncService.java | 124 --- 12 files changed, 3437 deletions(-) delete mode 100644 gtask注释/data/MetaData.java delete mode 100644 gtask注释/data/Node.java delete mode 100644 gtask注释/data/SqlData.java delete mode 100644 gtask注释/data/SqlNote.java delete mode 100644 gtask注释/data/Task.java delete mode 100644 gtask注释/data/TaskList.java delete mode 100644 gtask注释/exception/ActionFailureException.java delete mode 100644 gtask注释/exception/NetworkFailureException.java delete mode 100644 gtask注释/remote/GTaskASyncTask.java delete mode 100644 gtask注释/remote/GTaskClient.java delete mode 100644 gtask注释/remote/GTaskManager.java delete mode 100644 gtask注释/remote/GTaskSyncService.java diff --git a/gtask注释/data/MetaData.java b/gtask注释/data/MetaData.java deleted file mode 100644 index 0f33467..0000000 --- a/gtask注释/data/MetaData.java +++ /dev/null @@ -1,104 +0,0 @@ -package net.micode.notes.gtask.data; - -public class MetaData extends Task { - /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - */ - private final static String TAG = MetaData.class.getSimpleName(); - private String mRelatedGid = null; - /* - * 功能描述:设置数据,即生成元数据库 - * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 - * 参数注解: - */ - public void setMeta(String gid, JSONObject metaInfo) - { - //对函数块进行注释 - try { - metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); - /* - * 将这对键值放入metaInfo这个jsonobject对象中 - */ - } catch (JSONException e) { - Log.e(TAG, "failed to put related gid"); - /* - * 输出错误信息 - */ - } - setNotes(metaInfo.toString()); - setName(GTaskStringUtils.META_NOTE_NAME); - } - /* - * 功能描述:获取相关联的Gid - */ - public String getRelatedGid() { - return mRelatedGid; - } - /* - * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 - * Made By CuiCan - */ - @Override - public boolean isWorthSaving() { - return getNotes() != null; - } - /* - * 功能描述:使用远程json数据对象设置元数据内容 - * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 - * 参数注解: - */ - @Override - public void setContentByRemoteJSON(JSONObject js) { - super.setContentByRemoteJSON(js); - if (getNotes() != null) { - try { - JSONObject metaInfo = new JSONObject(getNotes().trim()); - mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); - } catch (JSONException e) { - Log.w(TAG, "failed to get related gid"); - /* - * 输出警告信息 - */ - mRelatedGid = null; - } - } - } - /* - * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - @Override - public void setContentByLocalJSON(JSONObject js) { - // this function should not be called - throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); - /* - * 传递非法参数异常 - */ - } - /* - * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - @Override - public JSONObject getLocalJSONFromContent() { - throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); - /* - * 传递非法参数异常 - * Made By Cui Can - */ - } - /* - * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ - @Override - public int getSyncAction(Cursor c) { - throw new IllegalAccessError("MetaData:getSyncAction should not be called"); - /* - * 传递非法参数异常 - * Made By Cui Can - */ - } - -} \ No newline at end of file diff --git a/gtask注释/data/Node.java b/gtask注释/data/Node.java deleted file mode 100644 index 47f7461..0000000 --- a/gtask注释/data/Node.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.micode.notes.gtask.data; - -import android.database.Cursor; - -import org.json.JSONObject; - -/** - * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 - * 关键字:abstract - */ -public abstract class Node { - //定义了各种用于表征同步状态的常量 - public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) - - public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 - - public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 - - public static final int SYNC_ACTION_DEL_REMOTE = 3;// 需要在远程云端删除内容 - - public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 - - public static final int SYNC_ACTION_UPDATE_REMOTE = 5;// 需要将本地内容更新到远程云端 - - public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 - - public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 - - public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 - - private String mGid; - - private String mName; - - private long mLastModified;//记录最后一次修改时间 - - private boolean mDeleted;//表征是否被删除 - - public Node() { - mGid = null; - mName = ""; - mLastModified = 0; - mDeleted = false; - } - - public abstract JSONObject getCreateAction(int actionId); - - public abstract JSONObject getUpdateAction(int actionId); - - public abstract void setContentByRemoteJSON(JSONObject js); - - public abstract void setContentByLocalJSON(JSONObject js); - - public abstract JSONObject getLocalJSONFromContent(); - - public abstract int getSyncAction(Cursor c); - - public void setGid(String gid) { - this.mGid = gid; - } - - public void setName(String name) { - this.mName = name; - } - - public void setLastModified(long lastModified) { - this.mLastModified = lastModified; - } - - public void setDeleted(boolean deleted) { - this.mDeleted = deleted; - } - - public String getGid() { - return this.mGid; - } - - public String getName() { - return this.mName; - } - - public long getLastModified() { - return this.mLastModified; - } - - public boolean getDeleted() { - return this.mDeleted; - } - -} \ No newline at end of file diff --git a/gtask注释/data/SqlData.java b/gtask注释/data/SqlData.java deleted file mode 100644 index f47546a..0000000 --- a/gtask注释/data/SqlData.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 - * SqlData其实就是也就是所谓数据中的数据 - */ - -package net.micode.notes.gtask.data; -/* - * 功能描述: - * 实现过程: - * 参数注解: - * Made By CuiCan - */ - -public class SqlData { - /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - * Made By CuiCan - */ - private static final String TAG = SqlData.class.getSimpleName(); - - private static final int INVALID_ID = -99999;//为mDataId置初始值-99999 - - - /** - * 来自Notes类中定义的DataColumn中的一些常量 - */ - - // 集合了interface DataColumns中所有SF常量 - public static final String[] PROJECTION_DATA = new String[] { - DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, - DataColumns.DATA3 - }; - - /** - * 以下五个变量作为sql表中5列的编号 - */ - public static final int DATA_ID_COLUMN = 0; - - public static final int DATA_MIME_TYPE_COLUMN = 1; - - public static final int DATA_CONTENT_COLUMN = 2; - - public static final int DATA_CONTENT_DATA_1_COLUMN = 3; - - public static final int DATA_CONTENT_DATA_3_COLUMN = 4; - - private ContentResolver mContentResolver; - //判断是否直接用Content生成,是为true,否则为false - private boolean mIsCreate; - - private long mDataId; - - private String mDataMimeType; - - private String mDataContent; - - private long mDataContentData1; - - private String mDataContentData3; - - private ContentValues mDiffDataValues; - - /* - * 功能描述:构造函数,用于初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: - * Made By CuiCan - */ - public SqlData(Context context) { - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mDataId = INVALID_ID;//mDataId置初始值-99999 - mDataMimeType = DataConstants.NOTE; - mDataContent = ""; - mDataContentData1 = 0; - mDataContentData3 = ""; - mDiffDataValues = new ContentValues(); - } - - - /* - * 功能描述:构造函数,初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: - * Made By CuiCan - */ - public SqlData(Context context, Cursor c) { - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDiffDataValues = new ContentValues(); - } - - /* - * 功能描述:从光标处加载数据 - * 从当前的光标处将五列的数据加载到该类的对象 - * Made By CuiCan - */ - private void loadFromCursor(Cursor c) { - mDataId = c.getLong(DATA_ID_COLUMN); - mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); - mDataContent = c.getString(DATA_CONTENT_COLUMN); - mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); - mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); - } - - - /* - * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 - * 参数注解: - * Made By CuiCan - */ - public void setContent(JSONObject js) throws JSONException { - //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; - if (mIsCreate || mDataId != dataId) { - mDiffDataValues.put(DataColumns.ID, dataId); - } - mDataId = dataId; - - String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) - : DataConstants.NOTE; - if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { - mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); - } - mDataMimeType = dataMimeType; - - String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; - if (mIsCreate || !mDataContent.equals(dataContent)) { - mDiffDataValues.put(DataColumns.CONTENT, dataContent); - } - mDataContent = dataContent; - - long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; - if (mIsCreate || mDataContentData1 != dataContentData1) { - mDiffDataValues.put(DataColumns.DATA1, dataContentData1); - } - mDataContentData1 = dataContentData1; - - String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; - if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { - mDiffDataValues.put(DataColumns.DATA3, dataContentData3); - } - mDataContentData3 = dataContentData3; - } - - - /* - * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 - * 参数注解: - * Made By CuiCan - */ - public JSONObject getContent() throws JSONException { - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - //创建JSONObject对象。并将相关数据放入其中,并返回。 - JSONObject js = new JSONObject(); - js.put(DataColumns.ID, mDataId); - js.put(DataColumns.MIME_TYPE, mDataMimeType); - js.put(DataColumns.CONTENT, mDataContent); - js.put(DataColumns.DATA1, mDataContentData1); - js.put(DataColumns.DATA3, mDataContentData3); - return js; - } - - /* - * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 - * 参数注解: - * Made By CuiCan - */ - public void commit(long noteId, boolean validateVersion, long version) { - - if (mIsCreate) { - if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { - mDiffDataValues.remove(DataColumns.ID); - } - - mDiffDataValues.put(DataColumns.NOTE_ID, noteId); - Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); - try { - mDataId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - } else { - if (mDiffDataValues.size() > 0) { - int result = 0; - if (!validateVersion) { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); - } else { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, - " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { - String.valueOf(noteId), String.valueOf(version) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - } - - mDiffDataValues.clear(); - mIsCreate = false; - } - - /* - * 功能描述:获取当前id - * 实现过程: - * 参数注解: - * Made By CuiCan - */ - public long getId() { - return mDataId; - } -} \ No newline at end of file diff --git a/gtask注释/data/SqlNote.java b/gtask注释/data/SqlNote.java deleted file mode 100644 index c669db2..0000000 --- a/gtask注释/data/SqlNote.java +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Description:用于支持小米便签最底层的数据库相关操作,和sqldata的关系上是父集关系,即note是data的子父集。 - * 和SqlData相比,SqlNote算是真正意义上的数据了。 - */ - -package net.micode.notes.gtask.data; -/* - * 功能描述: - * 实现过程: - * 参数注解: - * Made By CuiCan - */ - -public class SqlNote { - /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - * Made By CuiCan - */ - private static final String TAG = SqlNote.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - // 集合了interface NoteColumns中所有SF常量(17个) - public static final String[] PROJECTION_NOTE = new String[] { - NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, - NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, - NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, - NoteColumns.VERSION - }; - - //以下设置17个列的编号 - public static final int ID_COLUMN = 0; - - public static final int ALERTED_DATE_COLUMN = 1; - - public static final int BG_COLOR_ID_COLUMN = 2; - - public static final int CREATED_DATE_COLUMN = 3; - - public static final int HAS_ATTACHMENT_COLUMN = 4; - - public static final int MODIFIED_DATE_COLUMN = 5; - - public static final int NOTES_COUNT_COLUMN = 6; - - public static final int PARENT_ID_COLUMN = 7; - - public static final int SNIPPET_COLUMN = 8; - - public static final int TYPE_COLUMN = 9; - - public static final int WIDGET_ID_COLUMN = 10; - - public static final int WIDGET_TYPE_COLUMN = 11; - - public static final int SYNC_ID_COLUMN = 12; - - public static final int LOCAL_MODIFIED_COLUMN = 13; - - public static final int ORIGIN_PARENT_ID_COLUMN = 14; - - public static final int GTASK_ID_COLUMN = 15; - - public static final int VERSION_COLUMN = 16; - - //一下定义了17个内部的变量,其中12个可以由content中获得,5个需要初始化为0或者new - private Context mContext; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mId; - - private long mAlertDate; - - private int mBgColorId; - - private long mCreatedDate; - - private int mHasAttachment; - - private long mModifiedDate; - - private long mParentId; - - private String mSnippet; - - private int mType; - - private int mWidgetId; - - private int mWidgetType; - - private long mOriginParent; - - private long mVersion; - - private ContentValues mDiffNoteValues; - - private ArrayList mDataList; - - /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: - * Made By CuiCan - */ - //构造函数只有context,对所有的变量进行初始化 - public SqlNote(Context context) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mId = INVALID_ID; - mAlertDate = 0; - mBgColorId = ResourceParser.getDefaultBgId(context); - mCreatedDate = System.currentTimeMillis();//调用系统函数获得创建时间 - mHasAttachment = 0; - mModifiedDate = System.currentTimeMillis();//最后一次修改时间初始化为创建时间 - mParentId = 0; - mSnippet = ""; - mType = Notes.TYPE_NOTE; - mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - mOriginParent = 0; - mVersion = 0; - mDiffNoteValues = new ContentValues(); - mDataList = new ArrayList(); - } - - - /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: - * Made By CuiCan - */ - //构造函数有context和一个数据库的cursor,多数变量通过cursor指向的一条记录直接进行初始化 - public SqlNote(Context context, Cursor c) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDataList = new ArrayList(); - // - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - } - - - /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: - * Made By CuiCan - */ - public SqlNote(Context context, long id) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(id); - mDataList = new ArrayList(); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - - } - - /* - * 功能描述:通过id从光标处加载数据 - * Made By CuiCan - */ - private void loadFromCursor(long id) { - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(id) - }, null);//通过id获得对应的ContentResolver中的cursor - if (c != null) { - c.moveToNext(); - loadFromCursor(c);//然后加载数据进行初始化,这样函数 - //SqlNote(Context context, long id)与SqlNote(Context context, long id)的实现方式基本相同 - } else { - Log.w(TAG, "loadFromCursor: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - /* - * 功能描述:通过游标从光标处加载数据 - * Made By CuiCan - */ - private void loadFromCursor(Cursor c) { - //直接从一条记录中的获得以下变量的初始值 - mId = c.getLong(ID_COLUMN); - mAlertDate = c.getLong(ALERTED_DATE_COLUMN); - mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); - mCreatedDate = c.getLong(CREATED_DATE_COLUMN); - mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); - mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); - mParentId = c.getLong(PARENT_ID_COLUMN); - mSnippet = c.getString(SNIPPET_COLUMN); - mType = c.getInt(TYPE_COLUMN); - mWidgetId = c.getInt(WIDGET_ID_COLUMN); - mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); - mVersion = c.getLong(VERSION_COLUMN); - } - - /* - * 功能描述:通过content机制获取共享数据并加载到数据库当前游标处 - * 参数注解: - * Made By CuiCan - */ - private void loadDataContent() { - Cursor c = null; - mDataList.clear(); - try { - c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, - "(note_id=?)", new String[] { - String.valueOf(mId) - }, null); - if (c != null) { - if (c.getCount() == 0) { - Log.w(TAG, "it seems that the note has not data"); - return; - } - while (c.moveToNext()) { - SqlData data = new SqlData(mContext, c); - mDataList.add(data); - } - } else { - Log.w(TAG, "loadDataContent: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - /* - * 功能描述:设置通过content机制用于共享的数据信息 - * 参数注解: - * Made By CuiCan - */ - public boolean setContent(JSONObject js) { - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - Log.w(TAG, "cannot set system folder"); - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - // for folder we can only update the snnipet and type - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; - if (mIsCreate || mId != id) { - mDiffNoteValues.put(NoteColumns.ID, id); - } - mId = id; - - long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note - .getLong(NoteColumns.ALERTED_DATE) : 0; - if (mIsCreate || mAlertDate != alertDate) { - mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); - } - mAlertDate = alertDate; - - int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note - .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); - if (mIsCreate || mBgColorId != bgColorId) { - mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); - } - mBgColorId = bgColorId; - long createDate = note.has(NoteColumns.CREATED_DATE) ? note - .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mCreatedDate != createDate) { - mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); - } - mCreatedDate = createDate; - - int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note - .getInt(NoteColumns.HAS_ATTACHMENT) : 0; - if (mIsCreate || mHasAttachment != hasAttachment) { - mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); - } - mHasAttachment = hasAttachment; - - long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note - .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mModifiedDate != modifiedDate) { - mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); - } - mModifiedDate = modifiedDate; - - long parentId = note.has(NoteColumns.PARENT_ID) ? note - .getLong(NoteColumns.PARENT_ID) : 0; - if (mIsCreate || mParentId != parentId) { - mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); - } - mParentId = parentId; - - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - - int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) - : AppWidgetManager.INVALID_APPWIDGET_ID; - if (mIsCreate || mWidgetId != widgetId) { - mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); - } - mWidgetId = widgetId; - - int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note - .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; - if (mIsCreate || mWidgetType != widgetType) { - mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); - } - mWidgetType = widgetType; - - long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note - .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; - if (mIsCreate || mOriginParent != originParent) { - mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); - } - mOriginParent = originParent; - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - SqlData sqlData = null; - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - for (SqlData temp : mDataList) { - if (dataId == temp.getId()) { - sqlData = temp; - } - } - } - - if (sqlData == null) { - sqlData = new SqlData(mContext); - mDataList.add(sqlData); - } - - sqlData.setContent(data); - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } - return true; - } - - /* - * 功能描述:获取content机制提供的数据并加载到note中 - * 参数注解: - * Made By CuiCan - */ - public JSONObject getContent() { - try { - JSONObject js = new JSONObject(); - - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - - JSONObject note = new JSONObject(); - if (mType == Notes.TYPE_NOTE) {//类型为note时 - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.ALERTED_DATE, mAlertDate); - note.put(NoteColumns.BG_COLOR_ID, mBgColorId); - note.put(NoteColumns.CREATED_DATE, mCreatedDate); - note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); - note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); - note.put(NoteColumns.PARENT_ID, mParentId); - note.put(NoteColumns.SNIPPET, mSnippet); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.WIDGET_ID, mWidgetId); - note.put(NoteColumns.WIDGET_TYPE, mWidgetType); - note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - - JSONArray dataArray = new JSONArray(); - for (SqlData sqlData : mDataList) { - JSONObject data = sqlData.getContent(); - if (data != null) { - dataArray.put(data); - } - } - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {//类型为文件夹或者 - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.SNIPPET, mSnippet); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - } - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - return null; - } - - /* - * 功能描述:给当前id设置父id - * 参数注解: - * Made By CuiCan - */ - public void setParentId(long id) { - mParentId = id; - mDiffNoteValues.put(NoteColumns.PARENT_ID, id); - } - - /* - * 功能描述:给当前id设置Gtaskid - * 参数注解: - * Made By CuiCan - */ - public void setGtaskId(String gid) { - mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); - } - - /* - * 功能描述:给当前id设置同步id - * 参数注解: - * Made By CuiCan - */ - public void setSyncId(long syncId) { - mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); - } - - /* - * 功能描述:初始化本地修改,即撤销所有当前修改 - * 参数注解: - * Made By CuiCan - */ - public void resetLocalModified() { - mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); - } - - /* - * 功能描述:获得当前id - * 参数注解: - * Made By CuiCan - */ - public long getId() { - return mId; - } - - /* - * 功能描述:获得当前id的父id - * 参数注解: - * Made By CuiCan - */ - public long getParentId() { - return mParentId; - } - - /* - * 功能描述:获取小片段即用于显示的部分便签内容 - * 参数注解: - * Made By CuiCan - */ - public String getSnippet() { - return mSnippet; - } - - /* - * 功能描述:判断是否为便签类型 - * 参数注解: - * Made By CuiCan - */ - public boolean isNoteType() { - return mType == Notes.TYPE_NOTE; - } - - /* - * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 - * 参数注解: - * Made By CuiCan - */ - public void commit(boolean validateVersion) { - if (mIsCreate) { - if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { - mDiffNoteValues.remove(NoteColumns.ID); - } - - Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); - try { - mId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - if (mId == 0) { - throw new IllegalStateException("Create thread id failed"); - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) {//直接使用sqldata中的实现 - sqlData.commit(mId, false, -1); - } - } - } else { - if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { - Log.e(TAG, "No such note"); - throw new IllegalStateException("Try to update note with invalid id"); - } - if (mDiffNoteValues.size() > 0) { - mVersion ++; - int result = 0; - if (!validateVersion) {//构造字符串 - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?)", new String[] { - String.valueOf(mId) - }); - } else { - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", - new String[] { - String.valueOf(mId), String.valueOf(mVersion) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) { - sqlData.commit(mId, validateVersion, mVersion); - } - } - } - - // refresh local info - loadFromCursor(mId); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - - mDiffNoteValues.clear(); - mIsCreate = false; - } -} \ No newline at end of file diff --git a/gtask注释/data/Task.java b/gtask注释/data/Task.java deleted file mode 100644 index 3c890b3..0000000 --- a/gtask注释/data/Task.java +++ /dev/null @@ -1,323 +0,0 @@ -package net.micode.notes.gtask.data; - -public class Task extends Node { - private static final String TAG = Task.class.getSimpleName(); - - private boolean mCompleted;//是否完成 - - private String mNotes; - - private JSONObject mMetaInfo;//将在实例中存储数据的类型 - - private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善) - - private TaskList mParent;//所在的任务列表的指针 - - public Task() { - super(); - mCompleted = false; - mNotes = null; - mPriorSibling = null;//TaskList中当前Task前面的Task的指针 - mParent = null;//当前Task所在的TaskList - mMetaInfo = null; - } - - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_TASK); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - // parent_id - if (mParent!= null) { - js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); - } - - // dest_parent_type - js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - - // list_id - if (mParent!= null) { - js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); - } - - // prior_sibling_id - if (mPriorSibling != null) { - js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-create jsonobject"); - } - - return js; - } - - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - // notes - if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { - setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); - } - - // deleted - if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { - setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); - } - - // completed - if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { - setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get task content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { //��metadata����ʵʩ - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) - || !js.has(GTaskStringUtils.META_HEAD_DATA)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { - Log.e(TAG, "invalid type"); - return; - } - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - setName(data.getString(DataColumns.CONTENT)); - break; - } - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - String name = getName(); - try { - if (mMetaInfo == null) { - // new task created from web - if (name == null) { - Log.w(TAG, "the note seems to be an empty one"); - return null; - } - - JSONObject js = new JSONObject(); - JSONObject note = new JSONObject(); - JSONArray dataArray = new JSONArray(); - JSONObject data = new JSONObject(); - data.put(DataColumns.CONTENT, name); - dataArray.put(data); - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - return js; - } else { - // synced task - JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - data.put(DataColumns.CONTENT, getName()); - break; - } - } - - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - return mMetaInfo; - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public void setMetaInfo(MetaData metaData) { - if (metaData != null && metaData.getNotes() != null) { - try { - mMetaInfo = new JSONObject(metaData.getNotes()); - } catch (JSONException e) { - Log.w(TAG, e.toString()); - mMetaInfo = null; - } - } - } - - public int getSyncAction(Cursor c) { - try { - JSONObject noteInfo = null; - if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { - noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - } - - if (noteInfo == null) { - Log.w(TAG, "it seems that note meta has been deleted"); - return SYNC_ACTION_UPDATE_REMOTE; - } - - if (!noteInfo.has(NoteColumns.ID)) { - Log.w(TAG, "remote note id seems to be deleted"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - // validate the note id now - if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { - Log.w(TAG, "note id doesn't match"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - return SYNC_ACTION_UPDATE_CONFLICT; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - public boolean isWorthSaving() { - return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) - || (getNotes() != null && getNotes().trim().length() > 0); - } - - public void setCompleted(boolean completed) { - this.mCompleted = completed; - } - - public void setNotes(String notes) { - this.mNotes = notes; - } - - public void setPriorSibling(Task priorSibling) { - this.mPriorSibling = priorSibling; - } - - public void setParent(TaskList parent) { - this.mParent = parent; - } - - public boolean getCompleted() { - return this.mCompleted; - } - - public String getNotes() { - return this.mNotes; - } - - public Task getPriorSibling() { - return this.mPriorSibling; - } - - public TaskList getParent() { - return this.mParent; - } - -} \ No newline at end of file diff --git a/gtask注释/data/TaskList.java b/gtask注释/data/TaskList.java deleted file mode 100644 index 4922bb4..0000000 --- a/gtask注释/data/TaskList.java +++ /dev/null @@ -1,370 +0,0 @@ -package net.micode.notes.gtask.data; - -public class TaskList extends Node { - private static final String TAG = TaskList.class.getSimpleName();//tag标记 - - private int mIndex;//当前TaskList的指针 - - private ArrayList mChildren;//类中主要的保存数据的单元,用来实现一个以Task为元素的ArrayList - - public TaskList() { - super(); - mChildren = new ArrayList(); - mIndex = 1; - } - - /* (non-Javadoc) - * @see net.micode.notes.gtask.data.Node#getCreateAction(int) - * 生成并返回一个包含了一定数据的JSONObject实体 - */ - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); - - // entity_delta - JSONObject entity = new JSONObject();//entity实体 - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-create jsonobject"); - } - - return js; - } - - /* (non-Javadoc) - * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) - * 生成并返回一个包含了一定数据的JSONObject实体 - */ - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get tasklist content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - - if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - String name = folder.getString(NoteColumns.SNIPPET); - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); - } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); - else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE); - else - Log.e(TAG, "invalid system folder"); - } else { - Log.e(TAG, "error type"); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - try { - JSONObject js = new JSONObject(); - JSONObject folder = new JSONObject(); - - String folderName = getName(); - if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) - folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), - folderName.length()); - folder.put(NoteColumns.SNIPPET, folderName); - if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) - || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) - folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - else - folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - - js.put(GTaskStringUtils.META_HEAD_NOTE, folder); - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public int getSyncAction(Cursor c) { - try { - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - // for folder conflicts, just apply local modification - return SYNC_ACTION_UPDATE_REMOTE; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - /** - * @return - * 功能:获得TaskList的大小,即mChildren的大小 - */ - public int getChildTaskCount() { - return mChildren.size(); - } - - /** - * @param task - * @return 返回值为是否成功添加任务。 - * 功能:在当前任务表末尾添加新的任务。 - */ - public boolean addChildTask(Task task) { - boolean ret = false; - if (task != null && !mChildren.contains(task)) { - ret = mChildren.add(task); - if (ret) { - // need to set prior sibling and parent - task.setPriorSibling(mChildren.isEmpty() ? null : mChildren - .get(mChildren.size() - 1)); - task.setParent(this); - //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改 - //,接下来几个函数都有相关操作 - } - } - return ret; - } - - /** - * @param task - * @param index - * @return - * 功能:在当前任务表的指定位置添加新的任务。 - */ - public boolean addChildTask(Task task, int index) { - if (index < 0 || index > mChildren.size()) { - Log.e(TAG, "add child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (task != null && pos == -1) { - mChildren.add(index, task); - - // update the task list - Task preTask = null; - Task afterTask = null; - if (index != 0) - preTask = mChildren.get(index - 1); - if (index != mChildren.size() - 1) - afterTask = mChildren.get(index + 1); - - task.setPriorSibling(preTask); - if (afterTask != null) - afterTask.setPriorSibling(task); - } - - return true; - } - - /** - * @param task - * @return 返回删除是否成功 - * 功能:删除TaskList中的一个Task - */ - public boolean removeChildTask(Task task) { - boolean ret = false; - int index = mChildren.indexOf(task); - if (index != -1) { - ret = mChildren.remove(task); - - if (ret) { - // reset prior sibling and parent - task.setPriorSibling(null); - task.setParent(null); - - // update the task list - if (index != mChildren.size()) { - mChildren.get(index).setPriorSibling( - index == 0 ? null : mChildren.get(index - 1)); - } - } - } - return ret; - } - - /** - * @param task - * @param index - * @return - * 功能:将当前TaskList中含有的某个Task移到index位置 - */ - public boolean moveChildTask(Task task, int index) { - - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "move child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (pos == -1) { - Log.e(TAG, "move child task: the task should in the list"); - return false; - } - - if (pos == index) - return true; - return (removeChildTask(task) && addChildTask(task, index)); - //利用已实现好的功能完成当下功能; - } - - /** - * @param gid - * @return返回寻找结果 - * 功能:按gid寻找Task - */ - public Task findChildTaskByGid(String gid) { - for (int i = 0; i < mChildren.size(); i++) { - Task t = mChildren.get(i); - if (t.getGid().equals(gid)) { - return t; - } - } - return null; - } - - /** - * @param task - * @return - * 功能:返回指定Task的index - */ - public int getChildTaskIndex(Task task) { - return mChildren.indexOf(task); - } - - /** - * @param index - * @return - * 功能:返回指定index的Task - */ - public Task getChildTaskByIndex(int index) { - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "getTaskByIndex: invalid index"); - return null; - } - return mChildren.get(index); - } - - /** - * @param gid - * @return - * 功能:返回指定gid的Task - */ - public Task getChilTaskByGid(String gid) { - for (Task task : mChildren) {//一种常见的ArrayList的遍历方法(四种,见精读笔记) - if (task.getGid().equals(gid)) - return task; - } - return null; - } - - public ArrayList getChildTaskList() { - return this.mChildren; - } - - public void setIndex(int index) { - this.mIndex = index; - } - - public int getIndex() { - return this.mIndex; - } -} \ No newline at end of file diff --git a/gtask注释/exception/ActionFailureException.java b/gtask注释/exception/ActionFailureException.java deleted file mode 100644 index f455c7a..0000000 --- a/gtask注释/exception/ActionFailureException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Description:支持小米便签运行过程中的运行异常处理。 - */ - -package net.micode.notes.gtask.exception; - -public class ActionFailureException extends RuntimeException { - private static final long serialVersionUID = 4425249765923293627L; - /* - * serialVersionUID相当于java类的身份证。主要用于版本控制。 - * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 - * Made By Cuican - */ - - public ActionFailureException() { - super(); - } - /* - * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. - * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 - * 怎么去引用里面的父类对象呢?使用super来引用 - * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) - * Made By Cuican - */ - public ActionFailureException(String paramString) { - super(paramString); - } - - public ActionFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} \ No newline at end of file diff --git a/gtask注释/exception/NetworkFailureException.java b/gtask注释/exception/NetworkFailureException.java deleted file mode 100644 index 63a1adb..0000000 --- a/gtask注释/exception/NetworkFailureException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Description:支持小米便签运行过程中的网络异常处理。 - */ - -package net.micode.notes.gtask.exception; - -public class NetworkFailureException extends Exception { - private static final long serialVersionUID = 2107610287180234136L; - /* - * serialVersionUID相当于java类的身份证。主要用于版本控制。 - * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 - * Made By Cuican - */ - - public NetworkFailureException() { - super(); - } - - /* - * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. - * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 - * 怎么去引用里面的父类对象呢?使用super来引用 - * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) - * Made By Cuican - */ - public NetworkFailureException(String paramString) { - super(paramString); - } - - public NetworkFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} \ No newline at end of file diff --git a/gtask注释/remote/GTaskASyncTask.java b/gtask注释/remote/GTaskASyncTask.java deleted file mode 100644 index 364a604..0000000 --- a/gtask注释/remote/GTaskASyncTask.java +++ /dev/null @@ -1,102 +0,0 @@ -package net.micode.notes.gtask.remote; - -/*异步操作类,实现GTask的异步操作过程 - * 主要方法: - * private void showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法 - * protected Integer doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间 - * protected void onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 - * protected void onPostExecute(Integer result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI - */ -public class GTaskASyncTask extends AsyncTask { - - - private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; - - public interface OnCompleteListener { - void onComplete(); - } - - private Context mContext; - - private NotificationManager mNotifiManager; - - private GTaskManager mTaskManager; - - private OnCompleteListener mOnCompleteListener; - - public GTaskASyncTask(Context context, OnCompleteListener listener) { - mContext = context; - mOnCompleteListener = listener; - mNotifiManager = (NotificationManager) mContext - .getSystemService(Context.NOTIFICATION_SERVICE); - mTaskManager = GTaskManager.getInstance(); - } - - public void cancelSync() { - mTaskManager.cancelSync(); - } - - public void publishProgess(String message) { // 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 - publishProgress(new String[] { - message - }); - } - - private void showNotification(int tickerId, String content) { - Notification notification = new Notification(R.drawable.notification, mContext - .getString(tickerId), System.currentTimeMillis()); - notification.defaults = Notification.DEFAULT_LIGHTS; // 调用系统自带灯光 - notification.flags = Notification.FLAG_AUTO_CANCEL; // 点击清除按钮或点击通知后会自动消失 - PendingIntent pendingIntent; //一个描述了想要启动一个Activity、Broadcast或是Service的意图 - if (tickerId != R.string.ticker_success) { - pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesPreferenceActivity.class), 0); //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象 - - } else { - pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesListActivity.class), 0); //如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象 - } - notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, - pendingIntent); - mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//通过NotificationManager对象的notify()方法来执行一个notification的消息 - } - - @Override - protected Integer doInBackground(Void... unused) { - publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity - .getSyncAccountName(mContext))); //利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext))的字符串内容传进sync_progress_login中 - return mTaskManager.sync(mContext, this); //进行后台同步具体操作 - } - - @Override - protected void onProgressUpdate(String... progress) { - showNotification(R.string.ticker_syncing, progress[0]); - if (mContext instanceof GTaskSyncService) { //instanceof 判断mContext是否是GTaskSyncService的实例 - ((GTaskSyncService) mContext).sendBroadcast(progress[0]); - } - } - - @Override - protected void onPostExecute(Integer result) { //用于在执行完后台任务后更新UI,显示结果 - if (result == GTaskManager.STATE_SUCCESS) { - showNotification(R.string.ticker_success, mContext.getString( - R.string.success_sync_account, mTaskManager.getSyncAccount())); - NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); //设置最新同步的时间 - } else if (result == GTaskManager.STATE_NETWORK_ERROR) { - showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); - } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { - showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); - } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { - showNotification(R.string.ticker_cancel, mContext - .getString(R.string.error_sync_cancelled)); - } //几种不同情况下的结果显示 - if (mOnCompleteListener != null) { - new Thread(new Runnable() { //这里好像是方法内的一个线程,但是并不太懂什么意思 - - public void run() { //完成后的操作,使用onComplete()将所有值都重新初始化,相当于完成一次操作 - mOnCompleteListener.onComplete(); - } - }).start(); - } - } -} \ No newline at end of file diff --git a/gtask注释/remote/GTaskClient.java b/gtask注释/remote/GTaskClient.java deleted file mode 100644 index f15dc85..0000000 --- a/gtask注释/remote/GTaskClient.java +++ /dev/null @@ -1,612 +0,0 @@ -package net.micode.notes.gtask.remote; - -/* - * 主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容 - * 主要使用类或技术:accountManager JSONObject HttpParams authToken Gid - */ -public class GTaskClient { - private static final String TAG = GTaskClient.class.getSimpleName(); - - private static final String GTASK_URL = "https://mail.google.com/tasks/"; //这个是指定的URL - - private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; - - private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; - - private static GTaskClient mInstance = null; - - private DefaultHttpClient mHttpClient; - - private String mGetUrl; - - private String mPostUrl; - - private long mClientVersion; - - private boolean mLoggedin; - - private long mLastLoginTime; - - private int mActionId; - - private Account mAccount; - - private JSONArray mUpdateArray; - - private GTaskClient() { - mHttpClient = null; - mGetUrl = GTASK_GET_URL; - mPostUrl = GTASK_POST_URL; - mClientVersion = -1; - mLoggedin = false; - mLastLoginTime = 0; - mActionId = 1; - mAccount = null; - mUpdateArray = null; - } - - /*用来获取的实例化对象 - * 使用 getInstance() - * 返回mInstance这个实例化对象 - */ - public static synchronized GTaskClient getInstance() { - if (mInstance == null) { - mInstance = new GTaskClient(); - } - return mInstance; - } - - /*用来实现登录操作的函数,传入的参数是一个Activity - * 设置登录操作限制时间,如果超时则需要重新登录 - * 有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录 - * 返回true或者false,即最后是否登陆成功 - */ - public boolean login(Activity activity) { - // we suppose that the cookie would expire after 5 minutes - // then we need to re-login - //判断距离最后一次登录操作是否超过5分钟 - final long interval = 1000 * 60 * 5; - if (mLastLoginTime + interval < System.currentTimeMillis()) { - mLoggedin = false; - } - - // need to re-login after account switch 重新登录操作 - if (mLoggedin - && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity - .getSyncAccountName(activity))) { - mLoggedin = false; - } - - //如果没超过时间,则不需要重新登录 - if (mLoggedin) { - Log.d(TAG, "already logged in"); - return true; - } - - mLastLoginTime = System.currentTimeMillis();//更新最后登录时间,改为系统当前的时间 - String authToken = loginGoogleAccount(activity, false);//判断是否登录到谷歌账户 - if (authToken == null) { - Log.e(TAG, "login google account failed"); - return false; - } - - // login with custom domain if necessary - //尝试使用用户自己的域名登录 - if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() //将用户账号名改为统一格式(小写)后判断是否为一个谷歌账号地址 - .endsWith("googlemail.com"))) { - StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); - int index = mAccount.name.indexOf('@') + 1; - String suffix = mAccount.name.substring(index); - url.append(suffix + "/"); - mGetUrl = url.toString() + "ig"; //设置用户对应的getUrl - mPostUrl = url.toString() + "r/ig"; //设置用户对应的postUrl - - if (tryToLoginGtask(activity, authToken)) { - mLoggedin = true; - } - } - - // try to login with google official url - //如果用户账户无法登录,则使用谷歌官方的URI进行登录 - if (!mLoggedin) { - mGetUrl = GTASK_GET_URL; - mPostUrl = GTASK_POST_URL; - if (!tryToLoginGtask(activity, authToken)) { - return false; - } - } - - mLoggedin = true; - return true; - } - - /*具体实现登录谷歌账户的方法 - * 使用令牌机制 - * 使用AccountManager来管理注册账号 - * 返回值是账号的令牌 - */ - private String loginGoogleAccount(Activity activity, boolean invalidateToken) { - String authToken; //令牌,是登录操作保证安全性的一个方法 - AccountManager accountManager = AccountManager.get(activity);//AccountManager这个类给用户提供了集中注册账号的接口 - Account[] accounts = accountManager.getAccountsByType("com.google");//获取全部以com.google结尾的account - - if (accounts.length == 0) { - Log.e(TAG, "there is no available google account"); - return null; - } - - String accountName = NotesPreferenceActivity.getSyncAccountName(activity); - Account account = null; - //遍历获得的accounts信息,寻找已经记录过的账户信息 - for (Account a : accounts) { - if (a.name.equals(accountName)) { - account = a; - break; - } - } - if (account != null) { - mAccount = account; - } else { - Log.e(TAG, "unable to get an account with the same name in the settings"); - return null; - } - - // get the token now - //获取选中账号的令牌 - AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, - "goanna_mobile", null, activity, null, null); - try { - Bundle authTokenBundle = accountManagerFuture.getResult(); - authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); - //如果是invalidateToken,那么需要调用invalidateAuthToken(String, String)方法废除这个无效token - if (invalidateToken) { - accountManager.invalidateAuthToken("com.google", authToken); - loginGoogleAccount(activity, false); - } - } catch (Exception e) { - Log.e(TAG, "get auth token failed"); - authToken = null; - } - - return authToken; - } - - //尝试登陆Gtask,这只是一个预先判断令牌是否是有效以及是否能登上GTask的方法,而不是具体实现登陆的方法 - private boolean tryToLoginGtask(Activity activity, String authToken) { - if (!loginGtask(authToken)) { - // maybe the auth token is out of authTokedate, now let's invalidate the - // token and try again - //删除过一个无效的authToken,申请一个新的后再次尝试登陆 - authToken = loginGoogleAccount(activity, true); - if (authToken == null) { - Log.e(TAG, "login google account failed"); - return false; - } - - if (!loginGtask(authToken)) { - Log.e(TAG, "login gtask failed"); - return false; - } - } - return true; - } - - //实现登录GTask的具体操作 - private boolean loginGtask(String authToken) { - int timeoutConnection = 10000; - int timeoutSocket = 15000; //socket是一种通信连接实现数据的交换的端口 - HttpParams httpParameters = new BasicHttpParams(); //实例化一个新的HTTP参数类 - HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//设置连接超时时间 - HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//设置设置端口超时时间 - mHttpClient = new DefaultHttpClient(httpParameters); - BasicCookieStore localBasicCookieStore = new BasicCookieStore(); //设置本地cookie - mHttpClient.setCookieStore(localBasicCookieStore); - HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); - - // login gtask - try { - String loginUrl = mGetUrl + "?auth=" + authToken; //设置登录的url - HttpGet httpGet = new HttpGet(loginUrl); //通过登录的uri实例化网页上资源的查找 - HttpResponse response = null; - response = mHttpClient.execute(httpGet); - - // get the cookie now - //获取CookieStore里存放的cookie,看如果存有“GTL(不知道什么意思)”,则说明有验证成功的有效的cookie - List cookies = mHttpClient.getCookieStore().getCookies(); - boolean hasAuthCookie = false; - for (Cookie cookie : cookies) { - if (cookie.getName().contains("GTL")) { - hasAuthCookie = true; - } - } - if (!hasAuthCookie) { - Log.w(TAG, "it seems that there is no auth cookie"); - } - - // get the client version - //获取client的内容,具体操作是在返回的Content中截取从_setup(开始到)}中间的字符串内容,也就是gtask_url的内容 - String resString = getResponseContent(response.getEntity()); - String jsBegin = "_setup("; - String jsEnd = ")}"; - int begin = resString.indexOf(jsBegin); - int end = resString.lastIndexOf(jsEnd); - String jsString = null; - if (begin != -1 && end != -1 && begin < end) { - jsString = resString.substring(begin + jsBegin.length(), end); - } - JSONObject js = new JSONObject(jsString); - mClientVersion = js.getLong("v"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } catch (Exception e) { - // simply catch all exceptions - Log.e(TAG, "httpget gtask_url failed"); - return false; - } - - return true; - } - - private int getActionId() { - return mActionId++; - } - - /*实例化创建一个用于向网络传输数据的对象 - * 使用HttpPost类 - * 返回一个httpPost实例化对象,但里面还没有内容 - */ - private HttpPost createHttpPost() { - HttpPost httpPost = new HttpPost(mPostUrl); - httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); - httpPost.setHeader("AT", "1"); - return httpPost; - } - - /*通过URL获取响应后返回的数据,也就是网络上的数据和资源 - * 使用getContentEncoding()获取网络上的资源和数据 - * 返回值就是获取到的资源 - */ - private String getResponseContent(HttpEntity entity) throws IOException { - String contentEncoding = null; - if (entity.getContentEncoding() != null) {//通过URL得到HttpEntity对象,如果不为空则使用getContent()方法创建一个流将数据从网络都过来 - contentEncoding = entity.getContentEncoding().getValue(); - Log.d(TAG, "encoding: " + contentEncoding); - } - - InputStream input = entity.getContent(); - if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {//GZIP是使用DEFLATE进行压缩数据的另一个压缩库 - input = new GZIPInputStream(entity.getContent()); - } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {//DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩 - Inflater inflater = new Inflater(true); - input = new InflaterInputStream(entity.getContent(), inflater); - } - - try { - InputStreamReader isr = new InputStreamReader(input); - BufferedReader br = new BufferedReader(isr);//是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了时候,再读入内存,是为了提供读的效率而设计的 - StringBuilder sb = new StringBuilder(); - - while (true) { - String buff = br.readLine(); - if (buff == null) { - return sb.toString(); - } - sb = sb.append(buff); - } - } finally { - input.close(); - } - } - - /*通过JSON发送请求 - * 请求的具体内容在json的实例化对象js中然后传入 - * 利用UrlEncodedFormEntity entity和httpPost.setEntity(entity)方法把js中的内容放置到httpPost中 - * 执行请求后使用getResponseContent方法得到返回的数据和资源 - * 将资源再次放入json后返回 - */ - private JSONObject postRequest(JSONObject js) throws NetworkFailureException { - if (!mLoggedin) {//未登录 - Log.e(TAG, "please login first"); - throw new ActionFailureException("not logged in"); - } - - //实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里 - HttpPost httpPost = createHttpPost(); - try { - LinkedList list = new LinkedList(); - list.add(new BasicNameValuePair("r", js.toString())); - UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); //UrlEncodedFormEntity()的形式比较单一,是普通的键值对 - httpPost.setEntity(entity); - - // execute the post - //执行这个请求 - HttpResponse response = mHttpClient.execute(httpPost); - String jsString = getResponseContent(response.getEntity()); - return new JSONObject(jsString); - - } catch (ClientProtocolException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("postRequest failed"); - } catch (IOException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("postRequest failed"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("unable to convert response content to jsonobject"); - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("error occurs when posting request"); - } - } - - /*创建单个任务 - * 传入参数是一个.gtask.data.Task包里Task类的对象 - * 利用json获取Task里的内容,并且创建相应的jsPost - * 利用postRequest得到任务的返回信息 - * 使用task.setGid设置task的new_ID - */ - public void createTask(Task task) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - actionList.put(task.getCreateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - // post - JSONObject jsResponse = postRequest(jsPost); - JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( - GTaskStringUtils.GTASK_JSON_RESULTS).get(0); - task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("create task: handing jsonobject failed"); - } - } - - /* - * 创建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid - */ - public void createTaskList(TaskList tasklist) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - actionList.put(tasklist.getCreateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - // post - JSONObject jsResponse = postRequest(jsPost); - JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( - GTaskStringUtils.GTASK_JSON_RESULTS).get(0); - tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("create tasklist: handing jsonobject failed"); - } - } - - /* - * 同步更新操作 - * 使用JSONObject进行数据存储,使用jsPost.put,Put的信息包括UpdateArray和ClientVersion - * 使用postRequest发送这个jspost,进行处理 - */ - public void commitUpdate() throws NetworkFailureException { - if (mUpdateArray != null) { - try { - JSONObject jsPost = new JSONObject(); - - // action_list - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - mUpdateArray = null; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("commit update: handing jsonobject failed"); - } - } - } - - /* - * 添加更新的事项 - * 调用commitUpdate()实现 - */ - public void addUpdateNode(Node node) throws NetworkFailureException { - if (node != null) { - // too many update items may result in an error - // set max to 10 items - if (mUpdateArray != null && mUpdateArray.length() > 10) { - commitUpdate(); - } - - if (mUpdateArray == null) - mUpdateArray = new JSONArray(); - mUpdateArray.put(node.getUpdateAction(getActionId())); - } - } - - /* - * 移动task,比如讲task移动到不同的task列表中去 - * 通过getGid获取task所属列表的gid - * 通过JSONObject.put(String name, Object value)函数设置移动后的task的相关属性值,从而达到移动的目的 - * 最后还是通过postRequest进行更新后的发送 - */ - public void moveTask(Task task, TaskList preParent, TaskList curParent) - throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - JSONObject action = new JSONObject(); - - // action_list - action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); - action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); - if (preParent == curParent && task.getPriorSibling() != null) { - // put prioring_sibing_id only if moving within the tasklist and - // it is not the first one - //设置优先级ID,只有当移动是发生在文件中 - action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); - } - action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); //设置移动前所属列表 - action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); //设置当前所属列表 - if (preParent != curParent) { - // put the dest_list only if moving between tasklists - action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); - } - actionList.put(action); - //最后将ACTION_LIST加入到jsPost中 - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("move task: handing jsonobject failed"); - } - } - - /* - * 删除操作节点 - * 还是利用JSON - * 删除过后使用postRequest发送删除后的结果 - */ - public void deleteNode(Node node) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - node.setDeleted(true); - actionList.put(node.getUpdateAction(getActionId())); //这里会获取到删除操作的ID,加入到actionLiast中 - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - mUpdateArray = null; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("delete node: handing jsonobject failed"); - } - } - - /* - * 获取任务列表 - * 首先通过GetURI使用getResponseContent从网上获取数据 - * 然后筛选出"_setup("到)}的部分,并且从中获取GTASK_JSON_LISTS的内容返回 - */ - public JSONArray getTaskLists() throws NetworkFailureException { - if (!mLoggedin) { - Log.e(TAG, "please login first"); - throw new ActionFailureException("not logged in"); - } - - try { - HttpGet httpGet = new HttpGet(mGetUrl); - HttpResponse response = null; - response = mHttpClient.execute(httpGet); - - // get the task list - //筛选工作,把筛选出的字符串放入jsString - String resString = getResponseContent(response.getEntity()); - String jsBegin = "_setup("; - String jsEnd = ")}"; - int begin = resString.indexOf(jsBegin); - int end = resString.lastIndexOf(jsEnd); - String jsString = null; - if (begin != -1 && end != -1 && begin < end) { - jsString = resString.substring(begin + jsBegin.length(), end); - } - JSONObject js = new JSONObject(jsString); - //获取GTASK_JSON_LISTS - return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); - } catch (ClientProtocolException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("gettasklists: httpget failed"); - } catch (IOException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("gettasklists: httpget failed"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("get task lists: handing jasonobject failed"); - } - } - - /* - * 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务 - */ - public JSONArray getTaskList(String listGid) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - JSONObject action = new JSONObject(); - - // action_list - action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); - action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); //这里设置为传入的listGid - action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); - actionList.put(action); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - JSONObject jsResponse = postRequest(jsPost); - return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("get task list: handing jsonobject failed"); - } - } - - public Account getSyncAccount() { - return mAccount; - } - - //重置更新的内容 - public void resetUpdateArray() { - mUpdateArray = null; - } -} \ No newline at end of file diff --git a/gtask注释/remote/GTaskManager.java b/gtask注释/remote/GTaskManager.java deleted file mode 100644 index a8c1f2a..0000000 --- a/gtask注释/remote/GTaskManager.java +++ /dev/null @@ -1,846 +0,0 @@ -package net.micode.notes.gtask.remote; - -public class GTaskManager { - private static final String TAG = GTaskManager.class.getSimpleName(); - public static final int STATE_SUCCESS = 0; - public static final int STATE_NETWORK_ERROR = 1; - public static final int STATE_INTERNAL_ERROR = 2; - public static final int STATE_SYNC_IN_PROGRESS = 3; - public static final int STATE_SYNC_CANCELLED = 4; - private static GTaskManager mInstance = null; - - private Activity mActivity; - private Context mContext; - private ContentResolver mContentResolver; - private boolean mSyncing; - private boolean mCancelled; - private HashMap mGTaskListHashMap; - private HashMap mGTaskHashMap; - private HashMap mMetaHashMap; - private TaskList mMetaList; - private HashSet mLocalDeleteIdMap; - private HashMap mGidToNid; - private HashMap mNidToGid; - - private GTaskManager() { //对象初始化函数 - mSyncing = false; //正在同步,flase代表未执行 - mCancelled = false; //全局标识,flase代表可以执行 - mGTaskListHashMap = new HashMap(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。 - mGTaskHashMap = new HashMap(); - mMetaHashMap = new HashMap(); - mMetaList = null; - mLocalDeleteIdMap = new HashSet(); - mGidToNid = new HashMap(); //GoogleID to NodeID?? - mNidToGid = new HashMap(); //NodeID to GoogleID???通过hashmap散列表建立映射 - } - - /** - * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 - * 功能:类初始化函数 - * @author TTS - * @return GtaskManger - */ - public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized - if (mInstance == null) { - mInstance = new GTaskManager(); - } - return mInstance; - } - - /** - * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 - * @author TTS - * @param activity - */ - public synchronized void setActivityContext(Activity activity) { - // used for getting auth token - mActivity = activity; - } - - /** - * 核心函数 - * 功能:实现了本地同步操作和远端同步操作 - * @author TTS - * @param context-----获取上下文 - * @param asyncTask-------用于同步的异步操作类 - * @return int - */ - public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数 - if (mSyncing) { - Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug - return STATE_SYNC_IN_PROGRESS; - } - mContext = context; - mContentResolver = mContext.getContentResolver(); - mSyncing = true; - mCancelled = false; - mGTaskListHashMap.clear(); - mGTaskHashMap.clear(); - mMetaHashMap.clear(); - mLocalDeleteIdMap.clear(); - mGidToNid.clear(); - mNidToGid.clear(); - - try { - GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机 - client.resetUpdateArray(); //JSONArray类型,reset即置为NULL - - // login google task - if (!mCancelled) { - if (!client.login(mActivity)) { - throw new NetworkFailureException("login google task failed"); - } - } - - // get the task list from google - asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); - initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList - - // do content sync work - asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); - syncContent(); - } catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常 - Log.e(TAG, e.toString()); //创建日志文件(调试信息),error - return STATE_NETWORK_ERROR; - } catch (ActionFailureException e) { //此类异常为操作异常 - Log.e(TAG, e.toString()); - return STATE_INTERNAL_ERROR; - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return STATE_INTERNAL_ERROR; - } finally { - mGTaskListHashMap.clear(); - mGTaskHashMap.clear(); - mMetaHashMap.clear(); - mLocalDeleteIdMap.clear(); - mGidToNid.clear(); - mNidToGid.clear(); - mSyncing = false; - } - - return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; - } - - /** - *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。 - *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap - *@author TTS - *@exception NetworkFailureException - *@return void - */ - private void initGTaskList() throws NetworkFailureException { - if (mCancelled) - return; - GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机 - try { - //Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。 - //其格式为{"key1":value1,"key2",value2....};key 必须是字符串。 - //因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。 - JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list------lists??? - - // init meta list first - mMetaList = null; //TaskList类型 - for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); - - if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { - mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化 - mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname... - - // load meta data - JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list------list??? - for (int j = 0; j < jsMetas.length(); j++) { - object = (JSONObject) jsMetas.getJSONObject(j); - MetaData metaData = new MetaData(); //继承自Node - metaData.setContentByRemoteJSON(object); - if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList - mMetaList.addChildTask(metaData); - if (metaData.getGid() != null) { - mMetaHashMap.put(metaData.getRelatedGid(), metaData); - } - } - } - } - } - - // create meta list if not existed - if (mMetaList == null) { - mMetaList = new TaskList(); - mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_META); - GTaskClient.getInstance().createTaskList(mMetaList); - } - - // init task list - for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。 - String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); - - if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) - && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_META)) { - TaskList tasklist = new TaskList(); //继承自Node - tasklist.setContentByRemoteJSON(object); - mGTaskListHashMap.put(gid, tasklist); - mGTaskHashMap.put(gid, tasklist); //为什么加两遍??? - - // load tasks - JSONArray jsTasks = client.getTaskList(gid); - for (int j = 0; j < jsTasks.length(); j++) { - object = (JSONObject) jsTasks.getJSONObject(j); - gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - Task task = new Task(); - task.setContentByRemoteJSON(object); - if (task.isWorthSaving()) { - task.setMetaInfo(mMetaHashMap.get(gid)); - tasklist.addChildTask(task); - mGTaskHashMap.put(gid, task); - } - } - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("initGTaskList: handing JSONObject failed"); - } - } - - /** - * 功能:本地内容同步操作 - * @throws NetworkFailureException - * @return 无返回值 - */ - private void syncContent() throws NetworkFailureException { //本地内容同步操作 - int syncType; - Cursor c = null; //数据库指针 - String gid; //GoogleID?? - Node node; //Node包含Sync_Action的不同类型 - - mLocalDeleteIdMap.clear(); //HashSet类型 - - if (mCancelled) { - return; - } - - // for local deleted note - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type<>? AND parent_id=?)", new String[] { - String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, null); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); - } - - mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); - } - } else { - Log.w(TAG, "failed to query trash folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // sync folder first - syncFolder(); - - // for note existing in database - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type=? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //通过hashmap建立联系 - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //通过hashmap建立联系 - syncType = node.getSyncAction(c); - } else { - if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add - syncType = Node.SYNC_ACTION_ADD_REMOTE; - } else { - // remote delete - syncType = Node.SYNC_ACTION_DEL_LOCAL; - } - } - doContentSync(syncType, node, c); - } - } else { - Log.w(TAG, "failed to query existing note in database"); - } - - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // go through remaining items - Iterator> iter = mGTaskHashMap.entrySet().iterator(); //Iterator迭代器 - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - node = entry.getValue(); - doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); - } - - // mCancelled can be set by another thread, so we neet to check one by //thread----线程 - // one - // clear local delete table - if (!mCancelled) { - if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { - throw new ActionFailureException("failed to batch-delete local deleted notes"); - } - } - - // refresh local sync id - if (!mCancelled) { - GTaskClient.getInstance().commitUpdate(); - refreshLocalSyncId(); - } - - } - - /** - * 功能: - * @author TTS - * @throws NetworkFailureException - */ - private void syncFolder() throws NetworkFailureException { - Cursor c = null; - String gid; - Node node; - int syncType; - - if (mCancelled) { - return; - } - - // for root folder - try { - c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, - Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); - if (c != null) { - c.moveToNext(); - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); - mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); - // for system folder, only update remote name if necessary - if (!node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) - doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); - } else { - doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); - } - } else { - Log.w(TAG, "failed to query root folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for call-note folder - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(Notes.ID_CALL_RECORD_FOLDER) - }, null); - if (c != null) { - if (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); - mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); - // for system folder, only update remote name if - // necessary - if (!node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE)) - doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); - } else { - doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); - } - } - } else { - Log.w(TAG, "failed to query call note folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for local existing folders - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type=? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); - syncType = node.getSyncAction(c); - } else { - if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add - syncType = Node.SYNC_ACTION_ADD_REMOTE; - } else { - // remote delete - syncType = Node.SYNC_ACTION_DEL_LOCAL; - } - } - doContentSync(syncType, node, c); - } - } else { - Log.w(TAG, "failed to query existing folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for remote add folders - Iterator> iter = mGTaskListHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - gid = entry.getKey(); - node = entry.getValue(); - if (mGTaskHashMap.containsKey(gid)) { - mGTaskHashMap.remove(gid); - doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); - } - } - - if (!mCancelled) - GTaskClient.getInstance().commitUpdate(); - } - - /** - * 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode - * @author TTS - * @param syncType - * @param node - * @param c - * @throws NetworkFailureException - */ - private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - MetaData meta; - switch (syncType) { - case Node.SYNC_ACTION_ADD_LOCAL: - addLocalNode(node); - break; - case Node.SYNC_ACTION_ADD_REMOTE: - addRemoteNode(node, c); - break; - case Node.SYNC_ACTION_DEL_LOCAL: - meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); - if (meta != null) { - GTaskClient.getInstance().deleteNode(meta); - } - mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); - break; - case Node.SYNC_ACTION_DEL_REMOTE: - meta = mMetaHashMap.get(node.getGid()); - if (meta != null) { - GTaskClient.getInstance().deleteNode(meta); - } - GTaskClient.getInstance().deleteNode(node); - break; - case Node.SYNC_ACTION_UPDATE_LOCAL: - updateLocalNode(node, c); - break; - case Node.SYNC_ACTION_UPDATE_REMOTE: - updateRemoteNode(node, c); - break; - case Node.SYNC_ACTION_UPDATE_CONFLICT: - // merging both modifications maybe a good idea - // right now just use local update simply - updateRemoteNode(node, c); - break; - case Node.SYNC_ACTION_NONE: - break; - case Node.SYNC_ACTION_ERROR: - default: - throw new ActionFailureException("unkown sync action type"); - } - } - - /** - * 功能:本地增加Node - * @author TTS - * @param node - * @throws NetworkFailureException - */ - private void addLocalNode(Node node) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote; - if (node instanceof TaskList) { - if (node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { - sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); - } else if (node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { - sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); - } else { - sqlNote = new SqlNote(mContext); - sqlNote.setContent(node.getLocalJSONFromContent()); - sqlNote.setParentId(Notes.ID_ROOT_FOLDER); - } - } else { - sqlNote = new SqlNote(mContext); - JSONObject js = node.getLocalJSONFromContent(); - try { - if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.has(NoteColumns.ID)) { - long id = note.getLong(NoteColumns.ID); - if (DataUtils.existInNoteDatabase(mContentResolver, id)) { - // the id is not available, have to create a new one - note.remove(NoteColumns.ID); - } - } - } - - if (js.has(GTaskStringUtils.META_HEAD_DATA)) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { - // the data id is not available, have to create - // a new one - data.remove(DataColumns.ID); - } - } - } - - } - } catch (JSONException e) { - Log.w(TAG, e.toString()); - e.printStackTrace(); - } - sqlNote.setContent(js); - - Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); - if (parentId == null) { - Log.e(TAG, "cannot find task's parent id locally"); - throw new ActionFailureException("cannot add local node"); - } - sqlNote.setParentId(parentId.longValue()); - } - - // create the local node - sqlNote.setGtaskId(node.getGid()); - sqlNote.commit(false); - - // update gid-nid mapping - mGidToNid.put(node.getGid(), sqlNote.getId()); - mNidToGid.put(sqlNote.getId(), node.getGid()); - - // update meta - updateRemoteMeta(node.getGid(), sqlNote); - } - - /** - * 功能:update本地node - * @author TTS - * @param node - * ----同步操作的基础数据类型 - * @param c - * ----Cursor - * @throws NetworkFailureException - */ - private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote; - // update the note locally - sqlNote = new SqlNote(mContext, c); - sqlNote.setContent(node.getLocalJSONFromContent()); - - Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) - : new Long(Notes.ID_ROOT_FOLDER); - if (parentId == null) { - Log.e(TAG, "cannot find task's parent id locally"); - throw new ActionFailureException("cannot update local node"); - } - sqlNote.setParentId(parentId.longValue()); - sqlNote.commit(true); - - // update meta info - updateRemoteMeta(node.getGid(), sqlNote); - } - - /** - * 功能:远程增加Node - * 需要updateRemoteMeta - * @author TTS - * @param node - * ----同步操作的基础数据类型 - * @param c - * --Cursor - * @throws NetworkFailureException - */ - private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote = new SqlNote(mContext, c); //从本地mContext中获取内容 - Node n; - - // update remotely - if (sqlNote.isNoteType()) { - Task task = new Task(); - task.setContentByLocalJSON(sqlNote.getContent()); - - String parentGid = mNidToGid.get(sqlNote.getParentId()); - if (parentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); //调试信息 - throw new ActionFailureException("cannot add remote task"); - } - mGTaskListHashMap.get(parentGid).addChildTask(task); //在本地生成的GTaskList中增加子结点 - - //登录远程服务器,创建Task - GTaskClient.getInstance().createTask(task); - n = (Node) task; - - // add meta - updateRemoteMeta(task.getGid(), sqlNote); - } else { - TaskList tasklist = null; - - // we need to skip folder if it has already existed - String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; - if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) - folderName += GTaskStringUtils.FOLDER_DEFAULT; - else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) - folderName += GTaskStringUtils.FOLDER_CALL_NOTE; - else - folderName += sqlNote.getSnippet(); - - //iterator迭代器,通过统一的接口迭代所有的map元素 - Iterator> iter = mGTaskListHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - String gid = entry.getKey(); - TaskList list = entry.getValue(); - - if (list.getName().equals(folderName)) { - tasklist = list; - if (mGTaskHashMap.containsKey(gid)) { - mGTaskHashMap.remove(gid); - } - break; - } - } - - // no match we can add now - if (tasklist == null) { - tasklist = new TaskList(); - tasklist.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().createTaskList(tasklist); - mGTaskListHashMap.put(tasklist.getGid(), tasklist); - } - n = (Node) tasklist; - } - - // update local note - sqlNote.setGtaskId(n.getGid()); - sqlNote.commit(false); - sqlNote.resetLocalModified(); - sqlNote.commit(true); - - // gid-id mapping //创建id间的映射 - mGidToNid.put(n.getGid(), sqlNote.getId()); - mNidToGid.put(sqlNote.getId(), n.getGid()); - } - - /** - * 功能:更新远端的Node,包含meta更新(updateRemoteMeta) - * @author TTS - * @param node - * ----同步操作的基础数据类型 - * @param c - * --Cursor - * @throws NetworkFailureException - */ - private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote = new SqlNote(mContext, c); - - // update remotely - node.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(node); //GTaskClient用途为从本地登陆远端服务器 - - // update meta - updateRemoteMeta(node.getGid(), sqlNote); - - // move task if necessary - if (sqlNote.isNoteType()) { - Task task = (Task) node; - TaskList preParentList = task.getParent(); - //preParentList为通过node获取的父节点列表 - - String curParentGid = mNidToGid.get(sqlNote.getParentId()); - //curParentGid为通过光标在数据库中找到sqlNote的mParentId,再通过mNidToGid由long类型转为String类型的Gid - - if (curParentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); - throw new ActionFailureException("cannot update remote task"); - } - TaskList curParentList = mGTaskListHashMap.get(curParentGid); - //通过HashMap找到对应Gid的TaskList - - if (preParentList != curParentList) { //????????????? - preParentList.removeChildTask(task); - curParentList.addChildTask(task); - GTaskClient.getInstance().moveTask(task, preParentList, curParentList); - } - } - - // clear local modified flag - sqlNote.resetLocalModified(); - //commit到本地数据库 - sqlNote.commit(true); - } - - /** - * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。 - * @author TTS - * @param gid - * ---GoogleID为String类型 - * @param sqlNote - * ---同步前的数据库操作,故使用类SqlNote - * @throws NetworkFailureException - */ - private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { - if (sqlNote != null && sqlNote.isNoteType()) { - MetaData metaData = mMetaHashMap.get(gid); - if (metaData != null) { - metaData.setMeta(gid, sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(metaData); - } else { - metaData = new MetaData(); - metaData.setMeta(gid, sqlNote.getContent()); - mMetaList.addChildTask(metaData); - mMetaHashMap.put(gid, metaData); - GTaskClient.getInstance().createTask(metaData); - } - } - } - - /** - * 功能:刷新本地,给sync的ID对应上最后更改过的对象 - * @author TTS - * @return void - * @throws NetworkFailureException - */ - private void refreshLocalSyncId() throws NetworkFailureException { - if (mCancelled) { - return; - } - - // get the latest gtask list //获取最近的(最晚的)gtask list - mGTaskHashMap.clear(); - mGTaskListHashMap.clear(); - mMetaHashMap.clear(); - initGTaskList(); - - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type<>? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); //query语句:五个参数,NoteColumns.TYPE + " DESC"-----为按类型递减顺序返回查询结果。new String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------为选择参数。"(type<>? AND parent_id<>?)"-------指明返回行过滤器。SqlNote.PROJECTION_NOTE--------应返回的数据列的名字。Notes.CONTENT_NOTE_URI--------contentProvider包含所有数据集所对应的uri - if (c != null) { - while (c.moveToNext()) { - String gid = c.getString(SqlNote.GTASK_ID_COLUMN); - Node node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - ContentValues values = new ContentValues(); //在ContentValues中创建键值对。准备通过contentResolver写入数据 - values.put(NoteColumns.SYNC_ID, node.getLastModified()); - mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //进行批量更改,选择参数为NULL,应该可以用insert替换,参数分别为表名和需要更新的value对象。 - c.getLong(SqlNote.ID_COLUMN)), values, null, null); - } else { - Log.e(TAG, "something is missed"); - throw new ActionFailureException( - "some local items don't have gid after sync"); - } - } - } else { - Log.w(TAG, "failed to query local note to refresh sync id"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - } - - /** - * 功能:获取同步账号,mAccount.name - * @author TTS - * @return String - */ - public String getSyncAccount() { - return GTaskClient.getInstance().getSyncAccount().name; - } - - /** - * 功能:取消同步,置mCancelled为true - * @author TTS - */ - public void cancelSync() { - mCancelled = true; - } -} \ No newline at end of file diff --git a/gtask注释/remote/GTaskSyncService.java b/gtask注释/remote/GTaskSyncService.java deleted file mode 100644 index bf7fb43..0000000 --- a/gtask注释/remote/GTaskSyncService.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.micode.notes.gtask.remote; - -/* - * Service是在一段不定的时间运行在后台,不和用户交互的应用组件 - * 主要方法: - * private void startSync() 启动一个同步工作 - * private void cancelSync() 取消同步 - * public void onCreate() - * public int onStartCommand(Intent intent, int flags, int startId) service生命周期的组成部分,相当于重启service(比如在被暂停之后),而不是创建一个新的service - * public void onLowMemory() 在没有内存的情况下如果存在service则结束掉这的service - * public IBinder onBind() - * public void sendBroadcast(String msg) 发送同步的相关通知 - * public static void startSync(Activity activity) - * public static void cancelSync(Context context) - * public static boolean isSyncing() 判读是否在进行同步 - * public static String getProgressString() 获取当前进度的信息 - */ - -public class GTaskSyncService extends Service { - public final static String ACTION_STRING_NAME = "sync_action_type"; - - public final static int ACTION_START_SYNC = 0; - - public final static int ACTION_CANCEL_SYNC = 1; - - public final static int ACTION_INVALID = 2; - - public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; - - public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; - - public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; - - private static GTaskASyncTask mSyncTask = null; - - private static String mSyncProgress = ""; - - //开始一个同步的工作 - private void startSync() { - if (mSyncTask == null) { - mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { - public void onComplete() { - mSyncTask = null; - sendBroadcast(""); - stopSelf(); - } - }); - sendBroadcast(""); - mSyncTask.execute(); //这个函数让任务是以单线程队列方式或线程池队列方式运行 - } - } - - - private void cancelSync() { - if (mSyncTask != null) { - mSyncTask.cancelSync(); - } - } - - @Override - public void onCreate() { //初始化一个service - mSyncTask = null; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - Bundle bundle = intent.getExtras(); - if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { - switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { - //两种情况,开始同步或者取消同步 - case ACTION_START_SYNC: - startSync(); - break; - case ACTION_CANCEL_SYNC: - cancelSync(); - break; - default: - break; - } - return START_STICKY; //等待新的intent来是这个service继续运行 - } - return super.onStartCommand(intent, flags, startId); - } - - @Override - public void onLowMemory() { - if (mSyncTask != null) { - mSyncTask.cancelSync(); - } - } - - public IBinder onBind(Intent intent) { //不知道干吗用的 - return null; - } - - public void sendBroadcast(String msg) { - mSyncProgress = msg; - Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); //创建一个新的Intent - intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); //附加INTENT中的相应参数的值 - intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); - sendBroadcast(intent); //发送这个通知 - } - - public static void startSync(Activity activity) {//执行一个service,service的内容里的同步动作就是开始同步 - GTaskManager.getInstance().setActivityContext(activity); - Intent intent = new Intent(activity, GTaskSyncService.class); - intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); - activity.startService(intent); - } - - public static void cancelSync(Context context) {//执行一个service,service的内容里的同步动作就是取消同步 - Intent intent = new Intent(context, GTaskSyncService.class); - intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); - context.startService(intent); - } - - public static boolean isSyncing() { - return mSyncTask != null; - } - - public static String getProgressString() { - return mSyncProgress; - } -} \ No newline at end of file -- 2.34.1 From df2474b3302311721ca620797a407b1d32091311 Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Thu, 4 May 2023 19:24:37 +0800 Subject: [PATCH 12/20] 1 --- README.md | 2 -- 小米便签新增——用例描述.md | 26 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) delete mode 100644 README.md create mode 100644 小米便签新增——用例描述.md diff --git a/README.md b/README.md deleted file mode 100644 index 9ac76bf..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -161561# gitproject - diff --git a/小米便签新增——用例描述.md b/小米便签新增——用例描述.md new file mode 100644 index 0000000..4edb6a2 --- /dev/null +++ b/小米便签新增——用例描述.md @@ -0,0 +1,26 @@ +1.密码登录 +操作者:小米便签用户 + +前置条件:用户处于登录界面,账号已输入; + +基本事件流:用户输入正确的密码,进入滑块验证界面; + +其他事件流:用户输入的密码错误,密码清除,需要重新输入密码; + +异常事件流:用户输入的账号不存在,密码清除,返回到账号输入栏; + +后置条件:进入滑块验证界面、密码错误、该用户不存在; + + +2.滑块验证 +操作者:小米便签用户 + +前置条件:用户密码输入正确,跳转至滑块验证界面; + +基本事件流:用户将滑块移动到正确位置,通过验证,进入程序; + +其他事件流:用户将滑块移动到错误的位置,验证失败,滑块界面刷新; + +异常事件流:用户长时间不移动滑块,验证超时,返回登录界面; + +后置条件:进入程序、滑块界面刷新、返回登录界面; -- 2.34.1 From b5748ebd797a985e63be960ff23eb69b3c2d3e2b Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Wed, 31 May 2023 10:42:17 +0800 Subject: [PATCH 13/20] 1 --- 小米便签新增——用例描述.md | 26 ------------------------ 用例描述.docx | Bin 0 -> 16595 bytes 2 files changed, 26 deletions(-) delete mode 100644 小米便签新增——用例描述.md create mode 100644 用例描述.docx diff --git a/小米便签新增——用例描述.md b/小米便签新增——用例描述.md deleted file mode 100644 index 4edb6a2..0000000 --- a/小米便签新增——用例描述.md +++ /dev/null @@ -1,26 +0,0 @@ -1.密码登录 -操作者:小米便签用户 - -前置条件:用户处于登录界面,账号已输入; - -基本事件流:用户输入正确的密码,进入滑块验证界面; - -其他事件流:用户输入的密码错误,密码清除,需要重新输入密码; - -异常事件流:用户输入的账号不存在,密码清除,返回到账号输入栏; - -后置条件:进入滑块验证界面、密码错误、该用户不存在; - - -2.滑块验证 -操作者:小米便签用户 - -前置条件:用户密码输入正确,跳转至滑块验证界面; - -基本事件流:用户将滑块移动到正确位置,通过验证,进入程序; - -其他事件流:用户将滑块移动到错误的位置,验证失败,滑块界面刷新; - -异常事件流:用户长时间不移动滑块,验证超时,返回登录界面; - -后置条件:进入程序、滑块界面刷新、返回登录界面; diff --git a/用例描述.docx b/用例描述.docx new file mode 100644 index 0000000000000000000000000000000000000000..8b819137d8382e577169b8ea4ae72218f376b29c GIT binary patch literal 16595 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 B`PBdb literal 0 HcmV?d00001 -- 2.34.1 From 9a1061001628e015ff81008b2c1b026c41b026cb Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Wed, 31 May 2023 10:44:59 +0800 Subject: [PATCH 14/20] 1 --- 用例描述.docx | Bin 16595 -> 0 bytes 用例描述.png | Bin 0 -> 58215 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 用例描述.docx create mode 100644 用例描述.png diff --git a/用例描述.docx b/用例描述.docx deleted file mode 100644 index 8b819137d8382e577169b8ea4ae72218f376b29c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16595 zcmeIZWq4dU(l*>?W;>=hW;sUN6+;q^NDh}ZN)pXrf6kRI8Z&8NK4bugZ)R-IJOWM$M3FY-6jdFu zDB(699n?iG#}31`%x4gDc{^)Tca4Z5znoZ2oaMd2IYf+s#IWBfpKH?znWL|2L$i~w z3TVfHJ!^3I(5V*^2Z0@to`G159J5c=S|$b@8$}%9s2>-{u<2Qt%Ug6^tHdKeMS@Sb z+eS)V8^JQu@i6IMbmh*Q?VddeT8ftx;#1xwi@x5F(O_q1D4LX3$JTWi!Y^TR8<&D0 z%^${SuV7@^3u%e)+-|oJmn49FBZT3;rrWgG9-okQfNY0q44fm8A z+*`w)uD9}0EcFR~1~=Csb5zNA8?Iup+E@1I(R-ehOZ0bbdwT-`$o_4}eu~1XKY!1W zejkxA??YDG&d|c1hWa=8zoGhnczpilr_)WITEp=jKOVj92EMqJ} zKx&9dqAV|%&A+~IE-V0R9qNh6xY?%)J8r~kU0}s4!G*L!%{_kU)_7`h0mKEg zu_;K^yT@CNNM%Ms%%JY4s=`#Wc`|n~~j8Vp-7A z5T{1zl|W-%v`ikkWw+<|1_w|=WkLnhJb4&tBCEgdhwNeUFrVYA)o5>8W2b8IUB53} z|2;ku*3^gMAOHZ8&j0|@d#5;C+ZoUpSnE4lzOQS)Eodj|8rCa)XkIiEZ+IuoLSr^A z8iLRbEkxk*9YHa7Nd$#jT`gaCj;2WaeNJsDY?Nb)#|nX%jt@F5yD}mREYOk+%x@2*Tb>vB@EG|$DU}u% zIaL^WUtlXQD(5jWZ)ZmahBGV`;A|CGX`S~#Z^h7tseLGnPHSV3cNTcucu3u65CGig z;74Ka;$JEZ$!$CyhDYyZ!tu!%{qv@JHa3KmnYXTijHdP8-3@J(O^aLi)}}$6Yl}%kwStdDnqWu#IoiFYNQO}X7fr3{BYhaq zaf8hK*uCAjj4-H0_$(13VJJJbA?as*esE6H6$tKo&+A z(|0T1?K#+DU{Y-~-|g?gU`+Npvq{K4t7%Zcb^*9Mydx5-!D&lriyI+KdO@X0$v6y{ zU~qg6Mk#nazRR}~9wMjJV6zmq3*mhxXNwcm-=~k6$sCM2vO3kIF$Nb?8&~KEQyo2v zT`O_?D;qa;BWwyvH%!z9m3^M|CZhzLj!q0t4N6r++ssO~p)Cn(oCoPvFAg^4C1t4d zn?He@S|zdOrs(-)p0;;dvNDN&q+z)*ZNlD+I>oVf=r-4N$*s_j>WXe=US$>2MySNW zOGpZcLX9rgb1qg6PZ0szQ^w_bN*M?M*YK^Bb8c(0NnHGM_ zFc#=}6s<%8H}yR~Zvbi=?;Oq`vf4ywCDX$7c<9|ksCRQ-!+GAtP0Dt4zQdNAmr174 zZN2kAG7BymLaL10hd~uGt(}nHTV8Ibd)U_SbBAa(c6P@-xkXqz=Xy9eD0lCEsZZze zv>P~;i9?B13fE^N@ZB92n*rJ|Y~#01&Q zs*QD&iVllv2%p@nzZ&6JZMt*=s0^M_t2V>p@j>d4r|RD6aJWC&TemQx$4GK3sP0#)fe#rwAXXO^?R zH9j)3figgL!zfO6Q}MZIyN=@!x)dK@r}~KDI%C5f$V}f6#I{L!5jMjgwxF=*k+|S= z)A{Aeo8$THgR;ikF$%B?pRYcg(1*+~T9^d`ylA2eqqK%g_Jv*ig8gY89vQvP6Svn^ z^UDOpF0Wykq&aOsn25z0Sw>U)sIdT@=5` z50Iro=O`Q1tyG68$N_#09!ZLYG%62pbb zZ})*uPj9bY2olc+YvF4@-q<{z)xt{%2;@-EDhYI?<xZBB5pK!kh#b;syP+s#0;@lwC zDt}r#v=FP%jE~?hy!o_}Lo8c|qR+P_kCI>2oe$yH>@I@v>QF>7i2oL=R>++jKTs&j zrS@$x%n)ucm!&Beb2`0*Q|u!}D~P7lqEqP{5v0a(V*S*?r8YuzowS&aYc|tGag)wmVjH$S&S$X_c`#XG}d) zM42d9au~mOe1Fu*BuXZoaM7g!QlcvJVvv}nwqp9DkHg^=rg8qGioVe^g4gleKd#}- zqH!iT?>TLt0Ki88B+&0`_`eL@zpmu}HhO{H{nPi-|F^G_*wNqoGyikZ7J(fOTlow; z#e8)C847<0o9NL9o4Ke~u&X;&Au)x5l20Bhl}>xp19wJGtHlQ>VW*7H@qJLC00}L} z1<1Sf_7%>mf#@D_@^HKb$au@@X?tKa z;5>T*4l8~UrIp|gaukK^fM%l7NJPc$@?2=nI7H~Ce8fBB=l9^dygOH;?1A$C@yx!6 z@U9d8Z6b0^B_|cWyHDXT008oPiQm=B$lBV$%G$xu{x=)3CSJojg%-7co%ECguRXsn zQbR6A+`OsKdV0wdFwY8vrfrZC>G8Dazbvi{G<&5pK)1jD#&*YMjO|g>)J~tBFy>HN3%2PPFLLgMrCc zAjXe5$3jUgZc@p@B1rrB?kQGQ6%wtxL&VFKG!9SEym4`onzx; zG$@6D3>8RtAms*?<~?60Xk<7oucsm_R;|CZ5(487(5fQ0oLZ2 zIk$}R=d6{lK4K(5nx+gh4_WZhyezo-!SpKa=5Sd~9S$)XNM)YT9B^YmZ)v8@MC6QqpN7Yly%MYD z7h=R5;d@LJC*`c8VCqC)h~FQ9Y-6DIqKQA*A^)UezN}T32?igfeTp+oJ;Xyo;N4-x zF1Sr6*tKpxC!WaFdD;~tKP^U$wcugKI{`uoh4WBVfO#AOB&M;@#bao@mq?DQ;#fHA%n3g0>(I1T|(3f66Xcu0uNdBeb=46^b(|ih~{s-`jFzq zo$C9iFez!SjYu(6nI+#w`Va17bz zhRTKcKv~GfhwHnppMsvvfmXA$Dg+L^AsmzzL^>T`4^DCaQL(e6Kt_L4>~HUi{U6`Q z(8}O1dcACwO^Xn)>N(|6{?epZy!vK7MFv(ukX z^(h2doO@lervTsMf=Gj1lD+{*d@1CiiZ(qmIsVYnMgm{_%GEsoEdBxvu=MjdXL%_8 z+Q8dSwCnn(%B*$=BB5y19gD#EK}4#UZYG$oIs>p;*@oz-VE{h=uj@hqescB(N{+nK za(J?{_@jMM)SxW5BG64ay{z&J#8mxJ?ES%x2n~_3-8;&k1L2;PIC?7F#&Gch3n?zp4o6=yE1j@JjYD!fYoKC|i}eC_c(yc~fw)KdL13`5C>$2ke$1 zaV1KoEUDZMt`2$trBdo#04 znP#r(;Jzwu)n62Q+!tIwu1xtb>2ecwai3g^3{Kjh<)Uad7JYng!Oets0NC@t^H7@! zGwkKfDYY6FbB|XVWjhVo&9T&bN$0xAPGsOsMc@b3E$#kN@`NeTPa++-dBnv(hmM`9 zvx*u{Jf#aXhP4uvwySa0rmV;lJ76dw(Jt(6wQR1-;{aY!w8d$S@zY%I3kqfCF+DQZ zd4uc&6^M|m8N6bs!kG`w=ES0es{}&s>RGM+Q(UuE`$Q@My$BSj6tVIG#$`tfDkA7+Bk+IgMIi1&6h}K1q%LkkFL}rK3>k$WIFZF50 z)PPP?KErRqaO&$BQ{dT@{o)U~7(p8(yRMJoE-x4n&iJVpYu9II<+yLotmpxr$m;Ip z^WOic*X&>;n49k*>M=Y30PWuswu6bGr6JAllJ0lEUQNRsTLjgM=7xvzsqCPxI5hZU zP8=#rB?<}!nd`@L;b#5Ov!J9X93)_TSMmUUd@5IyjGJ79T*e7rfv1T#`2>H)7o@bL zxEhWrN@+c8{z}V|Mvwgwmi<&V`x^Jhp;kzZZ;|wZTk%?Lid9q?PX<9-8HVehZeZY+ z^*;6p_=v%3+`-a64ejOs&;-Zk^hc`k_ZVU39foK7VSyStg5K?;MSy}4+K7~iw2>v@ zw-xD2n90)BD_*EbAq?oPL-P|YXl28~$5r=kf8HKNka=@^$bG10K{vmtctE!&f$)&L z-+`7zQC!$;pyXKyb4^tL2B^2FT#5V$x4~tlfk8`6qV6R2vd}v^+?$KI$5w^e*!DAN zcoZyfJ0v>0^HqMrRx^L@%aICTWZt&bt$ePS>Xr;};aNHDA6i!ZzxJ>&w^Zyz0R7`_`F2OxY=i`3tN3#lxeYXrE2z<}PmKn~!IhT7UyE zdbgPz21}J%d#w^8kvcVmU8Ws>-VS|C&k9L85Z}>HM>j`e#jBwK3^n>>FKksqeFW0p z`11DLd%XTuQzwTQ(vaelNK2<)6#Fx`=z+!?XI35_3>(qFKL-CtDV!MlhikIri+E2d zlUjyI6&meNJZ`qn2ld+POb;h5u9E|%uP ztn((GPtUiZ`{n6gw|n`d;4Ue?FO(iW1Op}57XwW~1eJW__FG&u_2VLOg>bAX&7J8}5K-J7WAhtzek zAoh9>8AF@FIx=yu{$3H2f2^qi5VPMZ8Y#4#{! zkEyHJ0hm(syie+kx%?WRk-d_VAfdg@>lPdJ9U++u&$|S0$i~1sNa7I9jas1dJ_-u= z;dQC)FmGfA@2rLWOzy-)Plv}NQMQJ}WEfn@VF*8S#G8trJmqlta40%7x!}J7?r#vK zMSsVSC>53}_tB{GM`b0XoX#n-6%pSJ3c*ts0^XS8Jq{?7^AC?Y>rh4mctkda+&n^{ zV6RWcE}$7=t|`LmA(jdTVc*9XC-~j5`C-3zAo3sI8Iy1(nJ~+UX~PI9FZz-!Yl66y z40*v~)+k!)+feGM51e)S>|87+l@g_61`+aJGp=JC<4-T=Z_y@ip*`tS#SxGrlqU5^ zeK36*o^8SgrYbS`k+kh7%=FeejEO=Ifr|&St|3fx=Ug`m(6Ri=r~?jATh4Q!5M;d1 zC%9rIt1OhW%E4Wlf$NP+Cgr~r1Dg;(+)md%B!muAS?6NV8P8jx1CdcU*x8Mqy&^%V zSD$h5ho9`%o_6SDTnpI3qT{6zPY#XV^VXi)N!t(Q-^+?@{A@5nurE81Qyc0AsBsy| zt`Te;_Yj8M=Hl+QNhvJ)7F^A963RC#$3HA086(TMKWy6I13X*zdGiP1r?UVZf_SoG zG+<^G99nb!#LuZS6>{~d9n&V?U}GljTrU+BAOY#$L%YoBsEZiW!{&|-x0`d_W?^RZ z=fHr-p16tVLl23Hz>#lzH=u}S#>V`GraQ9mXZNdQaqY{4h6jPK8XJy@!UP+FBR`4r z5MRNZr#I$bhZR~k>n(gyu;ap(F(;zm%!?WD*ZoW#F}uld=g8n#C@hn#mnPh5`>8En z%z&6>L-kxuWNSo8E3*$GCY}pHuMo5@pB*y@K{@VWGhr z(pIE8h7iGAwN;1hP^o6&Fqc=(PI7LmU<-;e#U94)$p&vawy$dnugbAsMqY+tmb;Mj*02zMTcDbrS&acIH(b7h^ zA%{n0H?JNHPhTCT3awXT0(JyRO!qYLuI3o`Bd(iw7)qvE$}7d?@6F20sqM7ZsBC}2 z;0sV`NoJE^Vi)9Qv)3|ELedXY2{4?0XFXolVKUnVt1O^UvOcY4UgSZHT1T5bLbcB; z2(hL@bqPg}79)|(4n47p&`=0bzk7*Zc4`SZMiYmtSFtIQE}XDgp5pW+CiftNpk^Vw^kQfG4i6G zyI#V~QOjSwbcUX4l`m)FRx6#UaecJvHE)kS`U{r8RlYGJ9_^K_ zR=^P_zFb(3&6WS6V`W}>-Min_5;DK{&uikxFg6P`FaRI|{x7zky`h7Hsg?1+d>EBw zt7TS1Pi>vI&WUUGI)g#eFxG%_sgNA1B7-MMv6@~uA!s7QezLoDXP4>|5~^s*pU4XK zMq{wwx-s{jUj&3WuqlZ)Ek62_zGV2Rjlp!yZEu`8EqbCmus#75*&O z{AK1G0Ys#`pO0{1K+b_88ix8&+%yJByHxc1YD7IE&84~29;Y?=NbKbTN+LgO>R|ND zRJD?|AxOmyQHr*uo`PI?J=_z`!dZN%p7mw)MGYU7%lBM=kfH*F$cj1JXMdCPCs2=O zDlBqZgeN0M4A(1m-vg*l+J1!cZI^vkHyzgjfspx2*n7?#DGOE)4O$4$Dp{dN^7w)M z+I-6>e&XmS@~N-~M?PZrCau{$(WwN*@PINglE@0@sW{2Fh_bmbm{>VT2=RQ7{B^p? z!}dtQ7ybB$&H=|yzAy(!5veL^rv-fk-$H@m^41aDumo}G`N8>8^+gfVfG+WGdL!mMV8aO62~K0};$0Q#(mNCh&Y_-C zH{wO4k_qmYo&x{e8q;twD?T^%&cjhVZ4m_CMXa^w0YUdwD9>%q@R9hLtJ`QMNmJ!y zh(Coq>tc0JMl<#(YW8)x;lx7t0q80iCM$z)KBoXtGq2!BBCGqjoP`L*0G=O_7t%Lv z#PBxW)rp_4d?%0JE$JxIJ)S%4DQ_7?0-c}_;{2aCh|!(r?;enZDErBB!nO{j`HC&+ zn|}&JD=lSD^xB3`g3HKx(U7gA27i(Vw>T)}?fKY@hH=^}0GCZkH7M@c3yoF&RrXSb zaF$8;0XfF8uxz1}+Hsih(#|&AsYUKiP->tM$FqVZklX^nj%Uou1*jTI63q2+cNV;i zUh9zaI7lFhuT&RBr^pF4x=&I3)1^Net}Z$#h9!P0m#;RMPtx5pW>f!ZS)W80Ug!nU z1J~F{5*1mYHDnFIwinujpnVimt+WCF0ZQfpq7n$%#^hS(dFcEY0R03$G|>VfTlM%7 zOVL|Atfj?Y_O>qeQ(}IN!DSyU5AC2=rD4i__Einz+vJFF(d36ikwMdgpSyI(2+@2y zPR?OO-P64mKR;gC^B7-0SnT~gp`+&t2Y)esp^W(~CRu-a>Z}reqaj(3(LAM+qo5Xw zSwzn#yD!{6=cZ1Ga<9lV- z8f2V1G0St-c$3ky1rpY>l%?_2OylPl;xK(?aX}vWmnk+Eb}&s zeVp4K2j-%>3H*dUFyMZkPXV*6H!+M#z&U_xv6vXrqY2ee+cFfRz;;`d9Tqpy@NiMX@DW)sc#AP`6mg%l=^F2&z_6;%A3uhOU zoN-l2?P-p+@~Z+tCdljsrJSbA35{O>9qizwUQk zlMpgG{B>S1(+hWKj1VeK{HhCmqVx74KWR-&!WFM6)o|xlUFpeR4U(v~y zdb38k0aTM8kfKmUf8N~T9PRk6@X7<$6F&?-vhuKf9LpbfkJr#3KtuDeYQFz&iIg4` zdv&|=`eta0z8F81n9quyI&umkcenoy!P|4G*P}aLuuBjIL$kM;AZa;iPADu=oW84~ z$(S*UKRB*U22?<=HVcZ617Bf>txVySB1bexzT+|E@dHJ3AMuk{jp7y#2DXk*G^~Ww zok$=D20b4Gsw3YTB;x0r73v|}FzBeuA`ocduN}qkru5$(gfv;d?>LH0+Y+@)g!DzR zZ}v0+QA2m>+7J_UV{z|d(NSu%^y2uylpIFyDdPGZ`on=Mys~!@R+vGJ$Uvav1qH|M zcrD5HtgMNCn!j@{ZMEepJ2}p)#dB>p)NRBha8ILHT^QnaS4rXtHt2?&-z~!zvwM$U zC<%u$b5v9^VvJx7+?B#DRJA14Q>>(`oXQlQ7P1EtRzy7AE>^Z&JzHiS->^#gnNa;~ zuxT^ehVp~trsgy=mu8+nP4d9^HI5a}+y2j>_)E|*iC7(5AhMiAEqOVikhAqCE!XUsTv62D?(-Os!65aR za5C&=KNml!at9J?;!;@C6a4DjT~b|c9Ay9b*5`u+@NF7nniA8!VQ#QTENFW&SzuS3 z8tIyz=xa=Q#Fqot^zaeL<(*_NQjO^LkI+*igYXh!)3`>IEc&yWqaiIxbfM`4^J<{8 zqHRndsL4Zxs_1MjHQK%dNt7SrqNn=%R!UDY09qAw48%}|4PRhYX)c}_^}U<#E#K;M z4o3&YRaSewrx;_g)AHP{o^%hz10S180!CRzgia0ASYSG9=^4o8`$EycH*aU`;K>tO zQI9?auzzK+-{_=t-^lcxw~`nM^Xjs%B)sC7w6U1)b;tb{5|L$p$!A0I+C)&EeQ?PY z;sqV}=*ah4J00tg_M#Sb>`qAZm=K-XD=KC!Y)s3_zIrI+au2o^+a{w!>!G3JrNtagn)%#Tpjxex*5w8EKLvf0Td*|VU;zL` zcL3nGu<-9eUwa2vi+@FYSJKAqmmARf&(jXyIwlLbSgR=C#EsH$mc`7*`+}W!EyfU` z)Kp_YCFCp9>}g(L*ryM36VjLT-*U$4-h_Yl=m31?uQyYS6-AJhzX0e7}Hbc z{(kS|j39y)bDw$9>l<(bhoAx_C1J=jW=a{vNfl2?VYcLnyTmn~O}URx1wDC4ROSMu zYwDMD0wUYhm5S~m*M^ujNhSYTmwQpkoA?sT#s}mCs6$s2*CtGV6az*grkmj7e#K_R zz(xa89{^Pj^L=x))lIX1Dn8agEF@Pfr$HEpv7uk^yBu;`Q;U?V^j;+%R5?VK?N{Jo zZ=ttc?<1L?8Fj3lm1#2pR)=p z^_vWkURrVv^L>SnPuJTOrslEv+r)dVor97WKr8uuW<=5|fs#_SN zmHuSD3Re>!0)#7Ms3zA&SGh$RZ0lv9tX57Le6XF}yPUVJ#?RlM4p+jPx!jv=>q*Ty z>($M`68Mcw*;EZ-#)e}P7(X9&+hB=-NyH_3x!6r*Hzr8CbtooD$@KV{;>-Q07YRZx zeDe4*Bu=#vs?%wu!bSzolA5P&GQxlr`5Borq9ZlFc!i#Tnl5b`Y}6D>{>Rr-1gz>< z@I&$>_n^_R6*v7!#w$(_rb!8T6X4{Mpyvu_l9K0& z#Uh2xZN*X&rWC@Wf)n$)e>SF1O#=;U)gQK+CrAkhlwtXqYHA~8XO|LVfjLk;bgEiC zzObEoc|g~2Nte$=q9XsWwX^}mRdOMfyxsuH) zx8%4MW*I`R8v4D>v>%Kfmx+^_v4+lmV&^U&uidd83CD&~RVt0dy<{455_Z-}7Nb!m zXT`CDUKKn&IrwaZsycC+zC%g8Je;0N^Q(S*(BRWt(QHMqav>R(WTW-+F>axB-3l)p z2Yo$aNPAn70g(|xO67JtIxWnf7JzmdQi)k_+b-!p_)YB@jHPL1Kb5@;SX zb%c-+<3chf8Y~j}24NZ8;zDy3@ohG8>qXR#WE|!Zc{Ut9(RQgqb<{g+^Fs0dE5w&E zSWnHkqvve(BXV=^hRtDrxRncH->baDPX^C!2PfcGF2*c2ZS3x!VzPARBnrkjwO31B z+nzXD9;P`zU3*l9yuj(e-7xzyO)Mi`xy0oJjDMm??}w*IKYw+D#q7Pd5tqL7im4t* zVL%;8Abr2F-){uekz$a*^-TSa!1cV}M6p6AClwHEVma$I`-^+ikbZ|pZ<6n02m{zP znlbbq#aNy-aFc3~P(?dgAMei)HjqQ>EHQ~>15VP%Y|@?O#5H6DQc;Q}$1(J)d>qbF ztF1eq*!=?ih|p8${o%nMhbtP>M8n3-oT*5}wj+)C_U6Y>B5GD^&2^)aFR=PHC}sM{ zQ^XO3$r?Wm>d|hmCYUVJR|y;R?> zaz;-=ge~G`-~xE^SX1vTiRD$TB8>#I1fyrB3v6*?OMgxDmagRdsvy4KXmA> zl0dK)^_s_m6w$hzo^gra;5Z7&>T9^I(E2)~S{JY(r-EuJO3Vr;;93iC%l~0?a`)1s zU*BIaAl*4ID1BH;!I34Q!!to6Id+nmQ}}&;g$wAaO8c~m zRkgbC-x?@Humf%Uo9U}{At4$laIpg+zDkbClp?r&pVqbaCc|?G$mV0MLTTzk{#hj5 zFN@)sW<+{(o1Qi?AMOM^^g|hTtqRa`sD9y)_iHNlkOJ_w3PHwC$ z@H2}_cTdoJnvT|Kdg>`CsR~F~b20wV;w<9so*8SLt`;1Ws)_*c+$;#G0Y%^Hd-91{ zkexk~=E|R0ksCW^KDN$Gf^5xLSu2`wMFus+_&~>Iq8&|G$f=rev}f-P8LJ2=CKS)A z#lop%b6O;Bf6xuYx8i4pwH;ifbts63HSaeY#A8*Km{6%5x1EhXWaP*!zd!MBv#LRn zeXY^E_+Fbm@u@C*MKioOeo6C`T9M# zpOQq{e}t3Dc2O?#Uj#yGWGRO8Zwb=xg1EWZc2+*+Zz6hjw!y4$`rl&k?7h{Qy}yZH zUZM$^WTcxg!w70{xMTf#i(0gja`56CikG;(`o#lGIB>g`XT;I&gV*-0N_6R3Dd`LR0XNMM(tYG6uB}p}@-og$A}WA0gFvwbH0+ziDgzr^nk0tdvJcXf-Ku0mb7cwaLKfzUCViY`f!fcuNy5N3<=Q05OtfxzXyP8;(%TOqitg7V zZRV2bhPS5%DqIsAgZI}*iyq2Pn#8sgIxUNdNBYjRiZaLZ&gct)ZsmprvzF8XB8zKf zaQLMf^k7tz*82s45s)V$WVW|TTnGGHqa>c%KCOdPQIY79P3=>wXRkLpP5Ip#Fp51z zLttBPZahid6aj`Uhz!#^yz9d{C)q8FCw82xN--5T$$MyIgH{dfg+?*0+~4t^_oxDo z>mj6XM$Fo{Dwd2|Kr3YGAXNf_Wa6HABTqo)pO44A-yUV!5neCrd7hu=+iTnl(oLn% z55HD551b*CbJhEA03GCeRZFZR&PbHLr69(NoqFQ~idh7>p*p-@&ms;0GtPjQd60@E z;CW9@V9%1dh$+5PoEbR3v_jle-SaRukn~H0gou@Ssb_Km$(N|8NM@Q- zRCD#oK&8Q3T9xY`F_sK0>}vB2`7v}7y%>|Bx_dlLNh&ce49}i>4ia1J;Fa0Xk+(D_ z9LTB?4+lvzn&nob@{*<5AFjv_^fsl&18QI%PmE_TjjAzXxpE~M;!EGizr6jUuXGMg zCN2HWsPcM`jiCP9S8_JgQ}|1GIdxjwyo(kQaB<(+CNS8XH-t*2tP9)!rB7!WBIs~7 zkhn2AwD@fLe5ug>LGM2L?S7jY|9W?9aR&t$^QI94P9e%?UKOK#u=i=%j1~n-XcxwC zQh@r7SFf?5HHk$HkQ;}{iDK>|~CL~bRZ+{foPa!H_moN<)ciAmt za+W-~wvyy*msKi%tHa+Ml~N*m6XeiNg$|U)*U@~Oh?pj5mQz>Cp5H&5MeYvg@IZ;`cAY&BIz7?2m6vT-^s>O z--zwOWsyRQ66m?tiY@e&6yvgvH2uBAq@-8YYMpl+?rJVEW|pdY%F{2piE&oyG`*J{ z1r{8SEur)}aeOdKdf$`4ch2GxqOP8W;cs!Nl^7|j)OUi?eViM_jwg8c2qHT)3UN%BV&PDhc&-&!pO2CS z;qtYk|EE0kgS`GhrYj3>_M;rLfhxR?=a;qd^A|Xkc?dZOjyyOOdVxvMY#*^AJL+Lr zPghOtoX@oJ1F19ORj@coeDlNi=Vf=H{9@+70|`d>CV}MUDMA=n>U4Y~f=rTK2AMT@ zAHFzZLT9yGroa>l3Q(?JBroe@=%;4DXKM?{33ZY+D>zUj)^PL8lz?YN=WT@_nm)}> z+==gpE5~AjaD_JQLUrx>1RELSbrvcMqd5VOI-t3t=7=mr2)=oKeRJ`OtAC3Kr$F?~3j;c_wWniodKQjcVPV#%>ZzT8x4l zAAHjPxL!VApp*q$%G)TpU!R8DT>E^PsgURAo5s)8-!4q`&20=3#5}MR#rQkt%fsu< zbpng;%pFio+ZG4OaJh%c-bgN_X4i)F%nzETSQ45>!8+w|`oq3kr1kVfMk$r!;n|;i zGBH^@xFn++ZZTq=q+gWpXx2yGPJ~%#hmGGy>3SRi@w+Y|z4IvF$&<2n z);9Ju`qp;8tI_+3q5qL5-@7g>TH-hIWZ=E%3jP(h?I&Qq*c{}HvI2iWq@c9Q{8G~` z)w<;gY#Y!Xc=(P|a$DHc9I@a7-&M}GN3PdXgB$ssF|63VTv54=#{nQdiN0P=A?N8z z_rQ;qK{`YZ=xkc5F7>JxFT1WRJ{OAv{(>deC|ttln(qr zr1sI(Y^tMd5Koi2Ub0*fl$Casq5LQFcB}2)o_h zz|Pd{a#zwR@k$m}ogSxDzqq}IYQ*eD&WhY&d zJZTpeB<_-HP*g0<*)mOWg2h+&wCD_rKiCEPiK zuuU7{`BwSGinbk{(h25SgN_}S+zGgpr~5qV1>O&1)~W5C&u-63rS}q*Aorh-;V$W$sQd;Xk= z5K{kiqb;{_^H4kLI)%T&P(@rc=+<9Oa?2^#8)`a#7c|o>g z3=Hj&2}uB~SQ!)_#WFI1#a;&m_I?eUN+@gf3Z2R?v`l(&IbyTq2Ly8~Fsh#46~lqU z23Q4|zp*6*p#Wc>uZi!)>EvpV4q-qiTJL@>Ez;K)8N3C6ahI17lOAkq@7=xe}Y+kYZp7Gr#N`F zIO&l)yPUqTe(&#p&8|SeRPPqiKOdj|{crh;_=m&PvJ!u<;O~by|AGZnznflvIokOv z@Yhpre?q6hxkv->R<7{ zQda-OkE8s7|0{v@SNN~Yz(3*nAO3*<$`kyxieHHoe^$|q^G6kbrB(b2|8)=XPxu?b zAMn5JDE^B7bzkC7{4vSDoBz))#joIB4fQ|4=!}1We=*yCt>ITw^UoR*nEt5YZ-(cu z_`jPNf1&|^brt~NzYLCF;eVg){|b*`{|o$&xnEWS>|MJ70QmQh&-(!3;`;6B{{ffl B`PBdb diff --git a/用例描述.png b/用例描述.png new file mode 100644 index 0000000000000000000000000000000000000000..17377e3a2bebfb10772e97db9d24ae6c7f8a2881 GIT binary patch literal 58215 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 NT}4~@sghOT{{V~v*7^Vd literal 0 HcmV?d00001 -- 2.34.1 From baf62ab238be43fc1ce8f9ff6ac176fd30c92347 Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Wed, 31 May 2023 10:46:47 +0800 Subject: [PATCH 15/20] 1 --- 用例描述.png | Bin 58215 -> 59210 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/用例描述.png b/用例描述.png index 17377e3a2bebfb10772e97db9d24ae6c7f8a2881..337833cb5d93227a91f035276eefa3b00a934802 100644 GIT binary patch literal 59210 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 RMNy1+wYBs#3pK1m{}+;Jz0Uvu literal 58215 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 NT}4~@sghOT{{V~v*7^Vd -- 2.34.1 From cd235e1340ec9bafcb6975bf2eb4a4a655b2505c Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Thu, 1 Jun 2023 19:17:59 +0800 Subject: [PATCH 16/20] 2 --- 分析类图(待定).jpeg | Bin 0 -> 153733 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 分析类图(待定).jpeg diff --git a/分析类图(待定).jpeg b/分析类图(待定).jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e96c37df219dae4a1ca76e7fd35bb024895782b4 GIT binary patch literal 153733 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 pkOnW<1EQOZ4ozSQyD=J#i% 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 literal 0 HcmV?d00001 -- 2.34.1 From f3c0985512034fa69c3e63292280b71749528c94 Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Thu, 1 Jun 2023 20:38:34 +0800 Subject: [PATCH 17/20] 2 --- 分析类图(待定).jpeg | Bin 153733 -> 0 bytes 分析类图(待定).png | Bin 0 -> 109017 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 分析类图(待定).jpeg create mode 100644 分析类图(待定).png diff --git a/分析类图(待定).jpeg b/分析类图(待定).jpeg deleted file mode 100644 index e96c37df219dae4a1ca76e7fd35bb024895782b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153733 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 pkOnW<1EQOZ4ozSQyD=J#i% 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 diff --git a/分析类图(待定).png b/分析类图(待定).png new file mode 100644 index 0000000000000000000000000000000000000000..714ef60a5e1026f1bcbe78ae902ed002b985a98a GIT binary patch literal 109017 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�wDMeE)zGhoRga6X`u*0{;&WgcbYgn5Ih zrSe;ygr<%o(@UQ{{m^Q>7DZ{otE}@EjJ?pq0YU_jft%hR;z=0ZbJrd=>Ks%%bi$%N zMEihjhS|LbT((ecJxaNZvN9pcu_uinw7A-)Pb%Tf6xQu|7^h@jCbEAPxh7dkiuaBt zJRthO$}iJ-w!}(=DU0dM`Ng$DX5AQ$3Z*w{IgL+P(#Ag?;))?qd(+s&$vwMY)Ykh% zty|G<_3e!Yl%s3PZCy3TH@h`yUa`H|NMf;_+sOZV7mPO{cIYbb`jrGNw2y_L2tbJ3 zqLK`@L-HNiSQGJpRG89YU_MGs1B% zR6j$r%y|gvV?#$4{MoTK)dDIXgE-HYIq2Dwo-neI4p1dSzJgWAkVDHK?Dan$8K(u_ly?l9Aa0_sy#PInd!z!m^4vY%!VaLPM?XMqaS zavtDiA>c9Ysyk|GaF&z8-0^~JJsMmc;-i!Exj2ozh<5Me*CMc(QOKcte{r$|#bNAo zQow}>M1(lLg3=1hCw&3%-?t;!U;EoDYXD2U*W>B>CobMp zu72QT&zY%w$Iln{HaQ8J)X|HpfB!WSdMu!oUow)}l&^m3$!oXOK5avq^Z)Ei0p}g| zn?E9*q_i>G#>&KtKs(!p%XVCF`9<|y;ki9&fo`DM^e*3FO3Vv`2|l`zHf6Cbs9Adv)*5Mi?X0M%Nmfa^UwA%=qrH9g`C+nk>^||y zGM_>Bk^(QVUY4Vv)fn?}X+5V_CR7mpfxI*1O`dBoh*^nB@Js!`%EBA|Vra!fv# zKeCp|*>T71PM~vQJ4n>0h)|W<102+E32r!_UlD(JvZvJ(L^%_PTxad;^MG2@h6@7lEbD5k%hPsds%eAUJf?7Jg?#T`B^7qusarBb)Lhyw1 z6rot$%*&e=eKnQ2t>@V6XH5ighJ(P1?EyxeHW$Dq1I$2Z8fjmr|BI`)jHF$;e>6Di4?(PnyyCsy8?pC@R1nF)NMA+Ao=Y7AuKL^9%@Q2>(URTUG&ttwk zJ!??1Zp|;NA2chV*~|YukjTM)AvT~|Ir7yx;|Fb6#EHyETGmFEx`v*z!cK#Hb$NOZ z+Af=NO-dwRUvq0masFl}t$jN!I{CMQmYmRGkSPM&R$K=-5&6FCIZd$Rax>O0xw9nW zWHX1S%$##D_h{|fBl9^r4i;VAM9Q9uXRdKkVQ80dWV;HY(pp|={H!v`{~RLi12P|& z(}{M5zqT?Hy7WwHI^4n|k=8!4E4rC+98TPW#7sXNr2MKQySqLfXBllqsUFp_`u4S% zDi%+T#f&MbX4i7J7+6Xtb3y0o^O){p0HYlV`uH~RcYGfm)dPaoY?{iDh-Z2tXBjiB zLO-87t$U;ji>{=~u}+JU%uU17n#x(O;=jwTi7rq)59`WF0$Poc)#s85rCe{@lo1cn z_h?_9VxUajjW4`*EvnHi1_|D;kN!7i+Sd&e%n3o_F7$~vI5@~-ih>8!Lt}JbJpa1i zEpYk1G?FMbwY4&p6@w><{!;Y&@f2MOJ;+yMVYmI(YNQq8Zsl<>geaZMDp%iF-f*ks z+qKke%4UxaSC5w9H&!oG5nqR7*`epcE!H$mdJV=E*$de@nO_}muhcb;I`GF(#uQZ} zZ&_Phj{-S5K%1~srDPR!s91jH;O_ZPWOa(=iPhLKN2zVpk|c_aL1*-7iddUrKA= zkqnzps=J65>UnG>VNghrQg-UtwQ)FZeh=PdMNqm_nTJ^p@=a@vLh&PToN! zy>wZ9B>3RFKrwW9D~=8?w^VgrtoKH6LK4H7<9=#46!LC3+9jY5 z_NJf95^jC^VgLo7l>X;?48c% zVb!+R)&A99NlthA>yNNxRR&#wuzR#EPm2S+4mL5mMUDNR-=8{?obFI7!*8keOUa6! zt7P-;!DLgx?)&MpDu0;>UJ}aoRp(vGA!p#l=eP(h9G)U>7pj+*fj+i#BUjoWO#d~_ zxc+hJ*Ahk30*!03l07!o>4a1n=}~N5Hec`GWUuR9zRqqX{89en#WH;EU+?f|^nY_Y z>2z4@?0bu>qRT(U7%t7h0NF}yp2a= z2nkFZcdR2rT>u)OwE-Z`AUL*v^sJ@h81AgR$4aZwVOGOs3goYB0y;l70|kCZux*wn0yN$9`EkPzk+EeM|287f4-&8~pyrU(Rj-h1);# zdjdIn9K6p(a-suQ3Zh2{GGP`)ABTHO+KK`qBW8MVOCzR^*p{4m^)%5&R@w~Q5Om8* z@GO#SKxc}+uSXx22LGSKTF_)36SyHvqr?w@d4Wli2l_)c%M1Eo=e-Q)gg(RFGCisZ zjIn2;bs*Hu@79gaexDnQQ2J6SCq2rsfRQNTVwSl!r24341fIuLNpw_xJf}frv+GKE<-#x7=g$e zGd+(v7pb)$8)B+%tT|^pFy+_7?Okmm+hg0CIlhFhZWOeErpSIo{|T) zl`v$5ks`EM7t;dFp62B_-m(?aZAe&iZ^t}DP|zz+o0Z<%x=re`V(AQ<^5XpFp5%@k z9AF$B&GLQt92S#yIlghH99Lh}^1)qOqy>vZC&0Rk;tZ%X2Ky-LY*buau28v_{pUY{ z#v&1$X>`SlSBT>Nj9iEu%ZEVs2`WSk0q*R(W5g=%uE?jLR=V2ewE-(DWjJoO@;>!> zgX4%862{(&CQ`zxfH=CN&EzLl6Zj=IJmPbjy!TXlD|@tcUZnD>R~bAm^3rslu^k7K zGL)sah@4~w7)M52F86oRGcAh;!+&(!L&|&&)(b%Al=B_?UgSB^H@`>UB8955q>}5x zY8TAKzJUPH&(e2a54mO^RL_rprfZvTulV^NL5GqQ@|dWo1tpIAr)Oh`bNn^MRZFar zyry-1xd{c@^?u!})eH7wIB{tfKiG;s-TlOe4Gt@B?()fAlxcC}L=ctWIuoF%c&?{i zgA57*14S^Ini$6M zLKcmY%Pcdmx-Auzw<>~$j1=z@IJOhlbMYZdI=%|_r+ylE)Ds~ND?NPgj$K|&x}qn#?7K`2o)>>Q zJp6ET*u0xo;#pAA}LlFU5?Tg`>xF*D&yLk}FtB&OQ#u$)a;q|9$snNe& zL-C=H#dm>Jx&nSv#M8hF1oC@Q(}gkdSc$k8kE0q=KK@2ATM1mX6+xFj%?oi6_0^UU zF~D&$p$k;hXXR}ZCK^J=N{>_7)2TeK*zyWYu!D;whg4$l1^Fu6X1|=B)oRSr6sPP^ zGmWX44eqS}Y4@kS1`SsIuk)(irhWv61ROwEWlaQUwfZR=6O91MNmiXTtM1|0%y0@0 zYa&cAlU)nvA7MiHGwd%GYm?9P-a}n73JMBLQXxVDC_e>DCxe?)PvQNUupAu(ejcEm z=#1Y~yjzv&;J!2pX;(htEf(;RH=?rEuB-w?Cz&rUAd zU2W=AuDjkmsNGthCMJvk`_d$Il@R~rQ$u5s>e^KS zsBm~vcijr|{QUN!%|X|j-wzs-p!gCEiF707s3Cst207Fit-j)%ZaSUpI45b&^JVg* zaiZ_-`4+;iZ5ij%y$wWil3~~GF;k`ny0$;SH*6^*jdXx9e>d9v=z^De)Ogh^bbr6a z$Mn^EmdDac4fq`E?QfB4?7+S_L{d}uVw)5BKF zVF6dtSD#0RPH9^=?yHM z(_vyif`+9SE>z76w^fhVUvB+_Fuo#7q7tCkeRbN4ga?`r$d~#cSxX05U3fG@b+v*bVv!nv4$JpdD1S=E~VI<#0DQ z4ghN42Uw5q-k>teLDjvP6lan{u32&c#8aU!NMbeG0a!w{wAgg<6Fz9VWj_3^m>z&Q z7gWr={%^|Y%jaXwlok|fO|ra*9&>6$czcPMQ$!AQfij|8*#JWAY^%ZD9h`_U}S7@?0{CaC`bOr1x*C#)JLjIG3gJoiTrQ8d>G06kj zW3RQ+wjLSNWzSdz#p!KhmeMNE{ibp?qFKQa{`!pH!E7@kDw)6!Ao-mH{4POU2ni&t zWy~OIV7V+2VZncp!rw~_|4Tvzd`%Sj{PMCjT0~9BHE?tf|M;;tQ7{0miH!7g_O_3e zt>-canC>8J#K?P@Az?@{|5dj|dk)gY>#^VE7GW^bsQY>%xAYJFd->8tn-`2RDTS?O$jJrw}HzRypo60Fd=jJ zk_N_hRPvFY^pl0!*O@lvBVlHWE>?T2>?aX@;KXk1kIbD8aJJ}*Hs z%2bz>Et)6g@o<+epUZ7@3odBfl8f%u&elGCJN|{-`3l)J!H_Np|_EpPncq+xF~7-@@uQj845`~0cyMJS9DgEGE9F>7J?Jt2weHOx?A<~(({`8D60chQtJ+Ca?zgBA1!b`NOo&z1E z_gcX7wV|&S-;w+XxDO~`9{_{|f#cLcc!6+=^Ch?Uygt*rSIZ=}7FkXjbw@OqH-5UA zMBZVh6KStIAjlcFtt+LOm!m4p%fTP151!%{ge1`3QT$Q;J{19&BDsLV1$6JhIsXVG z0dKUV99O{ZA>zzTe3yXG(t+A)RV94{s6ST#yn;oxlVrm}WCN@G8iyB{MGo(gd`9+V z&)3t1zP@)Ioxpi<`$pGRRAM0TDF`$Kf@r~LX00R(=j1oZz=ISg$l=IrL)CsYpWU)%bU|+eOxn`LM7Z+zm1A zd-UG$mFc;usah{&@cj94U#p{iQ87Z|d+}y{|Me{WcT42J0~&ggod@SjW}hTS`kXAB zr5%*E2b$A2{~p6%0BF~jdeXjpM(i{uCXgcXI;;jqw5Mg+XtcGg$owV5rqr`*R|_<# zKyX*terLHgm{cGUqkJ&nG=#`~tf|si>Ap}bep~(+rFmQmGfG@%usV;3*A`fRNaJYY z*;|za6+7L^!K(p-iA0;h*B2Tb69N%l_``Ms{;Awr!eZGSYClJk{En`_>ikU;A9PfYy5M46m;S%AracnT&ewb?RRu$BFgWv zZ-kS?cwfwZJ$__jtXNf|*&-D+xi;Do=Ks0QT_wf+s$4fnr!eMGZ z?M8+Kh@)A21SJ0US{HFZ=qJy$;yiB{*0r$xNkxI>>oY0}sZOQMGt9cW%0;ruqd@h+ zM>P@IH=p>yLKlrO`R^3~c37K5{$Lx!RyW+uqrs#XR(d8a zd`JRYqK>Yv52OqIHw>67W~msGlz4}@A%5%Vl}OBXamN6y0#s2gK;UpaNLM+Y-Vo+N z*g%eV=`J6$Ay{MewALry`77Cq5)?qe9T2b_m3Vz>;CYp5+pEjU-y+8*7uHCwh_Ym6 z??g1kprih*0v;6~*6Jaa?^u{WE&S<1t+)kS!wU#I9lv=Ec@9Tz8e?B-z6ga4Se5%-4EGcxvHwyHO1i(@^$ zs2l}`?1LJUAyzg(i+llB(a4qS1iT-g~3;rclW|8g~xR{MMlVe|IeNpLA9cj(k z%Fq%G@QYa%Hw~fkptI!USS}7OWkdKL22rI?z;1fjNqv^jW23SrFl%1^?#EI5a&Kz( zYvUe@k0%zJvSUM9S)I7M*|Oni!AZQfrgU_hI}poOA&fbM<1ytN#9Y z!Dqqws^KP(0K$5{>Xicb`ik4n5DpR}h9jD5NQUbIJ$t|0p_9m})`fTlU% z*Z|N(4VjslAnbWryK$N!v>7jUc!C}q>HJ=%9ECrn?NU0F$O8e9+;`qeY z89HW85n><{j$oTT{Kvj~%Le(JF=+2?)mIaWJF+#GXJ?4CuUK^U!MAclmGT~9)4{>Q zS^>|Au_tM0NG7_H<2)&CpDP5S0`hzq0(o?3=O*d+08=hVj7vHQWZ+x^!lfT|W4L}x zgjE6o(#fEj-D;$bt~iSYUd_6x^1DMugs~G#f0DL!RweRq<_ob<6tGV0^t{i+xtHF) zE#I3e8Oz|R1Zw=MZHoM71oAY{C^~71JvD=8?f;_%7#RgsX~4CFfEt~|Hqrw-Id8FO zR9VF2JZ`L9>~NIX25UZkBmY4(n>`quIeGg9MnO8mCOG-$X04`og`XC^%vcG+Q@Cfnu#t=N8y9Lr~!Y-S8IN(&n z#_%T)P!G^iQwm~Lx6{)IyO%(>+Z784 zGCLSluT}*uvzvE-#@-u5BJ0O-BPGso9xM_FYvr0lDQp>-{gi(JwZ&G&_{rG`E|_m1 zgq+LIPut1L9?R5CeJvh-;=oEi-{@wpwE}3?Gost$71&Fz^Muyw+MoYo=PoG6Rph0K zx`+%}cXUWu{heSIdXeKI7n1{C2WSooUe6o}Lp|nq&@krOqvfkgyvoUaPl}`EL3qqHq$5?k(13{NS;d`w4aqn^ZCl_;+W^;qusSZ#S_clp}kC{ za+XJ0LU`qcvr^AtX}1rd_bmN<2yHX4Ydz}+)&QW~Us!6NUj!BU5Q7WQcl{s#gD{c- zzAr#L%^U86Zo+(xNfc%Br%%(%%k($_T1+KrRq4;XCnrrkJB;vbXo2W0akZ%J!BkC+ z*2Gwr04G*C<(&&=vtr?|BKqtM-vm4a90v-KECg2Ze68_Q@WHsqVC zSf;)NzSE4^e_UF*Q5onm_G2nRE=ua+hYC5w0$(p~FaW~EOLD4o*IQ^nlI)Q%XUH|P zGZq*uJRImn+tvb+56velW5lDdS6t?Fb(@_7kmZ52yy!slv;7c5!{-k$cxN&!+`>S{ z|30n9nI4_n<$j88jSI^`ZO`%58CmXsA^v@v37XcYp#z)E6+I>?y72GrfRy+LPyZ|4hnvro^tmPfzs@_n~W|J$lZsV(qeTh8Ku3m!Sv>w&V%&76UZZgXw3b1x| z2@)BrN@@;vPk7pWj$rpOND>~P8eC(LEdgUrbpnMXqkj8+yck+_ha|W{I}A%99Sa1j zi)od2dvyM}=i!dE&U?x}EVpk^J@G<_5W~z9tT=-!!zMjvbJxuY#j{Zd^!dfOJGiig zWdDeo&zj3p`|R3u4MQxd;O7!@$`IbPiOc$3r6 zPuIh#MM_KfDMGS!O*F4w49U-t7wmV4m(3PiG818X)6;y0mFjr5Jc3>Hl}uOshd6b5 zx-_4h{-10?#$WK#un$i^$*><&;o{V;%VjH9Ns3g|V<~F9Gv9@aTNGn-AYdYL6&TLr8zi(>%%It7vJUI+O%BEW1XQ=)$ znvv_s>^uI`CtCy~MSS?6`fbiY-nTynK&s$7JOwoffMsMM{|jMYNX8K#xwb%Lm$WLy zsWVWFyjgs1vrOWC1U`c5dP&#(j7yl~`ED9tE6dW;k}IhcSp=wLX8R_$`Uf+DU7kuV zxL_d9DthtTS9hRD2IBd#tNs0bDYyWS?KHEsqaZEy!)s4adr2pPZk*6}=);<)xCSDR zAgdTZhj~LE@Y+|~S{|vk=Y>0UGf!47G|g^iLBg4R?jWjFUr=aLz^uhIx4jiuCIWdXHxne$gU*4Y4-ykT zM4+FU|uYds2I)|)`4Df->fw>`%MB!EQIEGHcvvRkmU}VXU94)G7IwlnC!hWD@ zpisps{G%|{!fE*9!r#I;FbOTL=B{pSB;Jtj3ghg*Bzy+M4m$GO{rmdWMt#6qsnYb{udma=eatri0>dL1_dq4|?Uw%J?oD zl%T2)rjv5?6qD8~=va;7`H-x#(o%~_^vJ!yGZ?iU_;&?)E)-Si@i{k5fJOV18P=mK zW^mWD4@%^J>I4yZE%;Sa17vxr#<3CM$p|KF#{DS6l@N1ysuou{Oy&ay{bS2Xdr$8@ zuzu2Fg~`A8NoH+dUV+NQ03HFlnl9#x9!9v}R1+!FjKN1B{!T5fWR%JvZvxCG2JGO= zuAt~-u6em|BjAF^AdCVMVQ^Xm$3Zl`)zMq&Rcxb;4jV{FNVecQ2TWuGK|b=ffERK~ zN)y0IudSl;DiFGAk&TsA5goAtN^$mC1|;cH-(JfS@c=G7SjRzKkK$hgd`RnZISW-P z-*$B~dT(zkohm3v8C_6S zAFs#G$Ws>Nhh~tgX{nwQRd&dmMs>)q`IyZ(?DkOy9cyAqF|~P*jvq{{b37ILbPy=X zBE!2v|NoY97}P-!1Q;&*0&WC2as%Eqv0DZNZ!M}uxH_&jIlU$~CZE3tNaEv;N8j5~ zmap*F@y$o|O9lfy6+$3V+rn4%B>(5f3`$7`)zI!O>iE>MPYxW4d6^O8iYNR%b48`0>DB$~@d`b-@iR>eI!Y?3hCu*^>f2AxYEu0TqD4Qb zK_j4iUI-Ufq{M)YK++?Gp@&bP!l(&62+4(sdKLwP|9nU&cPqs2+ksV;D)l3ZtRUbXWszUtiN|x zL0oYwAAp~+$cpR)u-VZSh2W%wk)eveOp8XaKAjZBFLTB0-mD_13Hm+UgYr9t7GL)) zsJ;(YX==THzYNaJi!mXR2^De?_@$8M zNxox%55;>~oEM|ohoB}II>>k2XneF-hYGk7QE8gDk&1Zqvf?$jpzya>w+`H@y>rNr zOS~GxT0{h@SnA3$mmd)}>X}<4Dz^0glk$aG&OgcswIHfJvgBQkgtF8jTogOgcSXFf zX#7Br4ea_-($cqpL5?zC1+)U7&_cn2M!k(;Z7d8^9xsfJ$h=7%&RqHg`R~L9PuJfl zuKxw#t$H$;n3!&w@7X{6{V_5k9x2^BPing=Tp$$+V@E8jjlmulQU%Xmg@g#3@=VM& zaOmUW(;;mzE8rx+;I3Q=e%L<3vjo={ZKF6cHo@b9j9X1r^HNe_t# z!7(58jOflj;e~k1Pzuw@bm^;8E`P-uWR#aR8H?7%+&Jy`hXI;jsJ!MNpw`rJ#ToXfqy#%+xyW53f!J z#Q=*%&C(f@)>f7oGC@Pbgv3}-#Ihtq)AB#w~B z5uovbx?!d+#1dT|(l$SpP%2R%8m=hF)nLmk1h^^^GT!ghb{+gMoTPSOZ3L zJr;w&#V{M7-2VhjFW@1}ArIGgkW|5F+XdAcaQY-?WyN@3xYLcR#)wiHgg<-Gv}ivp1O#g3{45GWunn;YT*sBBd5_^KR_G{;V1?eaB@6 ztCekok7Y*uf2JV{(;#MsWQO7|@i}fvf%B#gA&1um$p{fKJ#jhXH44G65!1#F`z=sl zMmE#tP$t_zAwgg}AmVjS74mBzgwKR$hjGdm3q$LJSDqijF1JwXi++x1xpA~`N{D@lC{dF%8q!CB+=Cjyo0_- zH%x1fZy!Y!={;Y4#qa=(1dKFwr(?Zt-gtn689Sb{9L?3zmWgut#-ZW!={_T`tWXx$ zrOip5)+Kv?(mI>jMjZ`}htA@30Sun31%oHe#H7XkS{v9(Z$QoI7f^b$5*p%!LY62v`vodJF_amc84S5qWr&aIYTev1 z4Q4$b{k_F;cy+r4dF(P~S`2$w=-yLvzjMNlY97nfVktK434Jki)1Em~ZrGz&+wT0s zmj^~IhLB^VNp<}O9F`UL-l|C$3PErSNDeL-@IOH_4T8t|dFuKVIg8QoTmO!h#J@j* zkuwFkkiT;LXWvZAabZQD$w?}fcAgR9$(EoG0OSyw_w|Ns+Hz_}e@XzO9}+CX4|i60 zgKw)k@37hBfVs;K9H6~00h{kLC^Uqf@pz-q3B*${96xHYR!p<#-Wy4JGzKTll??%p zRD2GpyN3%sXXd%`f(PQv+1dU9W93si0CWxr%%Os?@x~nyAl$}ZXF1)55EhJA`B}G0 zii^oD)<9QwZ)D)%)hj%Kx7?`L(g>-}laKqFLMJc@6SCS*0x$GGu)E^}54agCVvTF5 zNf4xAg2wZJ6ZrI=jAzgUjE!s1*052ig(&6*STC7{*SemQ1oIJB1nrzBf@59 zAytc5Ge#oNYkxyX;0*sL0;DEFUf0&Da_Tm~H28O?>6U57op%<52(cQ3MOw_r zESJR3DN8Qx+3>6)sO3`ETz{PWfRI_NPBcT8e^U))JYC&+q+r&XqGIe1PScU}kojNW zB^m?b$&v<{?izqU`+#d2;7=49Vry_->|X1Q4f<_;i~eEOt5Z^sqosT?l;t+a_DU9$ zd}~1(c}wN$t(UKiQ9J2}BwnN$I=!too=B)u365}SpVW^A zFQG=qGhjLUXB5)e5m&uI2@&{b(lawF8X7c15e5)ez17ucff5A|+HO^FDls*+#A}R9 zh$zUoOqxQuQZustkJ2|u&mzK+4 z@AHTnaxvRa?3(|akuMRDq58+e;Jj2hJwY5}O;iVT2E9KziMYnYATXj29}btBUKw&C zWO3!@H4lEZThHb=X6G*G}B zD=zj?bZzP-LY^9w_x6S(zY7mTPUmcznkiB~2ux^6*)0!etS|L-$=jBtg*x%kviJ@( z<*3eXUVds4*Gk_1;U26V(f*Ko@71wDTlh`HOA{@sGPIS0UayDn9yCOwU@L4E!@Kof zY-*_KnSGB*gdckPS`5j+*FryEP^sj;e!2}9!vnEIQS)vvM8a#1fYh-z1>)l+&?e%{ z%_|;csh%H9)aO2Yd7HmW=*3gEBCta=M=s~UrgRp_ZADBv6|o!j;<|>mG$pxEHW4q? zT0@$YMOIPWscc$euhd4MJ^8!kFBjS>ZjYSo^_jVw-7j>0Ce3vT*U4A!BQa@_G zA8U_xeMAT#g8ExMDza?mz7m~BRsaQv^c$_Z1gB_l8F z6}Ivt6XFSahZ|?r-{6Ow>reP{p|Nhim!AGv6wn>zjzd5zvjMcS(_B(@VuCL6)#A^e5uh&h!e)eaAOZ$RZW9J)N368*5MmNkwBGZM ziNUsVksiTM@R#d=-}4tld{hXpF*#!IV+S_o$+)nTmn0R|8kE0D)TWwDHcOj#7+tJc zn@D|6ucPYjPVBY0wZeI9!^3x6ux9f0&90J`lD^k?Xr@{iq52z{lfOO1+#5zUlbA1( zSgPR6Q4+Xzn5;O3x^Ru3fi-gbCjB+N>&S(ZST7ZdMT#EGV-+`lM~_2DOi7>BeS@kl(fV8mJzVn98Be*%NeGd%1M`lq1*FCHuc}EX|?`Z%FYAN~{OVoZaRX5zpku-@Jx(*(KB0zB zJ}WL`zI)BqLXFp~BmX1g-H5(M-8`TRE5^}+Ik4v{Tv{zu^4^k4(sD*Bb;oDd zqD6I4M!LnK2U^Bvq-Ro?k)%(z!-f~Ah|7-h z-%|bR{rj5(H=*v9ulD05V^Tl7@_3$AXttJZVfDtlf5B^j{Y&9)j+n3&+c}yD6Ep5^ zMidzHT7D#W_$^4=u3+J_QUMTWXwGibtwmh~!Xcx_j{|H)1;?j1_{=@EeUEM2Re9d* zc1vDsn;|5B$2zu|%r0%`?S~`T%+&dpt8Sv1&b&0mO4ssy`*3%$#dX6zdpN|-ul3N4 zR^V<_95-wH{WGN1_SQx*mcp!hpyx%_i?KV$jIvogty-=ubk}t9GIsk*n%|v0C@z0y zb{-~5-+&Zdcg)PVucysStw7PaYOaEz1L%=eW20JsCI7LPy8dp;Eje3izeFEh%`L$Z z#?8p>$zKO|&XMAia{3TqMx1cjF1~y$e3a$3x{xo9+)ys4@FBxz*{!8Q7MDYSr=?US zbN4AYjgGh|5MH8))NcMy0;smV6N>V7E+>i6kR1bm6mUd#mQ*PlbTu`(fsqB|*gil( z2Z>CeRFIL7s=QP|$il*9N2=QfW*c^}SiN75y3q4>xcgn9kaD=Hn(7oq^`|cDp$zcn z;;9|PUWc*eM4KEYGpxQE;x0H&3Yg>5$0eo8caUo!?QZc7)*= zL$3We?Qk*9Bk+0w59fIKR~fHZ(eDxe3uGtS@(lp+B8&1o39;p+svDPQ|7-0`4Y0Twt9z(hX zbw2K90%CyzS`w*fHh{K}nKiz{CE zj|khfy>4BU%!tXEZz`+Fb0+EW9rgPOm`Zgfo))vM!^0CqSg{3d=3i55#bq+)y?cMT zbo(>DI*)ArVOuVnbHVj;p3kwovU3haba4<{{?pmLZA{-oM4R=O)BrseLcP0XV@tIe zRVX_-z2hc*R&>W6@#u0$J69}EvEx_jz0Fg8Z zYiKvA=ixnfTY3|n^g~alydL|MwPwg{H&vG#l?NRuR?4&MTx=&P6@LD*9}1w*ed)*h zI*K9WxOOF3bU1a4j&bqW@&}JVjv$Zh=mK=k>bm{KcAu6xPwdG5XaPJ>r+OG;jytkE z7FL+fq6bC;Jh_8~a8UJ|7$&=D`2bj!uIN7#tOMJ}IxV(KNQ?Dq&-)vX;eMm0 z_~IJz7xE|7^M8<(tHr)s!XD&_datBT-2nq@-Z^ALLcnk|uS-_QWxHMk&4fp8Fr4@J z*NsIDV2DT?m_Y(Y ztuW_y*(a_1aW%d@=Gn1Oull=W2b)*7@WVBBO>p8%vK4K` zHl|VyLqjhuyz6wLY-QpjdoV@t@y>Wh@0YPq|ttyVV*hl@wDWa zUNui7syM0Fv-J5cMsMiAo9?cUvu#qxlHj>!K~f>|Kv1~}#|=Hj51?mH&G^}1M{=$T zu`9wygX*~*KsF|PM>M)XMavEa-59jC8f zW`EHTEd6Qc3V9g&LVuqz=MrC^h`1F$LZb7jdh%qmS)+DSyuL?97Vhn9Dx}fAdOZ`k zuDt|gtOxfU3$Jyd4utCl% zZ!tiF2?>c|`fY%eva}IYv-GvJJVrR?aL03N2jPB5UZY$Yg^j&+*KFFEWnQvv4EQiuG%1CEwM=I1(8ru6n@s6C(d-I)igSux% zS!HYk%l6n(RDXU`g|Z#g-E~@@(YG-l;)@H5=+Zgf>}*HyR@3SyUr|*4_n@iZLD6C2 zDz;^0WNK<_0XoFd{i3wA6h3+h^gw<-TsJ)a>3H-4Y8XiM76$)PqlwaZkpORM`U+D? zGy)F}OAXEzn$NZ81&)CI(r)jthtz>y>cU|KHXRpon~L(wi>ax}l|li9*=X58z0KBr zDzW@jmNv!V(6rQWO%H3T7Rr_w*&vYXQ^5T3svym7@ZM0+xO1m zLvkxd2Z3!Plm(;M*2n>ea%@~cNrp*)EQ9AoMs?9N7~in= z%XlM?&@BJXF^``OgY0Y&hS4RDnG-HU0x>9(D7NL(4gX-`o385H9GJvJ&h>gH?4P&f z>yZr@D#wjJ1f*ZoPE$zQioR4eQz`k~5b;&fT3o@&=A9>J=)Kr*7omXK&YMGsGYZOD1L4Q3;%Qa}gIA8RQH_c!Z z@=hSqG6#q1OZ8J=(@CgB0n*2u_Rcp{S4gtwrsmgd%Wr~=SGOr7V{_xcV3P4ZJOWvZ zgx6*>8?dC>je9=(-_tVHU^i6+30RRzJ3B=1q)_+?P?{1X*{+eLr+|IAY4FpZ2#^UoBn&MksX(-j zVUrw&#Y43oMbWnj^pVtZie{<_eT9K@82sSaH?m#@-Uv8kY!p1!w^|`!IFa7O4>vV9 z-R{q_079v|`wf}G1U0>LPH|DFy((6{pw*SlAc)aWkl;Kh4~K{+44&xUSlpUnvmRzt zEZ+WcI_ZAvrq))%cJ9_&Ae;AJZPh@UXWs`k@deOsJ>MEq1ApV8M;SnhF07v4%b)Q= z9E2|M+>3MaBredpoXlcl-;x4y&jtULYW(-WrIiuOeTdo#cQR8x2efJEzaKhbUf|Xa zSk^5bxfb^Bt+X_-pjL=Oha!CXK&>5FUtZpwal&fzk-2jIB3WB?tcfLznB~$FKkuLa z4Sdb8Y2YLvg^6KzL5SM}Q!_nwvckR;FiYFbw+;|{9fAst&Cm8WL(~c>=w`(5v_G=7 z!RPm?ZaJ&T&+Xd(ZX6Jz*|l8k+ZGoG2Jm0X>1YMTQ9Xso%ouC=^UMJ+q-(+0Clb*9 z0BRi|c$n0-y?4&LK!}*J4u&n`x>WP`f0vV5$t~$H^^Gy&D{4@!4AEq0^D%kzSRt+_ z?MguZAWGB3|8Aab4A4f0)Y*B2gh*DsEiLy!r1UIDaCo-L{oO&0WsTe8~Kz^uM`iKTg(oA=JWuR(kUm0DV%+Q z&V0Qg6gyt{5?vU#?d!koG&Vn}{BJvHK|2G~ntAnWw3=~xy;g2EHm8Yv@#({;r zs+%RB3#@xbz4}+zj2us^I`ei=d`|6^|81vuVHyO`;lcbQHVc3LNrxWW{Q_{8FSo@) zvryASN#)46Jc&Gq#|!>QiQ6H;zWE<{A1e6Dt^6^m$N@r^%26gcDM>z)+hMjsOUa01 zgfieeB%CnA_4yD({sq#73gD*bjL*Quvj;Us+zc?$W+at`0)T)dJo{|pg})>2y6hJ9 za@+3~eM%u~NI`vSE5`eS;}e@W5Q0$5cm#PE4&!@n0D#ckRo=XT%1ABVPC<_Jj;L?# z9e!!3=rA))oM7jRsfk;R>-l@D8M{vg@=Ej9BJv~tZM+s(T*p^e#yZ;Ck=C52qE!_1 zZMTZ3B@8cC@2ixN$g3f*Uy4Y?_4Ei8td|UGds4)Qe}G2(zELqD zIIL}fnY`W54MvprwT|@l^?{Vi9SqRX^V}-}NyDw7?P_i>jM=49m#f*CZfYcnGCzy1 z!^ExGCqduQ&cr{p11`IH7Rh>ZxxH9Bml0}e$KwvJyYsa7{H~gXdO^pLT}5iY)nx=Q z<3GjW8{Q_KKoeemeEsfDrQ|d6$mH@pgr`-hC(uX4Bo66VS9=t`ou;85`5UZ@`!~`s zqxu}H)VkUA2>fU>P?&>H&S`czN|e=RJ|Rjr!n@CS;>Qzf)#5CjWtvsrcux|NEDW>p zl_%a=PH2pE=UiGk?czSK%2l@Jt}#c@qn2S#R>o5|6VyYau)c!h>=gQ$(*3M?Y#ev3*H^KWDPrUZ*Tz5g$W zSp&J^!f%0G6JTu_)8*o@bleUZae_CgA4*m~eq1|AIa$S^%Zjb^?aWKT=C?THbc>w% zzs?_n?=c?MK@}dL5((A`|KE1e#lG$UmTF-yD=kWpua!!y1TSE zDrVc1;G>gy+HI+CL8nmKAgH3gq5?%n@-Ju*02>7fud{i4oeB{mP^^JQM$f%`Jd2p$ z<*w2ZKdxiJ|J5P|ZGn%S@G3{Y`l0}TErQt}1PT)wFQ~Ql$)R3A_ZvaNJQzx*|H8aj zNIY82IXels1^^^`3=+*H>v}<-J6x4+Z4vVLW!MQ$tmxPmFGs^wVZ!t@2JuJ7B{!M> zH+XQ~rSNP8MMJQY=Xv+Rb$onK`vG4;J7=YCj+W*nyhkPF_=Yxv!@%u-; z>Z{Ui!hi!T1as0_Jqte~Be20(gW=TH%U&V9fzDG2*tWfWA{9SQ{_QRI8@KLiBc# z^{4c<+gJS#X(>?B%UNVan-G^yxf+G!5Hj$|5PWC6F#W4sF%pLYuivNZ?LL1PHLDCD zebZ$62<|_>R&qC^ZTCb$)p+DN!k@dFHzAj{zV(S$N(m_xLC>btCHlF?k)CojB5)cX z_+vp&0Iw~GK)ivY6~b6b?g`Bm=gdnHcC;m<-jm(N_Q)t~zFi)Bw6Q%=T--ToQr`!(t_}PR*+n)>6e zhXmb3a5}_Cs$W!^9sj5##W}NYtjDR0p8Gf9I1A)A2SdD*VDOynd{tMQ$cfoFM11Ra zzd@pT5V%~k8uDJlB`r@Dmtp$a!xgXe?#mF0Zud8>2yI9=ar2)pmQ{%B18MU^1vp7)w;{mclN5v(jZ?n<#Mu8Fn2;l7HI^n!Gs{?KR-z~l>|UGXn^IY?kK^dEtr#JI%S#$ z|0Le2CHr6TPCNnDHFG8qVgtL%381zAAGW?Ss;V_=mr?=gE|Cr?X+gR}ML+>jS{f;7 zknU~}kWd;FkWT6D1_5aakxo(X+<3lwzaRIEan3kHx7)?uYt47g`BaBoDLCV~ldER!wO1AuRCLC9F&ep;mAxV4J8@K_1KkHC{c zfy1>#oxiH5B7s6u^&fKIEP|5KIyYb`Hpnl2vGKun1K9N83aQ{*K{IGx`ilV%1MLVh zu)+*$)vXx9Z@s!w8rL9@AuH*q5LdLXh|mXcz&4o<*KdPM`-yh64g*lceQ|`T6+G(x zK0y3vMfwe82t6f8Fe4#B)UnbIFnk z!vC$I;4fNu(x4l^`?VUkXC2>&7lKrmmkqfH8e~uyXb7iuU-qyoW;D!{@yIU}vk6UA z!DclzH-c-Hv+vqRB&ZsfSU@`oOb`9HTnR^Tb>h>q+^+JN&p}>@*x?7K3ugNzDA0JK zPagoPH&z@#eScTrHaDZVqxzre6!TyDk|UJTL$YNpbSk3%ZtFkQ-b4O?>rpw_p z4rI#LYT*>si?KyZq~Vtiv2)^&e!Ry2`VbRopgaf%|IUH3Rj6ePOKVmT#ZHJd$Yk#3 ztKYcl^CUh3r=f&cY$pMdBo@E`9dR2&r_*JxwL=V8;l5I{22a)tvcz{|qc^;%Z+%9~ zdTAZaycr>MRQKM&<0$CA!$_f-2ASPxc%ehvss1*K3q-ei5>%CZYoMVEh4`z)( z4pDNGE8xFf4^8xKzm|* z>65xYzW5$y-x((a;izYF-LZJ+=Psv6HbJv^Nv+c(DS%4lU@ex?E=ToefiA)ET-P=6U zNq56B`b^)UN&ZnxH6~)&cyEw?mmT70w5%j~-h0>T=Of7|T@E#h zh!;F;iE@6DAI-69a2fReV@067 zgAQVmhJ%A6Krrf_Hbd&|yZRFUuAJLvbr=h97Faec}vnHjz9GOuvz;c&8a$s7ES z)_z((|IwCE@ZsQRCU%lPHxQ^Ub1^ z{cRZcazXH(f_N>wm#>V(TtYyQF3Ok717#;C0h6`cu-7onc%xzCi1;qdn4{AyU$54M ztSC)1;#4cQ+`pP2`42fLua^}!R!)zW|=+!{T=xXzoc zp9)dD9GMNS0*5o`1LczcX08=nk;NeICmjt@C^{(ySb)N+B3caEm40@?1G5V@gsbFq zslh-BzdJ;W^YHLoh8$2sBgjWs1JS9RwW|b|w;*5Z3j3%%ZK zgwD&p0Z6TQB?x6`L!`(rFz1v&!I$yoK3cees=R!0vUAf$jF~xTp}|?M0mABN(8II7 ztN(X|IKgeuh$Z>-DY2ndBA1?+-Euo{@mymTul6{$1p3|Bx6!Vi8lO@C=Of(E#m-j= z+o!F7`w6D_wY5L*4;C3;UFj}j^50cK`lWJp0njWpex)ha`$D}SGFb>|3btS>X?^M< zh4@`+cF?fPxR#iC+y z{d-gYNQnln(1F20PVn9a`8)JEuI9NM4nJnVtx4jDP=B^}19Z5t}j8fQ&#G#5|-)IEsF{$7UI8;ZbN zu+ds%)?J;(@50kR39WE_nECGG|7_V3sOHa-^>o%%}5xGmypi&#YMFA9I;@ z-(Xiirx9WzI^Dl0%gyG^$a0&UvT3=FIYKeLt&Zzpy=9oOS!d1ctkffo4 zc1BeGyN7%gXd+2EV7AKy!7w5VrtzFcOacxqu0SKb=!v_8{OSqLfv4BHo{yMJM%m?+T`$LUJefs%SR3SQiAq&$GQ zi6u}dFxo#$M_mpBi&wYOVgl3xi({4yQdj2_eB$P8mF54lqf|sQ6j)t{{HzV|eQ7v{ zwQTr8gQ5!V1dO(}f$2k6BS5soG)8-_v`zKbrGcb`1hArkQ8M5i4>ke?FhD{709*TS zMm2svDE>9X{)E9T(W$+?N(`yrDlMlVKPEXbkz@%~;t+AyzC&W#e7nXpdn4uqanDOU zAq=i0zkmhd>DI(HL{9;bFbNy%_ik2Zi1f)Pc;3=O=b4}=IM;tSndEY!C@xSN}!%#6)N)HSflFw%X&wBO?{UA1BgLBL}Pjg zyrhADiLyKd2(&BAvMi>jHUU-Q!vtpo^9il#dCXYA zqolh+ebK7J@ISWQ_qr6iBkZ4Ck=cA6Bgz?zc{#_wVxj_dQWQb+yoX`M^_c;{fVk@z zXb9OeGSa@lzx8(yl)O}|sU1M?coUx5;9_y=YN1Cb+E&?y`CV{b5Ouh^2#K{ zBR41d=@v_cg0F2sqXvnrTQ)X63CEm%s&N^5)kw(OLo@>|a|7P9DgFp)TnNpjhE;yc1DU``lQy2;&~%m&n+oSllO;?fT1JylSCgmpXc7E8bd8H+h0Bn zi!colO^J@JnXIdo=$0N!=Xj!B&+sfEX{@mciG@)sk{NM*c_Suz|4I%*+(97ENG5RW z>z5{mJm;c#RW7d+qq|3Mb5MDYdTA)!N3?3jHz!dxDZSTcq=SNCYInT%V!OzgLF3-|f66RaN-lgLD*6pHWrth;# z&descOv2J{EW(S;C&{b)$Q@qn#~sh`u3py+rF0KVFHs#Jz(8YaCc9|9iin24O`i!) zbdyo+q@RgGIlD@)DlO-A!_9Uh-R#^33F~OfRk3q^AWL*FVd-WAlY1_zNdT zdJtpT;D+lO#W(HzmlJ0UfRdb1IiI8;?qj+jm@c}>!&oY0w3{u4ZCzuEh`7~XZ*_m1 z+z{Kee!VJ1@C&yu?r4y>j<_x*sV#K$HL1AK>jzG`r#&i)?1z=h8c9x=UCaph@q11A z6ruv*3Bi*kKd9wDPcSos{W63~nv2P)->2gARo%PDx;wPt^-+=SF@wbkg(AsfUz609 zgRS4>E*@=b3a2{v7V(843*4U@v#cu$7^v}fp_U(OXg`kNo!dPKN2@?IVNM$H|0s!f z{b0c3&6g{9C0Jm)4i~FPV50d8GYM<`ELkhF#vQ+5b z^zdP^E>`lwc=L&|O!si#CS{V*JY_D8#_Y}S$4?BnbKz7G%MD6;hrnZeSZJbY1}rVg zj-W161khpxfVKeJ&gL-7X!&v4y=B`o%6R^j+rk26g@v`2{iV{DCz?@-9OSMMXZpqD z8S#z0UOUTHcHeW9Z+ua6+^@<0o`{t`D&4?(>(QWcCo_lH6OQ!;k5x3!cfwBj7mD8L zp*ZzSjvXCaY(P2uNby7D_3Yb}FV>1quN6NW=DmC^<$E++TYmP5Q=^P+d3h?O&2z@P z@_eP9k!k+OWv1vHyu;y+>AJuh;v5iStIBXhK?M zaDwK=mot%ih2*mvVN8Hl8>1Bd8}L2EcySv=Qud!~sh8o!4X;d@(d%>RmMUnSsqH^< z-sfLgWV3OzY231pz|+PjF~(*8Q@F17SgB_qmD!Z*llE!NU5*c%GN+HMJ~y%JMK_$& zc03KsJ9^y2kB-2D9g^zqOL9jjLAIf^_43QinX7g&SPKQibM&$xeBmF$oqOj;YpM9p zSJt+l?$zs5dm7R;g-P~oXU_4vANts+AC%`gyjBo;xwRs?TP&WY!|~$FCmMz{_a+Au zt`w_z|Gi`Ws0vk)+rLPodUP4`Ti33Y(OC#YTP*N@wKIAR#XVf{VUfvvLVkY4`wKAi<)m}G|2*lgLygr*)+4)Th;`6PyNL)j z=m{>|Rl|J?6$bCnc%&O&9kXgaLxEWSLxJJGLxGq9TQmAtjiD+Y=}g~=wEENzdF7pD z{OfL`eTv9akA#KprUhs~MSh`ohPG_uR8EtXli5 z{+p4-gpTd$Qe(-k7G?{drFr$|{;i$Qa}DPd9AEo-@#@9dzlMqOOR>jzi=#Yvz8QtH z`=9hn1xoKaZ)7Nm_WDa)LVwq{uAWs{v%2wuuu#lZx)ya@{MH8DInhFCEj_I<+am}L+MhugY=&4{Xi07rqj_QIDrjU?^d zB$J$HjrEQEOr||epB)ASgc-j`)s*WOn?%)g#aEthN-3J`(sg{&oPOTB#A0Su!g9L2 zeLrp~UWJ7OlghJ6qFHGnJKHL|-tNf_oTro=Ou6g>cQT@5HzwaZOzBo>9DToUQPmWP zrp&NN*G%R{it*<^UOg_9>7^y=n2*|+zlT1DJ^TK&MPLtjD#GGbap^dWrlg_e>-El7 z&L!7=Curd6d6|w(U)oD9IQ2G$9%9upadTyG5E)778S7P6ByWtW&Z5wYhFDv_acsc; z?aKAURq;MlTQgHx#ecmHFGzPl85i?GJ?(tZF6BdVgi1e4e*T^4aH6=HB$rBO?Iao5 zgX7C5Lwio9Pc9rNO{#MqraZCuQQyvbwwk+4@N|N9Fr~iA&#``jC(qXYS+D=+&pSdr zYSE2vL=ET4m0m3v%@tJ_1~67RXtpZlNqr4;4bE~Nd-XOF!&9=KkIPARj@4-qN46ni zSI1_;bwl>!AKkli+G~nbc+iwlVe!;o*)`!mL~ws_qs}`E1k4Mq@eXHL%=@?B^Qp~c z5T{poJ&OhoI-!dWa9!x*=tO~8oxa1o`F_@-u6y@|)5W4+NTEk~?)rfJ~}o+ej5 z@xN;P;^4sCpc2%EMFSo;V(90VmXt-x5R|uKb{5rzEeF%YJ^td+NTvD zk$x;LegSH35JGtzZH$0kcO@OXQ{lIb2n6rLwiC}C@h0v@z0`=uQo;crU9}tAWZ9;E zr>df&0)avR^a7CSIcO^pNCM!dp`oFOx7%H4gdxEd#FLPyrrj4dyBp5LqhIxVyQx$tLs7b zWe786!JQ4*Fqa~y!URuV@()ZqciE82`~TDGtuC;B0|WrWCqfGP3D8!6IXxR(Yn8#T zV!pwZcYQMh>@5HS?45dcRW{HOoe(+|Q3^mk5-4`EG?Ks8CI4q_F~lr`BObMwhl`|S3-kjyTc1rLX0fJ=Wy`M!1CF!oxIPGtI3jr6_ew18e+Xe3 zE*ryH-nXL=Lh(q#L1YYNmCApwq60_}$Nuf#dSjx0kRXQrNykjPY#Fd#x2DThK<0+! zau{3dLYS{vvH*i8zS=in6V>8gsd^<=@qmRUyGkaljJWwAS|i%~8P0DwukrQA3ZE8% zV|uNC*1p&t@MmewOjkN1`puqE#uopBmj7#AAg8lP@??9+Unfpvwe2tXBzc4{to$%pn2eDKTvVl z7?yMlyV7&%Uq?Rs3I0iE)ra0woPr}j17&)cLbJd4meN2DrymvC(x(AuLXFAp2JQE#G0tBPs;Za11LH&wZJG#$SMGH#4S?SB&azi5l~ zUjQlVu0xp0(j`0uNC=!Qcwk}F^QKFszhlJ|)&Ni3Xt1iOc~8$+Z-K%XVUC&(P6^rj zvi1ugnqN6ye;>xF_H^~iwr)HS>BS*zhm4eOQ^iuBZFjSyXkzmIOm?378M7jbG`pwa zZ3G_Ewr!bs6nhwfeltoIybmNxEJLLcJf{_}r?#)a#^u-6MA7NaSLcbRn%6X6i{o1NF+o96Y7v~8#p@MWm|M%t9?k{A?;X-!|Ng5BA1}yHGD*~{ z!CY_TPaw_ak_s=n*~L(H^%9ikPp~9%vpi2qA_C8ksV`)^*BOv-slR;?ic+g2j4?_0 z2`(?hxN7E~lRk2gt{XE&RQhhfb@rFA^6|O)OJr zYOta|wS^ZJveq@awg5|zx~YEol}ss-@bEmeMoNd4>@P#m3NdJ;Nt-OKr#{WYx$voG z8MEdXffu8wsCs|@IFfoQOE|$j;}gLTYgohTuQ39dKriYZ0^8*}+a)QzN|!5Y_$6L5 zgRq#y-FZYDf@Na3~oWVUDPe)SvnMc4rs+8P4x?QTO57aa3;pbN=`w zsgDLLTbN0lc5U5`PTtoBe`6g|d5Boj(=ES3LRUYt4qC_9FL6$~DW#F;y?fo~dW(i{ zb5^n1Y4tTt#=bX`4q4e+p0sv4-)#uAKEG7d)}|1#^6>M|Jcl*j*-=)DFJzZfbYu(y z2`GXl4H2@)_pqE8j>HW{?~*exw+54owiA(b9&iaOFshxp$6nBk9!9y8E=#HVyr(BnSR9= zU&N!=M&nkP-`V@ARZsB|qa#N5hSHqgjo6=e7B&ecPTcd(B4bPj4vuw)dFbgMvSd7N zt)YAcYTB(Ye}8ku4q=hqrJ3WjwgtX=Q?G7WH z!xn1*tzR6CClUZ^GW-w&EXdD${11+L0)#js?$}PKw;$CvVg~D7+YtS+jb9zNz|rPB z_sCwZ+Myxbqh6=PqPL3)nVqH{;yd>nmoLu`_e=5tC0N>F#_}e=d%Y}-9|&v)OL6`p|V%C08>bi^X?7N*8ui z`f%674Q`HX_c8117dbj)vC&i0l862etIm%w?g}||PYlq9j!AdPAWfVOw~T#RIckrw z7~x-u`>dmUf`=-e6BI4hRH($XzRGSpQ~Fq^C&at&e2UqB z6b$ZQTAjh});{Zv=T^=qoH`5z=A_)*YSQAOSGS$Y#!u;Ui_I5ow@0z!($e^Uw;(JG zO7jLhXAfR03sI>Fv9zKibr6wGIua8T%Z|T99yO#}8&tg&;DTI4gI#jH zI;2mJ(>#TM;~Us$q6lAk#|H{jr=o(Jfj99g}xDokPyZ%M1jXY!~~`&@Sk`fimuk z@g`*7Z3hFo9Qs{Kj|&>%qsIXlcZ82BZ`rsfVEk;3oF|q_?Moe>6qsa2KE%-fgl^!j zK#%&D?Cq<5o4fZoh)79Syw1VU7GbFmMvQd-*ef*482Ub}4X$VdM!(sXQRx?Scdsuq zqLm2-|LRgXJ4)6(;p{4^q}LCX#*JGXHgfL(Tfxaek+Ktjn4-VMFL>-IDpACyxiP^>l9`k4s_yrXBYke(v|dP zc(XqTNneoKz)R+N72lt52>6#^guJg&m6zL5`C8-!D#k zmnz&N%xC_5+<54Idi z-9>yZqOT_N-z>(*52jPNIPTBVamnHPK;6cfwEoug8)m`?x^iRneeN?zB3r6><1X@D z1cm^^w@3}H_nLwe0|jrNE9>(|qN#mT_}V*~H>L0(DftU=A1)eDPr%JvtWE;P9NlmFJ;b0^E?BFss$dM&uBQ{Xy>J~xx^N$kE z;Kfb*7h;9?1mk44(nPZG?0l?K9|<|TI9l^<|NOqaX?n<{ps%i5HF=2rUM{RWZaq8q{??c>~}d- zOIjLRA(q{u`M&vE{JPt2%EoY8Jn%1F&3&m5kXkf=gzkdC?>@Hg&)~TVDlhX;zh^By?f|UqYwJX#(u!U|O zkj<>+6TI!HtY2B$#fG`Qxit1VqL}2xtZ~2NhQST$UP-^}OWVZ$D&~SW3C%Ti9EoF9 zX;zs!byX^*(F?O1U3?wm?lRQR#yO4cg!`#fFKF_P=)SrC5MMp&{CNEGprW|ABDQ~| zYBf=4qNyg8DUIQKarq{5+83k1yaltlgy5200{X^yO zi#hZvx-aePA6id7OFZwn$nWk`RYvmh>i*^d4Q4Y&%HKvaO~@)zey%f zSDh8X2*dsJJmb%k`$E-taYu}=!x|>aNh1d2U&c&TQwVa1gb<^EI#J#MGx13Od7Rc} z+%)ckA$s~_n7Dy^W>lc}1E^|3K3}ctvDK%_b_SHC+0T!X8#}Ih*@e2%gG<$Da7GGJ^d`VVB6a=WVIJ&d8u%0>SeGpbKaSC{BwEkVRP87mC80C&z`QP zqn9Q#q`LK)h@|dYtA{YBzF8qxb$<_a)qVFmA|3k99-`2(t&npiMzKEIsrmP7?|juH z-qcl&8XS_0aiJTsy}GT?|5M-(MOQI}={HlhgNW5M6w7B8o(uh0n)*@OiM$WQi^j*u zl90T*NPJehqQ0-K(Q@@R+lv1KR-3G3Qa0EXuN5jSal*o zgN}d9@Cvg}+A!7y;)nsMX&PJC>(wNJTR?=e=Zk0cx(!>fyZ7PeBnq}H=P1?KHms7Zs8-ltH8GQYsjm09Cz+Oj+2y`iIp?iEg3<4$8unMO#ftc zmq#g6Lh8}AZGIOKH|#oO_v33dm&Q3gGbW0S$nHU?9Ez!dWTBj@OviYMo?h4TaJEblP!UA1e@2;;ziFcabXj*%c^1ae3 zoxF~(t%}SgJ*J)H*0Tz;7-kC{zRR0N#9}CF;%AGffRoNV4%aycPuZ`PmV)}tNZIA% zqx^q2o>24?%1LwYi4@tgstf?_o>wTy^l5U7|`bqJOUfy^s4y+n@G>PI>k)R_bwzWNLz6(bbhI9Uf+&7{x{U7dX+O-XJx%m7cPwc`jvICVa9}{Y}j6$gJj-!7u1mv@sO=B$m1@KEBvF zUj8300N%E}!hv5B)unvoab(J>Sg7>&@o@!j7bp zc12oI(ciGKGd4E18`X1)Ll9y_rho%Yx9<_h^zeNnSIg(y-=6SU&n3rMcDjsa2?7hr zFs>P#De-;$P;Xb3&9rIl5=*H*ue3-26Y}j_Pftr=g$fJFa|FFg&;>#4i$TlYblo(S zp&+CFfaD){)Hyu%KW_vgnaIeePoBJRoOl|%YNY?h0h{*^c6?G&*WM$wKSA^m>W0(k zCDWjcf-i-1|28;Hr;Qz^xA{cab1O#WTuZNZ=@171=Fj<_wFtqzHy3<$5&B{>i;HX{ zE;4xU-b8+Np){`%cKT5Rd*LCmU+lv2Q5ta)RQOtz7Q{^9WTLx{-S9?la&282`@))l zU2!TKIHf2dp)YE3v(y<^;0|46H*+a4p_Msn8LSUw74#m$-kIq@K9nR@B8@Pa*A$1R zu6+ltRsMF!Ic;-J*&kNdg&gVK9)C@R=7?reJ&zI4?psNAG`k6M#yA_6&#;pyug(zD zh3$#*PvRo%hA~y$5s?DTcs}5q_=Cb{hEBTD=*uWLgnCC9;l~pF(!sXCMYUPKBN(Kk zQ}%WS(GaDbjLI56BavPL^Q<%1L80#~Tow(}#({Ao-XDqJ zMDh%_F`BF~TW-2Cw!X}_OEk05(-PP;5uuo1VAxF_KIoRP+Hsda!Z!(u{yccx7*x>y zcu3y}Xv4Y6C5L`SK`Es)D)g!i1TM!Dnsz!VK__>b!@N<0JZC-|XJ`L57+x9%6O`xm zx;nA88;(7e_=zW(6LjR7JfrVbT=MT_4|EQ{ah>9>WuFgVV{dFYkBKjAKK!Jf7x_Ym z(?vtmLSx}+;@VbhYF(0OPk3T;FLkF79lsHNZ!a zDNb4X5CME-HB?kM3};F*&rr~B?|CAO`e`v_;r4pKcTC*D>|30RxyH#>iO zL#oR=EsPQE&4ps?f@jkvB(LYOx~+v>Y0!54JU+l1jZFGB9{#oEcM?**XA5CNdT3%m zv7F9Zg7Gg;I;!CTS*ED_iOi3?BXHXS3#V4FM>$=v1X0EHQe9NE8 z4A{y3#L z0NduQ5d)>wMIzf?!X6lSK}JSe4>U*VxgcY_yF!IPmv6 zQ#Y<8WOBRQa^ptMRn>C)FiOYHSluF$Phv2gsZ);D`tL-^DU0^pLMR!+g&=M=A+VrV z^Mzf&ghc|1RX^fj(IP_~Dku7~dc3Pcik)zGQU&o)rDb(VqXbcJziS{!q_!s(o`@?E z=2s!Z?r1(NZp{(l$9=~+u!>-R4!%V`>c!vJ>r9RME>8~Uh*@D2O6PFjOD!5?^9J&q-lwsu&0 zZ`)5G5&5Y90I{fhn{-A?;MnG|*o-{=Acz_dW@kOPy(K9gpzI@P$)8l${~GGlfSRvW zc8QF^TQo1a4U#gkKZ*FANbxpHa2RL` zo{OnsAXFP0C?v`OpXp;}NSu^|AGDbf0|v0ple{eV%cyy`zp~ty!Sw1jWtP7f2E1cc(`VwDG;ARcx9x(C7;eAo?ND zcmTe`s0xRG@uq?5o=X&@o#!{MTr=$y z5DZ=0VZTY^AMO5p3}>zft36OJ6pjCim#ty1mg$u}nfkJqB^^W)_`*N7^lt`UU=`>b zf04%R8rrC4bDY|EJDh_0jb;4fbIq{3_cAfi`>@Xo0$y&_gzcDDqDx;-&6+II9Ey@s z#6`PHcgDKrhMSL<%lMdMTFdEE^7|=gqRVn*I4M{cx0nOF`Y9_AVEA^IN=TJz1%&eH}g+*gT?~2LA6o!g48(y zrT4R3-b1x(26?#@uautJ&!E>&7y1Px@A)N&+l8X~`DXNP>-N!LaEnkvL-%^Q9Rn*` zEukcEaY7O+Dqn3{lf3n@C*WUTK#StCwMV#1d=?VW5yP9VMcPN^_F%|JriMkp9xR}* z81-4S(cZOc5gbcjn&b==r1D4%%{d91h>`uA}=K zf74zTz0Ifyjtvi4MnCm)%rv1h-*nD*n##8L#EjoY3feO2G2{uaD+JA@y=Zn+^z*pJ z+ciBXSNG|XHH5W9fsZoR{WS$?E2XeWWOd&mnV;TnyG8=0hIT6k7VP z#TA5=PlAs2+OQ@ZOY)%l8vx`^@y1Li#gd+CZ-}Zlfk*9mFB=cJc=b#2+C|oIbMuBh ztJ#VI=uSRsH4qC}O?z{;Wt}Q%yZ^ zFOJgq{)>~VdU+|5FV@6Yd&}OKgaO6qT~MdEa!8Gw!A6us9>-#h{D%SC;Q`x7)X(p| z715xP3HYL%IzTdnBf3tpXE^rRSUHYHo#X2Emv~8_Fx;eak4M3bC~+Ylpd@gnUPLj4 z`;4K|GSN2Gpj?;NtelTzR7HocpD>WyLtxbogVA(zU~>DLJI8?cAkYAsvk)-`Yo9uv zBJ0H`Bqag;__ywUFN;Obv&ofb!#U&==YlM}EUi_#5vGSQM#z z=I;sMD8Q0A4(92Lcn}zHMz;sQ&h@;Cz3GB#yKx6Bm|?Fe1~pr2H~;jHfg82p-ot>? zuUAdCHOlnB9<-ns)x@e}VpJFTW&9{uInuY0{UiumC6NrIz_xQZ6rd+uzw;SvXeG?h^#iG~ z?P7K5U-^!rD-nDEWg=;SQJe&X{J?l5Za&K3=^^tA2_Eqkh(s;_x-+tX-+1!(6ks06 z1%bzMP0p17ozdsHb?vnQyX9x}uRRm8pv1}r>5_6{0?hJ~uGP1dIo;(w7k(`_#ephyXA(ODv86j&rvIc-06C)$}RBH;H7VCt~42>0f{^t*6 zoo@#F8M73BqRqbg!B%_`Jxx%EE>)U*NZr0%@D@n>F2PD0FJg%zS)aEwb5B@-Q_Urz+st$NwG|*;ZK74Hja?;EbG`UEs^I6Lh zgChG&m4e2qaw zLJKMejVHCTu~%hg+}Z%49AU*3$yTagoKk@YRP!%n=7&w6Vv9c7FGS@z3)(*Bqe@v!Vpx;FJQROYqwWvxGUOtP&r`P696tAdL(qG60jMzuV#R5t8troaD+z)g=|yAPp2DL#)%224aKO5bhUN9%X!=S$JFdmAVi)Y*`3;J9RBmFeTfU}l zKy0`p?W%-gz~F7eJ1p!=4$n5KjaYbM>83V8^ZRKal|)gCQv7AGD7Yh4_<i^m&&YI>N|h&{H@P6$JFoF znm1)F$fyW9H&A=KoXnVlVR-Ko0VaH$FzwWV!1mnk>x7Aue$!?E7-hZ!29D&o;!~)F z2DILaZZ)N8*-13546kVhZQK&? zy%FY3^fiKvvfulluSs7uf=X12^tpxx9N|^a>&itwb>r|6jLPhR70r*ZPLwgM%!mjk5c=Qs0+EXs6}O`A#^xwm3y5wOET9 z26-_21DnButBovmI1@*c4a98H$(T*JGDog8R{0O>&)ksps0K2`Zz~pC0&WLQI>;i# zVxnIQ6*5!!UL(Y#5VY#5EK<$m{1=cKIq0akg@n!_sZqB3alB`B zW_4dYvri2jk{$`~*qK@A*XC3ev2!$J3Ut@C(aKqo^Q_k!5Vg(yE7EF13xB)M@bX&< ztjE=~NQj8eVwW5V&`Es2g^H{wCb^4AOXPzru9OB;?BH8oF?}1biHv+%4(EZ0*>EQK z3{jN4LnjY?scudQn+pS!q*($l{%T}GD@!wBgSVnf>dbE zW{Ped$gXO3B2RgNl>0!IM4=fA1>ucLZc)H{fT6EyZfwlR)Ub=NS|5yf;8(^*;-uN) z6avLjX5G7+FIEFe(|9_PNp6e|w)Gn-;Yyc?7A#TU$a}RKeK%NTaDD@^PYf2-GUJQx zIo>2jvDE6vF34wK34n^Je#N2;$CpqLZgBMwHXxz0bPs3c{y-9r(775=pR^eUD)FML zGh@h5Aj^!Nf)?|@ntnjw@JGu{EM22?u(G-Sb)4Fsh3W#*Oc8n2)8l&p&Q6$dzqj7& z4D_m?SYy3%jJ=M&_!>j`{r($$K!-|sJ3(`c#e!i-Ooqg(kEPLVFoIuIi~Zid5ahSu z2WI<kXGtt;|65U&GF52p*8P*A{H+w5q}w4YLIOIG{>EMvUPj zJXc?iy+xjm1{GWz>iLGHKuQQ(A>>@-p8Qmc^BW$^yU0$!AiB&OzlmdGrSK>!3As3T z;@^|WkogXYq}z~ItQDoqnLm~TEDD@1jy6GsKlLd~Al3|hpe3P8*WINa5dk`3as1%N z^He6SB)HBy==uVL-v$*2t+9R`sojY2zWuJlemb8lrCacTJv(IFYz@Hrt*Md{*)zaY z@!Ec>CMU?JEA?0Y>bYRQ>23jZ5(j9}xIoyBwxb~ZQ+~Q!_!C*_OcC|Om3bNXTZ|*< zw@lw{?c^$iQ*;5j7)2^5wnT$d_9uPuydD@t#4hRkcxr3U>ixaYRI&84zgBi|<`wu< zS|Jm`uLCkwChY01n`L5(Z?EEW@6Ld7kq2|NI2(V?6m_QhF8OS=%{RaX3bjLg)En|E ztmiKf$w}hA2&B7?I(yMxqjlUkkaKBxCR~sq;>HWFh*&ZXs)>-N9+d}k6Nib(>4tLJLLHWmR{0YV%=ORXH zggCY4#*zrx2xICu*YCH&I@Caa@9}3*?-9Vzkj1>0@L^QnXbmt(qjzj5Yh_W?@kXtN z;0KjlqGmoeA=zV+a9uC2jxUuN?A=ghz=^;^Kmv)j>&&BB( z*|1%uGR*VTDUsM>LjO0pjKT`vuM1)R#pPHsZEBc zpwmVSwMq)H`%9)p(xiSP>Fea84)AVNM0{kg0_8nNZeA_?QG9hE4*JtwKLRSBwC==T z(_N3n5BY0o&ul9wesgH@I=KiP7CQhdCk09^N z{7b>}fvzZ_*XwV;i+sP|_Jh|n{V)x-mtq5-3<>x;H_JSJkT&gI!%E00;1E~A9)SN*dV`vAyLgdrkPKwaTuTX1sJFvso`rq z*)U7WW&e6H_mQ-ZE~_fV-nn|n=ODuZf8^ zy0#Uiwe%L>JAyIr6q3uLiVtmDcn#T_L=)oUY20pq65enYM>6(z!IZ-fvDM*F0`^N0#=q$m* z@O`~;QH7hZp3?uJ>MVe=THCL$fFj-9EhSyjUDDkp-Q6J4-Jo=LcXxMpcX#Kv(f9n% z`DQkZ<2cT<_r0Gxu4}E|nz(J((hkuiCSK3?@1%~Jnw|Ae6pLy^W#Cz?>ZVVyty)}C zd-`&%F96c43BmO|QFAbSU2YPbARNuwQxgstG~A9N5vhE9OX!wffan?^c-HerYuIS- zoM04oSCa|Zc#6|TVCwyl;o2$@m=^ikD|)Q(4;aHA+ndw5!^E_NU~7|l=|)9g906^9 zXYS~#jCq&#rYWe+g7)|Cc5deAk&guSnZF(P-cT93+PL1zfWqS2a?O2aZn8td>Z$NM zI877)6RH2wg&n&zq3m2ORgmN?;eFX*%e{0tc#SnPQutNVFT zW1N+X{@WM0q|tK|H{oD+>OxE76ADWT%OrS~GhAgK1pWM(Mv9G5N>v>msdD#xMtj{p z3poE-lSNt0cLoog;lv@Urrmz3DdiN{CG>l)$=vg|kkusTD-%CB=lS|4O}AvhYu1^% z6ggx#jq`kY^ql43EukQkvZ_2na|=6`=TwXDk7%b9FJ7A%_0DYGzw2-=jUc??-8Urmwqd;$3Hfvs_H;lK8`nN zLGI%B8(8k2&r$F{f?k~efU~HrYWFRDvLam*6O$d&@X|G_tPOe+L}!jG9N^@Pn%X3f zcZ}gbb9}Z(6q><8Nsh`A2x+4Xb==)X9XtR{JUrGXq8~7ux^?iMP^doTNgv~Bo@gf~ zuAWYRc8`)*(MTqa6QxY3z&3G3w=_zLQ_hMIYARY$Ao~FLWQG#>souO2Z#85wkh6V+ z(x3L<*HyM>E9As}0Xz?Y1e7*ZejhW-w(R}eZV!Ph$kea4JSQh7T2c&^i{36cvfCKY zgAWf6|H9_9qpr8wK?zNv9GSqp=q@ZUm#uSD8tC5j701a#>s<2^>PnuyN5~C^>GWtG zW`<^Pb&(D+A8;x|&qh@%ZRCrhSZclq`zmjyg{A1`(#(bs39epmyrqy)8f(@UOguIoTYzCxL8J-IzA^R|`vb^JY0ElsQbHD=N2|>j5lnf# z)SVdOR3(pYv5cS7z}UWB+TY%l(9R_B-GRP@r@Mfapbu`#QqMF9U2$(9B2Y0xwhZqe zs_LoH?~ip(_Y~g%2;jBOAZt_OS-|oGyB~MH@T0q6LNQJpa)cEN_Qlm7F0q_^>fpNl zoLQ1xPlz`uA>W6LQO@J8f8M>2ZlA`-;O>u#wq*?)DY?W80Ghk4=0958Ts;|MwHcrlER;nk#H!Ul{bT_izXz4~nA?RF+ z{Q9(o48FHU1&z9U8Y==(7$Jj$ollYF2R$QskkIS?ogQ>e(77JtR=pwG4@F;sgkIJn z99A=%qhAR-TFT0DhL0XhtamBcy^ep8sK*ba#uGnIeHAs4r2bO#j}~B+YY7adNdK*W z0=!Tyh;2>Eb%W?LU3cUL1G>l@xh@$3Lz`F~!1g`Jjx-5`JxQt83N}X{v}|Y{;5A1o zIs++naZ)u-AQ={8s5w1^z9U5{gyp&`mY|IbxXPYuA-@Mp!-6|y9#DSI=jV8err06S zU7a|girUanOe!O=<8n(e()-H$EXSjvKuFkousw6+blsrNGKx)#tzD}^W}p=axN+BL zyP+oGENHm8G9YN%+++KYDd5a)@BQMCn35``?_# zW!Y_BGnjEr11A9B?zRwsV=n&B4-i&mI>^`z`sHeBYU~vnKPba%q0qfMI((rJh(gcn zBAJYfs#AU=xP-*F0-OA^O1dp}Xs~f?`W1ZHSHNwA?zdC1*wxnFHgSJqZpf~7nr!?r zrOydz9-zH~bC6(urRf>>g({gxqwA*<&RGZ8IlRbmF^ge{p7*crR4_J_HkG(UP7h?BEWtAppWio0D;B{4#8iy zSh(~@&gn(qLDhSJ0Z~ey$&-Hs}py%|sTl^ulo=4koZs+~y1q6u*Yd;(f!ykYt* z$(1vDr1$F1$Y(ip(8ZO30wDWeuj(wzR*(qIt>8#ZMm1qh(3e=0 z8!0>|C;VMi4HOq|O1MZUo1R__dmeJORCeHcqPbyax-xi9x5s2N1w?k|LTjBl81E3nDqv#Vk`# zwIkcB4$m7`zTp-cF7v<7(c0&B;9#M0{8wkCkKOF9VfUj--M`A(?|lLb!wx#~ZK^EP ztTP)Fnhkn+L8(J`b;Rpj&y2hrO+GwLEmZw1nmib+?iz2tTxS&}n?HwLS!fHz;jurP z7`M1FlNjZ@8c)rRX|9~fq>3D;kd!?KF^q@fOOC*Qdm=P8mBla`>Ok3&h+uafTQM^N z4xgZ<6MXnM9!|J7)gmmki~^;1wDn9ROmur`>e`r19xEeZqedZ^4UWJN^(@YINaX|H zT>iLSCNU;XicPoSZ6u{X-R~3Yfb@#Duf5^rgDIX+Ne10$ROw>fry`h+>|~k81N?k; zvLw#nkyxVfmn3Wmj~_vU+uwhaZlMjcYIjISD;d( z#+e8cwNy#!Dv(25K0Z3(DQj`H$Y8;X6}hgx%!Y|#%@%Jphp33qV)PGC51|NpFTqF|K=NdHFe`srlvM@K;FzBX}(?9ju5zrp6A$30KcW zB)2dV1TM!%bL$L;5In8(wCcza*{Y{GzNt#_$*&W{ zT@|TT6+bzzVBMS-v!JGetrqGwtzKA@EbW@5xOk%=eJ=Xiof1LW*CUlYHWNSfiyo!e zC78|EiF5{ncqKbwS!r^KvtcBJqvd?|gB-5evD7T02(y=CM4=;6#5io6d|isNsivzx z-3+7o41a6uwi-EM*q}_Jbn%S_G1_uAaM~6D#IA#t;7M}vqcWLuLD0|PW?k6wCB+zB z0Z$H?YME;M+7=zdvlo>xYQS zAU^W56=^TvM<(RK6%@9-q_VRqn83jd-42hhu}&s6ww54?y-F?&2WkAnLg*+=tlvq! z&X!C;ML$&Q!*nS;)AZQb5ADP)*-mRPy-V)05ICN8{ev##}pl9~Anxt$zA9{ZPibGVyEx_C@P~zarwZEE~H7|blHB^#? ze`c8m>QDC7B{fTQ&2T3t1cuZy@_xeVX)(>gHV2W#f&zc$x+L9k66e^@iMb~5-G1)j zQk|t&%L+bdaL#fMVfUZ|3$^RR3!0*0q+=~DEp3ENm;?%v+D}Bju;cDdPt;yk?nzf` z>^6tXEyus+uq_pjK|_GX-XaI?k}UON5#$cs*2movDt4J|BTcdgSPzm0$!w;BjX`%M9+CzIyfJ))%|b z)-Kj9^AM?w=ENgXw|u(^tRzS_ta;9*Fk7V7q= zU3KVkZ)qv7JOrKX_`c_p<>7H~Tc1+1Z|deN<67-Bmvnue7YfaGDx^a+#QC#b`m@L? zeJlxe_ArKK=&Bb$Z9e3GFSFdTEM*pX*w{yVk;0#JS~GF`91` zEgab`TXII9+7a$j-{w{}93QYPw9-84FE9ib4GL;8i?QD{Jpa3BkwM~cfQ6aJ4Cl~G$2d2g z@mIAi{IDnB(C*Cj+=>*gnCbiUxn}g1HMlUAPLEAd0D7*FZZ{tWk+NIzOc2z}kFiie z|bZFxE50Jp36x*^(FWIm|qaWjYM{!`QIgdIsnj(GDMMro4>?8iD zPY}@w-#A*?OVc)_mwglwX)P$rn{nyG3r2A{APPI4}bU+L)rqj0+Y(v4aK5M;PpgCQN7$sENN&%6% z4?s_x!i%N;=6!nyQ@T+LBK#?q?WSg^Y_r#vDUC79KkpDv7y`QC3T{_Ek=T1AopL9y z`$|6*L@yQq><;Vp0H_TNeUR>GV{*j>(;;GYiz>>3e4 z8W)dzeFbYBG3~+ck07B;7x;vFmE*bISHeCkwOqsk+`HV>l`|vdDx+~6$0a%r^K!uW z`p?kxp?XE2Y1*u3w838wO4c+_R}oQf9h*1$Pb5^pe>c~6t6)))`%d1^^bLUyxy)dM z?rFxVZyR9cK{7V(*LOyv|f|Go&G#Smg2VT`ZxoQ6#4$`MqB% zlDJo2cbq9n)wMjj*Nd^xB!ldpygN6pI!}8g;hZfkAjNE(I9b%;3+1!e@vI!ht5@m` zd-2{igoojJE7{+9-+@LlXN@clZX?Anb|eDUnUss20ZKj5B=*`Well3!&O5&`;^Kv^ zAWX6+#ywg^Oofu?!AF(sbpGB5tXSwj(C7$euaRxR%BCluBxYd>d@s6h@4_Q9=2yP+ zo^I^fbQI+N7}J9j@$c*5@Xc4Xd;JqV{%Ieo%ho$$OSOx$Na(q>+ow!>jJmz8t7T z&&HgO;jwBlL3*UP^g(`mNT;Fpteg+hL2@O#RN_KdE(Ya*HnjZm1mj#vMn$2kzz|h9 zwYE&vV{HU}R86IK!_en@7Pn3Am~S5Ej0dB2&5D6a`ub~yV?DJoE^{IVKX=wFehOm& z#M2H->;B%}-8s-R4wQ1!m3L$uW%nO~Q%KR)C8OYMPCP6uG&{*DDOtYG)+abEvXKh^ z4)DVced(ybxsftg_nU}=BUP8eJZAF=%ju~pq_t3GGs=p}<8Mt}p)$OiU&ZE{-0g;# zxqnoe+c2pE0I?BrU=EJ<_M6VzRb=G@Ej6=~N+*)n5$%NAFQ80|y<{eH%Z@x1&MvCZ zv6O5kh*I=2dY1D=u?gh`o;~d03s8x~Qc}ts5XT-{MP^t2v3}=CjEp>mKlKX%xQt#b z`gSjvmoVVSX}TOytGC(ywP&84mGk&M^5TtNVG5iXQPJmjU56TnBt6~abn4-(8n-1lcS=yPATFl1JMqNj(eWfG5l_A5?)2^ckTWQJ;8m|0p}r2%2@CPih&(Dl$4 zjo@>(_a(der*+l=?P?)X%c;8~^7$oE8 z;D3PUuPPYTza>RXJ|~asDkLZlgzX5)jIfjM=H=TCcoSkW+D8(AhtQg7Fn@rP52+Kb zB__gYTr?mud1+m4j$C(A0Gzig8~&3bd8H=0?E!#niHM?z$m_Eg_se-Wz%@6QkQjcW zix+RMCgJ}8GjF$Wbe_tEqx#8?cS~MhMexJxSUXy32v<(g!1^xf1=V~l^nw!o**^G5 z!DEXtRtQw);&Z(Pw#G|xwC5H)F4FV3-0MI`VFe4{7sGIehL7S(@knUlLO`Vf9YNY} zm-7we-K>)uG z*gsB|;Gl~uC`ZC$Huz;^jQ6GLUfVIIg`t?6~A&F62bZoxtT>jWY# z8%OCc;*b05zK!l)E}H>P0Ut025xP%q?bwzONfFGgV`wlf(H+s|{Muo=s=;dxAA$jj zq9FpG#ggjpy=cVWJLm9mv>C1QVM7=t^8RzS{7VgI?;>F{LTuq7P91MkUFQY^7JQo*@nIGpTBziIb z(ny1GDz9&BR~O>SSF__zszO&rTb4)hOo7E-$6R#fLtCNo0uY6w_)uVPmY8qRwa<^Y zhP<2#34}kgzd_PH%R}RnKvR=YNXu>%Mbc6#rl6Tdd?tOMA6vAFd|GF1NIjbsunqiJ z23U1|fJGsFlAv-BQ`~I>z85101y0TArP3*(59c;n;Q|#H>yy2W%jdbmw*msX;ldqe z3xdCfR__tx!U_@-zBb^cvqu_>7ep19BqARzAi8cxa0@6O8_VOol9EM?qdyo0Ph;s-?a zwldeUQ>T@OdRjgeQ+KoeX4FL;k{>2NUar7Af(li_#^Gki$tIk2IMBV1{}dB9UHfUa ze}mMIbVHK2MTBZ0s5DL#9M?)rs=PU)>FkH+ZU=Hdoqn}0ygLU6o4#VWt*VJ9ZmQ_> zh(m8Cu;D7VlI<#@j})GBe8-i#6vrWjFBtb+H)7Qb>GdsiOwD*w1ocZxJ85Zh#&C63 z*mI(DJ)?=gJ#hpb$eTgb4xqBQLl=#r%UuSQS%|*&%+>B2r5Sb@HRMU_a);U})!vB< zs_N6dAh%Xqh8N1VXes&Kn3~YJ#r~2bByi$1K!A22d2%t)-6PUD$q@P?sZyiB$;Jie z-jqMi*;Jl)fxwXAe+LK^w6BmpF>dtsRi`_gmBw{Q^d88=`k<)>{XAp)2;);DRUGXA zFlSi&8ne)epxhs030z1wgS`6f$TNwqj4{!0)}+!uaw~~&@8(@(MXVDkTZF>MqDUwJdMPf93`@-W>9116bjG5M)W(d16Y&qP90a zItq}9fMPm}VR7i>^||#GjX{5ZEKw&`kNys1SxsH8Wbg%5UQsa~-gpx>0o?*!HXY;NT2M~*R5RRM?u?l5mr$x5vhUMJZRv`oaHEwmI0$4` zScqOAm+_w3+W7TnkN)6eFYCAZ5F)z5$Z$B3SzeuZd!up%)g227$T$cI;9({SVg!`1 z*;Q;OOTUJ#r+e7vk#Hpw5uQSa%lyT_p&*A^PIa!cf$W=E>DZEqsGTE-&H`lSRvxk97qX03bEb@g%OjW<+QK5lJEd`NXbZ7&@;`}!!Au^eR(TIS@W-7TO|vDGD% zBak8$C@gJzv()==KIU?tGC!E@jD{1P#im)hWkaqfgK|WqT}q1Mvvf%0PblPWg-(jq zHKvs39>%GAZD1tv?X#hj@_St{ruF~6)Bm6 zQ}vLP#_PQCjBprz1-4!xZiTkmFD^KhzG*e{cVw2XlIX5?>NM}z?mj&37BqCM$2V8z zxVlV1=4a-0qAX6v*_rB3aoz0%4Wfk0P{uYTY1_)mG!Kh@==M5-pd64;Z?+qzJuDA& z__*xCF&PZ~Q-?!As2at)AQNZ-F?wx=v7gM9>j7*Xt8JRPwVz2f_ET6axit>ncKLS; zMXM3eyW^KTBC}epQl7*f+*`>S+w)#{WfDl91+erYPYCO<`^(xl9!OrR#& z-#@a->)<953+_hj%PW-}wA#iJ%7Nw2iGF2+pu5GI4m6t3Jbx@eTjzQ^hGya8w?GH= zhB9V)>Ohuv@kgsCJ}AIxT8Bx5K~QuAVyfuH@_6+L>RGS@YIU3SNy&~v-mAi@3qnF4 zIsJOJeMXgJLO1#iCP+di@*#wd51UscV6Nbqb`YJ_17fB-J*e*M)qF>j)bEFz9QiF(>mXXV(2Sw1XC%pp)P@VJqFE$dYj{szb*8NgSk8;2j+^;9k*ncYg-_ zFySb7e)$T_45XjBn)%Rge`yhg)|b7pO7*}{sg%!vU}r$mO|FNTZ{+jomj;^={G~t< z1*yFtDsDKn{})tRw0a`DL=Ozxa>#^Yrw#njGg=5}1~1^`bn|AYf%ClMk0xsGG{a5& z8_0_9#R#FjAIr#ecBPIVf#J_}MJhCxJpqxUyN1-bJikn!pr{n=W4$DTPxeV2;1~cb z1=p)_VYYiFvJ&vn|ErUUNa7O_u)Nnoy5MBZ6_OPvwj4ea>3iJ!m=ziz#i;YSUkni) z6-4V{A|6Pns@5?M3jI3}du<{i#?Fiz5h9av^Me(2H7UKWW0{Cw^*6KL5%p79s zmPw)pNR#}hZuZtc_qxJ)h^fca&7X)0h@G}PN=+1QGNSnZ{}Hkmw9nF(yr&WL|M&MH zk><}M4P+Zd zf=r$fRm>)qDn=(uBjdA`v5B?j^lYG@BTlq<+w-;}Vh=AbFE0oo4bC%kMj5PNEr@6G zD@n`hI)vJmV>htrbo$Oz3mFa0BMDJfu?2m-%EUmy?O$H3?;3j2t3=ax1gg)}On{-O zyMLhhP5QQXd1WD);4@WZFn@9cak&z(g1$k+W@?-^wCe}ybL;n?9?;fxvzI;+-P6}R z$N1(!b5RCqV7_wM+#jRc5+aEn1T;Q2fO=9Wfvc4EoMbl#&g=0z`cpk`x0} z<}srN3JNK+*WyZQ@u7BG%ErbmE~)Znm~ydYF})4UM6rZe(wHp{hs;(@6Sp-w1t(Sb_-6YH*MdefcLR8QAU+0J($Q0#?RJsMeohn)`cxL~gV> zq$1lXb=~`(Rjz+^v0o`2pAWRphVilr?j`rD-5bL^f7~A?@WQNhjMBQ5IYj&hhhOInNBfsur$%Tr8j#8~S)+Y;LTa#WqN1D>f&S(HlTFr;V z0fkVpPA|dj6N@6~GKzyy@iVzip<&R_Fb4=qxT?=kf%C~1P;K2QDOOJA-_7Zu<H+A6nXJQoJ#GtuIE5f#~UgLcR zayUplmCr{6!Q2{IF>QBA&UfICzSN5IB?c&2-x0I+%BMSV@5*l5(oBU;kijerE#fwYyyhb~ zF?ssw!R)*0Q`=D#W-QaNSq%3>Y18Fx>ry^Kklutt>Q*hbXI+XiNXhB2pYCr55NEaI z8(viTnUpRYO++BzwjJnp)B+V=0qr11szZ;wXK@lcy(;-O?W}Lj?NRF4yDQ&dCU|^TX3*dav;SJ~fFZ1YL{0HoF zpH}0SRvM?Cp?XojUAm;Ahfy)AMr=$AbFlfeXd79~bPTDBL-4?(Vyjqh%HtvSa;b*uuuM7UVaDyaV_Pas5UpAxmE!< zw&m^UH+l}dz~3^RG6Gk@nD|JBp!xgM+sA zwFRtQaPvdE@Syt#WnYsnL~Q!29U`xUeCFFIl`3k3-#>LpL{DmL&BU}4 z_-wDcjZ?3$CgOsibp%I2e>Z*j;y8;sd&{QztJs07{L}zKEq2lI9Ukfyaf;$-7LWz? zr$-#Y1LD={pQ6rIS<%sQQ11=VyA|ZsnVzdS{Iu}>FDIAj#7yV`C~_-X^zj`Q5f za{b7(Boe%<(g5=58t4KLUpqBLq0>tt92Hl-uQX6-#r8+MtfqvmV$N-p^qwm=Igby} z#?=V=hJ9`xe7W4+`<~eI2&vx9&z=%vH2zWN!${9Royq_nB{}DQw(U#y74l-_-`vnO z)F&4el>>)vr!fmrBIrqs2ZeiM;d>-2sBSyM9i}ExzKhVhi!0BrB*qhWF$CCzByQ_B z`RkgFzQhW3f|`P6Chy$8muY~Vcm14&>bA)htn{lfiuD@K*3aJPZackVg9LI72cnKO z?LRC9u!Nf>CLV&jZ+~hIWR0Jga%Z9SeRGTbz1Y63b#_kpLM=47HsIBN?U!C$@0>tO zHgBDuU*@6=6o7T4G0hoIAH`Hf3IZK1=CsI}ERh9pWqhg_wqhn{U9 z1Gjd=R){{Ft$(|*(AI9tq9snZ?ef*(w^(ch{H?yxH>#{l!zBQ>#S&m23njfE;bf zifSQ_inOp7zVX~gT_Kur`wZNAw>vD&4oC}61f6J0!5gmQZ#bc^k~zE<`w}1Z(PN;Z z_{DjAr7u@-i1y?W*>Q3yugYxcO~{4#fU94-Ps&qh<(iwmO(Y!qSZ^CFm9S9~U=p<` zOHR>)H8ys0u*5JLpB2_z>f33U`StgiX&t`o@$cQ9c2UwIg;HwauX)8{vNc(3t{r6- zMe}Yz);8b)?$OxUVOh}ZU?Qs`bjYt z|B@Z~HGE;&IKw7GHU3M77=h`to`C>LfhV=GWSNSBo^)B33fT~X3us!WJiu0>IgbDG zI7^P2xOkZC`vcwSav}*FFA?u?f$^LJY+8VY4byPI`HYdFVR|G#cB?*jph)HVm6J2P zk#a3bFX{w;(bKgwnKu2w*SJs}VbP!{YWJpNKDpLv0-sF0yk*vf#iRv4YmZ&>cgYam zFU_lo?2CB+z;c5dmse1HN2h|It8yN?-@M{Bhgh0HuNP_Tg_k5n`|P_D7!4*T|C40D z?ad#+!hWytrALUWP{jn811|#4mqoyrk}xUt`Vj80&jyjWdZx*_e zYF~czouNva!7^4aa=*{b=8&`$e7b8C>5)jZJKiv*#Mo2Az!CcJpI*L^TkZ%N?UoJb`X zJ&YdKM=_>@qHHK|?f5jzg6U6FEKE9#E7eC}ux}C*OyC^tuEd4bw;Xt-k-{Cp>cz7! z-q&hXk%<#X1A47L@C_756c&lBx#p#jkmu3-G;?dER>Atv9v>BIvZ3{_B%w?UfaECX zVnnl~loaIA*mBLIohS>iJEqX;-FRVs#Kr(lKi)dwWcsHgSA|k+TTRxRKm7bHw;D>p=UT zY++!Q_Y=VPR}5NicD+TC;sAou9ij7yGH-|<-NGyDR7G)UN;@fLoV)o74VcSikHEC- z^ykS>>f`w9Vz(GRnpd+!E>=$$Z~GQ6xW|ltjmxyT($Of`L$m<;j!Jcoc{cVQnK5@A zm2fcd9IYQ{qOI&h%I z2)ZcJ61ErPQg8T)rd_KmFYCy#i&N1jS_Ber;Vj|_Qpbt7M3%LeB=CgpJIMOS(C;eG zJumfhctbmT71?(IAULdSFOW*qcw!lVM;i?JIfvC1JctF|n{Je0* zezEkUt}R7}&gb8=dI$*!+twK9Bfx`80b(@(R;Jar|&Ukx0L_u|5Mn-bMiL1wH+Gpwv1bTvYY@AMw#236h^b z&j{OGnFo^1h7pJJU~Zr8T4DvLoJ&CD*yZ*xBb6U+uQ7>iPWdzkE;v>MGJJTZ~*XE zAVY@tE_C*A*mQ>RPY&Y$b{apx=q2%Uaa^)%fe70kX-@11KobqPrd~&1pQL)orT-&2 z0-p62xfh4k93*mN_`J%|@Lxc**2l830AXC%7Ypu0G zkMHhi>TCU|`^e_`)YQ}x0GNA2wu@hM^gj5LdM~nhUcu2!=IZf`Qe%<=rK<4zT0&d!*yR{Izq8(p0_Bh4qh*n; zB0eFnq-w^ACKgH7bsqrOg7M-?whL`DlRt41RT=kj;7LN}j~ey!hb1g>Tou*zqx8xw z4AOHC#nNC{jg-)_!ewcL0YwD`og6AY>lOD~jcfQn8lQi@e#Ep6pSBA5!zr^yViaa# zfMlG@xq7psKanE;_dWOwb}^T(^tH_CT$i}I3*4e{d1Y#<>+rwtFAs=b5YGzxRh?=; z?rMepAa(6hg~@aQ27|%VtmpIWuLhqZs((sl?s5t%axa;}1eYW0n*kO(Fe z%O5VzYP}&)L>kPb|Lnod@d$+O=$L6L{Y^Oh-y5nO0*`JE+iWvWD~HN|{fpccC?*03 z5w{R^afiRz-G9}6+R%vT$*`PXvW5-#ZxR78t}_SjP>ef3D(qdG){ppB$msv~E+f>y zEPya~KR>@Wwhl}spE;AS;DuiVq@0?>qFVkUl-aE)ucM$Ie)XIY$JYdai06`TIzafe zv-)zp$|~o;xYBck^v?rsqeZyertz!?pi!;Q$CkItj#>>8igmR&xBk_MtAVsoQsFgX zG0*m-2^F&Zrzy(+SLb7tRw-%sr<;}zv)h_Tw z#pZOGI@^!0WHxO-7^q@H2w3l)4%A_B-J>#Aq)Hzi_)y_95@q#bBYEB@n?{n+xSQho z*1`XL4VbRql5y_<%mxY4%nVt~DmS#{`P_K8-N|-3(H*$m9q6-pp}eWDAk4=*mU>c> zJRx734*(ymt3ATeA=Ys1?9nBA9En=PLcAl0q<mB{109)FE2GU%nEA&hsOob7HPSi3s(F2MiNT@7)2pn z6uPPx)!7#O-UURg3nc1H1N`N)=~54Sz^n-HzNZ0N8G;&Izj_VZ{D+KTRr)w1^c5^s z^MwkM;d!K-;Z9qbi7mGd2(l0?mXWjlURQqC4*((?P`Qy9Qp4EH{3({E|D76iP?mv( zJ-Peoq;<80M4Z2tC3ih4ldVcwG?kQt z7E*<3*pr_@zMu8ILd6bb+$@6zNDEap2q{KziCw#Gx#c9TE-ESM(QsO}pS8{@67&0; zoAyT*DnfjgxcZcnnaLk`B^|CCf!le*pNg}%`CC&SER~}s5Z~#0L7>8C65+-LQmBt$ zJ$d|ahy&kLx>oRSpcwR1T~F9RIg0*MY(tD7-pUX0$s!vwGBLr_g&Z6LIyAIqNAe*W z{+jhYp`oGZ1+QIXTwZjpRJ=?MUpQR5kor-1BM-W||nD~jG1RyD#zkm6l_V0}2wM6v8=}OJA znWD5gvr zaQ(fp-Y)|HT)a4${1NbMb%mAx2`&3Oo#=(Xiwk?pl>$FzG3eEup^EZ`qrgDfV;`dy zO{JzEBE*XoJy+u5>^`S+5Xm}U&p~YaHV?E^K+0J}Oy(CCgR|mRA7*N&GXJxZwf!Qb zwOru{Y3bC$tC|&Aa0Q|Qo=+TGvE=DV%i0yH2x@ZUBDQ;qPx5@ls)~p9Prw>tMm?8}R`VIdqkRd`K=yt0u?u{4#cf0rNJP?ju^LyRRi=qtY zo;;Uo5i{6M31sD2@|)$=)gDlhvOjmb#rY&wvk`b6tLGFB+kD=w1Wc@Mm&52;r3D2W z-&FLz75(4vpf`iS#vV7)Lf9v{JSLBc)yDa?g(J-S*HGd35+%Vc%ODIn41Kz&yf08 zJzCz*&Bn#1<0xC+XQPyDlezP)Si8OG%E<6M(}9;YaBd!S48sA~4%6?jZ(W=0purrB zmqA#@xZqqrVtYW6#(M;H+_^EWoK|8@+n$Ge4gz1>A82VvSqgR$>;s_yA-2J2;y@~; zsW(9TX*klMNHgWtl2m2{=%2m4BD76lWzxuT!I-Lv0KtV-*IqUW%jBAHr3W}s9FGpN znP*^vhSzz=;*xFdX7ZfH!!~~uirO&bepDHH+aoj|RSXsltx0A?PJ1J;&K(!FHazLB z<7fe+++6yoJ;2ZX}?_Z;41*A{w1Gk!r0M91g!9^1h0GLxCj z_o1)Gem=&?KB|@0I1)hCnM%fqvt-oQs-z0CTx|1ho(l)T3j6=kt0J=AHxq1I`Fd9y zL_AaZC#zUQ`x`vZ)OlJyh1?J2dK>+V%nMreWY02=sPr1lYqXN3W%J9Td~Q53HV#XH zI2DVKJoIUuoTIJ&=*Z_Cz#DawAsFoUv|y5zXm1VH;U(1Ac{}o9+V=FRo!IzvC-e}@ z)C23n(zqP0r(XwLZ}H&5vM?8|STRhGULp=ccV!aRoZAyPpv18S{9C9E$SyRffe=ir6#!sYGI=NhO=q z|83?sAn+;PC(7OejYk|`IY~A_lyfHzcXxLHSD|D&^^+om?nTON1IeU0M_RR&O}%tJ zoN_^}Lnpg~rwFcoS5Wpo%dj^eQ=I)n9WLpkE5P%P?id(o1Bc7ORS0EFgLA}WdA%;e7H&;hD70GYUIM{) zQ}CKC#Wk?7UQBBmpDJ28&LcL9kZ*0_NY>$W7PMfmu2DoDGr?m$^%hT3nyw5dhM3rWW#@AO3{(QI;-B5!d-or5 zmt(78(#Ws1iX=Vd?~1vb9sA_2kIP

a)i^y&s=uM_(qHjOO!-<#9qN6kb&kdsKcu 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 z zsuHAF^0rub+f(9jQQ5~UO?1J#WN46)U%=HVlz}7ctPFoD7tk5W5UxakSXqbLry&dk zHucq5wZ3^-ehqiu&5Iy!TpD9X3C70~S)rfV-dj_2)a#ttR@BsR*V$%q#nU*}SDxDU zJ-*bZw*0`iH~zTbH*8?&J`E5uS;r=kSD4oT%7%7@0A5GInqTZS3nc6Ti?Z7@;)zGd z1u@6cQRRu+m~+=U;{irk^MbUG+WDu&rBHc{uvE81J%PZQ%viQqn{twpdxqyZS6GA2 z)(BD)r$d6bLrBYWEnRw<;H$WN$waX(?Mhwv4HtUN_ruxLC>0%Qq3f(XBcL;|m<(t3 zAlGx*hI`LyJk#RQT|qT|`yY8jWJN~CzJl+#;=$&y=NO?r5?Ik z(jB#AcxG%2a$fKUFnZk8CpPqo!U=DhuDK`7f9P9zn1U3pLD6&qW=bZsF!HFw&0Lgz z4?*XQQaG*zb|`slkY<7M1WKvtLsxIoOu+7&^7jUG1!_msY;dqoeFa^>1hRO#@;%_U z4qC3%fGQC_(kq{rg^G%e&m**^qP5&WdX^c&d#QaBiQJ)Omin7({P1=Q8}+o#_p5Ez z0g*++!Qr8sn_HnFG#31I6dL?uwJsbY)pcnqrB1l`uiJ~Mbn#1Vk@&x#fD8VptR9&E z6@!Ty<-`=@IH91&w^1TVMbXNh25Ak2%T})8Y!tDr^P&jicHevKcWC|S7`S89>Xd?M zpMatO+l*u{rVf#3E~19g)6dL3`_0ZgzVrk!8X9AGXDA1oM#Spj%1#7Ld7r+`HhK}BWbAI7|f;fa;t z|MG0Y$UJ{O0o?6lSZ5vN`(hx=7~dBi)t2z=^$sSqat z=(L>(*V&d=?<^Ai@VKqA)>!}#r`1sR1L0KPZR0c0RoQoXeq+EJR+E0ezsAGRK3rYI zL%WUoKhZ6YTnO(Km~}cEy~S6zcYbjJv{cW#05pz>jDcFoX6kA(^3kI|9C#mHj0;@c z=(*cHLrHNgJr$5e0+1DOPnlg51f&F0@ea_sZ#{ppb(yN6`lIXD%|k()2y6Q{f`{eu zL1$wmzDBRl!9JzNMKuH_zr92ZxTN^)m>IbnAR0(YN;=~j10RVfCWHk;H%vpv6lWWD z{yC|>A9XxOJ((c`D2z^yc6PihM`zxT{|7YtGfGDhc||D=n7z5IikqU4=Qj*Tb7&B+^+tYW{%y#rPV?1x857hrxKAnSz= z+zsz427=V`qtX#Dtj4_48a%=DkUxxIw%XIWuMD;rJpsI+*>)uS!+7W%tBU#VcvfVo zIEG`PWG_9G9w8WT3GhaxUyQt#RS^d5LO79Lo=ALP#F-z`+nF0AYySO<7NG zX#*gzz;ut{y1~N>6J!?#t?v6rOYcbhI@_k-iQ`4xhvy*)R`9*3ATO*`pN%D&xiG|9 zA)ErBxm4nJ0JSe>!ex&-weA<6pPz&Nz`}ftzNX{Z_JFrGXu$b#zpy&fj)8@z95~A| z7=cXp0(`F5Yaa1of!2)c^3J}UvFtWeUbxgwuzUVNa2J>X-WQ1-sh9Y@rBQpf-qrd& zFf=CeUS0*Id$CgiHQ4#0xIrGV0}s*fu?H2Asrec#5KeLcL?A&wJGTjI@&t?YG7tz# z0Q%z%dCB!OVKXh=&{Y9}ud1QJ16X?LA{nTwC&P`K;)7irg4^BxAkIj64h3I6&VO3@ zYHG%>GnPUzv@;gY2MnW-Ajbh!GE5E)U=tja)(B0PsXWPMN8%Y7OnRMddpx*aIH6vhNaENaU*oQba2#fAzzr3HbB$nEuo~Y3Tp1HO1nwPE9P_3!w+W#kIa`n7 zm_VLRq(a3%MkoA8v=HUrN*X_qc*cF&gK&xQo0^H0v5CqWcbO85>E z%zhep;(lj6y*5vdY-iAy3Aky>15>5N!~kvo*qJ0|#tZ#hq%x*L_XK1RO?Yu zFQ7p$>rB>+v81PUAP3f24B?b8>__Y*1l2cGdy`n$omsr_5j#|=Sn_pP&IBXC>F~P? zK14(yD|LS&5HFssq3$&MI)Ixw`~ognR%4qSk?xAc*ua@`bK0 zC$gP*<8=+_(Zb*0NbqIAj3!|0%tIk|^BZPMIed0FoO#jA?izl}D7`cVp2UXV9Jd3I zyXro+@{o|J)_AWM9tQ!2mym>b&?mnltQ}>HQDpq3<&X|ppO7bkD$L%17Y_o)za$f zuJaK#o|SluI`A3Z{X(vwm11CI;cVTbEv?efU662C!JN4z)2!Wt2{IY_AmH<-;B_M` z0YhvUl@9~u^rerk+_ zQ@<8Kh%$bD_jS((?&%LCbkHU30_tG71ahcG;Cj0cIOd{^8W?9!6G+>@A5Yr?lK7y&PV>0gTY3Af8~+ohxAf zX6jk3_ipgm6S(9^@i8%>Sc=gy(yRHL-1bQe@K#rnc$>J@F6u>E}QYR_ePg{Dv63gPhGm?$Ap1wbPeFNVxyBefp{p7 zfWW=Pa}$o}Fi^b<)N9(+#+cuUr!N7;8{4wOw;Pwr#xUeKAt3Lxj8gYAt0Ne53Fv&F zI~NEXcB9AxVWJ5M9aIx-%3@LD%bv_gJ?zPQ{=I#jY!(p#T*mwb-vI4#YxER0pjgi; zhtN~KeVP@NSNGO{E}~2VpthRrGxj% z$L{(Ltx>WUXRu06JtHpi7^~acJ4h#ynY+bjr2r5*9i}lgL;kY<34+in!I?U5Vu#*0 zjp}QTkd zepcrE^FCS=;o@9P)6J0_^z}1e#c&|OacfXp(5eQ-n$absBEdG)-(M2nardTYXP?zI z0z$y6)oB2oP*@bd$;kYfnETtAA?00+6g_C{{bBi+0BE4#fdf!d3Gh1t+Me2cgssKL z>h7Nx_iCLs#Ek}eRDm~S;hF8=2S0$MSfhGq`_25J#i*2$>;2;g#K2hO7Zm@*@Bl-hL%{@V6cftQ9qU z8XTrCArk)YfAi;eoadm4HuUthy7@nQ1^na3V6Ao3|MRps5_x5=%C_Zw>f2b&v@nwwxYVHTa?{y|roLsCTQgH#bj z^mRiG4K5%D=WZro9?LGpPVJH?)ziat7Wm#jFxFl!LtV&6Zp^tG%x>-XJsjWAVUuPnsm-JvmTR zsvA)szMQAB^zwBv4c0`_SlJ4C@G!rwVb17Cd2(t$*SP+PUzb3K%SX9itAlm+Yw>~( zz&ok;vc00Q!MDJ^=VtA`eZbFx>^kJcN7`i)hIU$5i6yJA)am)0vUBMaVu&4$_1=hb zc&pJE2w^pNpM3Sk@Ial75%LA?+W&n^K_tFa8u6bvlS`V=%Ri$t5m^P>bDEoV);4$y zqUP7P(LYHL_>%Rh><*eXiZ-KD_{2uN(=B*=vrtpLPHW_qu5K#L1B#hyiSiKv&$=e` z_x20YYy;`o?=$ZTn)X%rmxuz*}T_Z+@xeT9uKszq1t}mPRvYiOG`#Ik z#?I;#Zeo1eShJQvus}KSBi>^CRd^Xt?j$1$#|5g@e!~)4TV2h5i9Bj3Mxf*O6$83t zRgC(}&tx*TPw$J0$mnQ^fQ9ec_cXiaH|@N8IN#QuU3MKYzBzk8bksRmVSMx0)SdSN z0XntAm;`nEee%M-13Fgr4yJ|B*SEJ%pjd~}3q9t>Ue6j0chs||BU6F<*Fmy6rN&Ju zi-hhph7+R6yck&{a`H9LXWkqjH0z!Q8gr|RNADCHxYaaqgJ5*_`2+mI*PJM#391FLYVYFoY!ZXXT8k&OyQwW~}4;S*^JjABs{5G#n{@1z5YU z9|g2|dEVlENkUH+cJ(|C4rWxHW_fr#Fd){}zHPijLE&}70zBuor{b+N0t(m1Ko<4) zwUB7Sy~;a}XTt8pXoy#rX}rD6OlV45%?&~f*5R+>XA zIWa`-g~x-FzTn4sOtMw0rkl@ge42myw0@lnjIlHFSaPk&?3RuvtS*~L4~u=iiJ9-Z zCruTjO1!Y=ijT~<4l>Ta!i|d*HJz9k;GwJBQ-yB-MY z)`g_3LwWW-*z7_zSlF>3;2J>WT>gocQ4bMn3dwHb$0}WkJRr4?vNJ!V#29)d)9>y| z>s|Z=6rp7&mz4E9h-Em;-Dz>po9>^B>`oUf`y)X%N0aD7`OD8;E)TPpmEQDfBxULv zaqNr+yCm_WnN(L{a0)Cl!5=dyyjuG{3iU0JX{%l^nipg5rWyL|T#f(91_$9X9~&WJ z>F> zW{fOOk~=Qw3psh`x(kQSah1acOZm^)$bStDr`-s|%=fr?WqFls34z2Vi_y~0$ zTdXoP8MJm1E3H4U>~IdVR~bCHIv}a4>Z!6-ju#loPNll~5p>-C+Ah`7(f4O7{M`2$;ajD!(@w6GS)c$i*7fCZe&K$CjgspiXQDRr#>seU+F+mSTCi`cU z-XBqY?KR=wSRN)k13?|*U|n6XSyG24EtCnnL)7732CBkXz=UUmiqGg{J>L;_#y3`m`CJIMs20 zyOjbm+oA4%!q8Pp4DAyu+2BcXxu-l?#yak0(n)@kr|jfTRN}Q-R(xrYS4z|lbsF~I zB|q;x%rtik=N;858J=Py@~N2rY)+SvCQGU%oOr{YPCXR(O-JG>=j3m#J>DyjV&S)V zE%D>YTOwrSFHB?#a4@^f^?7n}jU<)5AtEv>H%u|%@$;Ye52J88&4!D8DyE+%Eru!o zUgP_p1+hFe2FQx~f(8x1XE;*p#&q(q*Zk73pT(-Ac=#rIPJD&pT4a=L#Pv~l|CL`gQ&Z4_HHs*CyR+)-6dayZue`9|k$b%&ef{PONx{P ziFC5mBNkizO?SceK!J=ZC!!ftr~?FU|+6bGxd+M1_@ zqH0{G=bft?%O{FA1HP+c%c66i<$QR#o%86sm~k8*?vun+wBNp`P8e)oR<q=nLxYwh7PVz_<1tlvx7_v9qd$ctg%coT8U1x5HIBqY!`d$!ybJG z2)tYCbn`_cO7@@qL@%~1U%c9PMp9HPTK7U|RXWGGQydS`U9-sjvs9A60aqwA$dn)4 zr~ddj$xmH3SMUF9sxw#KlMd@o9>4ZiXmx-4nWw2l@I8fVj|%g>Si25R0rA%)p=5mO zc2a0;;iRjR?0=qXpky_26t==4? z)@WML0mi2JHnE^aCP2D&l6j`WC?A~hzbxf~-Q)f6Ajfo>QqTl3x0@D7rqY~!)pNEZ zn{5p&G{oLd3mSbZz!uE>!1&zU);?fU^ zZPu7sDH1U@aK(*hIw>J|45vViJJ$72zWuRT8Iu4pJy(MEm*D&>GF)c*C0+tXZr zlk+DwQWl5x*0>DQ_2#?kJocl0iSr3RXo64Sm3xm@aU#!g+ucx1Xt6EV zGWBguWR`Y$<@s_O_7e(yAEgJkYU&DpZTYG1#>->kBzD2Mg_vD(X_-aFD88`{|4HZZaQRPld2rX9>fc`t>JL_zs1&y28WQ2uq~mu7;v)iC}m21L=H zZI4)boDYhM4XcwKR$X!7G!kAF3bs{rUXaL+>OU9bXyBevXDZN*Xf+y14%nN)#oQ2y zL>LeqU>2TX=_wZI)Y6k?D_B9nHxd8yxRW;|7?lL6XVNJI`5xy}jhFGLyn$!7nfFqg z4|Z7G3Saq!5AUKeVVwFy8`~Kz6YdfDyXcF}?dv|UBfxl+eE9|GkdsfBo9!vOew)9* z%jHbLa`bv(9+f}x*(7^#H!v9_zUzQF2O-}BVvFSZEygTcTUdyeJhBnui>Dh+<0P96 zoVotu0k5&!`^@QmMe?}sFYC*%ZEO`~ETTtKobxwTeCviKH zH%(Zj4}nqrDsB<4N8C<#7@fXH5Az%$V)$>!-u-e#x)#j^y%Jct6eI*YK8B*7{FDBI zH8xQK0nuTJL-UX5@aL8Vwgw=}bV|U7X^8*%>V659Zl%tkl;A&kNd}!n=sG!*;(xNB zAP$fzG+8t~2ClRJg2T80?$aTpnhMa=fBo73AYV?Sj`{!d))FKVLCf4N8`63XG-dyvkk-x`{%K>;)t3VF}saPagAyoXovt+Vu1P=42pnpUoP~0-C|UmdYJ0)L{^?Km7MEx1#|g z!TW&YK=Gf#3S0|eZ~;6dy#M>lGnnpL^y@v3e;_N^icx@96Q+jUi2tl!us1Ep*K>Vi zTmJ(G1|%}#Y8N4F6mnitJF#s?jgye)iaDVxK zKU!-6>5zjQX3O!HZUKE^w&KgetUe3CrCTr*Y*wfWaV0 Date: Thu, 1 Jun 2023 23:13:03 +0800 Subject: [PATCH 18/20] 3 --- 用例顺序图(待定).jpeg | Bin 0 -> 205846 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 用例顺序图(待定).jpeg diff --git a/用例顺序图(待定).jpeg b/用例顺序图(待定).jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c1fa4398c7a082a4f134ea54c925358e293133a8 GIT binary patch literal 205846 zcmeFZby!?YwlCa3LV^c(3Blc6g1bA71Zli+cM>GHyCg{C4&69Oa3@&fBzW-P7T}VZ zGiTzq7#rk*3{G((POOTtzV}YNKKN{D^i$8+Jd!+HK|4cLdrp^CMi~Od&+@0MY%c%dR zU9~l(9%;)*n!);SX!F0JEu39{mydZYBLa5t_)`_#3tJ$B} zJ$d{`w6X#KPD%g(3}zyiSb zNO1u;0Gt56hed$YV{`uBh2Kp6?>Ic3{qPxp{rqX+Qw1ahYycuQ0unaDLl1!RvAPiv z5s`k2;(vtaD9F#AJViu8ML>Hj5c~oFc=`l@_~a=XDkd5VIs!fb>B&=M1jJ|0QLu4d z3N+#3;d6Qu5E4;KXqdT#yq_WF;?ps3^^8b?qP~)p*YrtD&o8a3@0;fqR4{*=QP2#Z z{YgWs@0OI=@MVsUUP{m6U2;oTPjA1RR$=!92?GzWw6<5t zh`&>@|BCo8sS5yfq{rLAM#2V&18zB|uC=@- zUQ^U3n!<3fhO#@O0RLwG?`rwCwEVjh{ad&ETPyy1u=u|oLy_@r@tuEB>0P&!B7gr6 zBj8^?LMZuJGFK6?iuh@C^fmv#Jlwwk#1Ib?>opR8j(_iHhtT|&)PMQd_7~#?)9Tgh zno~D*jL-k_aQ_1!lG>_TogP-#)1d6EV8{P0r~xEFr~y&UfiIYUElndi|F3~Pb)~hh z)BQ8VbZhG)Y4HCR*vKEcKA2ZihN3&crl0WIg~M@$AVl zc(tkC&C+`u`w;V`$DnEny=re9B+k*hK7d}mx_Ckmo5)JnE_9H#pY%Ic6+||h+zC>Y z9RQ!4Jgh?Oef=+3k^e-AA!hK^P;DJ7FU;PP`c5ToX7J;zG2{rj^{`vlEv%8c0?}lZ zGSA7%d($`?7 zPeB!(WZY=HYmiYvg9CE!TvztaRwkISZ1teh247~?OL6%5`Ram}Y0+YSEGkLW&W&o% zlD7m4tlgz`T|EG}yU3C=^0qSD5cTj`n~2PwU7fj{3}I76iQwcjffy+*FsrZ_bm&we zBqvxj4Xmi+vkKvFR@Y%KR4K3bXa^g_D)zM;Al6v^cgf#ayoX*WxFgi255}cgDZDM% zHxM^TV)V@{{*kNmYApzU9<3ICaDEE&VtBsh(4s$ggV4!NZ^ zmmCe}Y=n6<&-O{x!EKzoI5OT%Z0VJ(QtOWsbuGN0YfQ1EcdCuvmowYN%PV3-2Rs#Z z>7ed2mh8O_Yi-i?ssXNdpR%k|zCu#M{`mk{qpxj+rsDZ#eQB5BS}$I(g~_waQ`*6}Y^gO70jnZ1dD)FAZf?d7u<1J0h^>lZl@@s|8A>ffhppE+RaifbJ!F$OyhJC+sHlO3e!W!+yO5Wsh^&DK;o90XR6cn|vC&`ngR_Why4``)- zLh{e1u^cRH87kr)31iljuq)zfLEVgFc47&ItmL-fJYkfS``2qmz(2H7p1c|LYlGa( zGC957w_4sqM#vVHn;a%tov#sF%h6+UjjDF>u$H28idTiiugcAHSoT8{|#hVP=U@66} z69ThhAXrM?d2kKf?fA6YDPn}cqlZ-frJIdOf?cSp1!fvJ5IIhIk;iKg3IQ# z=bE$)JtT6Oq^~K>TH4mga7nXFvV{{>o~J_6=}wo8z|_6rwRrz4;~+T4vl;VM(4`U& z(l1xu**gos0#Stjnf;qBX^R|`mWBN66P&d3!@-Xk5$1KsikS>{c5G8dO9Ro}bXaOu zO-=X#;p~Qnq{*+?Zk^Q4JeL)xX}$l|gy0`Pg4tceUUbbf&IljM_6T$aUL>{`r_^xU zJkiwN%`6RLg1?x{{c;ZRtp^V3cDNQK5_ptFYeEe!2&J^iJys)baXl>VF-RT&x1$y{ zXU<4-*%g#OZDt<;EB53;g~2>xQ+9oIRB+Z$;|Rqd}0YX zxr(4C{gnb?Psl;xNiKSGX0it03u7>RvJnHjYutbr`Tz(Q$F!bZ_WN?A=4AM?)N!1h zZ7%Q0+V1}Ddd=Lq#k=h6w|z*dHO?lL>#3}UrR&<|nzj*nX5pD0GbrEoRc7L^cdsPuAi#{TeRI+2tX5Bw3T9QO@RQw!T)Nl{Ld@}K>RIe-U4(-dCKmk$w7h? zdUR3QYBo`C!7AKuRs;)SZTA@#vNQFt!!Er(@5!LUjkPRcI5o*1Nu=oL1% z06i$dTDhkqv|g_T`pVxZHVP}oAdd)?X(F>p0OwEBZ9dDB93V$Ay!%wH)Ocw^jlFS5 zciN(XEy~@mg54EUWq&{dw7e#9y-#Fi{c*xLX?RmoGSymP4}#iFaiyee4zR{Z(@_ZjBL{+A6|2YFNia<1t8E$l?w{9J3^%nqDnhzhZ!$)E=8 za%Z`B4b>c`97E67)av`TW_9$pnRrxQNYSaGD7`I=#SYgR!ygk zEJN+o;?F;6nbjQr9Ow%g5P&SQSso-M%PyyIjF{FvAszz7tzDhs$bKL-&V1EEXOc`~ zoQe-Q+1KR>r<7)Q3aRh-f3}HS2)}nyD-WbL_wcWi4sIwU=U7+}7)&*Je8g)Xnk=z zeAzLm9g-h%?H3TQVH+-vZzWNtr;JOC{0VyI=y5nw)UgpSW7HP0J?p5h58cx^i?jvFx9X)qo~`L^@;Q}t zQRF1D*PMx^N|bNhH05P8`k2SGHR(P)8l}h$3Hp!j2>&yn-mPhCcz$P5-vp;k_^G`RBS3~RL&Vi2Eyi({)uV(~ z@*V(!UhJ_0ro`It5A(off|9lca%VKe|H%q~VA@VM#5P7qCWr?F!SW6Yg-Tw!@}+G0 z&JMC+yc?ig#xvgLv~OF?epj$waS*Rxd0KtZr~NeK4_E;JHB06iwgQER1@3S|3A8io z@QpBAnW;ka^j@FgD7*lzeE3xPc}cyDMXVLMDcF@y_r(4{YYy>q@c-ndclaa4u>H0x zAF7g;7ZUVBFr)&9STzw<*=!Zkqp3UU1J^6R&9+Ru&?`!7-sBH@wk|})|3ca)CCr7Od=h{z*SM^&g zO3*RMFddmx^uMp?`v$hSLJ6n4XIS)VypJVQ>4{C+Mn%@yd4~69JuZzse0LFj|MMpP z;j_!5lM~Ad`D&l9cx=W-l4trza$0?8A|L-OhI@$jQy-w&$!XI&+N5XC9JouQ2Zluz zb=-)vBemnc=(BUKZtRV5)leP+MT@*gv}JboaNUsc+wG{RpG8I*O`R4fE@kz2)N2$tHS&j~ zKzaUf?3RQbU%x`fIX`obl&BG}M&Euu!_Z%`AzVHRyB-Ia;nY>wLvQLWH#6>{>yw{` zOP@$9cabk(s&)tuGYhDE{m)wa1L6e|*#iK~?fAt64o+EU5-Rc_g+yQvL{aSVzK)L^eLI6a7#fO99L%EO7FvL%z)_M?w zg8xggy>SmGmGQ0$W{7Iw*VZfG_0&=oMDu3x9-mPyB9#d#OCycUI6U3NlNi*rXd1X! zHuizt)L3*V`1H507yqk9J(O>1zv3SN<-?J0{usg|2It)SnRE>C*BJbd^W8?Se*@wl z3)d61rK+yp1&wg{rqO#~PvZIf1Q|V+*_ENvN_}3yh$gcNHAV!dv@vT0d%`Fkrl)>N z^m8>|0=_-HK^j!j!cj~|l($Sa7au|A^C%{F#|UiVFIO1%NZ--mQgF6R%0)L?ql=lE zzjYQP61rswb6=g|EgKytPG$5G+7QGquH_amK(KwSRcbf~K!vS{vJ9x5!i@JPW;o{v zUnq;?iwP}nRt$stf!6Pp^mA9Y^DD%*$HSOai5}PR4Q!JJyGw zY6QN=3bpUi4dRSF71VgHVeC%u)7DsB| zPFK^N%h9XYmZPBS~S2r zhx;dk-l(HRZ!KYhd;l)ym)V5L*@GSxD0T8xMrBlf426q>9-O3JNo01`5}oU+P}WO2 zmOUq?rm&zplY1=FpBG&ZfELaNfK0F((EG^wy|>Hj$=MEX54Y@s>8jCzWCKo4$=>03 zRxarxLir})G4+p=gG@sn%K;aQY62*%Xupbq1h_lroPPVUwflCH=K*l>*+E&Y7Z^d| zIgseD6yYU|VCkREXXxgjh>e@eFEn6@HkGfv;j7zs!mOp8qxpmxKNFPenUFEXeBe-u z_9wYP00^Xcdi0BZ_(dOdUcA%%hn@HDb=?ULjJ(;(vQ(}-tbV~{%8`>p9L<$vW(yb! z4*q1R!lCVudRp88D08(PA1c&iuT5K!auCjEY*OT+Uc4q!t05l%R-Pd7nWtuJ2 z$2B$~O4c1=co?RvBS)#10M^XVygo)xmmpR<-b?xjt?QFjTHYlCDnqNw2$IV48H(MA z;3Dr8=^OYh_c@;%1*~W>`0JQ$(OJjWeiR*D9+j|FP%l1F|ETPn?4T;qZ*1m~FGCyv zhUJ?GM8u?{D_%DmUm(DvZ6Bh|#s^KcZE zpw&0f`{t82xiF2);zbsSYrFYOGH!Wa-l#HSoqDTwIy2VDAt7a5H<^S^Y znS3*^k5Te1>LpT%VrkAkY8-NZEtj6h>CZ$IO*7Lj7yhQE%lH z!_}{pKhDe&Xh5Vu3>i?U!t7uj=d0q$`ns_*%GTJL-vGQk(kAnapxqhtF+lY{e{ZJj z^NdPPm-|ymTtD^rncSM#eUx$!B9` z;NhcDx)8jhmi&@E7o~QSP;1l>C>dRIrFZKa^rIZ9ScA^UTIhuVkMaS1eh0Ql;3!c%V-U;D-@=krTOp>SknDlUW2VX$RG z&GrhDSRdWoz&pmH>x$RJ``!-#^kq3( zJ?ijR4}jhJHU0k>EoZJPcq~{wd$nSgGa(AAL`|fexis0sI{fWI#by?&wlsO){rr&J z8oCOiI8Mp}-jk;0DjEZS5lSu|HZqgo_n(IH$)@#xOb8f`QvjXxYsa|sAupNc#yER< z8i7z`Lx{cBCigoe-`Ojn!S)Uyj#Z3?Uy)6**4?^sf&%fCUM$GBO~F5JZ2POktVPa2 zAfxFD^SLverFySIOU>!@kYgF#sEQ6w1S^Em%y+95T#%Q+_&N-V0VOL{@{`i)m#mdz z8t8Oy{mbU@M2%qm7LxuC%D&A%u;W+(oLvtY!-gZ)oHmUyWS=Alo9gRNC)hsQ5z;)8(2ehQzc|y zKm>c|Z0QMotR81Umlcs45|3L~>G6-_8IKX+sU}PXkum3j;tHHQ#6ZW^boz5@t?k&7 zO|Vb7!fMi@7qg>Kx-pmuM+)~St=L+{A?@IhW+cYV*fW$SnbR?Zp@9Oz_BPdM}p0CF*UnAkX&(tP%0e+-XYIiym&k zqN={zPgD`&6yETeX8(XYqC1Jj&ecIxixerf`cOVjw$CCn7c;{>E4$}|GQSpXY8HnT zIEE#RoF*`8QK7t`ZX>Q={v>HYZynnp(N-1^ZV_bpWgi-&L@Y z1O}5h-8(jK{7wJ+$BS6czciBugt-Sj7u)vVIQgC=7WSo{9XCogTP0ybxhBanJtqr4 z(nVR67T!E^BE8&`{k6YvKuF|((Y~#`c;Hs4yA=?6<5ZgIMZ1kAkbE@BH8{ULw{XGg z0za#v>s*h0+RYVeTWS0(E>m+VKXqUF8bx8+0r^ciGrQ)hPxA?e>>L`WZu`@=;K#mK zHo7q7|M?v|rwhtgkc!LQQ2z+{c&Q}Pm`qFdIQ;timJEe}C+09Fe+lm^WMxYQoz7Z= zI$Koj*QR*$6p2^U_&viJhz2{bO|y>G?jBIPBy<8byrf^BO|y^d%(HHjj55u9TLW(v z2lPI7E32GSAW~5CtU@!>Wq=%eDfT+VtpcggBC9s-ud3^RP=CkD!%8uo5ZiAZAt#+~ zY(5{REg5Gyopnf#)7LXMvKO9F@WTZI3zI`hG4GPml&8N=&MoaHN_ftUU05|%I0hsZ z$e3Yh^1Zp9=$gl3UcGJN8HuI*e%`>Prnrk#8zFBpsDJ`g^<)TfCTIR$Li5}G` zKlp^Z8}5+Ox{yXrvG6N5!bp7p@}mH4Op9Dyx?b8#;2_RxeUsTB)&v}4L#FJVV1wy9 zzdi3sxrR{U9o`q7@-=ghz~lSjCu@2~?typjvY9I)uZ3)D)YO>1zKG@aOdTjp+VrhS)XNo#`>et;E5&S8%!*Cgd{$a> z^2+Om=gg#yPSwp;B^M6S)qE_o@>p2>4uq*@yjG$eTop8JTqXFjnrimge2w;go%0pT zbV@O--&@&#YU`>8fR9VEMWIJ*A$!$?6RHHl#M%6a&l0lildgjIBr*-$STi8h^l7rv zr|(bSDllu?6mQluM?3Kr%Yove-PyJ}{>@|M-*lT`GWsAWs9WtTlF9>M zbe1gm!}s60VzN2Z&1m)lnU1=G3%R1BMxvg_pOCCPf7!O^`^s)HS-vV8r;!MTmFG+vlNjw`Odm`2QBAaoBoxyut*!pwUr7E^lR2eQ;C z9sg!dF4aPNP@*H8PWzBkQp-{|y|@W-;7pGNfcApokMxSE^Q7z7Mj^Pw9{FeDByE!3 zzRt^QD2a0d)#Ln0Na?Fg94?yIo*Hc+9Etkr5(>4%FI1!3YwlC8%!jOsg_i7~SknBB zC5$+rYE_0w_|$9v>D|0F=fy7E>Zio`%za}04Y}Z;AjINCK9L%%OoK0*e@qVUhKCmG(4NbHn^J9TJV*(0=k~V*Ny($w|9=&fC1(YZtJzO9^TRW{~rLQ+!-61oPmc z+7u6P4Xryd;5#_(So|RM5wJ$j)vDohde&r96D3!WS_I9vdse^coSr&MV6HPrT(03+ z{?Y%_&$Bn96Oj#l%u|@ShWI^Po*Gf?L&6dXg<7I-d+La(qf@e=NG5WLw7o*B@rwzB z<`s(z$K0AJhohH9Az2c1^=b5tV#Qb3rS9q919FB&=f7#d2*sO}HY;~rFfrlHE1mtk z)d8e--fwLCBJt;6^t+ww-zY;mc!7EyQY1JTNwYe!an;fIVwBGQ-^?5$Yilc`+x2n% zJrrqdv64_Qr;nqD#~YxTJ~tX~quSG1z;9QJ_EOSBjw8N-Q<$vkxf0u0S2}CtK6>Q7 zv);J(WBNJ}W?Fe=} z@mYf67oTCJZbC*Jw&zyt6CTI) zsdRA1vQz|Ff-dHr4wntppQ#o|E~p6^f_B+Tgk0%{;5qmAH}fFd$GM>DtM;YtVlmBt zr5~A`psDKISB}k#EqTfbH?E8eCymIIZ_ zE|-~pQHejdbI}@t(DK2SXQ#OGP=_Wv57_x&n!5o9_NFP%+@%dZ|S|J%J!GL!hGON6vW(a-Jdvh|nM(%-HlurKIiH7~I}*81x+TiT-`$E-t)7Hr+OD z>RWT`NexrL!P4Gw;CHLfzpHG+Gip_M=K+xT05~^rVL=doOa%aRK9H~^qxO;Ud&*1( z9_JKR;xJ4yNI2abqgv!yhL`MU706xg%+paW0kTAMdG2(2v_&)Z3-_-x>O0YgXjdg=NS+m71 z6lvVCQAB*36Od*&e5os7A9OE83s};KWUbQ)@ISmoB zUR}x-I=YK9jvH9S$~91lZOmh|=xEUihy`D*TXdwhg~Eh_?c5yshp%kmb1~^I^~i$$ zJy~1hBA*lGhZwng3fLg_6Z-dj!%3+;`2~B0TM9b#3>Tpe7^**1I#5DRc3OPeF!w2n z-!$Eo&BSN~)3wYqBeSnIwn)K(9IU2U=|kFRtq?wh&&SF{& zl%&pviPzlfS|dn*xpWDmN0QaGeCm%;4?vSnyQI2LuiGP5dSk)HXJ@evry4KsRps88^xPj^3-&v~eFHJu$|e*fJOp8S8d|3erimp}=gTf|M* zoV#X;n?y-imO#XH1G_D#ck)w(oEc%bTiQo#o>+#xK>b`EW}DcW90m9QC6PX{-4w2V z-^y+W>ni)_-yi@|X?JwJ6R`s>%Q3E}Y`xbcJ_wx%9|}0alm}d3LnSt~ZJb3VoU(dc z%`<%gkxIPFEOdS(dL$V$xvR>?cgI`Q#xeLPzxOo%o$z<2(@QA$COf=Sf86`eup~ET z4OeG6iLXT<|1#YV8=6pd0G3W5b%js#6PBk;isyJ%D z_E)kMfs?0m*!8k;efYX+=Js*^1Fb4Boc4`G&c+0=Xz zhR^EuoDIk1(maJT(^b1?#jux;Pef=?m(&b>m+ctx1X-tT@e^s_T1lYusutzkbzHak zNy_)p3T`eD>gANblvo5loa6=#U<|>VG~ zT$_s{>~jyS+?C_1t3uAeUF!n1pnHNAdz_z>%Vm`jPIWD)R@dCjP8ZDns)I4K+;VLz z#iLyGyfIuqm}wM@pC^lOL5ngrEr@mI9zB!ZZxq+iGU(}{8_`=Wxzwi8&w+y@k3o_4 zc~1=(Gq&k7y7O;tV@?YjhInl9ub3E?Ze;14<34gKb~*THywDuGuj{bS@#LF?JT)H1 zBp{hG{$ku)617FNDp)^ZOlAkSm1Rnmy7F=C$*ENQ-r?08vHr0UX_qVEsYHGOY%6|{dIw#i1KJN(TR zuHzLiWli$cAwJ+6P;UcyGuBaH-RxJInFbuc)Ti8B%CBB&vH|ZRz2~SRwUdWZwwh=sc4K{bk$+;P#~cUb96;{%1-r3Gp9$Kds>+0$f=3_u>M?uT&oZdn!}Tf4GwMcXR^6iDF44u5b;Z7%f{ibM47< zc61D#E*DYopvyC9S3x$$1dvf&6%EarlT#GOfaP-&^4z5@)?q@~(%|)I2N{d{=wy0% zP>76?94ILN+U>*jRgQEw9E zUB)!4naY>S7GaWJMCg*z^eotsf3>cMfV6w=7s(G>eUAl)qj*Ekdj| zA<_msV{V=LBGvkhGQ${&*wumJM|7*b_0C zB^!{1#-2nkejNCM;2re3kr{-0G9s`(_&&klNfB4p(w~9`rx^l4|yB5xp$rJ%WLyVdS zXlr-a!+~!{_0KI-^kiXt9*qtq8Yb9NcN_*J{gLD())6mRwhiu%nj2nr5s~2JENpBI zZ+N#xV#O`3m36@{aMOfKP=|bHG2A@XD7#K&&xZqH>zr@e=i@iQx2!P>-obTS*8VJ4 zUq}PoWMXO(zdwyUZs$~DZmnqXX&wh?;Mu%Gxu=x!mskTrXhhCCOCpq&jmU0VJk!W}S#1M9vXj!V^F|(;9#J{W>^o`UDTGH<^jj%)?Q_Y>K)?Ng^ZLC_s z8}ipp9~*iA?ARdX_>mB7gqMq*;+q(E!iOuqM|Ix7(-svMjQ#1E;Eh$bQvTC5*<(n@ zsXfWscp1e#o2Ed=s{UjXJs=o%S~csw-#%PsQtoF_VF+(5F}6cu>%2vSHDw0C4Aewt zmzBVe*Pnqfo=iW}&Ofh>b3cwE_Yl|2TgV&%II)DOWzIye=rKT=s4k4y?~WSki5{sObNZchBIS<$KD|Y-%H4nyJaBD((g2Uxa{#$MO5`ne2A{ zQ(4Ywi0>E&vXPSO`l$O+$QH6wM@}ls#WCK~d6|?ia22Xw(&>kkLU!TF*2xN-G9_81 z75*j**`W4!*LiPl-_!=c=5h_>(!Ft&Gj)||uUo~T!trs`nb|~2!&!n!JG-dZ9~5YJ z1nKHN>PkTROef^n>)`!sxH#rR`i2QhS@YaInC&LK(=A($-)BRQSCUkT-JWEN*^TJF ztkTzF$0_c+5&BYidTC+6K9uBXNR-#7snI~vB{}@TUakup&vmcs!29AbFMSIZ>($qK z&c0yO);efJ)Bw+yKeOD{d;TtxS2w?Mkhy4bp}a5IyY3*C3mN!rO(hd$fgoQv$%`3i z$d<$_5XLaf6@=dbS!*eoYVL_wPdxY)WKwj>@+#V;vhQhXA$WqQ0zLCUR(P)D3i13! z*4W7!Ph6^(DB7Zyq#F$*yJFsx=-!FOFqpH*vi@uXy&0|x*0``R(VAAuG&?BS?og_0 zT!RcD-rW1JIth>7;$p7C{YzEUK=ji%<_^8Vly%RI7-q66*gPwKX(H=$rqSqTor8XS zqwU(CzivC4-vM5wC@fq1OX-3;DQAo*(MC17)7fl$GbUwH>#~*aMl(l+yb#x`Vq2J! zv-jyXdwSU;__H>=ZSK^k!*0VMz|q>n#Evg(LhCiRG3&8!1inygs_8G5kbE8Ah`4Mz z%OfiztY+RME_a1ZCx&iTdl+>Ho!QLHy&K#`RJ1gZL*F(*c3u+8_UDf#wExxbn3sf& zld?vLUM1KQzi*SfvAqinHADJ^pQvmbOH$-YgEd?n=YWN!yla}o#nZ;7`*{vKnau&- z=!l%Q&PM9ZrqH+uhGr@`)~Sm1Pga$7J2R*%_vsVYk&(~LL=Y54j9T3{T}2Jg8BAu( zEmafSXN8Veqh{jeTXU{`&z_&MKA(*c#}8yWG3t&zmNj#T*@b8JyM%XaNM*dB9dUi% zR!!0&Y$OUj2v=5Yd4)*B1UlHAlFdW6)&2_1+?coJ&$bB|SXWRu&2a-{GrrNl)#3>4 z1u;<%jnyfZPMjdqVD{BAs%xMqspn_(dhwIF*e1`}Mpk!rp~7|vZLB{3Hi@a8p?o_q zaGp8?Oa+~K^i%!SGvy!qxBou(pM=-wZg-8#180EMl6w~;{b02}`BP$V^E^&G>?bF` z8tb*kY~SvGKZMVk*km*n<^t1ljfYifm_uUsqf0nTW>gq-%IkZXG^u!n+@=l8`qCd4 zZFiAVZqh_J#kT1pf}#jI9{?4f$@&h7jChHcUbON2JeeqN(uGDE0m&Aj><9(Uj?U5n zQ5tNLP#yq;k$^^1!w#oh)y%p?qz!}V7QKG4lr)-SH?MWOT_y3Sl}=A0BL(B|n3w3r zz+0Mf^T^`(Vxf=zqSwbmWaVOKkaMjHbNpzNDp%GC+sJ*WVMA2w$sxL%)>*oayWNYU zIH(k=^v`xh$@ASP$#7w}wztM+53$zIYg_#&zc%4*38#lfM zq$8h!`UNid96tZp$06zRlynn3^tWd*POO~o9!hxvW$?-%3PT}OFdDa4&28K~(lIQZ zeu5Ks>Zqy{w(z(=0AY`>b9Y+BpVZj-3<;x``~#U~_5M$WT>@$o%4Ka5h<)3ao#=ul z(B+CpPf~ubWcEZsZTNVRSfBWY+Zna|pR9)C!X{%OK} zHbKWQrk~L_Viktk`fthEc+k00|KJE_1?H|)dNW^^wkWm}R;F9l){w;87arXAXbT6o zgX^YemdJ!?U%`TXw^%Bb{k{)?Cn475ujBjhvLy#xqv?u>H4A2$EQ@$!d(koTxGD?c zMaL53S;&1r)BR{=pvI3%fAZ3LffQ+NZRGYiqtoT}05EjS{*Q^_|0bq?Eb-4f;}v*z z5Da9Pz=pFo{8sa?l>6E0b0gmj70y!__4z_oG|NI=v|f&=x$;C4vKY(tR&BLpbx1_V zYumM6*&&Oci@M|9Bee$Ivl5x!p(6b7TK$%fr6K4}Y?8ja;9Yr~SBY~`?0_5l3f9?p zvd6pEhc&lkvJ>W(#uj0@qIbVVB=q$jX8aaxtbT0Ij6(9UIQ;s}!*Y$rViogQof(!IGB=?*{5>eEJ<`_*Unl0hrVQ|_s zLcZo{jy%_GDq{l#h+bu9n?`7sQUz`8^mBkMz|-|c6k2Wu&G?3>j--i2}Ahi7H~#2(RRnsXKzLdy`*;*1ijn~>Ud539z*}T zjApf_UiL?inWiJh8r4Vhd$0=NkU~G9$kTtit%XwG6mZ8l(fNV)tTkBh_20En?TzZf zIWBx7O8Ya%ANSEu0CZc>vP${%-}auch$xgqj3Y2V650HlF7DYppveWZ{om)+@?Id-A7}l~JilqoP(S8l>`6L^m!XZ9Q}KlyW?W4C^PF2TiaQETmj7GV#3TV)_N9dYhoy(U+rU z#;7ZsGf~K;QpFot-w!HbfR4-+2+a-EbcvKe9GipF=JYH*3(=1qR!3_lRs^<=`MR$s z9XA6tRARqbP!ttzLLu&~G?IpCoQd_uQ7Ya)2=-;7a!A;kLsMbXL(ygFbA-ZeIp$4T zm@YKH?n0GDO>*een)9?5Cr!sJZ- z&uhA37qN-gTB!i z@jODmTQ}EtG<=m_n=j4#T z4%<=s7$UwDqwn(Ne1vA@&*7O}-6YN${ft&`ivyeC+p8b3Whxs$)m&g@QdWD4m0Js^ zQyw=sZEh93722=bwH3s4g^CRh(k|E~9A2-_ef8-7Ux=_&5;d=?qg}q&ar+#WcE1|# z-ty@6$NQRm0==s2T6Y>o?7=wHL_V@RyZR&3a9;85AT4-*NAYnTb3rquM2GQr9~Rx! z%+*G?K{6hY|H-EJP0_XSmW40ZCt8%Zm41 z3m(BEQ9Ol}`JtI+FypPx;W7{CmEa_FucS@!d}{e4CUpKQY|UQD9z3KB@y8AfG}#XA z%-c+x9aTKpf#;MR!b3uvs0C+?Z9QgnR|2sWX5Ff66=!Q|mOF3GfogG`_I5~?DaN7c zW-^OPXlx4xphs+rwnHE8Z?5-DTF)PCjJJbRXZR@vDZ3)ou`~C-%Flu_f#R+og}n#w zvGF(HopbN(hmX)p6mvdxL4JL*D~8N$is4a-dA z{_2<5tny|1)8w(m)#(F`z}9R!kx;IwQ7iVdFaoXqXb8@-OBgXoL=<+#?btebgq0RZ z%K(3ITgXRxL%DVEw6o=2$TaaFi@ROV8LMCb!Wgbv=Iuznkwn2fspy(Klmua);q4@^ z{Pqk~5`OPL=sZH&hZWAJH)O<|?CjqElYZVZO@~7Ad(F$-q|C3cJX$Qbs%rPuuoDw`Ik30S66UA4iWJ;_3~yliAxEFTj$dWs;_L<9O-igdd`03 zD{d8+p|R*}3gO%CYmhs%4o|+Il>5)B|4S46O-yw$^k$^eL^%rFSxYfc^M-SSe3neX z#d3Mmo=<3QpRaClM#Uw%dxus)i(IX+-VZC$+`k|fGKj|9R&nNOGj@cNT&6>b?wNdIU@eKm&&h_{8pRufD zdjkfS9{_j9%?3dRZ=N;0GVk1YbeO)sT4MQBS&KBESZC_$74!h`cO)={>m%$B%+<6A ze|i9P@}sfuu>dYC9rXSWb#ES*)W5ckYF0Mdpyq64lQ>{G=8%?Y0~RVOCWvNAg^1>W z=IpOhb4bfToNYoJLec;er^=xO(?Z1*hcZWSp6AZ$ea_xz@ArAm-k<05zUO?-;Sc!& zvREwE`rh~Vx~}`WyR-X#i}Wc(ljc)J{^uRQ7&NQ--5m;y#-4B4)q7~$>`jZ<$`-e& z8v9BEsjf+>i6ahQ4VhI8r%4*9i87&wL@Cpi3?Z|{6D>q|EmXS ztL~Ra3+lMiX2Z{+dXGTGvN|GHGqvGb9Rd&8w#nmYlZNJ~K3L}wy~gQ^O!|JqoekoK zg-+Y*OSWI3H!98>!j`k*8*cM=;RZAw|HHZTx8W9)g^GgV^Fqg8ChGT&DufnTxp<^x z-8vBM5$3w{`|hBU^@+uftV>tZhk}z%Z6F#fS(QfbZj?oLf&s&P*j;Jw zzxV#X{pOff4wVcT<}&LHvO=sb2sYhi!0pWr6W(NTo;8W85BZ;)>ZdboWhWz z#gU2F@1#%rd+p)_E-4u{( zO;p6;K-N8?OFgXek{ew>y0|kWjZIZY(0p^Jn&I(XTsq}KHDxKTs))rHMsS%&t9$Kf z#sx0+`9Yt?neH^B<3HD#2Ua_Bb-#s{uc1jS{TbRu;4>rl1(IQbpu!@M$HBT3ZA%*| z(G@Nll32Rcg3zpD)?{c;{+^4pUi|5|5+`DtdqJ#J-inieW3m0DV56>rH}Ua?H%l-N zE6c`JZmexscZCJ;%WqK}(3KJ|dR z0;7*QL1v#xz_K&Cq;ESMkD1Ej>&|#mjD{G7xu>TVV&8ifa%odr&Y1R7InDl?kIIHa z$V2+S41}+b)TVzeAQQ}^dRPTC?WT*~R&2SXYn_JQd;SXdAfOlX8O0BM>24Zs`3={U zkJNcVN#EQf^c$|Q9aX&U20`tM{SO5`Z61`eU|QIRKRo6cyZLhP*LjOhyiw6DC`rzG zttb14S)*uw+y|ZL-G!cg_#G_1H0}JDk_V#?TLlLf0aV@7 zQ%qZV&on%}K!77(VG3YXn~I=;M1*4xRh_Gy+bpFfZ>YD=v}ddVdh{ z1Rt@(jxW6-4(T&c2X)xUJ|P!*+4@EtAS?MectgVtc{#&IBs>_vR$R}rkwI#+)XGA! zcuYeMx*-eQAQ#l(8jeMDkQ_|afb@-QQ~)is5%-K6hitlic{6#$pNd6tw99(%VL$~i z1=(Ef8QKP{5n+U95|-Rs^0R}USi@!3F_ep|%q31uY?{Owt~j!ijX|ro6ml;uMkpk( z=z|k*A~{0&y0IQQt00PatIwBm4S#jCXZU$gAFK#!4{Xn$%oyYlMSNeXnaB&{sNse8 zipik$<%r%c04*WU4NlB1iQIZ7awLX}W#b+_Kp1sSDH3t;-3Uk#~Lwy{o(u_8py`P9nUPo6wtk!_X!gW#K8XTCpt`BK8^CndvA zqvTC1pLdmEr#t#`NR{aP*SSXQu^X19nHP%!=c}krdMySlJR)|x!8BqOP1Apw~qb0;QYV3i~q~n0e0-cEK4DtT_&!= zTZ?^}78udh-WSuKXQfkN+oiO&pJQ~W55K!_F%;NK#cJbZLQ0ZFte^I@^Z`G(U zZpiyIfq1H__rku%!D9bLx|?TuFQ5NS-J%VaIzL{R5bXLh31`G5+8a7sFI|7#uc^kx z$ZIr{_R8cNZ|lfvwg?dEq_%!UI^RebmAUdPJrVlEe-~5FSHIHPYMktVD*INta)KHY zZG1CAJj>!3f9uOY|D={*#fRSR4yz6cEEMF}f7(Sk@6l9BnZ4wG-($E@Dp$5%s)X^W zSGwX-%Ik`a5hdBjFK6nv*}>i;XghlkY#F_P?9wD>U$%NO6wWdd85?LoB9VU1ddikE zo_^tVIGK_nL<2d+*w|*M@nBV=Fe5&?{%65UGyb+#KV?NrvvIbz>Ds@7ucWoU@R+`mJ zID;v~a>*c9DvQ7(P}QLhR8Y(7&3nJm<#P5t7|8bzEWciLBcrG(eG3+9`rgYHE^F6h zd2YN++dBJk?M?ritvB~)YMPF2s+SmbZj&YI!SxQYII7pL43ysU9`q~)t5w+-Jm~o7 z)Y3!ssvrWTz#(0kuJ@j4>k3-c%kt8IDgcu?W_4F@gg22m7@oD>Or(o`7EQdA*`{6& zii>~8A8iG%AUTD-MX#w?1h>mB7fPgJp)78c(W~j`JimgW{W*PsSpr|c6=Z9(B_OSU zh_S5Y&N`}P`?A5591`jWhgOdXqfywn@Rr!Lprc118MzYygVHX}EVvU+i)yN{95Au$ zoxewiaKak;WLWB|$=p;7@|IaV2~MQdL-C@m2akBG=d&_iOs-`UnO%-Q-}S~i0=UUn zamWjs!i@mvISac5M;^u1I)*raA}kf5`wp_i3QqZ_2#e64RE^3af5eZ%x@LZhe0~Z+ zx-OfnPl?Hs2s!h|DeqpqCadFpsLVbno=jiY%6&jVVTPFm(ar|zDXfnQLts)kLoqGv zbuFVf)_faXi_&qh_-5|@nQFKMqXC!&j&`BuSa;EkNc-s3a<$T{LULU;&YM!f=9jzr zaG(KHQ)SdyeTF)OOC$$#fq3j1K@^hD-chn!;)JA>hx&*k$5v;A=RvDg%C4%rwrBko zk@3A6j%D*{Q;u-PAT*9Xf?t!OVqB95q9ssB+A8N{zm@ikH@UtKU)|NktsG@nhwxiy zFI@s>2NA8=ARFad$`C&RX6Tx2z-&)A2I9Y1Fwuh#=U^bb>OnOz3BM=3K9>keDzAqT z4wh{LxVG5{l8@_sayX}G9RGz!fiH{0idPk$t5i_kjV8_JKRWnq9n7 z(bZZ^AB7X2?fRZKa7-Gb5AbT^l(dgy+GX(S&|=mK3Rz66K&;shLSRv5U@z~A=4ef$ z@=(~$vSnr~?dNRNe6Sqtw@4E}QfU1K1T!-_fFWBtaRc~E7klhyUTop1Jw}f1zB<^6 zHsQ@OtCXFWmx~8oY67-0F5w#Cdwo!9w!FE5ApyCYMh;$69Cf*_4-_nMi4>GNG=NqE ziTcN@^ge%8xrytnCv)z;9!K13?p;=GvZLWyomEBK4cRY}S3-%dlt;JoBxQ}=?6xsT z6m63d<5H6D5KzB<)vB1aYPJ32KW^@C<9}FQRwesmWicaqMu5 zgjKVoJm*~%r+r|`)ZZc#j%;Oz=^Y0La~BPsuK7RT7@0bBG@>emIDhX$?{n;-*C%+9 z@*zpD-!}FZ7D>+^;0QuWeU3&}ndYl~>(6nTab4{hJSaDpac`oA38?wd#sNjDIX*{@lh=xdXcu!$9TwF;ivt!vyG&uZRP92$7Ou+5#`xgu zqL4$ej*mKHi&v5)9HWLjDvjy1o=gx_kUrtss1Xafs_@}$10hW`CrT<-+qpB)bm8KV zkx8o=cc&Be1mhY;~m|lUr;Kz)H0svsK%>E9a+9 z%(wOpVgODJKrdIZQ+*RrKNx!IB~2CfQkVlzn)t;OBV@QH6=db5-8JV;?tl|2UgE=P zrUA2Gx8j4Ni4gl*4KR_aNe24=fRIH)z})dat|}lWR=#esOShCdnt_h)v_8||ic9@1 z!e-GaQ&GPt&QEM(q_S2eDp@e$=q(7HtnOk@)f)WD%33M<#+q=MJfs*DuLK{I+3Oaa zhN5eeWWwuvzA@?4xltq_&GQ=drx^JUh&k`KElhq>q|Vh9j^fnAyUTlA1BJ!3nOSOB z8?fSw(!Qb6&_T2>ENwBMA7`f{T6;(PevATjDNf<02LqqCSC(Dt4i1#I1FL>4z=O4! zyoqcu6-+V4F>~gF12AkNCAV1&l%#~Awv`gd;G-N)1rY=Q*b581%F1=e01RS&ri_#k zWgPuy3T*t3DUd*`L1Mqr8iUlLThZHC%w=me%Yx^rMR0+?l)k z$`jBl3UwalP-Zi0)X3aOX1*m7M^WKr{sI;gsOu@CK*R1!0Vlaqo8OSbc7-V3r$gtF{lSWd6NZ`cJ-Hd^nBYK{`Yp15a% zs=rF0sC(CZW*z1$Y@;?4KkF8073@&>6_Kx+ zn&U(zUcDgTPHwk3kn<1Q`TOwSPK5g+15h(|60{-lFtfDjh#HSqrv@(6%_`pxxQ?!$ zvRpKKOYnd7forRn`sRp_&AoZt1KD9kyvp#F5e_{;qVg?!_lLN)8qNB&ZytHp2QwSn ze=T{YD{_xNmw)%Vd}-+yrg-KqJ8wYqk-&X&LM9)7(6@e2I- zICYLu=-u?)a@ayh=p*lAg90@Ry{4Gq(=L5QEyGL_vc03@^H!0r zm-UXvjdRs+qnQBgDHBPrS=3}PmPIbCi$1w|SznGoYgRZMtsjqox_!Q_;3pv-l4x4n zc_Yr=z&3u=<4Mo~Nkb$j#5CaKiY(fYOWyaH zzuejanW1Ww(idsfT~Q4VjYNg!w&<>$zRsS{t=Os7Y!ju*(P4`D3bz^?6~O%FAJ;bc zYe&+e5J{ubhufP49WPLHV7|an-izHlHnpK)oyfP^^E~h?AA<)k%u&=j$T%!ycCfj! z2!W3hx_+J-rvSzozIt>)C_o;m*L-FPI{HQ9FSgl}RH)QoM0lBGP%WaBd}}$7Z%x=* ztIfGmIx`_;u7XP^t5`&4%?BI#BK}Lq_O=`DzeOGt{T2x#21g8@#hFh&kN%FXL7-Fn zeCqLZR_+HI*|DtTZHX^Op{2VA0s2Y|!>&07W;WAea~qV7?0llCW$T$K{Nqo{n<*6v z?KA)h2$4<$2llwIW+;xiuf=bNy(;v7;ZfGt-X7cmW5a5KZ$ZoK){H&H_MYy_!oJJgq?t%{cf=bMz_=P=`1L^~sE@xBMEJT|VoclA?ZI z5=1sCX7>BgYH=a(*`-l@8>LRH?|@l4#13BL6rR^RpFec=JQl3G!Ndzs~p8`^m3@Q9DV_!k4>i< z`Yo1!-D+;`x1VJGl;~#JN_&YjnO~fs2KV55*E`^hrL)0lfGt<>1v|1^Y7cs0mTCm= zfp7)>WDLTej0F;2^+|hifK}vHGxh@txdx~6*wwr_fmr7^AFE-8e1!etLv^BA;~=y! z;>RA;1eLt**EYXetEsb*oF|s-zv@u4VTUZ5L|mTVkSAG1J`g|Ht{(2qU$H2-ikK&b z=kcMD1=`sP<#s<7c118>IallK~WC{E1E zxj#H(>7eTSa%@Y9bKyY)Z+)a%Y2DzPSBJ?u_Y%Gpyl}Kvk_1av3}eJUE2e3&#LS1X>-x*n>dg0L2iTK=#~3o!)Tle)Q`w z6y6a$VbJ~va;^M>vf^j$ESo@|Ccc5pm7-_&4eODL!!~!l6>4WnF~Mm))lM?GUxvK` ziKpSI%I~L@uZ$>Hw!Tof_~v`HTa3=u<(1-wx4ap7@)MTlgz@#6!p+UwdbS_o?28Lk zpHaRyw|&nPwfJFk#fQ7!57vjY0v4quI$*&m>g78_bJbM3$piyLugtm~6~ zZ#FtDRW%MdA)E9h6Q3+g{iR2{Jkp&ggjm^a`pjP{xbqfsB9sZHZG}c!pZ<>plq1}f)IrplMU8NvoKQn&zFOLN9;tn2xjCCo5WeHtF2%?2j zu71Q@uF#4k+i(o0hdSi=a*ZxZe+Yh%Vhb$tq)^eVq|7d)Rir?4TtrmazxmtGDt|Sj zOqDaHTB%nLI8^URJk_R+B>J^|7pfyP?Bp9xPiI`#xpU)o*$a;($Ix^8RLhS)4tO%1 zPXnL_xPyy?ZqVip4&D=kPB5N??>dE`EXEDHNoo4(zm+ZJ)W%)f@)ZL7m$4fx=4#r+Bh| z!O&Z}{P3Vh*5M1Phx!3So1{0twx6z`RyPOsK%yEss-<4f(K2p<$e~gW1|WC}0D336 zPjpD^J$D3iQzj^l11_zR=J5b@T6MP_G{Zr6aTgSCvNp=@r>*y$5y9Q~&oNAX#r)!5 ze%b;%BBj%5OK7JbB^pucQ!~t_(lL^|<+*vT$q(?0sIVPYu7&<`< z@w2pR634uK?@)u=5!EO>*#yKyPR&q^HOK&LA9b4Sbbhx6tH%lyzR-y*f(De4@tVVk z(6-^`XF4}jMl}W<#1+Fau6lHOrn+?qodVS7rN$tE1-?YFc~`cQq-fW7bCrgFzFhTT^S-jb-LGl;{F( z)`SW(*QaJ&9RLnyz^s}*;IpSrFV7wOTnMkEn)2glpMumnH&Ap6TkJ;Er=xXuE%cQj zp&mnA2Cd31hdWVIJrem_p#+)k{#|?*fz=T*= zGxMtO0KtG*tg_krav2o3_@RqDb_xuEHkcTX$VmiV(^6(k$dp;Bt&?q2K7S#r1 zc^E`+6kh&rcXY1pJephrQbi)>Iok{jRIGi@8R@E)WVr!mh)&R=?a-_jY_+a%Tq@G~ z&gMrVqKaj^%Xc=s9M`eRfH~^3u&F-Yz7{WfGw=`LzYLAg80*q1K=NXkCxv6I2(?%_ zBNBaZUXdRU72xagtR0(m5~_k=*e=3n2}KUczdjY%;OB*vtx4LmyI560u6V5L>D^<0 z`@;X~eiO@}uRR9(*mEJLo&tOAQA_VMy75%^%MWP0toA0aJr7S2NJpCb@5E`_wH78C z4>UqdA|LhU@+YeXOSgd13q0tt$o=o0ZO@Irv!M3jPTm#&n36UF*>moX9#MCd+%^d= zJ>48v^?dto>Oj|%5~EP-Dx;%ylov!jLtAF2Rgy`qI(~llW3dPQUELGWcF5Ar&__ja zRoX+tQm-`4OAHAkY1uH#V;R}!j@uQ^B!OopDGoedl-k6;M0t8exZ7h5UGy~7ujk!O zUy|ANIm`VyTN0RdlKBs;XgU3GT?RV!vGU#Ch~zRAP+S9UZz3ecR+1weS2Axq z`+sv}@H=x-%CgNRG%Y)LY}cluovdC*cx6HJtQXC+xVqSNn*>CBle1MNS3{rURr4I7 zfJ@~u1|jnSTGd(Q@SG4XK#1NE*~9)5#1LEp*^tMesljsAfrw@!j(Gl)VP@o#Uok-u zY#+jRuM65(C>&!+i`5s~a#l$#&Ng7!qQIx3sBm_YOdv=0kB#yKk;9s_`XSL))kvT= zQWd}LPi-XIiPK*_@r1stMagUu)5F*~Tpj(w67)o#e}={)c#KLGkIiEMm^p94p2eUB z^BBV}ZitD`Hcm5FVlQKe6Qc0WZT{F$6WeBZu+QM=qvcufjt zaz?bIS^Gf>hB12pwb-$yfDM|O0dSzl6Qk!b7|$=PJXb3WCR?(aHDOOy#g)y>ZcrXe zG&at^f17B9W*#qagmY+QP%w#??Z6_TpwR%#?TEDUBDW2<-`#eKTJl@O(J&b^i|h~W z8+K@dzPq41Q_XRB9ecwIs~meEWyi;SzB)YSL|o@g`f8U)gS30CP=J>R0+m0{Ydfr) z%24xBeQF;7`svN;eMEu_NC+5_tOdYl!5uWAH!IsEWOnfE#EW?qVVg{_rTr=hLzY8= z>_E48eOBI7btHhDwNR;sb44xPqCKD8oAwWhf6gj-lw*D1>D%&8uSyDb-Z+uBeWw`r z2;b#epIp{MSoc`-ST`9Wu3tY&P;rSnH|nq#vo#I%LF}&A0p_U~?IfwH_AmX0)X>W% zvNH0DQ|0F~7P8Ft=M)ClJTVKzJjwmSd6N8dbd&GaE>+kwwzKbFXHrcL zSvJQgo!?E_*qn1guBEqvh(Qy96QgTJNLCY*H-#3?Y7}g_c3Hm<=S>clbxY;aN0G>4 zvL=&cmwkp>r5-%*IuZ3HUb{8n4PU((C^A{aS_hI~K*7QM+9ADPE0H1tcnlPtYXxOi zuX|GfwI7GvckH$p*v+h#`Lwxm;yAFJHJYW-X~x07MgGE9R*NWky-Iqry$zO)PWN?m zTx|t$%W^+hQE4349*JsQgk6%2(|{Ciq0=q8jjvhr67XI0CIcqI{xnF}a(OEWfQ9`3 zh&K5cfK3PR_&?I?-~xzUA%RkLR=%n!S=!}Q5r&d7F$Eh zyRXfkEK(2Z<7O)WP$v1kQRnXMRh1l{lNDD>g}c=_G$wz7s{W0t!DIkPDH9ds0CEY7 zazFKJZ6`4m2+6kSfeu=apt>cgN*!YzNz32*9(b$9#|fYmgT<*SPrJ+ zTF}T3Ew3B^hufCyXZi&<5g2s34=)|Cex61_P}V>4_dvKNXq9`0{sqylIQqsa$=Hld z7Qxz!x2p{d@v7tx;ORBAc|F>N6-QF}H|km3N##t*6JSA)+vZLn%isxjl=6!Z9oc_4 zEMV;&B1Fvds;-}Te|q>eB!f65*seyWm_AzMTM4Zvy@p#W`k7sA0KEi>Dh@c_YTq*f z=ZDGRmnL+GbIUvPCDJXjFHN)-tnJuBcqMXBzzFbuMcBUSQn4x~+Mf)v{Rm}Ce?!$|AKapOvFIpN?X$k74 zJQ+GGP?Q6*Z~;~x;k{OjjB~mP-8C{ugz7mJ8^9^FpG~^lNxRl^RW9eG&mLd zPrT%g{{DNv@!GbnAKhnW2=o_HAr z@Y&mdifdG=zU#N&BHD}iBO-0R9Qkh}KyRN4R+7knB{BQYp#ivBZWsqnjV|{D8GYXL z9{2~xjk>_`pRKd33H;+NQUCcJ|M5&miZKg%({5plq|ZdBRngiHrMElkZf8!Go8M!z z=4E=mQhSc5<1|aV;L)8{iBv;wRk(a>uIU@)`TYUt*%y9~OzE@m2@8^I46%Y7*$5jE z%QJ=i@G+A9@s!`eW;(Uj5X0HsXz#MzTA+YQ+%{NvpwG(ZlzFDm6^r&h*;`{qFU=aY z4l3jWDPg~CR?DEP=nouCKtP!JWK%eUIr*v@t_L~fcGX0a;YGfWc4B>76*dxU7X*aQ`$ns zUgZLz`D@kM_tJzvG5TYCsjQP_r?nnA6~+9HA^`mukXAV0OQ~+cSCR{vvt!JxCUA}{ zE3`^w8E^uq#RD_S6fY<8B@jw13|Imo5{qw5OEqiWjO5q(`xA!}QZh*?TGLJq&sv7js3hr}_FRvJve^OW$X zFb2SQC>aD`41$CL>554GG0<{q`c=?8$@yyg-~~Z~(KFpEwJwclGHMb!%p8 z!E_JQ@wW&G*S>rf{rbdGAQyv}eV5UFwHF|kX~u?sLMnYJSY+ZXR@@%&Zg|DQBY&!) zbGO8VhDQ36IRm1^rz++!i;V-nc9}*yVWLw}SiBZ9Tb@_uirgur8qT{S=9i=JpV&}9 zObKxcSbx&djmBC>zPxpx%vhSJ&OMkWekHUbB`2WDmQD^~ZGk`Fv#SShJ7`kdRs}tX zRYv}v{qo(?cmhEHOfx#5AFrurR$Opi%*iP%Vok(2MTHGi!l>;~%ZZ2!?8f~Tk;b}; z;~2B^+_Kg$!;4}p6{9X|wLZ6aFhyF%gI;e^@Sx}2Yn zPFV=D)K+z|mvxBeyAskaYL@Fw4_?k{GkSc3tmlKfhVFp9&$|8(oBR9l-$?%tE^ta4 zI4fpDE)%b=%V&1FBhDP0>IkxZzaMb%isXYi3R*x+NDpN_iSqP8Ke{~^S&QnqD01oV z+y7Ssz$3dvsp4+H+C)XRhv;?SU;lH&_^0=S5C9qJ5&)2i)_R!9s6VgGWj!|v2}nNu z0y9i`pv^a2vu6RUqndxdMB1`~FUqp5T_$p1jLPKJ>~5Gds#d^N|1lVeb_Bx24wc-} zYKGBDm@Z9aj8cyTFRg!-ogU73#cwg)NG}7bfF>R>X9pojXb}MR0I68EJs^9%N!b!W zuFKPAqM!lV8`IZhHj}#&K5W%9IFv6j_OPVGuaJ0*G(HV5~-4 z`hc|IpqEP4B>0yQTK!}QPN!&@(ceBtV?NoysEqSZfGa-^5tUYL=XyZ2&W5cvd{b$!LqBb zE4e{;Za-1~&~zq&+RkDU$F*3iK}lpy9BD7Ae!{bZaC1Y zT!37McxDB@DqNoqm=&q>rh2o=97)DN(g%>({?uULjt!)}0Bvg0CfdW$aUR4qw5{$? z$5dP84Jc+M&$Y=;R_wEU z57WAZS+da=>J{DEKW!ft)A68h;8dsUSBK|&Rg=h_K^B901%W&w70hJg)58IE3cwY? zxz+1Er~uK{lGBFDd3Eguwfk_4ckFDOPc;WLDF@+h5U~iP4^%i#F*7(MmoHKB(=5>d z^p<2yefzO<%Gn_#vK9v}>(AdMmwqwfU0!t!GJIp}WR-rlGJXk!$GARC+ntVp0pFkl z(n`cka-ZozxN6ymdswK;F8(;B)(661)=1+3>+E-yN;df~TB^<+lfuz~U*76b4H46v zHNKGA+Dj_~#SR7^^DBBr`;Z#LlUy!K#;%{WS}-{)+MPnw4)Hs5FHSIs z0D?A;zOf>J5i16%XG7onYMLjt`k2PW6?F6TP*IeKa5Xme#|p+F1Yz(`9u5ykNS>M>1&T#0fj=wPS#Gx=+T12+RS;H(XCN zh~;~Eo@)N3>Qpan&N^e73n}A~=E~t54Ac>pt?V!yURmDS(zMma!fjtzVQ{P})nsn? zk0Zanzjp57XT~q~zO>@JKYoYr)jpKn{7rUT1dz`Qgi zeYXm|^7mCKvi_e(rwkwW=N*7n;`^W6@1Dp^#a_K(neGq}QKCo3S96{s?yYK37i~08 z{`0o}!*B3Bl=2XGQ+G@8j;PVL{zy^a2J`x-%| zl82vOOF-XT8eM0|_ut${#uRotrpEi;JgYQz5&vdx()8Dv(D>)MT2IhbZh2j`$E;r5 zyzt^y|68=?DGN;YV>Yj3;DX$}LF-G-JCZBj!w~7ryyeS&GAaVTO{ao!MtG9ZaMtW^ zkpddrrF7{<(9^2R!MEBL3teqbmC1=eUaK0Qv>aKst~0S?yIjCeYwi4{Z0-1CZOhLc zZ_OkZnj}S98wW^s`WFxBPgq^hy($q>XN_nHG>i3Ed%kZTrC2u`Hx&B)Y6$fG+*lU* zlKXyx)R;6v0r%1L!m!`q#EAP=ad~9DC`WEkaZ8-`;+`+v^(i<)Bgi*GYo;wZcC2}R z((%}-`oZx4>>i&OtK6r%V&4+5ZQN@~ia%QAanFyR&Tk`-uBGdAmhlEMmw`F*M}{`B-4luH!d9W`8=YM_2Vr zkPT_SnpkvC8s{qiuy@Pnt~Xvf+sCph_M^S3;mVw=k~s&%E|(m4gI0Sa_1X9=fzx-w zkDR=c@}sV#YS8184B}VBd4jh6ec%2Q;#&tlC+{@-7>Z8tU!8sJw_Un3P-bf&%S7Ea zQ@6~QL4Ghmgux*D+d<#E_r<^5Q=B6u)GAUqQgOds(x#o^^Fn)%$(si@5n3mg-+Ier ztnM~Y(~9<=2=?x9_RaCQIr`zT^z0($LA*q-e?z}-DBzTbco%dhhwJhpE@ufZ@Wt-x}5x?6>6)T?D44X zQ?MuOF9n6!ka*dS#3tA){+BC6&?jm9GtCT;isi|KhCyny+F_>6`xe0b9shtpCs^Ye zySY+t=);AF7?zJ;RY+YkCvN_Z*P_4uQkt56C+NrDPkGR65_4>*S=q#J=E8UEXi132 zYv0FHajKa^O}bC&`qDi*;aZ9*pK>#;;9b847V|D1%ZFb3Ji%Ux{n%Ad(6gzOWBT=8 z7%;n7O1|XJdIZS~JABFTf14y_(dB$mWK;orCxR2J@K9Kn-rkaH#Wj+$Q*&Y6`qcr}$!@xjX z&b+Pw^X1&2bUT+^)(3IL8_o>lvV(d$+Q)JEdycX%!5t*5BOidvP&n{Nj}MA5=u%XG zYg@()OX9NKnA5j{hPL}wZ#X*&NNp8ZXdsH+94?RNw|r@#^^5lC8NJeclPm|b z4SH%7Pc3t8>f)oZ->5q&mpBFAsGw#(!0!(Z3q*f}W$z0cId@SN2$cx#0}>*14ph;6pA1cvBfbcv1+W54S8hicD-v1OrxdCkYFy^kKUzlqG#XaLtO1(g)jyxdlMa z-fa7oDJ&*;+*MgdLh)2hE#jPj95%$u71?#5vbefR-jCej_!4J04`T?(fY4wzlp)G! zmHuJ(*b(fqD`jkOijM}lMD8(i%>5|VE0#!4mb>&UIe<%J=7w{!iOXOBD0JM9ZfsHQ z!aHAP_D#b%1&H~utSDT97J0!byehB{_otiLA5d`0UK~I^B+5f?+&Z|$ZY7|=fu^27 z)no~=!=(Zqzlw@wS2-6!s~sptQ44uK7EehD6pf04m1@)xvpLcnO}NN%t`?D>@4Wcv zw5m4X&uX={FO0SRJc6559y(9<7A#_I6t*zT;$K|3ieU?_m}T>R>)L>oK%`j=2~J-Y zi7-Uu4P0D$PC9^R!dJ1kz{Iw)Vj&1%xlfSYisczbVY48IPikCe;9hybJ|kbQ3_qQivm5SnfaUVlT>l zLwlh|c*7~*`|?Q;k0D@gM3Vbl{Qy+|8>@N{5F7v4cK=xi5?w(Hp9hxFHLC}KO6|%5 zE6gPvP;AsoHWF+?7=a7tNtw_Hi9T*)SueP&gBTo2tgf5{)?G7;A~&yGGP!z8OS|`C z{s4Myv;&=0W2H4f#^U>ScNbZEioJbN7X+ujc-0P+*}(}Wg*+m~0fPuA2XZ+Fj0?-L zS?mb{8O{JmksheaI+!Vl+^r4)xbZ@JqMySp>7jS`i^9mq2dbh!`*owBEb!o5cPfo?f%l#Apbz>Y>O)N@{BFzTnO-`UJ;3Hz%+%2b2~ zPsPA$wxhYLqcdG%WK)~eW8y#URiS}{nLyn<#c9qblak8+MJT94pP*PykS^KD!CsqqR-+ z(tM{NxgQhNBsn~waPnhDb611sgNv)XfRr*#{CV06#qVlRdHBYTKN+h;%{?GFUK(xM z+9dk^jt{6V^RmA1H8~G~2EQd)6%xrfvNst6C8`etDh@aSSU!mMM^lf4dzYUno0}|q z85|>r??CyOh85wAjHcnk^BMr8+O-?QkgmimjX~(FwDq^caY0^mgLH3$F85{&}s+6KDUnseiox zHv*rF>!o8Qr5nl1q>2LBt$7RAc*z&n^m^LvY>pBU{insSTBM7CL7bg_&5wqMeOsFz zolIi5b$fKxg0EJ}-}#&aW5-B+CKg{fuT%FmHt?RySHk)9t4R-1`tQ}lfp(If5PkO6 z{skXji`6(oowcyJ+;u~d|35qwC43Cz$JuvX`>^-PovhR!Lr&^(8pU$)4$Kt_;pOQ% zk_3jDb;*~$=a|ly6Nx2nuV{X2J|=zlc4Xv*w4sJFc)KSAan_N2^9!YK(0H~uSV3ac z`&R1pGu3t9FKV-Y`i14zuD|rSlcg^8e)d7+!9k+9yTsAig4ar6c_B?@AcY)77slrCV8OzWj&Do zR2l3#uM(%=ngOtlX?DE+%Pe?7iQm z3C-^YU(7xjb@xKQr1q&hB@@aae%>ddbMxd^)&7E{=Q!+Ne2h+8ls9Brr0suVlGT!~ z0D=48xfsBC6A*O%q%u>Rc_-s1mdbZ5o~CG&Y47=_FEfeGD|<8vTyiV%71ukyQ}`~gLQJbioU zg_MCYkl7>s7q;TbxMDZnQh?0icOYAQ;kQ21w%3%(JyUZyRkj{v_(ayt@CNxCN5@AT zuX(m>ewe9A913MbN_fjzFtHN_n)mnBRg3%-O;IX$!sw=4)hqsRlf3QPv3AqYh`DWRByMMy+(XmM}NLNxWeose&MeBeB#5d?7p2^2YZx#u1&*Z zf;CcjgAxX@?qj|Eaf|!?ZY?d3nyvVW{(s})rUWyKV7fx<)4R}Hs({mboB=N}pc?bQ zI*8MPbbTFcTNMr4RVI0j`{28aE`ep0X_#@nE#OtASqzU%d5cTcZ3geozC{2n@1V-@ddQH?^tZ>< z{cD>*mrCR>y!%Kxf*Lva^^*?GAK%?8SM1{jQJDm5tU{}Lb*cXT8SjJ{O^20is^YAk znn&ZnJLDZ?J;g|Rg|P0|b&IMN&juQ#&>!4^Xz(v!#vA)zPzN5b_>IEKh#0un{Jig@)PYk(p{PwMTBg9*f8YH9>&4e*%VCNO# zRMf1Ocll>w9G$;o#Hp241}lRDdLUegek&0Sq%?TAFr@0MoZCLav6+I!tQUgdQDo&l zJW$Bj(h98l$@vmT|6-il7O!_|3-QOJkv^p6Af6`&nePiibpQw>1_J1}07Oo7G~wXq zdQg!ot+bU&sYQnv{GlGGv|6hO5xHkTic1B~d>Ncwkg22Gt-s#>EMScAvQd#vT-s-` zO2T;&J zWMqs^ZU&R&Ld3XM)6^qeL(_H*x_^{%9zWS7i!*F}|MYV$2oXy1qiU8`uLB~3)wcXy zw;SbOwn<|Gzh}i~puo&5n)a$X(ELuTTHr@kw?3o61WNC+)xK^%{nc7uVAow1$<*g# zCSZKc7=S`rr2g?*!$1oGn0SPG)0q{3Nm?7c#hO*4cKh)gkY*x*-IRjTS4?@ zWl_n&et<(%ci5B4;sA93z3d)w`h#A=e}%}{{bF(oCjCXZ`2=;HY{?W`DO!fGJPU0q z52u&5q>$UhZEk!zwip05gv0|LH21W~-)ME0?a8_2*Ch~v;yTOlS6>sbD=#O>S=Gjx zqYBW7VPnwrS8+cJdzN1z*|85GaOtH4T3=r)wGC+c#dnSE5$)OA+?88gNA3$6OZuZY zTDc49!7)}jIML4kA;wB6{Mm=xL(o?f4e*pAzy^(p!%V{C} zpl`Aw&s?8rDm1e1NOzgVhX8k&4l@ zxf)w|sG?Z=>$1C5tig*znKzH}H)r0Qn~AOA2N)eTQpz?g;S>BarNAqr>3MH0;tV>dhOT1Gn z-ij1<=e+4J3Y*mq#w9xWG7L$ zYq*3icbshub_OWOJXHRHcZTAp889tB(0<)(=jp%PHV)Z_8PlfLkh%Et``()CE$%Y! zdoCAxb%qy|#{6>Q>(&cSs0I&N{bk`;xI3=-_9ST2=B25Zwuo~?y-{B5HMet{-`)NZ z0eTa5kbtNP)5A*K-RQ;<654p^pPUkCiX+Y5@T0R(F#QC!8tKkRQoOokVPc0TWUc`U<&T`z+`Hyr8{r9={8Jo7oy?|y2Okv3+j_eC=^p)(hZz9{muVOO z8_MY7F79pka=%e7^H6_hbE)3X#8V{y+4(kW8Is|UQgpq}rVjg%DrXcw zrw$Fju5;+`m(fAv$QRj3mu@P``@e!8{WuRITq;dvyuJ9#w}H{(Gf9&$?A<}EBBy7+ ziH3r`tq5s|fZMhw&cI$ay-C?o$r)!ppK1MAJ9lVxcdk#;;DpL#viygK1cY6RiIT!8 zhD$@!{vOQ5<7$`u>Y7W!biWtZzSiw`v4h-Nu+`={Ub8=gY0R+`pObB)YP3_O>+`4n z5ANPPEXlsz_tw0dv%$19ZMJgGv@CJR1}o9j956woi3%0X0S)H{8!Q`CGzZi)L`0-a zAyKi}0#ieQ1aU?boN`Rf?)~f8dq3-0&$`#M-s5=pdXIg){e`60RdQYD_4}RY_xt&_ zle;blYF%H0U#6q>@#}`rLCRN4b;t7)eZKOjn`O9d#gXtFI!{Qx?Wp$6Z5v_T{p)Mf zHr)PyruI>+vwC_2=XiiyjMaCnUW1n4CV{#U@Cg!{i3ia!N@2S=RN+wy#wBumM8+RY zMeV*(AM|E4UQWkdMMl^atfbqr);$7hs%Vm1p#W$yFRQ$rx^!@XUjertflk-Poirl= zJ$)%#Kw!@zWpu+?Ti^|C5@aX%J2>Yvn_faZ$TwJNLb9VjuAJtNZ5Iq9H}FzPk)VKQ z#|JFfkd+cbaacCsK6%WoPy(HscqQsU_)k|;MnaT3M=<-D6usu-6kg-q)vT0%{v{u>s|5NMS@WA5&8#&anXuXZ(@db zHH|L^T~D+TY54$743)rPvl943Danva)W=!^12OsZ%02cuF_%wSY`{hiKShgUeoY!i z92R-C1LxaxWy|7#qxet1JYQ9<75lOuPxA;s?2lf-2J1ma$9)j=cRCC22~Al+A9P^w zhDb4TNyJTB%MS|LE`owsT|jq$L zIBVECHI;-ls|k}wAWj<*0KLodioK4$Dn>B0$eF{ z+oV9U!Gu4`rh3MUN;KreTYhR48cT!Gu(wp8i?hl=k4+EBpdB%`+QzKxpObkjXga|g zV!euJK+I$?#v%eS6K--nRKSel4@hto^9f3aH~t}?@*A7W)806*`db09N6W07>3t6B zc1yo(7S&9Od+t`QV1TJW1j^ZGP%d=_vg!e-$Cmb@*h&{iqq=z=WtF@o+cdU-rm z0}di2QYiLH7iyvXIfZWWae(;(;me$nkcyRqiz=c?di_)aew@YmSz*!;HV!0W8DpnK``ovqS|hwKb1-rd+l^_S5pJ`MxgHSLj!lBKL)Uxa6*Cr7?`_?R`}eC*r7u` z=WfiXuBoiP%Ou2zu7XRiWsc(mM%4v*f?fME=XE?q8knAK#mN;&437THija^L}~v&mCzUonKz& z+KC|^bUUu4upp+o6!^ZXu(2T2H0;^r-OcMM6l{Nt#rG#%?265qC3yyo1%js|3TILf1v?EsB&J zZz-gBk98OpBJc-{QHcz;u!K!dS!4JrLCr+ zO7Sz#nsXNC8Q~<>^KvXL)ZZ`m>S1&&2|CDTj)p?YLa_^CQyGAuP1PVxsWW>z)@ zj&zQRE(Hs4rABd<_;U6Q4%E{RNRa^>ZG#+%z`(~S6}1I$FQN_kSkCB5!5r5BXg>w( z(Eyi=!ZEy|QG6N*B(mG+(3pgwG?mM>5s^i3e@K{gerTdUh1+eqn56REpZ|5=-C+}P z30vV*&4B?(jlQpES=t!6V!*3-uKKmr=w(;1NRovEal_M}PD zB>5dSU1|7EqJ-}WrIAs{o8E}Z=1$XwhX!Cm|Jh^li!VtVU_D7L=*a`c;ut4Wjsyq% z1*D1o=6s|+r+S9R@uD^kEA?lnU#&`xqWZ!za1K>;>f_XYUd4~neqpb2SvdlW(Kr&9SBD7KG z2jadBNm2VE_px(d7Om`DyzqSD(RJglSRjaL;L)Z&c1$xu$p&6iUNCXYT+xC>n1uw) z6;YXyZQ+_Nl7N{lW@0WwoM^*)k(rj6?xv{xcJii1kR!3el+%I3IQnD46XN4P=4{5E zbWGXKN-v^A!2TWf)`r8&k$(KS$={|u!o9%my_&9TXMTbPsMwRVk6Ji?xHnWN)&%R3 z=~yc&-x*i5j^-E*AA!P)K_WwSv+?ujA#GoO;$!NF~)*c)K zdP`F11dY`|z{vX0yJ`NiJ{1a!Y+%dudWMl@2szoq>^a4-Tk7=Ryqy%6{jRFd9_6ls zW+%>Y47i5eFFaEDK*$e>&x}&<-|zeX{KX9)yNq$ecFlXbZ@&32zNCf0r|1}j+`TmQ z>PGb*hQZ+vlhK5V!pu+ILp$m?DW};T?Y5hi8TRSc zR8{>n=n_~3kYcTd866LRC#kwmN6J;r6JthaP2kCm+$`VCKUuDza0 z&&+-u0L8hNR?oPX0-#fzDjpZtq7olPjSP&{@J1ShlI^OhjVEZ9lQ147221zajfJ}B zvcR~`&Az&yxaXFTF4o485RGj#{h*sHd9+5qSGO`RcUy=R(a7xml#u#(M|1A(TJyIk z=uZnlla_Uicj6<#t&ZSZ$yfn0W*Rm(%oz3(BY=mN7Cp(xp66n?MT;ZB|6N5jD%>~Y z?A<#SynBqd3M|${)PdVwMxa~K2WCoTP#DLX@9Y~HT7=udtg7TS`(r+~;`9+GU4snq zUSAN=J0ylQ`8Y5n%r|X(u?C^w6ni3qYR|5N4Tt?$VP3$gouRT#H5J$W-HdE(2rPz1 zoS|V120_IFj0+Q%CU%ad3OOS8PUSLJL8IEq7={?lTpg;xE4RG%CT*#kF zOIA4yfB8Jq^Z^Z%hfXDUy+bzS0AcO!e&Gmfi>X(_U7=y|&8ZA*g^4(5G);^RWHp3= zD#VlwMcQltv(ZT}qEf7yT#8v(;EWZtVhyorsmKb88bfM?0n*Vw4gvh_GZa z`(t{7&~4n&B73&@+&e=o=DP^(7XcRBk-ssVgPeP?G=X#(1wp~`NjF>hJSl(nY&NTM zW}uV8A8uNFv^nm2$ngkU6j_XpHJoWhrHJFEX5#}!H*O#6P(Ol86Fx4+r(6PZNMqVT zr>b5?&E^MkC1Dst!SVz&h$M(t$h5Hx8cKiDP)@FcD~5ihaD(@R@I-4NJk~k`3D_L$u-@OUtWEK>Rc71%V}<>nV5`7 zNtadp$QHLBIS6KwOt`;H2q1oM3|2vk-Lk0@TnRd8$Fy#dCTJIU=*1C7M(kaNh>+#kTHd{L7{NjSD~yCcBQ2u0$WV7cTL$|^^*9+h(#7W>wrw)llY z;$q}@8Y4#_!m||cmMs^r$JU_4O5aBMFE5=6{)19R%JIC_>dQ`=;>q3EfnhQswq@D` z@R)2k@dHjtjE)GXXp`r`^JlAvK*(TPM#PMrWxwdrQ~HVPm@dnZQKq0!YjlhzfrXMi zBh{HiYY++!e#igi9|Pe%;*&-5e%Ia4KY6+Lmg>oe?{FCV8|wDWj)_@U=W4e5wcSs9 z^pw&6bU)vdP9m2Hw;S)-cPGhURuc0RWA|6b|G!I;y~Vd~hjT$-Il;5N^@!g|!gCf5 zmUgOf^KpFydpS$bgpu2xfr=~96`^-Nv$(w$fwd69(!j#1qlwlcMbH?tu=aEVFh9Z4 zO=6H|Y(DDyvWFA;DDF7_h6Ds+gnV!W`cl;VQ~R+4P~ zrE7P8DheWrV9*V*G8rwp4IoxplZt3|kIMA9WNsn0qYQN8Nxrc|#&Sl-2$oz`zZjyR zF@UI<0-PNX37Am)&3@`ZvNhebFcYxrKAXM_kRc-NJFrs|6d4&R5@ZhyH|Ij4@@(Rj zOf7AQ8dAyJ-YGBODVi4lOeN3Z-&I}?K5@ib-8C=27yic zsL;^yP#Gt8^-Av(65)Du+Pb2*fCjemRtN5;Te}aXiNb^Nl{oiLTRVW{z;^2m2(rSUWAlf}|nRY1~?mIg_fVxEAv_O;uDEf8JEOkRS;I z&3u`&&x|1Z-CED>KKWdLFGy(xa%uqw8CQ)ZKLu6!Rb=Qk{|4XEHYsRb?-ja+@^@PlTs$OF_ z1JpsowKb&bpRcWM!5WvemGl@-DV9~|<9S3F0y@UZo|z9WCs+2B5ym|hnLZH}dN@eJ zD7(CIm_B+1i)euRpE$yr3X*^)_ad5*3_;HaxXNl@sZ1y-En>!Oe{H#$Kjhp`4Ehl^ z)gk3|YI%f#5v2r!qd^?%tLdZuzQpQ3m87uTU7u9g${%b(_E!IdBsQB7kHI zq-7{^5Ir#Oulr)!)kbXAro(xhsP@&I5CAV!WrSf#m`P!C(IPkRa1Asm9Sz14mI!nj zPmBdpdobBh@(N7a@6(-&b9}DgvKzKoZN{ZdP&=KfQuh;789CGPATp%2p+br>U0QO> zx@5dGpBm`o5CIbp(+%2zlR?9o1rz{^YKb5uxwG(S6<-fiys*5{fclxg?;$OVCWXF4xL#f-Zy6IJ^4Khsln60e^ z+FOy2&BXW4`(TF;P|hdNHRqSzKK-6%Gp3JBOGZGWv`-wE&9@c%JYL@w^lI1Tzc}iD zm0$F))~f$r9`v8iOaAJte|v9X+~D!R_KgRvN@d9q_r+iZqGI-DOp7e|W5B9oqENa)q=W%Sf}H}V9oF1Yw3L@{ZRrk; zkn5L29wZr{omg^UrF6ytg;#kQ@Xh*)#8iIcla-@o_YB&v*#igPI4}{m2K~&!K;x8F znQC5m{4rh7qTAs}BX3tnf@UOan0?KYcJTb zre|NH^OW{DY}m0Z$-$#n6BoJD8y5hK%{Acyq7@sMBtg4G&dZ7Q?O$1bhcj;Jp}6Z3 zWXpn$EJN!9V+2^{rHYgWSDXtBa)~6|$}D)(oO^`0^f{NxN2fA4VBOm-k9*y$a3I>6r+ESc7Z)` zo})CWLotgCwH~`Gmq9hr3_-015GIZ!6O@~F#|D_*aBqI6_mlzSv```InscY?+(0M* z@HZVEAw%4Y^Y)xeKbLo8BrItr5NS#FXI6qyJN7bGnGh@%up7ph@>Lwg-u+)rFPLt;IBxheK(G-=pKr z8MsYmZJDz|qM)^tKG#kCN*)$F`j5pAzE+A%vQF0L9q7IbEZQJ2+O1Y2kY*|DB%fZf z?J!O4<&v5`EqmV%;4g+SW)WXy4eee?tZ@}VvYRFYRvloFDY5G(v6^WvhZS8c9XYz9 zssI7;DP^RxM4?g~M%a*DJwZ1JQEmt{pnlzRN*Knf*20a3OGaUDDQJ@!3>eL3tZ0Bj zhM?#);pFj;1&2k7jpr(^5If-w( z=h*Or=D8f7bz#o ze^*~r#Q`f^gAHu17&LVVEy>awv>wb9s>@>+KQQ2A?MQX0B6rq5Jb!Wdum^V|gO{4k zh_Lihzh?0$>CyuSM_13gNh=?^O0M3!@VWZ7Iaa(9(blweJ|xN7 zYirxOp6ly8e&3L_x`p6w{7s>Gysc}=iHMrRccZve40OfvfAiHSBToFdQ_CGYhO2vm zI2>VRyGvM7Doc>1v_=1^lplQg++DHN+CP%s=-_RGCH04_uGk&9kWn~mX?S!0&b`ei zbu&AH7lo{}IMls7{e_R(rIcOSM$_|&YaZs0ytIt!pgz!ikaHsGSeAOVO(lL`)?Jl* zUC?og1My5 zEc4FKnaT=@e({(3j9iWGRKF((A1>_IlQwd5KiSPu1Lg6fa+%7Bxqr&>x%f?X>19B> z|K`NcuR@1mo6g}q{33J+kI6c=I$fvC98WwwdGFbhJv*nQM)yhjGBx;ul6!W#)XOw@ zRO2zIwkHj`VSsyQn^9bO^Op+^a48_t@d{kbCDGi+Kk-`|e*CF)@$BmU9>>zdCHpLv zT+Zd5!>`*kSaBZvEg!Y%xbb6#cymOOdLIM!?cJFpCzE=-*S(EWp}a`5-v5GUt)H`# z{v<6R(evHNU6VbH#?7QJxVYOVzN;*<pV^6#+@2@2;fymAP}dXZRt%pw z?b}3IZuf5P(!J2fW%*n8V3W_A>2Qw=5#zquLmyvm^+;4aDC3=Pw9>!%V!IB7lfEX# z1(Q?>Igr1TRP38!aKz};mBS@oA2{1n^{FF$7)DRe&y%k#cdRphtHlZoByLuTOt#D; zSXyL{>s$-`Lt$12PkVOD_6eM9?dEnpaLc`Q+fPO&Q(Ol^Hf#RayTGQ*a@`kG$gd0lY6C2{i6Z7p--W$@b?KF`K9T6m8npfc<3 z$~h+*JbQgWZ4$fwn^5!x{_yJM(zVU=Wv%6()yUruF7Y7L!LOA1_}?*MQ|}hu=pk(oshhBv zvf{|rX6nV60`4VB<=T!S!`+jM?v!;ri&-aK=_UT$%7a5p%Zf2)cG4GW z*{YSBw!TW!%&>>ipmJLP<$e zJa@g-QTXs&x)}=3s8a z39yzFcn4hawK81OF~%|~P5i5iZs1;kHAL<6_sx3&9!z0`kA&WK&$by@It6$FLMZ5H zqL*X@mIg?tO@D0S+$&1CGJ&^zrWJ`Uwm2p=@Iy}TI^m|{_Sil>2Ww1A@HxjR(9P6B zL>o^F#1Jp{M@zf&q3vD}jjrF!5Uv3-dtTlabW9!{-ilKSKC+;Ksn zpmx=<*%p>p7lUgTiE@YgpDiyFxqnb#1b`s{bxQ-8x!{THK|ZXYa#9u2PmAY4SF83dEByW1+L=_)V&eMpEf2L!i8V#HVn14 z)UCxhVi0TB!+&g3$XM*4C7|CmAjt7^CmNAG4FMjhDAM(SCtLAF?|QwhJPd0pk{}$* zYLSis3{#s>uqjTL8w(v?H7ku)x#sNLWG^9rKH^~Vyr(k;-Kj&Gp&v4 zLXw+_LAqDzIGol}KlhFa9BV!-@Xzq?#sO!B0Ieq_k}J0}@1YuRo5ydvrDOvp(L z^MCzLRIybPEU%FOFh&-D?Wza}=@=q+f-#^ml>ash7pMME@{{)Rw@oe-H{`5Pl)h{O zeY?nTFX|UQJVd!HnP|WCj&1G_w-R>kLVqm8Lp}}qra$d0!PRS8>9BFFJAk*+%en*S z6ox!T1rSD3T@pLu7qd*sj}1Om5!;t1-@}p(z+9UE79!52I2x9jj>;(~yRQ16mg6(z zlw7+|ZX)IO=&|D_@*wUVI*l@D5ye6{sp|#+GIZudhs3Owqw>IQ{X%Bg;FfV}Ok7!q zBj`;|%Yz9d!c3sD`0;wLID?`C$@*}dILQ1y`3>Ct=_T$F!?F0`J4s9pPT>#F^-*lK zUkTasvv5x%`tIwB;UD||Vk%K6%-dA|*73*-8CDfsixRUiDi761I-?&5#>N`wAkUzmQa@7d!n7A{-m z%{F3{yU>%5UObES){Tt}uL&i&+QGKmwtfLotJ9+uih64fzeAk*x@M>0(b5XN;)K+{ zJbLpF_d(Bhqt{S+3E_ zYU|1nq?wnS%=K@)NZ)z!(zW%8Wj7vdaK4tYtibcqf>FV{J$trB9-R!i?8x0WVQO^A z`9-Y$YdD-+R=wwniFTXO91-3*=2Z1ackZFLj?4mzOnG{6TS;!<&xh+=dSA*;od3?H z8`vrq+%yxFBuFg|edloJoz>Sm!p1lKxInpZm+8Ov-a2{jK9-gJ*H$OP5Ve4)_YY2n zCT}x-NK`*U|4~$EA>Kd_4nDQ@)OHv;G5INW>tj!9i%Ebg;>pzZM5E)ooX$VFbnAh7 z{gX-x?`{{~a^z0bMZ<_Edwm}7nX0rr|A9p{c31a4cf(_wP3eHSG)*&&yt?<<;9nk__eq~z_dpDoPTtnnr}@PjXh@067Aj1bgEg8rfP$I+&=PYy3e)GYTkoVdfV4Lh~6wmbic zIKZ#w!-t~@N0YqM44?_+x9nkb*UIMy3j2~~c3;Fipnbi6I-D*z?T!sULu;~kNO(T3 zJ?I`?%$f+VNv`7D6{12hU;RUHSlWm7lG{DaEwxKF+hR|Tud%cqx%k~VZ1GJ-m*S&O zJ4X3*&qYT1&aWd|jhy9G8_zKMLr#}kcS%^ux7LMeVQV;6{$V+%)?M`vaqS!&QN8d` zGv{!>Rzq-ef2=)PL_>XS)3~Z$7rsrSR89&^J8YKu@ow6|K#tQ|ST=5NB6o-N#uwq% zkRzex=q`6lPwor2IUTe0=z}Axk48q^JN&gG*(DQgZ8_1iMX~9NAKN7UE$)_%vvXQs zO>Fky(WtlQU%C71KARE_#xdca#2WUh!AYOhP7n@AjG@Iv!>$>K$O}y0=i81oja*v2 z!njbA8F8gScxALz$NNcHV9lYt;>=fZ0SyQ3#@^(H+>FqEmO%~<>qc$~F?r0X^&P$t z6OCO^x7Jm&iFAHzq3??WCojM6xk|F6Z}AuJUtOxRN-In4c$c{m;ojHLo^Q{}e)JyM za&_jh*ULMeAAH9~>?RQBxXXQSGR+VxYg9`~yJ|kXB3w&9r@4;PX+z`G)5WP@Uup*F z9om8adJhp2ay2rhsLs3!mApOp$aQ2EvCCKsd{{_qCw!2$ zyrvBA%CgMtjXL;-|GDS(#U8tLN2h<(36}h11ikxyp6wh~x`cDN=GdEt>p@QZ1h&Ib zj`P*xlGN#k=QcS9o%Y;;3$IaucUHX&O?%h)ya5q?p;@baUGB$LMZmeu%*tG)L-{FT z#VL9<1Fy5MQPvLid2TrIx($Bg{^X&h&QGHfK0V&);R%;{UHMZ8C-EyBZHrw(sAG_sA z_gjev<IU9|;G8Zp1Ki*W) zdqBSaFd}(t%I8a`NngHfBXPgnv3Sy+u{GcU-g@OoXqbOBqI@MTtNiTHdj(>fynZ~^mY+2Bjt&rr)n{B-7YzD3C z?mi%$?{#Z8r{j;Hazp-b4hVak62G;qB-H%d3fD2Z&YLqY+hV^4QVVlkyz|O-1daMA zbRj+-nC)&)9L;vs2?})H4vzjpi>re(y1(NGQHcV#)RX7kRnES;=V!LKAOF@rp5WeSVtXd^M`SaR(<+3a8%Bv_3LvDU*bQOuNI>-FKE)4qu&wqQM_dN zIvtXnDJc2)eZ=$AWB#Rkrux=}O&gm3Z+L9(3|(}r^;`IYOWEgQLhD))XI33iwK#M= zH{7HRwaWiW`0qMxG*cPAH8pM4!{%)9J-^eSPAg1~KA`Fmt~p38;+sY9o<~(a-eIo-q#;>=Yd79>9&S)xF^NqI6nAuDg@7F85sdCxrX+ zV&ll$i(bDrYyT8{FsU~qYMoja_2x@k!+_t9O_#{-E#R>!{jy)z38%Ahk7&ph%AU$7YlfbZRMmQ61@dw$_TQzJfLH37i*d^^()s z=xb4#3;g%kaS8nM>k$_y-3^yCA6G^e>H3w0EgcT|e$0M-8vlx&Uh3S1!l)$5biks@ zBUjuk9-_9NQ*5`KG`R#h`Xbh%c$b-m?#cUS_MXvyVKZ>w_)wycAF!~id;f8@qEBI}(efkHzzCB?h_Sw{}@|C_t9kNOO9XOZ+0f z9`~f)ORS=tYh(s&<80C2*q>)s5~AdLk%mU}`?(qqg1eF1=WdLs{ES(_uSLS1Z+_GGA_xNFiG|VyZ%iH`YtEX%T8UgxS}*{9O;ac!eQ}dQ@6sKd8>=Zh9Pr9w7{pgU<^bI6DFoO8ucR(cwRLn zX1APXIj)?n?x2hKs+-SYPVH#Lrp{o%K01EV*p!#7xA(!r1S9ImOOi98dXNkSGTY|d z3KAYSGXsJ$_^$84ctkH`=Z9UAm|JjkYFR3StB=EiuqTir4~7m{DM($S8wly8)$a}{ zDc^uDAtipcP5ss2bxb}tO@O;kN3KV>JX##8eef;whk=mz`3tK783RKN0k7`9sxSN& zl`Vkl#rw4OM>r6ZS+>~=h(TVEF;e7yx7<$2Z!zIr)6JbacS(Q&P6^&0Z378?`LhZD z=K}4_9M7MqHtySS_M=;m37a=W11vdkv4Jrv#7js3vg_S1b8GB2mWB7~<2`PYym63$ z80PzegBx$f@z| z8v=RT35NUa9Ivn@&O0mQa{5f_4+H{C}X_wWBS47+XfgH9+L2O@4T!r z$zFI{&sFLAu1FZD{4M4w5#_?GNcmry^RbvW`Hf z*Zl}Pdlaqv!1cw3^Q)ZSzAwJC?aq7mDo7T(sA=QQ)VkALx8R7%YUcK*#hg`7PNoZE z@}E=;y~&(;M~^+fbgI$F?;|?)-CC!|Z{Ltt+MC6$=X}3=5ylCY0ZH>}ZykzGmFbb5 z6`$JSpB>I`ze%}y+shmiRm06tsrt6!Bul(JmuccmJ{&Qwc24#A8#wc(uh;pKjCYzp zS%q8g_RTDn?LBg`=J=YAuy3KUt_k&+<(D&$qfJHz1qZBN`F=vW?Q-s3w>G(gxpO#e z^_y9tVxQhu+TMqsKHnQmtG>Y3#5WtFOEeZdtcbk+?&?er-2B0nx;@sO=8;=&1w0`& zgrx;^t-j>F=~(^a?IIHO@ZRsik%s3@1vX!4{%^$QTR(pvde_Wda_olFRF2lQbEEg| zv!0q!9A~1mcD?;B2{2izey6S_lPFE!MZ=u-UfN{Z-kGmhlIJqt-kk9uAohKfHZ9~+ zpPs}fG@L!?{z$5hW2`l=Gdpg~MZTi9)DnT%Wk- zu3tTR=T)p#Ha|$XT6HwnuP-pC^y7*jRHuC?t>dmemrHWcN=YOa$QSP;YF2}LrHHE{wxy&GGJ{nE`{JzAByUEO3U;U4c`bu)>%bY(N zesrwt4}8~YRHgr6E}k#h|3LUUu0QNx7H{BVZHJ{1J< zJhS4|yh>urx=m{$^!?XG+}S_c#jn8&bnb1v*1yxPPHT^Ibh-;}%KVm$5}da1)2T-H zfPU~Q{C7rAWe88&6t@)?W7J&I!v^;OF& zinGi5!oG}JeylJ*lO2(1HWd@dY2B)xT2FiaZQA%i`4R2@P()-lK2dgowaA3> zIO$q?WPjQHM7nDcZdmsedF7)Dn)RL6`76~mAJpH@%TRIaIdI;(w-V7XGuk zvoP)FVy%L&d<<$tTq2-T9~5?9xUN1@=46>c^83KF&nKC8e-pp2JJj_eoT8E$asR@= z{TB_zA5_N@Z~2IAuST3M?yR=^UEemkw{9{O6^h)6AH+v!Ke%*gOMk4wx(G(k_c^FBy_nZxvv2(&n8RpY#rKh6^gm>vi8z7-=vs#?51pL*YM zc#v+;Qta(ZESJlM>RFsHs&h0=3JsOPl@h!U$ajft%po-%Mnmy3RHXQOb1;~-K8|Ub zu{*7&wDLt?dkUO`!)fpozsBYQ=i5v3G#xeO7a!%zfCS%6Bwz=6n#_99+rV5Zg8F1d z=X7{)+s|$JRN(5*^NiltHZTlJa2rmF{ZpyHB^I=4rMk_;wL48YV|2p@EZzWgj?mxQ zWr(u|w#u?RzzkiyeTLT@;DW_)^X*d^wPPc+KDSy`Ks$F`>=GmFz&V*Qkw8e!XU_uo zEL>PBm-tpu;WLVcnll#K${-FU6ZRVypMr`bRLFv6)+0dRl~tbR9CeL<>C^YHx9TwY zRj`I2-4eqmB{*Y}f0w>93&|DFl+qxjd7;{wYD{+$+FE~-Z1|9!I)JZ)C5VNGhv+Cz zLy+x4rB@Lw7u)M^7w>R~;s@~iqcup8;h{ffI$V--w}hONO*C)HsZi)~P}qY2wnkA#-(wTep=YIke~MGJ+Md+ zFufhQx*RuoGa-idQ4F1onxMZ|N%nbM%Eh2>78!8yZfQ-)Krr#c__>IeO8x+yYf=7O zc9@TYG*;JMA6rR_`&2d?w`8SUOu>PeD4?v@$5lu{cp0XFAocYmdji+B;Yj?vvSM$Q zv)N4td`sRUzUf)_mAfPZe@OIAapP{;QR-^Rx|1=U@F|BK@M`&n%=fp|(0=HrmplLB zkV^kOOQ8P@*Qbl6QgKnVop3hNbRaC68NDs=q zMI5T9zdJkxq6TYY+<`lV6#eFFro0>Hj}UBjj-I{8CLutDf%YTd(P7F1`BH|ENY!v- z&#P;@%s=0l>An1VB=45QFMohbEaauurdNFuV;n1m9qe1tcIG>$kCs}58Vp|pIk3Gb zxGOhiwz-Yn5bIC-0r6l|^s2m2?!lF_#U-rlA(lvtvjMPaUimyHp1*8aCFBN_4)Jkd zwl;q84M)P=YTrPc+ooCZ7YyLhxHTpxXrz;-#XfoW;$Z0NA+xaoA?Fv73F{u147eE8Gq*$pRwR;K#C$#9H{F%UGfJ0wz6DWfKg2AR3_(XR8zHCy$}F;=_BUMh8n z3t(q4bN;hg1ALr~oL8O~8n0w$J#jo<9CM7MKjc((W+k)Re4_;t)mBAvMlG&h5Of^m zwh7YV0Ak^g6`ZXgQfmp+ie^LiqJ3bJuO=O_Sgnq6E8)?P7PjdjRB^}6u1)c zGx5~dW#?1%b*oBuHV`Y=1alG=vOhN6`7uF;W8!H=E7y#L*^fV6_?s0%|tsEaE^g6 zLBOr2`SWE`7t@uUcg7$8qy~rYV${TJA0Yvv$~KNxjNvE}TdTRU|IQ1Gv0}nbt@!~9 z5mFx&$wY!m3Yr!458M)~{0-VEA)^>5&h1kg z*vU}~0T)~LD}jlC^J=tNdj~>D(GqPM*wR|+C+~7VJ34uiya9s(pw=Y5K9v$2pC

5;hqirzO^=z`@BMw|zWJX@ z9ivJ;lJ!Uzn&pmIs|J$)Xxv$vtx0X0vb+q^gZVJQH32?DqE(3nhX>*VcyvQ5mQOZ` z@gN_((V=?nZ%7h86hJOU+~WVK7J-lZ&_Q4NP<%kd#NNLJInd|-n2)SwD8J}vYFhVC z-~FF`xnR-vHF2N5*Y8-1yf<}eqhEIXAU|m}?NgcwY0_`ZFx@{N|QI_KutUmf_rORBWM?yt_Kq||M4+D(1B$f5=|>5aC1_0F)d z0A0H|r(*m!FFE@4zTyhM^||iOEGD?KcC-Q=FWS(Tx}4djn5HzyCxt{mmF{A!7lM(qAcn~$cV!nu~PoS_N2)n%8%_yEhv1{ zJ4yH6IYAN5-oOk;tFy$lVT)6^8;dC+scF0qwozQN!RfeKRAe(gitVr9M<65ZOnK`1 zb_H)W5Qzs^0>Hu{kZnDuK4hTrzr#wa{D+%~mVj8Ja+U#E-R)(CUl)@)zc&-8@%yHx zqL}O9Aa}ljAZG#mV2hRMYR7Z+dNpOdGAi6vsvmxM4l~>a*ZU(@O#P+GrOkKT`J>`q zZj(o3q>!-EAYJSdJ4Qv#18~kK70|@_gQ1zZo&gEO9{ia{ydfKHJ7(?2kpE0;M;;W# z>xy-q@Cx>COsz83)0Wafv2$;Jx=!U|%h=I|`cxMGz(ifEhwn?)$Ru%9IgY!hL%bWZe|8=?RaShSz#Nn77VM_i z;jA|v%yr!)r32L##^T2|>!r+A_-UjGYdC>VW>9J%I9^T^mcgFhqE!}p8UF_{2&roF zPXCt%FbsX?ft6AeA#WAXJF5o%MBNB;A3=52gSHP6Xx48Llr#2ZbZy|xO(F2OKb4fY z6qhl)(olRX63avY0udl&!hZ9JXrK&-fa_rrMgTxf-{R)tJP66;H#H4s zc%ciQ?GC238cdodCxutv!5Vh0+OQ`OgRY{q=v5rT1_S-FhB9 zzj=Ijgq!I^7c#NV6A|7Z)SpxDcb4 zL8MqiS{cKuhtw7ysjnMA!^6fYF0s#qgo7a!^kLV<2X4cp`$!~1117ATWX!HGkPFy; z2uyhy)2ov~Q2qu^`1*psL1g24#t1LDxqy@7mxZ(JfX_{mED`1+h!0LhB&SrH3Xz&JLSS&g%L?A+3aZXjmAXvC6V3asS8l z)8D`OU%a5%8aSRgfooR_Jo?S&A%Tho{|5zW1(rYYesSBAa)Bhqm@#+KY<9xXkH$={3j3azg7t6Aw=XwL{}5xD#qBZ6JFrfTf}EtFa|-`d z;)5qsRzw}Hg~TW4Hp1ufthV(Gr;pK2l(Rro)GdO`!CJ>amONw{gTSC}Dg)cRp8OP`@e<5B%H$AuRPERpsTSET!Sc2E=f;Vc*y!2}t>kni7;Nix{?g_Bav| zS4SF$aj6Ys10(6U$Qk!34f?TiIr&)48S}9uqp`ugR0{qg!m)&vcaN|*z@U~6%jMc> z+q{~k98Lw47rX@z44TBw3H+HrM#YR>tmR{SJq-;m(GNs-j7)H+KvJMT0w0~Xuh_kq z=&-oC;S>WU96{iK(QOw*Ni+rS2}g==7kdrX+Duu&J2Z$q@HGhhkj;v3Op>VrZEU?bmu^Kj${}5&%ttXBCr^p z#I?|@&xl}ejpejRA67l^E?vqcMp7e=wX@Iclb=(CKPwB61>Z&qad=@mWW1V775c)O ziC|e#yU`B2ZRv|W!0}^w+B3DRBeuGFlKu{dm!M)RXm;nzZt`pP7yy*VBQ&-)eNa^j zh1D+H%}5=`4=X=>$@*H}Y`uf&d#Hu%EVc{-9f>)_5DB!X0C^w8t^l`6^=zewRWr$9 zz=fwqi~&H5OvN&i;cyJvnbtBrFoXv|kPRTT?r3iW#2b$pqI+!%AUmeN!vn6BR~NJ3 zyOLZHQc>teC{8#Ql}dAh%(}5BZ7MJ>_XtW6m$xT6v%~`T51+xqp|ycvJBy!jOO+iS z01E1u$gpW6dd@YXH%P0;go9ksG7*?xg1rjJH*)VLDdCm6JS$b}+6sF=_~P0sB{4OC zb+8-TR7Fg!EzTb4pJ1=nY5J=&^83C2Lv6D~2d+P@f1n9Ba9(xo%-~()m*zc3vNOzQ z5BT+;13JCs22&FPr!GD*zx77YUgq&6r=q&#`h70RDLTarUQ>4GU;Xp`oBL*)s=nye z4&GXS>EM3nIqWaoWtFLSj^?>H%(yf7+4bUx-46@k@#Em`zRfxDr_!kBUUFsdeqnme z(4Y*J_6w!Al5KhJJWSK=I@E#*_C2Evw^=uZp>w(c5-OhjokW{G!^@7pG$qD@Xg@K? z*|Yqg`JmGj=x@iB(mbde2d<~C4?eyglOS=f0wLDX8ssWR$}rN|^Y>k-Bn%u%-@kb% z(rc$h1!cdmw0xS&t_I3rwlvN&$Y5rMcdhl9u;pd(O>V8D74iKzU62K?BInqyG+qs= zjAV(ExN6mab}Jc><@c#h^moKmj05Hq{WH92QS%|(?!(D)eDRZ9$x~o3u7m@q{qIjf zKu>65+Ix^Q6*P0H88?tVD#$bYB;i+fQpZt!-TwhSe6@B1MW@i@UqE#R={XMM8@Nin~;BD-v8vOYk58 zf=h9ySa4cgg1fc7v-_TN_TFo)eg6C3z3%hhe?AXn%#krhMrP(5@_q03zT@xlf(L`5 zh4Wi#HawEOIa>Hjz7$9|oSv`&OO~svHqT%T@pG(YYS4l0_(yQlwiar9F2&+|382Zv zF=-(s21w4m{>@EW2yf1)po@z)z3c*uqm;{QHhzGE$D5Ra|2ey#^P$&Q&7i9 zvvT&sVLg5{Bsb+c-wYxyB|bhh2CuG#4UBkjcx5*Q+g854dO1X2gMPH=e%)a=3>d3D zY6EwrHT$0aqqgPkW7DR0wZv}h!!hulcOYK}ZibKpdDo(g* zuc4_FvFHJiUg?07(BG|)bu8$a{Pd%q%4TooOwf%neWz%&jAa1t&7{W z^X0tzZN5XSRsFn)5Lj0l1P}tdu7-;lECV7)aPcj`ByNUb+0zx53q1tip4W32&Za8> zp8=fyZ#f5?)-)#l)PpKNJm9CV_0R(~+D%RUBmGBl@Sc*TBLmd`jz&XHvGjJ@$O4tNLdBaU&)6$ZHAQ)c}&YY;Xda2llFtb1N$9K88ZS(9Y= z-K>2^bN`(4TkckxZr7Ha#~y%cbs}5>Fu-R%5{@r5}+$03Uqv)Oy1FeA5wzB__cJHnkne{@`aJ%b*1G<>?AVt#5>G?z3;H-C3o!^zN@d0 zh^(#Hd)xG=5jt%A(QrnE!#{&Yx7!3i)oMiFDNt|VK$qLKZiQWtwb&@vQDb%9LA!X` zY=c}ro7YGl)lUxYJZ^x^=s0sWSOjEoK#D?*z}#?guQ_LlLV_uyv!|K8Eq1ht&lV5y zpLdQGcON;iB$UhTtafG%bZ~_C8-1PQ>A;Q8PNA=tFLUfUp*BJp{^k-q zSzjw?t>)30h9hPxW@5@fZnfE%+46$bTN|XS7QJgTF>q<>5;E(%RxmH?rsHFvr}L?} zTCH$E$QW_I=}``TAY=8S{pv-i!qg@5(~C?en?Or6P7)oCXL{>%+}MONLpQNcaO+Cn zjTXtFL*rb3k@x-c$kS9^NCvwM|zmz zaG1%%AxGI}myq;iuwp_rS(4JfMW$b#!BxkZEB>Y3O+hDa=((iTZul$iDUFYDX#~lc zrSso&ub1LB2s8ax=eO0EwUX0Njq-`5I&|-6$BLGqv&+<(D=A#1K9n1`h>q?-!_Ioh z!S{?g9cZE*{oJFw3$R`1S*~1aQ$OCb!n!WfQ8q|AO2!XedC0x4*{_A`Te5~2)GO-i=c^K`|OX{kF;`IEnJx_?rU{5Z_M7q3WW z30vq#o<#A_T7Va*id2e*XUCcVB20io31m=+U4emB|K37n;h}4}bO_AIB6e(dLnEQ4 zyy+He%#4W%7d%McrFMMz4EYmd=O;#ODz^Wv+lletP!9vx`op08HRt>6&6GERW5}SX zJ&g6PxDBhk$#Sz=V?Z($h?4(_u>{L$_^r4O?KJGTw9=8o2nlV;Aj=2!P&~Ms5Ygh; zp-ioInXCr2I_%^0xvZ{%lu2v&+PE6OTZ@j}DKGTrDo)S(!ogX!dzYoX^+Zcts#RFg zCD6lkra(e;Nlp#c>B<-*-N?g>EN7nzqahOa_Kb ziZoNYd*&UrT;xe)RSL`sPD&B|bHECAya5WE_^y`(a{vL0WT-s_F^5d@3a;QvBpjC~ zS37EJ;g{K3r6gdY3JO6Nu$y>r01kNmM+Df`_k|maa`Csem0>-Rvl*xqAlB-nd5VPZ zu_BlYIaiOWy^wW=IXKftG-la(04yI#+j^|V9%|B8sbIj^1jN}PGp|Y!vmSs2QacI# zOOJfP7?qoh;P`D&Im~>%W(AY6Q1z-Ue8lH0wr`f*OL2%r{Kbv-bm-mPGt3NKK ze^=vAPoKupkBo1gJ&54yF%iR>IPY+C;*%?9u(=}$8ocO*xn7%AZtJjjJ=&5~;i@hn zAkmeZc8;L297rJ4QN@&M`?EIxIt6je!biu^pJD~E@2OUF6S_|iCXJL|+?rUVw#}B| zON?&qS<$rZ3BnZZ9macq2I8$ObxX)F0EbL==KIZRj-8YAaTdyVh$KcF3c}RCWhLAP zsMZAnP7?ZoMbCJ#CN_TKR%d^Td*DZ;+{XTRz)3Rj)C}aUBgfb3uzBID%l;nC^xiBs zZ{Y=cP5|uj{eYc?UshuA7woE;<}Ttr#?_I-tMNm_w< zdgxdd&u{t3lx6`izzhMmr-`6~b#4iFhlA9GUaQ<9k#JuKLXu{FkNWK6XmtX^{@NY_8fpwjGxinGHsA(13Z>L2Jy zH3tm~o*&RkMmkC*Y?bjmkpw%^1LBBjd-_W&CGOEZtBKgAy4UeXQKT4-@B1zIZh~m5 z71Qa5M*8nZ4rn|@LTHsG)kC@-S#zu!6DQVG&Z=eb#*VHQsT#92_`Icl`sFa->-Ws5 zF7^|euA2LjZ|@AGu?PW?S zjA`zf5Gfm=cDSoF?{^a)5j%;UV4c|E%T8JGp=3Qka)>JH{kOD%@FUTIhdAWQ83n1t zVLL?1j$cV+nRd^J;BVP>snLBg;mBLU-MZ$G__`=cqF2%!CRQ*`q5imHqLJRawMF_P z-VF}YQj07vF0#v=rSA@B2t>b%^=PkD{w?*`of$ioc1h9Nu__iOu)*L)O4rAwrSKNv zB;}P_W#~5Q4z>0wwd0Z-yP7A%E*lSsNUD4yu+vRw)p>cJdO7~%CAVa6^b9c`xHBJC zG?Bi1%I+VQ^oi9Oo;-Vv*I)O8e~ZjZ$Bp53B8$LdGX4CA(esdA!%c=U{RfieMEkxqEI{#O+2YXX@IW>DQPZ4DP%Efnr4)hyX$Til|G~N zfEx4lOA_`3s?3LnJD-hAxTQ%G04;StpV$g+ZU+}tSTSF;rM4tNuI}zuAB8O|!VAje ztnP$gl$ar7NI$6Aou1(KQD|EguO~1M!hUDJ*kI{l1eIPhx9)st>nO&da|+zVs)i-Q zuK2x@#}+0by+7W);+HEpiJut2Q|U1+FqTJE58t&MX9Nj5RKThEc)m;_OB5qv|)Qr&iGgUZwiTPwS^Kj!}| zo+a%s;3qu)*2c)|MCf{?bJ^C_mA|7VVytks2}j(rCoY_5#yI&6b$mmQsHI+sLvDUf z05@ja!o0{khO55!i`KsT`7R>erx%;+Gqh6Q@8=LSKTa3SG0nx{F1EflgC0>KCE6W; zkqT;LQ&ex_@{Zh12zD|4(GUKhnC8t4*JS50>C2YZgKxk_^I@;`t)dyJu$MwT4|3IS z%GNsTgh zZhR2Ffa6(WgdV=$+eR$9`uUuqlIH+j`>XmR%u$jCe+^BeWxG07n@Q#Ic}tt3M!)J0 zQAsI~b9ap*GWGqs^elA+Z;tYY@OyImMvs~bqu z-oqOwk%`niyaQYZ`l6!!j&j*(w!v9F`7^Qrl}*4hxUG8!FEIT0rAPtuLFTaL%~A)E zGn{vLMYri(^a7x4F$ zpJ#4?7J|+JS0ccc;JT$Naqwqrli%n4anWS(<9`FTXWpbjF(viwrLV$woyJ${JmSk; zUMn1AAgb*)kjEa02;;;i^yP*}#kQF&51YJyibo0B4O*LzKy%~V|9zK!o&UQghQKd% z(^VEo%r{3o6*U(x*o3nKaFL0ImZpVbgmjSCH$P#Yv7CHNO%uUqKxyY`FaxnT)!V@G zeH_Zs|9UZaO8fQ?%-*>ob^RPjfyn`?dh_cKvzqe$TlCR6ON8cX4#UfMiE0r*k#YC2@eV(dNx?`joA$F$*zHXn#-x6QkaekP z;f^m}9>F0@Vw~qJe{tk{;HE;w|I*LT}MU9VF|Hn!9%nbdiWXo zbEWojytu+(irn^L^ntxVQj79egCYMALS9b2Ftb-@9PNkjmtoJ0s9w3hp!(1?ct8o` z>~_|=J5xl*mun=5>}Nk*)z5HCNPMz@qsOLQvBLfVJy@vl-6$FS-6^xuu1qU<4fkzi zVN6@|%bAOLU-|deU7ZxAxkWBm-C|Wto-W-2-hT2rxe=>AS>eycgtBM~;qkS@gr@yR zq^`d~MQ<;c=7yeNY}%T4AI}@`mW}RCyopzhfAIeED%3JzW2up-oyIs$*$c*in#gdsTNyZeWUt9bUglJ;|qw;=6gA<>z=0Hx$){ zPm;Ld_@xrF!jvX*rj)&dmWdx)+uTGE5dEIKvl|475e}^$mE!S4CHW|F*%l#G2kNPW znAId^sC%L8Nscc#Wzq{jk|&Y~aUr`1GugstoRC7dU-G^iR!2=E^_UPFQ_$Oac+~qi z>6>NR8GU@Tg7G$R`Tk>;h>3GDt22)WGgO#h<%}-Vwc{JR*jYl#4ash|+MYYE_Xa6h z?9*(_6^h!`h@bmDZJvRPdJ^9?ot5vxQ9x7)(!Q#qL~J|F*YvWGg!UyWSU=Fdq{THM ze-0Hdad^yWE_Vfmf9dW$3GSY%F;{WptR~^BhrGL^dayUy6mWY=AxhxIrtcB6%@BCC z^r&V-w6{V8r`xEyk^u$IF0=BexBap!%`kGJ<_>Xi)n5}JSD}loAx&L(ri-JUuh&$~ zqziLJGj8~DO%16(k)=hDvVY#GE0#*MN=4G)zDOP|dlf3ntJALY^5_?=k2@YPa<(TR{f| zZc+QnJ!8^1cxn&F(!6OHE%@f<60u)-?v-@71LqAKDxbq>Mj)EnH0<6s zGYSdpb&Rj$Bj)I1nz50pndrHrj@d-QqZBzi{{hWe&h5^VBj9vBwl#cpeC)P1`U|QF z!+7pAf>pPm!U+SZfPH4o9CphavK@xt;w8VxeDslX`wJG1w-9kcW&vmA(u?vl=5{*` zfXFxCtM&UY1NF7-%!)~>Ct5P<)+dm9G6qqD5q zJ)CduG&@`|WGh@UJ@du{&br#AjBl8R;t9gE= z1{V|PfBxewB@~uk^RcdmmTKaL3$KG$hUc;D8^c)!^#G_i3w?xRVCKMr#;auYJUtB+ zoyjZXlY=cQllyYoA4lKIxOQm%Gsz_e;0c(HU1$;y^fDVpVEpoc|1TVW(L`@_qc^#d zXN#w_|`$D-PiBg#lzpNWfB+49FS*@ZF^C4-dYO zA74WviOmZe+2n7Vj5Q#~OUK|>Xs5Lec+wdPKz?f@0r0{qx$zwlM*U}i`C*g7Sv{$o z+tbWE=4|R4yrvKjkaYl*?xsNFSpY)d1D`S|FkX3LEDQYA#bD}sZfmUSoCEUpDA=Pi z@rDxJ2lvr>rUzr&b00W6x%8D1#~67ETrle~ZC2|5ytUnM;ko*2)YsvGqV;nJ6Nh~d zfKomZk)fSAHkHF}5dbRh1lLrRufaJEe7?6)abj_?YK%P=PuD5^#BMhEl)5xsjq)sV(}(R zw*c_u|I$=2*2F3n9GEEN?H{Wp_o+4O&+>qGn;DPI`qcogIE>l5i5JCkTi?ebk#j9S zs<$i#zQIo$sxkX9+f84K9~EnzosMUz@Gt7}Ha1^77#kF~79*Q>8?t@fU>r|Br|@wr z8lwi-^KxFbL*P@|IhQh9!`B=j4^;J*k;cq*usC8wO3Fc7T{NR<^1#;IEMQM>6E%B7 z^IYm&w9ZW3fJ@KVb@nVMVXoJ@1cWLt2KtpFn}Wf*0P+N2`2C;%`u`?k zsGS950x<8vUu4G^*rn|tiQFX+=hxfd0``A1LS{~k69kPA;(m-jYiH-8ZIZOaik zKN>yg3K`j2DzkJ=2c|!afnfii7##2MeBb88F>YSo*koJK zy{o;Hy!k#NidTHA+?}D@WD-CYE#9x4J217Vtxaj10+2<5aJ#)=)E0iRhw?~4<|oJ2 z72vJ~<&XfVfr~bXuRatY);@*-G7>G{Ii^5BwAMFESR%NaDgfZ17F!57g(1gsXoB8k z`%V>SJ?CX9NG~rB))<~ZnhgWdijW>N4WTLRW_Luk9~ThG52$HE*HmN^X&mduU)G_0 z9_l%Kvoj8|;RisbI%iDR&~xXtf#TWVp*G;#`KqaA?o}lwKmv|IoFgI`=v_eEJ|sLo z#n{wXu4@4Zv$MQoVr=jg20=hE`~KtS2R3dN*MxJmVH(5edK93|it)!g{=bU;>%?DV z+SfZLO?cHeyKtvg%zCgUVOel`UPK>7Ew~(k(2O-$BU3TVo`1;mbXn~%|GG@aq21wb z#i=xJ>c@xq{MF)Z)dYXm!G8n#cT2(XDoWcyzrD02b64^0QA7VvjGI!zOL>kX-3EhI z%(Byyy;!_`XUlmjdV-x@)c7}E9 z=M(`t6158>^V{169l&@#{_cO72?4NX-jHMYLHv)|I-+#n=6nVe{DNpRY`hS7*FyneB zG?PeJa%yz|cH*2xBV&tzKz04`l|o$0cahnv@;>^=#4&Mz&9^`%dn%_V0I~*PjK9$a ziQ?(jMdlmkrT@hEHr$eYBdiZF++RWf%3^MnM{+U`QCU8rbe8%vKHwA&Cz#_IpuE=l z!NQCU^gX~~YU(L96H%hmhFno8&xm^3ly3jgIS0UNp*=f3GUah{zO{$Zlf-G*aOLf$ zD!vyu)*k@jFfV@zxX7vj;e*}Utbo}GZ2uV=!2!5f0K1m%nla%>eC_pwK+2g!z;zJ9 zV93~L12Y|9QZ#`i1BftS7$NV zc4!rPx1wQY4DNXLV{y+Nu!Zqp1GBW4**-R&YDC+W{utWI!C^QjZw?@tUg8I26%CdU z$-3BvS?sm9N@N^)SGXI~Ld}d(a{z>B-mcaI2-@^nF!%C-13=qg;afUJ5SV`ErscYJ z_QORpGc$L@aDY2v7LXnD@I`|>v|rB#1EBsqZ=tg+ke^OJ62M!wR?X_?(6O6Xgr(w- zaRw=c+(Vlq2CL`nzHcRME*xp2?T)6-W!W(>wN934oxTDI6$BbR#@&4X7*<`*<6t6w zvv`3|K{&-wuYa_o0r9=e1dAPAx8E?Glz;Z%!dxIE)o?b3GG~~V+v_2rfFdLmzDR^F zIvCHjh#I`r0(wm;9#kJ*(SXV<2{P-}&puUcsRdSifVvij+aK$`VF4tCp5DiM*kLnYpZ^sM@+#?WR3Om(t()Q)wO z*EfD_LC@b85=u#VWhnX&-TANNUv~TRHhVH8mpS~F?o&QBFRJ%7z*aog4B~J&wmp7B z7mc;y;9S!s->Lf(jiIv3>M6Harom-Z=-{`ehzqbY6)&PUUgGqrylg6{g#MS*L|lz z8ZBY{EImYu`(Q!+_t;_RPmI;z%}EgPj0#*yZNp*;WbV8LK0fCdh1r7v$gVM&@%0I2 zWQi%ft=}}@w592iR4-`_3EMP$wKDqXkfAgS!nKfYywuMkpz!{$pW}ClKkk@;?QkVcqqqCbUSpQcFBQ@MI@qb~ zMANyasK;5ma0+f7e{7LugBc4q=Phq~R@kQJdO%d0#rqV(N^@lIAr~fjzyt*EMcoTKXau!ILN%wS9GuF#VFQ$N$r6j-J-p z`B!Ei*)9U_pBUl5U*yGp_@~42J4-iOPc+)536`B}j2!OmWisHc&-)NPE19ECLr}qu z7HL;c>eoI!H=%+yNL${VO>7!_uHQoFxUd^oDqb{~P?5o7CFNHYlg~B>#&9q(O{hc~ z>O08yXfem}0;e+dQZ{A=?ysvZxPRi?iEgx5CbX3lqYqZhG}^S`Fg#P+I-J>@xe{V6 zD^U>_?5Zu|Jl?AtE54-@-_RtV1fl${T%}Z9mPXTfhhdswv20l?bL(CMd4s2?6kA0B z`>Tffvn{D|IrG9!gYF&sPXK~+s$>#XSV+}sa&|1a$^{?1O01Z@4zI)=Ctk`lN!RM* z9qt=MV(~E9^d0$hS_;TyQ zwyEQ*vT@DaBWPtMZNB9ge}>`<$OS2ZomEi#&Pkf|4xiz8g941DC8cJZ$$bpBANF3oZU%=G3f40AaWQGUzKg07bD<62uDl50 z&UMn)no}6$b9Zd6Qhk9#&o`eal0|xUNkJ;=zAz{Xet&YbvR6#{!c>`1Z`J+X{2H;4 zMi{76c$j3KYtrrYieTDG2(PGThLKqRE^FsPd{ThH|z4EBD>rfoQmj$7|MApc*e^q_7^Di9^t#_lSdtme(YD!L@%3ebqb)24t-8j| z$q8I($lBx> zf6?@o(go4yS1xBMTfukjv_?6Lz|F|sw^zxU@aN=eVhK_Av!1?7?7kw)fzxL~zsuwkK|HujM zaELJzgMHB$X)QLEJpbZNW6q9RflO;XfT8a?3Z7~E)gjTS-oqq&rQ?bAa#(8+$i4I@ z277YwBmfTt<|;dL)8@rMr>A0lv-1y+irCcPH3i}p0WEhM#=pYW^#>dPEx_}_Ta6lI z(tCQk9}w_kRC|$*^F@ir1Y*G9V7y%u3lvjCL~B4~pwzFE5-Qv*5U^K#1Oud1b3OxM z=z#E{)jwU8e?0l4aYy6uR-~;_OaIF}YYW6l&@J%P6Px`a&T_Uc8(SoKdBoG)*awSG zqLT&>4~d+)yNRR}#@*L;X%!3)vY$D}ElxTZf7uL(@(1r+EpnxAdfhnVgpOU_1md`& zZ!l=P)df%i&Lmk@534>0_w>c)&to3uQh?q4iYI^8+GxFKDcy1B~k>)KFb__Jfq%%kb|0hPw(i|U8PS3Ym{H7KVhHsZk zeHGd}WOMZEVUslC-rwp7{jH8p?42BwmMa3U8>hEx^uIdgj2>A1fL*#z?I&I9BkD)< z6NBnwT6jwk-J7|^@`Pa8>KnJxtA){}UZBeR4gOzMoUU4)J}|)-M+P`89*hCsLj_6j zw+dzD@3B;HdQ9ycQ#-%AA``>XcU-p9qNXsVr6zGVXnXA+OY5p^m!?v!7JzN}6ztMU z&7atqq0|VIdNOjjW#HSQ7qg(`u4gdgnKQi{TU?amQ0J|PWM0MQqq$SWyDB=xndof4C{o9;^cj7Wa23{P{NiQX zL-BCBAn6dbF4yaP_`KDen%8jvA7w}xJ;^*1Dcz(<9%<9*CsUX@cc8}3acb2JJdg@)1-38gj10+dSfB`P^WpC>AEftKym*7=eS7Cg#WAs{>(9fvygTP`Zdaqr4KPMThaiXkP-<;0B&pBK5kGnVP+^y@@qRv*ZZhq1 zL1xg9C6}#NSURt*S@r%8Mk0wdmt&f*HP3eDPa4Ri3skX5tBH)TS6)2Bj zX4@c5t;zal@84t(X^zUw(#B7lM6k=^I8R1zc#-u{YiBB-Yxj&@cvZH3P1t?&YO8em ztmKTz6~~hKL+dl=o`=yyWwXu6rO|<^!(}P+T8I@RJ8SvedJifp)k-gNuCC`9JNRbP z8`dX&derwb)@@C3dsyY(?-XQ3amDbf`Lr9-lKB~%^z%K#<_zcXt6Ni?g)J$Q=06s- zmnN%<*-(62#U2wl1ySg`$XfBNHCyKq?$4-9s5vuwc0F`UyR_-356 z>u|r18$_c;s`DoFENViF(31BIuP3qv)Rxvtoja~Z-0TQ&1g;i>Bq+S!Z;uprWvQ9< zEaqjswkqfFhSkii^)bdl?-w+)D}3=iDWYBG&!@-Ok=iD=+;AFBM%>7@n>aLK@OZ?e zC98K-yP(UIt$AkEUdNBHDvDJS7p0gU1@EXW{l`Nl0uIl(rkEVfPoJbaBU_v6x=5y< zRfm6SrKVS%p4aP5tZ(>Ik`z2eX%ur2Xi`;|X8U;N!IyCx(|4$g%3%rOv7vkIsb60h z6e;y@1Z-H@?O2EB+xSJaJYugcGu#fN1Vw*h!?&}K7b>>@7A?Tl+|&3{gA7};;O&PS z8Bi$qmsCfZK!q{ykq2XArSCrtYkO7Y9;F2l3F>zA^MKy1mYu|{yr4P~BN3uMXH4#n z7M%^Fm*8292q-t`T)puElPWT*kKV&OoGSlPBsJT?`CNQrzcQ>OL$~OYX++ZX&f^)V zhmxz4__c~*YQ`R{2KPMdL?m3AeaR>Elc)%pHHs^NMRY@iVqPSiy}p~lG#T^Jpi$Pv zMuF9Vuyk^MBfX?(Sx9{zLV!*!nkIFDE}H?r#xBpXW~pAXwP!5nJMpVvfepO+)#D$W zEJr^G=(3CIE{!(Y=O3&6#E6>7>gR6#?xuqV1?~p&($%CKqN~sqboZ=VmysDx03IDS z(RP1W^vLLR_G|lx{R?>2Y{`=?57yu6abiz%%t|u3V}UjOJYHJWj}&bTjzm%P%;{`= z2QN@^XgUKZNq%d}AT}h&EWb(QSILFa!xvA!bAQC}-9PNBLRW`{z5aS=GLjC=1>R;d z+m}y+gq%ldT3%ezkxFi&t5VOYtajS{1@0O>3SD*#Jx%(yyQ$RaLS(2bth!22>c9Cd z_j7uugQ-pqsl0>l%7~ou0EoWJHiXxDK0>;)%5Yt=t4i5iqL<*DKHI9wQ1-giSdYe? zxdW%tkK>xYnj2nRs9ZqovN=fv?xc1RG1HFWA9#E9IWR2I{-SHAg;=a3f)vv!Zux{S zdF9n!_Yl01Y(ugXjH_yNyZ0bo^|a;?Dys~2Q%TnS*nKZ6F?mM6JNkX@(xPfVX~bW_ zEq3SPElKK7d!@;%xBB>A$vT485}7(Lj+XK}aH6#OERuC==ES5Vq?j3}x*TZhxz43D z2a+zC2cRcDw>STBp8wDEzY9|OG2>}C6Qp=EurLvgU9KBdy`X~{D??Wg`FFqoWYE+~ z_-@UQ`@#LVh-I~w{$to0g-6ZCq_G)zvY>BDJ;34-USae;IVkgo|F)gJnMDh{dP`@u zF-!U>b?~n)Qd`C6(QnU#Tvb|X;0^(twe9+~fWF^XWBnfur$+#d+Zu-J(_aPu)$xzf zdH+FJ6uvvxQLy1LkACzIjBc21?uNO|m0i9HHT#k8KNwaDFc`(Wt8Zde&FqM9a1z?> z%1VXpVHw%W*-A9lAPqk(@0l-$aN%id>T;Wf?AcmJiKq&P;e+b~`F(vD6TJOjdKz?8 zUSgKAh|C8>o=v@|3Ur+;2HVbNni2K#qV5I0v*s8yZ=e!y1%K-?y?h#FJn(tGkDIM) z=9vB2vWCq`=k!p-@mmyqq^)GLSZa4Asrd`~sZxjdPsu%b@>d_guLt9$ zWRvT~(!$(SnJ%@r2wy*^ATsMRqU98!k>lMfZQMw+34NcsJ|NHUm=sMG_putHYdzcs zroQ$5Q?ILy&rQ|K^ueIA>AA;_pZuyWYg8nL<5QP87R_X2>`<_F!4(3d82bG&<&%7Q zrl3BtDBj_?$F|Rgd?M}3`*kui1a*@TT1m?nOD4*WHja-4sP)Aovbg~Rl!}b@CSiui zH|q0XVZIIblVbY0B;0=1Po)w8h1-nr7nITK$-;VYKFOg_@KMc9g=lx@=UKcXjyKeA z&Z*vlUy55%(7{F(*O|$xWYx=;uGM;$AEyXA_z7j;snzULTC$pBOx(z4F4vWaneSCD zxthi$AFDJ$TuVa;!t3;(7IBNm6>v|u%8n^!lNGHG!(rAR?CqTI4rzot-#+HAew8^JHj08v4_9;#&X}imUo|_WTWv(gWLX_iXK$jVf?lFjE8}@5 zJV}R?-l-T1KRA)^TI2dW_QMZ=aD*O$>J{k*?JFy1N=ZMj9F= z*fsXoxGK*lz)~zdNvwCemUf54{Tz`KMM(+C{o3t-^HM#yyo{yp39F;@rzb1866B|r zVkXdDQUYDCZFqm}}6(aze+onj5M7OASMhV!SAibLnAM&TXT2UhHNW78DuT z6}ED3MbZx+^ry!aPffyPJ0tF!=yjNH@N|`mMzTh}AJr>|EXCNElZc67Nr;2v_>%;9 zcM-#nH3NR64e*a@<35W$di##1OGnTPR|_EZ6Yh1<<)?{$phy}f@#uLUHq6DI&%Rq$ zyLmC~gZS22{(khEg$S>lzsuvM*APd+2D&e}3-Z&(S!c!ys2jhj(t!or0?boZSb3XN2X)W~vw8{wU z&K?rb5y%);*&~|xFvakyg#pS~sKsoTRQ67ZA>N0|*T$e(-k_m2*Ik`x{y)Yh?Bl!@ zp3iRn-g$>p({a{|yv=chj1dmw{v}pN5Cge`rdOTQG7sc86O<&MIYckZC2S`>J9P9N zW%F~EvLgPPfDp)bK)kvVU9!8PT)d!{) zzj8*prQ^rxp!n$r<=(dFEoonwASizB?NsMbSizjkPQ%r;uWL)qFE4^Kz&Kf)+0X`7 zwJCahC$E@$xeRfAMY>?(V1eyn2T*0qm6!z7I2CZzn;rPo;D7tGe*bgc?^S*OKLtEl z+$hm8Ig)eJBWbF&7L?sYM3-0X`Bl@)1fO0_!#)R;xQq%pLOirq5OWYj=UHlMb;{_y zWKQiYp>B$&e~!)iH+;zd>wH%Kd`bWF?Ej4+{6Fjb$?G5SCckG6`;$t4$oj2SG=X2q zqC)o>wS#^-a?8hPgtSzGvWfBtWXs5wNj6`?VB|(Q!NLBK0fJgI!xKLdtnoN6dvpSv ze187?5A6XN|A#p%{_G?FEANjk1>iDSNq8P?T`qWu_x_C&_rD7N>%{Nz_kS=6{_CoL zf9H<1%X6*BM295m!PXQ+GHLXb)vMibCc~J#jWmvT31#YDf(iyqkB5qnR?10gn4pJnDSi<*;#K8*s>>Rukyn2-Mc5&uol;>1dyZ8Z-8{a@Dnhc|$Z|4wiDkHf=16#tjWQYTJ82s_K=tx+l;srC?Ix}!c# z{cRJ%#`FOu=L8?+VU!R5nhjFI)W+juEo;pTjSiW-xnO27hjM_U_?N2pf7bB--9xST z!=u9XdWJk9#+VS@=6D$Fa+^JCscDNrmiQ_~&QU`>8eCXEdP`-jTO<$8%|4bC)1@Mj zdv{nAb?TV_ki-2y9)HzOQ{KWD=gLe?OkhMYtDhxr?&Q{0INYakrzstJ`diAKv*I46 z+3pD6e%2Hd2$D=kxe^Z|8xR%uSZFHkX~ok&>*oK(KMW(1*rtNJaD}XCpz_j|IP@?x za8YH=Ei7+W`GJv-LOK*0Ph)SLm#n(+O_eEugIWg77+|2HB_PCYXlY|g0#;q>R0+TI zkT2Gvz{U@F=CwuYIqS$s4$JUM`4l#<7s@q-XA`uETtbQ@!AhH>xL+KTv}TWO_c2FX zf#_a@u(H_ZZgSUdsrbjMGsa3kvAKC?$-#ft0ZwCxRhy0;+f!R4>z{eT*}Luj`ZytS zK9}mZ`_-~(s{Gg1qsTW-MNgUk(+z%?uBIZUK`piBt(g5prD{a_0}&Cr9cH9*p5x&T zB!M?jRevH`E8#t-{`-)^V^Rv^FQcp>Tzr$pLY1xh@p6Z!QF$jtueBh4Z3|5EKNwOQ zU(}(le@m;t>Q^{KVRzD&cv~(5M*eOmatR96DXHVxA@jZ&S^x{yyQ=KptjxE&=KX|e z4xCR9XC=ieJi;UHOY>pad$b&S+SEwY`(<_K%EW*GMg1;hQAmahEcE$W<22vy_Jn6X zDuMK|l4+z^X*{e;OpBp^BLtv#H$&Y4z1)d2&lLRJ@uGGEEE*-H@?vhSTKxM1o#eTaj1lsOs6z3v1%Ch>J2*38tVl|_hmTRYSJ(vS9ZTn9#o>V-)Lh^kWu?%Q}} zUXg%{4 zEn7$|oxh_q7GW_Mekbz8W;4$+jCae^eUJiQ=v@A(ytQu|(n zazW*3S9dDMD2;81C=!wzvr+)28z20xRcVGgXZ=SeFH%m+DaE&1RE7|4yzj^i7Qg0I z^$r`q?V!RpTtSGRR-kGH9*#VAff-NtIyQA|rjDcNTnr|@lqvoA>eM3NF3C!-I~N^? zlMbQ1+1aaK&s-qvHbyw9Caz?vMu8thOvh(~%Uy4HX#I0j+d0-mlzuQkJ`O0GsOS)` zXcbuDGOqgL9@xSFX6fT#f?~aQ307jx;+qo z+3hjk+B4zp^I|&spmPcHrbYSFXQ}=n+vk%kKQa8K3it8Wc(kOEbmwh{t-8{6U-#&= zKX5ZUa4pNfPb;D2dvlk==#HuMr_Qu`}! zg4Mp6k^uW1F8*GIj`l6d*#uknegZ6!aCG&YS&iv4YX#@zLG%fknZV!!3TsoZkjnMQ z(icw813nv~AJs2j9A*lhOQ@RDI>#$#i4~U)uQD+muq85YlGxRTc`)V=p%so_n)6vS zOHftRja!=vi+!Shb{zU-%=2v9B!*9nXcMtcR*G4eN^dn?9R?E;0^=oe%2m9HRJUR` zTJmQ#eg5~6{V$toelX&?7Tk~#$P-LX|CkelX1cg`kTC`mc>H>=-7i#j z(Ro~iQ4qoghs58lOesu9KU`?<+%$vqd8>g{m`*YG>_0@AF%i{<@kU}PRm6_$Vjj?} z4>oCD80>}09}&B8Hwd|44NaHpA=)>00%8T+^0RC>-B=wz8<9}KiA0J#Vk@AyeX;x@ zdu8Pp(>?kV_@0}XNVEhpSpVCm8FHgmc!jmcyBO*^*AJ9c$$D^Ps z=E6iNb}*YHeDl2Hq4KOjQ)QDeENjM|SXSLZ@j+@}#i|emO$IPZ^YciHuTUd+s;Ek` z+!m!kItfYl)x0!rW%tc9xW}^`1r*I?kI49ouQ$#8_4vYqb_VayDYv@g^66iPRIHS1rJxxe1ZA*tu zdCgg|h5V!XSo2!U@+9ZpfMzhov5#Hd=g(%mZ^nodDYP)tW&Hj< zBIbDc8|M`q6@W>4j*Z6Ju=lQ+Z$$|cz5qBjmhU! z2b(&6)zl?5=S!C;x5FRoZqqx_#y)5LYL7-sS(3Ixsu*`}=Rq%J+%>}Jr|#$`^d;vv zdnxPP@XXcsezHwR! z{eE&mJEh_D<%T_B#4a zL(NAqC{3M{eO?@~C2nQK1M=}Wte3s}71W~ry}Mj398|NoXuql~G!uf=kyH?su*Mc; zz?7qAd2lu`L1+*`!P}d`m=nkNtLNLpP18%45d^2a|ik zZOtr0zP&Tp)YjOzcGV{Gd85gWBE&B_ZdsB4NCiz>3u@3YE*sI(9RDbEr2f$3Ju9me zNw@9$@{NeAz7?*sBPTl6IFCK-wR-Kk2pqGm%68%VoOiUHu;O3|ekb9kQ#f0X`n?%} zo0D4RnpoFn*2J|E0+oG*50`}D{E=jW-HoE!%qwJ!NQ8;3bnh%ItSXG^f3Ww~0dYNB zo;Wdr2X_eW?jC}>ySq2gxW{m5ym1Jwjay?0-gtsE?yf-sK_biBnc02&O~0Ktzu%kr z&g^dU2lsw%-A~myb#GPOs#E8D6DVZJ;su&Krm`kIV;GY!T12WR*qOW)Tm z6Mq7D=NwNEA32K(T9$J0`M2PFB%vj&Gpy_KZeYb%`vua9jZ<*D4@hkX#1*PD3^%v?NT^vTwzkV zSQ7jSS*HbeWhHZl3DU$VDbhJHrJxcR+?3x=Xm{KR+J;;&9G;g9_17_MxTrmiTz!2i z_lQ3?ctayDD0{OHz{a5lFxYQvFeHg5L1`J3N+?c)eD0lk6xU`a+V;GTlWd&7dyUasv-sEDXRSI0necZVoXdY}J+)%fn}5 zGnj(`YGvnAJC}tKqc03RNMk``4T~2UM0pfIkRj20+{`%i3uQ6$kkS)|_R=>KHYYf3 z3duJT)5jC``QpwVw#p;2{`>}jOAOx^?(onfO1)&;7S+ZL!RRGh`ntJlyw|?H7PW9@ zXK2)$Y7xcH+0Iz0v@vqAK$S`9m~9e`Lgo$0;z`NYLeu4J-EvfPCOFF1O2ep`&3gC< zk31~4pH{$judCOV_~+=d&HYoc&ANVv@#g1fW`WAr@|2?UmcmsGO-4tv^MNxbu&-^I zDyA@mT*C6UH(}bw2avm(4ePi*jP-zZjk;EQPxxIjt0`$P^Dm2G1v0wFP0HjAU6r~9 zilZJHC$pFtu?|)Ax|LZ&@4_1yEzTRW*xLZ5I30SM%W?u*3ouJIjmni zgOi6B(l)qUeczGY9W=29%U)S~dsYVy-uvU#dZSpqzvekF8tR%v_fx$|)N_7M-DoL8 z>-@8ssvcReG{wXcf4=C`)S`L76hJ6$qlHA##fLR?jpB5UjX&Dx#LB`Ml;mYk+FPu! z@wt#(n=fJGMox!m*e`+ED}jS)*4LiENlI$?|B&Ggg*^JTk_zC#0!F}_TU!?Cr^`W` zc!~_L`dR4LTdABk^(b)dX}BA`UYj&W3Um$}V_xK@Od#9=%`Og@8r2B?ro#q9Li%l& z-TxfT|Lr4!i2j7{GI=Icvpd;^sda36?L-mmu1S_x?G!~LML)H?pkT31ZV)>-jm)cU zhDfxcAm)qe#?Tl$OXa?!U|23f=Ks_a%MVIC;q7Z?;Q0}vbW=C zr-Gwnn(wqlnn}G=jQYN>YIE?HNDY)jFZ0!9wXLIN1q=ZB6pa^Z_L)H!LXk}XGmFs$ zSUDuJiZiSsFKUaV84aiwaPXq3!R1j>yoqp^sBl{>jgzySY_Fy-gcD9KY=e8)qL+C;yDc{z6HF{iz)7-se6aHgQJun-T6 zl)h^Gfny|_UjBdAi`puDIhG)-@e%sB6O z^?7|cV*D1T_eZ#A9I4G|N$2Z#t~<^{hPh84W-u1lGr&3=zeNyIJ7nOOZLrmm(IwN$ zCpIo@TtRZiTEFQ_T*2A;sYWyMI2b`zCZYu@*d@FT$Z`ob z1ndepyQbRn*|Ei1kMdj<)(&=4^$NW86k{?A&ukcz1`_BdYFDkg4herD{ro1z_MuYc zG54St5i1`2yLFYPX@Sphf?o|b6#05%avXIdT zRSag%OaEn5BY|79kQ*x*;#;Y#y@tc5R1>h(aW-l~Igf2|A zlazZkm!a`xJ(ZaCX|5D9DFtQe%bA1AyhJNvd9LH`rexO|)bERR6O$VMh1`+dS#n^-Tt zVeXE>qPYE$bB=)Q9Z8qXa-6+(SP4{Tqs~SgL_A0q*RZ3)oLoDqM+(K$&MLSrZ|e5`%$=qvARSwyE2jjMc44>)Qo}V8i~_f?J&t zFx7cRwr!IUR|aK{#4esbL#iW%D5oBwLiEiNA3cLRG$|Zfhqp9h{VYTfvpT0#eG-S4 zD)HU(@r(yomNPdJc8)%Ac52j7Ed^4=cNm2U+_{4$Q_n^?=ID2b*Apt<%1vIsWh)@w zWH(t;;zwD*a@T&MrAX9Ji9F$hHvc$4XbzJ7#9YTs2KNz9*Fm79)r`0H4Q7~~D zvCnJMMA)p}mGg)Hc-!7X@$;Km{f^tW)+c{G3G&BP+22eT5H`nu08u#mh?fTR2&0$Z zEuDI*)I$qN7Pd-XWMHz81Q}H;eQ(UE-XB6EW#tm-Vpg~;cPX4vDafNUcj}7Z%J~D; zKb`)+McRMT!xLMescLNMVK#Y3O_+y|FUYu#IN&QchQ@g(NN%30FeV40)igr3kc%ZC zF=QNHSizbE*7`uErmIKS)%@JS5TTdcf7mt+(yV!FBk|{_v%Z=iaS_(zAHn}zb{phM zX1T<*GUC<@)AZBycDpJD38U!{zA#O` z!EX!VzuogYP-W^0V-rGm^-0q{k1n7-&)&}{A~UU0UREtvnJ*+8wRzQ~!vF^FQ(Gr3Iq${*Ljh*>)RPTUp9m$DYMd3BN`0 zOb(naSBW9C2lHTGPx*)Qbrr~*CmI62#L1BYj^mjea>lwYRH38=PPUh=G{r(jd%-Ei zVHO?=91B{LL+Xj=2R2*t0AT}7R9GJ2%g1Q|W=okQLt6q{_S$y#`=}R^ufGd7zKH0u z?w*{NegI{({M@p$ltm%{NXb37p_G~~PjvRTlg8oWwRujU)lI>+0dex-O=>~c&9;g` z?V3O`Fr*`j5QyI_PjRM^yKJFg%IV2b3=SRH-Y2i8i^jdqOf$+kAwEnnDMqJJN8Jy; zq@EOWcG{?JI~B~e|Z}ZBqS8h-kqf(JHk|L zA;#{Z?XFG|9thk5-LkotBSv?KG11Mdi1ctl+`!bF^io<^_b-D0H`dAMTMI@>gepM* zqHy;SsM#on6_i-qNMJ>cxQLiEzy7SsXmsskJSTcYw)Y+brl|tuadTAlD<&y=6P1e-Oq8F3 znFpct74mVrYKGP%HYuKTwFE*7z=*Y2Pqy%RF&2$Ac*OLi91+nY6dxB4rUo*-go?Fw z(>`Z{4(*}zO(fuhA?>ghBN-2LH>@8cJ>E&2Z3nMfol|{kFb=OedH{{l(aIa(eodjtz3Cd{#!|qVJO1e<9s%y4U}#|44dk+}Axp zFy?L|FXq5-xCTBB9X(@1f1IOg&L?7stDaC&+)54uOQoT?5gKH*G%e*o0>adysH^Ep z>t0ATulN_?I=J-sft~Q|e8z6KQ#{1IcNy2fws`VI?Q{#Sn6VSwO30PuITvcwSvGhi z1%|A6gVXq@6AYWWIYQ_F} z>i8XtmFow9T-)x1@qpD9ZvmH&!=PcXi)_N3-crW6)GDY*OLk0A??yN{5<@S&=D9Fw z63(ZKsE)SBuLi{Q8VfmxxJK;=SjU6eqk_5w-`RRna4ehH#&{%;RjK1TfnZ`QGN5HwqbhoT(1zz`e32`~2J*-*WVWZuX0Bx9o9+hc;|OrXc27 zVbvxN>L{FntZK0yK%SVAAq{I%igCUxU7?Pw6UlAPkExBz#4o@_-cTR&YMlPr#*Qr) zk15unX@x7D96GMO<2rKR=gH$Uim((;nb9Cya!ctOv{W4JtSY7v)iR4$It`|;&OAT- zLb^~pyWdz=*NRGABT5!2P)b5IN-QFC%=o5Nd}vd)I^>=DS;K}f2K$d7GrfUJ)S)v! zmko)dUTSA|N1)^#xvP#;Uj&g>rE-8S=F0zQ9{(X$e@IAZ{p%umcqOwWW9goF+hW2* z)%|v?*|a47@ZBhu8+MZ{cK;+QT~B9IWss=e^i^ZgnKesVzYc*%vHs*{4Z6txD9^ug z@W60Mchb5z^ALrV(IPgrc9if)fQp-(kx;yYOTj1)0Q79Cw`y{xRUU3IAZ7)w=*U<} zO|hQ!pz&KNR~W*>(qALW;2+mBJmeC!Jvx5tXMgX;7m_)7)*>9vTWugNWB#OG-P&*2 zt6<9FvsMn_q$&fm(JSPSvmPy(^?c23uq``U_NX_lyYyQt8d@u{^r{1o2)6)vt1T^^ z`Ey73yTS(X@6h@`k77n}k^jUCoBi~m_n@kym?Ahn z&}(Uy(D~E%O4UDdtqRfZ-YzBA`YDV>X%%U#M)Lj2K)9O1X|M;Vc)G#5#QWkfi$w+n_h~b%OwsW$t z$ElWD(JW7rLs-J??=&j!A%&lAV1FmuOtShwb#9Y*BmzDLhy|{&WZbAp_h@yxJAvxO z(@#!Us)_ez!Mu86;JL4F(2!e3W)mqzgz7NDaD8S|L4Yr1M!infRjVm>Z3h>bbfl%} zbtMXJpmDRzOOQEDuM*F6Tn~#jGj{*N$UTF7W3mFXGr1(t6V$_q_ zZ(n*Zj$ph^eY1At=1m@Y@W98jDAM9B(e0`20B`Q2?E1d5_-By!i-e2{nToihVPSLu2cHRSe6&ul z7QDE-ISj`P&NYMHJQQf;bV{L*&+QKMdQ;Y@&PuN2D>FxCO|dH$!!ygMvdS=%Js-#O z$i+3_R<3Sn=?pL2F2M8|^dvSh-1e+0{VXO3n#k@XuaE}j!Q-`L=xotaSnJ80VHrZn zkMqp~oO?m(XtJ4`W3XBMU6P2WUQA?28`GwH=bx1b9DRj_zoPAfz7Vo;xZsQX45hPa zDJ!9Yu`XukVwX#Z1qR39Gobk{484`04(wICQ*CoZq@93;_A(Vz>l`>~ync zi$2ZURTTMfavX*juIo1v*Vt^r@m0}v6LX}VxkYJJ z5MPhRW;%Ix77=vk-fhiAX_``-f{Am$H+uS+zCS7g{ zjMc7SE*wR-(NnlP=*Ab5ZYJ?d`CWJ}@*KJWqYGCFJGDTH3naK2yH971&TVB2>BV7D z1*J_)q^S{O93*qGZSnfQkfh-Yc`^cZpUIzb$`SMzp)in&8Ou3|b$X0pUI|$9n0#Z0 z-jq9q#^6if+F9H5L7JPIIO)DUq>Od3_rL^-P6+#)5R$9YR(Lr(CU7eYCD}QOf@JlX zC%rImJdETMUmM+51g!LS>y%UQ;#io(6166dFBYT zy{rn~RWZ(U=P27!Y0tk_`mWD5+PY1)@I94pJVSE+ZX05BoWoOy;cD0YK%P)#M%*#v zEQ}pD%SgdTY-d-m=s~eSUp9oGIuS#iI4zh7=wSZyBAq>h96CzzS~#V z_l4D|8tlF{9N;xZl_LGcIc0=f+NJ4)m&yJ7GbfgsuF+P>TH@`47is+sC(Ub(*ZM4S z=WnpIi}#)sH@{>URO~$|G4?Pn)-hBneE{(av@Ti@Eyj80nVbEk z?tHYcQ8b64fp{ZWWyr9FM$*{K2icn4L6o+^swin-@AheP1`i%B4Pa-4==_F2%wT!fW~dc(^r|CS9IRm-{DB2d28&&A*1?%43o^wa--MMah+T!lM$hO=DI~6KLr_y+_lhr2Qm4PrEM;rG4wz)JOFEVED5yHtD=cUW&;t zB(dxbABAk7_})TFN{;bjJ$?iSHw&v;{y|jp+W1vOWC+T%{|JZZ&}WLQBn5LTM}{c% zp3Jnmj17T|RL|Z;QmyPA;w-We8puRibv$&%%Tc*M>9GRS%3fy^tLF$$@p@AoeAa3y zr@BV;<#UHo)qD5wqQc2-yd$Rqw&At~i*@sAr7(q;p69LA@HSu#_qOua{kdS_#Fh(>C{teUrf;kK2{fU-Vl?tF` zSQ1Lju216O(Z;N9rnPcaS$jL}x3?fh<*K_0By;WR?Z6=_XrAexi;@b3gKecgzW$Bx zZvgtGxU*qL>7p$~G*8&&D{854Xk>8}Dsqe2$IX_?4yFTT#iWp? zCjgJOzS-sAd`k;Noc}(HN)B-?>;2X3?!S;Ihh6u#(~a%lGwd&t3)*-yH2tm+Ox`i0gAzU4Ot$#GTJ>~=TBv)`xoKy6 zh_VH)|* zB4eO4Z<7ay)^+T1ZbwXaArpZfhIc;Kh;^-D}4a(XZU z=d%@RVSSOo^=x9EkOQl$j#n9lSz7}Dl$Vf zQuHbbdc>pk2E$9Isd4@%ZkQ*6ge1~lq7e_-%4vvXt9cA>)eZfmCnKkOk_q@nw~1&^!#9RdVCXSSU{|w68n;TrW&4m(`MDPBs3;~R-HDUglYT|cQ8hBHt9>HpKIlpJ zj82$`uYFd}$J%OhdHM~;K68IY8M_u0K?o{$Db|rncQla0aU2w{&W4U>lfBL8+;@#k zlE_&9RsnVncDVT>(7U85|EZ3}y#qdQQ01vZY8-s!B%bNB8-}bt;79gqs}|t6U=p8r zVZA&3VMAu@fQ9(S8@toyv^)j{e$Da?`ArY|@SRmgnXJ_ug|m2atx)i}x{ikWa`dwI zyqkfK1aFz2Ab^qN#+AuG-a36iYm)urEXsL?fTT_g1y2W4`q2PtKUe=TP>|Wk(FOu7 zo;kiDf0=rD1v`A_sdWp+j$yLyPv`lGM_L$q+SRx1n@h<9E(a@V6T!c4eU5<-SQy15 zr^oTI=Ftf)-`gC;dkiH{Y2%5R@g^=85sG)=&v~jwV+$K3@U1uvWU%1%ycyIe5{j{; zyDM(VKrOW{{>%ofx_h3=ePkA#eU+NVJY+S6arvNclAIN}oxFZkFXHeVOWHyh(j^)g z-M$C+c%t;MPv}E(fQxm0`4>o22Z%91QuVUF>He_Xv)fm10S<;Y|I^>1(NvmXVLde5jF?9IGF5gVk+g5u0VbEH3+Xt<)ajp5-~S@1ycS@ z>w}4z;QdIz*{)@;OJ+zjN=|F|?1WkKcz5}Q0l9AiZ%mQn2#b)-6P`P&1Q&HAzhPl4 z+89Ur=pLL(>$h!PtCZGFKb({`z*S$@ofiCaJS9HvU^b^q4Db{w8#5+&;EQ)$CVDRbU)A|NiZlfCVi7CG+UNRQj!xImfqH^I@ zNOODNackwLEZveheNc`+OgB+l`QJSl?B8597MTsVi^5Y*#&}cSbQ!gcR?-r#AIfa9 zV46jQ7hnq+R~=CjC*5MjOSeQzVxgNpK;=1)?mnfu|>9r$nz zSFb!svru3|2wBf1w#FnoB?dg0ptkvCh(xzaAv?4pr8y;i8+C{-xu&E3sQD8pPs=wf zZE5P$vopb2^GlD1I+mlD@4VskK~K%y2N=6Gv?&O>NYHxI52$0U^KAl^I)*b8}_^lM6CQ@GhfL2DxL~);GS&v!sK{f%{#9IxX-G z7j#j?rTZOypdVzc+9T`if_wB$aHN*W+eZ}hbKNF7wWE6~OPaqddWWInQ7cXw~TOly}q^Rqi7pHX}l$C8|Me+4;l|=(1|v zQymoX^esCL>o=HfLq|XGsR@WQ_C>sLaij7$%Q4n zY($*@2Q1#A4X#V(5i-m&5BbGBv&En%t?t_)o9#QFYD+7pjRjS+gWHF(D|O~3Ej4#D z7i38jKXZeN&t#wYEwu0Z&ptt@7DTE-f=I9^tSL9G;OfcFR>jv>`5aNw@YCTDOTY>z zks~Ti$oG~7jhcDJuR3;^mR&`v9n=)G=tD$aIuX*fcjrjfe?-LkU*Fo|{%h<@_|(+h z32ItZ;xVu5ay6^)Hl58@bAj2AT3?vxTXe0>tm6=cIDmSju{YdYD;oNQ-PAS`OPC)_ z;%-2NNGpgiw6hJ1Q)iAR5v+{P@crchdlx-0RQ!=m_w?@FGqX+QI>^vE1OBlk9*gnX zxVY+y0!JS~(|C${uv;UW5F)}q_1S-R(#0}z&gZ8tc34SkGa>3!t!9`^<5zxm*+w&# zwZYR$*Fa#4AzAObZwa$F;jF!>$WYAPoq*l2v#l#?T+9FDou+Nats}g zoAr3qmus1w?KsbhT_R=5XGgVdfSW5-S}4k_f|_vOj?%=RmhS7k90xDdh07f+tq(*Ht=fAI@R&oJhPIg);~K-{v@LNa%ITRDVv&Dg+w+&7^E@*z!x5ny9IpoVo4 z{pA8b4vJeWufLF@dU^05(vsBXN9}^0DHLpN*i1CL#2mYuzN&8p6%R8}X0?;Af^8$~ zCwunYktyJ|sMLV=7 zB=i2>T#%^jaTqY-XnVN%gnA9@R^SS#V}4^EOWw(v3}zo;J*ggdIUZ;{I z0J^fV$-jJRe~kHAa<-IsREXQ>S7 zsm!UZSq~>(BVJAb;;?fM5eO%q6)PNyDU>e`+<>cAJOiVcPEW`ih!rp~vlor3j zr$s{DU;>jXAj48?CVqNfXkIXjX}7}~0>(eNmayM?Qj8w>PN57LdiOpZa`*Hh&!oyY z+B_uJ_&t^Yg&MFkMmF@(7LBSqP;AsUOZ6AY-c6T^#>5wyCSuv}-ngs$ zO#bKuD1y8H5ZEG2rIAoFlVYUk1gC?b3B0jcLqPiHzehBq`z=!_0~tOqo(|M{g2*#D zGY-iPw=`le6N`t&Uloe|#Qs=K+I;VEm7=zYzLVW4t3d!K&^U~Mud3W$=k(w39w+pro?}E`+uRR8{S#OcEvI(kIZdhq3q~-zf|d5z$kN+|@*C9acfM<~@C7gPR32 zot)Wt)@t1mDGw1wu-rE`*X)9drDHcQ=Ga+cA7lW|c$t{%a#j6OdsbL0eY7uuUXfB+ zk#}2bnpwwowBP7$idTJ+xiSPD2NB`Fms`b$l8ACcfK|tW7JA(9D15v$%aWr)!vr3| z6hFCIk#Hy~KkRde)nqKct~+6ygN1N<_=EK>Fl9FBLS(5_ohJhXX+-3-XJb9Is`P%ij6#t4F zI{6>x2gO>d? zA%$v+kGm?V;z=3~VS&2zdDc>K-BGOB!UY~A96zc}p{H501g>-GYM@$DoNsBhhL9K$ z$npy*w64|R*fq!WT|I;0P#uelt4(3@l?^~{mPwxVJlS+27O?-R21o~+3Z7+v=BN(N zdE^mmISwV0cq`T-HdRKH(G#OHuMbG`5Dldx=PSGTmz{~%u5qmHPJV3}zy`PHzEuFS zM2{KNEI{=0`@zGtBeKbsZgEK`j@+tpRVzCaBFaDW!{RQ^^v zi%-;R;x*XHDI0pX&8}+WFJgCY3gQ;Y6sS@1Zi1`}OCl=%pS$Y?35jKpHIOW%(g$)| ze0h4Men(pW3i2VL^W|;N?W*7ChZ&;ESI_Tb`Vv)gqHe3x+&ulUwden0u(Kuhb>kW$ zc@Sa*_nQeggygFmJnF*Hh627lZ?~-facF6%dAxipv-d-vaKw}W1uV|jz{33IXLI6K zqiiv^h&rBF0i3lhoWkAkUzX<(lK(Y`w!8sa#Rbm74DrOx^NtHmGw$%R^T;-%FyK75 z13N~uN;I(O*^l$)W>_{+dYhaclEoydtW2$0L~P2iLL@`%zb5;a<3Dj~5DDoqRW__a z1n{+oyTmlU`>cw5GlC&zCt%?A2A@{k#?iwwZ*Ss7C>LuuB&|Ap(1jV*P1&gAXe`tW zzAmfE%3?Sp#&G>Fg8Zxh(Jt3Z&Npt}?4T`ORcF0^-*K2SX_)K~trh`eo~m)nH(32R z!d5qYAieLc+}Lw(!vHY94?E%aTS3r7LJ#h=t}L?@%XgrPQ*?MfT$co^=pt9I_#7*yEF1o%kZ!_IfWmi3d#a>8_4 z;NsI-`}XdU3ytKZ>JnqP{y^=v>{%Sf|mgt-o*&a zBsHX@sj5q<$Y!~G;imM1HG-ByouGaL!&XPTAWX)jPPSiwqq)S;LM;JN`Ty*CI#Hnq za?jc|k@*Tmz;xEcLi3R`^5bk$HP~7sn{Wf3r>tzV$JPf$Y9(|}{D?k{Y@$MD2ExrW6vxHBHTHRJ~2_9re#r)!*$0H=(N{WGp=`ovVykfB0c+Oj7W- z6e$17R?GjbJKf*d5CNfh=_mHuUFmX4Bh|zb%I~sjw?03fuzzl_5wTn4$)Vx-!*C5d z;?k2&>nqnhL3lp*KAsNscJ19VIZOFGg^Eb%<5fho2(bsqLcx&HnA*m&qfNf@F{-mnLm-3;__1VteYkgcd7)@vrU0^VfY@QRxjp9Y;ut0DOoA zL<$-mCAMN~LEa6bsL|T=q!f|c=AZb2L#SX~r72a4CeceeGrCcKRmgzL3b-FVu=w;) zsB^Pq3PNdl7AyVK{u8!)|1q-<4(=85@rlljOI3i^JaVmdrnOMNes`CG+aFX3qT)+y z^Uf(Vxbx`JG?VEzx{Y}Z)Xdc7IM<2WxOJv0*oS}rj4qNs5kBGGNXZ9jyx}G}|5gCp zzC*{Kc#s0Ndlu3B^kHh-b%~PRI*8;O zxf4VvFNG8BycYLEtyS8ezuPnr9>h{58oi9WJZF*%fK6`gzWAK`3dKSn)0oo~6EvrV zy8>=fozFt)g!Dvb>ghC8_^F;E5(*(ku-hwpA7TeNomIc7LJ*_pqFG1TRZVM^4Z!`n zfT%@l)LDu_&}84={lHXfL|8m1IXGtD8Q`jJ%h}3?@aaaB%M-6NVJ`>Aj~X+a#-5y$ zUrX#`jnX?x(Lh^@yj5YE!^;kGTpI64+Ie3j&GJK9aG@Uka$F@%PjYotfWB#;(FqZe z{@*nL!5U$V^%As>YDJz}l|Z2xA}C-pQ+75ktYE|-IKa=EU^1JKnxg$ZdNH>cYy>!Y z>UYK`*ca7N!~`pseVzLrkpdB6RJ+(HCsxUpk@Xm~kU4XQ?a&=Izs|wu_I3_aM=!xF zsmgKYjALcnyeP{49xzB+DR-D5)-X|Nr&VULlj$VS;zQtTM7;mFokjm&+~nWe%E-xk zSh7Ze+WE^Cp?wlkr4P2~QTWC%oarjw*!IbmC4c%}@{QRgkd~;qqwml%jK(#I3zERx zlqzlv#&axpFfeFEBo;ypt!NIU@CG@0@6&@fm*XM*hVrB2iN7+Zl;i&l%D5>g|=_Tf(*=iN7YpdD|~ z{ZN~#w)J;gt-|eCs@N)5z)KKQNWdV^_R|+LxeriY>GQ~PN@FG(IN?zy@=H+~KkNM5 zQ<0N6-CHL4Z)o(e?IRYx4{wHT%kPp$ysI~99vw@H1cZDhcnz=1mHOueeczOrTdcyG6O!3r(IB1VHP#eoz6*u=CO>%EvrmWMKp@XtGS z`#}0yT(5qik%Sgov4(i>L-Nd5p~93By?zpyLh+KH2J?s1n8C?6v}6OSF!awAX+x_p z{u$m!RQ9RsfCAl%wKo0DA!zi6@7+kZ;M@D9+sKJuNQTgu9~Q4a&&!jFxo-u$wO_&$ z8yXks*i1TW7MPE7gx#=srV%fY@N8}HMp==JJXP|T&a`IgJ3Qm7wwSz0;_maF7Z8OB z?aVes&8IVHf=i#iZ^8auGk@xH^&hm_;^bZ<`&haL&kA_bZewa|+ir2bUh!U7_*R+b zm7hN}(3YH$X;vv?o?Ou?2|igd7n&0OUVcL!oMF{=t?fjp_q)~*ArC)X7y00hzl!0w zt~>opu(=23-?c0CwuIQuQOR+oTJ_2_WF-9{mt_l zERykWofd}Cl~Z04U` zinZq_TiL|^Ch7lj;mNBrg(LdxUr2vc5Hwk9MGyE4bd0xJV6^WjI5gt2(UBOpBx;G=KzMpDe6jpE9F(igwg8 zC4sqKOuO7JoN}gTR%0)=eYa{pP(W#{SS=9dUt`TX{nL@!L*y{dXbYmW6qyqRnyJ9x zy5*8ex2i)PHgysp-c)w-DvNw(*ul^mn0o@241qS0e-Gm>OBBx%AKnoylnZt%AHs#2 zi$Sft26cK_93SUc%IS<82B+?uj*1$cLO-`V8Yfu}`V{jO2caip*^Qs=rs$t<%VO5J z`15xzLril$z=G^bWtn$Yp!!Y=t|K~E<>}*6>uF|J#jKs6M_F}M-{=me8yH`(rfsW; zorNz^qw<75fsxQimiO4EXP7OXE9-p2QQHB5v`c&xwiYniJQEnL<36yUbN{g_|Hk=) zM}EGwHjz8HVCrF!F%Z9+l#kPpbE0*XSr~0l@bMe1X(E0bf+E_)p^?s8ecO`so#64u zOTJM!-jKcFQ`u?8gug-j2l(E?b0cw1S@@;GF(XTM8`m92`n>?F@rj$_Drnn?>rX5#qdTIgLr{0oT#` zb~eKlS@;TgElHiV@6w7pri;x0`HOuFIBf5TEVDiqa}RZJ=)mL7IXNT6n-#6j<>Vg% zG~TR-{m9UQr-e85nOp8Hk+1C1>Xdlqx zSg&fAjM>iew~OOZyrfU9lhzbrbG4G$IPnb7_eT#tVW5_*+KLpjwSUdi!_l0dX-!@n z=c$7$n8N+|_IdJIUw_x2LDj(%8mH90EzEDL{$_lW-(ls>PLm@-4cd89_~stoblK^5 z${LErb0ljBLc9HLGyYe_{o98uo1xyImR)y^&@TLsbAaf*jxF7vjhEv zNiI92E*J7%(Yv$$Oe`2TXTmbg_PrLnhozgU^Iq|_*4)Ync-%;O9BmeNUr#_b=&SH| z@5CY_KP;by8IEi}7;OM?qDV`$L{?X5e>u-0dG$5i;8B`A83^aTeZz@UEPXM*BUJvX zeVuUrKJ`dLoH^>F`_wCW+FveGh-+@;orQzm3;O_b*V*jhXOvSSo1qCg>)7V zKfeiD*}E^1ji1_mi4?pF@?O;o71i7-if4CekhcrVJM0(Iq?*fp<}vDMn-VQidhfLJj=nuISN^eznozZU{(5`9 z-z}{B!`yYU19SHGWz7EBm|sX)iB6A7v)m%E*mmRUT}2(|I}95zJW$Z@^d$Qi!bF4S zv&Yxt>FAU3li8gIGW|-acR$dksJsqU$8`t_86H$}XLc&pYiG5plmgorKgWo>-_?02 zfwJ)}64*tPGGPOaOLJ>^!PdMM+l>czkrvZXL$XrkR9i`Z%XD&ByOJzq?%y*xs89_PkHZjf0 zPkUZeK#fh$JrBoRSbhP!wo+_u zQ%P;sM(NfX1&?ryJh6K`2DdTDRfu#2BuWE~6mf{m8VE}rgOiAJXquJm8e=N;b=C=l zA~%=aM6IoaogUQ$6!wco!Pzgx<9*R}fuOgFjOl^GGK?N?4dxG17{a-a`{ZRWz!EA( z@~~>fiTN<6CJnf~UWR7?jOQwvJ6yNtCws}V@y5ZvhtQP{z>z} zchw}JZ5sMqUApky7IO1&Zun2Tj?ANkP`%D|+U?KZeUVIHu;EXd=ao=fZy znnu*)5k$?{OafWrcJ8pdS073P!qaW5^27%Glabx?=NAo5chKzn=C##*g#f-xA@HUC6dthI|aS1}ly*E0*FJo%&?Io3=ZpDiXPqv=}Rkbu(v-z#op?EY_ z%72iy>?@U}FbLM)3_VI%WZZ@}*rOsFx_SDyeyxI>wVtbMRX8;D&!}qE)Ne>1G_^Z< z_jlv+JMrp?#epAy;r zg`ku<<%gSU{(Dv$>x)-)aH}Gtw9M_v5tv~Y!r;1L25|Ge>B6pI|!_N3+5N8K9jlbPr|MivoF2A3)7VP=m(6>MSwZZ+R-#gmBPXCwVf1Cly^UNG2 zecj8FdlzU*hd)Vom8Np;_f7|v?LsxkHohv1{)8nm=Y?cf{zA&Jm304NWy5<%E2^0n zvXb;=7f*v+c>|~|e627YG#(O?#q0h3r$my|>kacq@3MX*k>T^^<&{!6e7J!fJcv_cPCA_R7rck!NnNDUANQwsW%X&j1K`Fe^h~N{?qNMo`t5m#@^q+rypqt-OUa zT56eZ@Y}74TLwJ893`^?6@Y%fB^41%dRC76QDk5TazNE4-)3Hhx({Gjy+7$sU2}ty zDFp|D$0Q#!5CBFLiQdHX7N^l!h6{o#m#D3tEEQF1D0fk(+t+YhECa_>4m3P$4{XB>iPBr4qZbHi97*f-GE92VQ4~-!g z|Ioef-+wRp4V~F8d5j;j6-gN(s6z^He7})eJ3&JA1aW;6V%mHadV5-UmRlaeYw}_U{(5nyF0%gaak0juWISu zn^DQwfxbmWg!d||yQyU)aB@KLbbpv=oejf9jGTYDHmzkebw6xGB@3_2EkT_+Gu{Z| zV(Y{ptc_i}EL|UHoaeGNsd`d!M(NR?WeleB%zb6{xY~CwP0tdM63(7;4p}i+Y~S$o z3iYrU*q>xlwRsS_e8d5WFHR>juSzJwehpJFp}8I>6WVK+M5iDjxg>YZ<|QJV;}<;> z)8ZL@!YKc8jRJQtaqH1>^uUwN>g%7-7be@HiCZQ?gt4u)RuY#Eq|O4eOWpy(3MbX# zU6L^yxv|!9=}+wE$~zVKc~wo8IHKsR-VPiL+F)4L$+c>w!5KFagnjfT2Q(NAqC|$7 z+snVL?^28UHF6{>d0RSqlFaVMXE)ZCo1K7bdOPyd)T@%^MPxQJAUf_glGs8W0VL zt|#_|Fsp23qSJrn%+x4rWJ;Z6@n5v4&HyNJqzqExcIhNxL)j=AJ9pm(RVH2VIt%=vC2e7=E-)R@0_ zJqbDoLjSoUx0fHaVzk`-c7z3+>t|g1CkmD87snBNd#&!f9+GFz2QdG-SETk9hw=_v z_+{pJNnfLW#rP%3X!*zQk`Y`9=y*RL-BFEvKcxIVtkL-%@AVI|?0@n|`ehfzg3r1sMPm7ci~ZtjT!&jPqU^)Z zRNaNMv9u?5zq}h-l{>F^ItooGaZsL+%3P)DZSykcrSQXlJK`WXY{;o!8AUhYA4K7v zqC_!LCSOLTVxersiuo$Caz-UN@iJv~HnK5YxKcSbB)(n}*=iUVk_lSVX$y%4He61x z&^tw5ND(ORclAhnaF*(Q2Bfx+7MRj7T$`J_FFbFewKB??Ph+2Llg62 z;?6EUL#zKw{gYt|K}vGxiVK-O(l}_Tt%a=;C|N@X9Occ_eU}U=b#AxBNcUOGTmS1p}TZTQgb48~brm=H&p>M3=5xHR8s>0BY zl1Ujr3r1w!uewp7m9#2>bmqr3=r;4xPqmdofqBEbvX?5Srl|~>X8MLzhJHA6tnJ(- zHDBq*MTi!}ngZ&lvKI6UoQ0?7!YMEKFXsNbN3!(Sy}#~>5fiN4THYHr6%O1}joNuC zsj6)w9v;{&-k=2Wv({W1?HJwycu-errX!HyXC;u0Amj>9^Zx_-RP{@EHWm?U#) z>SHxXhmITN`bWMt^j2VOwaZ?Uv10xkT%UIw zGCTN2JJr}esc5a8K0Kq%n3+*45Tof@C#7n$LzxSY&b?sOEq1qf&=#k3+-WBcX)sB1>j#bT&`9N>h<`@)f75Gjn-`s0Y9DR+tijc(8gw;Ik^uCNW!>8Q&8y zk8DBWEOV?p=j8ivKB8EDp?U?nYDc9Q`S}qTd^(rTLRJODtE~9Gt&7#&c8b6d1HoR! z(eQrt-T(SSMv5JjK{#%wt3Q^zA%M}?*rQJhGUhNbuB0?1+V`4C*SPNwIXcv`DxqZIW5}`4+*Eaj|pRxT* zx)x`g{MUaN$xBg3?$6hWYo*X+5RP~6V8e)ldK5MKDwVM96*$q|k(_y1cwR{}( zH`*=9c(NiBO}pBe4lK~R8nXQYBK^Hy*vo%ui+iY(-Uz_GhT|tzYebUw-=Y?wJm+Wy zbM~FyPBdlYS+Hk~R zHKR3&Ev>sHk({=Jn90qE61$^B<^85j$`rE==`y|N#CmPd1D~{q9{xcve?a|LH3)xT z^`9uz;|GX&9)G)8@e&>U9|r6H&nSd@_o|$pr+;C)sPr-g1&vG!OEpOGYAtwzG)UAq zSsgYH2$Sd>IT?M!mkL8s5o4Y#pR_h|yJ%-4t=F@Y2bfC#E_?sx!hc)ghL}j1p0Ul6 zq_T|}Mxa|Sxca2il{luoMHdcf;%R4CHV%*re~S{AhMiHz*v-Y zp|CRcDd)q#k>kG${H_ark0$)O_&>2={_hIS5VrKLJd*A(Lx##U$Got2(?eN#c8W3z z%P6cd zCJ*;#hW{?Z=IJuzp?LBR$(ndj903~Q65HmVvm#}qIC$^xKS>1DzOz&o5AW*PpMKWu z&O+N1VK5j_by%dOk8d^8%C7on-hRdYF3SJ34Ew_XX3bnOx0x#OlnU)6`!H5ra&wHS zGTPxd;j=NpJr(*S73d~5|8Naznn(NXVM$YsEg=TeM)Xx~!^1TEb+<636{S$u@3ZXL z5DmOAk{!AFii$ac#1;MsNha$=*5NaHqRe%UfyKY>Q4DhGvPR>2d0U>)VF+_R`kz8U z*S$N=5{IAuY-${phfi-DR~JLmeUtG8=|t?d%j%~TS=NcwJ zXjZU{x2A?eH%ugF_=At7IwS72_P+N=@#E7~b{-rAsRPBje#Kp(Y~T0S6!zIxN_gHd zERf(`1TRMSHawdaU~XNheN>-r zkv83A{RnT&#O#^F7?W1sDN)#=;q^-dCcU*#3XKnLc=bihi}s=7uvhEfT!+O~A|0A0 z?b}VxeK6)pNj8Qo?QN}oa*w3IVq%mjeDaBe6wUg!bLDEYb`W{vFRTZW1MFcLH<;NA zK2ro+B)fFDLn72HoiGan9fKm_xfdo!_lLYJu@b&Jh>Y6Jz}Q3seVikfiP%T8fC+$1 zid{N#m2@Ue0EGc^J_2nE_(mYWc~}dk#FcJ7iwK3A#-7}0Uoy$@18bO0#a&F(RuheH zv_6uZ0Az%3c?H=H)sIlE;&Hvh--qvcWNb#7YuA*&xBICvEm1j}QWD|Nr-L3D4XG#M&(o6 z`#9=pV=-gM7e|Z7Ca~fw$!o`}v3V$5Y35@0NY^uApZ$t!EI*e29vHe|7%dfa8tV{o{o- zlgt>iJO)+BO#>+xj%_8=%(HKNO>ze^g5qH?GHP!5loqJM1N`L+a(m4Wh1FUBUpzZ6 z6RNvS*rZR*bp-8B&gVYdp!JL*d^yU}n+LCVTf$Rf2A_NKU$MHopHk>VHtr|R^(#V4 zy_4z0lB4e0Stcn1>})Za-lKxK^kl>dq)*IJvpn#@sz&&t1UV7>2T7jp&bCinQC&U= zB{OBcexmx~VSOeJxl#k=lE;%%&RGAi7yoye$Y-x3U_os1$JG^R=CjpmRd{ZVf(j-f zROZl9>&T8}J8kG~X4xS|#{F~DL z-Rb*v;on!P_JBup-=Vwoc&tD3ApXAfN){;C0gR)akLxgPN8iDuSmzQ7Tf)>_h86VS zB`+9Z>l>qjZ8Bah*0#G|OvR8ZKk_j(%|a`Y>=&-&1H!|A%iKmuXZ=P?1%=_k^}1fc zui3LqefFDz5RsC|6S~37*Q|SRt05m6rSU;UF`uZ&6>ID%vW=RWBll>Qf&JglGz$Is7onq~|d7EyLIS}RlvW+VZ3>9+YcynisL|+uqs{8cfG}6+y1ER6Sgyo<9agS)k z9x*a0ONUrrk|TwGR?2yolx@7sMsMK=Z_{D>&@JQ|a|GnjDQeVtU#oUVWUv6zj?(`? zOCTEseU& z@}-t1 zrl;Ww`NgB`V0^C|{j8ihB0D!Xnx|2+dwzlwA|fV>Ln*hplsfz=$nGe7W=LnmV}APN zV6_A5f$dyB4Rj$QyYL>zlZL)xeF?(gym~i*);p*Qsnbi#%Kd>fo`NCHl;!=}SvCun z{2|W7oyu;i(SZGuPPAs{B`+n$;(dA7g#f>yEFnrb#Almo0w{LK;G*xZ*N&%>cow?H zgZ2uc7Bz2M(l4tJ?4}`6EC3P?@H>kY0(@)PcfAWNhDzs;A^r%@~iP3lKJ{pDv!kl^fz@F z;vs6E(x;ioB_LTwk@G3&6X6?HaqoImYZvBg7AHBpXRCC342@EdKX^t-+oc`OS7r)1 zVR;Kk@il+e6{hM+<>PQTJ$pto%U~jF$?i-mgM7{6L{w(H#EA;*_I+7Z^*r)B2}XMvrJC3RSydlrhR7bl6yM?aU-h0KOuKj@YH!d?N* zjA~FyqU{JO>adDA=^SUU=!}cwW=yaWH&3)|tbPkw6k~^txZPF2y6w>45AV^*T7Ycq zMtCMU3-D6FU1CLJ<@x0Velf>bQRzT8FwaL5ulo_48v}z>i-26f`WoGY$6{UI!L6te zn`)Xdh6aq77tWKXJn!Qx+;LPjV35}-xNhRbD)o!mGVkbH;-Ze5R_BU?H)5lq<%6IK5qcZwb zA7;a$q)8-qh)@o~O~M07lF4-cH{kl!*jGGbl5r*Rsd4qQMV4_nvHR-u?iQ7XG*6mV z)O}}kNz9MWh}qoS;k(e+PF=c zI`G^)!e+9SxJ_C)G&>R0A&)wbNmZ-;$f7BYgQ1_(i47~$BGVEe!f5YqYf72qn`R0J&w-fSg^k={xyd1|gKA1s+Qu)D>V?Ccq zAMt1cQ1UA>yy4G7vNb>PNR1s+BwK%&V^wn$t5+(5 z9QUV-4>wx>X4sE%GurNG!#8L5KS^Bwbx*{Jo>i5=h`uIyENsi?d%Oy>t^`xceT}2^|iCP*_`4v)S10b5-)H~ zRqv93hRQ@b*5MCSbef{-pac_I9hxc<3zft_1`1rtTB`GQt?&v(d7Olok5W-{0PF>1 zM@KkXv=C!a_N(AsR`K?C$;O5mmml#6AM?FFpXlo7x<)W0gV-Pjd-t;MH$!LHiXsd> zrET13^-Z#>@_~YJ5ex!gB%XbFiM}|#ujZhK7c($iKjNdres>LiC0;QvTQ-Tg;1098 zm&A|Y*)8P&?c5jdn*%FlQ;XF*Ng*dTCz?evD>2pB11^a!Iic zk)yC2w0x&~ z7@;k!PK>;)n4Tr}?6~&vzPw6G>u$M4PP4%uN`#F14Q37oIQwp#ZW5D>=Oh=43l%Mz z!)NiFg|{!f8DZ}eb`RwiDUxvmJr-+h!gudRv7(WePeR$u6M+tH=b*U36k}Q~R=JoH zz1X2zR}lvfgIFsQtCB*9R|+S@G?d^u8F?dxAr%vkzFj&d77f;WQ5BLU2Di{0Wl{!C zh+^TtqBWLd)`D2}g~bcyVRSYa%=g2j09*3)&AYyZS{I zKPm;jA{ZJcZH$#;j3i`<)*J{e7zHv~u&suz1IrIl^&9qk?8Skok*^7#SKhFG-px~c z@(Ph~8A5*m59xF?YnHhP1V(GMVneP?n9Q~J-Td~AMsRU;RSQg-sW|!{HB?J1=v1j$ zG+VoJ7aB#owT(er=M%Y2KK+kUnP1|~zdDjBGq+TYwWMk1iFhrPx`= zieZuIsEjJo7m+NufF+Eqgbndlu)+W_U%v&kRJ3`7tr@d_Fnaq(lD{GUD+Q0#7xIX& z<9W6`jM?6oPB}8JC^IxA38tGe&rY83K_tq|Qj_1F_+`1Bgb&I(>wt{s_^h7X#$4dH zd{FM;1bbJyMPol*fyn}zDz-bQPR#obPUd;jAF*q3(vpq!v8L_jR9}=OMU{^1J*tWK z;nFPuqcO|NT!47Dz1^>3RUsV{y0r$DDNS9Qm2Q1=)nMmagjP%Pc9&jOCaO_o19^zCqa+Ste>pq!~1C`pw?xS=`fPCM$(5%5QPb-x1Gk& zXBzba#L%>@BLD3J1NCM}$0#o)qNBZ>=11}jiFDBhLQ7bjPML#QjjGm!lx9Vg+sjs% zp$e9D=)mF^lbBIukO~aR)`@iTdE#eZ?iTyy?kn9c1xh42!eo5~HiY`WTVL^e^|w~p zH}_HPek4~@R1obMc_ccJZJlxS;!CH{JKcipjS^k~o#tvE%I}~he&<(^aKTrOuw5n} zEG`EK^2PW~5y{&OUP-}Y4xZP~6O}K$Sk*tQ6$+1@Vny!A={khH_4f-uJ)`)EBfZUD zllfFl3~@bcjLDpqW=%hWN0%ZdKt?S+bY(wh5;(ALJuA^TdRC_N*!3Jho+L0OX1Bx# zfR@sO?Mn^i1E3jYc=X|b%VJi%8Mq-8cx=mguhUa1_AM!n*tv=Y)Oxn-WN@l{6t1OtW-mwe zZk-}1L68=Zk83^hI6g`9uX~!$?95DNWlvOa<5P0=-v+rHf8zK2_6l13lgR}*73$vW zmqAqe`Kukzg7GD0Pg@>t_-Tybr#Ece%~#tilT#FqsFPKxHNPZDwon39M)LUEJm@1c ziW7}>v&sb^qNxcM373A5pD`zPU~7ZGSA5)`cAPSaL;BL5nIoN~zr(|1v;Eb>%oPFB zb#`k3dJ|dMBsYqQD)EUy@7Ub|BDMFQC2D$s>1NNBKMNpQVxaZuDWxdV+o5iqs zR8*V-Z>jQzAJ4l_ra848pXifS0OKQ$C=a0)sH?|jC9_)3Zgof;!VMEujX^XB=P?av zWj^$ZEjHY`f|7)Y8CP;qIBQlss3SB>m8Rm2(oTuEmU@~g4O=l!N1OlOX5nuN%|D`8 z|9O#_?*c2a28~{eNe)Mk_>j^8hwq8K$}^91l_C64L?Q86mzM|Mp3|Hfy3H`C!|W(A zolH<#6cXL%R070+|8JK5uV4OC<2t|ge*2Emmpmqu-X`)vPxoQM^GHLLDUmt?xrd*>${SMxob)?mRD0rs}anhOXRaGCGfSEkmLVvUjK2& z?}@$N9gJTo{e5M^*lPQb8mjnfhmP_u7{6}wNBHlWv%0$u{DE}jKzaf8@ z{B?LXnaOP!Fe-%t%hs<~LCvjiG(cBjkt5s9ybHkWB9J`Lmh##HLA z=_}nvD{eupLlLT#!x}s%T4NQn)FA#Vs@d>GVyktLcYkK^SL}b+LKfEHP&tpq1G~J} zhWg0h_KbppgL2D6~>L2ZXk>g~QfstW@drSBu+F*++ZICp_BrTy92Ivny}aU;IlO z{g>3e56aw_NLILeJIXMoZaf2K<}bo~c>NoNEN>3y);qnI-WR)gF%R=w5DspF&_ydu zlWm-E_XvscK;F@!sFJ-y=baJ|YjH^{-w(tFMf&|_X_~Boh`A%P8EfW&syn`#jBFZt z3*w;@dzmPcqYMT^Jp}ok6y-(|`DlH{9pam4(^M4eY(}SqSV!;-+6xSc%3BVw;NGK8 zXJcHZvKfrnI|TcK9~Sj4F$Ao1-Nbjuhd-MbJ~d+0Bvoco?940y=|+EU7tB|gnm66n z|1#_6)v7zyY!GZL0!x}h&3;#74?`Zjix(B37_K2m$Oy})8nKyJH1aQ5qE=+Y!6=$s zh>?~Pu+WXxMop3?oAHfFdNj&B8PD7}$lVwv+<{HMQPtc%=p(h#9N-7PwR2#${o;b3k&48#30TcF5mBCXcUD!j_-c z_|vuL84~u2x1yl@t8OM>CL+Zi^jZ6_dym&;M2a>>W1hjGT5Ak@&~fu9#)_@cpne}6 z3iU~c#=GA5CC05!Yv5%%C*cslX_~mVB_o2)A~f=h$u`IMxk*4p*0KpkC1$YC7RUSE z`9jwy*F0Io^T=A6u}QfTaXCyEV~3z|A_$Bnx~t$01tJ{o*P!j0!K1#(g3QY_GM)&aSN*V zqHEm)wbOdDN$pQvqjcxXN|cETCuOVj+KthoSW~0DHIHtTlAeK5(R?>tnm_g=NPCev z{&;YmYG(E0!G8N;T-r*&a+|T^oPJ8VVw~Z8tLKsfl6B$9LxOHToZ-aaZFa4jU3mh0 z#?Y1;gWz*s`a~asc2Sk6r<(b8&_;w=!iuxZDRHjj@>lZfdyj-hvcJ^|bFnW4BbE7L zlR13DoDk9G!cy9Tb5_fXU%*G|TC;6z-xjw+d8_;b9$Z1a7`LF^9M0OH(3Z(wHmhw@ z?^k*`fRl&@wS3I_UE~jCp011olQJ5lXC76jH1JJyNflAPBD=g{IMJ>VFu_ky8fc%8 z*DqqD+=by(jTEGs0zDP(ZhjOS>&iZ3D6bl9zBp&KZb;0$z|ldWa7Gk)q>sVr?oK9L zYRo20=r=05em`DPtVtn>Y{P=ht>SRku}##HIi*@ZQDi-i*Hv%Yj!2meyQ#&ACQ}n$ zYIwh%35T3Q!Jt?TQh|^7JZlJiPamS2wI3@pC&{S4pj4fL%t*3gPQTuq1Wa&nzxzV7 zL70%QoXr_=yuIwR$taerOmq4Ti;K^tBEZffQPz2z-rDn+LV4fC!pD|%Lsw)Ve?mZU zF-B9`Y4i!f+QwyQ<&0xYv}1SYMqE-bytMv0&^!j83#E?Ri3WdYmO_q0enfm!k_uW-0t{Cwa3!_X**C26L zO%=QWpn#PE|8ytIKL(w5aP#GthZHy8heFwPRKV@;E#Cc0`~0Cc_jkAbS4w|dJsxY2 z>1BQlx!K1r@WDEaSS!|8A@gO+a3N+L82CP=4!yb3Q%m)+pM{cv9j#O_zdj$kWi@LN z-%VpIEf5_MOJ@wYQ;4`>E*5v$r$6W{ceCzR;GG|b_op8NIVk5%WL5O9dyNL@|M53e z-hfwaRL%PzdnybIuh}(kPYGBqb5&L@y;zLNhmsZq;sx){Y9W&LxMy{MGYiY)bQN-q z_(m+ucY1&;uN2|s1@T}8AXY?s1}Yz8#v5KNyuWYupaLsuk8LL)13|W)-XQKApSS;u$3bPc3=Rj0(EENE_H_Jqg$SG=OXI7SL3x-8xJbKh7`vAcIp-&939!r$OA5J;GCDI%+>y=WsFN3xh=m$;2`(>n3wn3X=+5Su-u0 zWpuVOUq5V5DcLkW;|_wTVMXX%!n_dzjoY4+u}j#X~1+-e?wY zBq!)U+=y~5qp}JkFzxPBFmjLO9$KW3=2pUYq?jowDaG9_TRB zg`d`9?|stN{DRx#K?vi0K`{$jB5~Q|gG8zwR+fkCp%HRgWbjM^&V+()&5c!6Js77# z#L~~v!N$wE(TQEpW@XO@xDcmSbQ?E$mkqU4UMhF+K*AD5Zj+oVA3;#qxe*3QPvm;i zY!n(t{|O%tCPl9F!=EK%kK$t$WKwc#;O?uWBsB?9MHJ9m-X_*t$Zs!?Z_l7CN)xaBdvd1?yC!mkOn}ygqM!L?QRrJtI4LV&m#orU;y6 zA;{uDxa-dbOI5M35A%N5(obVIzq!kTcsa+mt}YllsA{815mrV#6(eDW+QjU_2wL>l z3_}EXxuW6ZM-sBR?*Sj~F*io>L-d7~f2gI;+9KW+M12r3|LMU0k2Xq2&b3hkvQ)T> zXZEJQSe%mgBJhUTD%}#DqMtTWdPCbF*?wAePnSku=&Vkj08(ijJ&>nue^*6w*!^%l zH;>yI-*a{pvanLOjP)cxps|9XPCw~2I^FA2iqRXD2lK$@Xz&EEqg`Q*?|rAZs0hSC z>_pwOs|-_dnwdQ<)c)tS`3RR#h6Ci_7GLR*X9SP_mNJJ-Tw4957XF&}{e)tzqSNyh zo&!DyQT^CBGJs~m06pC1ID9rQ#ffOP;W#b}qb*x82GB^gjQpV<&da#kO_xYX#GNS* z=X4nRK1T{q48yucqJ6}!cW?(k`W`JQ9nUM0R0!2ABb;KPi>6&%ige)IlzG`>bo~xM z$+F_;X|vwZ*x-MVcdCCh3=km<;c_{bi=3&Q7b*U7=l>HlaPY-EAJW1Q)1eUWsp2VI z)actlFmFW2YUi4c_Gu~(z5wtb#sZ8otWRI1InVSiH{(hw@Rd%i2e<|d`1rjkI?h-+ z^`zD+zm#E0C`w{t7=M~DXv8q+L>t$9lEQfNGPwo=d%t<};T4tZo4XzFy`Q6RsfNwC zrCfJV8h^|S{BeKw{@;9ED(mA{Fw&5}+K|Q<13GzbZW^)YZWH>Pt?uQk)1X8Y>yfDdQW;_Eds4B&t)Y*clCbVI!hl z#94aVMD|!MG4f2AGT|fIenfFf6o>u zB3++jFxG@4(tjkfdYI-Jd}B<`xQ1*1SUxx2%$A>OsQM`wn%Bm$P5jIP9l#(2yIlS=U($ z(T`OYN*2}_D_8kq+8f!O^c#4Vno z&Q8QH^l@-V1(7X0zb?RcJNqKdkv;9$JzFC;F1k(Fqn$fx8!#`y=F;2t*FDOXPqU7t zY6DuTpNY-#Fq+_%7xexIJ0`T6utdS?zwYrTCoS%w2Z1@#IO5X~0=~|e42{%|okGGN zR&!q0J?0U$!2?_$0r?SAJQg#2bDcq?t^ywkY&?~sb+papbCcj$8csDgY!tLkbzVpll{9;jT~vQ89~D#V%OJx6B8k zH}du(W~p3Yqfl5_WtXU5%8Ca@!`_2j#w^^UMvl zyaUzpaAI_Ztwa3Sf?DB{06Z3h`tsnbbG7sgSJ!5B2CdrT9I}{dpFJgSYrqc=7y|(P zM?!yVv)qB&au{A_#0^0O0m|<1Mlcs z3qcEyE#HXEw*@j5ZPSrHw|sdSYz%S}J2SS!#HZJB5UHAA!=_{zBmeoWy)}ZL*X8Tl z<$-(T7uCjxc^g4*z!ZuhjDH)rQ3v@O=`27G8d~){<{|$rTz_vyU!EjjZBaA1E%B zO2ImfJv}Uvql44=%+0v`EGKH&wP~X?bKy$Xqpqr-usE^D7}r3$-z>)P!o0|&r`>^y z;8UfyIUZs@VAQ_K0I%#O@$ zk?%uGXC`D5_EJ>iXtN^HWRp$--#8j_`xz~zKKmq)(ZsJ&ua<)~N(Dp;TX~hHX>?8` z0cQ`^vkwOaFF^l}chVqt^(^}f$yAX|> z&oCsP=akiC6}zUz_r{fEVdgF}`zm|s&zwuWuD=?fe+T}p!~OSA{I4tde-hjhy4<~Z zebZKs_T|^B_o*+38{os=rI2Qa#c#>77c7h*9)&*p zrXPhe8#sX4G8-jxZzF01%nxpijDS~kRAvWoS%?A@=V z{tW+j6>Ok(N|_#uvd;KWN{Q%?pC70{{8>J~V*gupD?ZN#HNavX?jl`BAwI9H$+n|- zwnFGA{<_BjcWA_v@r?B4qo$f%0vn&HcTzLDgX~^G+7c;mz|XP}xr38GZNTU{?Dk*7w zHWRf?uGnVc+AT9U*Ypj18mF&f=41`SOIHkKmEID-eVy&C;n^y7xc}EZFq1ZhAH9#Zs`{2TfZ_UPolh3@)jeE=#gJLU zJ%Fa>K6oc(S?SAjlfLA2KdGXUR|U^Amk$LnQ*4QR0}^lWc*nl}T%z#LX?Ep`fr^Nd zq++P;Sw_BKufWj?ID90Jmu_r)fE`dEf*+YTVoqtfu%Daf-b^GlQvXC=m6VDbAbFB3Dk3}&&sz{1PIe{0pbPO7^~kCRt_eywtSZe-KQiTX@7JncG`6tZ zb&Ovm#dL|WBz2N>d}Bz(A*x$B)AD^ujde-P!j9qoB!6rj4r``iZ-PL2O!b=R7k|5S zUIh{}w5$b@T<+Bqh8|MzgkFmc=E^+r)KY^6@nq&}IkP z)p$jrG0qJek$~j@g}LjwXMse<#s zY&OvW`sdKy;+J15W7Y^6Ss;`;g2Ls6VRF+cm{?!SxLKN$BcW%bJla0MAboejA_fVV z<*>2G!gy4;sb1r#$WtEh=Pg4jQrDh}R;!FtYfu01Ajr#Wv0sto+TWp@K+W6f55mqUHyCD?u+B<&BS`weI;Iv zq>FE_bj)54UX-!qbZt_S>$QS#AlpMvszZkT`x_!~v067N0roMLAP-&R;$AkcHay+_ zh{+bry3Y@7UlTk!cs3u~ogrjJ$W#X21Dkj_0+ZWo8d6W90Sj{WV5zj{r}f+P4Dr`F z6KRt;ZvLS>^qhNNiPL_2@BWW$F#EL->Hm<=zx(yK>~_tMrneV{t-jPmr^~?tyJ=GG zK&tW$Co}m}ZXX*o!4@AU-lH$NH>@vbHYLSJwl{XJW1=upz485tWxh;HX~)w~?Fsj} z`j)LBP4)S1+>!67wewkY_Jm<4E@f-maXNe}*Y2nJ2e&AEBPR;qe_~y>w$-Ka5B$%6 z;`?|}GzMHv%GSm&*vGf0S?>j?n5<}2Z_@ND=LhjlyGf;M+1|h4bnB9AjLj#=3b;$x z!uql58?PS3j6U5p|1`jc)Qsu;_A2)!-<8j&FOBl)Y8>U$5b=*HSj?TD*a-@iFY1QvPsN z%DwN|9q&<8H9qp+-UStx265I+Jlu6TRFiCsQ@@&8{kF+LgJN}$P~=^Jy6Gfpb@i&f z--@_O5j^ln!m3Q_%l(@R(H2m?A-uzj<;eYbEROWH^P({4Q{WHvgKgCPkQLT|pIDzQ zq|%MP-oFsPYDe8V4r00b{@1-i`5?{~&4;^wM<{v4LDzJSF2-d?t^z4t%Wea|pikdz z+()tI22HvBVLj0(u@+&<@^h{A{{FoUd=%cRS@-sb;RH(NreE*xKi*(K;R2cnZhxpv z@JXecl|MY2$A_U98+d3{arOQE2Q(DJ0cG6O-JcHWQ8E+uBiHyiB}p9~cqD%RAJ3;= zCCWpx5zN^$b#$H|(Sv#t_a`3Cv%$vloP;xxAA^c1q#W)>$PCcyEuy-_mtEWf0{^-v ze@^ysq>tg9A6jef)F}Lxckbx?jqKjti0T{o{e8-fAPph%&XzYHKXZ`Oo$+J_kzfVU zxLmLJhlC2!5!!UKp8|^>40{VYgJT<<%YC=e!JpD4efalI#e(;x1DR4g@Tsg{o+cpa zm=cj5O1b0uUm6xaXbiHb8`BSr8fH7XVeNWUb(%sj11kXseeOaU`JnD+;XPZvB@A+P zk)IV-P7db|lIeqA$3m*pq%$_R6ggkBy+xqfq}d<46REGlentwW*=B8c(*=H)BjgzK zG19AF_(?8ZSmSe52IJ=)8=k@Kh(}BnrWiqoEWS z)t}GEF+>Mso2-kXk(7Ba1MS5XPe?PS4u|3pLT*u~etr?d%^J(JU*%oz$WM`9=5_*G zzK&ex=n|A}2mn5((winNij}bo<#C-#cGd05OV^kr^^4-069@Zj6DbA|4P2D5j=Smv z?B8j6$!H?PS)wh66TaPFFYZE&5nNH|=$>pvv9BMwWBAJ`C$8gflsw(QEN0A$y03Qn zDt4d^D)N}k4k^$yF0YV;IEJcRWkllS8;}1EZa%6=5@)iPL9uh5J9V z5k?>`br&;kjAlq~+$^nOYVez$;7sC8ujPBs9J zx+#c_lb|ZbS1+xp!_4uCkLXKp!1gwniE!&l0t6nEd?ww`&+#g{4QVp7_%%;xWoG?Ht4}p~w_2TQnto`22 z50jY67JO4Djq_5Z!kab%iZkob?E?2x0=M+K72QdVD zf}&8x0hR&ydbNQ?N8b(j2AcvQ+v|O&LC*TFA~`hZl z6bwhJW)+HkO)Z&E+2Vi7Q=fJey?|dFXS;y}^k_BX2i{ zD&~y|NR8q&0BAdy3strTvli~LIx4ZYoO9q%LsVit#FyW2>!H+bST*3|$kN6qiRc{5 z3grJo-djh-v3>i4+>k)<1otGkyK92GH12_>@y1;fG&nS_3DS7u)>wix)<}X&- z!rA!b?t!v(`F?z)0=uC+kw6NicWL)0#^;Ufkk4bN^9#8y=Y%B+uc+x6Gh)km;*v9e@$d8Ba(UBp6Dq3Cq`I*pR=26a#4HO$UO#q1Fb9f zg$L2MzbuaF`n4MNLf$$>TG1!C z+}bYqhG^0xNzC`Q?elBiyWa#zkv}m6-99hhV1)jfI2&pk@5-01yZcQ#X84yp3@w*- zxY=3WT`8o?`u&i&iww(Y`*?)5q=nWCcH!zr$ceT@r3r@afR1;8b7xa+DGF{pBL~*SpYP;amM~d3OHBYuCRLoBy&7T=mEPi)3!8WxBpX zbPvp|)U@5^IX|rR{jo2ajOIU&*pLic+b>&MKK>IUpcQTOOZw9GtL5EETBeh`-{#8) z=x!02{Ht4LKEJ>VUhIt2M59y_l!?;2>;z8@tt93~4CB8jf3VY{R;}*CW7U8gc%T@z~rxk+%39W*pIit*4W zTeKZ>))QwPF}j(|W^Wd&kyzSiJu2lnklU^j$id8HnBbKhJ);PD+*JT}3 z>{v||4FAw?7D7Guq~yO_ot?k$RsF|K?ElL@1{fHa26hQRLZtuYCa2&)d$lNwcA&VB zAN_80Ya3VKo_IWa!#Q!o`kt}t8}8^UID^RL@Q#W#MAUy2;u7HKWZF%IGltt1JpKE0 zQoMxUKKRoQs4>A(5NvEIdnN9WQQ9q9C}g0vF~Gc^4X%db(d+lr8e)a;_`C%rr_#d_ znDTPiEv~o)wE4?CHUw{*BImy4@Xl67XpJ~X1=y8LiD`+le~w-a_V!F|{Zc~oJXn7y z-4nkp&O3`o+nApYf?a+XIJT2A>gJN(PII_+PL1pjVNZxa-z(ze>}DVLy8d0saak~?p&&a zkwi{DfGv6CiN~{SB_KdlA@+!A?$^rYFiEryf*`|Kq2l7Hjpl1rEvTlSxPF?FrD_N)F?ETIhCAJ zKF^yjT@qzgoR`qw5rkc6-)RsxXFY}_nlo0vz;}LBY?ghV$AcRs(K4(%Mh~6TqKu$v zvQ-rdmv>ny6pXX4B|1|sA%3&HU_JgwSO~|lQX+Sw;>pC>*b7ehu+O_|p^0pwCn}rY zPu%B9)lLkH<&$3CGBft7zc?LHCuF+!!Gb7}N(1#nh3Vb$BoQ?>Hpy7)<6~x|_k$B3 z%>@d{5CQ$9=7gjP;dtF^{-o6F}l*7XuuEE#-4 z^4nq~UbpiW*{8_J3_V5#PT?(Jp<$Oy%Jwfa9^(jR0gl>%a~3hr_($mU&`J$Z$#O#- z!~!CS;YwK3^4gcty3wxhBi)z;b7rGU56f9vZ~-vVyRwG&gBB$y5DaFANmtCSB`?iV zqS>oLT3Qcq*@V(q2}2nvCl#4~DJHcUsoAR99#5p+N~Q+zG|nP%eexST z$Ww&*tahkO2Sz?l*~ALh4A*E>ER?4FEGxAnR%UfSuqqS_bC${4#?N(mK25MvnUsbT zEovZGRExYEnWDb>If(rf|(FCde^odue z^L1I6P|33;=Z>5p-xb+jq*hIBB%PzwGD_UKp_R!WB#a#tc2HR$(h{oQOfC8=lz7OM5^+`01aZxbf{EE0iU z=F=j}E}tnqKu%unDjkNwURVlqqfTp^M}vw_4MLz#^56Xj1KADlChQme_~d5YV4L*L z)8B{woCZ7zZ+*+@A`8=uoL`VOT2}zQwk&yuU=vTR%IgS{m?@)dGO9QE21ZH5ie>D~ zrtoqJiJ(2y=EOpxQOHNal%h1teB)R}aG_*iV~!>yxZ@}g!o`l@#LGzhLEUiZW59iC zko+dk1jjVJc_y_wRh%TKsMqz=|F0Gm{&$Z&1IDcOAw-PuM$1!fef@Gp1a~!Jv2+gV zVg5yBE(N1}&~|7dShfB@lF8=AhPsMpVL#?^v}z*HrKPE1@tsP?d+{&-Tibth^v~78 ze?tEE_Wu(YXc<~R^ln5s{27TwB-% z_`PVhPpDaA@Eh`fZ=TbbLu@=rVrTU#RZ1AaC3790vy`)hGOX~CX6L?aAcn*Ntar=} zFunhMr2Y@-_fp7*G5-8p{5}N)>032u3w72AV`mVFgpV7K!y?sG;qLb$4u@v}IV571ejc_4<{zZj_hl6U9)63B4{pJ9q+#5t3 z*xJ67gS>doo5ZdP$lrNt#;ac%p3Ky**4pm^>kS93987VCg}KJ<6%5U~Fthms6;kTg$i|$HUmoa6vS>LyF(L*()d8vZq!Z{}8n>H-OpT*C z)@c)c{=_i;BC15P!Y#gNzh~SE2WK|h-%65LyrAF8)|T8vRozb@4VW29`l}U)_3zhL z=M7>~AW68>5J;64TO8enM&oE?)*s;o=^nYkamhp?ZDC0yw`v;2EZiz4Mrly_yi%+l&9dwmVA#L$LCX;l zc*IuND!iLNHzWqxVtX<|m(i(Oa;(OYO#i<`WyJ!bqNe8tsUp8;RrwQq$#wtr6BAfCmF zgRDTw`jn{0rgqv?bk1aPZ)0`^aUVuoq05$Ori>+H=~vHmZ0C2g!8H=+X0bDzinm}! zjs4U!hIiRp+=f;@88|inrq?i^S*3j9*1{I*&|)B{tsJW_S*92<(QPMoY+Vdcq>YuE zn#r`zq_ns)3GiJBDKqhDhVitv5FV`@Wy&P&QC$1BD&1*tAA)Mz!&sw~;x70zPr-TePbJk; zZK+0C;L9I+OP61<1COteFOfyGL(0fCkt---k&@q<4UMXYDBPR!U$#);;zD1p+rG%61c5_T=mJHl6QuuTG# ziNTqax|tSeh8mw1C}y`mL>V|7>lqdb0=fb`9H;C2z2z1@Tw;?t?mSb2mZ!War+$M? zYhp;{bDgeQW(IcQxvQX${(sHBES|#NPxzT5_Gx1IEaIM#Ke)rPRC2alvN%k@*QJ`y z)uRI{PDKXL98XV&5Dl5BllE#?Xq(}C%xi6N2VeQwgl@V?;$%yFtl#vOy^y)}1R%t> z!BA4oSubx22Nl(3zHSnGKt09kMI5UU#xP<^wOCS@z;6B_KnqUwlAYC!rv8FOc|G|s zB6dD5l*MtbyTHfrF0<&@&nhv@ok!I&5-1g zP7dxOM?b)v1XeBWOhJgyT~w#Q?CLJVX&O`;q`o#uVjQGpD^cH>%1`Ee6-P!BY&S1G z8#dfn=3QHz>}RP)*&LZko}M)I1P4bc$}}Fc*Y-<|#URq7d|Qb8yO!hz5l%L7AE4Sa z&Vz$73zV$bOx`-+>;mStNc^d6Q?0|nCAolqiXAqzq`Z-H{;CTRt9s+%nTQUf+g5ZZ~B&tWpBgNIx zhtUG1>}lK@IGmrsw^jR;*n)96J?F3YNZC?2^y@{`j1Qc$F3n~I%Ql40{8(JQ7axyD zM9q`WANj?8d0rx($`fN;S+1Lr!!!3wNkf0|5|T^P)pMIN$2Oq>qsUY60QR{a@4Czq zRL)YG+{GsQktj9xGtEMm$#>61sJ>D#Ni7?$^lg|sN4g?gfZZN!9rKZr{S_g*iilVu3DB_@AVqI2MVQ>LvG6Ab z|A0TBpmqDm4l%fulAqaI5$$5F^;Cr3C7Ft^QE7*rGmXnQwn36Zh0*k}zPJD}^>A{k zjVHv!!TzSiM$po1leJ-*(cMlFw9=LMiqY)S4BJJ7Vo`%1r#D!lLFf?T)iVOOLvCv7 zC>tz>DsLru#MCfDnCe77OKmBYawF50HZ#8rw(U{v&(w-WZ)H2Z7^3!Lh(0Fo8Q%M` zM)N0zf|WGT0dYDO4M<4iNvInk?;beuv$lJ=_jK$tUA2UF{u1e4;)>KK8z0dpqfTZb zO}U1KVZGQM)Flu$)9AK7QIG5R_xuOn>evD4yM0^1Dzq+fynbBU!Yx6AlFoqpCCD8> zyjCr0u+IQ{%$H?)lGj}_efLGBc3-&jhH#pV?ZaqgtHPOPt?Wo`j=+hz{MKhZS2H9- zy??ouOw8g-zvymQZDDPW6su;tp!CP-Nu7JH(?O$O>Gy1Wdl9zZ_L6NUsD}&n7yE+S zr2F+R4dtr=ztsk<~h%SV>+>RYu)O55iq^kE2mPbJp5OVJX`(euGQ zZnf_Vhf&sc%*Ln|c03aH#&bfJesISU*5dGO^0STMKGjx>(d;#{exr6qM|tkyiw^_z zd@ZvG4(Rw%?2FRlM6jAU1%q6RjgUfhw_19|EZfV@Q7xYe`xvWM0h(H_SmP-+koT5f5J+Bk@=+)(w=xWc*RSg^$si!|$CXtEN4RPa1>n|lrW%u21nlUt>@^!a{DB0#c ziOt@Aem$3=ROAB+w)4tj_H^`hF@J-u<(*Zg)j(XViDq-1;JIU?ar@7jpIr^~Ign%v zRE-qup&E-Tu`SkR(2Q%0WPDX&t+f*f$x9AoVYoR4n($yT8k;g2nJUKBsg?Ed2y7BS z-`Cknek*ODxE?O8^YF3ZXHSq4A1ZCAB<$T(GP=3Ah2@+*{y;xXVoq@eeoMl(KM~?|(+0wbGffi0H1X6B;$)yYD%FYnR z<}gI4;|F1bCn^p%V{tWI7FPlm40IWE*fPp`7t3jOGM+~sw^g#&+~V-DbKWMD!YN~| z9SA&IgyVTt$_B2fJg}y|%z7R(cZr?d_b4Xsp(~h{e$6?2b34k(9jV@0_jqvUEI?9V z+RS1L!Ztm2MuKF#(2K?XmNR^}_1%n0y5ycG_};1ynIBIp}zD4AX#3<&-RQQqS9qw3dsqTx}y0jax9CE@NYbC4{laDR&8$ z3v?HE(4{wLn>sG)M~g~ZDzeIY;b=dg&-G8T>e$n7U-40){jlw#oZB@ssr7|6^j+;- zF|{A0RuoxR?%ZqKxB-8dXW~e2;*{#d4)EVDaq>kYuR1XYp&qJ|k1m$hfDq$@u}hLp zk_*mU1MZ2j;}28qB6S*p!m%Sds!>Zcdwhq6JqKg_b&U4tLGjd8I@sSWSzuC-P%Cmv z4A^v@&12oDa86BY3Y zw0Sq}`-5JnZP%-wJkw-|)OwXX@y#Ss#HwY1UYIjZb%COA?v55RWNBYfu<$X*e5%sb z*WOzxqqijx_^n1uEnI`=>*{R~dVH~Zr76xSy_X;u$&b8i^1?&cg5?E0RT7Spmgy1^ z>lPAd9xZcAsL|q?NEj!a7#|;=&u{Pon#KJb$ju;5Q~T@L+AVk4hZ7SxFaGvhF!=iO zsA{L;)Yo}%5oB(`I1-QJpvR#72=Y09xL{^??@^wXR|C6qf?VT38;vJAN;n1Blep5j zv+L*LNo*37K7%*&yuKjG?uX`Cy)S`OXl*h8ID{N7z|PURP{}w~Jc2UGmxsMSy60njBi@t<7yzJ*a<} z;?w2v*P577DIDai|5%z+0emT)+-rn-N)z|#uz7Oxs}rb{HecriU@gBjN2iheldkLE zOeg&7@V_qgnezj4KEowuoQo+#ybUlJc1uC=?D9Y|+uF6YBy$VuR%J5ZzPwEldBTU& zPZBRgjCe55afS)Dc~u#%>A2_t8$}M2XzrX1#otvTCzW9@mWEED&qy_kQD1 zbIA}g9`Y*L7F%rz+(((|)}3InG}k@Rf?QPDYo~@_BnP|*x5Aa`OtHH)Vs@B#mTjw% z#+9N~4j8g4k6*E!x;3jRhm+hDY)e5@lZXhB2JPH@jq1$^4*Z@>v#ISzW`~)D&h+a* zB@OW=F-wXZ{zzAqZ@kt~8qX_rMrT>9?E;boyGod;OYPDdx*>8`3x)eMUt1U<#Rs53 zZx|--tQLKTK?%~X)-Cb2Q{M_Kk3VZk-=SBEXQySF2fLYn zBDT#`^W83f{U{CqOJzvT?Uol1eWGs2BeM);hj-=WmCB-7lr0$oobVNd_WNEKr_ zEk>FUI%f*V#J{a{RT!SyyFJ|1|30{5grhJBIIO%l%DJo(fzsHGr?F>sQ{f3FZZG`S2|W zX~?{>YFtv!DB$2ghg!?6k1^_4Em!?q`#K&jR*a8m3BTN4L6LIz)& zkiY!K7FRz^X}q$xe+ zr#f&t+8y_H$}nA!IlJm9f82gPZJb2j89goe1a7Q8xhDse>a;@J=}R_e|^j;2_t|9KyBCVn-*I^~md z`IQiFyNq%hN(0VnHD82pe^AG-;^}_{bn>>b53+UeQ7EEOF9FglBRQC1JFGedMT;ZN zP237_U94#CT8TI1OYe#e>kKbTaM#JwicR%2GB;~N=%Qh1EY{rtHIeX>A>PFc`YH8zqOocwP7EX&Oe`Kr(&10MV$poOA zrhwQs9z!1`^K;{iJ3RF~JWeDDXD;J6LAY>(v{d6uV-x^5E!Zh8LKaeC#QyRtq6Mk! zeWGJ9YJ`3ttfd}rh-u9wS#HFg9eUDkFewe&^yfbB;<1;@G2I3awev_b$WOq`edWAH1kK#?cRI^1G2UEJnduir_j{(QPzaKo|P`K!`HEoA+PJN^6Gp7 zL;dt&-+my#gn<1`7+`jn4N!Wafuo(}(`4a`^=u^JVgj=d-bOQMk!Mxn|0f2|=CFur zr1F|cF6{!0z=~I##xvz)2OX-`bb^5ABn61<1LP!n&u#>K2 z+;yPI(d-1(SD3~Ua z2(XIx6ixd{PsZAH@@F<_9!8AgvodQCPh>*_ zI2qTt6PQwjSV1pusfRLP<+JNw8wwe3LSL1e6MvX*FL9b@@<-Ged6a^}UygO3Yo@TM z3ZhGCn2P0t8~E!40@Bar%$kZt(%Fgpg8e;3QmTf`GOMu7{@25Ft&FIFd5)HylF z4f>V+k=%Si#XGd{dfIZ?*0iHD5Cp4DR@;3t%9r$dWb|WQ7sFhIohx0Mq51hnx0Dv> zW?n}47;9dM>fyx*PbJVK6*5+dC8mG{frn}YI-AWTJ441T z^*Y2C+RMqKX)o#6p(luBvCc!+66+$h z1Da4$IWMZ9lA^|&z%F~X#1UxkCE1}sFPxpxw$9m|r^tmoKz|{T_JZqBY5vuM)n=Z%zVjj#KXahtMetrY8eSOg%!d&`D!kW|beBBGG(3UuBbjq( z=X!=4-f8rcz8kQ2tb_vONp>}P@7ZSC%m;k2ZT3P^1>;;oFRc$d90V$A%ah#vF$Do4 ziym!r>+|Pyfg%^Cl)~|*$glp^R^Ejp@2w!u~)vp7+d4V05>u_A7@wd ziKX3H`ZOVUv#6M;kT_hp$TXFT10X8KBbVPd&8egNer6NqF<(Pm^uvFeud9&kWQYgDPz;8c>RQ@W)k zaJNt6#k7$iom0YQ9S}hZG=~wocq*MQlZ@~gckK(Tp036^dt&Qz2}HLkH7BWfz;qJ*M*J@m<^76oe9Sp;hM(Sq!Eg)Ufj`DBJ z29=ehJmq=Q1Y!S4+s6`P8tAR#%OgQ!W=Wpu+zi`Vjto@P&#CedQ*e=#B2KS3UmQVT zo+@VwvtgwGGpMvh4nSJL6oJRJ#oaFEKaI7a!IJ}!l8iZXWmRd0kkqIr^51Jc%`x>Z zXV=M&Qc%pLj?+=|n&XrTPi(!z6$hlLw=PeL97GiP&S`?fe7r(J=DX;BUj1BeS=`xK zCi#+YVNqbNpWV>Z)!5?SnBTp$)s*7Efziz(be|mtP0&gXHpcn)I4CGOq~OK z+0HKtww;^5HWHm*3FnI?+=cwVD6a~|dNcpt)~ z59I(oVXdDcsgw$@t1n4tT|Zb~NG9F9LyZk)57BRRuEJD-_4A{cQysTcpl_Jh9PO#Vy>q<{^z4XhcupdJlJt;Y zw<%;OZ~bdKO6}U2X1{Ek9FF?3v}SNsT!rvab*jo!nAI;Uof<84Q{fjau$#LjX-d0~ zu&R$gI2hg0awF0fE5q77Jlt+SnBn&D^f2uUL?AQS`1)r#(N6^_UC3@O=z7Ixmf$_# z(5Y19sJ?3m&W8!c(kiX?OsYt5uEr=}CW>0kAWFEK!8Ec(HC87;b;ekcfT<*rtMjNC z`NQ3(-bFL+EG9h!>`^8=RA_wW#`!BcdWgYN|4f!(GgS8+(>W~JzdV8M%#G@_2eZFm zy@Q_oA;qSSda)M53O!fFdem13VKo>M?~s+U85Yc&PJ=`^c^q@DkT=l7ZMKqNn&PGr zV>;F?m03AHv%8p5*}xlmIS_}aOyq$5^C<&Xb9MYak#QCfyOUfZGe=+UYAUy!Y3V?P zROvn!Lo`HpFw^2{3G}m_v+YAD3&Ou&p_O88o*H-`u#;^1@&7bd3i0?%mhJYBmd`_7 zdV{3?Z3#D4e{4*gS`gudsc@sGHvdUX_xGvK|I&2{uoJJ0L0ROWR&)ud70{Ix_+KTU zz#Yr54m3kIy8IKGp4%`3>Z~@M@!IH0dZVuPM%muESz^EZrE^JX%Fqr~7VgFmaouj` zNmneVsA|Yh+t_hzJ+*iPZ-(7!!@o(B>p zdIJ7toZ2RfNY^f2@ZxB;Q=-I+Z~PO(Y*A`LYU1ZSU9C#w*X5E$oWv--SzB%mfH!B} zv`QZJ{7m&IJHX(5@iX_|UPIS)_H(~iQ3WOlCvwZp$q4@UxgR0?-mld1xQe&4_g7%E zbV-G;i>nBm26eVRH2-L#M7Z&7fBj%<-8KCjMVDN^X47*({wK!6wG`LqY7J~_nT?#1 zfI8;Z-SM<}e1jIM0&?D@O@ja$;JW)^nRBU=Nd2DB!H;B%1-yRUN{MR&b)ycIxBgR1 z?Z3En<`hSa9pqJC&Hq+iCAad@el0t&W)U_!j6Z~Pdh~7F5t*EWG;i@DdW)aRJhZcg zea*#6sv1`^@pY>3C}knh`w@;IZLrr+Mm*aAv`w+w$TC0jXub!vlph%tEvAgW!ezvm zswP0lp5nroP$+aj;4a^0QYYGUn_&dMVLB^@?}2G05&@+1-z}Nmum-m%1es=^jd{@)=lo1FVQ${d zH_xC234JUxm3+Y-7(^Fn$kGyK0R_A-htl%5yJ&8^rQwtlSb#J3z_w0&gR zn*)wv9NKY@UnbclDTxM^Cpfd`SO*kpGq7Zhj3tU=zqDS&C-xIaf{c57Lo~$VCk{$n zkm`4^{hZsNv2208cDIv&MV03E3Qgb4sMZm^9ZBNNv|+Hxwoc-H^adR+Oi{T7c;N!2 z$yKpKvuVJ_*@_>=OM`djn%#ib9Ur~}0-_-coiB|?!BNhHIzy>rBOlgNpGqkfq;WLz zk4|*X9VL>G0t`IbgiACQB^E} z_TRq4|2+ODMaVz6y8hnC@t*yPW8>y^-G!G9!I!^ZeI$F71xn2N88+6vqVh#pv~jRG zPQOuD7a}8@1ZC-IIRXOY_fb)F*_Jj54UtuO-$yV!4CrI~Qz_Wu z7Cm;lp~5h^J|5%3>HK*!z)3x;*uSgyAHsjG!2LH5O#krk-xpvdeWCvGp(Tm(2S(r7 z|M9f`GYRMKP5xU`_Q}PvKBM!AauHFU9m&nlp&LW*@S|WEt2vX{7|Ubw9?w1= z$YM*Cat`8R5oArXpQn_FcbXT7+hSpV46huVK4gw{(swpsc^XsLKDB`_%0K_KQ|l?} zhnmYluC7g1IgVD;8Noo(vnzy0EPnV8S{YH{>1sMJ^Ms~F90g1McT=~XrE0T1X>Msb zS%&Xr`3e_pP!IP9wBd@r7E!$gwaK_McH`VAu%op&vwk`x5=~ex`q-wT|DZfd0=Yjp ze7t_CFe3~$`<@Un$t7~7{jtd=*g54qKUOez;Xyb;-TtIvQB@7PV-zQG!L#UNT z$D651Jra_%L8UPvb*M6ZtJDaW7EEA|>+ zvjvtUlhil1NrhkyD>W^L3cN{;RZzQ`lg(D=sP6;<65_1V^?)<`-zdWszK?b1);?WH z7i91uFp%A3t;s&%(smF36T{YJo_X_tkz!j(<3*`iLj&yVa#_Mm3L@>Zx;s|)cDv`3 zI*pdpvqKd`%(vRJ*i}RZ^d^5|c;94ICNtd%{ygEn znZNsh<(7RRCI3XBCU-pNynk6dDVFL;IfhTfbDo3*{Ug!;I2jLzij2)c8E~vz?Wq@bmf|jz7c_*&s)1e$2NeEvL_)D4?>9~eRnPowo zBG#n;3DuZxg@n+rujeMKa@};p^W`0JfkuW%d0odk;zYYu_$~t2MZU$xe_>Wuim*z~ zXl-n2+cy5yqIIMRcYbajt#G=*J3x5Owq3}zC}g-gb$cl0`#W)E8 zGm?IxCQyZ^H4E;WvsgiZ7t0O2gm{I3ZJ2E7dk)1HQl(#h0AMm#ROuGO>BJRM>7~1* zr3>5L85xJoF=b}@^emP9dymuqCwz2hO?OZa!GB@>l$UIdyz(tTdNaR&*Q_klL%kMh znvpp%svfsHcwv!$!txN10p8P2|Dt$G7gV`_tNN`wX^pm{LyHJtmk+MX zE4$aPLw_5Jk4xRZYX3Yv`6tF#@{alO>rRkWS_<~8ZC+3p16slOueFx*&*MwWU8^TA ziK>u7?g^E&j~Mwe0=%w{B5VIU)~DFubT4{zsO{Y zU%{yQkg&X_%fBR(ev##9$#OjmEiu6O1tb3G7x|fDKX|ErCoHeA1x*)bTDp3IQ^@=C zwsDi=PYh984$SNQ7FFq0l6)PJ}-FIW(o`mIPRG|e4*Z!7gXhE-VSYEmlT5xcD`epOCb`B`x z!Bw*Yt^3Tav!4j<0|*Pv9nA1aHne&q^aS4(tr)^tci~C*MOLQz8~q7>5*o!6vH9Dk zeYE{`jv=d5!DtL={pv34h0#b`J-_P`{L68k-&VWhf8pHo>Du4nFJrV+t#*<7n1s38 zziV=jJvIHqyr=aj&qeYZ}vkXjPE9V`*gITabklf6{s)X!soAS7bw6L_s~g&Mq4eZb zAFG;6gx->l3i$8pAu`+nFhH4I3`F$G^&!+kfO)C67#@iu;7-;1o{lTy3%@ zLmJzbrk>hclGZ9o(P66XL%`F~GLEdkcVBZ~Hkrq5WK~QEc;BtxbqKVVnmz4nA)!6f z+vH5l+IFd(#(tY7jNYpu-}-$)iM=1UA!1vZYnUZA``H(dXz36(B=tRaLc`w6w*2Mr zbCSnixYk@z@ytOKP^u*97ya-(g6a|Yo~^(GHuAVpa_4mHbh5F@$jeuhVJkDX;776N z2yhzZ^d@e3X@g3FS0!GatCHdE?OmaB!5yP4D(_lkC9rlCl<7YxInI~K^9RlNK#zUd zce78f&-3*(^jawerEPDVNzYB<=ad@5uW@BMVXc5l1_YSkfQC%el%!n0u=Q>2OR-qj z7h|ck7q6VYWSd!t_)$-`TOTVEjtnwSi$$cLDacw|kBYKdJ9|I8ZDS-h*F|tC(TK~{ z_7g~b(DUF%8ekl4EG)XRZ87&i^4A8!WcvAgB&P_ZvO%=a)O?{dQel<1ledD>tt83l ztul_Y?Rc)T;e2_Hv0GF3wi|H*OQ7>7EY+jP`80ard?8#MS!~Q3sEYacrnyCX)MrKX zl)z}Y$M6#AZVrT2FfDcT<#5xtydM3QvBs^ZM?n_xfQi{5GoEgy99s)U$j>A-OtE(^ zW|mX#l8FOvZ(WVxi!%Hl8w6#*jzh!&gFjrDtf-h*!VA>`KMq>sT==>Mu+^wj2#+_I zZ84VQ)qrtaakNd-JKgyBKe!+{56!D%326{;CFzlT(cBReEH+V)NyDn5)>-PJbpR2+GUGQWzI&HLraU_%V}Cz*%rjw;PPHnF*NCsfy_Ep4pb+KK17z54GNiTZ)MZ&3=#1)lndL%Cs3~ql3wE=%&qvUk zF;(eo-}^yys$Y$mts9pa7L1kN1%0A)^ZZ$D#MFj_lDMQscro$X*uxogV=kf@`rA~Q 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¬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 literal 0 HcmV?d00001 -- 2.34.1 From 7999f852261161557b934130c6d1b3a3c9461836 Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Wed, 7 Jun 2023 23:06:18 +0800 Subject: [PATCH 19/20] 3 --- 分析类图2.png | Bin 0 -> 85985 bytes 用例顺序图2.jpeg | Bin 0 -> 115538 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 分析类图2.png create mode 100644 用例顺序图2.jpeg diff --git a/分析类图2.png b/分析类图2.png new file mode 100644 index 0000000000000000000000000000000000000000..736a855d067e1cae1651563821e68ee25a6c4dd6 GIT binary patch literal 85985 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

y9 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 A=l}o! literal 0 HcmV?d00001 diff --git a/用例顺序图2.jpeg b/用例顺序图2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..069a8edc0d776c62fbf2fabe9c0d64e8421b8788 GIT binary patch literal 115538 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

b2!(p}lY`U=& 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 literal 0 HcmV?d00001 -- 2.34.1 From 34104f762863b7beaccb66308c5d64d9dac84a2e Mon Sep 17 00:00:00 2001 From: pya6fcjek <1945594101@qq.com> Date: Sat, 17 Jun 2023 20:03:41 +0800 Subject: [PATCH 20/20] 3 --- 210340016刘定衢 实践总结报告.docx | Bin 0 -> 18750 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 210340016刘定衢 实践总结报告.docx diff --git a/210340016刘定衢 实践总结报告.docx b/210340016刘定衢 实践总结报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..0606ef0813e78e5a034d38d972820fb26fd8dce8 GIT binary patch literal 18750 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 UgWUiC+{erJqk$9){qfiT2T`>=y#N3J literal 0 HcmV?d00001 -- 2.34.1