test.qbk 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. [article Document To Test Formatting
  2. [quickbook 1.4]
  3. [copyright 2007 John Maddock, Joel de Guzman, Eric Niebler and Matias Capeletto]
  4. [purpose Test Formatting Document]
  5. [license
  6. Distributed under the Boost Software License, Version 1.0.
  7. (See accompanying file LICENSE_1_0.txt or copy at
  8. [@http://www.boost.org/LICENSE_1_0.txt])
  9. ]
  10. [authors [Maddock, John], [de Guzman, Joel], [Niebler, Eric], [Capeletto, Matias] ]
  11. [category math]
  12. [/last-revision $Date: 2007-05-07 10:21:52 +0100 (Mon, 07 May 2007) $]
  13. ]
  14. [include HTML4_symbols.qbk]
  15. [/ Some composite templates]
  16. [template super[x]'''<superscript>'''[x]'''</superscript>''']
  17. [template sub[x]'''<subscript>'''[x]'''</subscript>''']
  18. [template floor[x]'''&#x230A;'''[x]'''&#x230B;''']
  19. [template floorlr[x][lfloor][x][rfloor]]
  20. [template ceil[x] '''&#x2308;'''[x]'''&#x2309;''']
  21. [section Introduction]
  22. This document is purely a test case to test out HTML and PDF generation and style.
  23. This is some body text.
  24. int main()
  25. {
  26. double d = 2.345;
  27. return d;
  28. }
  29. We can count in Greek too: [alpha], [beta], [gamma].
  30. Try some superscrips and subscripts: x[super 2], x[sub i][super 3], [alpha][super 2],
  31. [beta][super [alpha]], [floor x], [floor [alpha]], [ceil a].
  32. [endsect]
  33. [section Code Blocks]
  34. [section Embedded code]
  35. These should be syntax highlighted:
  36. #include <iostream>
  37. int main()
  38. {
  39. // Sample code
  40. std::cout << "Hello, World\n";
  41. return 0;
  42. }
  43. [endsect]
  44. [section Code With a Very Long Line]
  45. template <class RealType> RealType inline foo(const RealType& a, const RealType& b, const RealType& c, const RealType& d, const RealType& e, const RealType& f, const RealType& g, const RealType& h){ return 0; }
  46. [endsect]
  47. [section Imported code and callouts]
  48. [import stub.cpp]
  49. Here's some code with left-placed callouts:
  50. [class_]
  51. And again with callouts placed exactly where we put them:
  52. [foo_bar]
  53. [endsect]
  54. [section Larger example]
  55. Now let's include a larger example, this may span several pages
  56. and should not be chopped off half way through... some FO processors
  57. get this wrong!
  58. namespace boost{
  59. template <class BidirectionalIterator>
  60. class sub_match;
  61. typedef sub_match<const char*> csub_match;
  62. typedef sub_match<const wchar_t*> wcsub_match;
  63. typedef sub_match<std::string::const_iterator> ssub_match;
  64. typedef sub_match<std::wstring::const_iterator> wssub_match;
  65. template <class BidirectionalIterator>
  66. class sub_match : public std::pair<BidirectionalIterator, BidirectionalIterator>
  67. {
  68. public:
  69. typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
  70. typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
  71. typedef BidirectionalIterator iterator;
  72. bool matched;
  73. difference_type length()const;
  74. operator basic_string<value_type>()const;
  75. basic_string<value_type> str()const;
  76. int compare(const sub_match& s)const;
  77. int compare(const basic_string<value_type>& s)const;
  78. int compare(const value_type* s)const;
  79. #ifdef BOOST_REGEX_MATCH_EXTRA
  80. typedef implementation-private capture_sequence_type;
  81. const capture_sequence_type& captures()const;
  82. #endif
  83. };
  84. //
  85. // comparisons to another sub_match:
  86. //
  87. template <class BidirectionalIterator>
  88. bool operator == (const sub_match<BidirectionalIterator>& lhs,
  89. const sub_match<BidirectionalIterator>& rhs);
  90. template <class BidirectionalIterator>
  91. bool operator != (const sub_match<BidirectionalIterator>& lhs,
  92. const sub_match<BidirectionalIterator>& rhs);
  93. template <class BidirectionalIterator>
  94. bool operator < (const sub_match<BidirectionalIterator>& lhs,
  95. const sub_match<BidirectionalIterator>& rhs);
  96. template <class BidirectionalIterator>
  97. bool operator <= (const sub_match<BidirectionalIterator>& lhs,
  98. const sub_match<BidirectionalIterator>& rhs);
  99. template <class BidirectionalIterator>
  100. bool operator >= (const sub_match<BidirectionalIterator>& lhs,
  101. const sub_match<BidirectionalIterator>& rhs);
  102. template <class BidirectionalIterator>
  103. bool operator > (const sub_match<BidirectionalIterator>& lhs,
  104. const sub_match<BidirectionalIterator>& rhs);
  105. //
  106. // comparisons to a basic_string:
  107. //
  108. template <class BidirectionalIterator, class traits, class Allocator>
  109. bool operator == (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  110. traits,
  111. Allocator>& lhs,
  112. const sub_match<BidirectionalIterator>& rhs);
  113. template <class BidirectionalIterator, class traits, class Allocator>
  114. bool operator != (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  115. traits,
  116. Allocator>& lhs,
  117. const sub_match<BidirectionalIterator>& rhs);
  118. template <class BidirectionalIterator, class traits, class Allocator>
  119. bool operator < (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  120. traits,
  121. Allocator>& lhs,
  122. const sub_match<BidirectionalIterator>& rhs);
  123. template <class BidirectionalIterator, class traits, class Allocator>
  124. bool operator > (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  125. traits,
  126. Allocator>& lhs,
  127. const sub_match<BidirectionalIterator>& rhs);
  128. template <class BidirectionalIterator, class traits, class Allocator>
  129. bool operator >= (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  130. traits,
  131. Allocator>& lhs,
  132. const sub_match<BidirectionalIterator>& rhs);
  133. template <class BidirectionalIterator, class traits, class Allocator>
  134. bool operator <= (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  135. traits,
  136. Allocator>& lhs,
  137. const sub_match<BidirectionalIterator>& rhs);
  138. template <class BidirectionalIterator, class traits, class Allocator>
  139. bool operator == (const sub_match<BidirectionalIterator>& lhs,
  140. const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  141. traits,
  142. Allocator>& rhs);
  143. template <class BidirectionalIterator, class traits, class Allocator>
  144. bool operator != (const sub_match<BidirectionalIterator>& lhs,
  145. const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  146. traits,
  147. Allocator>& rhs);
  148. template <class BidirectionalIterator, class traits, class Allocator>
  149. bool operator < (const sub_match<BidirectionalIterator>& lhs,
  150. const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  151. traits,
  152. Allocator>& rhs);
  153. template <class BidirectionalIterator, class traits, class Allocator>
  154. bool operator > (const sub_match<BidirectionalIterator>& lhs,
  155. const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  156. traits,
  157. Allocator>& rhs);
  158. template <class BidirectionalIterator, class traits, class Allocator>
  159. bool operator >= (const sub_match<BidirectionalIterator>& lhs,
  160. const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  161. traits,
  162. Allocator>& rhs);
  163. template <class BidirectionalIterator, class traits, class Allocator>
  164. bool operator <= (const sub_match<BidirectionalIterator>& lhs,
  165. const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
  166. traits,
  167. Allocator>& rhs);
  168. //
  169. // comparisons to a pointer to a character array:
  170. //
  171. template <class BidirectionalIterator>
  172. bool operator == (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
  173. const sub_match<BidirectionalIterator>& rhs);
  174. template <class BidirectionalIterator>
  175. bool operator != (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
  176. const sub_match<BidirectionalIterator>& rhs);
  177. template <class BidirectionalIterator>
  178. bool operator < (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
  179. const sub_match<BidirectionalIterator>& rhs);
  180. template <class BidirectionalIterator>
  181. bool operator > (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
  182. const sub_match<BidirectionalIterator>& rhs);
  183. template <class BidirectionalIterator>
  184. bool operator >= (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
  185. const sub_match<BidirectionalIterator>& rhs);
  186. template <class BidirectionalIterator>
  187. bool operator <= (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
  188. const sub_match<BidirectionalIterator>& rhs);
  189. template <class BidirectionalIterator>
  190. bool operator == (const sub_match<BidirectionalIterator>& lhs,
  191. typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
  192. template <class BidirectionalIterator>
  193. bool operator != (const sub_match<BidirectionalIterator>& lhs,
  194. typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
  195. template <class BidirectionalIterator>
  196. bool operator < (const sub_match<BidirectionalIterator>& lhs,
  197. typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
  198. template <class BidirectionalIterator>
  199. bool operator > (const sub_match<BidirectionalIterator>& lhs,
  200. typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
  201. template <class BidirectionalIterator>
  202. bool operator >= (const sub_match<BidirectionalIterator>& lhs,
  203. typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
  204. template <class BidirectionalIterator>
  205. bool operator <= (const sub_match<BidirectionalIterator>& lhs,
  206. typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
  207. //
  208. // comparisons to a single character:
  209. //
  210. template <class BidirectionalIterator>
  211. bool operator == (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
  212. const sub_match<BidirectionalIterator>& rhs);
  213. template <class BidirectionalIterator>
  214. bool operator != (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
  215. const sub_match<BidirectionalIterator>& rhs);
  216. template <class BidirectionalIterator>
  217. bool operator < (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
  218. const sub_match<BidirectionalIterator>& rhs);
  219. template <class BidirectionalIterator>
  220. bool operator > (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
  221. const sub_match<BidirectionalIterator>& rhs);
  222. template <class BidirectionalIterator>
  223. bool operator >= (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
  224. const sub_match<BidirectionalIterator>& rhs);
  225. template <class BidirectionalIterator>
  226. bool operator <= (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
  227. const sub_match<BidirectionalIterator>& rhs);
  228. template <class BidirectionalIterator>
  229. bool operator == (const sub_match<BidirectionalIterator>& lhs,
  230. typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
  231. template <class BidirectionalIterator>
  232. bool operator != (const sub_match<BidirectionalIterator>& lhs,
  233. typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
  234. template <class BidirectionalIterator>
  235. bool operator < (const sub_match<BidirectionalIterator>& lhs,
  236. typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
  237. template <class BidirectionalIterator>
  238. bool operator > (const sub_match<BidirectionalIterator>& lhs,
  239. typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
  240. template <class BidirectionalIterator>
  241. bool operator >= (const sub_match<BidirectionalIterator>& lhs,
  242. typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
  243. template <class BidirectionalIterator>
  244. bool operator <= (const sub_match<BidirectionalIterator>& lhs,
  245. typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
  246. //
  247. // addition operators:
  248. //
  249. template <class BidirectionalIterator, class traits, class Allocator>
  250. std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>
  251. operator + (const std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type,
  252. traits,
  253. Allocator>& s,
  254. const sub_match<BidirectionalIterator>& m);
  255. template <class BidirectionalIterator, class traits, class Allocator>
  256. std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>
  257. operator + (const sub_match<BidirectionalIterator>& m,
  258. const std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type,
  259. traits,
  260. Allocator>& s);
  261. template <class BidirectionalIterator>
  262. std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
  263. operator + (typename iterator_traits<BidirectionalIterator>::value_type const* s,
  264. const sub_match<BidirectionalIterator>& m);
  265. template <class BidirectionalIterator>
  266. std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
  267. operator + (const sub_match<BidirectionalIterator>& m,
  268. typename iterator_traits<BidirectionalIterator>::value_type const * s);
  269. template <class BidirectionalIterator>
  270. std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
  271. operator + (typename iterator_traits<BidirectionalIterator>::value_type const& s,
  272. const sub_match<BidirectionalIterator>& m);
  273. template <class BidirectionalIterator>
  274. std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
  275. operator + (const sub_match<BidirectionalIterator>& m,
  276. typename iterator_traits<BidirectionalIterator>::value_type const& s);
  277. template <class BidirectionalIterator>
  278. std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
  279. operator + (const sub_match<BidirectionalIterator>& m1,
  280. const sub_match<BidirectionalIterator>& m2);
  281. //
  282. // stream inserter:
  283. //
  284. template <class charT, class traits, class BidirectionalIterator>
  285. basic_ostream<charT, traits>&
  286. operator << (basic_ostream<charT, traits>& os,
  287. const sub_match<BidirectionalIterator>& m);
  288. } // namespace boost
  289. [endsect]
  290. [endsect]
  291. [section Basic Formatting]
  292. [section Font Styles]
  293. Here we go with some inline formatting:
  294. ['italic], [*bold], [_underline], [^teletype], [-strikethrough],
  295. we can combine styles as well: ['[*bold italic]], [_[^teletype with underline]].
  296. [endsect]
  297. [section Replaceable Text]
  298. Text that is intended to be user-replaceable is [~rendered like this].
  299. [endsect]
  300. [section Quotations]
  301. Here we go: ["A question that sometimes drives me hazy: am I or are the others crazy?]--Einstein
  302. Note the proper left and right quote marks. Also, while you can simply use ordinary quote marks like "quoted", our quotation, above, will generate correct DocBook quotations (e.g. <quote>quoted</quote>).
  303. Like all phrase elements, quotations may be nested. Example:
  304. ["Here's the rule for bargains: ["Do other men, for they would do you.] That's
  305. the true business precept.]
  306. [endsect]
  307. [section Inline Code]
  308. This text has inlined code `int main() { return 0; }` in it.
  309. The code should be syntax highlighted.
  310. [endsect]
  311. [section Links]
  312. Try this: [@http://www.boost.org this is [*boost's] website....] it should
  313. be visible as a link.
  314. This is [@../../../boost/math/distributions.hpp a link to a header file (boost/math/distributions.hpp)],
  315. it should be rewritable and point to the website when built as a PDF.
  316. This is [@boost:libs/regex/index.html a link to another library's documentation (Boost.Regex)], using the boost: protocol,
  317. it should be rewritten to point to the website when building a PDF.
  318. This is [@boost:/libs/regex/index.html a link to another library's documentation (Boost.Regex)], using the boost:/ protocol,
  319. it should be rewritten to point to the website when building a PDF.
  320. This is [@../weighted_tail_quantile.hpp a relative link to a header file within the test source],
  321. it should be rewritten to point to the website when building a PDF.
  322. Although it might be on the website yet.
  323. [endsect]
  324. [section Footnotes]
  325. Here's one [footnote A sample footnote].
  326. And here's another [footnote Another sample footnote].
  327. [endsect]
  328. [section Blockquote]
  329. Lets indent the next paragraph:
  330. [:Here we go!!!]
  331. [endsect]
  332. [section Headings]
  333. Now try rendering some heading styles:
  334. [h1 Heading 1]
  335. [h2 Heading 2]
  336. [h3 Heading 3]
  337. [h4 Heading 4]
  338. [h5 Heading 5]
  339. [h6 Heading 6]
  340. [endsect]
  341. [endsect]
  342. [section Blurbs]
  343. [section Preformatted text]
  344. Here's some sample program output:
  345. [pre
  346. '''F test for equal standard deviations
  347. ____________________________________
  348. Sample 1:
  349. Number of Observations = 240
  350. Sample Standard Deviation = 65.549
  351. Sample 2:
  352. Number of Observations = 240
  353. Sample Standard Deviation = 61.854
  354. Test Statistic = 1.123
  355. CDF of test statistic: = 8.148e-001
  356. Upper Critical Value at alpha: = 1.238e+000
  357. Upper Critical Value at alpha/2: = 1.289e+000
  358. Lower Critical Value at alpha: = 8.080e-001
  359. Lower Critical Value at alpha/2: = 7.756e-001
  360. Results for Alternative Hypothesis and alpha = 0.0500
  361. Alternative Hypothesis Conclusion
  362. Standard deviations are unequal (two sided test) REJECTED
  363. Standard deviation 1 is less than standard deviation 2 REJECTED
  364. Standard deviation 1 is greater than standard deviation 2 REJECTED'''
  365. ]
  366. [endsect]
  367. [section Admonishments]
  368. There are four admonishments supported by Docbook XML:
  369. [note This is a note]
  370. [tip This is a tip]
  371. [important This is important]
  372. [caution This is a caution]
  373. [warning This is a warning
  374. They can contain more than one paragraph.
  375. ]
  376. [endsect]
  377. [section Blurbs]
  378. [blurb [*An eye catching advertisement or note...]
  379. These should be rendered in a manner similar to admonishments.
  380. They can contain more than one paragraph.
  381. ]
  382. [endsect]
  383. [endsect]
  384. [section Lists and Tables]
  385. [section Lists]
  386. A numbered list:
  387. # One
  388. # Two
  389. # Three
  390. # Three.a
  391. # Three.b
  392. # Three.c
  393. # Four
  394. # Four.a
  395. # Four.a.i
  396. # Four.a.ii
  397. # Five
  398. An unordered list:
  399. * First
  400. * Second
  401. * Third
  402. A mixture of the two:
  403. # 1
  404. * 1.a
  405. # 1.a.1
  406. # 1.a.2
  407. * 1.b
  408. # 2
  409. * 2.a
  410. * 2.b
  411. # 2.b.1
  412. # 2.b.2
  413. * 2.b.2.a
  414. * 2.b.2.b
  415. [endsect]
  416. [section Variable Lists]
  417. [variablelist A Variable List
  418. [[term 1] [The definition of term 1]]
  419. [[term 2] [The definition of term 2]]
  420. [[term 3] [The definition of term 3]]
  421. ]
  422. [endsect]
  423. [section Tables]
  424. Here's a big table with code and other tricky things:
  425. [table Notes on the Implementation of the Beta Distribution
  426. [[Function][Implementation Notes]]
  427. [[pdf]
  428. [f(x;[alpha],[beta]) = x[super[alpha] - 1] (1 - x)[super[beta] -1] / B([alpha], [beta])
  429. Implemented using ibeta_derivative(a, b, x).]]
  430. [[cdf][Using the incomplete beta function ibeta(a, b, x)]]
  431. [[cdf complement][ibetac(a, b, x)]]
  432. [[quantile][Using the inverse incomplete beta function ibeta_inv(a, b, p)]]
  433. [[quantile from the complement][ibetac_inv(a, b, q)]]
  434. [[mean][`a/(a+b)`]]
  435. [[variance][`a * b / (a+b)^2 * (a + b + 1)`]]
  436. [[mode][`(a-1) / (a + b + 2)`]]
  437. [[skewness][`2 (b-a) sqrt(a+b+1)/(a+b+2) * sqrt(a * b)`]]
  438. [[kurtosis excess][ [$images/beta_dist_kurtosis.png] ]]
  439. [[kurtosis][`kurtosis + 3`]]
  440. [[parameter estimation][ ]]
  441. [[alpha
  442. from mean and variance][`mean * (( (mean * (1 - mean)) / variance)- 1)`]]
  443. [[beta
  444. from mean and variance][`(1 - mean) * (((mean * (1 - mean)) /variance)-1)`]]
  445. [[The member functions `estimate_alpha` and `estimate_beta`
  446. from cdf and probability x
  447. and *either* `alpha` or `beta`]
  448. [Implemented in terms of the inverse incomplete beta functions
  449. ibeta_inva, and ibeta_invb respectively.]]
  450. [[`estimate_alpha`][`ibeta_inva(beta, x, probability)`]]
  451. [[`estimate_beta`][`ibeta_invb(alpha, x, probability)`]]
  452. ]
  453. [endsect]
  454. [endsect]
  455. [section Images]
  456. These are tricky enough that they warrent their own section.
  457. Let's start with a PNG file that's set to 120dpi, it should render at
  458. a sensible size in both html and PDF forms. It should print OK too!
  459. [$images/digamma3.png]
  460. Now try again with a sample SVG image:
  461. [$images/open_clipart_library_logo.svg]
  462. [endsect]
  463. [include test_HTML4_symbols.qbk]
  464. [include remez.qbk]
  465. [section:array Array Example Boostbook XML Documentation]
  466. [xinclude array.xml]
  467. [xinclude array1.xml]
  468. [xinclude array2.xml]
  469. [xinclude array3.xml]
  470. [xinclude array4.xml]
  471. [endsect]
  472. [section:accumulators Accumulators Example Doxygen Documentation]
  473. [xinclude statsdoc.xml]
  474. [endsect]
粤ICP备19079148号