Advertisement
Guest User

Untitled

a guest
Oct 29th, 2014
512
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.25 KB | None | 0 0
  1. ## NOTE: DO NOT CHANGE THIS FILE, EDIT local.cfg ##
  2.  
  3. ####### Flags #######
  4. flags
  5. FLAG_INTERNALLY_SOURCED: 1,
  6. FLAG_ASSOCIATE_SERVER: 2,
  7. FLAG_SKIP_NAT_CORRECTION: 3,
  8. FLAG_ASSOCIATE_USER: 4,
  9. FLAG_TRUSTED_SOURCE: 5,
  10. FLAG_SESSION_PROGRESS: 6;
  11.  
  12. ####### Global Parameters #########
  13. fork = yes
  14. children = 25
  15. server_signature = no
  16. server_header = "Server: Kazoo"
  17. user_agent_header = "User-Agent: Kazoo"
  18. shm_force_alloc = yes
  19. mlock_pages = yes
  20. phone2tel = 1
  21. max_while_loops = 500
  22.  
  23. ####### Logging Parameters #########
  24. debug = L_INFO
  25. memdbg = 10
  26. memlog = 10
  27. corelog = L_ERR
  28. log_stderror = no
  29. log_facility = LOG_LOCAL0
  30. log_name="kamailio"
  31.  
  32. ####### Alias Parameters #########
  33. auto_aliases = yes
  34.  
  35. ####### Binding Parameters #########
  36. tos = IPTOS_LOWDELAY
  37.  
  38. ####### TCP Parameters #########
  39. tcp_children = 25
  40. disable_tcp = no
  41. tcp_max_connections = 4096
  42. tcp_connection_lifetime = 3605
  43. tcp_accept_aliases = no
  44. tcp_async = yes
  45. tcp_connect_timeout = 10
  46. tcp_conn_wq_max = 65536
  47. tcp_crlf_ping = yes
  48. tcp_delayed_ack = yes
  49. tcp_fd_cache = yes
  50. tcp_keepalive = yes
  51. tcp_keepcnt = 3
  52. tcp_keepidle = 30
  53. tcp_keepintvl = 10
  54. tcp_linger2 = 30
  55. tcp_rd_buf_size = 80000
  56. tcp_send_timeout = 10
  57. tcp_wq_blk_size = 2100
  58. tcp_wq_max = 10485760
  59.  
  60. ####### UDP Parameters #########
  61. udp4_raw = -1
  62.  
  63. ####### DNS Parameters #########
  64. dns = no
  65. rev_dns = no
  66. dns_try_ipv6 = no
  67. use_dns_cache = on
  68. dns_cache_del_nonexp = no
  69. dns_cache_flags = 1
  70. dns_cache_gc_interval = 120
  71. dns_cache_init = 1
  72. dns_cache_mem = 1000
  73. dns_cache_negative_ttl = 60
  74. dns_try_naptr = no
  75. use_dns_failover = off
  76. dns_srv_lb = off
  77.  
  78. ####### SCTP Parameters #########
  79. disable_sctp = yes
  80.  
  81. ####### Modules Section ########
  82. mpath="/usr/lib64/kamailio/modules/"
  83.  
  84. ######## Kamailio core extensions module ########
  85. loadmodule "kex.so"
  86.  
  87. ######## Transaction (stateful) module ########
  88. loadmodule "tm.so"
  89. loadmodule "tmx.so"
  90. modparam("tm", "auto_inv_100", 1)
  91. modparam("tm", "auto_inv_100_reason", "Attempting to connect your call")
  92. modparam("tm", "cancel_b_method", 2)
  93. modparam("tm", "ruri_matching", 0)
  94. modparam("tm", "failure_reply_mode", 3)
  95. # modparam("tm", "fr_timer", 30000)
  96. # modparam("tm", "fr_inv_timer", 120000)
  97.  
  98. ######## Stateless replier module ########
  99. loadmodule "sl.so"
  100.  
  101. ######## Record-Route and Route module ########
  102. loadmodule "rr.so"
  103. modparam("rr", "enable_full_lr", 1)
  104. modparam("rr", "enable_double_rr", 1)
  105.  
  106. ######## Max-Forward processor module ########
  107. loadmodule "maxfwd.so"
  108. modparam("maxfwd", "max_limit", 50)
  109.  
  110. ######## SIP utilities [requires sl] ########
  111. loadmodule "siputils.so"
  112.  
  113. ######## SIP message formatting sanity checks [requires sl] ########
  114. loadmodule "sanity.so"
  115. # sip_version, scheme, req_headers, cseq_method/value
  116. # content_length, parse_uri, digest
  117. modparam("sanity", "default_checks", 3303)
  118. modparam("sanity", "uri_checks", 3)
  119. modparam("sanity", "autodrop", 0)
  120.  
  121. ######## Text operations module ########
  122. loadmodule "textops.so"
  123. loadmodule "textopsx.so"
  124.  
  125. ######## Generic Hash Table container in shared memory ########
  126. loadmodule "htable.so"
  127. modparam("htable", "htable", "associations=>size=16;autoexpire=7200")
  128. modparam("htable", "htable", "redirects=>size=16;autoexpire=5")
  129.  
  130. ######## Pseudo-Variables module ########
  131. loadmodule "pv.so"
  132.  
  133. ######## Advanced logger module ########
  134. loadmodule "xlog.so"
  135.  
  136. ####### FIFO support for Management Interface ########
  137. loadmodule "mi_fifo.so"
  138. modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
  139.  
  140. ######## UAC Redirection module ########
  141. loadmodule "uac_redirect.so"
  142.  
  143. ######## DoS prevention mdule ########
  144. loadmodule "pike.so"
  145.  
  146. ####### DB Text module ##########
  147. loadmodule "db_text.so"
  148. modparam("db_text", "db_mode", 1)
  149.  
  150. ####### Kazoo Integration module ##########
  151. loadmodule "db_kazoo.so"
  152. modparam("db_kazoo", "node_hostname", "MY_HOSTNAME")
  153.  
  154. ####### Role Configurations ##########
  155. #!ifdef DISPATCHER-ROLE
  156. include_file "dispatcher-role.cfg"
  157. #!endif
  158. #!ifdef REGISTRAR-ROLE
  159. include_file "registrar-role.cfg"
  160. #!endif
  161. #!ifdef PRESENCE-ROLE
  162. include_file "presence-role.cfg"
  163. #!endif
  164. #!ifdef NAT-TRAVERSAL-ROLE
  165. include_file "nat-traversal-role.cfg"
  166. #!endif
  167. #!ifdef WEBSOCKETS-ROLE
  168. include_file "websockets-role.cfg"
  169. #!endif
  170. #!ifdef TLS-ROLE
  171. include_file "tls-role.cfg"
  172. #!endif
  173. #!ifdef ACCOUNTING-ROLE
  174. include_file "accounting-role.cfg"
  175. #!endif
  176.  
  177. ####### Permissions module ##########
  178. loadmodule "permissions.so"
  179. modparam("permissions", "db_url", "text:///etc/kazoo/kamailio/dbtext")
  180. modparam("permissions", "db_mode", 1)
  181.  
  182. ####### Routing Logic ########
  183. route
  184. {
  185. # log the basic info regarding this call
  186. xlog("L_INFO", "$ci|start|recieved $oP request $rm $ou");
  187. xlog("L_INFO", "$ci|log|source $si:$sp");
  188. xlog("L_INFO", "$ci|log|from $fu");
  189. xlog("L_INFO", "$ci|log|to $tu");
  190.  
  191. route(SANITY_CHECK);
  192.  
  193. #!ifdef DISPATCHER-ROLE
  194. route(DISPATCHER_CLASSIFY_SOURCE);
  195. #!endif
  196.  
  197. #!ifdef TRAFFIC-FILTER-ROLE
  198. route(DOS_PREVENTION);
  199. #!endif
  200.  
  201. #!ifdef WEBSOCKETS-ROLE
  202. route(HANDLE_WEBSOCKETS);
  203. #!endif
  204.  
  205. route(HANDLE_OPTIONS);
  206.  
  207. route(HANDLE_NOTIFY);
  208.  
  209. route(HANDLE_MESSAGE);
  210.  
  211. route(HANDLE_MOVE_REQUEST);
  212.  
  213. #!ifdef PRESENCE-ROLE
  214. route(HANDLE_SUBSCRIBE);
  215. route(HANDLE_PUBLISH);
  216. #!endif
  217.  
  218. #!ifdef REGISTRAR-ROLE
  219. route(HANDLE_REGISTER);
  220. #!endif
  221.  
  222. route(HANDLE_IN_DIALOG_REQUESTS);
  223.  
  224. route(PREPARE_INITIAL_REQUESTS);
  225.  
  226. if (isflagset(FLAG_INTERNALLY_SOURCED)) {
  227. route(INTERNAL_TO_EXTERNAL_RELAY);
  228. exit();
  229. }
  230.  
  231. #!ifdef DISPATCHER-ROLE
  232. route(DISPATCHER_FIND_ROUTES);
  233. #!endif
  234.  
  235. route(EXTERNAL_TO_INTERNAL_RELAY);
  236. }
  237.  
  238. route[SANITY_CHECK]
  239. {
  240. if (!mf_process_maxfwd_header("10")) {
  241. xlog("L_WARN", "$ci|end|too much hops, not enough barley");
  242. send_reply("483", "Too Many Hops");
  243. exit;
  244. }
  245.  
  246. if (!sanity_check()) {
  247. xlog("L_WARN", "$ci|end|message is insane");
  248. exit;
  249. }
  250.  
  251. if ($ua == "friendly-scanner" ||
  252. $ua == "sundayddr" ||
  253. $ua =~ "sipcli" ) {
  254. xlog("L_WARN", "$ci|end|dropping message with user-agent $ua");
  255. exit;
  256. }
  257. }
  258.  
  259. route[HANDLE_OPTIONS]
  260. {
  261. if (is_method("OPTIONS")) {
  262. if (isflagset(FLAG_INTERNALLY_SOURCED)) {
  263. route(INTERNAL_TO_EXTERNAL_RELAY);
  264. #!ifdef TRAFFIC-FILTER-ROLE
  265. } else if (!isflagset(FLAG_TRUSTED_SOURCE)
  266. && $rd =~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}") {
  267. xlog("L_WARN", "$ci|end|dropping OPTIONS request with IP domain");
  268. #!endif
  269. } else {
  270. sl_send_reply("200", "Rawr!!");
  271. }
  272. exit;
  273. }
  274. }
  275.  
  276. route[HANDLE_NOTIFY]
  277. {
  278. if (is_method("NOTIFY")) {
  279. if (isflagset(FLAG_INTERNALLY_SOURCED)) {
  280. route(INTERNAL_TO_EXTERNAL_RELAY);
  281. #!ifdef TRAFFIC-FILTER-ROLE
  282. } else if (!isflagset(FLAG_TRUSTED_SOURCE)
  283. && $rd =~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}") {
  284. xlog("L_WARN", "$ci|end|dropping OPTIONS request with IP domain");
  285. #!endif
  286. } else {
  287. sl_send_reply("200", "Rawr!!");
  288. }
  289. exit;
  290. }
  291. }
  292.  
  293. route[HANDLE_MESSAGE]
  294. {
  295. if (is_method("MESSAGE")) {
  296. if (isflagset(FLAG_INTERNALLY_SOURCED)) {
  297. route(INTERNAL_TO_EXTERNAL_RELAY);
  298. } else {
  299. sl_send_reply("202", "delivered to /dev/null");
  300. exit;
  301. }
  302. }
  303. }
  304.  
  305. route[HANDLE_MOVE_REQUEST]
  306. {
  307. if (is_method("INVITE") && $rU == "*6683*") {
  308. $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host});
  309.  
  310. if ($sht(associations=>$var(contact_uri)) != $null) {
  311. $sht(associations=>$var(contact_uri)) = $null;
  312. xlog("L_INFO", "$ci|log|removed contact association for $var(contact_uri)
  313. with media server $sht(associations=>$var(contact_uri))");
  314. }
  315.  
  316. send_reply("503", "Removed association");
  317.  
  318. exit;
  319. }
  320. }
  321.  
  322. route[HANDLE_IN_DIALOG_REQUESTS]
  323. {
  324. if (has_totag()) {
  325. if (is_method("INVITE")) {
  326. record_route();
  327. }
  328. if (loose_route()) {
  329. #!ifdef ACCOUNTING-ROLE
  330. if (is_method("BYE")) {
  331. setflag(FLAG_ACC);
  332. setflag(FLAG_ACCFAILED);
  333. }
  334. #!endif
  335.  
  336. #!ifdef WEBSOCKETS-ROLE
  337. if ($du == $null) {
  338. handle_ruri_alias();
  339. switch ($rc) {
  340. case -1:
  341. xlog("L_ERR", "$ci|stop|failed to handle alias of R-URI $ru\n");
  342. send_reply("400", "Bad request");
  343. exit;
  344. case 1:
  345. xlog("L_INFO", "$ci|log|loose_route in-dialog message with alias $du");
  346. break;
  347. case 2:
  348. xlog("L_INFO", "$ci|log|loose_route in-dialog message with alias $du");
  349. break;
  350. }
  351. }
  352. #!endif
  353.  
  354. xlog("L_INFO", "$ci|log|loose_route in-dialog message");
  355. # Called on in-dialog requests
  356. # If the request in an Invite for on hold from external to internal,
  357. # associate the contact with the media server
  358. # if Invite for on hold, we need to associate the contact URI with the next hop
  359. if (is_method("INVITE") && !isflagset(FLAG_INTERNALLY_SOURCED) && is_audio_on_hold()) {
  360. setflag(FLAG_ASSOCIATE_USER);
  361. }
  362. route(RELAY);
  363. } else if (isflagset(FLAG_INTERNALLY_SOURCED)) {
  364. xlog("L_INFO", "$ci|log|relay internally sourced in-dialog message without loose_route");
  365. route(RELAY);
  366. } else if (t_check_trans()) {
  367. xlog("L_INFO", "$ci|log|allow message for a known transaction");
  368. route(RELAY);
  369. } else {
  370. xlog("L_INFO", "$ci|log|message had a to-tag but can't be loose routed");
  371. sl_send_reply("481", "Call Leg/Transaction Does Not Exist");
  372. }
  373. exit();
  374. }
  375. }
  376.  
  377. route[PREPARE_INITIAL_REQUESTS]
  378. {
  379. if (is_method("CANCEL")) {
  380. if (t_check_trans()) {
  381. route(RELAY);
  382. } else {
  383. sl_send_reply("481", "Call Leg/Transaction Does Not Exist");
  384. }
  385. exit();
  386. } else if (is_method("ACK")) {
  387. if (t_check_trans()) {
  388. route(RELAY);
  389. }
  390. exit();
  391. }
  392.  
  393. t_check_trans();
  394.  
  395. if (loose_route()) {
  396. xlog("L_WARN", "$ci|end|denying initial request with route-set");
  397. sl_send_reply("403", "No pre-loaded routes");
  398. exit();
  399. }
  400.  
  401. if (!is_method("MESSAGE")) {
  402. record_route();
  403. }
  404. }
  405.  
  406. route[RELAY]
  407. {
  408. if (isflagset(FLAG_INTERNALLY_SOURCED)) {
  409. route(INTERNAL_TO_EXTERNAL_RELAY);
  410. } else {
  411. route(EXTERNAL_TO_INTERNAL_RELAY);
  412. }
  413.  
  414. exit();
  415. }
  416.  
  417. route[INTERNAL_TO_EXTERNAL_RELAY]
  418. {
  419. #!ifdef ACCOUNTING-ROLE
  420. if (is_method("INVITE")) {
  421. setflag(FLAG_ACC);
  422. setflag(FLAG_ACCFAILED);
  423. }
  424. #!endif
  425.  
  426. remove_hf_re("X-.*");
  427.  
  428. t_on_reply("EXTERNAL_REPLY");
  429.  
  430. t_set_fr(0, 10000);
  431.  
  432. t_relay();
  433. }
  434.  
  435. route[EXTERNAL_TO_INTERNAL_RELAY]
  436. {
  437. #!ifdef ACCOUNTING-ROLE
  438. if (is_method("INVITE") && is_present_hf("Proxy-Authorization")) {
  439. setflag(FLAG_ACC);
  440. setflag(FLAG_ACCFAILED);
  441. }
  442. #!endif
  443.  
  444. #!ifdef NAT-TRAVERSAL-ROLE
  445. if (!isflagset(FLAG_INTERNALLY_SOURCED)) {
  446. route(NAT_TEST_AND_CORRECT);
  447. }
  448. #!endif
  449.  
  450. remove_hf_re("X-.*");
  451. append_hf("X-AUTH-IP: $si\r\n");
  452.  
  453. t_on_reply("INTERNAL_REPLY");
  454. t_on_failure("INTERNAL_FAULT");
  455.  
  456. t_set_fr(0, 1000);
  457.  
  458. t_relay();
  459. }
  460.  
  461. route[DOS_PREVENTION]
  462. {
  463. # allow request from internal network or from whitelist
  464. if (isflagset(FLAG_INTERNALLY_SOURCED) || allow_source_address(TRUSTED_ADR_GROUP) || is_myself($si)) {
  465. xlog("L_INFO", "$ci|log|request from trusted IP");
  466. setflag(FLAG_TRUSTED_SOURCE);
  467. return;
  468. }
  469.  
  470. # drop requests with no To domain or IP To domain (friendly-scanner)
  471. if (is_method("REGISTER|SUBSCRIBE|OPTIONS") &&
  472. ($td == $null || $td=~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}")) {
  473. xlog("L_WARN", "$ci|log|dropping request with IP domain in To header");
  474. exit;
  475. }
  476.  
  477. # drop Invite with IP auth realm
  478. if (is_method("INVITE") && is_present_hf("Proxy-Authorization") &&
  479. $ar =~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}" ) {
  480. xlog("L_WARN", "$ci|log|dropping request with IP domain in Proxy-Authorization header");
  481. exit;
  482. }
  483.  
  484. # use pike check for the others
  485. if (!pike_check_req()) {
  486. # If it is a new flood, emit a log
  487. if($rc == -2) {
  488. xlog("L_WARN", "$ci|log|dropping due to rate of requests from IP");
  489. }
  490. exit;
  491. }
  492. }
  493.  
  494. onreply_route[EXTERNAL_REPLY]
  495. {
  496. xlog("L_INFO", "$ci|log|external reply $T_reply_code");
  497.  
  498. #!ifdef WEBSOCKETS-ROLE
  499. route(NAT_WEBSOCKETS_CORRECT);
  500. #!endif
  501.  
  502. #!ifdef NAT-TRAVERSAL-ROLE
  503. route(NAT_TEST_AND_CORRECT);
  504. #!endif
  505. }
  506.  
  507. onreply_route[INTERNAL_REPLY]
  508. {
  509. # this route handles replies that are comming from our media server
  510. xlog("L_INFO", "$ci|start|recieved internal reply $T_reply_code $rr");
  511. xlog("L_INFO", "$ci|log|source $si:$sp");
  512.  
  513. #!ifdef WEBSOCKETS-ROLE
  514. route(NAT_WEBSOCKETS_CORRECT);
  515. #!endif
  516.  
  517. if (is_method("INVITE") &&
  518. !isflagset(FLAG_SESSION_PROGRESS) &&
  519. t_check_status("(180)|(183)|(200)")
  520. ) {
  521. if ($avp(AVP_REDIRECT_KEY) != $null &&
  522. $sht(redirects=>$avp(AVP_REDIRECT_KEY)) != $null
  523. ) {
  524. xlog("L_INFO", "$ci|log|removing redirect mapping $avp(AVP_REDIRECT_KEY)");
  525. $sht(redirects=>$avp(AVP_REDIRECT_KEY)) = $null;
  526. }
  527. xlog("L_INFO", "$ci|log|call setup, now ignoring abnormal termination");
  528. setflag(FLAG_SESSION_PROGRESS);
  529. }
  530.  
  531. if ($rs < 300) {
  532. xlog("L_INFO", "$ci|pass|$T_req($si):$T_req($sp)");
  533. }
  534.  
  535. $var(reply_reason) = $rr;
  536. }
  537.  
  538. failure_route[INTERNAL_FAULT]
  539. {
  540. # this branch handles failures (>=300) to our media servers,
  541. # which we can sometimes overcome by routing to another server
  542.  
  543. # if the failure cause was due to the transaction being
  544. # cancelled then we are complete
  545. if (t_is_canceled()) {
  546. xlog("L_INFO", "$ci|log|transaction was cancelled");
  547.  
  548. exit;
  549. }
  550.  
  551. # Handle redirects
  552. if (t_check_status("302")) {
  553. $var(redirect) = @from.uri.user + "@" + @from.uri.host + "->"
  554. + $T_rpl($(ct{tobody.user})) + "@" + $T_rpl($(ct{tobody.host}));
  555. if($T_rpl($hdr(X-Redirect-Server)) != $null) {
  556. $sht(redirects=>$var(redirect)) = $T_rpl($hdr(X-Redirect-Server));
  557. xlog("L_INFO", "$ci|log|stored redirect mapping $var(redirect) to $T_rpl($hdr(X-Redirect-Server))");
  558. }
  559. } else if (!t_check_status("407") &&
  560. $avp(AVP_REDIRECT_KEY) != $null &&
  561. $sht(redirects=>$avp(AVP_REDIRECT_KEY)) != $null
  562. ) {
  563. xlog("L_INFO", "$ci|log|removing redirect mapping $avp(AVP_REDIRECT_KEY)");
  564. $sht(redirects=>$avp(AVP_REDIRECT_KEY)) = $null;
  565. }
  566.  
  567. remove_hf_re("X-.*");
  568.  
  569. # change 6xx to 4xx
  570. if (t_check_status("6[0-9][0-9]") && !t_check_status("600|603|604|606")) {
  571. $var(new_code) = "4" + $(T_reply_code{s.substr,1,0});
  572. xlog("L_INFO", "$ci|log|sending 6XX reply as $var(new_code) $var(reply_reason)");
  573. t_reply("$(var(new_code){s.int})", "$var(reply_reason)");
  574.  
  575. # if the failure case was something that we should recover
  576. # from then try to find a new media server
  577. } else if ("$var(reply_reason)" =~ "call barred") {
  578. xlog("L_INFO", "$ci|log|failure route ignoring call barred");
  579. } else if (isflagset(FLAG_SESSION_PROGRESS)) {
  580. xlog("L_INFO", "$ci|log|failure route ignoring failure after session progress");
  581. } else if (t_check_status("(401)|(407)|(486)|(403)")) {
  582. xlog("L_INFO", "$ci|log|failure route ignoring auth reply $T_reply_code $var(reply_reason)");
  583. } else if (t_check_status("402")) {
  584. xlog("L_INFO", "$ci|log|failure route overriding reply code 402 with 486");
  585. send_reply("486", "Insufficient Funds");
  586. } else if (t_check_status("(4[0-9][0-9])|(5[0-9][0-9])")) {
  587. xlog("L_INFO", "$ci|start|received failure reply $T_reply_code $rr");
  588.  
  589. #!ifdef DISPATCHER-ROLE
  590. route(DISPATCHER_NEXT_ROUTE);
  591. #!endif
  592.  
  593. send_reply("486", "Unable to Comply");
  594. } else {
  595. xlog("L_INFO", "$ci|log|failure route ignoring reply $T_reply_code $rr");
  596. }
  597. xlog("L_INFO", "$ci|pass|$si:$sp");
  598. }
  599.  
  600. onsend_route {
  601. if (isflagset(FLAG_ASSOCIATE_USER)) {
  602. $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host});
  603. xlog("L_INFO", "$ci|log|associate user $var(contact_uri) with media server sip:$sndto(ip):$sndto(port)");
  604. $sht(associations=>$var(contact_uri))= "sip:" + $sndto(ip) + ":" + $sndto(port);
  605. }
  606.  
  607. xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)");
  608. }
  609.  
  610. # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement