Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
C
cdn-node-checker
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
cdn-node-checker
Commits
2ada27de
Commit
2ada27de
authored
Mar 24, 2023
by
nanahira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add timeout
parent
b70ecdb5
Pipeline
#20896
failed with stages
in 1 minute and 36 seconds
Changes
3
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
170 additions
and
58 deletions
+170
-58
package-lock.json
package-lock.json
+155
-52
package.json
package.json
+2
-1
run.ts
run.ts
+13
-5
No files found.
package-lock.json
View file @
2ada27de
...
...
@@ -13,11 +13,12 @@
"@types/cron"
:
"^1.7.2"
,
"@types/q"
:
"^1.5.4"
,
"@types/yaml"
:
"^1.9.7"
,
"axios"
:
"^
0.19.2
"
,
"axios"
:
"^
1.3.4
"
,
"delay"
:
"^5.0.0"
,
"icmp"
:
"^2.0.1"
,
"lodash"
:
"^4.17.21"
,
"p-queue"
:
"6.6.2"
,
"p-timeout"
:
"4.1.0"
,
"q"
:
"^1.5.1"
,
"yaml"
:
"^1.10.0"
},
...
...
@@ -601,13 +602,19 @@
"node"
:
">=8"
}
},
"node_modules/asynckit"
:
{
"version"
:
"0.4.0"
,
"resolved"
:
"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
,
"integrity"
:
"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/axios"
:
{
"version"
:
"0.19.2"
,
"resolved"
:
"https://registry.npmjs.org/axios/-/axios-0.19.2.tgz"
,
"integrity"
:
"sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA=="
,
"deprecated"
:
"Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410"
,
"version"
:
"1.3.4"
,
"resolved"
:
"https://registry.npmjs.org/axios/-/axios-1.3.4.tgz"
,
"integrity"
:
"sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ=="
,
"dependencies"
:
{
"follow-redirects"
:
"1.5.10"
"follow-redirects"
:
"^1.15.0"
,
"form-data"
:
"^4.0.0"
,
"proxy-from-env"
:
"^1.1.0"
}
},
"node_modules/balanced-match"
:
{
...
...
@@ -689,6 +696,17 @@
"integrity"
:
"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
,
"dev"
:
true
},
"node_modules/combined-stream"
:
{
"version"
:
"1.0.8"
,
"resolved"
:
"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
,
"integrity"
:
"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="
,
"dependencies"
:
{
"delayed-stream"
:
"~1.0.0"
},
"engines"
:
{
"node"
:
">= 0.8"
}
},
"node_modules/concat-map"
:
{
"version"
:
"0.0.1"
,
"resolved"
:
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
,
...
...
@@ -735,6 +753,14 @@
"url"
:
"https://github.com/sponsors/sindresorhus"
}
},
"node_modules/delayed-stream"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
,
"integrity"
:
"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
,
"engines"
:
{
"node"
:
">=0.4.0"
}
},
"node_modules/dir-glob"
:
{
"version"
:
"3.0.1"
,
"resolved"
:
"https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
,
...
...
@@ -1154,29 +1180,37 @@
"dev"
:
true
},
"node_modules/follow-redirects"
:
{
"version"
:
"1.5.10"
,
"resolved"
:
"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz"
,
"integrity"
:
"sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ=="
,
"dependencies"
:
{
"debug"
:
"=3.1.0"
},
"version"
:
"1.15.2"
,
"resolved"
:
"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"
,
"integrity"
:
"sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
,
"funding"
:
[
{
"type"
:
"individual"
,
"url"
:
"https://github.com/sponsors/RubenVerborgh"
}
],
"engines"
:
{
"node"
:
">=4.0"
},
"peerDependenciesMeta"
:
{
"debug"
:
{
"optional"
:
true
}
}
},
"node_modules/fo
llow-redirects/node_modules/debug
"
:
{
"version"
:
"
3.1
.0"
,
"resolved"
:
"https://registry.npmjs.org/
debug/-/debug-3.1
.0.tgz"
,
"integrity"
:
"sha512-
OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g
=="
,
"node_modules/fo
rm-data
"
:
{
"version"
:
"
4.0
.0"
,
"resolved"
:
"https://registry.npmjs.org/
form-data/-/form-data-4.0
.0.tgz"
,
"integrity"
:
"sha512-
ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww
=="
,
"dependencies"
:
{
"ms"
:
"2.0.0"
"asynckit"
:
"^0.4.0"
,
"combined-stream"
:
"^1.0.8"
,
"mime-types"
:
"^2.1.12"
},
"engines"
:
{
"node"
:
">= 6"
}
},
"node_modules/follow-redirects/node_modules/ms"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
,
"integrity"
:
"sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"node_modules/fs.realpath"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
,
...
...
@@ -1514,6 +1548,25 @@
"node"
:
">=8.6"
}
},
"node_modules/mime-db"
:
{
"version"
:
"1.52.0"
,
"resolved"
:
"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
,
"integrity"
:
"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
,
"engines"
:
{
"node"
:
">= 0.6"
}
},
"node_modules/mime-types"
:
{
"version"
:
"2.1.35"
,
"resolved"
:
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
,
"integrity"
:
"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="
,
"dependencies"
:
{
"mime-db"
:
"1.52.0"
},
"engines"
:
{
"node"
:
">= 0.6"
}
},
"node_modules/minimatch"
:
{
"version"
:
"3.0.4"
,
"resolved"
:
"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
,
...
...
@@ -1599,7 +1652,7 @@
"url"
:
"https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-timeout"
:
{
"node_modules/p-
queue/node_modules/p-
timeout"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz"
,
"integrity"
:
"sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="
,
...
...
@@ -1610,6 +1663,14 @@
"node"
:
">=8"
}
},
"node_modules/p-timeout"
:
{
"version"
:
"4.1.0"
,
"resolved"
:
"https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz"
,
"integrity"
:
"sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw=="
,
"engines"
:
{
"node"
:
">=10"
}
},
"node_modules/parent-module"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
,
...
...
@@ -1703,6 +1764,11 @@
"node"
:
">=0.4.0"
}
},
"node_modules/proxy-from-env"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
,
"integrity"
:
"sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/punycode"
:
{
"version"
:
"2.1.1"
,
"resolved"
:
"https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
,
...
...
@@ -2546,12 +2612,19 @@
"integrity"
:
"sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
,
"dev"
:
true
},
"asynckit"
:
{
"version"
:
"0.4.0"
,
"resolved"
:
"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
,
"integrity"
:
"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"axios"
:
{
"version"
:
"
0.19.2
"
,
"resolved"
:
"https://registry.npmjs.org/axios/-/axios-
0.19.2
.tgz"
,
"integrity"
:
"sha512-
fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA
=="
,
"version"
:
"
1.3.4
"
,
"resolved"
:
"https://registry.npmjs.org/axios/-/axios-
1.3.4
.tgz"
,
"integrity"
:
"sha512-
toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ
=="
,
"requires"
:
{
"follow-redirects"
:
"1.5.10"
"follow-redirects"
:
"^1.15.0"
,
"form-data"
:
"^4.0.0"
,
"proxy-from-env"
:
"^1.1.0"
}
},
"balanced-match"
:
{
...
...
@@ -2615,6 +2688,14 @@
"integrity"
:
"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
,
"dev"
:
true
},
"combined-stream"
:
{
"version"
:
"1.0.8"
,
"resolved"
:
"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
,
"integrity"
:
"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="
,
"requires"
:
{
"delayed-stream"
:
"~1.0.0"
}
},
"concat-map"
:
{
"version"
:
"0.0.1"
,
"resolved"
:
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
,
...
...
@@ -2651,6 +2732,11 @@
"resolved"
:
"https://registry.npmjs.org/delay/-/delay-5.0.0.tgz"
,
"integrity"
:
"sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="
},
"delayed-stream"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
,
"integrity"
:
"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"dir-glob"
:
{
"version"
:
"3.0.1"
,
"resolved"
:
"https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
,
...
...
@@ -2964,26 +3050,18 @@
"dev"
:
true
},
"follow-redirects"
:
{
"version"
:
"1.5.10"
,
"resolved"
:
"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz"
,
"integrity"
:
"sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ=="
,
"version"
:
"1.15.2"
,
"resolved"
:
"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"
,
"integrity"
:
"sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
},
"form-data"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz"
,
"integrity"
:
"sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww=="
,
"requires"
:
{
"debug"
:
"=3.1.0"
},
"dependencies"
:
{
"debug"
:
{
"version"
:
"3.1.0"
,
"resolved"
:
"https://registry.npmjs.org/debug/-/debug-3.1.0.tgz"
,
"integrity"
:
"sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g=="
,
"requires"
:
{
"ms"
:
"2.0.0"
}
},
"ms"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
,
"integrity"
:
"sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
"asynckit"
:
"^0.4.0"
,
"combined-stream"
:
"^1.0.8"
,
"mime-types"
:
"^2.1.12"
}
},
"fs.realpath"
:
{
...
...
@@ -3260,6 +3338,19 @@
"picomatch"
:
"^2.2.3"
}
},
"mime-db"
:
{
"version"
:
"1.52.0"
,
"resolved"
:
"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
,
"integrity"
:
"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types"
:
{
"version"
:
"2.1.35"
,
"resolved"
:
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
,
"integrity"
:
"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="
,
"requires"
:
{
"mime-db"
:
"1.52.0"
}
},
"minimatch"
:
{
"version"
:
"3.0.4"
,
"resolved"
:
"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
,
...
...
@@ -3325,15 +3416,22 @@
"requires"
:
{
"eventemitter3"
:
"^4.0.4"
,
"p-timeout"
:
"^3.2.0"
},
"dependencies"
:
{
"p-timeout"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz"
,
"integrity"
:
"sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="
,
"requires"
:
{
"p-finally"
:
"^1.0.0"
}
}
}
},
"p-timeout"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz"
,
"integrity"
:
"sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="
,
"requires"
:
{
"p-finally"
:
"^1.0.0"
}
"version"
:
"4.1.0"
,
"resolved"
:
"https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz"
,
"integrity"
:
"sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw=="
},
"parent-module"
:
{
"version"
:
"1.0.1"
,
...
...
@@ -3395,6 +3493,11 @@
"integrity"
:
"sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
,
"dev"
:
true
},
"proxy-from-env"
:
{
"version"
:
"1.1.0"
,
"resolved"
:
"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
,
"integrity"
:
"sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"punycode"
:
{
"version"
:
"2.1.1"
,
"resolved"
:
"https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
,
...
...
package.json
View file @
2ada27de
...
...
@@ -18,11 +18,12 @@
"
@types/cron
"
:
"
^1.7.2
"
,
"
@types/q
"
:
"
^1.5.4
"
,
"
@types/yaml
"
:
"
^1.9.7
"
,
"
axios
"
:
"
^
0.19.2
"
,
"
axios
"
:
"
^
1.3.4
"
,
"
delay
"
:
"
^5.0.0
"
,
"
icmp
"
:
"
^2.0.1
"
,
"
lodash
"
:
"
^4.17.21
"
,
"
p-queue
"
:
"
6.6.2
"
,
"
p-timeout
"
:
"
4.1.0
"
,
"
q
"
:
"
^1.5.1
"
,
"
yaml
"
:
"
^1.10.0
"
},
...
...
run.ts
View file @
2ada27de
...
...
@@ -9,6 +9,7 @@ import { ping } from 'icmp';
import
delay
from
'
delay
'
;
import
PQueue
from
'
p-queue
'
;
import
https
from
'
https
'
;
import
pTimeout
from
'
p-timeout
'
;
interface
Source
{
protocol
:
string
;
...
...
@@ -280,7 +281,7 @@ class Checker {
const
socket
=
new
net
.
Socket
();
socket
.
connect
(
port
,
address
);
socket
.
setTimeout
(
this
.
config
.
timeout
||
1000
);
socket
.
setTimeout
(
this
.
config
.
timeout
);
socket
.
on
(
'
connect
'
,
()
=>
{
socket
.
destroy
();
...
...
@@ -463,11 +464,18 @@ class Checker {
);
let
lastResult
:
ConnectResult
;
for
(
let
i
=
1
;
i
<=
this
.
config
.
retryCount
;
++
i
)
{
const
result
=
await
checkMethodFunction
(
source
,
address
);
if
(
result
==
ConnectResult
.
Good
)
{
return
result
;
const
prom
=
checkMethodFunction
(
source
,
address
);
try
{
lastResult
=
await
pTimeout
(
prom
,
this
.
config
.
timeout
*
2
+
1000
);
}
catch
(
e
)
{
this
.
message
(
`Connection
${
this
.
getSourcePattern
(
source
,
address
)}
timeout.`
,
);
lastResult
=
ConnectResult
.
CDNBad
;
}
if
(
lastResult
==
ConnectResult
.
Good
)
{
return
lastResult
;
}
lastResult
=
result
;
}
if
(
lastResult
===
ConnectResult
.
CDNBad
)
{
this
.
message
(
...
...
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