Advertisement
sshikamaru

machinex3

Oct 17th, 2018
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 20.89 KB | None | 0 0
  1. --Liste des require
  2. local computer = require("computer")
  3. local component = require("component")
  4. local term = require("term")
  5. local math = require("math")
  6. local event = require("event")
  7. local string = require("string")
  8. local unicode = require("unicode")
  9. local colors = require("colors")
  10. local sides = require("sides")
  11. local serialization = require("serialization")
  12. print("Requires... ok")
  13. os.sleep(0,5)
  14.  
  15. --Définitions des variables
  16. local table_fermenter = {name_oc="fermenter",name="Fermenteur",titre="DE FERMENTEUR",item=" Cannes à sucre",item_color=0xb4f6a3,product="    Ethanol    ",product_color=0xcccaa5}
  17. local table_squeezer = {name_oc="squeezer",name="Fermenteur",titre="D'EXTRACTEUR ",item="Graines de melon",item_color=0xdf9891,product="Huile de plante",product_color=0x6a6837}
  18. local table_generale = {table_fermenter,table_squeezer}
  19. local i = 0
  20. local j = 0
  21. local h = 0
  22. local volume
  23. local volume_max
  24. local t_volume = {0,0,0}
  25. local t_volume_max = {0,0,0}
  26. local t_item = {0,0,0}
  27. local t_item_max = {0,0,0}
  28. local old_volume = {1000000000000,1000000000000,1000000000000}
  29. local old_tank = 1000000000000000
  30. local arg = {...}
  31. local nb_groupe = tonumber(arg[1])
  32. local nom_machine = tostring(arg[2])
  33. local Idcodes
  34. local top = sides.top
  35. local table_value = {false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false}
  36. local amount_tampon = 0
  37. local table_reception = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
  38. local table_emmission = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
  39. if nom_machine == "f" then
  40.   ntable = 1
  41. elseif nom_machine == "s" then
  42.   ntable = 2
  43. end
  44. local noir = 0x000000
  45. local blanc = 0xFFFFFF
  46. local rouge = 0xFF0000
  47. local vert = 0x00FF00
  48. local bleu = 0x0000FF
  49. local orange = 0xFFFA000
  50. local color_produit = table_generale[ntable].product_color
  51. local color_tampon = table_generale[ntable].item_color
  52. local etat_mode_auto = 1
  53. local old_etat_mode_auto = 4
  54. local tableau_etat_sortie = {false,false,false}  -- 1 = vanne tampon / 2 = vanne alim cuve / 3 = vanne tirage cuve
  55. local tableau_old_etat_sortie = {true,true,true} -- 1 = vanne tampon / 2 = vanne alim cuve / 3 = vanne tirage cuve
  56. print("Initialisation variables... ok")
  57. os.sleep(0,5)
  58.  
  59. --Récupération du matériel
  60. local screen = component.getPrimary("screen")
  61. local gpu = component.gpu
  62. gpu.setResolution(75,60)
  63. local modem = component.modem
  64. local rs = component.redstone
  65. local port_modem = 10001
  66. local tank = component.thermalexpansion_tank
  67. local chest = component.diamond
  68. print("Récupération materiel... ok")
  69. os.sleep(0,5)
  70.  
  71. --Ouverture des ports du modem
  72. modem.open(10001)
  73. print("Ouverture des ports... ok")
  74. os.sleep(0,5)
  75.  
  76. --Fonctions
  77. local function setColor(bg,fg)
  78.   gpu.setBackground(bg)
  79.   gpu.setForeground(fg)
  80. end
  81.  
  82. local function unitmb(qty)
  83.   if qty >= 1000000000 then
  84.     return string.format("%.02f MB",qty/10000000)
  85.   elseif qty >=1000000 then
  86.     return string.format("%.02f KB",qty/1000000)
  87.   elseif qty >=1000 then
  88.     return string.format("%.02f B ",qty/1000)
  89.   else
  90.     return string.format("%d mB",qty)
  91.   end
  92. end
  93.  
  94. local function loadbar(x,y,width,cur,text,bg)
  95.   local raw = " " .. text ..string.rep(" ", width - unicode.len(text) - 2) .. " "
  96.   local oldbg = gpu.setBackground(bg)
  97.   local oldfg = gpu.setForeground(blanc - bg)
  98.   gpu.set(x,y,unicode.sub(raw,1,cur))
  99.   gpu.setBackground(oldbg)
  100.   gpu.setForeground(oldfg)
  101.   gpu.set(x+cur,y,unicode.sub(raw,cur+1,width))
  102. end
  103.  
  104. local function affbar(x,y,length)
  105.   local capacity = tank.getTankInfo()[1].capacity
  106.   local amount
  107.   local text1
  108.   if tank.getTankInfo()[1].contents == nil then
  109.     amount = 0
  110.     text1 = " Cuve de stockage groupe n°"..nb_groupe.." : ".. "Vide"
  111.   else
  112.     amount = tank.getTankInfo()[1].contents.amount
  113.     text1 = " Cuve de stockage groupe n°"..nb_groupe.." : " .. tank.getTankInfo()[1].contents.rawName
  114.   end
  115.   local pct = amount / capacity
  116.   local cur = math.floor(pct * length)
  117.   local textfrac = string.format("%s / %s", unitmb(amount), unitmb(capacity))
  118.   local textpct = string.format("%.02f%%", pct*100)
  119.   local text2
  120.   if old_tank > amount then
  121.     text2 = "  ◄  "
  122.   elseif old_tank < amount then
  123.     text2 = "  ►  "
  124.   end
  125.   if old_tank == amount then
  126.   else
  127.     local texte = "║"
  128.     local text4 = textfrac .. string.rep(" ", length - string.len(textfrac) - string.len(textpct) - 2) .. textpct
  129.     loadbar(x,y,length,cur,text1,color_produit)
  130.     loadbar(x,y+1,length,cur,text2,color_produit)
  131.     loadbar(x,y+2,length,cur,text4,color_produit)
  132.   end
  133.   old_tank = amount
  134. end
  135.  
  136. local function barre_verticale(x,y,hauteur,largeur,volume,volume_max,item,item_max,n,type_machine)
  137.   local entete = table_generale[table_reception[2]].name.." n°"..n
  138.   local k = 0
  139.   local text
  140.   if old_volume[n] < volume then
  141.     text = "  ►  "
  142.   elseif old_volume[n] > volume then
  143.     text = "  ◄  "
  144.   elseif old_volume[n] == volume then
  145.    text = "  =  "
  146.   end
  147.   local cur = math.floor((volume / volume_max) * hauteur)
  148.   local dir = string.rep(" ",largeur)
  149.   for k = 1, hauteur do
  150.     local vy = y + hauteur - k
  151.     if k <= cur then
  152.       setColor(table_generale[table_reception[2]].product_color,1-table_generale[table_reception[2]].product_color)
  153.     elseif k > cur then
  154.       setColor(noir,blanc)  
  155.     end
  156.       gpu.set(x,vy,dir)
  157.     if k == 1 then
  158.       gpu.set(x,vy,dir)
  159.     elseif k == hauteur - 22 then
  160.       gpu.set(x,vy,dir)
  161.       gpu.set(x,vy,string.format("    % 6.02f%%",item*100/(64*9)))
  162.     elseif k == hauteur - 21 then
  163.       gpu.set(x,vy,dir)
  164.       gpu.set(x,vy,string.format(" Quantité % 3d",item))
  165.     elseif k == hauteur - 20 then
  166.       gpu.set(x,vy,dir)
  167.       gpu.set(x,vy,table_generale[type_machine].item)
  168.     elseif k == hauteur - 10 then
  169.       gpu.set(x,vy,dir)
  170.       gpu.set(x,vy,string.format("  Cur %06.02f%%  ",(volume/volume_max)*100))
  171.     elseif k == hauteur - 8 then
  172.       gpu.set(x,vy,dir)
  173.       gpu.set(x,vy," Max "..unitmb(volume_max))
  174.     elseif k == hauteur - 6 then
  175.       gpu.set(x,vy,dir)
  176.       gpu.set(x,vy," Etat :"..text)
  177.     elseif k == hauteur - 5 then
  178.       gpu.set(x,vy,dir)
  179.       gpu.set(x,vy," Cur "..unitmb(volume))
  180.     elseif k == hauteur - 1 then
  181.       gpu.set(x,vy,entete)
  182.     end
  183.     setColor(noir,blanc)
  184.   end
  185.   t_volume[n] = volume
  186.   t_volume_max[n] = volume_max
  187.   t_item[n] = item
  188.   t_item_max[n] = item_max
  189. end
  190.  
  191. local function on_off_rec(x,y,bit)
  192. local color
  193.   if bit == true then
  194.     text = "  ON "
  195.     color = vert
  196.   elseif bit == false then
  197.     text = " OFF "
  198.     color = rouge
  199.   end
  200.   setColor(color,noir)
  201.   gpu.set(x,y,text)
  202.   setColor(noir,blanc)
  203. end
  204.  
  205. local function process(x,y,hauteur,largeur,n)
  206.   barre_verticale(x,y,hauteur,largeur,table_reception[4],table_reception[5],table_reception[6],table_reception[7],n,table_reception[2])
  207.   old_volume[n] = t_volume[n]
  208.   on_off_rec(x+10,41,table_reception[10][n])
  209.   on_off_rec(x+10,42,table_reception[9][n])
  210.   on_off_rec(x+10,43,table_reception[8][n])
  211. end
  212.  
  213. local function tampon(x,y,largeur)
  214.   amount_tampon = 0
  215.   local inv = 0
  216.   local capacity = 108*64
  217.   for i = 1, 108 do
  218.     if chest.getStackInSlot(i) == nil then
  219.       inv = 0
  220.     else
  221.       inv = chest.getStackInSlot(i).qty
  222.     end
  223.   amount_tampon = amount_tampon + inv
  224.   end
  225.   local pct = amount_tampon / capacity
  226.   local cur = math.floor(pct * largeur)
  227.   local text1 = " "..string.format("%s / %s", amount_tampon, capacity)
  228.   local text2 = " "..string.format("% 6.02f%%", pct*100)
  229.   loadbar(x,y,largeur,cur,text1,color_tampon)
  230.   loadbar(x,y+1,largeur,cur,text2,color_tampon)
  231. end
  232.  
  233. local function vanne(x,y,bit,n)
  234.   if bit == true then
  235.     setColor(noir,vert)
  236.     gpu.set(x,y+0,"  ║  ")
  237.     gpu.set(x,y+1,"  ║  ")
  238.     gpu.set(x,y+2,"  ║  ")  
  239.     rs.setBundledOutput(top,n-1,0)
  240.   elseif bit == false then
  241.     setColor(noir,rouge)
  242.     gpu.set(x,y+0,"     ")
  243.     gpu.set(x,y+1,"═════")
  244.     gpu.set(x,y+2,"     ")  
  245.     rs.setBundledOutput(top,n-1,255)
  246.   end
  247.   setColor(noir,blanc)
  248. end
  249.  
  250. local function fonction_auto(x,y,amount,capacity,bit)
  251.   local pct = amount/capacity
  252.   if etat_mode_auto == 1 then
  253.     tableau_etat_sortie[n] = false
  254.   elseif etat_mode_auto == 2 then
  255.     if pct*100 > niveau_maxi then
  256.       tableau_etat_sortie[n] = true
  257.     elseif pct*100 < niveau_mini then
  258.       tableau_etat_sortie[n] = false
  259.     end
  260.   elseif etat_mode_auto == 3 then
  261.     tableau_etat_sortie[n] = true
  262.   end
  263.   if tableau_old_etat_sortie[n] == tableau_etat_sortie[n] then
  264.   else
  265.     vanne(x,y,bit,3)
  266.   end
  267.   if old_etat_mode_auto == etat_mode_auto then
  268.   else
  269.     if etat == 1 then
  270.       setColor(noir, rouge)
  271.       gpu.set(x+5,y+1,"Fermée      ")  
  272.     elseif etat == 2 then
  273.       setColor(noir, orange)
  274.       gpu.set(x+5,y+1," Automatique")
  275.     elseif etat == 3 then
  276.       setColor(noir, vert)
  277.       gpu.set(x+5,y+1,"Ouverte     ")
  278.     end
  279.   end
  280.   if init == 1 then
  281.     tableau_old_etat_sortie[n] = tableau_etat_sortie[n]
  282.     tableau_old_mode_auto[n] = tableau_mode_auto[n]
  283.   end
  284. end
  285.  
  286. local function on_off(x,y,n)
  287.   if tableau_etat_sortie[n] == false then
  288.     setColor(rouge, noir)
  289.     gpu.set(x+4,y," OFF ")
  290.     setColor(noir, vert)
  291.     gpu.set(x,y," ON ")
  292.     rs.setBundledOutput(top,n-1,255)
  293.   elseif tableau_etat_sortie[n] == true then
  294.     setColor(noir, rouge)
  295.     gpu.set(x+4,y," OFF ")
  296.     setColor(vert, noir)
  297.     gpu.set(x,y," ON ")
  298.     rs.setBundledOutput(top,n-1,0)
  299.   end
  300.   setColor(noir, blanc)
  301. end
  302.  
  303. local function on_auto_off(x,y,n)
  304.   if tableau_mode_auto[n] == 1 then
  305.     setColor(rouge, noir)
  306.     gpu.set(x+12,y," OFF ")
  307.     setColor(noir, orange)
  308.     gpu.set(x+5,y," AUTO ")
  309.     setColor(noir, vert)
  310.     gpu.set(x,y," ON ")  
  311.   elseif tableau_mode_auto[n] == 2 then
  312.     setColor(noir, rouge)
  313.     gpu.set(x+12,y," OFF ")
  314.     setColor(orange, noir)
  315.     gpu.set(x+5,y," AUTO ")
  316.     setColor(noir, vert)
  317.     gpu.set(x,y," ON ")
  318.   elseif tableau_mode_auto[n] == 3 then
  319.     setColor(noir, rouge)
  320.     gpu.set(x+12,y," OFF ")
  321.     setColor(noir, orange)
  322.     gpu.set(x+5,y," AUTO ")
  323.     setColor(vert, noir)
  324.     gpu.set(x,y," ON ")
  325.   end
  326.   setColor(noir, blanc)
  327. end
  328.  
  329. local function send(port)
  330.   table_emmission[1] = nb_groupe                       --n° groupe
  331.   table_emmission[2] = table_reception[2]              --type machine
  332.   table_emmission[3] = t_volume[1]                     --volume machine 1
  333.   table_emmission[4] = t_volume_max[1]                 --volume_max machine 1
  334.   table_emmission[5] = t_item[1]                       --item machine 1
  335.   table_emmission[6] = t_item_max[1]                   --item_max machine 1
  336.   table_emmission[7] = t_volume[2]                     --volume machine 2
  337.   table_emmission[8] = t_volume_max[2]                 --volume_max machine 2
  338.   table_emmission[9] = t_item[2]                       --item machine 2
  339.   table_emmission[10] = t_item_max[2]                  --item_max machine 2
  340.   table_emmission[11] = t_volume[3]                    --volume machine 3
  341.   table_emmission[12] = t_volume_max[3]                --volume_max machine 3
  342.   table_emmission[13] = t_item[3]                      --item machine 3
  343.   table_emmission[14] = t_item_max[3]                  --item_max machine 3
  344.   table_emmission[15] = amount_tampon                  --tampon
  345.   table_emmission[16] = 108*64                         --tampon max
  346.   local table_s = serialization.serialize(table_emmission)
  347.   local IDcodes = "machinex3"
  348.   modem.broadcast(port,IDcodes,table_s)
  349.   local texte_vide = ""
  350.   j = j + 1
  351.   if j > 9 then
  352.     j = 0
  353.     texte_vide = "               "
  354.   end
  355.   local text = " Envoi n°"..string.format("%s", j+1).." Confirmé"..texte_vide
  356.   gpu.set(4+j,46,text)
  357. end
  358. print("Fonctions... ok")
  359. os.sleep(0,5)
  360. print("Initialisation programme...")
  361. os.sleep(1)
  362.  
  363. --Trame de fond
  364.  gpu.set(1,1,[[╔═════════════════════════════════════════════════════════════════════════╗]])
  365.  gpu.set(1,2,[[║                                                                         ║]])
  366.  gpu.set(1,3,[[╠═════════════════════════════════════════════════════════════════════════╣]])
  367.  gpu.set(1,4,[[║     _________________________________________                           ║]])
  368.  gpu.set(1,5,[[║    /                                         \                          ║]])
  369.  gpu.set(1,6,[[║   /           COLONNE               N°        \                         ║]])
  370.  gpu.set(1,7,[[║  /_____________________________________________\                        ║]])
  371.  gpu.set(1,8,[[║ │               │               │               │                       ║]])
  372.  gpu.set(1,9,[[║ │               │               │               │ ┌───────────────────┐ ║]])
  373. gpu.set(1,10,[[║ │               │               │               │ │   Vanne  Tampon   │ ║]])
  374. gpu.set(1,11,[[║ │               │               │               │ │   ■ON■    ■OFF■   │ ║]])
  375. gpu.set(1,12,[[║ │               │               │               │ ├───────────────────┤ ║]])
  376. gpu.set(1,13,[[║ │               │               │               │ │ Vanne tirage cuve │ ║]])
  377. gpu.set(1,14,[[║ │               │               │               │ │ ■ON■ ■AUTO■ ■OFF■ │ ║]])
  378. gpu.set(1,15,[[║ │               │               │               │ ├───────────────────┤ ║]])
  379. gpu.set(1,16,[[║ │               │               │               │ │ Vanne gavage cuve │ ║]])
  380. gpu.set(1,17,[[║ │               │               │               │ │   ■ON■    ■OFF■   │ ║]])
  381. gpu.set(1,18,[[║ │               │               │               │ ├───────────────────┤ ║]])
  382. gpu.set(1,19,[[║ │               │               │               │ │  Etat des vannes  │ ║]])
  383. gpu.set(1,20,[[║ │               │               │               │ │Vanne tampon ■OFF■ │ ║]])
  384. gpu.set(1,21,[[║ │               │               │               │ │Vanne tirage ■OFF■ │ ║]])
  385. gpu.set(1,22,[[║ │               │               │               │ │Vanne gavage ■OFF■ │ ║]])
  386. gpu.set(1,23,[[║ │               │               │               │ └───────────────────┘ ║]])
  387. gpu.set(1,24,[[║ │               │               │               │                       ║]])
  388. gpu.set(1,25,[[║ │               │               │               │                       ║]])
  389. gpu.set(1,26,[[║ │               │               │               │                       ║]])
  390. gpu.set(1,27,[[║ │               │               │               │     ╔══< Alimentation ║]])
  391. gpu.set(1,28,[[║ │               │               │               │     ║        Item     ║]])
  392. gpu.set(1,29,[[║ │               │               │               │                       ║]])
  393. gpu.set(1,30,[[║ │               │               │               │   ═════               ║]])
  394. gpu.set(1,31,[[║ │               │               │               │                       ║]])
  395. gpu.set(1,32,[[║ │               │               │               │ ┌───╨───────────────┐ ║]])
  396. gpu.set(1,33,[[║ │               │               │               │ │   Stock Tampon    │ ║]])
  397. gpu.set(1,34,[[║ │               │               │               │ │                   │ ║]])
  398. gpu.set(1,35,[[║ │               │               │               │ │                   │ ║]])
  399. gpu.set(1,36,[[║ │               │               │               │ │                   │ ║]])
  400. gpu.set(1,37,[[║ │               │               │               │ └─────────╥─────────┘ ║]])
  401. gpu.set(1,38,[[║ │               │               │               │           ║           ║]])
  402. gpu.set(1,39,[[║ ├───────────────┼───────────────┼───────────────┤           ║           ║]])
  403. gpu.set(1,40,[[║ │ Fonctionnement│ Fonctionnement│ Fonctionnement│           ║           ║]])
  404. gpu.set(1,41,[[║ │ Energie :■OFF■│ Energie :■OFF■│ Energie :■OFF■│           ║           ║]])
  405. gpu.set(1,42,[[║ │ Produit :■OFF■│ Produit :■OFF■│ Produit :■OFF■╞<══════════╝           ║]])
  406. gpu.set(1,43,[[║ │ Item    :■OFF■│ Item    :■OFF■│ Item    :■OFF■│                       ║]])
  407. gpu.set(1,44,[[║ ├───────────────┴───────────────┴───────────────┤                       ║]])
  408. gpu.set(1,45,[[║ │                                               │                       ║]])
  409. gpu.set(1,46,[[║ │                                               │                       ║]])
  410. gpu.set(1,47,[[║ │                                               │                       ║]])
  411. gpu.set(1,48,[[║ └────────────────────────╥──────────────────────┘   ╔═> Cuve principale ║]])
  412. gpu.set(1,49,[[║                          ║                          ║                   ║]])
  413. gpu.set(1,50,[[║                                                                         ║]])
  414. gpu.set(1,51,[[║                        ═════                      ═════                 ║]])
  415. gpu.set(1,52,[[║                                                                         ║]])
  416. gpu.set(1,53,[[║                          ║                          ║                   ║]])
  417. gpu.set(1,54,[[║                       /¯¯║¯¯\                    /¯¯║¯¯\                ║]])
  418. gpu.set(1,55,[[║  /¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯       ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯   ║   ¯¯¯¯¯¯¯¯¯¯¯¯¯\  ║]])
  419. gpu.set(1,56,[[║ │ Cuve Produit                                      ║                 │ ║]])
  420. gpu.set(1,57,[[║ │                                                   ║                 │ ║]])
  421. gpu.set(1,58,[[║ │                                                   ║                 │ ║]])
  422. gpu.set(1,59,[[║  \___________________________________________________________________/  ║]])
  423. gpu.set(1,60,[[╚═════════════════════════════════════════════════════════════════════════╝]])
  424.  
  425. local function affbouton(x,y)
  426.   vanne(26,50,false,1)
  427.   vanne(53,50,false,2)
  428.   vanne(55,29,false,3)
  429. end
  430.  
  431. affbouton(2,2)
  432. gpu.set(41,6,tostring(nb_groupe))
  433. gpu.set(25,6,table_generale[ntable].titre)
  434.  
  435. local function onTouch(_,address,x,y,clic,pseudo)
  436.   local tclic
  437.   if clic == 0  then
  438.     tclic = "Clic gauche"
  439.   elseif clic == 1 then
  440.     tclic = "Clic droit"
  441.   else
  442.     tclic = "Clic inconnu"
  443.   end
  444.   gpu.set(4,2,tclic.." de la part de "..pseudo.." / X : "..string.format("% 3s",x).." / Y : "..string.format("% 3s",y))
  445.  
  446.   if x~=1 and y~=1 then
  447.   elseif x==1 and y==1 then
  448.     computer.pushSignal("quit")
  449.     gpu.fill(1,1,160,50," ")
  450.     term.setCursor(1,1)
  451.     return false
  452.   end
  453. end
  454.  
  455. local function onModem(_,_,from,port,_,IDcode,message)
  456.   table_reception = serialization.unserialize(message)
  457.   if IDcode == "machine" then
  458.     if table_reception[2] == ntable then
  459.       if table_reception[1] == nb_groupe then
  460.         local texte_vide = ""
  461.         h = h + 1
  462.         if h > 9 then
  463.           h = 0
  464.           texte_vide = "               "
  465.         end
  466.         local text = " Réception n°"..string.format("%s", h+1).." Confirmé"..texte_vide
  467.         gpu.set(4+h,45,text)
  468.         process(4+16*(table_reception[3]-1),9,30,15,table_reception[3])
  469.         send(port_modem)
  470.       end
  471.     end
  472.   end
  473. end
  474.  
  475. local function onTimer(_,timer)
  476.   affbar(4,56,69)
  477.   tampon(54,34,19)
  478.   fonction_auto(53,50,amount,capacity,tableau_etat_sortie[3])
  479.   return true
  480. end
  481.  
  482. event.listen("touch",onTouch)
  483. event.listen("modem_message",onModem)
  484. local timer = event.timer(.1,onTimer,math.huge)
  485. event.pull("quit")
  486. event.cancel(timer)
  487. event.ignore("touch",onTouch)
  488. event.ignore("modem_message",onModem)
  489. modem.close()
  490. gpu.fill(1,1,160,50," ")
  491. gpu.setResolution(160,40)
  492.  
  493. --Créé par sshikamaru. Vous avez le droit de l'utiliser mais pas de le distribuer.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement