Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
galaxy-iOS
Project
Project
Details
Activity
Releases
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
mobile-group
galaxy-iOS
Commits
b32b566a
Commit
b32b566a
authored
Sep 26, 2025
by
Alex朱枝文
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
社区相关
parent
21456ebd
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
63 additions
and
61 deletions
+63
-61
Fastfile
galaxy/fastlane/Fastfile
+2
-1
project.pbxproj
galaxy/galaxy.xcodeproj/project.pbxproj
+18
-15
YHCirclePublishViewController.swift
...ty(社区)/Circle(下属社区)/C/YHCirclePublishViewController.swift
+1
-0
YHCircleViewController.swift
...Community(社区)/Circle(下属社区)/C/YHCircleViewController.swift
+31
-26
YHCircleViewModel.swift
...les/Community(社区)/Circle(下属社区)/VM/YHCircleViewModel.swift
+6
-19
YHHomeCollectionViewCell.swift
...Classes/Modules/Home(首页)/V/YHHomeCollectionViewCell.swift
+5
-0
No files found.
galaxy/fastlane/Fastfile
View file @
b32b566a
...
...
@@ -47,10 +47,11 @@ platform :ios do
webFix = "develop_bugfix_web"
kjzf = "kjzf"
develop_fix_adopter = "develop_fix_adopter"
dev_1013 = "dev_1013"
#打包正使用的分支
myPack_branch = dev
elop_fix_adopter
myPack_branch = dev
_1013
# 打adhoc包 执行命令 fastlane galaxyTest
...
...
galaxy/galaxy.xcodeproj/project.pbxproj
View file @
b32b566a
...
...
@@ -3,7 +3,7 @@
archiveVersion
=
1
;
classes
=
{
};
objectVersion
=
7
0
;
objectVersion
=
6
0
;
objects
=
{
/* Begin PBXBuildFile section */
...
...
@@ -1256,14 +1256,14 @@
04B00FCA2D9AAD6100F640C5
/* YHMakePlanTopView.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04B00FC92D9AAD6100F640C5
/* YHMakePlanTopView.swift */
;
};
04D4EC312E839C1000B0329B
/* YHCircleViewController.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D4EC302E839C1000B0329B
/* YHCircleViewController.swift */
;
};
04D4EC332E839C2B00B0329B
/* YHResourceViewController.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D4EC322E839C2B00B0329B
/* YHResourceViewController.swift */
;
};
04D6405A2E84DF07000162AF
/* YHConnectListViewController.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D640592E84DF07000162AF
/* YHConnectListViewController.swift */
;
};
04D6405E2E84E3B4000162AF
/* YHConnectListCell.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D6405D2E84E3B4000162AF
/* YHConnectListCell.swift */
;
};
04D4EC442E83D0D500B0329B
/* YHCircleViewModel.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D4EC432E83D0D500B0329B
/* YHCircleViewModel.swift */
;
};
04D4EC462E83D11500B0329B
/* YHCircleCollectionViewCell.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D4EC452E83D11500B0329B
/* YHCircleCollectionViewCell.swift */
;
};
04D4EC482E83D17500B0329B
/* YHCircleListModel.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D4EC472E83D17500B0329B
/* YHCircleListModel.swift */
;
};
04D4EC4A2E83D21000B0329B
/* YHCirclePublishViewController.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D4EC492E83D21000B0329B
/* YHCirclePublishViewController.swift */
;
};
04D4EC4C2E83D27200B0329B
/* YHCircleDetailViewController.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D4EC4B2E83D27200B0329B
/* YHCircleDetailViewController.swift */
;
};
04D4EC4E2E84F22500B0329B
/* YHCircleHeaderReusableView.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D4EC4D2E84F22500B0329B
/* YHCircleHeaderReusableView.swift */
;
};
04D6405A2E84DF07000162AF
/* YHConnectListViewController.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D640592E84DF07000162AF
/* YHConnectListViewController.swift */
;
};
04D6405E2E84E3B4000162AF
/* YHConnectListCell.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D6405D2E84E3B4000162AF
/* YHConnectListCell.swift */
;
};
04D8FF552D9258AA00703C75
/* YHPlanScoreView.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D8FF542D9258AA00703C75
/* YHPlanScoreView.swift */
;
};
04D8FF572D925A0800703C75
/* YHPlanScoreChart.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D8FF562D925A0800703C75
/* YHPlanScoreChart.swift */
;
};
04D8FF592D925E6700703C75
/* YHPlanModel.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D8FF582D925E6700703C75
/* YHPlanModel.swift */
;
};
...
...
@@ -2607,14 +2607,14 @@
04B00FC92D9AAD6100F640C5
/* YHMakePlanTopView.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHMakePlanTopView.swift
;
sourceTree
=
"<group>"
;
};
04D4EC302E839C1000B0329B
/* YHCircleViewController.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCircleViewController.swift
;
sourceTree
=
"<group>"
;
};
04D4EC322E839C2B00B0329B
/* YHResourceViewController.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHResourceViewController.swift
;
sourceTree
=
"<group>"
;
};
04D640592E84DF07000162AF
/* YHConnectListViewController.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHConnectListViewController.swift
;
sourceTree
=
"<group>"
;
};
04D6405D2E84E3B4000162AF
/* YHConnectListCell.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHConnectListCell.swift
;
sourceTree
=
"<group>"
;
};
04D4EC432E83D0D500B0329B
/* YHCircleViewModel.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCircleViewModel.swift
;
sourceTree
=
"<group>"
;
};
04D4EC452E83D11500B0329B
/* YHCircleCollectionViewCell.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCircleCollectionViewCell.swift
;
sourceTree
=
"<group>"
;
};
04D4EC472E83D17500B0329B
/* YHCircleListModel.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCircleListModel.swift
;
sourceTree
=
"<group>"
;
};
04D4EC492E83D21000B0329B
/* YHCirclePublishViewController.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCirclePublishViewController.swift
;
sourceTree
=
"<group>"
;
};
04D4EC4B2E83D27200B0329B
/* YHCircleDetailViewController.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCircleDetailViewController.swift
;
sourceTree
=
"<group>"
;
};
04D4EC4D2E84F22500B0329B
/* YHCircleHeaderReusableView.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCircleHeaderReusableView.swift
;
sourceTree
=
"<group>"
;
};
04D640592E84DF07000162AF
/* YHConnectListViewController.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHConnectListViewController.swift
;
sourceTree
=
"<group>"
;
};
04D6405D2E84E3B4000162AF
/* YHConnectListCell.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHConnectListCell.swift
;
sourceTree
=
"<group>"
;
};
04D8FF542D9258AA00703C75
/* YHPlanScoreView.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHPlanScoreView.swift
;
sourceTree
=
"<group>"
;
};
04D8FF562D925A0800703C75
/* YHPlanScoreChart.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHPlanScoreChart.swift
;
sourceTree
=
"<group>"
;
};
04D8FF582D925E6700703C75
/* YHPlanModel.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHPlanModel.swift
;
sourceTree
=
"<group>"
;
};
...
...
@@ -2667,7 +2667,7 @@
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
043F0ED92E02A60C003354EB
/*
PBXFileSystemSynchronizedBuildFileExceptionS
et */
=
{
043F0ED92E02A60C003354EB
/*
Exceptions for "yinheReplayExt" folder in "yinheReplayExt" targ
et */
=
{
isa
=
PBXFileSystemSynchronizedBuildFileExceptionSet
;
membershipExceptions
=
(
Info.plist
,
...
...
@@ -2677,7 +2677,18 @@
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
043F0ECD2E02A60C003354EB
/* yinheReplayExt */
=
{
isa
=
PBXFileSystemSynchronizedRootGroup
;
exceptions
=
(
043F0ED92E02A60C003354EB
/* PBXFileSystemSynchronizedBuildFileExceptionSet */
,
);
explicitFileTypes
=
{};
explicitFolders
=
();
path
=
yinheReplayExt
;
sourceTree
=
"<group>"
;
};
043F0ECD2E02A60C003354EB
/* yinheReplayExt */
=
{
isa
=
PBXFileSystemSynchronizedRootGroup
;
exceptions
=
(
043F0ED92E02A60C003354EB
/* Exceptions for "yinheReplayExt" folder in "yinheReplayExt" target */
,
);
explicitFileTypes
=
{
};
explicitFolders
=
(
);
path
=
yinheReplayExt
;
sourceTree
=
"<group>"
;
};
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */
...
...
@@ -7383,14 +7394,10 @@
inputFileListPaths
=
(
"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-frameworks-${CONFIGURATION}-input-files.xcfilelist"
,
);
inputPaths
=
(
);
name
=
"[CP] Embed Pods Frameworks"
;
outputFileListPaths
=
(
"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-frameworks-${CONFIGURATION}-output-files.xcfilelist"
,
);
outputPaths
=
(
);
runOnlyForDeploymentPostprocessing
=
0
;
shellPath
=
/bin/sh
;
shellScript
=
"\"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-frameworks.sh\"\n"
;
...
...
@@ -7404,14 +7411,10 @@
inputFileListPaths
=
(
"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-resources-${CONFIGURATION}-input-files.xcfilelist"
,
);
inputPaths
=
(
);
name
=
"[CP] Copy Pods Resources"
;
outputFileListPaths
=
(
"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-resources-${CONFIGURATION}-output-files.xcfilelist"
,
);
outputPaths
=
(
);
runOnlyForDeploymentPostprocessing
=
0
;
shellPath
=
/bin/sh
;
shellScript
=
"\"${PODS_ROOT}/Target Support Files/Pods-galaxy/Pods-galaxy-resources.sh\"\n"
;
...
...
galaxy/galaxy/Classes/Modules/Community(社区)/Circle(下属社区)/C/YHCirclePublishViewController.swift
View file @
b32b566a
...
...
@@ -15,6 +15,7 @@ class YHCirclePublishViewController: YHBaseViewController {
override
func
viewDidLoad
()
{
super
.
viewDidLoad
()
view
.
backgroundColor
=
.
white
gk_navigationBar
.
isHidden
=
true
title
=
"发布动态"
navigationItem
.
leftBarButtonItem
=
UIBarButtonItem
(
...
...
galaxy/galaxy/Classes/Modules/Community(社区)/Circle(下属社区)/C/YHCircleViewController.swift
View file @
b32b566a
...
...
@@ -25,7 +25,8 @@ class YHCircleViewController: YHBaseViewController {
flowLayout
.
headerHeight
=
112
let
collectionView
=
UICollectionView
(
frame
:
.
zero
,
collectionViewLayout
:
flowLayout
)
collectionView
.
backgroundColor
=
.
white
collectionView
.
register
(
YHCircleCollectionViewCell
.
self
,
forCellWithReuseIdentifier
:
YHCircleCollectionViewCell
.
cellReuseIdentifier
)
// collectionView.register(YHCircleCollectionViewCell.self, forCellWithReuseIdentifier: YHCircleCollectionViewCell.cellReuseIdentifier)
collectionView
.
register
(
YHHomeCollectionViewCell
.
self
,
forCellWithReuseIdentifier
:
YHHomeCollectionViewCell
.
cellReuseIdentifier
)
collectionView
.
register
(
YHCircleHeaderReusableView
.
self
,
forSupplementaryViewOfKind
:
CollectionViewWaterfallElementKindSectionHeader
,
withReuseIdentifier
:
YHCircleHeaderReusableView
.
reuseIdentifier
)
collectionView
.
delegate
=
self
collectionView
.
dataSource
=
self
...
...
@@ -71,6 +72,7 @@ class YHCircleViewController: YHBaseViewController {
private
extension
YHCircleViewController
{
func
setupUI
()
{
gk_navigationBar
.
isHidden
=
true
view
.
addSubview
(
circleCollectView
)
view
.
addSubview
(
publishButton
)
circleCollectView
.
snp
.
makeConstraints
{
make
in
...
...
@@ -109,7 +111,7 @@ private extension YHCircleViewController {
return
}
if
let
arrData
=
result
as?
[
YH
Circl
eListModel
]
{
if
let
arrData
=
result
as?
[
YH
Hom
eListModel
]
{
for
item
in
arrData
{
item
.
calHeightParam
()
}
...
...
@@ -179,7 +181,7 @@ private extension YHCircleViewController {
publishVC
.
completion
=
{
[
weak
self
]
in
self
?
.
getData
()
}
let
nav
=
UI
NavigationController
(
rootViewController
:
publishVC
)
let
nav
=
YH
NavigationController
(
rootViewController
:
publishVC
)
nav
.
modalPresentationStyle
=
.
fullScreen
present
(
nav
,
animated
:
true
)
}
...
...
@@ -237,21 +239,24 @@ extension YHCircleViewController: UICollectionViewDelegate, UICollectionViewData
}
func
collectionView
(
_
collectionView
:
UICollectionView
,
cellForItemAt
indexPath
:
IndexPath
)
->
UICollectionViewCell
{
guard
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
YHCircleCollectionViewCell
.
cellReuseIdentifier
,
for
:
indexPath
)
as?
YHCircleCollectionViewCell
else
{
guard
let
datas
=
self
.
viewModel
.
arrCircleData
,
datas
.
count
>
indexPath
.
row
else
{
return
UICollectionViewCell
()
}
guard
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
YHHomeCollectionViewCell
.
cellReuseIdentifier
,
for
:
indexPath
)
as?
YHHomeCollectionViewCell
else
{
return
UICollectionViewCell
()
}
cell
.
listModel
=
self
.
viewModel
.
arrCircleData
?
[
indexPath
.
row
]
cell
.
listModel
=
datas
[
indexPath
.
row
]
cell
.
likeBlock
=
{
[
weak
self
]
item
in
self
?
.
viewModel
.
toggleLike
(
postId
:
item
.
id
)
{
success
,
_
in
if
success
{
DispatchQueue
.
main
.
async
{
self
?
.
circleCollectView
.
reloadItems
(
at
:
[
indexPath
])
}
}
}
}
// cell.clickHeartEvent
= { [weak self] item in
//
self?.viewModel.toggleLike(postId: item.id) { success, _ in
//
if success {
//
DispatchQueue.main.async {
//
self?.circleCollectView.reloadItems(at: [indexPath])
//
}
//
}
//
}
//
}
return
cell
}
...
...
@@ -272,18 +277,18 @@ extension YHCircleViewController: UICollectionViewDelegate, UICollectionViewData
guard
let
model
=
self
.
viewModel
.
arrCircleData
?[
indexPath
.
row
]
else
{
return
}
let
detailVC
=
YHCircleDetailViewController
()
detailVC
.
circleModel
=
model
detailVC
.
block
=
{
item
in
if
let
arr
=
self
.
viewModel
.
arrCircleData
{
for
(
index
,
targetItem
)
in
arr
.
enumerated
()
{
if
targetItem
.
id
==
item
.
id
{
targetItem
.
is_like
=
item
.
is_like
targetItem
.
like_count
=
item
.
like_count
self
.
circleCollectView
.
reloadItems
(
at
:
[
IndexPath
(
item
:
index
,
section
:
0
)])
}
}
}
}
//
detailVC.circleModel = model
//
detailVC.block = { item in
//
if let arr = self.viewModel.arrCircleData {
//
for (index, targetItem) in arr.enumerated() {
//
if targetItem.id == item.id {
//
targetItem.is_like = item.is_like
//
targetItem.like_count = item.like_count
//
self.circleCollectView.reloadItems(at: [IndexPath(item: index, section: 0)])
//
}
//
}
//
}
//
}
self
.
navigationController
?
.
pushViewController
(
detailVC
,
animated
:
true
)
}
...
...
galaxy/galaxy/Classes/Modules/Community(社区)/Circle(下属社区)/VM/YHCircleViewModel.swift
View file @
b32b566a
...
...
@@ -11,7 +11,7 @@ import UIKit
// MARK: - ViewModel
class
YHCircleViewModel
{
var
arrCircleData
:
[
YH
Circl
eListModel
]?
=
[]
var
arrCircleData
:
[
YH
Hom
eListModel
]?
=
[]
var
hasMoreForCircle
=
true
var
preloadItemIndex
=
10
private
var
currentPage
=
1
...
...
@@ -40,7 +40,7 @@ class YHCircleViewModel {
}
}
func
toggleLike
(
postId
:
String
,
completion
:
@escaping
(
Bool
,
String
?)
->
Void
)
{
func
toggleLike
(
postId
:
Int
,
completion
:
@escaping
(
Bool
,
String
?)
->
Void
)
{
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
0.5
)
{
if
let
index
=
self
.
arrCircleData
?
.
firstIndex
(
where
:
{
$0
.
id
==
postId
})
{
let
item
=
self
.
arrCircleData
!
[
index
]
...
...
@@ -53,7 +53,7 @@ class YHCircleViewModel {
}
}
private
func
generateMockCircleData
(
page
:
Int
)
->
[
YH
Circl
eListModel
]
{
private
func
generateMockCircleData
(
page
:
Int
)
->
[
YH
Hom
eListModel
]
{
let
contents
=
[
"今天天气真不错,出来走走心情都变好了!"
,
"分享一下最近读的这本书,非常推荐给大家"
,
...
...
@@ -68,25 +68,12 @@ class YHCircleViewModel {
let
locations
=
[
"北京·朝阳区"
,
"上海·浦东新区"
,
"深圳·南山区"
,
"杭州·西湖区"
,
"成都·锦江区"
,
""
]
return
(
0
..<
8
)
.
map
{
i
in
let
model
=
YHCircleListModel
()
model
.
id
=
"circle_
\(
page
)
_
\(
i
)
"
model
.
user_id
=
"user_
\(
i
)
"
model
.
user_name
=
names
[
i
%
names
.
count
]
model
.
user_avatar
=
"https://picsum.photos/60/60?random=
\(
i
)
"
let
model
=
YHHomeListModel
()
model
.
id
=
i
model
.
img_url
=
"https://picsum.photos/60/60?random=
\(
i
)
"
model
.
content
=
contents
[
i
%
contents
.
count
]
model
.
like_count
=
Int
.
random
(
in
:
0
...
99
)
model
.
comment_count
=
Int
.
random
(
in
:
0
...
20
)
model
.
is_like
=
Bool
.
random
()
model
.
create_time
=
"
\(
Int
.
random
(
in
:
1
...
24
)
)
小时前"
model
.
location
=
locations
[
i
%
locations
.
count
]
model
.
type
=
Bool
.
random
()
?
1
:
2
if
model
.
type
==
1
&&
Bool
.
random
()
{
let
imageCount
=
Int
.
random
(
in
:
1
...
4
)
model
.
images
=
(
0
..<
imageCount
)
.
map
{
_
in
"https://picsum.photos/300/
\(
Int
.
random
(
in
:
200
...
400
)
)
?random=
\(
UUID
()
.
uuidString
)
"
}
}
return
model
}
...
...
galaxy/galaxy/Classes/Modules/Home(首页)/V/YHHomeCollectionViewCell.swift
View file @
b32b566a
...
...
@@ -14,6 +14,7 @@ import Lottie
class
YHHomeCollectionViewCell
:
UICollectionViewCell
{
static
let
cellReuseIdentifier
=
"YHHomeCollectionViewCell"
var
clickHeartEvent
:
(()
->
Void
)?
lazy
var
viewModel
:
YHHomeWebViewModel
=
{
let
viewModel
=
YHHomeWebViewModel
()
...
...
@@ -238,6 +239,10 @@ extension YHHomeCollectionViewCell {
@objc
func
clickHeart
()
{
guard
let
listModel
=
listModel
else
{
return
}
if
let
clickHeartEvent
=
clickHeartEvent
{
clickHeartEvent
()
return
}
if
YHLoginManager
.
shared
.
isLogin
()
{
if
listModel
.
is_like
==
false
{
...
...
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