Commit 960d2433 authored by pengjun's avatar pengjun

#627 add chain33cfg

parent 47977460
...@@ -49,11 +49,17 @@ func addCollateralizeCreateFlags(cmd *cobra.Command) { ...@@ -49,11 +49,17 @@ func addCollateralizeCreateFlags(cmd *cobra.Command) {
} }
func CollateralizeCreate(cmd *cobra.Command, args []string) { func CollateralizeCreate(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
balance, _ := cmd.Flags().GetUint64("balance") balance, _ := cmd.Flags().GetUint64("balance")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.CollateralizeX), Execer: cfg.ExecName(pkt.CollateralizeX),
ActionName: "CollateralizeCreate", ActionName: "CollateralizeCreate",
Payload: []byte(fmt.Sprintf("{\"totalBalance\":%d}", balance)), Payload: []byte(fmt.Sprintf("{\"totalBalance\":%d}", balance)),
} }
...@@ -82,12 +88,18 @@ func addCollateralizeBorrowFlags(cmd *cobra.Command) { ...@@ -82,12 +88,18 @@ func addCollateralizeBorrowFlags(cmd *cobra.Command) {
} }
func CollateralizeBorrow(cmd *cobra.Command, args []string) { func CollateralizeBorrow(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
collateralizeID, _ := cmd.Flags().GetString("collateralizeID") collateralizeID, _ := cmd.Flags().GetString("collateralizeID")
value, _ := cmd.Flags().GetUint64("value") value, _ := cmd.Flags().GetUint64("value")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.CollateralizeX), Execer: cfg.ExecName(pkt.CollateralizeX),
ActionName: "CollateralizeBorrow", ActionName: "CollateralizeBorrow",
Payload: []byte(fmt.Sprintf("{\"collateralizeID\":\"%s\",\"value\":%d}", collateralizeID, value)), Payload: []byte(fmt.Sprintf("{\"collateralizeID\":\"%s\",\"value\":%d}", collateralizeID, value)),
} }
...@@ -118,13 +130,19 @@ func addCollateralizeAppendFlags(cmd *cobra.Command) { ...@@ -118,13 +130,19 @@ func addCollateralizeAppendFlags(cmd *cobra.Command) {
} }
func CollateralizeAppend(cmd *cobra.Command, args []string) { func CollateralizeAppend(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
collateralizeID, _ := cmd.Flags().GetString("collateralizeID") collateralizeID, _ := cmd.Flags().GetString("collateralizeID")
recordID, _ := cmd.Flags().GetString("recordID") recordID, _ := cmd.Flags().GetString("recordID")
value, _ := cmd.Flags().GetUint64("value") value, _ := cmd.Flags().GetUint64("value")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.CollateralizeX), Execer: cfg.ExecName(pkt.CollateralizeX),
ActionName: "CollateralizeAppend", ActionName: "CollateralizeAppend",
Payload: []byte(fmt.Sprintf("{\"collateralizeID\":\"%s\", \"recordID\":\"%s\", \"value\":%d}", collateralizeID, recordID, value)), Payload: []byte(fmt.Sprintf("{\"collateralizeID\":\"%s\", \"recordID\":\"%s\", \"value\":%d}", collateralizeID, recordID, value)),
} }
...@@ -153,12 +171,18 @@ func addCollateralizeRepayFlags(cmd *cobra.Command) { ...@@ -153,12 +171,18 @@ func addCollateralizeRepayFlags(cmd *cobra.Command) {
} }
func CollateralizeRepay(cmd *cobra.Command, args []string) { func CollateralizeRepay(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
collateralizeID, _ := cmd.Flags().GetString("collateralizeID") collateralizeID, _ := cmd.Flags().GetString("collateralizeID")
recordID, _ := cmd.Flags().GetString("recordID") recordID, _ := cmd.Flags().GetString("recordID")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.CollateralizeX), Execer: cfg.ExecName(pkt.CollateralizeX),
ActionName: "CollateralizeRepay", ActionName: "CollateralizeRepay",
Payload: []byte(fmt.Sprintf("{\"collateralizeID\":\"%s\",\"recordID\":\"%s\"}", collateralizeID, recordID)), Payload: []byte(fmt.Sprintf("{\"collateralizeID\":\"%s\",\"recordID\":\"%s\"}", collateralizeID, recordID)),
} }
...@@ -187,12 +211,18 @@ func addCollateralizePriceFeedFlags(cmd *cobra.Command) { ...@@ -187,12 +211,18 @@ func addCollateralizePriceFeedFlags(cmd *cobra.Command) {
} }
func CollateralizePriceFeed(cmd *cobra.Command, args []string) { func CollateralizePriceFeed(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
price, _ := cmd.Flags().GetFloat32("price") price, _ := cmd.Flags().GetFloat32("price")
volume, _ := cmd.Flags().GetUint64("volume") volume, _ := cmd.Flags().GetUint64("volume")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.CollateralizeX), Execer: cfg.ExecName(pkt.CollateralizeX),
ActionName: "CollateralizePriceFeed", ActionName: "CollateralizePriceFeed",
Payload: []byte(fmt.Sprintf("{\"price\":[ %f ], \"volume\":[ %d ]}", price, volume)), Payload: []byte(fmt.Sprintf("{\"price\":[ %f ], \"volume\":[ %d ]}", price, volume)),
} }
...@@ -219,11 +249,17 @@ func addCollateralizeCloseFlags(cmd *cobra.Command) { ...@@ -219,11 +249,17 @@ func addCollateralizeCloseFlags(cmd *cobra.Command) {
} }
func CollateralizeClose(cmd *cobra.Command, args []string) { func CollateralizeClose(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
collateralizeID, _ := cmd.Flags().GetString("collateralizeID") collateralizeID, _ := cmd.Flags().GetString("collateralizeID")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.CollateralizeX), Execer: cfg.ExecName(pkt.CollateralizeX),
ActionName: "CollateralizeClose", ActionName: "CollateralizeClose",
Payload: []byte(fmt.Sprintf("{\"collateralizeID\":\"%s\"}", collateralizeID)), Payload: []byte(fmt.Sprintf("{\"collateralizeID\":\"%s\"}", collateralizeID)),
} }
...@@ -252,6 +288,12 @@ func addCollateralizeManageFlags(cmd *cobra.Command) { ...@@ -252,6 +288,12 @@ func addCollateralizeManageFlags(cmd *cobra.Command) {
} }
func CollateralizeManage(cmd *cobra.Command, args []string) { func CollateralizeManage(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
debtCeiling, _ := cmd.Flags().GetUint64("debtCeiling") debtCeiling, _ := cmd.Flags().GetUint64("debtCeiling")
liquidationRatio, _ := cmd.Flags().GetFloat32("liquidationRatio") liquidationRatio, _ := cmd.Flags().GetFloat32("liquidationRatio")
...@@ -259,7 +301,7 @@ func CollateralizeManage(cmd *cobra.Command, args []string) { ...@@ -259,7 +301,7 @@ func CollateralizeManage(cmd *cobra.Command, args []string) {
period, _ := cmd.Flags().GetUint64("period") period, _ := cmd.Flags().GetUint64("period")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.CollateralizeX), Execer: cfg.ExecName(pkt.CollateralizeX),
ActionName: "CollateralizeManage", ActionName: "CollateralizeManage",
Payload: []byte(fmt.Sprintf("{\"debtCeiling\":%d, \"liquidationRatio\":%f, \"stabilityFeeRatio\":%f, \"period\":%d}", Payload: []byte(fmt.Sprintf("{\"debtCeiling\":%d, \"liquidationRatio\":%f, \"stabilityFeeRatio\":%f, \"period\":%d}",
debtCeiling, liquidationRatio, stabilityFeeRatio, period)), debtCeiling, liquidationRatio, stabilityFeeRatio, period)),
......
...@@ -14,7 +14,7 @@ import ( ...@@ -14,7 +14,7 @@ import (
var clog = log.New("module", "execs.collateralize") var clog = log.New("module", "execs.collateralize")
var driverName = pty.CollateralizeX var driverName = pty.CollateralizeX
func init() { func InitExecType() {
ety := types.LoadExecutorType(driverName) ety := types.LoadExecutorType(driverName)
ety.InitFuncList(types.ListMethod(&Collateralize{})) ety.InitFuncList(types.ListMethod(&Collateralize{}))
} }
...@@ -26,7 +26,7 @@ type subConfig struct { ...@@ -26,7 +26,7 @@ type subConfig struct {
var cfg subConfig var cfg subConfig
// Init collateralize // Init collateralize
func Init(name string, sub []byte) { func Init(name string, cfg *types.Chain33Config, sub []byte) {
driverName := GetName() driverName := GetName()
if name != driverName { if name != driverName {
panic("system dapp can't be rename") panic("system dapp can't be rename")
...@@ -34,7 +34,8 @@ func Init(name string, sub []byte) { ...@@ -34,7 +34,8 @@ func Init(name string, sub []byte) {
if sub != nil { if sub != nil {
types.MustDecode(sub, &cfg) types.MustDecode(sub, &cfg)
} }
drivers.Register(driverName, newCollateralize, types.GetDappFork(driverName, "Enable")) drivers.Register(cfg, driverName, newCollateralize, cfg.GetDappFork(driverName, "Enable"))
InitExecType()
} }
// GetName for Collateralize // GetName for Collateralize
...@@ -170,7 +171,8 @@ func (c *Collateralize) CheckReceiptExecOk() bool { ...@@ -170,7 +171,8 @@ func (c *Collateralize) CheckReceiptExecOk() bool {
// ExecutorOrder 设置localdb的EnableRead // ExecutorOrder 设置localdb的EnableRead
func (c *Collateralize) ExecutorOrder() int64 { func (c *Collateralize) ExecutorOrder() int64 {
if types.IsFork(c.GetHeight(), "ForkLocalDBAccess") { cfg := c.GetAPI().GetConfig()
if cfg.IsFork(c.GetHeight(), "ForkLocalDBAccess") {
return drivers.ExecLocalSameTime return drivers.ExecLocalSameTime
} }
return c.DriverBase.ExecutorOrder() return c.DriverBase.ExecutorOrder()
......
...@@ -51,6 +51,12 @@ func addIssuanceCreateFlags(cmd *cobra.Command) { ...@@ -51,6 +51,12 @@ func addIssuanceCreateFlags(cmd *cobra.Command) {
} }
func IssuanceCreate(cmd *cobra.Command, args []string) { func IssuanceCreate(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
balance, _ := cmd.Flags().GetUint64("balance") balance, _ := cmd.Flags().GetUint64("balance")
debtCeiling, _ := cmd.Flags().GetUint64("debtCeiling") debtCeiling, _ := cmd.Flags().GetUint64("debtCeiling")
...@@ -58,7 +64,7 @@ func IssuanceCreate(cmd *cobra.Command, args []string) { ...@@ -58,7 +64,7 @@ func IssuanceCreate(cmd *cobra.Command, args []string) {
period, _ := cmd.Flags().GetUint64("period") period, _ := cmd.Flags().GetUint64("period")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.IssuanceX), Execer: cfg.ExecName(pkt.IssuanceX),
ActionName: "IssuanceCreate", ActionName: "IssuanceCreate",
Payload: []byte(fmt.Sprintf("{\"totalBalance\":%d, \"debtCeiling\":%d, \"liquidationRatio\":%f, \"period\":%d}", Payload: []byte(fmt.Sprintf("{\"totalBalance\":%d, \"debtCeiling\":%d, \"liquidationRatio\":%f, \"period\":%d}",
balance, debtCeiling, liquidationRatio, period)), balance, debtCeiling, liquidationRatio, period)),
...@@ -88,12 +94,18 @@ func addIssuanceDebtFlags(cmd *cobra.Command) { ...@@ -88,12 +94,18 @@ func addIssuanceDebtFlags(cmd *cobra.Command) {
} }
func IssuanceDebt(cmd *cobra.Command, args []string) { func IssuanceDebt(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
issuanceID, _ := cmd.Flags().GetString("issuanceID") issuanceID, _ := cmd.Flags().GetString("issuanceID")
value, _ := cmd.Flags().GetUint64("value") value, _ := cmd.Flags().GetUint64("value")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.IssuanceX), Execer: cfg.ExecName(pkt.IssuanceX),
ActionName: "IssuanceDebt", ActionName: "IssuanceDebt",
Payload: []byte(fmt.Sprintf("{\"issuanceID\":\"%s\",\"value\":%d}", issuanceID, value)), Payload: []byte(fmt.Sprintf("{\"issuanceID\":\"%s\",\"value\":%d}", issuanceID, value)),
} }
...@@ -122,12 +134,18 @@ func addIssuanceRepayFlags(cmd *cobra.Command) { ...@@ -122,12 +134,18 @@ func addIssuanceRepayFlags(cmd *cobra.Command) {
} }
func IssuanceRepay(cmd *cobra.Command, args []string) { func IssuanceRepay(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
issuanceID, _ := cmd.Flags().GetString("issuanceID") issuanceID, _ := cmd.Flags().GetString("issuanceID")
debtID, _ := cmd.Flags().GetString("debtID") debtID, _ := cmd.Flags().GetString("debtID")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.IssuanceX), Execer: cfg.ExecName(pkt.IssuanceX),
ActionName: "IssuanceRepay", ActionName: "IssuanceRepay",
Payload: []byte(fmt.Sprintf("{\"issuanceID\":\"%s\", \"debtID\":\"%s\"}", issuanceID, debtID)), Payload: []byte(fmt.Sprintf("{\"issuanceID\":\"%s\", \"debtID\":\"%s\"}", issuanceID, debtID)),
} }
...@@ -156,12 +174,18 @@ func addIssuancePriceFeedFlags(cmd *cobra.Command) { ...@@ -156,12 +174,18 @@ func addIssuancePriceFeedFlags(cmd *cobra.Command) {
} }
func IssuancePriceFeed(cmd *cobra.Command, args []string) { func IssuancePriceFeed(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
price, _ := cmd.Flags().GetFloat32("price") price, _ := cmd.Flags().GetFloat32("price")
volume, _ := cmd.Flags().GetUint64("volume") volume, _ := cmd.Flags().GetUint64("volume")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.IssuanceX), Execer: cfg.ExecName(pkt.IssuanceX),
ActionName: "IssuancePriceFeed", ActionName: "IssuancePriceFeed",
Payload: []byte(fmt.Sprintf("{\"price\":[ %f ], \"volume\":[ %d ]}", price, volume)), Payload: []byte(fmt.Sprintf("{\"price\":[ %f ], \"volume\":[ %d ]}", price, volume)),
} }
...@@ -188,11 +212,17 @@ func addIssuanceCloseFlags(cmd *cobra.Command) { ...@@ -188,11 +212,17 @@ func addIssuanceCloseFlags(cmd *cobra.Command) {
} }
func IssuanceClose(cmd *cobra.Command, args []string) { func IssuanceClose(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
issuanceID, _ := cmd.Flags().GetString("issuanceID") issuanceID, _ := cmd.Flags().GetString("issuanceID")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.IssuanceX), Execer: cfg.ExecName(pkt.IssuanceX),
ActionName: "IssuanceClose", ActionName: "IssuanceClose",
Payload: []byte(fmt.Sprintf("{\"issuanceId\":\"%s\"}", issuanceID)), Payload: []byte(fmt.Sprintf("{\"issuanceId\":\"%s\"}", issuanceID)),
} }
...@@ -219,11 +249,17 @@ func addIssuanceManageFlags(cmd *cobra.Command) { ...@@ -219,11 +249,17 @@ func addIssuanceManageFlags(cmd *cobra.Command) {
} }
func IssuanceManage(cmd *cobra.Command, args []string) { func IssuanceManage(cmd *cobra.Command, args []string) {
title, _ := cmd.Flags().GetString("title")
cfg := types.GetCliSysParam(title)
if cfg == nil {
panic(fmt.Sprintln("can not find CliSysParam title", title))
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
addr, _ := cmd.Flags().GetString("addr") addr, _ := cmd.Flags().GetString("addr")
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.IssuanceX), Execer: cfg.ExecName(pkt.IssuanceX),
ActionName: "IssuanceManage", ActionName: "IssuanceManage",
Payload: []byte(fmt.Sprintf("{\"addr\":[\"%s\"]}", addr)), Payload: []byte(fmt.Sprintf("{\"addr\":[\"%s\"]}", addr)),
} }
......
...@@ -14,7 +14,7 @@ import ( ...@@ -14,7 +14,7 @@ import (
var clog = log.New("module", "execs.issuance") var clog = log.New("module", "execs.issuance")
var driverName = pty.IssuanceX var driverName = pty.IssuanceX
func init() { func InitExecType() {
ety := types.LoadExecutorType(driverName) ety := types.LoadExecutorType(driverName)
ety.InitFuncList(types.ListMethod(&Issuance{})) ety.InitFuncList(types.ListMethod(&Issuance{}))
} }
...@@ -26,7 +26,7 @@ type subConfig struct { ...@@ -26,7 +26,7 @@ type subConfig struct {
var cfg subConfig var cfg subConfig
// Init issuance // Init issuance
func Init(name string, sub []byte) { func Init(name string, cfg *types.Chain33Config, sub []byte) {
driverName := GetName() driverName := GetName()
if name != driverName { if name != driverName {
panic("system dapp can't be rename") panic("system dapp can't be rename")
...@@ -34,7 +34,8 @@ func Init(name string, sub []byte) { ...@@ -34,7 +34,8 @@ func Init(name string, sub []byte) {
if sub != nil { if sub != nil {
types.MustDecode(sub, &cfg) types.MustDecode(sub, &cfg)
} }
drivers.Register(driverName, newIssuance, types.GetDappFork(driverName, "Enable")) drivers.Register(cfg, driverName, newIssuance, cfg.GetDappFork(driverName, "Enable"))
InitExecType()
} }
// GetName for Issuance // GetName for Issuance
...@@ -170,7 +171,8 @@ func (c *Issuance) CheckReceiptExecOk() bool { ...@@ -170,7 +171,8 @@ func (c *Issuance) CheckReceiptExecOk() bool {
// ExecutorOrder 设置localdb的EnableRead // ExecutorOrder 设置localdb的EnableRead
func (c *Issuance) ExecutorOrder() int64 { func (c *Issuance) ExecutorOrder() int64 {
if types.IsFork(c.GetHeight(), "ForkLocalDBAccess") { cfg := c.GetAPI().GetConfig()
if cfg.IsFork(c.GetHeight(), "ForkLocalDBAccess") {
return drivers.ExecLocalSameTime return drivers.ExecLocalSameTime
} }
return c.DriverBase.ExecutorOrder() return c.DriverBase.ExecutorOrder()
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment