net/README.html

185 lines
43 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>README.html</title>
<meta name="generator" content="Haroopad 0.13.1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>div.oembedall-githubrepos{border:1px solid #DDD;border-radius:4px;list-style-type:none;margin:0 0 10px;padding:8px 10px 0;font:13.34px/1.4 helvetica,arial,freesans,clean,sans-serif;width:452px;background-color:#fff}div.oembedall-githubrepos .oembedall-body{background:-moz-linear-gradient(center top,#FAFAFA,#EFEFEF);background:-webkit-gradient(linear,left top,left bottom,from(#FAFAFA),to(#EFEFEF));border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #EEE;margin-left:-10px;margin-top:8px;padding:5px 10px;width:100%}div.oembedall-githubrepos h3{font-size:14px;margin:0;padding-left:18px;white-space:nowrap}div.oembedall-githubrepos p.oembedall-description{color:#444;font-size:12px;margin:0 0 3px}div.oembedall-githubrepos p.oembedall-updated-at{color:#888;font-size:11px;margin:0}div.oembedall-githubrepos ul.oembedall-repo-stats{border:none;float:right;font-size:11px;font-weight:700;padding-left:15px;position:relative;z-index:5;margin:0}div.oembedall-githubrepos ul.oembedall-repo-stats li{border:none;color:#666;display:inline-block;list-style-type:none;margin:0!important}div.oembedall-githubrepos ul.oembedall-repo-stats li a{background-color:transparent;border:none;color:#666!important;background-position:5px -2px;background-repeat:no-repeat;border-left:1px solid #DDD;display:inline-block;height:21px;line-height:21px;padding:0 5px 0 23px}div.oembedall-githubrepos ul.oembedall-repo-stats li:first-child a{border-left:medium none;margin-right:-3px}div.oembedall-githubrepos ul.oembedall-repo-stats li a:hover{background:5px -27px no-repeat #4183C4;color:#FFF!important;text-decoration:none}div.oembedall-githubrepos ul.oembedall-repo-stats li:first-child a:hover{border-bottom-left-radius:3px;border-top-left-radius:3px}ul.oembedall-repo-stats li:last-child a:hover{border-bottom-right-radius:3px;border-top-right-radius:3px}span.oembedall-closehide{background-color:#aaa;border-radius:2px;cursor:pointer;margin-right:3px}div.oembedall-container{margin-top:5px;text-align:left}.oembedall-ljuser{font-weight:700}.oembedall-ljuser img{vertical-align:bottom;border:0;padding-right:1px}.oembedall-stoqembed{border-bottom:1px dotted #999;float:left;overflow:hidden;width:730px;line-height:1;background:#FFF;color:#000;font-family:Arial,Liberation Sans,DejaVu Sans,sans-serif;font-size:80%;text-align:left;margin:0;padding:0}.oembedall-stoqembed a{color:#07C;text-decoration:none;margin:0;padding:0}.oembedall-stoqembed a:hover{text-decoration:underline}.oembedall-stoqembed a:visited{color:#4A6B82}.oembedall-stoqembed h3{font-family:Trebuchet MS,Liberation Sans,DejaVu Sans,sans-serif;font-size:130%;font-weight:700;margin:0;padding:0}.oembedall-stoqembed .oembedall-reputation-score{color:#444;font-size:120%;font-weight:700;margin-right:2px}.oembedall-stoqembed .oembedall-user-info{height:35px;width:185px}.oembedall-stoqembed .oembedall-user-info .oembedall-user-gravatar32{float:left;height:32px;width:32px}.oembedall-stoqembed .oembedall-user-info .oembedall-user-details{float:left;margin-left:5px;overflow:hidden;white-space:nowrap;width:145px}.oembedall-stoqembed .oembedall-question-hyperlink{font-weight:700}.oembedall-stoqembed .oembedall-stats{background:#EEE;margin:0 0 0 7px;padding:4px 7px 6px;width:58px}.oembedall-stoqembed .oembedall-statscontainer{float:left;margin-right:8px;width:86px}.oembedall-stoqembed .oembedall-votes{color:#555;padding:0 0 7px;text-align:center}.oembedall-stoqembed .oembedall-vote-count-post{font-size:240%;color:#808185;display:block;font-weight:700}.oembedall-stoqembed .oembedall-views{color:#999;padding-top:4px;text-align:center}.oembedall-stoqembed .oembedall-status{margin-top:-3px;padding:4px 0;text-align:center;background:#75845C;color:#FFF}.oembedall-stoqembed .oembedall-status strong{color:#FFF;display:block;font-size:140%}.oembedall-stoqembed .oembedall-summary{float:left;width:635px}.oembedall-stoqembed .oembedall-excerpt{line-height:1.2;margin:0;padding:0 0 5px}.oembedall-stoqembed .oembedall-tags{float:left;line-height:18px}.oembedall-stoqembed .oembedall-tags a:hover{text-decoration:none}.oembedall-stoqembed .oembedall-post-tag{background-color:#E0EAF1;border-bottom:1px solid #3E6D8E;border-right:1px solid #7F9FB6;color:#3E6D8E;font-size:90%;line-height:2.4;margin:2px 2px 2px 0;padding:3px 4px;text-decoration:none;white-space:nowrap}.oembedall-stoqembed .oembedall-post-tag:hover{background-color:#3E6D8E;border-bottom:1px solid #37607D;border-right:1px solid #37607D;color:#E0EAF1}.oembedall-stoqembed .oembedall-fr{float:right}.oembedall-stoqembed .oembedall-statsarrow{background-image:url(http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=3);background-repeat:no-repeat;overflow:hidden;background-position:0 -435px;float:right;height:13px;margin-top:12px;width:7px}.oembedall-facebook1{border:1px solid #1A3C6C;padding:0;font:13.34px/1.4 verdana;width:500px}.oembedall-facebook2{background-color:#627add}.oembedall-facebook2 a{color:#e8e8e8;text-decoration:none}.oembedall-facebookBody{background-color:#fff;vertical-align:top;padding:5px}.oembedall-facebookBody .contents{display:inline-block;width:100%}.oembedall-facebookBody div img{float:left;margin-right:5px}div.oembedall-lanyard{-webkit-box-shadow:none;-webkit-transition-delay:0s;-webkit-transition-duration:.4000000059604645s;-webkit-transition-property:width;-webkit-transition-timing-function:cubic-bezier(0.42,0,.58,1);background-attachment:scroll;background-clip:border-box;background-color:transparent;background-image:none;background-origin:padding-box;border-width:0;box-shadow:none;color:#112644;display:block;float:left;font-family:'Trebuchet MS',Trebuchet,sans-serif;font-size:16px;height:253px;line-height:19px;margin:0;max-width:none;min-height:0;outline:#112644 0;overflow-x:visible;overflow-y:visible;padding:0;position:relative;text-align:left;vertical-align:baseline;width:804px}div.oembedall-lanyard .tagline{font-size:1.5em}div.oembedall-lanyard .wrapper{overflow:hidden;clear:both}div.oembedall-lanyard .split{float:left;display:inline}div.oembedall-lanyard .prominent-place .flag:active,div.oembedall-lanyard .prominent-place .flag:focus,div.oembedall-lanyard .prominent-place .flag:hover,div.oembedall-lanyard .prominent-place .flag:link,div.oembedall-lanyard .prominent-place .flag:visited{float:left;display:block;width:48px;height:48px;position:relative;top:-5px;margin-right:10px}div.oembedall-lanyard .place-context{font-size:.889em}div.oembedall-lanyard .prominent-place .sub-place{display:block}div.oembedall-lanyard .prominent-place{font-size:1.125em;line-height:1.1em;font-weight:400}div.oembedall-lanyard .main-date{color:#8CB4E0;font-weight:700;line-height:1.1}div.oembedall-lanyard .first{width:48.57%;margin:0 0 0 2.857%}.mermaid .label{color:#333}.node circle,.node polygon,.node rect{fill:#cde498;stroke:#13540c;stroke-width:1px}.edgePath .path{stroke:green;stroke-width:1.5px}.cluster rect{fill:#cdffb2;rx:40;stroke:#6eaa49;stroke-width:1px}.cluster text{fill:#333}.actor{stroke:#13540c;fill:#cde498}text.actor{fill:#000;stroke:none}.actor-line{stroke:grey}.messageLine0{stroke-width:1.5;stroke-dasharray:"2 2";marker-end:"url(#arrowhead)";stroke:#333}.messageLine1{stroke-width:1.5;stroke-dasharray:"2 2";stroke:#333}#arrowhead{fill:#333}#crosshead path{fill:#333!important;stroke:#333!important}.messageText{fill:#333;stroke:none}.labelBox{stroke:#326932;fill:#cde498}.labelText,.loopText{fill:#000;stroke:none}.loopLine{stroke-width:2;stroke-dasharray:"2 2";marker-end:"url(#arrowhead)";stroke:#326932}.note{stroke:#6eaa49;fill:#fff5ad}.noteText{fill:#000;stroke:none;font-family:'trebuchet ms',verdana,arial;font-size:14px}.section{stroke:none;opacity:.2}.section0,.section2{fill:#6eaa49}.section1,.section3{fill:#fff;opacity:.2}.sectionTitle0,.sectionTitle1,.sectionTitle2,.sectionTitle3{fill:#333}.sectionTitle{text-anchor:start;font-size:11px;text-height:14px}.grid .tick{stroke:lightgrey;opacity:.3;shape-rendering:crispEdges}.grid path{stroke-width:0}.today{fill:none;stroke:red;stroke-width:2px}.task{stroke-width:2}.taskText{text-anchor:middle;font-size:11px}.taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px}.taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}.taskText0,.taskText1,.taskText2,.taskText3{fill:#fff}.task0,.task1,.task2,.task3{fill:#487e3a;stroke:#13540c}.taskTextOutside0,.taskTextOutside1,.taskTextOutside2,.taskTextOutside3{fill:#000}.active0,.active1,.active2,.active3{fill:#cde498;stroke:#13540c}.activeText0,.activeText1,.activeText2,.activeText3{fill:#000!important}.done0,.done1,.done2,.done3{stroke:grey;fill:lightgrey;stroke-width:2}.doneText0,.doneText1,.doneText2,.doneText3{fill:#000!important}.crit0,.crit1,.crit2,.crit3{stroke:#f88;fill:red;stroke-width:2}.activeCrit0,.activeCrit1,.activeCrit2,.activeCrit3{stroke:#f88;fill:#cde498;stroke-width:2}.doneCrit0,.doneCrit1,.doneCrit2,.doneCrit3{stroke:#f88;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}.activeCritText0,.activeCritText1,.activeCritText2,.activeCritText3,.doneCritText0,.doneCritText1,.doneCritText2,.doneCritText3{fill:#000!important}.titleText{text-anchor:middle;font-size:18px;fill:#000}text{font-family:'trebuchet ms',verdana,arial;font-size:14px}html{height:100%}body{margin:0!important;padding:5px 20px 26px!important;background-color:#fff;font-family:"Lucida Grande","Segoe UI","Apple SD Gothic Neo","Malgun Gothic","Lucida Sans Unicode",Helvetica,Arial,sans-serif;font-size:.9em;overflow-x:hidden;overflow-y:auto}br,h1,h2,h3,h4,h5,h6{clear:both}hr.page{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x;border:0;height:3px;padding:0}hr.underscore{border-top-style:dashed!important}body >:first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:3px}iframe{border:0}figure{-webkit-margin-before:0;-webkit-margin-after:0;-webkit-margin-start:0;-webkit-margin-end:0}kbd{border:1px solid #aaa;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:1px 2px 2px #ddd;-webkit-box-shadow:1px 2px 2px #ddd;box-shadow:1px 2px 2px #ddd;background-color:#f9f9f9;background-image:-moz-linear-gradient(top,#eee,#f9f9f9,#eee);background-image:-o-linear-gradient(top,#eee,#f9f9f9,#eee);background-image:-webkit-linear-gradient(top,#eee,#f9f9f9,#eee);background-image:linear-gradient(top,#eee,#f9f9f9,#eee);padding:1px 3px;font-family:inherit;font-size:.85em}.oembeded .oembed_photo{display:inline-block}img[data-echo]{margin:25px 0;width:100px;height:100px;background:url(../img/ajax.gif) center center no-repeat #fff}.spinner{display:inline-block;width:10px;height:10px;margin-bottom:-.1em;border:2px solid rgba(0,0,0,.5);border-top-color:transparent;border-radius:100%;-webkit-animation:spin 1s infinite linear;animation:spin 1s infinite linear}.spinner:after{content:'';display:block;width:0;height:0;position:absolute;top:-6px;left:0;border:4px solid transparent;border-bottom-color:rgba(0,0,0,.5);-webkit-transform:rotate(45deg);transform:rotate(45deg)}@-webkit-keyframes spin{to{-webkit-transform:rotate(360deg)}}@keyframes spin{to{transform:rotate(360deg)}}p.toc{margin:0!important}p.toc ul{padding-left:10px}p.toc>ul{padding:10px;margin:0 10px;display:inline-block;border:1px solid #ededed;border-radius:5px}p.toc li,p.toc ul{list-style-type:none}p.toc li{width:100%;padding:0;overflow:hidden}p.toc li a::after{content:"."}p.toc li a:before{content:"• "}p.toc h5{text-transform:uppercase}p.toc .title{float:left;padding-right:3px}p.toc .number{margin:0;float:right;padding-left:3px;background:#fff;display:none}input.task-list-item{margin-left:-1.62em}.markdown{font-family:"Hiragino Sans GB","Microsoft YaHei",STHeiti,SimSun,"Lucida Grande","Lucida Sans Unicode","Lucida Sans",'Segoe UI',AppleSDGothicNeo-Medium,'Malgun Gothic',Verdana,Tahoma,sans-serif;padding:20px}.markdown a{text-decoration:none;vertical-align:baseline}.markdown a:hover{text-decoration:underline}.markdown h1{font-size:2.2em;font-weight:700;margin:1.5em 0 1em}.markdown h2{font-size:1.8em;font-weight:700;margin:1.275em 0 .85em}.markdown h3{font-size:1.6em;font-weight:700;margin:1.125em 0 .75em}.markdown h4{font-size:1.4em;font-weight:700;margin:.99em 0 .66em}.markdown h5{font-size:1.2em;font-weight:700;margin:.855em 0 .57em}.markdown h6{font-size:1em;font-weight:700;margin:.75em 0 .5em}.markdown h1+p,.markdown h1:first-child,.markdown h2+p,.markdown h2:first-child,.markdown h3+p,.markdown h3:first-child,.markdown h4+p,.markdown h4:first-child,.markdown h5+p,.markdown h5:first-child,.markdown h6+p,.markdown h6:first-child{margin-top:0}.markdown hr{border:1px solid #ccc}.markdown p{margin:1em 0;word-wrap:break-word}.markdown ol{list-style-type:decimal}.markdown li{display:list-item;line-height:1.4em}.markdown blockquote{margin:1em 20px}.markdown blockquote>:first-child{margin-top:0}.markdown blockquote>:last-child{margin-bottom:0}.markdown blockquote cite:before{content:'\2014 \00A0'}.markdown .code{border-radius:3px;word-wrap:break-word}.markdown pre{border-radius:3px;word-wrap:break-word;border:1px solid #ccc;overflow:auto;padding:.5em}.markdown pre code{border:0;display:block}.markdown pre>code{font-family:Consolas,Inconsolata,Courier,monospace;font-weight:700;white-space:pre;margin:0}.markdown code{border-radius:3px;word-wrap:break-word;border:1px solid #ccc;padding:0 5px;margin:0 2px}.markdown img{max-width:100%}.markdown mark{color:#000;background-color:#fcf8e3}.markdown table{padding:0;border-collapse:collapse;border-spacing:0;margin-bottom:16px}.markdown table tr td,.markdown table tr th{border:1px solid #ccc;margin:0;padding:6px 13px}.markdown table tr th{font-weight:700}.markdown table tr th>:first-child{margin-top:0}.markdown table tr th>:last-child{margin-bottom:0}.markdown table tr td>:first-child{margin-top:0}.markdown table tr td>:last-child{margin-bottom:0}@import url(http://fonts.googleapis.com/css?family=Roboto+Condensed:300italic,400italic,700italic,400,300,700);.haroopad{padding:20px;color:#222;font-size:15px;font-family:"Roboto Condensed",Tauri,"Hiragino Sans GB","Microsoft YaHei",STHeiti,SimSun,"Lucida Grande","Lucida Sans Unicode","Lucida Sans",'Segoe UI',AppleSDGothicNeo-Medium,'Malgun Gothic',Verdana,Tahoma,sans-serif;background:#fff;line-height:1.6;-webkit-font-smoothing:antialiased}.haroopad a{color:#3269a0}.haroopad a:hover{color:#4183c4}.haroopad h2{border-bottom:1px solid #e6e6e6}.haroopad h6{color:#777}.haroopad hr{border:1px solid #e6e6e6}.haroopad blockquote>code,.haroopad h1>code,.haroopad h2>code,.haroopad h3>code,.haroopad h4>code,.haroopad h5>code,.haroopad h6>code,.haroopad li>code,.haroopad p>code,.haroopad td>code{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:85%;background-color:rgba(0,0,0,.02);padding:.2em .5em;border:1px solid #efefef}.haroopad pre>code{font-size:1em;letter-spacing:-1px;font-weight:700}.haroopad blockquote{border-left:4px solid #e6e6e6;padding:0 15px;color:#777}.haroopad table{background-color:#fafafa}.haroopad table tr td,.haroopad table tr th{border:1px solid #e6e6e6}.haroopad table tr:nth-child(2n){background-color:#f2f2f2}.hljs{display:block;overflow-x:auto;padding:.5em;background:#fdf6e3;color:#657b83;-webkit-text-size-adjust:none}.diff .hljs-header,.hljs-comment,.hljs-doctype,.hljs-javadoc,.hljs-pi,.lisp .hljs-string{color:#93a1a1}.css .hljs-tag,.hljs-addition,.hljs-keyword,.hljs-request,.hljs-status,.hljs-winutils,.method,.nginx .hljs-title{color:#859900}.hljs-command,.hljs-dartdoc,.hljs-hexcolor,.hljs-link_url,.hljs-number,.hljs-phpdoc,.hljs-regexp,.hljs-rules .hljs-value,.hljs-string,.hljs-tag .hljs-value,.tex .hljs-formula{color:#2aa198}.css .hljs-function,.hljs-built_in,.hljs-chunk,.hljs-decorator,.hljs-id,.hljs-identifier,.hljs-localvars,.hljs-title,.vhdl .hljs-literal{color:#268bd2}.hljs-attribute,.hljs-class .hljs-title,.hljs-constant,.hljs-link_reference,.hljs-parent,.hljs-type,.hljs-variable,.lisp .hljs-body,.smalltalk .hljs-number{color:#b58900}.css .hljs-pseudo,.diff .hljs-change,.hljs-attr_selector,.hljs-cdata,.hljs-header,.hljs-pragma,.hljs-preprocessor,.hljs-preprocessor .hljs-keyword,.hljs-shebang,.hljs-special,.hljs-subst,.hljs-symbol,.hljs-symbol .hljs-string{color:#cb4b16}.hljs-deletion,.hljs-important{color:#dc322f}.hljs-link_label{color:#6c71c4}.tex .hljs-formula{background:#eee8d5}.MathJax_Hover_Frame{border-radius:.25em;-webkit-border-radius:.25em;-moz-border-radius:.25em;-khtml-border-radius:.25em;box-shadow:0 0 15px #83A;-webkit-box-shadow:0 0 15px #83A;-moz-box-shadow:0 0 15px #83A;-khtml-box-shadow:0 0 15px #83A;border:1px solid #A6D!important;display:inline-block;position:absolute}.MathJax_Hover_Arrow{position:absolute;width:15px;height:11px;cursor:pointer}#MathJax_About{position:fixed;left:50%;width:auto;text-align:center;border:3px outset;padding:1em 2em;background-color:#DDD;color:#000;cursor:default;font-family:message-box;font-size:120%;font-style:normal;text-indent:0;text-transform:none;line-height:normal;letter-spacing:normal;word-spacing:normal;word-wrap:normal;white-space:nowrap;float:none;z-index:201;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px;-khtml-border-radius:15px;box-shadow:0 10px 20px gray;-webkit-box-shadow:0 10px 20px gray;-moz-box-shadow:0 10px 20px gray;-khtml-box-shadow:0 10px 20px gray;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}.MathJax_Menu{position:absolute;background-color:#fff;color:#000;width:auto;padding:2px;border:1px solid #CCC;margin:0;cursor:default;font:menu;text-align:left;text-indent:0;text-transform:none;line-height:normal;letter-spacing:normal;word-spacing:normal;word-wrap:normal;white-space:nowrap;float:none;z-index:201;box-shadow:0 10px 20px gray;-webkit-box-shadow:0 10px 20px gray;-moz-box-shadow:0 10px 20px gray;-khtml-box-shadow:0 10px 20px gray;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}.MathJax_MenuItem{padding:2px 2em;background:0 0}.MathJax_MenuArrow{position:absolute;right:.5em;color:#666}.MathJax_MenuActive .MathJax_MenuArrow{color:#fff}.MathJax_MenuArrow.RTL{left:.5em;right:auto}.MathJax_MenuCheck{position:absolute;left:.7em}.MathJax_MenuCheck.RTL{right:.7em;left:auto}.MathJax_MenuRadioCheck{position:absolute;left:1em}.MathJax_MenuRadioCheck.RTL{right:1em;left:auto}.MathJax_MenuLabel{padding:2px 2em 4px 1.33em;font-style:italic}.MathJax_MenuRule{border-top:1px solid #CCC;margin:4px 1px 0}.MathJax_MenuDisabled{color:GrayText}.MathJax_MenuActive{background-color:Highlight;color:HighlightText}.MathJax_Menu_Close{position:absolute;width:31px;height:31px;top:-15px;left:-15px}#MathJax_Zoom{position:absolute;background-color:#F0F0F0;overflow:auto;display:block;z-index:301;padding:.5em;border:1px solid #000;margin:0;font-weight:400;font-style:normal;text-align:left;text-indent:0;text-transform:none;line-height:normal;letter-spacing:normal;word-spacing:normal;word-wrap:normal;white-space:nowrap;float:none;box-shadow:5px 5px 15px #AAA;-webkit-box-shadow:5px 5px 15px #AAA;-moz-box-shadow:5px 5px 15px #AAA;-khtml-box-shadow:5px 5px 15px #AAA;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')}#MathJax_ZoomOverlay{position:absolute;left:0;top:0;z-index:300;display:inline-block;width:100%;height:100%;border:0;padding:0;margin:0;background-color:#fff;opacity:0;filter:alpha(opacity=0)}#MathJax_ZoomFrame{position:relative;display:inline-block;height:0;width:0}#MathJax_ZoomEventTrap{position:absolute;left:0;top:0;z-index:302;display:inline-block;border:0;padding:0;margin:0;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.MathJax_Preview{color:#888}#MathJax_Message{position:fixed;left:1px;bottom:2px;background-color:#E6E6E6;border:1px solid #959595;margin:0;padding:2px 8px;z-index:102;color:#000;font-size:80%;width:auto;white-space:nowrap}#MathJax_MSIE_Frame{position:absolute;top:0;left:0;width:0;z-index:101;border:0;margin:0;padding:0}.MathJax_Error{color:#C00;font-style:italic}footer{position:fixed;font-size:.8em;text-align:right;bottom:0;margin-left:-25px;height:20px;width:100%}</style>
</head>
<body class="markdown haroopad">
<h1 id="net-(2.0.1)"><a name="net-(2.0.1)" href="#net-(2.0.1)"></a>net (2.0.1)</h1><p>Updated from 2.0.0 to 2.0.1<br>Added:</p><ul>
<li>Examples</li><li>Support for latest multi version</li><li>Updated readme</li></ul><h1 id="discord"><a name="discord" href="#discord"></a>Discord</h1><p>For real-time assistance with my libraries! A place where you can ask questions and get help with any of my libraries<br><br><a href="https://discord.gg/U8UspuA">https://discord.gg/U8UspuA</a><br></p><p>The net library was created to make servers and clients interact easily. This isnt for webservers! (It could be, but you would need to code that part) The goal was to allow the creation for game servers!</p><p>This library depends on luasocket and you should use luajit! It will work on a standard lua interperter, but wont be as fast.</p><h1 id="goal"><a name="goal" href="#goal"></a>Goal</h1><p>A simple and powerful way to make servers and clients</p><h1 id="todo"><a name="todo" href="#todo"></a>Todo</h1><ul>
<li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="0"> Write the wiki</li><li style="list-style: none"><input type="checkbox" class="task-list-item" checked="" data-task-index="1"> Make Example folder</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="2"> Document stable modules</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="3"> IPV6 Support</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="4"> Multicast support</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="5"> Clean up modules</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="6"> Improve server ban features</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="7"> Improve stable modules</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="8"> AUDP - advance udp. Ensures packets arrive and handles late packets.</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="9"> P2P - peer to peer (Server to set up initial connection)</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="10"> Relay - offput server load (locally)</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="11"> Threading - Simple threading <del>(UDP/AUDP Only)</del> Thanks to an updated multi library we can thread with ease</li><li style="list-style: none"><input type="checkbox" class="task-list-item" data-task-index="12"> Priority handling</li></ul><h1 id="note"><a name="note" href="#note"></a>Note</h1><p>You will see a bunch of files inside of the net folder. All that is stable is the init.lua and sft.lua file. Everything else is a work in progress. Plus I am planning on rewritting all of the modules to take advantage of the new threading features that are found in the new multi updates. PRogress on this will be made soon. I have just been away from my PC for a while.</p><h1 id="usage"><a name="usage" href="#usage"></a>Usage</h1><p>server.lua</p><pre class="lua hljs"><code class="lua" data-origin="<pre><code class=&quot;lua&quot;>require(&quot;bin&quot;) -- this library needs a lot of work it has a bunch of old useless code, but also has many nice things as well that are really useful
require(&quot;multi&quot;) -- you need this to handle multiple connections and such
require(&quot;net&quot;) -- That requires the main library
server=net:newTCPServer(12345) -- create a server that listens on port 12345
server.OnDataRecieved(function(self,data,CID_OR_HANDLE,IP_OR_HANDLE,PORT_OR_IP,UPDATER_OR_NIL) -- a bit confusing, but dont worry you will hardly ever need more then the first 5 arguments, unless you are writing modules!
if data==&quot;Hello!&quot; then
print(&quot;Got response from client sending back data!&quot;)
self:send(IP_OR_HANDLE,&quot;Hello Client!&quot;,PORT_OR_IP) -- doing it like this makes this code work for both udp and tcp
end
end)
multi:mainloop()
</code></pre>"><span class="hljs-built_in">require</span>(<span class="hljs-string">"bin"</span>) <span class="hljs-comment">-- this library needs a lot of work it has a bunch of old useless code, but also has many nice things as well that are really useful</span>
<span class="hljs-built_in">require</span>(<span class="hljs-string">"multi"</span>) <span class="hljs-comment">-- you need this to handle multiple connections and such</span>
<span class="hljs-built_in">require</span>(<span class="hljs-string">"net"</span>) <span class="hljs-comment">-- That requires the main library</span>
server=net:newTCPServer(<span class="hljs-number">12345</span>) <span class="hljs-comment">-- create a server that listens on port 12345</span>
server.OnDataRecieved(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(self,data,CID_OR_HANDLE,IP_OR_HANDLE,PORT_OR_IP,UPDATER_OR_NIL)</span></span> <span class="hljs-comment">-- a bit confusing, but dont worry you will hardly ever need more then the first 5 arguments, unless you are writing modules!</span>
<span class="hljs-keyword">if</span> data==<span class="hljs-string">"Hello!"</span> <span class="hljs-keyword">then</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Got response from client sending back data!"</span>)
self:send(IP_OR_HANDLE,<span class="hljs-string">"Hello Client!"</span>,PORT_OR_IP) <span class="hljs-comment">-- doing it like this makes this code work for both udp and tcp</span>
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>)
multi:mainloop()
</code></pre><p>client.lua</p><pre class="lua hljs"><code class="lua" data-origin="<pre><code class=&quot;lua&quot;>require(&quot;bin&quot;) -- this library needs a lot of work it has a bunch of old useless code, but also has many nice things as well that are really useful
require(&quot;multi&quot;) -- you need this to handle multiple connections and such
require(&quot;net&quot;) -- That requires the main library
client=net:newTCPClient(&quot;localhost&quot;,12345) -- connect to the server
client.OnClientReady(function(self)
self:send(&quot;Hello!&quot;)
end) -- For a tcp client the client is already ready, with udp a small handshake is done and the client is not instantly ready
client.OnDataRecieved(function(self,data) -- thats it clients only have to worry about itself and the server
if data==&quot;Hello Client!&quot; then
print(&quot;Server Responded Back!&quot;)
end
end)
multi:mainloop()
</code></pre>"><span class="hljs-built_in">require</span>(<span class="hljs-string">"bin"</span>) <span class="hljs-comment">-- this library needs a lot of work it has a bunch of old useless code, but also has many nice things as well that are really useful</span>
<span class="hljs-built_in">require</span>(<span class="hljs-string">"multi"</span>) <span class="hljs-comment">-- you need this to handle multiple connections and such</span>
<span class="hljs-built_in">require</span>(<span class="hljs-string">"net"</span>) <span class="hljs-comment">-- That requires the main library</span>
client=net:newTCPClient(<span class="hljs-string">"localhost"</span>,<span class="hljs-number">12345</span>) <span class="hljs-comment">-- connect to the server</span>
client.OnClientReady(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(self)</span></span>
self:send(<span class="hljs-string">"Hello!"</span>)
<span class="hljs-keyword">end</span>) <span class="hljs-comment">-- For a tcp client the client is already ready, with udp a small handshake is done and the client is not instantly ready</span>
client.OnDataRecieved(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(self,data)</span></span> <span class="hljs-comment">-- thats it clients only have to worry about itself and the server</span>
<span class="hljs-keyword">if</span> data==<span class="hljs-string">"Hello Client!"</span> <span class="hljs-keyword">then</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Server Responded Back!"</span>)
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>)
multi:mainloop()
</code></pre><p>There is support for broadcasting, multicasting will be added soon requires luasocker 3.0+.<br><br>Here is a broadcasting example:<br><br>broadcastingExampleServer.lua (included in example folders)</p><pre class="lua hljs"><code class="lua" data-origin="<pre><code class=&quot;lua&quot;>package.path=&quot;?/init.lua;&quot;..package.path
-- Note: you need 2 computers to test this! Broadcast does not on local host!
-- I have tested this code and it works, but only on seperate PC's within the same LAN network
require(&quot;bin&quot;)
require(&quot;multi&quot;)
require(&quot;net&quot;)
server=net:newServer(12345)
server.OnDataRecieved(function(self,data,CID_OR_HANDLE,IP_OR_HANDLE,PORT_OR_IP,UPDATER_OR_NIL)
if data==&quot;Hello!&quot; then -- copy from other example
print(&quot;Got response from client sending back data!&quot;)
self:send(IP_OR_HANDLE,&quot;Hello Client!&quot;,PORT_OR_IP) -- doing it like this makes this code work for both udp and tcp
end
end)
server:broadcast(&quot;Lua_Server&quot;)
multi:mainloop()
</code></pre>"><span class="hljs-built_in">package</span>.path=<span class="hljs-string">"?/init.lua;"</span>..<span class="hljs-built_in">package</span>.path
<span class="hljs-comment">-- Note: you need 2 computers to test this! Broadcast does not on local host!</span>
<span class="hljs-comment">-- I have tested this code and it works, but only on seperate PC's within the same LAN network</span>
<span class="hljs-built_in">require</span>(<span class="hljs-string">"bin"</span>)
<span class="hljs-built_in">require</span>(<span class="hljs-string">"multi"</span>)
<span class="hljs-built_in">require</span>(<span class="hljs-string">"net"</span>)
server=net:newServer(<span class="hljs-number">12345</span>)
server.OnDataRecieved(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(self,data,CID_OR_HANDLE,IP_OR_HANDLE,PORT_OR_IP,UPDATER_OR_NIL)</span></span>
<span class="hljs-keyword">if</span> data==<span class="hljs-string">"Hello!"</span> <span class="hljs-keyword">then</span> <span class="hljs-comment">-- copy from other example</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Got response from client sending back data!"</span>)
self:send(IP_OR_HANDLE,<span class="hljs-string">"Hello Client!"</span>,PORT_OR_IP) <span class="hljs-comment">-- doing it like this makes this code work for both udp and tcp</span>
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>)
server:broadcast(<span class="hljs-string">"Lua_Server"</span>)
multi:mainloop()
</code></pre><p>broadcastingExampleClient.lua (included in example folders)</p><pre class="lua hljs"><code class="lua" data-origin="<pre><code class=&quot;lua&quot;>package.path=&quot;?/init.lua;&quot;..package.path
require(&quot;bin&quot;)
require(&quot;multi&quot;)
require(&quot;net.aft&quot;)
client=net:newCastedClient(&quot;Lua_Server&quot;) -- searches the lan for this server name
-- Both udp and tcp clients can be broadcasted
client.OnClientReady(function(self)
self:send(&quot;Hello!&quot;)
end) -- For a tcp client the client is already ready, with udp a small handshake is done and the client is not instantly ready
client.OnDataRecieved(function(self,data) -- thats it clients only have to worry about itself and the server
if data==&quot;Hello Client!&quot; then
print(&quot;Server Responded Back!&quot;)
end
end)
multi:mainloop()
</code></pre>"><span class="hljs-built_in">package</span>.path=<span class="hljs-string">"?/init.lua;"</span>..<span class="hljs-built_in">package</span>.path
<span class="hljs-built_in">require</span>(<span class="hljs-string">"bin"</span>)
<span class="hljs-built_in">require</span>(<span class="hljs-string">"multi"</span>)
<span class="hljs-built_in">require</span>(<span class="hljs-string">"net.aft"</span>)
client=net:newCastedClient(<span class="hljs-string">"Lua_Server"</span>) <span class="hljs-comment">-- searches the lan for this server name</span>
<span class="hljs-comment">-- Both udp and tcp clients can be broadcasted</span>
client.OnClientReady(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(self)</span></span>
self:send(<span class="hljs-string">"Hello!"</span>)
<span class="hljs-keyword">end</span>) <span class="hljs-comment">-- For a tcp client the client is already ready, with udp a small handshake is done and the client is not instantly ready</span>
client.OnDataRecieved(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(self,data)</span></span> <span class="hljs-comment">-- thats it clients only have to worry about itself and the server</span>
<span class="hljs-keyword">if</span> data==<span class="hljs-string">"Hello Client!"</span> <span class="hljs-keyword">then</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"Server Responded Back!"</span>)
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>)
multi:mainloop()
</code></pre><p>The net library also provides a powerful module creation interface. You have all of the modules in the net folder as examples, however I will show you how you could go about creating your own!<br></p><p><strong>All functions include:<br></strong></p><ul>
<li>net.OnServerCreated() — Refer to the multi library example on connections: <a href="https://github.com/rayaman/multi#connections">https://github.com/rayaman/multi#connections</a></li><li>net.OnClientCreated() — ^^</li><li>net.normalize(input) — formats data in base 64</li><li>net.denormalize(input) — takes base 64 data and turns it back into what it was</li><li>net.getLocalIP() — returns your loacl ip</li><li>net.getExternalIP() — If this ever stops working let me know… Ill have to update the service I am using</li><li>net:registerModule(mod,version) — registers a module. Checks out the example below</li><li>net.getModuleVersion(ext) — returns the version of a module</li><li>net.resolveID(obj) — an internal method for generating unique IDs obj is a table with an ID key</li><li>net.inList(list,dat) — checks if dat is a value in list</li><li>net.setTrigger(funcW,funcE) — Currently does nothing… I forgot where I was going with this</li><li>net:newCastedClient(name) — connects to a server that is being broadcasted see above example</li><li>net:newServer(port,servercode) — creates a UDP Server</li><li>net:newClient(host,port,servercode,nonluaServer) — creates a UDP Client</li><li>net:newTCPServer(port) — creates a TCP Server</li><li>net:newTCPClient(host,port) — creates a TCP Client</li></ul><p>Both TCP/UPD Clients and Servers contain the same methods:<br>Server Object:</p><h1 id="general-server-methods"><a name="general-server-methods" href="#general-server-methods"></a>General Server Methods</h1><ul>
<li>serverobj:setUpdateRate(n)</li><li>server:banCID(cid)</li><li>server:banIP(ip)</li><li>server:broadcast(name)</li><li>server:send(ip,data,port,cid)</li><li>server:pollClientModules(ip,port)</li><li>server:CIDFrom(ip,port)</li><li>server:sendAll(data)</li><li>server:sendAllBut(data,cid)</li><li>server:clientRegistered(cid)</li><li>server:clientLoggedIn(cid)</li><li>server:update() — Internal method do not call!</li><li>server.OnClientsModulesList()</li><li>server.OnDataRecieved()</li><li>server.OnClientClosed()</li><li>server.OnClientConnected()</li><li>server.hostip=net.getLocalIP()</li><li>server.port</li></ul><h1 id="tcp-server-only-methods"><a name="tcp-server-only-methods" href="#tcp-server-only-methods"></a>TCP Server Only Methods</h1><ul>
<li>server:setReceiveMode(mode)</li><li>server:setSendMode(mode)</li><li>server:sendAllData(handle,data)</li><li>server:getUpdater(cid)</li></ul><h1 id="general-client-methods"><a name="general-client-methods" href="#general-client-methods"></a>General Client Methods</h1><ul>
<li>client:send(data)</li><li>client:sendRaw(data)</li><li>client:close()</li><li>client:getCID()</li><li>client:update() — Internal method do not call!</li><li>client:reconnect()</li><li>client:IDAssigned()</li><li>client.OnDataRecieved()</li><li>client.OnClientReady()</li><li>client.OnClientDisconnected()</li><li>client.OnConnectionRegained()</li></ul><h1 id="udp-client-only-methods"><a name="udp-client-only-methods" href="#udp-client-only-methods"></a>UDP Client Only Methods</h1><ul>
<li>client.OnPingRecieved()</li><li>client.OnServerNotAvailable</li></ul><h1 id="tcp-client-only-methods"><a name="tcp-client-only-methods" href="#tcp-client-only-methods"></a>TCP Client Only Methods</h1><ul>
<li>client:setReceiveMode(mode)</li><li>client:setSendMode(mode)</li></ul><p>When using the module creation support here is the shell that you can use:</p><pre class="lua hljs"><code class="lua" data-origin="<pre><code class=&quot;lua&quot;>require(&quot;net&quot;) -- what do you need? other modules or the core? always require the core so users can require your module without having to require the core themself
local MODULENAME=&quot;EXAMPLE&quot;
net:registerModule(MODULENAME,{1,0,0})
if not io.dirExists(string.upper(MODULENAME)) then -- do you need a directory to store stuff for your module?
io.mkDir(string.upper(MODULENAME))
end
net.OnServerCreated:connect(function(s)
s.OnDataRecieved(function(self,data,CID_OR_HANDLE,IP_OR_HANDLE,PORT_OR_IP)
local cmd,arg1,arg2=data:match(&quot;!&quot;..MODULENAME..&quot;! (%S+) (%S+) (%S+)&quot;) -- change to fit your needs
if cmd==&quot;SEND&quot; then
--
elseif cmd==&quot;GET&quot; then
--
end
end,MODULENAME)
end)
net.OnClientCreated:connect(function(c)
c.OnDataRecieved(function(self,data)
local cmd,arg1,arg2=data:match(&quot;!&quot;..MODULENAME..&quot;! (%S+) (%S+) (%S+)&quot;) -- change to fit your needs
if cmd==&quot;SEND&quot; then
--
elseif cmd==&quot;GET&quot; then
--
end
end,MODULENAME)
end)
</code></pre>"><span class="hljs-built_in">require</span>(<span class="hljs-string">"net"</span>) <span class="hljs-comment">-- what do you need? other modules or the core? always require the core so users can require your module without having to require the core themself</span>
<span class="hljs-keyword">local</span> MODULENAME=<span class="hljs-string">"EXAMPLE"</span>
net:registerModule(MODULENAME,{<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>})
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-built_in">io</span>.dirExists(<span class="hljs-built_in">string</span>.upper(MODULENAME)) <span class="hljs-keyword">then</span> <span class="hljs-comment">-- do you need a directory to store stuff for your module?</span>
<span class="hljs-built_in">io</span>.mkDir(<span class="hljs-built_in">string</span>.upper(MODULENAME))
<span class="hljs-keyword">end</span>
net.OnServerCreated:connect(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(s)</span></span>
s.OnDataRecieved(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(self,data,CID_OR_HANDLE,IP_OR_HANDLE,PORT_OR_IP)</span></span>
<span class="hljs-keyword">local</span> cmd,arg1,arg2=data:match(<span class="hljs-string">"!"</span>..MODULENAME..<span class="hljs-string">"! (%S+) (%S+) (%S+)"</span>) <span class="hljs-comment">-- change to fit your needs</span>
<span class="hljs-keyword">if</span> cmd==<span class="hljs-string">"SEND"</span> <span class="hljs-keyword">then</span>
<span class="hljs-comment">--</span>
<span class="hljs-keyword">elseif</span> cmd==<span class="hljs-string">"GET"</span> <span class="hljs-keyword">then</span>
<span class="hljs-comment">--</span>
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>,MODULENAME)
<span class="hljs-keyword">end</span>)
net.OnClientCreated:connect(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(c)</span></span>
c.OnDataRecieved(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(self,data)</span></span>
<span class="hljs-keyword">local</span> cmd,arg1,arg2=data:match(<span class="hljs-string">"!"</span>..MODULENAME..<span class="hljs-string">"! (%S+) (%S+) (%S+)"</span>) <span class="hljs-comment">-- change to fit your needs</span>
<span class="hljs-keyword">if</span> cmd==<span class="hljs-string">"SEND"</span> <span class="hljs-keyword">then</span>
<span class="hljs-comment">--</span>
<span class="hljs-keyword">elseif</span> cmd==<span class="hljs-string">"GET"</span> <span class="hljs-keyword">then</span>
<span class="hljs-comment">--</span>
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>,MODULENAME)
<span class="hljs-keyword">end</span>)
</code></pre><p>The bin and multi library can be found on my github page. They are all 100%(If you ingore intergrations) pure lua so it should be easy to add to your project.<br><a href="https://github.com/rayaman/multi">https://github.com/rayaman/multi</a><br><a href="https://github.com/rayaman/bin">https://github.com/rayaman/bin</a></p>
<footer style="position:fixed; font-size:.8em; text-align:right; bottom:0px; margin-left:-25px; height:20px; width:100%;">generated by <a href="http://pad.haroopress.com" target="_blank">haroopad</a></footer>
</body>
</html>