Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
X
xposed-rimet
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
xposed-rimet
Commits
a03732f8
Commit
a03732f8
authored
Feb 18, 2020
by
Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
部分适配工作
parent
2dba5670
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
96 additions
and
70 deletions
+96
-70
build.gradle
app/build.gradle
+2
-22
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+19
-13
Main.java
app/src/main/java/com/sky/xposed/rimet/Main.java
+14
-2
M.java
app/src/main/java/com/sky/xposed/rimet/data/M.java
+4
-0
VersionManager.java
...c/main/java/com/sky/xposed/rimet/data/VersionManager.java
+9
-1
RimetConfig4731.java
...ava/com/sky/xposed/rimet/data/config/RimetConfig4731.java
+12
-10
PluginManager.java
.../main/java/com/sky/xposed/rimet/plugin/PluginManager.java
+7
-2
SettingsPlugin.java
...java/com/sky/xposed/rimet/plugin/main/SettingsPlugin.java
+27
-19
build.gradle
build.gradle
+2
-1
No files found.
app/build.gradle
View file @
a03732f8
...
...
@@ -24,7 +24,6 @@ android {
targetSdkVersion
27
versionCode
7
versionName
"1.1.5"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
ndk
{
abiFilters
"armeabi-v7a"
//, "arm64-v8a", "x86","arm64-v8a","x86_64"
}
...
...
@@ -44,11 +43,6 @@ android {
buildTypes
{
release
{
applicationVariants
.
all
{
variant
->
variant
.
outputs
.
all
{
outputFileName
=
"${project.name}_${variant.flavorName}_v${variant.versionName}.apk"
}
}
minifyEnabled
true
proguardFiles
getDefaultProguardFile
(
'proguard-android.txt'
),
'proguard-rules.pro'
signingConfig
signingConfigs
.
release
...
...
@@ -59,20 +53,6 @@ android {
}
}
flavorDimensions
"default"
productFlavors
{
all
{
flavor
->
resValue
'string'
,
'flavor'
,
flavor
.
name
}
demo
{
// 测试渠道
}
plugin
{
// 正式发布渠道
dimension
"default"
}
}
sourceSets
{
main
{
...
...
@@ -87,7 +67,7 @@ dependencies {
implementation
'com.squareup.picasso:picasso:2.71828'
implementation
'com.github.sky-wei:xposed-common:1.0.5'
implementation
'com.github.sky-wei:xposed-javax:1.1.6'
compileOnly
'
de.robv.android.xposed:api:82
'
compileOnly
'
com.virjar:ratel-api:1.1.0
'
compileOnly
'com.rover12421.AndroidHideApi:android:1.17'
demoImplementation
'org.apache.commons:commons-lang3:3.7'
compileOnly
'org.apache.commons:commons-lang3:3.7'
}
app/src/main/AndroidManifest.xml
View file @
a03732f8
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
package=
"com.sky.xposed.rimet"
>
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission
android:name=
"android.permission.ACCESS_WIFI_STATE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.READ_PHONE_STATE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.READ_PHONE_STATE"
/>
<uses-permission
android:name=
"android.permission.ACCESS_FINE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.ACCESS_COARSE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.CHANGE_WIFI_STATE"
/>
<uses-permission
android:name=
"android.permission.CHANGE_NETWORK_STATE"
/>
<application
android:name=
".App"
android:icon=
"@mipmap/ic_launcher"
android:label=
"@string/app_name"
android:
name=
".App
"
>
android:
allowBackup=
"true
"
>
<activity
android:name=
".ui.activity.MainActivity"
>
<intent-filter>
<action
android:name=
"android.intent.action.MAIN"
/>
<action
android:name=
"android.intent.action.VIEW"
/>
<category
android:name=
"android.intent.category.LAUNCHER"
/>
<category
android:name=
"de.robv.android.xposed.category.MODULE_SETTINGS"
/>
</intent-filter>
</activity>
<activity
android:name=
".ui.activity.MapActivity"
<activity
android:name=
".ui.activity.MapActivity"
android:label=
"选择位置"
>
<intent-filter>
<action
android:name=
"android.intent.action.MAIN"
/>
...
...
@@ -35,21 +38,24 @@
<meta-data
android:name=
"com.amap.api.v2.apikey"
android:value=
"949931e653928fc485a30726ed6d7063"
/>
<service
android:name=
"com.amap.api.location.APSService"
/>
android:value=
"949931e653928fc485a30726ed6d7063"
/>
<meta-data
android:name=
"xposedmodule"
android:value=
"true"
/>
android:value=
"true"
/>
<meta-data
android:name=
"xposeddescription"
android:value=
"钉钉工具"
/>
android:value=
"钉钉工具"
/>
<meta-data
android:name=
"for_ratel_apps"
android:value=
"com.alibaba.android.rimet"
/>
<meta-data
android:name=
"xposedminversion"
android:value=
"54"
/>
android:value=
"54"
/>
<service
android:name=
"com.amap.api.location.APSService"
/>
</application>
</manifest>
\ No newline at end of file
app/src/main/java/com/sky/xposed/rimet/Main.java
View file @
a03732f8
...
...
@@ -16,6 +16,7 @@
package
com
.
sky
.
xposed
.
rimet
;
import
android.app.Activity
;
import
android.app.ActivityThread
;
import
android.app.Application
;
import
android.content.Context
;
...
...
@@ -33,6 +34,8 @@ import com.sky.xposed.rimet.plugin.interfaces.XPluginManager;
import
com.sky.xposed.rimet.plugin.interfaces.XVersionManager
;
import
de.robv.android.xposed.IXposedHookLoadPackage
;
import
de.robv.android.xposed.XC_MethodHook
;
import
de.robv.android.xposed.XposedHelpers
;
import
de.robv.android.xposed.callbacks.XC_LoadPackage
;
/**
...
...
@@ -50,6 +53,7 @@ public class Main implements IXposedHookLoadPackage, MethodHook.ThrowableCallbac
final
String
packageName
=
lpParam
.
packageName
;
Alog
.
setDebug
(
true
);
if
(!
Constant
.
Rimet
.
PACKAGE_NAME
.
equals
(
packageName
))
return
;
// 获取版本管理对象
...
...
@@ -67,19 +71,20 @@ public class Main implements IXposedHookLoadPackage, MethodHook.ThrowableCallbac
// 获取支持的版本配置
XConfig
config
=
versionManager
.
getSupportConfig
();
Alog
.
i
(
"begin of hook application"
);
XposedUtil
.
findMethod
(
config
.
get
(
M
.
classz
.
class_dingtalkbase_multidexsupport_DDApplication
),
config
.
get
(
M
.
method
.
method_dingtalkbase_multidexsupport_DDApplication_onCreate
))
.
before
(
param
->
{
Alog
.
i
(
"enter :"
+
param
.
method
);
Application
application
=
(
Application
)
param
.
thisObject
;
Context
context
=
application
.
getApplicationContext
();
if
(
TextUtils
.
equals
(
config
.
get
(
M
.
classz
.
class_rimet_LauncherApplication
),
application
.
getClass
().
getName
()))
{
Alog
.
i
(
"enter pluginManager"
);
XPluginManager
pluginManager
=
new
PluginManager
.
Build
(
context
)
.
setLoadPackageParam
(
lpParam
)
...
...
@@ -90,5 +95,12 @@ public class Main implements IXposedHookLoadPackage, MethodHook.ThrowableCallbac
pluginManager
.
handleLoadPackage
();
}
});
XposedHelpers
.
findAndHookMethod
(
Activity
.
class
,
"onResume"
,
new
XC_MethodHook
()
{
@Override
protected
void
beforeHookedMethod
(
MethodHookParam
param
)
{
Alog
.
i
(
"enter activity:"
+
param
.
thisObject
.
getClass
().
getName
());
}
});
}
}
app/src/main/java/com/sky/xposed/rimet/data/M.java
View file @
a03732f8
...
...
@@ -52,6 +52,8 @@ public final class M {
public
static
final
int
class_android_user_settings_activity_NewSettingActivity
=
0x1f00000C
;
public
static
final
int
class_wukong_im_base_IMDatabase
=
0x1f00000D
;
public
static
final
int
class_android_user_settings_activity_UserSettingsActivity
=
0x1f00000E
;
}
public
static
final
class
method
{
...
...
@@ -91,6 +93,8 @@ public final class M {
public
static
final
int
method_wukong_im_message_MessageContentImpl_TextContentImpl_text
=
0x2f000011
;
public
static
final
int
method_wukong_im_message_MessageContentImpl_TextContentImpl_setText
=
0x2f000012
;
public
static
final
int
method_android_user_settings_activity_UserSettingsActivity_onCreate
=
0x2f00000C
;
}
public
static
final
class
field
{
...
...
app/src/main/java/com/sky/xposed/rimet/data/VersionManager.java
View file @
a03732f8
...
...
@@ -26,6 +26,7 @@ import com.sky.xposed.rimet.data.config.RimetConfig4617;
import
com.sky.xposed.rimet.data.config.RimetConfig4618
;
import
com.sky.xposed.rimet.data.config.RimetConfig4621
;
import
com.sky.xposed.rimet.data.config.RimetConfig4625
;
import
com.sky.xposed.rimet.data.config.RimetConfig4731
;
import
com.sky.xposed.rimet.plugin.interfaces.XConfig
;
import
com.sky.xposed.rimet.plugin.interfaces.XVersionManager
;
...
...
@@ -37,7 +38,7 @@ import java.util.Map;
/**
* Created by sky on 2018/9/24.
*
*
<p>
* Hook应用相关版本变量管理类
*/
public
class
VersionManager
implements
XVersionManager
{
...
...
@@ -51,6 +52,7 @@ public class VersionManager implements XVersionManager {
CONFIG_MAP
.
put
(
"4.6.20"
,
RimetConfig4618
.
class
);
CONFIG_MAP
.
put
(
"4.6.21"
,
RimetConfig4621
.
class
);
CONFIG_MAP
.
put
(
"4.6.25"
,
RimetConfig4625
.
class
);
CONFIG_MAP
.
put
(
"4.7.31"
,
RimetConfig4731
.
class
);
}
private
XConfig
mVersionConfig
;
...
...
@@ -71,6 +73,7 @@ public class VersionManager implements XVersionManager {
/**
* 获取当前版本名
*
* @return
*/
@Override
...
...
@@ -80,6 +83,7 @@ public class VersionManager implements XVersionManager {
/**
* 获取当前版本号
*
* @return
*/
@Override
...
...
@@ -89,6 +93,7 @@ public class VersionManager implements XVersionManager {
/**
* 判断Hook是否支持当前版本
*
* @return
*/
@Override
...
...
@@ -98,6 +103,7 @@ public class VersionManager implements XVersionManager {
/**
* 获取支持版本的配置信息,如果没有适配到返回Null
*
* @return
*/
@Override
...
...
@@ -115,6 +121,7 @@ public class VersionManager implements XVersionManager {
/**
* 判断Hook是否支持当前版本
*
* @return
*/
public
boolean
isSupportVersion
(
String
versionName
)
{
...
...
@@ -123,6 +130,7 @@ public class VersionManager implements XVersionManager {
/**
* 创建指定的配置类
*
* @param vClass
* @return
*/
...
...
app/src/main/java/com/sky/xposed/rimet/data/config/RimetConfig4731.java
View file @
a03732f8
...
...
@@ -21,7 +21,7 @@ import com.sky.xposed.rimet.data.M;
/**
* Created by sky on 2019/1/14.
*/
public
class
RimetConfig4
625
extends
RimetConfig
{
public
class
RimetConfig4
731
extends
RimetConfig
{
@Override
public
void
loadConfig
()
{
...
...
@@ -29,37 +29,39 @@ public class RimetConfig4625 extends RimetConfig {
/** Class */
add
(
M
.
classz
.
class_rimet_LauncherApplication
,
"com.alibaba.android.rimet.LauncherApplication"
);
add
(
M
.
classz
.
class_dingtalkbase_multidexsupport_DDApplication
,
"com.alibaba.android.dingtalkbase.multidexsupport.DDApplication"
);
add
(
M
.
classz
.
class_defpackage_MessageDs
,
"
ivh,jbk
"
);
// MessageDs
add
(
M
.
classz
.
class_defpackage_MessageDs
,
"
mlb
"
);
// MessageDs
add
(
M
.
classz
.
class_plugin_webwx_ui_ExtDeviceWXLoginUI
,
"com.tencent.mm.plugin.webwx.ui.ExtDeviceWXLoginUI"
);
add
(
M
.
classz
.
class_defpackage_ServiceFactory
,
"
jut,kaw
"
);
// ServiceFactory
add
(
M
.
classz
.
class_defpackage_ServiceFactory
,
"
nio
"
);
// ServiceFactory
add
(
M
.
classz
.
class_android_dingtalk_redpackets_idl_service_RedEnvelopPickIService
,
"com.alibaba.android.dingtalk.redpackets.idl.service.RedEnvelopPickIService"
);
add
(
M
.
classz
.
class_defpackage_RedPacketsRpc
,
"
cfe
"
);
// RedPacketsRpc
add
(
M
.
classz
.
class_defpackage_RedPacketsRpc_9
,
"
cfe
$9"
);
add
(
M
.
classz
.
class_defpackage_RedPacketsRpc
,
"
ded
"
);
// RedPacketsRpc
add
(
M
.
classz
.
class_defpackage_RedPacketsRpc_9
,
"
ded
$9"
);
add
(
M
.
classz
.
class_lightapp_runtime_LightAppRuntimeReverseInterfaceImpl
,
"com.alibaba.lightapp.runtime.LightAppRuntimeReverseInterfaceImpl"
);
add
(
M
.
classz
.
class_android_dingtalk_redpackets_activities_FestivalRedPacketsPickActivity
,
"com.alibaba.android.dingtalk.redpackets.activities.FestivalRedPacketsPickActivity"
);
add
(
M
.
classz
.
class_android_dingtalk_redpackets_activities_PickRedPacketsActivity
,
"com.alibaba.android.dingtalk.redpackets.activities.PickRedPacketsActivity"
);
add
(
M
.
classz
.
class_android_user_settings_activity_NewSettingActivity
,
"com.alibaba.android.user.settings.activity.NewSettingActivity"
);
add
(
M
.
classz
.
class_wukong_im_base_IMDatabase
,
"com.alibaba.wukong.im.base.IMDatabase"
);
add
(
M
.
classz
.
class_android_user_settings_activity_UserSettingsActivity
,
"com.alibaba.android.user.settings.activity.UserSettingsActivity"
);
/** Method */
add
(
M
.
method
.
method_dingtalkbase_multidexsupport_DDApplication_onCreate
,
"onCreate"
);
add
(
M
.
method
.
method_defpackage_MessageDs_handler
,
"a
,a
"
);
// INSERT,IGNORE,INSERT_FAIL
add
(
M
.
method
.
method_defpackage_MessageDs_handler
,
"a"
);
// INSERT,IGNORE,INSERT_FAIL
add
(
M
.
method
.
method_android_dingtalkim_base_model_typeValue
,
"typeValue"
);
add
(
M
.
method
.
method_wukong_im_message_MessageImpl_messageContent
,
"messageContent"
);
add
(
M
.
method
.
method_wukong_im_message_MessageContentImpl_contents
,
"contents"
);
add
(
M
.
method
.
method_defpackage_RedPacketsRpc_newInstance
,
"a"
);
add
(
M
.
method
.
method_defpackage_ServiceFactory_getService
,
"a
,a
"
);
add
(
M
.
method
.
method_defpackage_ServiceFactory_getService
,
"a"
);
add
(
M
.
method
.
method_android_dingtalk_redpackets_idl_service_RedEnvelopPickIService_pickRedEnvelopCluster
,
"pickRedEnvelopCluster"
);
add
(
M
.
method
.
method_lightapp_runtime_LightAppRuntimeReverseInterfaceImpl_initSecurityGuard
,
"initSecurityGuard"
);
add
(
M
.
method
.
method_android_dingtalk_redpackets_activities_FestivalRedPacketsPickActivity_initView
,
"a"
);
add
(
M
.
method
.
method_android_dingtalk_redpackets_activities_PickRedPacketsActivity_initView
,
"a"
);
add
(
M
.
method
.
method_android_user_settings_activity_NewSettingActivity_onCreate
,
"onCreate"
);
add
(
M
.
method
.
method_defpackage_MessageDs_recall
,
"a
,a
"
);
add
(
M
.
method
.
method_android_user_settings_activity_NewSettingActivity_onCreate
,
"onCreate
,onCreate
"
);
add
(
M
.
method
.
method_defpackage_MessageDs_recall
,
"a"
);
add
(
M
.
method
.
method_wukong_im_conversation_ConversationImpl_latestMessage
,
"latestMessage"
);
add
(
M
.
method
.
method_wukong_im_base_IMDatabase_getWritableDatabase
,
"getWritableDatabase"
);
add
(
M
.
method
.
method_defpackage_MessageDs_update
,
"a
,a
"
);
add
(
M
.
method
.
method_defpackage_MessageDs_update
,
"a"
);
add
(
M
.
method
.
method_wukong_im_message_MessageContentImpl_TextContentImpl_text
,
"text"
);
add
(
M
.
method
.
method_wukong_im_message_MessageContentImpl_TextContentImpl_setText
,
"setText"
);
add
(
M
.
method
.
method_android_user_settings_activity_UserSettingsActivity_onCreate
,
"onCreate"
);
/** Field */
add
(
M
.
field
.
field_android_dingtalkim_base_model_DingtalkMessage_msgDisplayType
,
"msgDisplayType"
);
...
...
app/src/main/java/com/sky/xposed/rimet/plugin/PluginManager.java
View file @
a03732f8
...
...
@@ -68,7 +68,7 @@ public class PluginManager implements XPluginManager {
mVersionManager
=
build
.
mXVersionManager
;
// 调试开关
Alog
.
setDebug
(
BuildConfig
.
DEBUG
);
Alog
.
setDebug
(
true
);
mHandler
=
new
PluginHandler
();
ToastUtil
.
getInstance
().
init
(
mContext
);
...
...
@@ -99,7 +99,9 @@ public class PluginManager implements XPluginManager {
for
(
int
i
=
0
;
i
<
mXPlugins
.
size
();
i
++)
{
// 开始处理
handleLoadPackage
(
mXPlugins
.
get
(
mXPlugins
.
keyAt
(
i
)));
XPlugin
xPlugin
=
mXPlugins
.
get
(
mXPlugins
.
keyAt
(
i
));
Alog
.
i
(
"log plugin:"
+
xPlugin
.
getInfo
().
getName
());
handleLoadPackage
(
xPlugin
);
}
}
...
...
@@ -151,6 +153,7 @@ public class PluginManager implements XPluginManager {
/**
* 获取所有插件
*
* @return
*/
@Override
...
...
@@ -202,6 +205,7 @@ public class PluginManager implements XPluginManager {
/**
* 开始处理需要Hook的插件
*
* @param xPlugin
*/
private
void
handleLoadPackage
(
XPlugin
xPlugin
)
{
...
...
@@ -236,6 +240,7 @@ public class PluginManager implements XPluginManager {
/**
* 添加到插件到列表中
*
* @param xPlugin
*/
private
void
addPlugin
(
XPlugin
xPlugin
)
{
...
...
app/src/main/java/com/sky/xposed/rimet/plugin/main/SettingsPlugin.java
View file @
a03732f8
...
...
@@ -22,7 +22,9 @@ import android.view.View;
import
android.view.ViewGroup
;
import
com.sky.xposed.common.ui.view.SimpleItemView
;
import
com.sky.xposed.common.util.Alog
;
import
com.sky.xposed.common.util.ResourceUtil
;
import
com.sky.xposed.javax.MethodHook
;
import
com.sky.xposed.rimet.BuildConfig
;
import
com.sky.xposed.rimet.Constant
;
import
com.sky.xposed.rimet.data.M
;
...
...
@@ -47,29 +49,35 @@ public class SettingsPlugin extends BasePlugin {
@Override
public
void
onHandleLoadPackage
()
{
MethodHook
.
AfterCallback
afterCallback
=
param
->
{
Alog
.
i
(
"进入钉钉用户设置页面.."
);
final
Activity
activity
=
(
Activity
)
param
.
thisObject
;
View
view
=
activity
.
findViewById
(
ResourceUtil
.
getId
(
activity
,
getXString
(
M
.
res
.
res_setting_msg_notice
)));
ViewGroup
viewGroup
=
(
ViewGroup
)
view
.
getParent
();
final
int
index
=
viewGroup
.
indexOfChild
(
view
);
SimpleItemView
viewDing
=
new
SimpleItemView
(
activity
);
viewDing
.
getNameView
().
setTextSize
(
17
);
viewDing
.
setName
(
Constant
.
Name
.
TITLE
);
viewDing
.
setExtend
(
"v"
+
BuildConfig
.
VERSION_NAME
);
viewDing
.
setOnClickListener
(
v
->
{
// 打开设置
openSettings
(
activity
);
});
viewGroup
.
addView
(
viewDing
,
index
);
};
findMethod
(
M
.
classz
.
class_android_user_settings_activity_NewSettingActivity
,
M
.
method
.
method_android_user_settings_activity_NewSettingActivity_onCreate
,
Bundle
.
class
)
.
after
(
param
->
{
final
Activity
activity
=
(
Activity
)
param
.
thisObject
;
View
view
=
activity
.
findViewById
(
ResourceUtil
.
getId
(
activity
,
getXString
(
M
.
res
.
res_setting_msg_notice
)));
ViewGroup
viewGroup
=
(
ViewGroup
)
view
.
getParent
();
final
int
index
=
viewGroup
.
indexOfChild
(
view
);
SimpleItemView
viewDing
=
new
SimpleItemView
(
activity
);
viewDing
.
getNameView
().
setTextSize
(
17
);
viewDing
.
setName
(
Constant
.
Name
.
TITLE
);
viewDing
.
setExtend
(
"v"
+
BuildConfig
.
VERSION_NAME
);
viewDing
.
setOnClickListener
(
v
->
{
// 打开设置
openSettings
(
activity
);
});
viewGroup
.
addView
(
viewDing
,
index
);
});
.
after
(
afterCallback
);
findMethod
(
M
.
classz
.
class_android_user_settings_activity_UserSettingsActivity
,
M
.
method
.
method_android_user_settings_activity_UserSettingsActivity_onCreate
,
Bundle
.
class
)
.
after
(
afterCallback
);
}
@Override
...
...
build.gradle
View file @
a03732f8
...
...
@@ -42,9 +42,10 @@ buildscript {
name
"contralSnapshot"
url
"https://oss.sonatype.org/content/repositories/snapshots/"
}
google
()
}
dependencies
{
classpath
'com.android.tools.build:gradle:3.
4.1
'
classpath
'com.android.tools.build:gradle:3.
5.0
'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment