Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
swiftMtMx
Overview
Overview
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
isc-v3.1-tmp
swiftMtMx
Commits
392516f6
Commit
392516f6
authored
May 06, 2022
by
zhanghou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
900和910mx和swift之间的转化进行了修改
parent
046bbaac
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
44 additions
and
180 deletions
+44
-180
Mx2SwiftDtoBTCDCNCreator.java
...ift/mx2swiftdto/bankcdbcdnf/Mx2SwiftDtoBTCDCNCreator.java
+14
-121
SwiftDto2MxCamt054001Creator.java
...ftdto2mx/camt054001/v08/SwiftDto2MxCamt054001Creator.java
+17
-29
BankToCustomerDebitNotification.json
.../resources/swiftJson/BankToCustomerDebitNotification.json
+5
-9
MxCamt05400108_DEBIT.xml
...Core/src/main/resources/swiftXml/MxCamt05400108_DEBIT.xml
+8
-21
No files found.
swiftCore/src/main/java/com/brilliance/swift/mx2swiftdto/bankcdbcdnf/Mx2SwiftDtoBTCDCNCreator.java
View file @
392516f6
...
...
@@ -71,6 +71,8 @@ public class Mx2SwiftDtoBTCDCNCreator extends AbstractMx2SwiftDtoCreator {
@Override
public
void
messageBody
()
throws
SwiftException
{
try
{
String
cdtDbtInd
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.CdtDbtInd"
);
bankToCustomerDebitCreditNotification
.
setCdtDbtCode
(
cdtDbtInd
);
//UETR
String
uetr
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.Refs.UETR"
);
if
(
StringUtil
.
isNotEmpty
(
uetr
))
{
...
...
@@ -106,131 +108,22 @@ public class Mx2SwiftDtoBTCDCNCreator extends AbstractMx2SwiftDtoCreator {
ccyFormatAmount
.
setAmt
(
new
BigDecimal
(
amtStr
));
bankToCustomerDebitCreditNotification
.
setValueAmount
(
ccyFormatAmount
);
}
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><Dbtr><Pty><Id><OrgId><AnyBIC>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><DbtrAcct><Id><IBAN>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><DbtrAcct><Id><Othr><Id>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><Dbtr><Pty><Nm>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><Dbtr><Pty><PstlAdr><AdrLine>
String
anyBic
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.Dbtr.Pty.Id.OrgId.AnyBIC"
);
String
name
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.Dbtr.Pty.Nm"
);
String
iban2
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.DbtrAcct.Id.IBAN"
);
String
id2
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.DbtrAcct.Id.Othr.Id"
);
PartyDto
partyDto1
=
new
PartyDto
();
if
(
anyBic
!=
null
){
partyDto1
.
setPartyBic
(
anyBic
);
if
(
id2
!=
null
||
iban
!=
null
){
PartyAccount
partyAccount1
=
new
PartyAccount
();
partyAccount1
.
setAccount
(
id2
);
partyAccount1
.
setIbanAcct
(
iban2
);
partyDto1
.
setPartyAcct
(
partyAccount1
);
}
bankToCustomerDebitCreditNotification
.
setDebitParty
(
partyDto1
);
}
else
if
(
name
!=
null
){
partyDto1
.
setPartyName
(
name
);
int
adrLineCount
=
getXmlNodeCounts
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.Dbtr.Pty.PstlAdr.AdrLine"
);
if
(
adrLineCount
>
0
){
for
(
int
i
=
0
;
i
<
adrLineCount
;
i
++)
{
if
(
i
==
3
)
{
break
;
}
String
adrLine
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.Dbtr.Pty.PstlAdr.AdrLine("
+
i
+
")"
);
if
(
adrLine
.
length
()
>
35
)
adrLine
=
adrLine
.
substring
(
0
,
35
);
partyDto1
.
addAddress
(
adrLine
);
}
}
if
(
id2
!=
null
||
iban2
!=
null
){
PartyAccount
partyAccount1
=
new
PartyAccount
();
partyAccount1
.
setAccount
(
id2
);
partyAccount1
.
setIbanAcct
(
iban2
);
partyDto1
.
setPartyAcct
(
partyAccount1
);
}
bankToCustomerDebitCreditNotification
.
setDebitParty
(
partyDto1
);
}
else
{
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><Dbtr><Pty><Id><OrgId><AnyBIC>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><Dbtr><Pty><Nm>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><Dbtr><Pty><PstlAdr><AdrLine>
String
bicfi2
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls("
+
1
+
").RltdAgts.DbtrAgt.FinInstnId.BICFI"
);
String
name2
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls("
+
1
+
").RltdAgts.DbtrAgt.FinInstnId.Nm"
);
String
mmbId2
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls("
+
1
+
").RltdAgts.DbtrAgt.FinInstnId.ClrSysMmbId.MmbId"
);
String
cd2
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls("
+
1
+
").RltdAgts.DbtrAgt.FinInstnId.ClrSysMmbId.ClrSysId.Cd"
);
PartyDto
partyDto
=
new
PartyDto
();
if
(
bicfi2
!=
null
){
partyDto
.
setPartyBic
(
bicfi2
);
if
(
mmbId2
!=
null
){
ClearingSystemMember
clrSysMmb2
=
new
ClearingSystemMember
();
clrSysMmb2
.
setId
(
mmbId2
);
clrSysMmb2
.
setCode
(
cd2
);
partyDto
.
setClrSysMmb
(
clrSysMmb2
);
}
bankToCustomerDebitCreditNotification
.
setDebitAgtParty
(
partyDto
);
}
else
if
(
name2
!=
null
){
partyDto
.
setPartyName
(
name2
);
int
adrLineCount
=
getXmlNodeCounts
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls("
+
1
+
").RltdAgts.DbtrAgt.FinInstnId.PstlAdr.AdrLine"
);
if
(
adrLineCount
>
0
){
for
(
int
i
=
0
;
i
<
adrLineCount
;
i
++)
{
if
(
i
==
3
)
{
break
;
}
String
adrLine
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls("
+
1
+
").RltdAgts.DbtrAgt.FinInstnId.PstlAdr.AdrLine("
+
i
+
")"
);
if
(
adrLine
.
length
()
>
35
)
adrLine
=
adrLine
.
substring
(
0
,
35
);
partyDto
.
addAddress
(
adrLine
);
}
}
if
(
mmbId2
!=
null
){
ClearingSystemMember
clrSysMmb2
=
new
ClearingSystemMember
();
clrSysMmb2
.
setId
(
mmbId2
);
clrSysMmb2
.
setCode
(
cd2
);
partyDto
.
setClrSysMmb
(
clrSysMmb2
);
}
bankToCustomerDebitCreditNotification
.
setDebitAgtParty
(
partyDto
);
}
}
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><IntrmyAgt1><FinInstnId><BICFI>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><IntrmyAgt1><FinInstnId><ClrSysMmbId><ClrSysId><Cd>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><IntrmyAgt1><FinInstnId><ClrSysMmbId><ClrSysId><Prtry>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><IntrmyAgt1><FinInstnId><ClrSysMmbId><MmbId>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><IntrmyAgt1><FinInstnId><Nm>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><IntrmyAgt1><FinInstnId><PstlAdr><AdrLine>[1],<AdrLine>[2],<AdrLine>[3]
String
bicfi
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.IntrmyAgt1.FinInstnId.BICFI"
);
String
name3
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.IntrmyAgt1.FinInstnId.Nm"
);
String
mmbId
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.IntrmyAgt1.FinInstnId.ClrSysMmbId.MmbId"
);
String
cd3
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.IntrmyAgt1.FinInstnId.ClrSysMmbId.ClrSysId.Cd"
);
PartyDto
partyDto2
=
new
PartyDto
();
if
(
bicfi
!=
null
){
partyDto2
.
setPartyBic
(
bicfi
);
if
(
mmbId
!=
null
){
ClearingSystemMember
clrSysMmb
=
new
ClearingSystemMember
();
clrSysMmb
.
setId
(
mmbId
);
clrSysMmb
.
setCode
(
cd3
);
partyDto2
.
setClrSysMmb
(
clrSysMmb
);
}
bankToCustomerDebitCreditNotification
.
setIntrmyAgtParty
(
partyDto2
);
}
else
if
(
name3
!=
null
){
partyDto2
.
setPartyName
(
name3
);
int
adrLineCount
=
getXmlNodeCounts
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.IntrmyAgt1.FinInstnId.PstlAdr.AdrLine"
);
if
(
adrLineCount
>
0
){
for
(
int
i
=
0
;
i
<
adrLineCount
;
i
++)
{
if
(
i
==
3
)
{
break
;
}
String
adrLine
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.IntrmyAgt1.FinInstnId.PstlAdr.AdrLine("
+
i
+
")"
);
if
(
adrLine
.
length
()
>
35
)
adrLine
=
adrLine
.
substring
(
0
,
35
);
partyDto2
.
addAddress
(
adrLine
);
}
}
if
(
mmbId
!=
null
){
ClearingSystemMember
clrSysMmb
=
new
ClearingSystemMember
();
clrSysMmb
.
setId
(
mmbId
);
clrSysMmb
.
setCode
(
cd3
);
partyDto2
.
setClrSysMmb
(
clrSysMmb
);
}
bankToCustomerDebitCreditNotification
.
setIntrmyAgtParty
(
partyDto2
);
if
(
"CRDT"
.
equals
(
cdtDbtInd
)){
PartyDto
debitParty
=
convertPartyDto
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.Dbtr.Pty"
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.DbtrAcct"
);
bankToCustomerDebitCreditNotification
.
setDebitAgtParty
(
debitParty
);
if
(
debitParty
==
null
){
PartyDto
debitAgtParty
=
agtConvertPartyDto
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.DbtrAgt"
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.DbtrAgt"
);
bankToCustomerDebitCreditNotification
.
setDebitAgtParty
(
debitAgtParty
);
}
PartyDto
intrmyAgtParty
=
agtConvertPartyDto
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.IntrmyAgt1"
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdAgts.IntrmyAgt1"
);
bankToCustomerDebitCreditNotification
.
setIntrmyAgtParty
(
intrmyAgtParty
);
}
else
if
(
"DBIT"
.
equals
(
cdtDbtInd
)){
PartyDto
debitAgtParty
=
convertPartyDto
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.Dbtr.Pty"
,
"Ntfctn.Ntry.NtryDtls.TxDtls.RltdPties.DbtrAcct"
);
bankToCustomerDebitCreditNotification
.
setDebitAgtParty
(
debitAgtParty
);
}
//<Ntfctn><Ntry><NtryDtls><TxDtls><AddtlTxInf>
String
addtlTxInf
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.NtryDtls.TxDtls.AddtlTxInf"
);
bankToCustomerDebitCreditNotification
.
setAddtlTxInf
(
addtlTxInf
);
String
cdtDbtInd
=
getXmlNodeValue
(
bodyHdrParentElementName
,
document
,
"Ntfctn.Ntry.CdtDbtInd"
);
bankToCustomerDebitCreditNotification
.
setCdtDbtCode
(
cdtDbtInd
);
}
catch
(
Exception
e
){
throw
new
SwiftException
(
"ERROR"
,
e
.
getMessage
());
}
...
...
swiftCore/src/main/java/com/brilliance/swift/swiftdto2mx/camt054001/v08/SwiftDto2MxCamt054001Creator.java
View file @
392516f6
...
...
@@ -99,8 +99,6 @@ public class SwiftDto2MxCamt054001Creator extends AbstractSwiftDto2MxCreator {
txDtls
.
setRltdPties
(
rltdPties
);
Party40Choice
dbtr
=
new
Party40Choice
();
rltdPties
.
setDbtr
(
dbtr
);
PartyIdentification135
pty
=
new
PartyIdentification135
();
dbtr
.
setPty
(
pty
);
TransactionReferences6
refs
=
new
TransactionReferences6
();
refs
.
setEndToEndId
(
endToEndId
);
refs
.
setUETR
(
bankToCustomerDebitCreditNotification
.
getUetr
());
...
...
@@ -131,38 +129,20 @@ public class SwiftDto2MxCamt054001Creator extends AbstractSwiftDto2MxCreator {
ntry
.
setAmt
(
amt
);
}
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><Dbtr><Nm>
if
(
"CRDT"
.
equals
(
cdtDbtCode
)){
if
(
debitParty
!=
null
){
if
(
debitParty
.
getPartyBic
()!=
null
){
Party38Choice
id
=
new
Party38Choice
();
pty
.
setId
(
id
);
OrganisationIdentification29
orgId
=
new
OrganisationIdentification29
();
orgId
.
setAnyBIC
(
bankToCustomerDebitCreditNotification
.
getDebitParty
().
getPartyBic
());
id
.
setOrgId
(
orgId
);
CashAccount38
dbtrAcct
=
new
CashAccount38
();
PartyIdentification135
pty
=
partyDtoConvertTr
(
debitParty
);
dbtr
.
setPty
(
pty
);
CashAccount38
dbtrAcct
=
partyDtoConvertAgtAccount
(
debitParty
.
getPartyAcct
());
rltdPties
.
setDbtrAcct
(
dbtrAcct
);
AccountIdentification4Choice
aid
=
new
AccountIdentification4Choice
();
dbtrAcct
.
setId
(
aid
);
aid
.
setIBAN
(
bankToCustomerDebitCreditNotification
.
getDebitParty
().
getPartyAcct
().
getIbanAcct
());
GenericAccountIdentification1
othr
=
new
GenericAccountIdentification1
();
aid
.
setOthr
(
othr
);
othr
.
setId
(
bankToCustomerDebitCreditNotification
.
getDebitParty
().
getPartyAcct
().
getAccount
());
}
else
if
(
debitParty
.
getPartyName
()!=
null
){
pty
.
setNm
(
debitParty
.
getPartyName
());
PostalAddress24
pstlAdr
=
new
PostalAddress24
();
pty
.
setPstlAdr
(
pstlAdr
);
List
<
String
>
addressList
=
bankToCustomerDebitCreditNotification
.
getDebitParty
().
getAddressList
();
for
(
String
addAdrLine
:
addressList
)
{
pstlAdr
.
addAdrLine
(
addAdrLine
);
}
}
}
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdPties><Dbtr><Nm
>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><DbtrAgt><FinInstnId><BICFI
>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><DbtrAcct><FinInstnId><BICFI>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><DbtrAcct><FinInstnId><ClrSysMmbId><ClrSysId><Cd>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><DbtrAcct><FinInstnId><ClrSysMmbId><ClrSysId><Prtry
>
//<Ntfctn><Ntry><NtryDtls><TxDtls><RltdAgts><DbtrAcct><FinInstnId><ClrSysMmbId><MmbId
>
if
(
debitAgtParty
!=
null
){
EntryTransaction10
txDtls2
=
new
EntryTransaction10
();
ntryDtls
.
addTxDtls
(
txDtls2
);
TransactionAgents5
rltdAgts
=
new
TransactionAgents5
();
txDtls2
.
setRltdAgts
(
rltdAgts
);
txDtls
.
setRltdAgts
(
rltdAgts
);
BranchAndFinancialInstitutionIdentification6
dbtrAgt
=
partyDtoConvertAgt
(
debitAgtParty
);
rltdAgts
.
setDbtrAgt
(
dbtrAgt
);
}
...
...
@@ -173,6 +153,14 @@ public class SwiftDto2MxCamt054001Creator extends AbstractSwiftDto2MxCreator {
BranchAndFinancialInstitutionIdentification6
intrmyAgt1
=
partyDtoConvertAgt
(
intrmyAgtParty
);
rltdAgts
.
setIntrmyAgt1
(
intrmyAgt1
);
}
}
else
if
(
"DBIT"
.
equals
(
cdtDbtCode
)){
if
(
debitAgtParty
!=
null
){
PartyIdentification135
pty
=
partyDtoConvertTr
(
debitAgtParty
);
dbtr
.
setPty
(
pty
);
CashAccount38
dbtrAcct
=
partyDtoConvertAgtAccount
(
debitAgtParty
.
getPartyAcct
());
rltdPties
.
setDbtrAcct
(
dbtrAcct
);
}
}
if
(
addtlTxInf
!=
null
){
txDtls
.
setAddtlTxInf
(
addtlTxInf
);
}
...
...
swiftCore/src/main/resources/swiftJson/BankToCustomerDebitNotification.json
View file @
392516f6
...
...
@@ -10,16 +10,12 @@
"amt"
:
126
},
"debitAgtParty"
:
{
"partyName"
:
"Creditor
2
"
,
"partyName"
:
"Creditor
1
"
,
"addressList"
:
[
"TEST111"
,
"TEST222"
,
"TEST333"
],
"clrSysMmb"
:
{
"code"
:
"ATBLZ"
,
"id"
:
"FR7630588000010050000143176"
}
"TEST1"
,
"TEST2"
,
"TEST3"
]
},
"addtlTxInf"
:
"ENRICHED|TRUE SETT_METHOD|SEPA IAT_IND|FALSE DOMESTIC_IND|FALSE PRIORITY_IND|FALSEENRICHED|TRUE SETT_METHOD|SEPA IAT_ENRICHED|TRUE SETT_METHOD|SEPA IAT_ENRICHED|TRUE SETT_METHOD|SEPA IAT_ENRICHED|TRUE SETT_METH"
,
"messageType"
:
"camt.054.001"
,
...
...
swiftCore/src/main/resources/swiftXml/MxCamt05400108_DEBIT.xml
View file @
392516f6
...
...
@@ -49,31 +49,18 @@
</Refs>
<RltdPties>
<Dbtr>
<Pty></Pty>
<Pty>
<Nm>
Creditor 1
</Nm>
<PstlAdr>
<AdrLine>
TEST1
</AdrLine>
<AdrLine>
TEST2
</AdrLine>
<AdrLine>
TEST3
</AdrLine>
</PstlAdr>
</Pty>
</Dbtr>
</RltdPties>
<AddtlTxInf>
ENRICHED|TRUE SETT_METHOD|SEPA IAT_IND|FALSE DOMESTIC_IND|FALSE PRIORITY_IND|FALSEENRICHED|TRUE SETT_METHOD|SEPA IAT_ENRICHED|TRUE SETT_METHOD|SEPA IAT_ENRICHED|TRUE SETT_METHOD|SEPA IAT_ENRICHED|TRUE SETT_METH
</AddtlTxInf>
</TxDtls>
<TxDtls>
<RltdAgts>
<DbtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>
ATBLZ
</Cd>
</ClrSysId>
<MmbId>
FR7630588000010050000143176
</MmbId>
</ClrSysMmbId>
<Nm>
Creditor 2
</Nm>
<PstlAdr>
<AdrLine>
TEST111
</AdrLine>
<AdrLine>
TEST222
</AdrLine>
<AdrLine>
TEST333
</AdrLine>
</PstlAdr>
</FinInstnId>
</DbtrAgt>
</RltdAgts>
</TxDtls>
</NtryDtls>
</Ntry>
</Ntfctn>
...
...
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