mirror of
				https://github.com/SuperBFG7/ympd
				synced 2025-10-31 13:53:00 +00:00 
			
		
		
		
	cleanup: renamed startup options
cleanup: central startup options file: /etc/mympd/options
This commit is contained in:
		| @@ -50,4 +50,4 @@ install(FILES htdocs/css/bootstrap.min.css DESTINATION share/${PROJECT_NAME}/htd | ||||
| install(FILES htdocs/css/mpd.min.css DESTINATION share/${PROJECT_NAME}/htdocs/css/) | ||||
| install(DIRECTORY htdocs/assets DESTINATION share/${PROJECT_NAME}/htdocs) | ||||
| install(DIRECTORY DESTINATION /var/lib/${PROJECT_NAME}/) | ||||
| install(DIRECTORY DESTINATION /etc/${PROJECT_NAME}/) | ||||
| install(FILES contrib/options DESTINATION /etc/${PROJECT_NAME}/) | ||||
|   | ||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							| @@ -56,16 +56,16 @@ Run flags | ||||
| ``` | ||||
| Usage: ./mympd [OPTION]... | ||||
|  | ||||
|  -h, --host <host>             connect to mpd at host [localhost] | ||||
|  -p, --port <port>             connect to mpd at port [6600] | ||||
|  -h, --mpdhost <host>          connect to mpd at host [localhost] | ||||
|  -p, --mpdport <port>          connect to mpd at port [6600] | ||||
|  -m, --mpdpass <password>      specifies the password to use when connecting to mpd | ||||
|  -w, --webport <port>          listen port for webserver [80] | ||||
|  -S, --ssl		       enable ssl | ||||
|  -W, --sslport		       listen port for ssl webserver [443] | ||||
|  -C, --sslcert		       filename for ssl certificate [/etc/mympd/ssl/server.pem] | ||||
|  -K, --sslkey		       filename for ssl key [/etc/mympd/ssl/server.key] | ||||
|  -W, --sslport <port>	       listen port for ssl webserver [443] | ||||
|  -C, --sslcert <filename>      filename for ssl certificate [/etc/mympd/ssl/server.pem] | ||||
|  -K, --sslkey <filename>       filename for ssl key [/etc/mympd/ssl/server.key] | ||||
|  -s, --streamport <port>       connect to mpd http stream at port [8000] | ||||
|  -u, --user <username>         drop priviliges to user after socket bind | ||||
|  -m, --mpdpass <password>      specifies the password to use when connecting to mpd | ||||
|  -i, --coverimage <filename>   filename for coverimage [folder.jpg] | ||||
|  -t, --statefile <filename>    filename for mympd state [/var/lib/mympd/mympd.state] | ||||
|  -v, --version                 get version | ||||
|   | ||||
| @@ -3,16 +3,8 @@ Description=myMPD server daemon | ||||
| Requires=network.target local-fs.target | ||||
|  | ||||
| [Service] | ||||
| Environment=MPD_HOST=localhost | ||||
| Environment=MPD_PORT=6600 | ||||
| Environment=MPD_PASSWORD= | ||||
| Environment=WEB_PORT=80 | ||||
| Environment=MYMPD_USER=nobody | ||||
| Environment=COVERIMAGE=--coverimage folder.jpg | ||||
| Environment=STATEFILE=--statefile /var/lib/mympd/mympd.state | ||||
| #Environment=SSL=-S -W 443 -C /etc/mympd/ssl/server.pem -K /etc/mympd/ssl/server.key | ||||
| EnvironmentFile=/etc/default/mympd | ||||
| ExecStart=/usr/bin/mympd --user $MYMPD_USER --webport $WEB_PORT --host $MPD_HOST --port $MPD_PORT $COVERIMAGE $STATEFILE $SSL | ||||
| EnvironmentFile=/etc/mympd/options | ||||
| ExecStart=/usr/bin/mympd --user $MYMPD_USER --webport $WEB_PORT --mpdhost $MPD_HOST --mpdport $MPD_PORT $MPD_PASSWORD $COVERIMAGE $STATEFILE $SSL | ||||
| Type=simple | ||||
|  | ||||
| [Install] | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| #Copy this file to /etc/default/mympd | ||||
| MPD_HOST=localhost | ||||
| MPD_PORT=6600 | ||||
| MPD_PASSWORD= | ||||
| #MPD_PASSWORD=--mpdpass PASSWORD | ||||
| WEB_PORT=80 | ||||
| #SSL=-S -W 443 -C /etc/mympd/ssl/server.pem -K /etc/mympd/ssl/server.key | ||||
| MYMPD_USER=nobody | ||||
| COVERIMAGE=--coverimage folder.jpg | ||||
| STATEFILE=--statefile /var/lib/mympd/mympd.state | ||||
| #SSL=-S -W 443 -C /etc/mympd/ssl/server.pem -K /etc/mympd/ssl/server.key | ||||
| 
 | ||||
							
								
								
									
										15
									
								
								htdocs/js/mpd.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								htdocs/js/mpd.min.js
									
									
									
									
										vendored
									
									
								
							| @@ -50,11 +50,12 @@ function parseState(a){if(JSON.stringify(a)!==JSON.stringify(last_state)){1==a.d | ||||
| 0==a.data.queue_length?domCache.btnPlay.setAttribute("disabled","disabled"):domCache.btnPlay.removeAttribute("disabled");-1==a.data.volume?(domCache.volumePrct.innerText("Volumecontrol disabled"),domCache.volumeControl.classList.add("hide")):(domCache.volumeControl.classList.remove("hide"),domCache.volumePrct.innerText=a.data.volume+" %",domCache.volumeIcon.innerText=0==a.data.volume?"volume_off":50>a.data.volume?"volume_down":"volume_up");domCache.volumeBar.value=a.data.volume;current_song.totalTime= | ||||
| a.data.totalTime;current_song.currentSongId=a.data.currentsongid;var b=Math.floor(a.data.totalTime/60),c=a.data.totalTime-60*b,e=Math.floor(a.data.elapsedTime/60),d=a.data.elapsedTime-60*e;domCache.progressBar.value=Math.floor(100*a.data.elapsedTime/a.data.totalTime);b=e+":"+(10>d?"0":"")+d+" / "+b+":"+(10>c?"0":"")+c;domCache.counter.innerText=b;last_state&&(c=document.getElementById("queueTrackId"+last_state.data.currentsongid))&&(e=c.getElementsByTagName("td"),e[4].innerText=c.getAttribute("data-duration"), | ||||
| e[0].classList.remove("material-icons"),e[0].innerText=c.getAttribute("data-songpos"),c.classList.remove("font-weight-bold"));if(c=document.getElementById("queueTrackId"+a.data.currentsongid))e=c.getElementsByTagName("td"),e[4].innerText=b,e[0].classList.add("material-icons"),e[0].innerText="play_arrow",c.classList.add("font-weight-bold");void 0!=last_state&&a.data.queue_version==last_state.data.queue_version||sendAPI({cmd:"MPD_API_GET_CURRENT_SONG"},songChange);b=a.data.outputs.length;for(c=0;c< | ||||
| b;c++)toggleBtn("btnoutput"+a.data.outputs[c].id,a.data.outputs[c].state);last_state=a}}function getQueue(){2<=app.current.search.length?sendAPI({cmd:"MPD_API_SEARCH_QUEUE",data:{mpdtag:app.current.filter,offset:app.current.page,searchstr:app.current.search}},parseQueue):sendAPI({cmd:"MPD_API_GET_QUEUE",data:{offset:app.current.page}},parseQueue)} | ||||
| function parseQueue(a){if("Queue"===app.current.app){0<a.totalTime?document.getElementById("panel-heading-queue").innerText=a.totalEntities+" Songs \u2013 "+beautifyDuration(a.totalTime):0<a.totalEntities?document.getElementById("panel-heading-queue").innerText=a.totalEntities+" Songs":document.getElementById("panel-heading-queue").innerText="";for(var b=a.data.length,c=document.getElementById(app.current.app+"List").getElementsByTagName("tbody")[0],e=c.getElementsByTagName("tr"),d=0;d<b;d++)if(!e[d]|| | ||||
| e[d].getAttribute("data-trackid")!=a.data[d].id){var f=Math.floor(a.data[d].duration/60),g=a.data[d].duration-60*f;f=f+":"+(10>g?"0":"")+g;g=document.createElement("tr");g.setAttribute("data-trackid",a.data[d].id);g.setAttribute("id","queueTrackId"+a.data[d].id);g.setAttribute("data-songpos",a.data[d].pos+1);g.setAttribute("data-duration",f);g.setAttribute("data-uri",a.data[d].uri);g.innerHTML="<td>"+(a.data[d].pos+1)+"</td><td>"+a.data[d].title+"</td><td>"+a.data[d].artist+"</td><td>"+a.data[d].album+ | ||||
| "</td><td>"+f+'</td><td><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>';d<e.length?e[d].replaceWith(g):c.append(g)}for(d=e.length-1;d>=b;d--)e[d].remove();"queuesearch"==a.type&&0==b?c.innerHTML='<tr><td><span class="material-icons">error_outline</span></td><td colspan="5">No results, please refine your search!</td></tr>':"queue"==a.type&&0==b&&(c.innerHTML='<tr><td><span class="material-icons">error_outline</span></td><td colspan="5">Empty queue</td></tr>');setPagination(a.totalEntities); | ||||
| document.getElementById("QueueList").classList.remove("opacity05")}}function parseSearch(a){"Search"===app.current.app&&(document.getElementById("panel-heading-search").innerHTML=a.totalEntities+" Songs found",0<a.totalEntities?document.getElementById("searchAddAllSongs").removeAttribute("disabled"):document.getElementById("searchAddAllSongs").setAttribute("disabled","disabled"),parseFilesystem(a))} | ||||
| b;c++)toggleBtn("btnoutput"+a.data.outputs[c].id,a.data.outputs[c].state);last_state=a}} | ||||
| function getQueue(){if(2<=app.current.search.length)sendAPI({cmd:"MPD_API_SEARCH_QUEUE",data:{mpdtag:app.current.filter,offset:app.current.page,searchstr:app.current.search}},parseQueue);else{var a=document.getElementById("QueueList").getAttribute("data-version");last_state&&a!=last_state.data.queue_version?sendAPI({cmd:"MPD_API_GET_QUEUE",data:{offset:app.current.page}},parseQueue):document.getElementById("QueueList").classList.remove("opacity05")}} | ||||
| function parseQueue(a){if("Queue"===app.current.app){0<a.totalTime?document.getElementById("panel-heading-queue").innerText=a.totalEntities+" Songs \u2013 "+beautifyDuration(a.totalTime):0<a.totalEntities?document.getElementById("panel-heading-queue").innerText=a.totalEntities+" Songs":document.getElementById("panel-heading-queue").innerText="";var b=a.data.length,c=document.getElementById(app.current.app+"List");c.setAttribute("data-version",a.queue_version);c=c.getElementsByTagName("tbody")[0]; | ||||
| for(var e=c.getElementsByTagName("tr"),d=0;d<b;d++)if(!e[d]||e[d].getAttribute("data-trackid")!=a.data[d].id){var f=Math.floor(a.data[d].duration/60),g=a.data[d].duration-60*f;f=f+":"+(10>g?"0":"")+g;g=document.createElement("tr");g.setAttribute("data-trackid",a.data[d].id);g.setAttribute("id","queueTrackId"+a.data[d].id);g.setAttribute("data-songpos",a.data[d].pos+1);g.setAttribute("data-duration",f);g.setAttribute("data-uri",a.data[d].uri);g.innerHTML="<td>"+(a.data[d].pos+1)+"</td><td>"+a.data[d].title+ | ||||
| "</td><td>"+a.data[d].artist+"</td><td>"+a.data[d].album+"</td><td>"+f+'</td><td><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>';d<e.length?e[d].replaceWith(g):c.append(g)}for(d=e.length-1;d>=b;d--)e[d].remove();"queuesearch"==a.type&&0==b?c.innerHTML='<tr><td><span class="material-icons">error_outline</span></td><td colspan="5">No results, please refine your search!</td></tr>':"queue"==a.type&&0==b&&(c.innerHTML='<tr><td><span class="material-icons">error_outline</span></td><td colspan="5">Empty queue</td></tr>'); | ||||
| setPagination(a.totalEntities);document.getElementById("QueueList").classList.remove("opacity05")}}function parseSearch(a){"Search"===app.current.app&&(document.getElementById("panel-heading-search").innerHTML=a.totalEntities+" Songs found",0<a.totalEntities?document.getElementById("searchAddAllSongs").removeAttribute("disabled"):document.getElementById("searchAddAllSongs").setAttribute("disabled","disabled"),parseFilesystem(a))} | ||||
| function parseFilesystem(a){if("Browse"===app.current.app||"Filesystem"===app.current.tab||"Search"===app.current.app){for(var b=a.data.length,c=document.getElementById(app.current.app+(void 0==app.current.tab?"":app.current.tab)+"List").getElementsByTagName("tbody")[0],e=c.getElementsByTagName("tr"),d=0;d<b;d++){var f=encodeURI(a.data[d].uri);if(!e[d]||e[d].getAttribute("data-uri")!=f){var g=document.createElement("tr");g.setAttribute("data-type",a.data[d].type);g.setAttribute("data-uri",f);g.setAttribute("data-name", | ||||
| a.data[d].name);switch(a.data[d].type){case "dir":g.innerHTML='<td><span class="material-icons">folder_open</span></td><td colspan="4">'+a.data[d].name+'</td><td><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>';break;case "song":f=Math.floor(a.data[d].duration/60);var h=a.data[d].duration-60*f;g.innerHTML='<td><span class="material-icons">music_note</span></td><td>'+a.data[d].title+"</td><td>"+a.data[d].artist+"</td><td>"+a.data[d].album+"</td><td>"+f+":"+(10>h?"0":"")+h+'</td><td><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>'; | ||||
| break;case "plist":g.innerHTML='<td><span class="material-icons">list</span></td><td colspan="4">'+a.data[d].name+'</td><td><a href="#" class="material-icons color-darkgrey">playlist_add</a></td>'}d<e.length?e[d].replaceWith(g):c.append(g)}}for(d=e.length-1;d>=b;d--)e[d].remove();setPagination(a.totalEntities);0==b&&(c.innerHTML='<tr><td><span class="material-icons">error_outline</span></td><td colspan="5">No results</td></tr>');document.getElementById(app.current.app+(void 0==app.current.tab?"": | ||||
| @@ -94,8 +95,8 @@ mixrampdb:document.getElementById("inputMixrampdb").value,mixrampdelay:document. | ||||
| function addAllFromBrowse(){sendAPI({cmd:"MPD_API_ADD_TRACK",data:{uri:app.current.search}});showNotification("Added all songs","","","success")}function addAllFromSearch(){2<=app.current.search.length&&(sendAPI({cmd:"MPD_API_SEARCH_ADD",data:{filter:app.current.filter,searchstr:app.current.search}}),showNotification("Added "+parseInt(document.getElementById("panel-heading-search").innerText)+" songs from search","","","success"))} | ||||
| function scrollTo(a){document.body.scrollTop=a;document.documentElement.scrollTop=a}function gotoPage(a){switch(a){case "next":app.current.page+=settings.max_elements_per_page;break;case "prev":app.current.page-=settings.max_elements_per_page;0>=app.current.page&&(app.current.page=0);break;default:app.current.page=a}appGoto(app.current.app,app.current.tab,app.current.view,app.current.page+"/"+app.current.filter+"/"+app.current.search)} | ||||
| function addStream(){var a=document.getElementById("streamurl");""!=a.value&&sendAPI({cmd:"MPD_API_ADD_TRACK",data:{uri:a.value}});a.value="";modalAddstream.hide()}function saveQueue(){var a=document.getElementById("playlistname");""!=a.value&&sendAPI({cmd:"MPD_API_SAVE_QUEUE",data:{plist:a.value}});a.value="";modalSavequeue.hide()} | ||||
| function showNotification(a,b,c,e){1==settings.notificationWeb&&(b=new Notification(a,{icon:"assets/favicon.ico",body:b}),setTimeout(function(a){a.close()},3E3,b));1==settings.notificationPage&&(document.getElementById("alertBox")?b=document.getElementById("alertBox"):(b=document.createElement("div"),b.setAttribute("id","alertBox")),b.classList.add("alert","alert-"+e),b.innerHTML="<div><strong>"+a+"</strong>"+c+"</div>",document.getElementsByTagName("main")[0].append(b),document.getElementById("alertBox").classList.add("alertBoxActive"), | ||||
| alertTimeout&&clearTimeout(alertTimeout),alertTimeout=setTimeout(function(){document.getElementById("alertBox")&&document.getElementById("alertBox").classList.remove("alertBoxActive");setTimeout(function(){document.getElementById("alertBox").remove()},600)},3E3))}function notificationsSupported(){return"Notification"in window} | ||||
| function showNotification(a,b,c,e){1==settings.notificationWeb&&(b=new Notification(a,{icon:"assets/favicon.ico",body:b}),setTimeout(function(a){a.close()},3E3,b));1==settings.notificationPage&&(document.getElementById("alertBox")?b=document.getElementById("alertBox"):(b=document.createElement("div"),b.setAttribute("id","alertBox"),b.addEventListener("click",function(){hideNotification()},!1)),b.classList.add("alert","alert-"+e),b.innerHTML="<div><strong>"+a+"</strong>"+c+"</div>",document.getElementsByTagName("main")[0].append(b), | ||||
| document.getElementById("alertBox").classList.add("alertBoxActive"),alertTimeout&&clearTimeout(alertTimeout),alertTimeout=setTimeout(function(){hideNotification()},3E3))}function hideNotification(){document.getElementById("alertBox")&&(document.getElementById("alertBox").classList.remove("alertBoxActive"),setTimeout(function(){document.getElementById("alertBox").remove()},600))}function notificationsSupported(){return"Notification"in window} | ||||
| function songChange(a){var b=a.data.title+a.data.artist+a.data.album+a.data.uri+a.data.currentsongid;if(last_song!=b){var c="",e="",d="myMPD: ";document.getElementById("album-cover").style.backgroundImage='url("'+a.data.cover+'")';"undefined"!=typeof a.data.artist&&0<a.data.artist.length&&"-"!=a.data.artist?(c+=a.data.artist,e+="<br/>"+a.data.artist,d+=a.data.artist+" - ",document.getElementById("artist").innerText=a.data.artist):document.getElementById("artist").innerText="";"undefined"!=typeof a.data.album&& | ||||
| 0<a.data.album.length&&"-"!=a.data.album?(c+=" - "+a.data.album,e+="<br/>"+a.data.album,document.getElementById("album").innerText=a.data.album):document.getElementById("album").innerText="";"undefined"!=typeof a.data.title&&0<a.data.title.length?(d+=a.data.title,document.getElementById("currenttrack").innerText=a.data.title):document.getElementById("currenttrack").innerText="";document.title=d;if(d=document.getElementById("queueTrackId"+a.data.currentsongid))d.getElementsByTagName("td")[1].innerText= | ||||
| a.data.title;showNotification(a.data.title,c,e,"success");last_song=b}}function doSetFilterLetter(a){var b=document.getElementById(a+"Letters").querySelector(".active");b&&b.classList.remove("active");b=app.current.filter;"0"==b&&(b="#");document.getElementById(a).innerText="Filter"+("-"!=b?": "+b:"");if("-"!=b){a=document.getElementById(a+"Letters").getElementsByTagName("button");for(var c=a.length,e=0;e<c;e++)if(a[e].innerText==b){a[e].classList.add("active");break}}} | ||||
|   | ||||
| @@ -45,7 +45,7 @@ echo "Trying to link musicdir to library" | ||||
| if [ -f /etc/mpd.conf ] | ||||
| then | ||||
|   LIBRARY=$(grep music /etc/mpd.conf | awk {'print $2'}) | ||||
|   [ "$LIBRARY" != "" ] && ln -s $LIBRARY /usr/share/mympd/htdocs/library | ||||
|   [ "$LIBRARY" != "" ] && [ ! -e /usr/share/mympd/htdocs/library ] && ln -s $LIBRARY /usr/share/mympd/htdocs/library | ||||
| else | ||||
|   echo "/etc/mpd.conf not found, you must link your musicdir manually to /usr/share/mympd/htdocs/library" | ||||
| fi | ||||
| @@ -61,9 +61,6 @@ then | ||||
|   systemctl enable mympd   | ||||
| fi | ||||
|  | ||||
| [ -d /etc/default ] && \ | ||||
|   sudo cp -v contrib/mympd.default /etc/default/mympd | ||||
|  | ||||
| if [ -d /etc/mympd/ssl ] | ||||
| then | ||||
|   echo "Certificates already created" | ||||
| @@ -73,4 +70,4 @@ else | ||||
| fi | ||||
|    | ||||
| echo "myMPD installed" | ||||
| echo "Edit /etc/systemd/system/mympd.service and/or /etc/default/mympd before starting mympd" | ||||
| echo "Edit /etc/mympd/options before starting mympd" | ||||
|   | ||||
							
								
								
									
										10
									
								
								mympd.1
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								mympd.1
									
									
									
									
									
								
							| @@ -12,12 +12,15 @@ myMPD is a fork of ympd. | ||||
|  | ||||
| .SH OPTIONS | ||||
| .TP | ||||
| \fB\-h\fR, \fB\-\-host HOST\fR | ||||
| \fB\-h\fR, \fB\-\-mpdhost HOST\fR | ||||
| connect to mpd at host, defaults to localhost | ||||
| .TP | ||||
| \fB\-p\fR, \fB\-\-port PORT\fR | ||||
| \fB\-p\fR, \fB\-\-mpdport PORT\fR | ||||
| connect to mpd at port, defaults to 6600 | ||||
| .TP | ||||
| \fB\-m\fR, \fB\-\-mpdpass PASSWORD\fR | ||||
| specifies the password to use when connecting to mpd | ||||
| .TP | ||||
| \fB\-w\fR, \fB\-\-webport PORT\fR | ||||
| listen interface/port for webserver [80] | ||||
| .TP | ||||
| @@ -39,9 +42,6 @@ connect to mpd http stream at port [8000] | ||||
| \fB\-u\fR, \fB\-\-user USERNAME\fR | ||||
| drop privileges to the provided username after socket binding | ||||
| .TP | ||||
| \fB\-m\fR, \fB\-\-mpdpass PASSWORD\fR | ||||
| specifies the password to use when connecting to mpd | ||||
| .TP | ||||
| \fB-i\fR, \fB\-\-coverimage FILENAME\fR | ||||
| filename for coverimage [folder.jpg] | ||||
| .TP | ||||
|   | ||||
							
								
								
									
										10
									
								
								src/mympd.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/mympd.c
									
									
									
									
									
								
							| @@ -132,20 +132,20 @@ int main(int argc, char **argv) { | ||||
|     gethostname(hostname, 1023); | ||||
|  | ||||
|     static struct option long_options[] = { | ||||
|         {"host",         required_argument, 0, 'h'}, | ||||
|         {"port",         required_argument, 0, 'p'}, | ||||
|         {"mpdhost",      required_argument, 0, 'h'}, | ||||
|         {"mpdport",      required_argument, 0, 'p'}, | ||||
|         {"mpdpass",      required_argument, 0, 'm'},         | ||||
|         {"webport",      required_argument, 0, 'w'}, | ||||
|         {"ssl",		 no_argument,	    0, 'S'}, | ||||
|         {"sslport",	 required_argument, 0, 'W'}, | ||||
|         {"sslcert",	 required_argument, 0, 'C'}, | ||||
|         {"sslkey",	 required_argument, 0, 'K'}, | ||||
|         {"user",         required_argument, 0, 'u'}, | ||||
|         {"version",      no_argument,       0, 'v'}, | ||||
|         {"help",         no_argument,       0,  0 }, | ||||
|         {"mpdpass",      required_argument, 0, 'm'}, | ||||
|         {"streamport",	 required_argument, 0, 's'}, | ||||
|         {"coverimage",	 required_argument, 0, 'i'}, | ||||
|         {"statefile",	 required_argument, 0, 't'}, | ||||
|         {"version",      no_argument,       0, 'v'}, | ||||
|         {"help",         no_argument,       0,  0 }, | ||||
|         {0,              0,                 0,  0 } | ||||
|     }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 jcorporation
					jcorporation