diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/CNAME b/CNAME
new file mode 100644
index 0000000..5e7105c
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+f4pga.org
diff --git a/assets/css/developers.css b/assets/css/developers.css
new file mode 100644
index 0000000..7243145
--- /dev/null
+++ b/assets/css/developers.css
@@ -0,0 +1,7 @@
+/*!
+ * Hamburgers
+ * @description Tasty CSS-animated hamburgers
+ * @author Jonathan Suh @jonsuh
+ * @site https://jonsuh.com/hamburgers
+ * @link https://github.com/jonsuh/hamburgers
+ */.hamburger{font:inherit;display:inline-block;overflow:visible;margin:0;padding:15px;cursor:pointer;transition-timing-function:linear;transition-duration:.15s;transition-property:opacity,filter;text-transform:none;color:inherit;border:0;background-color:transparent}.hamburger.is-active:hover,.hamburger:hover{opacity:.7}.hamburger.is-active .hamburger-inner,.hamburger.is-active .hamburger-inner:after,.hamburger.is-active .hamburger-inner:before{background-color:#000}.hamburger-box{position:relative;display:inline-block;width:40px;height:24px}.hamburger-inner{top:50%;display:block;margin-top:-2px}.hamburger-inner,.hamburger-inner:after,.hamburger-inner:before{position:absolute;width:40px;height:4px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform;border-radius:4px;background-color:#000}.hamburger-inner:after,.hamburger-inner:before{display:block;content:""}.hamburger-inner:before{top:-10px}.hamburger-inner:after{bottom:-10px}.hamburger--3dx .hamburger-box{perspective:80px}.hamburger--3dx .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx .hamburger-inner:after,.hamburger--3dx .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx.is-active .hamburger-inner{transform:rotateY(180deg);background-color:transparent !important}.hamburger--3dx.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dx.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dx-r .hamburger-box{perspective:80px}.hamburger--3dx-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx-r .hamburger-inner:after,.hamburger--3dx-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx-r.is-active .hamburger-inner{transform:rotateY(-180deg);background-color:transparent !important}.hamburger--3dx-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dx-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dy .hamburger-box{perspective:80px}.hamburger--3dy .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy .hamburger-inner:after,.hamburger--3dy .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy.is-active .hamburger-inner{transform:rotateX(-180deg);background-color:transparent !important}.hamburger--3dy.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dy.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dy-r .hamburger-box{perspective:80px}.hamburger--3dy-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy-r .hamburger-inner:after,.hamburger--3dy-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy-r.is-active .hamburger-inner{transform:rotateX(180deg);background-color:transparent !important}.hamburger--3dy-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dy-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dxy .hamburger-box{perspective:80px}.hamburger--3dxy .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy .hamburger-inner:after,.hamburger--3dxy .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy.is-active .hamburger-inner{transform:rotateX(180deg) rotateY(180deg);background-color:transparent !important}.hamburger--3dxy.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dxy.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dxy-r .hamburger-box{perspective:80px}.hamburger--3dxy-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy-r .hamburger-inner:after,.hamburger--3dxy-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy-r.is-active .hamburger-inner{transform:rotateX(180deg) rotateY(180deg) rotate(-180deg);background-color:transparent !important}.hamburger--3dxy-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dxy-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--arrow.is-active .hamburger-inner:before{transform:translate3d(-8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrow.is-active .hamburger-inner:after{transform:translate3d(-8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrow-r.is-active .hamburger-inner:before{transform:translate3d(8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrow-r.is-active .hamburger-inner:after{transform:translate3d(8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowalt .hamburger-inner:before{transition:top 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt .hamburger-inner:after{transition:bottom 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt.is-active .hamburger-inner:before{top:0;transition:top 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(-8px, -10px, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowalt.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(-8px, 10px, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowalt-r .hamburger-inner:before{transition:top 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt-r .hamburger-inner:after{transition:bottom 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(8px, -10px, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowalt-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(8px, 10px, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn.is-active .hamburger-inner{transform:rotate(-180deg)}.hamburger--arrowturn.is-active .hamburger-inner:before{transform:translate3d(8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowturn.is-active .hamburger-inner:after{transform:translate3d(8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn-r.is-active .hamburger-inner{transform:rotate(-180deg)}.hamburger--arrowturn-r.is-active .hamburger-inner:before{transform:translate3d(-8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn-r.is-active .hamburger-inner:after{transform:translate3d(-8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--boring .hamburger-inner,.hamburger--boring .hamburger-inner:after,.hamburger--boring .hamburger-inner:before{transition-property:none}.hamburger--boring.is-active .hamburger-inner{transform:rotate(45deg)}.hamburger--boring.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--boring.is-active .hamburger-inner:after{bottom:0;transform:rotate(-90deg)}.hamburger--collapse .hamburger-inner{top:auto;bottom:0;transition-delay:.13s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--collapse .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0.1s linear}.hamburger--collapse .hamburger-inner:before{transition:top 0.12s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--collapse.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--collapse.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0.1s linear 0.22s;opacity:0}.hamburger--collapse.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.16s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.25s;transform:rotate(-90deg)}.hamburger--collapse-r .hamburger-inner{top:auto;bottom:0;transition-delay:.13s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--collapse-r .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0.1s linear}.hamburger--collapse-r .hamburger-inner:before{transition:top 0.12s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--collapse-r.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(45deg)}.hamburger--collapse-r.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0.1s linear 0.22s;opacity:0}.hamburger--collapse-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.16s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.25s;transform:rotate(90deg)}.hamburger--elastic .hamburger-inner{top:2px;transition-timing-function:cubic-bezier(0.68, -0.55, 0.265, 1.55);transition-duration:.275s}.hamburger--elastic .hamburger-inner:before{top:10px;transition:opacity .125s ease .275s}.hamburger--elastic .hamburger-inner:after{top:20px;transition:transform 0.275s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.hamburger--elastic.is-active .hamburger-inner{transition-delay:75ms;transform:translate3d(0, 10px, 0) rotate(135deg)}.hamburger--elastic.is-active .hamburger-inner:before{transition-delay:0s;opacity:0}.hamburger--elastic.is-active .hamburger-inner:after{transition-delay:75ms;transform:translate3d(0, -20px, 0) rotate(-270deg)}.hamburger--elastic-r .hamburger-inner{top:2px;transition-timing-function:cubic-bezier(0.68, -0.55, 0.265, 1.55);transition-duration:.275s}.hamburger--elastic-r .hamburger-inner:before{top:10px;transition:opacity .125s ease .275s}.hamburger--elastic-r .hamburger-inner:after{top:20px;transition:transform 0.275s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.hamburger--elastic-r.is-active .hamburger-inner{transition-delay:75ms;transform:translate3d(0, 10px, 0) rotate(-135deg)}.hamburger--elastic-r.is-active .hamburger-inner:before{transition-delay:0s;opacity:0}.hamburger--elastic-r.is-active .hamburger-inner:after{transition-delay:75ms;transform:translate3d(0, -20px, 0) rotate(270deg)}.hamburger--emphatic{overflow:hidden}.hamburger--emphatic .hamburger-inner{transition:background-color .125s ease-in .175s}.hamburger--emphatic .hamburger-inner:before{left:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,left 0.125s ease-in 0.175s}.hamburger--emphatic .hamburger-inner:after{top:10px;right:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,right 0.125s ease-in 0.175s}.hamburger--emphatic.is-active .hamburger-inner{transition-delay:0s;transition-timing-function:ease-out;background-color:transparent !important}.hamburger--emphatic.is-active .hamburger-inner:before{top:-80px;left:-80px;transition:left 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(80px, 80px, 0) rotate(45deg)}.hamburger--emphatic.is-active .hamburger-inner:after{top:-80px;right:-80px;transition:right 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(-80px, 80px, 0) rotate(-45deg)}.hamburger--emphatic-r{overflow:hidden}.hamburger--emphatic-r .hamburger-inner{transition:background-color .125s ease-in .175s}.hamburger--emphatic-r .hamburger-inner:before{left:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,left 0.125s ease-in 0.175s}.hamburger--emphatic-r .hamburger-inner:after{top:10px;right:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,right 0.125s ease-in 0.175s}.hamburger--emphatic-r.is-active .hamburger-inner{transition-delay:0s;transition-timing-function:ease-out;background-color:transparent !important}.hamburger--emphatic-r.is-active .hamburger-inner:before{top:80px;left:-80px;transition:left 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(80px, -80px, 0) rotate(-45deg)}.hamburger--emphatic-r.is-active .hamburger-inner:after{top:80px;right:-80px;transition:right 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(-80px, -80px, 0) rotate(45deg)}.hamburger--minus .hamburger-inner:after,.hamburger--minus .hamburger-inner:before{transition:bottom .08s ease-out 0s,top .08s ease-out 0s,opacity 0s linear}.hamburger--minus.is-active .hamburger-inner:after,.hamburger--minus.is-active .hamburger-inner:before{transition:bottom .08s ease-out,top .08s ease-out,opacity 0s linear .08s;opacity:0}.hamburger--minus.is-active .hamburger-inner:before{top:0}.hamburger--minus.is-active .hamburger-inner:after{bottom:0}.hamburger--slider .hamburger-inner{top:2px}.hamburger--slider .hamburger-inner:before{top:10px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform,opacity}.hamburger--slider .hamburger-inner:after{top:20px}.hamburger--slider.is-active .hamburger-inner{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--slider.is-active .hamburger-inner:before{transform:rotate(-45deg) translate3d(-5.71429px, -6px, 0);opacity:0}.hamburger--slider.is-active .hamburger-inner:after{transform:translate3d(0, -20px, 0) rotate(-90deg)}.hamburger--slider-r .hamburger-inner{top:2px}.hamburger--slider-r .hamburger-inner:before{top:10px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform,opacity}.hamburger--slider-r .hamburger-inner:after{top:20px}.hamburger--slider-r.is-active .hamburger-inner{transform:translate3d(0, 10px, 0) rotate(-45deg)}.hamburger--slider-r.is-active .hamburger-inner:before{transform:rotate(45deg) translate3d(5.71429px, -6px, 0);opacity:0}.hamburger--slider-r.is-active .hamburger-inner:after{transform:translate3d(0, -20px, 0) rotate(90deg)}.hamburger--spin .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.22s}.hamburger--spin .hamburger-inner:before{transition:top .1s ease-in .25s,opacity .1s ease-in}.hamburger--spin .hamburger-inner:after{transition:bottom 0.1s ease-in 0.25s,transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spin.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(225deg)}.hamburger--spin.is-active .hamburger-inner:before{top:0;transition:top .1s ease-out,opacity .1s ease-out .12s;opacity:0}.hamburger--spin.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease-out,transform 0.22s cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(-90deg)}.hamburger--spin-r .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.22s}.hamburger--spin-r .hamburger-inner:before{transition:top .1s ease-in .25s,opacity .1s ease-in}.hamburger--spin-r .hamburger-inner:after{transition:bottom 0.1s ease-in 0.25s,transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spin-r.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(-225deg)}.hamburger--spin-r.is-active .hamburger-inner:before{top:0;transition:top .1s ease-out,opacity .1s ease-out .12s;opacity:0}.hamburger--spin-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease-out,transform 0.22s cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(90deg)}.hamburger--spring .hamburger-inner{top:2px;transition:background-color 0s linear .13s}.hamburger--spring .hamburger-inner:before{top:10px;transition:top 0.1s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring .hamburger-inner:after{top:20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring.is-active .hamburger-inner{transition-delay:.22s;background-color:transparent !important}.hamburger--spring.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.15s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--spring.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:translate3d(0, 10px, 0) rotate(-45deg)}.hamburger--spring-r .hamburger-inner{top:auto;bottom:0;transition-delay:0s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--spring-r .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0s linear}.hamburger--spring-r .hamburger-inner:before{transition:top 0.1s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring-r.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--spring-r.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0s linear 0.22s;opacity:0}.hamburger--spring-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.15s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:rotate(90deg)}.hamburger--stand .hamburger-inner{transition:transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0.15s,background-color 0s linear 75ms}.hamburger--stand .hamburger-inner:before{transition:top 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand .hamburger-inner:after{transition:bottom 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand.is-active .hamburger-inner{transition:transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0s,background-color 0s linear 0.15s;transform:rotate(90deg);background-color:transparent !important}.hamburger--stand.is-active .hamburger-inner:before{top:0;transition:top 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(-45deg)}.hamburger--stand.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(45deg)}.hamburger--stand-r .hamburger-inner{transition:transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0.15s,background-color 0s linear 75ms}.hamburger--stand-r .hamburger-inner:before{transition:top 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand-r .hamburger-inner:after{transition:bottom 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand-r.is-active .hamburger-inner{transition:transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0s,background-color 0s linear 0.15s;transform:rotate(-90deg);background-color:transparent !important}.hamburger--stand-r.is-active .hamburger-inner:before{top:0;transition:top 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(-45deg)}.hamburger--stand-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(45deg)}.hamburger--squeeze .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:75ms}.hamburger--squeeze .hamburger-inner:before{transition:top 75ms ease .12s,opacity 75ms ease}.hamburger--squeeze .hamburger-inner:after{transition:bottom 75ms ease 0.12s,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--squeeze.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(45deg)}.hamburger--squeeze.is-active .hamburger-inner:before{top:0;transition:top 75ms ease,opacity 75ms ease .12s;opacity:0}.hamburger--squeeze.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(-90deg)}.hamburger--vortex .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transition-duration:.2s}.hamburger--vortex .hamburger-inner:after,.hamburger--vortex .hamburger-inner:before{transition-delay:.1s;transition-timing-function:linear;transition-duration:0s}.hamburger--vortex .hamburger-inner:before{transition-property:top,opacity}.hamburger--vortex .hamburger-inner:after{transition-property:bottom,transform}.hamburger--vortex.is-active .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transform:rotate(765deg)}.hamburger--vortex.is-active .hamburger-inner:after,.hamburger--vortex.is-active .hamburger-inner:before{transition-delay:0s}.hamburger--vortex.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--vortex.is-active .hamburger-inner:after{bottom:0;transform:rotate(90deg)}.hamburger--vortex-r .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transition-duration:.2s}.hamburger--vortex-r .hamburger-inner:after,.hamburger--vortex-r .hamburger-inner:before{transition-delay:.1s;transition-timing-function:linear;transition-duration:0s}.hamburger--vortex-r .hamburger-inner:before{transition-property:top,opacity}.hamburger--vortex-r .hamburger-inner:after{transition-property:bottom,transform}.hamburger--vortex-r.is-active .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transform:rotate(-765deg)}.hamburger--vortex-r.is-active .hamburger-inner:after,.hamburger--vortex-r.is-active .hamburger-inner:before{transition-delay:0s}.hamburger--vortex-r.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--vortex-r.is-active .hamburger-inner:after{bottom:0;transform:rotate(-90deg)}.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide__bullets{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide--rtl{direction:rtl}.tools{margin:80px auto 200px;padding:120px 0 60px}.tools::before{z-index:0;display:block;position:absolute;content:'';width:200vw;height:calc(100% - 320px);background-color:#1226AA;top:38%;left:50%;transform:translate(-50%, -50%)}.tools::after{z-index:-1;display:block;position:absolute;content:'';width:200vw;background-color:#1226AA;height:calc((100% - 320px) / 2);top:39%;transform:translate(-50%, -100%);left:50%}@media screen and (max-width: 800px){.tools::before,.tools::after{top:44%}}.tools__content{position:relative;color:#fff;-moz-column-count:2;column-count:2;-moz-column-gap:60px;column-gap:60px;margin:62px auto 0}@media screen and (max-width: 750px){.tools__content{-moz-column-count:1;column-count:1}}.tools__paragraph{margin:0 0 20px;line-height:30px}.tools__link{color:#10CFC9;font-weight:bold}.tools__header{position:relative;color:#fff;margin:0 auto 70px}.tools__subprojects_header{position:relative;color:#fff;margin:80px auto 52px}.tech{font-weight:bold;color:#1226AA}.help{margin-top:160px;padding:90px 0 100px 0}.help__content{-moz-column-count:2;column-count:2;-moz-column-gap:10px;column-gap:10px;margin:62px auto}@media screen and (max-width: 750px){.help__content{-moz-column-count:1;column-count:1}}.help__content p{margin:0}.help__content ul{-moz-column-break-inside:avoid;break-inside:avoid-column;page-break-inside:avoid}.help__header{margin-bottom:80px}.help__list{margin-top:40px;margin-bottom:60px}.help__register{text-align:center;margin:30px auto}.help__list li{margin-bottom:8px}@media screen and (max-width: 500px){.help__list{padding-left:25px}}.help__links{max-width:700px;flex-wrap:wrap}@media screen and (max-width: 700px){.help__links{flex-direction:column;align-items:center}.help__links .btn{width:210px}.help__links .downloads__anchor:not(:first-child){margin-top:40px}}
diff --git a/assets/css/getting-started.css b/assets/css/getting-started.css
new file mode 100644
index 0000000..3cf103d
--- /dev/null
+++ b/assets/css/getting-started.css
@@ -0,0 +1,7 @@
+/*!
+ * Hamburgers
+ * @description Tasty CSS-animated hamburgers
+ * @author Jonathan Suh @jonsuh
+ * @site https://jonsuh.com/hamburgers
+ * @link https://github.com/jonsuh/hamburgers
+ */.hamburger{font:inherit;display:inline-block;overflow:visible;margin:0;padding:15px;cursor:pointer;transition-timing-function:linear;transition-duration:.15s;transition-property:opacity,filter;text-transform:none;color:inherit;border:0;background-color:transparent}.hamburger.is-active:hover,.hamburger:hover{opacity:.7}.hamburger.is-active .hamburger-inner,.hamburger.is-active .hamburger-inner:after,.hamburger.is-active .hamburger-inner:before{background-color:#000}.hamburger-box{position:relative;display:inline-block;width:40px;height:24px}.hamburger-inner{top:50%;display:block;margin-top:-2px}.hamburger-inner,.hamburger-inner:after,.hamburger-inner:before{position:absolute;width:40px;height:4px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform;border-radius:4px;background-color:#000}.hamburger-inner:after,.hamburger-inner:before{display:block;content:""}.hamburger-inner:before{top:-10px}.hamburger-inner:after{bottom:-10px}.hamburger--3dx .hamburger-box{perspective:80px}.hamburger--3dx .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx .hamburger-inner:after,.hamburger--3dx .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx.is-active .hamburger-inner{transform:rotateY(180deg);background-color:transparent !important}.hamburger--3dx.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dx.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dx-r .hamburger-box{perspective:80px}.hamburger--3dx-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx-r .hamburger-inner:after,.hamburger--3dx-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx-r.is-active .hamburger-inner{transform:rotateY(-180deg);background-color:transparent !important}.hamburger--3dx-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dx-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dy .hamburger-box{perspective:80px}.hamburger--3dy .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy .hamburger-inner:after,.hamburger--3dy .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy.is-active .hamburger-inner{transform:rotateX(-180deg);background-color:transparent !important}.hamburger--3dy.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dy.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dy-r .hamburger-box{perspective:80px}.hamburger--3dy-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy-r .hamburger-inner:after,.hamburger--3dy-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy-r.is-active .hamburger-inner{transform:rotateX(180deg);background-color:transparent !important}.hamburger--3dy-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dy-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dxy .hamburger-box{perspective:80px}.hamburger--3dxy .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy .hamburger-inner:after,.hamburger--3dxy .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy.is-active .hamburger-inner{transform:rotateX(180deg) rotateY(180deg);background-color:transparent !important}.hamburger--3dxy.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dxy.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dxy-r .hamburger-box{perspective:80px}.hamburger--3dxy-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy-r .hamburger-inner:after,.hamburger--3dxy-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy-r.is-active .hamburger-inner{transform:rotateX(180deg) rotateY(180deg) rotate(-180deg);background-color:transparent !important}.hamburger--3dxy-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dxy-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--arrow.is-active .hamburger-inner:before{transform:translate3d(-8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrow.is-active .hamburger-inner:after{transform:translate3d(-8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrow-r.is-active .hamburger-inner:before{transform:translate3d(8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrow-r.is-active .hamburger-inner:after{transform:translate3d(8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowalt .hamburger-inner:before{transition:top 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt .hamburger-inner:after{transition:bottom 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt.is-active .hamburger-inner:before{top:0;transition:top 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(-8px, -10px, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowalt.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(-8px, 10px, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowalt-r .hamburger-inner:before{transition:top 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt-r .hamburger-inner:after{transition:bottom 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(8px, -10px, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowalt-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(8px, 10px, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn.is-active .hamburger-inner{transform:rotate(-180deg)}.hamburger--arrowturn.is-active .hamburger-inner:before{transform:translate3d(8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowturn.is-active .hamburger-inner:after{transform:translate3d(8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn-r.is-active .hamburger-inner{transform:rotate(-180deg)}.hamburger--arrowturn-r.is-active .hamburger-inner:before{transform:translate3d(-8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn-r.is-active .hamburger-inner:after{transform:translate3d(-8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--boring .hamburger-inner,.hamburger--boring .hamburger-inner:after,.hamburger--boring .hamburger-inner:before{transition-property:none}.hamburger--boring.is-active .hamburger-inner{transform:rotate(45deg)}.hamburger--boring.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--boring.is-active .hamburger-inner:after{bottom:0;transform:rotate(-90deg)}.hamburger--collapse .hamburger-inner{top:auto;bottom:0;transition-delay:.13s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--collapse .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0.1s linear}.hamburger--collapse .hamburger-inner:before{transition:top 0.12s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--collapse.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--collapse.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0.1s linear 0.22s;opacity:0}.hamburger--collapse.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.16s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.25s;transform:rotate(-90deg)}.hamburger--collapse-r .hamburger-inner{top:auto;bottom:0;transition-delay:.13s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--collapse-r .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0.1s linear}.hamburger--collapse-r .hamburger-inner:before{transition:top 0.12s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--collapse-r.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(45deg)}.hamburger--collapse-r.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0.1s linear 0.22s;opacity:0}.hamburger--collapse-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.16s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.25s;transform:rotate(90deg)}.hamburger--elastic .hamburger-inner{top:2px;transition-timing-function:cubic-bezier(0.68, -0.55, 0.265, 1.55);transition-duration:.275s}.hamburger--elastic .hamburger-inner:before{top:10px;transition:opacity .125s ease .275s}.hamburger--elastic .hamburger-inner:after{top:20px;transition:transform 0.275s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.hamburger--elastic.is-active .hamburger-inner{transition-delay:75ms;transform:translate3d(0, 10px, 0) rotate(135deg)}.hamburger--elastic.is-active .hamburger-inner:before{transition-delay:0s;opacity:0}.hamburger--elastic.is-active .hamburger-inner:after{transition-delay:75ms;transform:translate3d(0, -20px, 0) rotate(-270deg)}.hamburger--elastic-r .hamburger-inner{top:2px;transition-timing-function:cubic-bezier(0.68, -0.55, 0.265, 1.55);transition-duration:.275s}.hamburger--elastic-r .hamburger-inner:before{top:10px;transition:opacity .125s ease .275s}.hamburger--elastic-r .hamburger-inner:after{top:20px;transition:transform 0.275s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.hamburger--elastic-r.is-active .hamburger-inner{transition-delay:75ms;transform:translate3d(0, 10px, 0) rotate(-135deg)}.hamburger--elastic-r.is-active .hamburger-inner:before{transition-delay:0s;opacity:0}.hamburger--elastic-r.is-active .hamburger-inner:after{transition-delay:75ms;transform:translate3d(0, -20px, 0) rotate(270deg)}.hamburger--emphatic{overflow:hidden}.hamburger--emphatic .hamburger-inner{transition:background-color .125s ease-in .175s}.hamburger--emphatic .hamburger-inner:before{left:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,left 0.125s ease-in 0.175s}.hamburger--emphatic .hamburger-inner:after{top:10px;right:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,right 0.125s ease-in 0.175s}.hamburger--emphatic.is-active .hamburger-inner{transition-delay:0s;transition-timing-function:ease-out;background-color:transparent !important}.hamburger--emphatic.is-active .hamburger-inner:before{top:-80px;left:-80px;transition:left 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(80px, 80px, 0) rotate(45deg)}.hamburger--emphatic.is-active .hamburger-inner:after{top:-80px;right:-80px;transition:right 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(-80px, 80px, 0) rotate(-45deg)}.hamburger--emphatic-r{overflow:hidden}.hamburger--emphatic-r .hamburger-inner{transition:background-color .125s ease-in .175s}.hamburger--emphatic-r .hamburger-inner:before{left:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,left 0.125s ease-in 0.175s}.hamburger--emphatic-r .hamburger-inner:after{top:10px;right:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,right 0.125s ease-in 0.175s}.hamburger--emphatic-r.is-active .hamburger-inner{transition-delay:0s;transition-timing-function:ease-out;background-color:transparent !important}.hamburger--emphatic-r.is-active .hamburger-inner:before{top:80px;left:-80px;transition:left 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(80px, -80px, 0) rotate(-45deg)}.hamburger--emphatic-r.is-active .hamburger-inner:after{top:80px;right:-80px;transition:right 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(-80px, -80px, 0) rotate(45deg)}.hamburger--minus .hamburger-inner:after,.hamburger--minus .hamburger-inner:before{transition:bottom .08s ease-out 0s,top .08s ease-out 0s,opacity 0s linear}.hamburger--minus.is-active .hamburger-inner:after,.hamburger--minus.is-active .hamburger-inner:before{transition:bottom .08s ease-out,top .08s ease-out,opacity 0s linear .08s;opacity:0}.hamburger--minus.is-active .hamburger-inner:before{top:0}.hamburger--minus.is-active .hamburger-inner:after{bottom:0}.hamburger--slider .hamburger-inner{top:2px}.hamburger--slider .hamburger-inner:before{top:10px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform,opacity}.hamburger--slider .hamburger-inner:after{top:20px}.hamburger--slider.is-active .hamburger-inner{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--slider.is-active .hamburger-inner:before{transform:rotate(-45deg) translate3d(-5.71429px, -6px, 0);opacity:0}.hamburger--slider.is-active .hamburger-inner:after{transform:translate3d(0, -20px, 0) rotate(-90deg)}.hamburger--slider-r .hamburger-inner{top:2px}.hamburger--slider-r .hamburger-inner:before{top:10px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform,opacity}.hamburger--slider-r .hamburger-inner:after{top:20px}.hamburger--slider-r.is-active .hamburger-inner{transform:translate3d(0, 10px, 0) rotate(-45deg)}.hamburger--slider-r.is-active .hamburger-inner:before{transform:rotate(45deg) translate3d(5.71429px, -6px, 0);opacity:0}.hamburger--slider-r.is-active .hamburger-inner:after{transform:translate3d(0, -20px, 0) rotate(90deg)}.hamburger--spin .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.22s}.hamburger--spin .hamburger-inner:before{transition:top .1s ease-in .25s,opacity .1s ease-in}.hamburger--spin .hamburger-inner:after{transition:bottom 0.1s ease-in 0.25s,transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spin.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(225deg)}.hamburger--spin.is-active .hamburger-inner:before{top:0;transition:top .1s ease-out,opacity .1s ease-out .12s;opacity:0}.hamburger--spin.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease-out,transform 0.22s cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(-90deg)}.hamburger--spin-r .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.22s}.hamburger--spin-r .hamburger-inner:before{transition:top .1s ease-in .25s,opacity .1s ease-in}.hamburger--spin-r .hamburger-inner:after{transition:bottom 0.1s ease-in 0.25s,transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spin-r.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(-225deg)}.hamburger--spin-r.is-active .hamburger-inner:before{top:0;transition:top .1s ease-out,opacity .1s ease-out .12s;opacity:0}.hamburger--spin-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease-out,transform 0.22s cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(90deg)}.hamburger--spring .hamburger-inner{top:2px;transition:background-color 0s linear .13s}.hamburger--spring .hamburger-inner:before{top:10px;transition:top 0.1s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring .hamburger-inner:after{top:20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring.is-active .hamburger-inner{transition-delay:.22s;background-color:transparent !important}.hamburger--spring.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.15s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--spring.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:translate3d(0, 10px, 0) rotate(-45deg)}.hamburger--spring-r .hamburger-inner{top:auto;bottom:0;transition-delay:0s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--spring-r .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0s linear}.hamburger--spring-r .hamburger-inner:before{transition:top 0.1s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring-r.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--spring-r.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0s linear 0.22s;opacity:0}.hamburger--spring-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.15s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:rotate(90deg)}.hamburger--stand .hamburger-inner{transition:transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0.15s,background-color 0s linear 75ms}.hamburger--stand .hamburger-inner:before{transition:top 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand .hamburger-inner:after{transition:bottom 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand.is-active .hamburger-inner{transition:transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0s,background-color 0s linear 0.15s;transform:rotate(90deg);background-color:transparent !important}.hamburger--stand.is-active .hamburger-inner:before{top:0;transition:top 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(-45deg)}.hamburger--stand.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(45deg)}.hamburger--stand-r .hamburger-inner{transition:transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0.15s,background-color 0s linear 75ms}.hamburger--stand-r .hamburger-inner:before{transition:top 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand-r .hamburger-inner:after{transition:bottom 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand-r.is-active .hamburger-inner{transition:transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0s,background-color 0s linear 0.15s;transform:rotate(-90deg);background-color:transparent !important}.hamburger--stand-r.is-active .hamburger-inner:before{top:0;transition:top 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(-45deg)}.hamburger--stand-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(45deg)}.hamburger--squeeze .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:75ms}.hamburger--squeeze .hamburger-inner:before{transition:top 75ms ease .12s,opacity 75ms ease}.hamburger--squeeze .hamburger-inner:after{transition:bottom 75ms ease 0.12s,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--squeeze.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(45deg)}.hamburger--squeeze.is-active .hamburger-inner:before{top:0;transition:top 75ms ease,opacity 75ms ease .12s;opacity:0}.hamburger--squeeze.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(-90deg)}.hamburger--vortex .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transition-duration:.2s}.hamburger--vortex .hamburger-inner:after,.hamburger--vortex .hamburger-inner:before{transition-delay:.1s;transition-timing-function:linear;transition-duration:0s}.hamburger--vortex .hamburger-inner:before{transition-property:top,opacity}.hamburger--vortex .hamburger-inner:after{transition-property:bottom,transform}.hamburger--vortex.is-active .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transform:rotate(765deg)}.hamburger--vortex.is-active .hamburger-inner:after,.hamburger--vortex.is-active .hamburger-inner:before{transition-delay:0s}.hamburger--vortex.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--vortex.is-active .hamburger-inner:after{bottom:0;transform:rotate(90deg)}.hamburger--vortex-r .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transition-duration:.2s}.hamburger--vortex-r .hamburger-inner:after,.hamburger--vortex-r .hamburger-inner:before{transition-delay:.1s;transition-timing-function:linear;transition-duration:0s}.hamburger--vortex-r .hamburger-inner:before{transition-property:top,opacity}.hamburger--vortex-r .hamburger-inner:after{transition-property:bottom,transform}.hamburger--vortex-r.is-active .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transform:rotate(-765deg)}.hamburger--vortex-r.is-active .hamburger-inner:after,.hamburger--vortex-r.is-active .hamburger-inner:before{transition-delay:0s}.hamburger--vortex-r.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--vortex-r.is-active .hamburger-inner:after{bottom:0;transform:rotate(-90deg)}.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide__bullets{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide--rtl{direction:rtl}.btn{width:100%}.getting-wrapper{height:100%;position:relative}.getting{margin:230px auto 0px;padding:200px 0 180px;position:relative}.getting::before{z-index:0;display:block;position:absolute;content:'';width:200vw;height:calc(100% - 150px);background-color:#1226AA;top:50%;left:50%;transform:translate(-50%, -50%)}.getting::after{z-index:-1;display:block;position:absolute;content:'';width:200vw;background-color:#1226AA;height:calc(100% - 150px);top:51%;transform:translate(-50%, -50%);left:50%}@media screen and (max-width: 500px){.getting::after{top:50%}}.getting-bg{position:absolute;bottom:0;margin:0;padding:0;height:180px;width:100%;background-color:#1226AA}.getting__header{position:relative;z-index:1;color:#fff}.getting__content{position:relative;margin:80px auto 0;color:#fff}.getting__content p{width:60%}@media screen and (max-width: 1000px){.getting__content p{width:100%}}.getting__content h3{margin:100px 0 30px;color:#fff;font-size:23px}.getting__buttons{position:relative;padding:0;z-index:1;display:grid;grid-template-columns:repeat(auto-fill, minmax(350px, 1fr));grid-auto-flow:dense;grid-gap:30px}@media screen and (max-width: 700px){.getting__buttons{grid-template-columns:100%}}.getting__buttons a:hover{opacity:1}.getting__button .btn{width:100%}
diff --git a/assets/css/github-activity.css b/assets/css/github-activity.css
new file mode 100644
index 0000000..ece95dc
--- /dev/null
+++ b/assets/css/github-activity.css
@@ -0,0 +1,8 @@
+/*!
+ * GitHub Activity Stream - v0.1.4 - 10/7/2015
+ * https://github.com/caseyscarborough/github-activity
+ *
+ * Copyright (c) 2015 Casey Scarborough
+ * MIT License
+ * http://opensource.org/licenses/MIT
+ */.gha-feed{width:100%;height:100%;font-weight:bold;font-size:16px;line-height:1.3;overflow-y:auto;border-bottom:none}.gha-feed,.gha-feed h2,.gha-feed h3,.gha-feed p,.gha-feed ul,.gha-feed li{margin:0;padding:0}.gha-feed ul{list-style-type:none;padding:10px 5px 0;margin:0 0 5px 0}.gha-feed li{list-style-type:none;line-height:1.4}.gha-feed small{color:#1226AA;font-weight:normal;font-size:16px}.gha-feed small a{font-weight:normal}.gha-feed small a .more-commits{font-size:16px}span.gha-time{color:#1226AA;font-weight:normal;font-size:16px}.gha-feed a{color:#1226AA;text-decoration:none;font-weight:bold}.gha-feed a:hover{text-decoration:underline}.gha-feed pre{padding:0;border:0;border-radius:0}.gha-header{display:none;font-weight:normal;padding:10px;height:90px;border-bottom:1px solid #e6e6e6}.gha-footer{display:none}.gha-footer a{float:right;color:#1226AA;padding-right:20px;font-weight:bold}.gha-footer a:hover{text-decoration:none}.gha-header a:hover{text-decoration:none}.gha-github-icon{display:none;width:35px;height:35px;color:#495961}.gha-github-icon .octicon{padding:10px 10px 5px;font:normal normal 40px octicons}.gha-gravatar{display:none;float:right;margin-right:10px;padding-right:20px;max-width:60px;height:67px}.gha-gravatar img{padding:3px;width:100%;border:1px solid #e6e6e6}.gha-activity{clear:both;padding:12px 0;width:100%;border-bottom:1px solid #e6e6e6}.gha-activity.gha-small{font-weight:normal;font-size:16px}.gha-activity.gha-small a{font-weight:normal}.gha-activity.gha-small span{font-size:16px}.gha-activity:last-child{padding-bottom:100px}.gha-repo{clear:both;padding:10px 0;width:100%;border-bottom:1px solid #e6e6e6}.gha-activity-icon .octicon{display:inline;float:left;clear:both;margin:6px auto;width:50px;color:#bbb;text-align:center;font:normal normal 20px octicons}.gha-activity-icon .gha-small{font-size:16px}.gha-message{display:inline-block;float:left;width:calc(100% - 50px);padding-right:15px}.gha-message-commits{font-size:16px}.gha-message-commits a{padding-top:10px}.gha-message-merge{padding:2px 4px;border-radius:3px;background:#EFE8FF;color:rgba(0,0,0,0.5);font-size:16px;line-height:2.0}.gha-sha{font-size:16px;font-family:Consolas, "Liberation Mono", Courier, monospace}.gha-gravatar-small{float:left;margin:0 10px 10px 0;border-radius:4px;width:45px}.gha-gravatar-commit{margin-bottom:-3px;border-radius:2px;width:20px}.gha-gravatar-user{padding-top:10px}.gha-user-info{display:block;margin:15px 0 5px;padding-left:10px;color:#495961;font-size:21px}.gha-user-info a{display:block;color:#1226AA;font-size:24px;text-align:center}.gha-user-info p{display:none}.gha-without-name{padding-top:20px;padding-left:15px}.gha-info{margin:15px;padding:10px;border:1px solid #e6e6e6;border-radius:4px;background:#ffffde;color:#6d6d4b;font-weight:normal;font-size:16px}.gha-time{color:#bbb;font-weight:normal;font-size:16px}.gha-clear{clear:both}.gha-muted{color:#1226AA}.gha-push{display:none;height:87px}.gha-push-small{display:none;height:26px}
diff --git a/assets/css/glide.core.min.css b/assets/css/glide.core.min.css
new file mode 100644
index 0000000..60a1094
--- /dev/null
+++ b/assets/css/glide.core.min.css
@@ -0,0 +1 @@
+.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows{-webkit-touch-callout:none;user-select:none}.glide__bullets{-webkit-touch-callout:none;user-select:none}.glide--rtl{direction:rtl}
diff --git a/assets/css/glide.theme.min.css b/assets/css/glide.theme.min.css
new file mode 100644
index 0000000..78200ad
--- /dev/null
+++ b/assets/css/glide.theme.min.css
@@ -0,0 +1 @@
+.glide__arrow{position:absolute;display:block;top:50%;z-index:2;color:white;text-transform:uppercase;padding:9px 12px;background-color:transparent;border:2px solid rgba(255,255,255,0.5);border-radius:4px;text-shadow:0 0.25em 0.5em rgba(0,0,0,0.1);opacity:1;cursor:pointer;transition:opacity 150ms ease, border 300ms ease-in-out;transform:translateY(-50%);line-height:1}.glide__arrow:focus{outline:none}.glide__arrow:hover{border-color:white}.glide__arrow--left{left:2em}.glide__arrow--right{right:2em}.glide__arrow--disabled{opacity:0.33}.glide__bullets{position:absolute;z-index:2;bottom:2em;left:50%;display:inline-flex;list-style:none;transform:translateX(-50%)}.glide__bullet{background-color:rgba(255,255,255,0.5);width:9px;height:9px;padding:0;border-radius:50%;border:2px solid transparent;transition:all 300ms ease-in-out;cursor:pointer;line-height:0;margin:0 0.25em}.glide__bullet:focus{outline:none}.glide__bullet:hover,.glide__bullet:focus{border:2px solid white;background-color:rgba(255,255,255,0.5)}.glide__bullet--active{background-color:white}.glide--swipeable{cursor:grab;cursor:-moz-grab;cursor:-webkit-grab}.glide--dragging{cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}
diff --git a/assets/css/main.css b/assets/css/main.css
new file mode 100644
index 0000000..ed4f96e
--- /dev/null
+++ b/assets/css/main.css
@@ -0,0 +1,7 @@
+@import url("https://fonts.googleapis.com/css?family=Nunito:400,700,900");/*!
+ * Hamburgers
+ * @description Tasty CSS-animated hamburgers
+ * @author Jonathan Suh @jonsuh
+ * @site https://jonsuh.com/hamburgers
+ * @link https://github.com/jonsuh/hamburgers
+ */.hamburger{font:inherit;display:inline-block;overflow:visible;margin:0;padding:15px;cursor:pointer;transition-timing-function:linear;transition-duration:.15s;transition-property:opacity,filter;text-transform:none;color:inherit;border:0;background-color:transparent}.hamburger.is-active:hover,.hamburger:hover{opacity:.7}.hamburger.is-active .hamburger-inner,.hamburger.is-active .hamburger-inner:after,.hamburger.is-active .hamburger-inner:before{background-color:#000}.hamburger-box{position:relative;display:inline-block;width:40px;height:24px}.hamburger-inner{top:50%;display:block;margin-top:-2px}.hamburger-inner,.hamburger-inner:after,.hamburger-inner:before{position:absolute;width:40px;height:4px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform;border-radius:4px;background-color:#000}.hamburger-inner:after,.hamburger-inner:before{display:block;content:""}.hamburger-inner:before{top:-10px}.hamburger-inner:after{bottom:-10px}.hamburger--3dx .hamburger-box{perspective:80px}.hamburger--3dx .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx .hamburger-inner:after,.hamburger--3dx .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx.is-active .hamburger-inner{transform:rotateY(180deg);background-color:transparent !important}.hamburger--3dx.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dx.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dx-r .hamburger-box{perspective:80px}.hamburger--3dx-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx-r .hamburger-inner:after,.hamburger--3dx-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dx-r.is-active .hamburger-inner{transform:rotateY(-180deg);background-color:transparent !important}.hamburger--3dx-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dx-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dy .hamburger-box{perspective:80px}.hamburger--3dy .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy .hamburger-inner:after,.hamburger--3dy .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy.is-active .hamburger-inner{transform:rotateX(-180deg);background-color:transparent !important}.hamburger--3dy.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dy.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dy-r .hamburger-box{perspective:80px}.hamburger--3dy-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy-r .hamburger-inner:after,.hamburger--3dy-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dy-r.is-active .hamburger-inner{transform:rotateX(180deg);background-color:transparent !important}.hamburger--3dy-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dy-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dxy .hamburger-box{perspective:80px}.hamburger--3dxy .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy .hamburger-inner:after,.hamburger--3dxy .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy.is-active .hamburger-inner{transform:rotateX(180deg) rotateY(180deg);background-color:transparent !important}.hamburger--3dxy.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dxy.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--3dxy-r .hamburger-box{perspective:80px}.hamburger--3dxy-r .hamburger-inner{transition:transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1),background-color 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy-r .hamburger-inner:after,.hamburger--3dxy-r .hamburger-inner:before{transition:transform 0s cubic-bezier(0.645, 0.045, 0.355, 1) 0.1s}.hamburger--3dxy-r.is-active .hamburger-inner{transform:rotateX(180deg) rotateY(180deg) rotate(-180deg);background-color:transparent !important}.hamburger--3dxy-r.is-active .hamburger-inner:before{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--3dxy-r.is-active .hamburger-inner:after{transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--arrow.is-active .hamburger-inner:before{transform:translate3d(-8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrow.is-active .hamburger-inner:after{transform:translate3d(-8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrow-r.is-active .hamburger-inner:before{transform:translate3d(8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrow-r.is-active .hamburger-inner:after{transform:translate3d(8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowalt .hamburger-inner:before{transition:top 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt .hamburger-inner:after{transition:bottom 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt.is-active .hamburger-inner:before{top:0;transition:top 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(-8px, -10px, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowalt.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(-8px, 10px, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowalt-r .hamburger-inner:before{transition:top 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt-r .hamburger-inner:after{transition:bottom 0.1s ease 0.1s,transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1)}.hamburger--arrowalt-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(8px, -10px, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowalt-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease,transform 0.1s cubic-bezier(0.895, 0.03, 0.685, 0.22) 0.1s;transform:translate3d(8px, 10px, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn.is-active .hamburger-inner{transform:rotate(-180deg)}.hamburger--arrowturn.is-active .hamburger-inner:before{transform:translate3d(8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--arrowturn.is-active .hamburger-inner:after{transform:translate3d(8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn-r.is-active .hamburger-inner{transform:rotate(-180deg)}.hamburger--arrowturn-r.is-active .hamburger-inner:before{transform:translate3d(-8px, 0, 0) rotate(-45deg) scaleX(0.7)}.hamburger--arrowturn-r.is-active .hamburger-inner:after{transform:translate3d(-8px, 0, 0) rotate(45deg) scaleX(0.7)}.hamburger--boring .hamburger-inner,.hamburger--boring .hamburger-inner:after,.hamburger--boring .hamburger-inner:before{transition-property:none}.hamburger--boring.is-active .hamburger-inner{transform:rotate(45deg)}.hamburger--boring.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--boring.is-active .hamburger-inner:after{bottom:0;transform:rotate(-90deg)}.hamburger--collapse .hamburger-inner{top:auto;bottom:0;transition-delay:.13s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--collapse .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0.1s linear}.hamburger--collapse .hamburger-inner:before{transition:top 0.12s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--collapse.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--collapse.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0.1s linear 0.22s;opacity:0}.hamburger--collapse.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.16s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.25s;transform:rotate(-90deg)}.hamburger--collapse-r .hamburger-inner{top:auto;bottom:0;transition-delay:.13s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--collapse-r .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0.1s linear}.hamburger--collapse-r .hamburger-inner:before{transition:top 0.12s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--collapse-r.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(45deg)}.hamburger--collapse-r.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0.1s linear 0.22s;opacity:0}.hamburger--collapse-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.16s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.25s;transform:rotate(90deg)}.hamburger--elastic .hamburger-inner{top:2px;transition-timing-function:cubic-bezier(0.68, -0.55, 0.265, 1.55);transition-duration:.275s}.hamburger--elastic .hamburger-inner:before{top:10px;transition:opacity .125s ease .275s}.hamburger--elastic .hamburger-inner:after{top:20px;transition:transform 0.275s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.hamburger--elastic.is-active .hamburger-inner{transition-delay:75ms;transform:translate3d(0, 10px, 0) rotate(135deg)}.hamburger--elastic.is-active .hamburger-inner:before{transition-delay:0s;opacity:0}.hamburger--elastic.is-active .hamburger-inner:after{transition-delay:75ms;transform:translate3d(0, -20px, 0) rotate(-270deg)}.hamburger--elastic-r .hamburger-inner{top:2px;transition-timing-function:cubic-bezier(0.68, -0.55, 0.265, 1.55);transition-duration:.275s}.hamburger--elastic-r .hamburger-inner:before{top:10px;transition:opacity .125s ease .275s}.hamburger--elastic-r .hamburger-inner:after{top:20px;transition:transform 0.275s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.hamburger--elastic-r.is-active .hamburger-inner{transition-delay:75ms;transform:translate3d(0, 10px, 0) rotate(-135deg)}.hamburger--elastic-r.is-active .hamburger-inner:before{transition-delay:0s;opacity:0}.hamburger--elastic-r.is-active .hamburger-inner:after{transition-delay:75ms;transform:translate3d(0, -20px, 0) rotate(270deg)}.hamburger--emphatic{overflow:hidden}.hamburger--emphatic .hamburger-inner{transition:background-color .125s ease-in .175s}.hamburger--emphatic .hamburger-inner:before{left:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,left 0.125s ease-in 0.175s}.hamburger--emphatic .hamburger-inner:after{top:10px;right:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,right 0.125s ease-in 0.175s}.hamburger--emphatic.is-active .hamburger-inner{transition-delay:0s;transition-timing-function:ease-out;background-color:transparent !important}.hamburger--emphatic.is-active .hamburger-inner:before{top:-80px;left:-80px;transition:left 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(80px, 80px, 0) rotate(45deg)}.hamburger--emphatic.is-active .hamburger-inner:after{top:-80px;right:-80px;transition:right 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(-80px, 80px, 0) rotate(-45deg)}.hamburger--emphatic-r{overflow:hidden}.hamburger--emphatic-r .hamburger-inner{transition:background-color .125s ease-in .175s}.hamburger--emphatic-r .hamburger-inner:before{left:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,left 0.125s ease-in 0.175s}.hamburger--emphatic-r .hamburger-inner:after{top:10px;right:0;transition:transform 0.125s cubic-bezier(0.6, 0.04, 0.98, 0.335),top 0.05s linear 0.125s,right 0.125s ease-in 0.175s}.hamburger--emphatic-r.is-active .hamburger-inner{transition-delay:0s;transition-timing-function:ease-out;background-color:transparent !important}.hamburger--emphatic-r.is-active .hamburger-inner:before{top:80px;left:-80px;transition:left 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(80px, -80px, 0) rotate(-45deg)}.hamburger--emphatic-r.is-active .hamburger-inner:after{top:80px;right:-80px;transition:right 0.125s ease-out,top 0.05s linear 0.125s,transform 0.125s cubic-bezier(0.075, 0.82, 0.165, 1) 0.175s;transform:translate3d(-80px, -80px, 0) rotate(45deg)}.hamburger--minus .hamburger-inner:after,.hamburger--minus .hamburger-inner:before{transition:bottom .08s ease-out 0s,top .08s ease-out 0s,opacity 0s linear}.hamburger--minus.is-active .hamburger-inner:after,.hamburger--minus.is-active .hamburger-inner:before{transition:bottom .08s ease-out,top .08s ease-out,opacity 0s linear .08s;opacity:0}.hamburger--minus.is-active .hamburger-inner:before{top:0}.hamburger--minus.is-active .hamburger-inner:after{bottom:0}.hamburger--slider .hamburger-inner{top:2px}.hamburger--slider .hamburger-inner:before{top:10px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform,opacity}.hamburger--slider .hamburger-inner:after{top:20px}.hamburger--slider.is-active .hamburger-inner{transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--slider.is-active .hamburger-inner:before{transform:rotate(-45deg) translate3d(-5.71429px, -6px, 0);opacity:0}.hamburger--slider.is-active .hamburger-inner:after{transform:translate3d(0, -20px, 0) rotate(-90deg)}.hamburger--slider-r .hamburger-inner{top:2px}.hamburger--slider-r .hamburger-inner:before{top:10px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform,opacity}.hamburger--slider-r .hamburger-inner:after{top:20px}.hamburger--slider-r.is-active .hamburger-inner{transform:translate3d(0, 10px, 0) rotate(-45deg)}.hamburger--slider-r.is-active .hamburger-inner:before{transform:rotate(45deg) translate3d(5.71429px, -6px, 0);opacity:0}.hamburger--slider-r.is-active .hamburger-inner:after{transform:translate3d(0, -20px, 0) rotate(90deg)}.hamburger--spin .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.22s}.hamburger--spin .hamburger-inner:before{transition:top .1s ease-in .25s,opacity .1s ease-in}.hamburger--spin .hamburger-inner:after{transition:bottom 0.1s ease-in 0.25s,transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spin.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(225deg)}.hamburger--spin.is-active .hamburger-inner:before{top:0;transition:top .1s ease-out,opacity .1s ease-out .12s;opacity:0}.hamburger--spin.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease-out,transform 0.22s cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(-90deg)}.hamburger--spin-r .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.22s}.hamburger--spin-r .hamburger-inner:before{transition:top .1s ease-in .25s,opacity .1s ease-in}.hamburger--spin-r .hamburger-inner:after{transition:bottom 0.1s ease-in 0.25s,transform 0.22s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spin-r.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(-225deg)}.hamburger--spin-r.is-active .hamburger-inner:before{top:0;transition:top .1s ease-out,opacity .1s ease-out .12s;opacity:0}.hamburger--spin-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 0.1s ease-out,transform 0.22s cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(90deg)}.hamburger--spring .hamburger-inner{top:2px;transition:background-color 0s linear .13s}.hamburger--spring .hamburger-inner:before{top:10px;transition:top 0.1s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring .hamburger-inner:after{top:20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring.is-active .hamburger-inner{transition-delay:.22s;background-color:transparent !important}.hamburger--spring.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.15s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:translate3d(0, 10px, 0) rotate(45deg)}.hamburger--spring.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:translate3d(0, 10px, 0) rotate(-45deg)}.hamburger--spring-r .hamburger-inner{top:auto;bottom:0;transition-delay:0s;transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:.13s}.hamburger--spring-r .hamburger-inner:after{top:-20px;transition:top 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,opacity 0s linear}.hamburger--spring-r .hamburger-inner:before{transition:top 0.1s cubic-bezier(0.33333, 0.66667, 0.66667, 1) 0.2s,transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--spring-r.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:translate3d(0, -10px, 0) rotate(-45deg)}.hamburger--spring-r.is-active .hamburger-inner:after{top:0;transition:top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333),opacity 0s linear 0.22s;opacity:0}.hamburger--spring-r.is-active .hamburger-inner:before{top:0;transition:top 0.1s cubic-bezier(0.33333, 0, 0.66667, 0.33333) 0.15s,transform 0.13s cubic-bezier(0.215, 0.61, 0.355, 1) 0.22s;transform:rotate(90deg)}.hamburger--stand .hamburger-inner{transition:transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0.15s,background-color 0s linear 75ms}.hamburger--stand .hamburger-inner:before{transition:top 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand .hamburger-inner:after{transition:bottom 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand.is-active .hamburger-inner{transition:transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0s,background-color 0s linear 0.15s;transform:rotate(90deg);background-color:transparent !important}.hamburger--stand.is-active .hamburger-inner:before{top:0;transition:top 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(-45deg)}.hamburger--stand.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(45deg)}.hamburger--stand-r .hamburger-inner{transition:transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0.15s,background-color 0s linear 75ms}.hamburger--stand-r .hamburger-inner:before{transition:top 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand-r .hamburger-inner:after{transition:bottom 75ms ease-in 75ms,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19) 0s}.hamburger--stand-r.is-active .hamburger-inner{transition:transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0s,background-color 0s linear 0.15s;transform:rotate(-90deg);background-color:transparent !important}.hamburger--stand-r.is-active .hamburger-inner:before{top:0;transition:top 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(-45deg)}.hamburger--stand-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease-out 0.1s,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s;transform:rotate(45deg)}.hamburger--squeeze .hamburger-inner{transition-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);transition-duration:75ms}.hamburger--squeeze .hamburger-inner:before{transition:top 75ms ease .12s,opacity 75ms ease}.hamburger--squeeze .hamburger-inner:after{transition:bottom 75ms ease 0.12s,transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19)}.hamburger--squeeze.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transform:rotate(45deg)}.hamburger--squeeze.is-active .hamburger-inner:before{top:0;transition:top 75ms ease,opacity 75ms ease .12s;opacity:0}.hamburger--squeeze.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease,transform 75ms cubic-bezier(0.215, 0.61, 0.355, 1) 0.12s;transform:rotate(-90deg)}.hamburger--vortex .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transition-duration:.2s}.hamburger--vortex .hamburger-inner:after,.hamburger--vortex .hamburger-inner:before{transition-delay:.1s;transition-timing-function:linear;transition-duration:0s}.hamburger--vortex .hamburger-inner:before{transition-property:top,opacity}.hamburger--vortex .hamburger-inner:after{transition-property:bottom,transform}.hamburger--vortex.is-active .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transform:rotate(765deg)}.hamburger--vortex.is-active .hamburger-inner:after,.hamburger--vortex.is-active .hamburger-inner:before{transition-delay:0s}.hamburger--vortex.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--vortex.is-active .hamburger-inner:after{bottom:0;transform:rotate(90deg)}.hamburger--vortex-r .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transition-duration:.2s}.hamburger--vortex-r .hamburger-inner:after,.hamburger--vortex-r .hamburger-inner:before{transition-delay:.1s;transition-timing-function:linear;transition-duration:0s}.hamburger--vortex-r .hamburger-inner:before{transition-property:top,opacity}.hamburger--vortex-r .hamburger-inner:after{transition-property:bottom,transform}.hamburger--vortex-r.is-active .hamburger-inner{transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1);transform:rotate(-765deg)}.hamburger--vortex-r.is-active .hamburger-inner:after,.hamburger--vortex-r.is-active .hamburger-inner:before{transition-delay:0s}.hamburger--vortex-r.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--vortex-r.is-active .hamburger-inner:after{bottom:0;transform:rotate(-90deg)}.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide__bullets{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.glide--rtl{direction:rtl}@font-face{font-family:'Outfit';src:url("../fonts/Outfit-Medium.otf");font-weight:normal}@font-face{font-family:'Outfit';src:url("../fonts/Outfit-Bold.otf");font-weight:bold}html,body{min-height:100vh;display:flex;flex-direction:column;padding:0;margin:0;box-sizing:border-box;color:#1226AA;font-family:Nunito,sans;font-size:20px;overflow-x:hidden}@media screen and (max-width: 500px){html,body{font-size:18px}}*{box-sizing:inherit}h1,h2,h3,h4,h5,h6{font-family:"Outfit",sans;color:#1226AA;text-align:center}h1{line-height:1.25em;font-size:2.5em;color:#1226AA}h2{font-size:2.4em;margin:0}h3{color:#1226AA;margin:0 0 60px;text-align:left;font-size:1.8em}h4{font-size:1.1em}a{text-decoration:none;color:inherit;transition:.3s}a.inline-link{color:#10CFC9;font-style:italic}a:hover{opacity:.5}.underline{border-bottom:4px solid #10CFC9;padding-bottom:6px;line-height:60px}.row{position:relative;overflow:visible;width:calc(100% - 80px);max-width:1180px;margin:0 auto}.row__header{width:100%;margin:0 auto}.row__header .row_header:before{border-top:5px;border-color:red}.btn{text-align:center;min-width:200px;border:2px solid #fff;border-radius:100px;padding:20px;color:#fff;font-weight:bold;font-family:"Outfit",sans;transition:.3s;overflow:hidden;position:relative}.btn::before{display:block;content:'';position:absolute;width:120%;height:300%;background:#fff;top:0;left:0;transform:translate(100%, -28%) rotate(20deg);transition:.3s;z-index:-1}.btn:hover{opacity:1;color:#1226AA}.btn:hover::before{transform:translate(-4%, -28%) rotate(20deg)}.btn--inverted{color:#1226AA;border-color:#1226AA}.btn--inverted::before{background:#1226AA}.btn--inverted:hover{color:#fff}@media screen and (max-width: 600px){.btn{width:210px}}.current-page{color:#10CFC9}.gsoc-banner{width:100%;position:fixed;top:0;height:80px;background-color:#fff;display:flex;align-items:center;justify-content:center;z-index:9999}@media screen and (max-width: 800px){.gsoc-banner{flex-direction:column}}.gsoc-banner__caption{margin-right:20px}@media screen and (max-width: 800px){.gsoc-banner__caption{margin-right:0}}.gsoc-banner__logo{max-height:40px;vertical-align:middle}@media screen and (max-width: 500px){.gsoc-banner__logo{max-height:30px}}.nav{width:100%;height:104px;margin:0 auto;position:fixed;top:0px;background-color:#fff;z-index:9998;display:flex;align-items:flex-end}.nav__wrapper{display:flex;justify-content:space-between;max-width:1200px;width:calc(100% - 80px);margin:0 auto;height:80px}.nav__logo{display:flex;align-items:center;color:#1226AA;width:250px}.nav__links{display:flex;list-style:none;padding:0;font-size:.9em}@media screen and (max-width: 990px){.nav__links{flex-direction:column;position:fixed;height:100vh;background-color:#1226AA;right:-100%;top:0;align-items:flex-end;padding:55px 80px;margin:0;transition:.3s}.nav__links.nav__links--open{right:0}}.nav__toggle{display:none;z-index:9000;transition:.3s}.nav__toggle .hamburger{outline:none;transition:.3s;display:flex;align-items:center;opacity:1}.nav__toggle .hamburger-inner,.nav__toggle .hamburger-inner::before,.nav__toggle .hamburger-inner::after{background-color:#1226AA}@media screen and (max-width: 990px){.nav__toggle{display:flex;align-items:center}.nav__toggle.nav__toggle--open{transform:translateX(-200px)}}@media screen and (max-width: 990px) and (max-width: 500px){.nav__toggle.nav__toggle--open{transform:translateX(-180px)}}@media screen and (max-width: 990px){.nav__toggle .is-active .hamburger-inner,.nav__toggle .is-active .hamburger-inner::before,.nav__toggle .is-active .hamburger-inner::after{background-color:#fff}}.nav__links li{color:#1226AA;font-family:"Outfit",sans;font-weight:bold;display:flex;align-items:center}.nav__links li:not(:first-of-type){margin-left:45px}@media screen and (max-width: 1100px){.nav__links li:not(:first-of-type){margin-left:30px}}@media screen and (max-width: 990px){.nav__links li:not(:first-of-type){margin-left:0;margin-top:40px}}@media screen and (max-width: 990px){.nav__links li{text-align:right;color:#fff;z-index:9999}.nav__links li:first-of-type{margin-top:60px}}.hero{padding:260px 0 120px;max-width:1300px}@media screen and (max-width: 500px){.hero{padding-top:200px}}.hero__container{position:relative;display:grid;grid-template-columns:repeat(2, 50%);grid-gap:70px 10px}@media screen and (max-width: 1260px){.hero__container{grid-template-columns:100%}}.hero_right{margin-left:50px}@media screen and (max-width: 1260px){.hero_right{margin-left:0px}}.hero__header{max-width:890px;width:100%;margin:0 auto;text-align:left}.hero__subheader{font-family:Nunito,sans;font-weight:normal;font-size:0.9em;color:#1226AA;line-height:27px;margin:40px auto 0;width:100%;text-align:left}.hero__subheader:nth-of-type(2){margin-top:20px}.hero__btn{cursor:pointer;width:230px;padding:20px 0;text-align:center;margin:40px 30px 0;background-color:#1226AA;border-radius:100px;color:#fff;font-weight:bold;font-family:"Outfit",sans;transition:.3s;display:inline-block}.hero__btn:hover{transform:translateY(-5px)}.hero__btn:active{transition:.1s;transform:translateY(5px)}.hero__btns{margin:20px auto 0;text-align:center}.hero__image{width:100%}.about{padding:150px 0}.about::before{z-index:0;display:block;position:absolute;content:'';width:200vw;height:calc(100% - 150px);background-color:#1226AA;top:50%;left:50%;transform:translate(-50%, -50%)}.about::after{z-index:-1;display:block;position:absolute;content:'';width:200vw;background-color:#1226AA;height:calc(100% - 150px);top:51%;transform:translate(-50%, -50%);left:50%}@media screen and (max-width: 500px){.about::after{top:50%}}.about__header{margin-top:20px;position:relative;z-index:1;color:#fff}.about__content{position:relative;text-align:center;max-width:800px;margin:62px auto 0;z-index:10;color:#fff}@media screen and (max-width: 750px){.about__content{-moz-column-count:1;column-count:1}}.about__paragraph{margin:0 0 20px;line-height:30px;-moz-column-break-inside:avoid;break-inside:avoid-column;page-break-inside:avoid}.about__icon_container{margin-top:60px;position:relative;display:grid;grid-template-columns:repeat(3, 33%);grid-auto-flow:dense;grid-gap:30px 10px}@media screen and (max-width: 1000px){.about__icon_container{grid-template-columns:repeat(2, 50%)}}@media screen and (max-width: 600px){.about__icon_container{grid-template-columns:100%}}.about__icon{margin:0 auto}.about__icon h4{font-family:Nunito,sans;font-size:20px;color:#fff}.about__icon img{width:60px;position:relative;left:calc(50% - 30px)}.diagrams{padding:80px 0 120px}.diagrams a{font-weight:bold;color:#1226AA}.diagrams__header{margin-bottom:80px}.diagrams__diagram{margin:0 auto 140px}@media screen and (max-width: 500px){.diagrams__diagram{margin-bottom:80px}}.diagrams__diagram:last-of-type{margin-bottom:0}.diagrams__diagram:first-of-type{margin-top:120px}@media screen and (max-width: 500px){.diagrams__diagram:first-of-type{margin-top:80px}}.diagrams__content{-moz-column-count:2;column-count:2;-moz-column-gap:60px;column-gap:60px;margin:62px auto}@media screen and (max-width: 750px){.diagrams__content{-moz-column-count:1;column-count:1}}.diagrams__paragraph{margin:0 auto;line-height:30px;-moz-column-break-inside:avoid;break-inside:avoid-column;page-break-inside:avoid}.diagrams__paragraph_intro{margin:0 auto 40px;line-height:30px;max-width:800px;text-align:center}.diagrams__paragraph ul{margin:0}.diagrams__paragraph p{margin:0}.diagram__diagram{margin:0 auto;overflow-x:auto;color:#1226AA}.diagram__diagram img:not(.icon){width:100%}@media screen and (max-width: 500px){.diagram__diagram img:not(.icon){width:500px;margin-bottom:20px}}.diagram__status{margin:15px;padding:20px;border-radius:8px}.diagram__container{box-shadow:rgba(0,0,0,0.21);border:3px solid #1226AA;border-radius:8px;overflow:auto;margin:0 auto}.diagram__link{color:#1226AA !important}.diagram__table{table-layout:fixed;font-size:1.5em;border-collapse:collapse}.diagram__table tr:last-of-type td{border-bottom:0}.diagram__table thead td{border-top:0;padding:30px 45px;text-align:center;font-weight:bold}.diagram__table td{width:245px;border:3px solid #1226AA;padding:20px}.diagram__table td:last-child{border-right:0}.diagram__table td:first-child{border-left:0;font-weight:bold}.diagram__table ul{font-weight:normal;list-style-type:none;padding-left:0;margin:10px 0}.diagram__table ul li{font-size:.86667em}.diagram__table ul li:not(:last-of-type){margin-bottom:8px}.diagram__table ul li::before{display:inline;content:'- '}.icon{display:block;margin:10px auto 23px}.icon--large{height:30px}.icon--small{height:20px}.subprojects{padding:150px 0 60px}.subprojects::before{z-index:0;display:block;position:absolute;content:'';width:200vw;height:calc(100% - 320px);background-color:#1226AA;top:38%;left:50%;transform:translate(-50%, -50%)}.subprojects::after{z-index:-1;display:block;position:absolute;content:'';width:200vw;background-color:#1226AA;height:calc((100% - 320px) / 2);top:39%;transform:translate(-50%, -100%);left:50%}@media screen and (max-width: 800px){.subprojects::before,.subprojects::after{top:44%}}.subprojects__tiles{position:relative;z-index:1;display:flex;justify-content:space-between;margin-top:25px}@media screen and (max-width: 800px){.subprojects__tiles{flex-direction:column}}.subproject__tile{width:calc(100% / 3 - 15px);border-radius:10px;box-shadow:0 2px 20px 0 rgba(0,0,0,0.21);background-color:#fff;padding:70px 43px;text-align:center;transition:.3s}@media screen and (max-width: 800px){.subproject__tile{width:100%;display:flex}.subproject__tile:not(:last-of-type){margin-bottom:30px}}@media screen and (max-width: 500px){.subproject__tile{flex-wrap:wrap;text-align:center}}.subproject__tile:hover{transform:translateY(-10px)}.invisible{visibility:hidden}.subproject__tile h4{margin:0;font-size:1.2em}.subproject__tile h5{margin:5px auto;font-size:1em;font-weight:normal}.subproject__icon{height:160px}@media screen and (max-width: 800px){.subproject__icon{width:100%;margin-right:20px}}@media screen and (max-width: 800px){.subproject__details{width:130%}}.subproject__description{line-height:30px}@media screen and (max-width: 800px){.subproject__description{margin-bottom:0}}.subproject__more{float:right;font-weight:bold;margin-top:20px}.subprojects__header{position:relative;color:#fff;margin:0 auto 52px}.downloads{padding:180px 0 100px}.downloads::before{z-index:0;display:block;position:absolute;content:'';width:200vw;height:calc(100% - 120px);background-color:#1226AA;top:50%;left:50%;transform:translate(-50%, -50%)}.downloads::after{z-index:-1;display:block;position:absolute;content:'';width:200vw;background-color:#1226AA;height:calc(100% - 120px);top:51%;transform:translate(-50%, -50%);left:50%}.downloads::before{transform:translate(-50%, -50%)}.downloads::after{height:calc((100% - 120px) / 2);transform:translate(-50%, -100%)}@media screen and (max-width: 500px){.downloads::after{top:50%}}.downloads__header{color:#fff;position:relative;z-index:1}.downloads__paragraph{position:relative;z-index:1;margin:40px auto 60px;color:#fff;font-size:1.2em;text-align:center;line-height:34px}.downloads__links{position:relative;z-index:1;display:flex;justify-content:space-between;max-width:680px;width:calc(100% - 80px);margin:0 auto;padding:0}@media screen and (max-width: 800px){.downloads__links{flex-wrap:wrap;max-width:200px;justify-content:center}}.downloads__anchor:hover{opacity:1}@media screen and (max-width: 800px){.downloads__anchor:not(:first-of-type){margin-top:40px}}.downloads__wrapper{position:relative;z-index:1;color:#fff}.downloads__bg{position:absolute;bottom:0;margin:0;padding:0;height:150px;width:100%;background-color:#1226AA}.news{padding:90px 0 120px}.news::after{top:calc(50% - 1000px/2)}.news::before{top:calc(50% - 1000px/2)}.news h2{margin-bottom:25px;color:#1226AA;position:relative}.news__container{margin-top:120px;position:relative;display:grid;grid-template-columns:repeat(2, 50%);grid-auto-flow:dense;grid-gap:30px 10px}@media screen and (max-width: 1000px){.news__container{grid-template-columns:100%}}.news__twitter{border:solid 1px #e6e6e6;border-radius:7px;background:#fff}.news__github{background:#fff;border:solid 1px #e6e6e6;border-radius:7px}.news__github>.news__header{border-bottom:solid 1px #e6e6e6}.news__header{padding:10px;height:90px}.news__header_container{display:block;margin:15px 0 5px;padding-left:10px;font-size:24px}.news__header_container a{color:#1226AA;font-weight:bold;vertical-align:top}.news__header_container img{display:inline-block;height:25px;margin:0 10px 0 15px}.talks{margin:0 auto;position:relative;margin-bottom:120px;color:#1226AA}.talks__talk{width:100%}.talks__talk h4{padding:0;margin:20px 0 0;color:#1226AA}.talks__talk p{padding:0;margin:0 auto;text-align:center;font-size:90%}.talks__playbtn{position:absolute;top:calc(50% - 30px);left:calc(50% - 30px);width:60px;height:60px;z-index:2}.talks__img_container{margin:0 auto;position:relative}.talks__talk h4{font-size:0.9em}.talks__img{margin:0 auto;border-radius:7px;width:100%;height:100%;background:#1226AA}.glide__bullets{position:relative;top:30px}.glide__bullet{border:2px solid #1226AA;background-color:#fff;width:14px;height:14px}.glide__bullet--active{background-color:#10CFC9;border:2px solid #10CFC9}.glide__bullet:focus{border:2px solid #10CFC9}.glide__bullet:hover{border:2px solid #10CFC9}.talks__header{margin-bottom:60px}.talks__scroll{padding:0;border:0;position:absolute;top:40%;cursor:pointer;width:30px;height:30px;display:flex;align-items:center;justify-content:center;color:#1226AA;outline:0;border:none;box-shadow:none}.talks__scroll svg{width:30px;position:absolute;top:0;left:0}.talks__scroll svg *{transition:.2s}.talks__scroll:hover{color:rgba(18,38,170,0.7)}.talks__scroll--left{left:-55px}.talks__scroll--right{right:-55px}.boards{padding:90px 0 80px}.boards__container{position:relative;margin:60px auto 0}.boards__boards{margin:0 auto;overflow-x:hidden}.boards__anchor{transition:.3s}.boards__anchor:hover{opacity:1;transform:translateY(-10px)}.boards__board{text-align:center;list-style-type:none}.boards__img{width:100%;height:25vw;max-height:330px;min-height:200px;-o-object-fit:contain;object-fit:contain;border:2px solid #e6e6e6;border-radius:8px;margin-bottom:10px;padding:30px;-ms-interpolation-mode:nearest-neighbor;image-rendering:-moz-crisp-edges;image-rendering:pixelated}@media screen and (max-width: 800px){.boards__img{margin-bottom:20px}}.boards__name{display:block;color:#1226AA;font-weight:bolder}.boards__fpga{display:block;color:#1226AA;font-size:.8em}.boards__showcase{display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-flow:dense;grid-gap:30px 10px;margin-bottom:120px}@media screen and (max-width: 1000px){.boards__showcase{grid-template-columns:repeat(2, 1fr)}}@media screen and (max-width: 500px){.boards__showcase{grid-template-columns:repeat(1, 1fr)}}.boards__showcase a{position:relative;transition:transform .3s, opacity .7s, bottom .7s;max-width:100vw}.boards__showcase a.wide{grid-column:span 2}@media screen and (max-width: 763px){.boards__showcase a.wide{grid-column:span 1}}.boards__showcase a:hover{transform:translateY(-10px)}.boards__showcase::before,.boards__showcase::after{display:none}.boards__showcase-d-none{display:none}.boards__showcase-delayed{bottom:0}.boards__showcase-delayed:nth-child(3n+2){transition:transform .3s, opacity .7s ease .2s, bottom .7s ease .2s}.boards__showcase-delayed:nth-child(3n){transition:transform .3s, opacity .7s ease .4s, bottom .7s ease .4s}@media screen and (max-width: 1150px){.boards__showcase-delayed:nth-child(3n+2),.boards__showcase-delayed:nth-child(3n){transition:transform .3s, opacity .7s, bottom .7s}.boards__showcase-delayed:nth-child(2n){transition:transform .3s, opacity .7s ease .2s, bottom .7s ease .2s}}@media screen and (max-width: 763px){.boards__showcase-delayed:nth-child(2n){transition:transform .3s, opacity .7s, bottom .7s}}.boards__showcase-hidden{bottom:-50px;opacity:0}.footer{margin-top:auto;padding:70px 0;font-size:.8em;text-align:center;background-color:#1226AA;color:#fff}.footer::before{background-color:#332d37}.footer__wrapper{max-width:1180px;margin:0 auto;width:calc(100% - 80px);display:flex;justify-content:space-between;align-items:center}.footer__social{display:flex}.chips__alliance{padding-right:112px}@media screen and (max-width: 1150px){.chips__alliance{padding-right:0px}}.chips__alliance img{height:35px;margin-right:5px}.social__icon{display:block;width:30px;height:30px;margin-left:30px}.article{max-width:1040px;margin:20px auto 100px;padding:0 40px}.article p{font-size:1rem}.article h1,.article h2,.article h3,.article h4,.article h5,.article h6{margin:initial;margin-top:40px;text-align:left;color:#1226AA}.article h1{font-size:2rem;margin-top:80px}.article h2{color:#1226AA;font-size:1.7rem}.article h3{color:#1226AA;font-size:1.2rem;margin-top:30px}.article h4,.article h5,.article h6{font-size:initial}.article a{color:#10CFC9}.article hr{border:0;height:1px;background-color:#1226AA}.comm{padding:80px 0 120px 0}.comm__header{margin-bottom:60px}.comm__register{text-align:center;margin:30px auto}.comm__links{max-width:700px;flex-wrap:wrap}@media screen and (max-width: 700px){.comm__links{flex-direction:column;align-items:center}.comm__links .btn{width:210px}.comm__links .downloads__anchor:not(:first-child){margin-top:40px}}
diff --git a/assets/fonts/Outfit-Bold.otf b/assets/fonts/Outfit-Bold.otf
new file mode 100644
index 0000000..5cd6dec
Binary files /dev/null and b/assets/fonts/Outfit-Bold.otf differ
diff --git a/assets/fonts/Outfit-Medium.otf b/assets/fonts/Outfit-Medium.otf
new file mode 100644
index 0000000..8c7c84d
Binary files /dev/null and b/assets/fonts/Outfit-Medium.otf differ
diff --git a/assets/img/EDA.svg b/assets/img/EDA.svg
new file mode 100644
index 0000000..ec4b1fa
--- /dev/null
+++ b/assets/img/EDA.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/Group 17.svg b/assets/img/Group 17.svg
new file mode 100644
index 0000000..0ce507b
--- /dev/null
+++ b/assets/img/Group 17.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/Group 21.svg b/assets/img/Group 21.svg
new file mode 100644
index 0000000..278b6f8
--- /dev/null
+++ b/assets/img/Group 21.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/Group 73.svg b/assets/img/Group 73.svg
new file mode 100644
index 0000000..1f5068e
--- /dev/null
+++ b/assets/img/Group 73.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/boards/arty.png b/assets/img/boards/arty.png
new file mode 100644
index 0000000..60fd6c8
Binary files /dev/null and b/assets/img/boards/arty.png differ
diff --git a/assets/img/boards/basys.png b/assets/img/boards/basys.png
new file mode 100644
index 0000000..fa66b4a
Binary files /dev/null and b/assets/img/boards/basys.png differ
diff --git a/assets/img/boards/breakout.png b/assets/img/boards/breakout.png
new file mode 100644
index 0000000..f38944b
Binary files /dev/null and b/assets/img/boards/breakout.png differ
diff --git a/assets/img/boards/iceblink.png b/assets/img/boards/iceblink.png
new file mode 100644
index 0000000..016d984
Binary files /dev/null and b/assets/img/boards/iceblink.png differ
diff --git a/assets/img/boards/icestick.png b/assets/img/boards/icestick.png
new file mode 100644
index 0000000..37b1bb6
Binary files /dev/null and b/assets/img/boards/icestick.png differ
diff --git a/assets/img/boards/icevision.png b/assets/img/boards/icevision.png
new file mode 100644
index 0000000..dcfa620
Binary files /dev/null and b/assets/img/boards/icevision.png differ
diff --git a/assets/img/boards/netv2.png b/assets/img/boards/netv2.png
new file mode 100644
index 0000000..9ec280b
Binary files /dev/null and b/assets/img/boards/netv2.png differ
diff --git a/assets/img/boards/nexys-video.png b/assets/img/boards/nexys-video.png
new file mode 100644
index 0000000..22cb97c
Binary files /dev/null and b/assets/img/boards/nexys-video.png differ
diff --git a/assets/img/boards/quickfeather.png b/assets/img/boards/quickfeather.png
new file mode 100644
index 0000000..1b7df0d
Binary files /dev/null and b/assets/img/boards/quickfeather.png differ
diff --git a/assets/img/boards/tinyfpga_ex.jpg b/assets/img/boards/tinyfpga_ex.jpg
new file mode 100644
index 0000000..7f61691
Binary files /dev/null and b/assets/img/boards/tinyfpga_ex.jpg differ
diff --git a/assets/img/boards/ulx3s.png b/assets/img/boards/ulx3s.png
new file mode 100644
index 0000000..6e67538
Binary files /dev/null and b/assets/img/boards/ulx3s.png differ
diff --git a/assets/img/boards/versa5g.png b/assets/img/boards/versa5g.png
new file mode 100644
index 0000000..6197819
Binary files /dev/null and b/assets/img/boards/versa5g.png differ
diff --git a/assets/img/boards/zybo.png b/assets/img/boards/zybo.png
new file mode 100644
index 0000000..3b8fa9f
Binary files /dev/null and b/assets/img/boards/zybo.png differ
diff --git a/assets/img/chevron-circle-down-solid.svg b/assets/img/chevron-circle-down-solid.svg
new file mode 100644
index 0000000..26b3f40
--- /dev/null
+++ b/assets/img/chevron-circle-down-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/chevron-circle-left-solid.svg b/assets/img/chevron-circle-left-solid.svg
new file mode 100644
index 0000000..b9c42dd
--- /dev/null
+++ b/assets/img/chevron-circle-left-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/chevron-circle-right-solid.svg b/assets/img/chevron-circle-right-solid.svg
new file mode 100644
index 0000000..9a94ea2
--- /dev/null
+++ b/assets/img/chevron-circle-right-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/chevron-circle-up-solid.svg b/assets/img/chevron-circle-up-solid.svg
new file mode 100644
index 0000000..94cebd7
--- /dev/null
+++ b/assets/img/chevron-circle-up-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/chips-alliance.svg b/assets/img/chips-alliance.svg
new file mode 100644
index 0000000..486cd99
--- /dev/null
+++ b/assets/img/chips-alliance.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/cross.svg b/assets/img/cross.svg
new file mode 100644
index 0000000..345b1c0
--- /dev/null
+++ b/assets/img/cross.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/f4pga.svg b/assets/img/f4pga.svg
new file mode 100644
index 0000000..0051fcc
--- /dev/null
+++ b/assets/img/f4pga.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/favicon.svg b/assets/img/favicon.svg
new file mode 100644
index 0000000..5535f19
--- /dev/null
+++ b/assets/img/favicon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/github.svg b/assets/img/github.svg
new file mode 100644
index 0000000..cd2a014
--- /dev/null
+++ b/assets/img/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/gsoc-logo.svg b/assets/img/gsoc-logo.svg
new file mode 100644
index 0000000..23e9b82
--- /dev/null
+++ b/assets/img/gsoc-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/hero-image.svg b/assets/img/hero-image.svg
new file mode 100644
index 0000000..92c154a
--- /dev/null
+++ b/assets/img/hero-image.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/icons_community.svg b/assets/img/icons_community.svg
new file mode 100644
index 0000000..f1e0e63
--- /dev/null
+++ b/assets/img/icons_community.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/icons_interchangeable_tools.svg b/assets/img/icons_interchangeable_tools.svg
new file mode 100644
index 0000000..edd4833
--- /dev/null
+++ b/assets/img/icons_interchangeable_tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/icons_learn.svg b/assets/img/icons_learn.svg
new file mode 100644
index 0000000..5c871e7
--- /dev/null
+++ b/assets/img/icons_learn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/icons_multi_platform.svg b/assets/img/icons_multi_platform.svg
new file mode 100644
index 0000000..352e768
--- /dev/null
+++ b/assets/img/icons_multi_platform.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/icons_os_free.svg b/assets/img/icons_os_free.svg
new file mode 100644
index 0000000..d7b69c8
--- /dev/null
+++ b/assets/img/icons_os_free.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/icons_vendor_neutral.svg b/assets/img/icons_vendor_neutral.svg
new file mode 100644
index 0000000..23a12c5
Binary files /dev/null and b/assets/img/icons_vendor_neutral.svg differ
diff --git a/assets/img/lf-logo-white.svg b/assets/img/lf-logo-white.svg
new file mode 100644
index 0000000..1f9a262
--- /dev/null
+++ b/assets/img/lf-logo-white.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/na.svg b/assets/img/na.svg
new file mode 100644
index 0000000..70fcbc3
--- /dev/null
+++ b/assets/img/na.svg
@@ -0,0 +1 @@
+N/A
\ No newline at end of file
diff --git a/assets/img/news_github.svg b/assets/img/news_github.svg
new file mode 100644
index 0000000..273780b
--- /dev/null
+++ b/assets/img/news_github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/news_twitter.svg b/assets/img/news_twitter.svg
new file mode 100644
index 0000000..24b9f88
--- /dev/null
+++ b/assets/img/news_twitter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/partial 1.svg b/assets/img/partial 1.svg
new file mode 100644
index 0000000..b5a6f44
--- /dev/null
+++ b/assets/img/partial 1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/partial.svg b/assets/img/partial.svg
new file mode 100644
index 0000000..b5a6f44
--- /dev/null
+++ b/assets/img/partial.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/parts.svg b/assets/img/parts.svg
new file mode 100644
index 0000000..5d97c92
--- /dev/null
+++ b/assets/img/parts.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/play_btn.svg b/assets/img/play_btn.svg
new file mode 100644
index 0000000..0148874
--- /dev/null
+++ b/assets/img/play_btn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/status.svg b/assets/img/status.svg
new file mode 100644
index 0000000..233c3d7
--- /dev/null
+++ b/assets/img/status.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/talks/hackaday2019.png b/assets/img/talks/hackaday2019.png
new file mode 100644
index 0000000..954d4e6
Binary files /dev/null and b/assets/img/talks/hackaday2019.png differ
diff --git a/assets/img/talks/nextpnr_orconf2018.png b/assets/img/talks/nextpnr_orconf2018.png
new file mode 100644
index 0000000..908072f
Binary files /dev/null and b/assets/img/talks/nextpnr_orconf2018.png differ
diff --git a/assets/img/talks/orconf2018.png b/assets/img/talks/orconf2018.png
new file mode 100644
index 0000000..f89226d
Binary files /dev/null and b/assets/img/talks/orconf2018.png differ
diff --git a/assets/img/talks/orconf2019.png b/assets/img/talks/orconf2019.png
new file mode 100644
index 0000000..e086a98
Binary files /dev/null and b/assets/img/talks/orconf2019.png differ
diff --git a/assets/img/talks/v2x_orconf2019.png b/assets/img/talks/v2x_orconf2019.png
new file mode 100644
index 0000000..ff43a31
Binary files /dev/null and b/assets/img/talks/v2x_orconf2019.png differ
diff --git a/assets/img/talks/vpr_orconf2019.png b/assets/img/talks/vpr_orconf2019.png
new file mode 100644
index 0000000..e85950b
Binary files /dev/null and b/assets/img/talks/vpr_orconf2019.png differ
diff --git a/assets/img/tick.png b/assets/img/tick.png
new file mode 100644
index 0000000..8b5481d
Binary files /dev/null and b/assets/img/tick.png differ
diff --git a/assets/img/tick.svg b/assets/img/tick.svg
new file mode 100644
index 0000000..c9ce340
--- /dev/null
+++ b/assets/img/tick.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/img/twitter.svg b/assets/img/twitter.svg
new file mode 100644
index 0000000..9e415cd
--- /dev/null
+++ b/assets/img/twitter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/js/github-activity.js b/assets/js/github-activity.js
new file mode 100644
index 0000000..0c83a09
--- /dev/null
+++ b/assets/js/github-activity.js
@@ -0,0 +1 @@
+"use strict";function _typeof2(e){return(_typeof2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==_typeof2(Symbol.iterator)?function(e){return _typeof2(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":_typeof2(e)})(e)}var GitHubActivity=function(){var e={},l={renderLink:function(e,t,r){return t=t||e,void 0===r&&(r=""),Mustache.render('{{{title}}} ',{url:e,title:t})},renderGitHubLink:function(e,t,r){return l.renderLink("https://github.com/"+e,t=t||e,r=void 0===r?"":r)},getMessageFor:function(r){var n=r.payload,e=(r.repoLink=l.renderGitHubLink(r.repo.name),r.userGravatar=Mustache.render('
',{url:r.actor.avatar_url}),n.ref&&("refs/heads/"===n.ref.substring(0,11)?r.branch=n.ref.substring(11):r.branch=n.ref,r.branchLink=l.renderGitHubLink(r.repo.name+"/tree/"+r.branch,r.branch)+" at "),n.commits&&(a=n.before+"..."+n.head,2===(t=n.commits.length)?r.commitsMessage=Mustache.render('View comparison for these 2 commits » ',{repo:r.repo.name,shaDiff:a}):2{{length}} more '+pluralize("commit",t-2)+" »",{repo:r.repo.name,shaDiff:a,length:n.size-2})),n.commits.forEach(function(e,t){if(50 ',{hash:md5(e.author.email)})})),n.issue&&(i=r.repo.name+"#"+n.issue.number,r.issueLink=l.renderLink(n.issue.html_url,i),r.issueType="issue",n.issue.pull_request&&(r.issueType="pull request")),n.pull_request&&(t=n.pull_request,r.pullRequestLink=l.renderLink(t.html_url,r.repo.name+"#"+t.number),r.mergeMessage="",n.pull_request.merged&&(n.action="merged",e="{{c}} "+pluralize("commit",t.commits)+" with {{a}} "+pluralize("addition",t.additions)+" and {{d}} "+pluralize("deletion",t.deletions),r.mergeMessage=Mustache.render(''+e+" ",{c:t.commits,a:t.additions,d:t.deletions}))),n.comment&&n.comment.pull_request_url&&(i=r.repo.name+"#"+n.comment.pull_request_url.split("/").pop(),r.pullRequestLink=l.renderLink(n.comment.html_url,i)),n.comment&&n.comment.body&&(r.comment=n.comment.body,150'),Mustache.render(templates.UserHeader,e)},getActivityHTML:function(e,t){var r="",n=e.length;if(0===(t=(t=t&&n>>32-i,r)}function ff(e,t,r,n,i,a,s){return cmn(t&r|~t&n,e,t,i,a,s)}function gg(e,t,r,n,i,a,s){return cmn(t&n|r&~n,e,t,i,a,s)}function hh(e,t,r,n,i,a,s){return cmn(t^r^n,e,t,i,a,s)}function ii(e,t,r,n,i,a,s){return cmn(r^(t|~n),e,t,i,a,s)}function md51(e){for(var t=e.length,r=[1732584193,-271733879,-1732584194,271733878],n=64;n<=e.length;n+=64)md5cycle(r,md5blk(e.substring(n-64,n)));e=e.substring(n-64);for(var i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],n=0;n>2]|=e.charCodeAt(n)<<(n%4<<3);if(i[n>>2]|=128<<(n%4<<3),55>2]=e.charCodeAt(r)+(e.charCodeAt(r+1)<<8)+(e.charCodeAt(r+2)<<16)+(e.charCodeAt(r+3)<<24);return t}var _add,hex_chr="0123456789abcdef".split("");function rhex(e){for(var t="",r=0;r<4;r++)t+=hex_chr[e>>8*r+4&15]+hex_chr[e>>8*r&15];return t}function hex(e){for(var t=0;t>16)+(t>>16)+(r>>16)<<16|65535&r});var templates={Stream:'',Activity:'
{{{timeString}}}
{{{userLink}}} {{{message}}}
',SingleLineActivity:'
{{{timeString}}}
{{{userLink}}} {{{message}}}
',UserHeader:'
',Footer:'
+
+
+
+
+
Free & Open Source
+
+
+
+
+
Multi-platform
+
+
+
+
+
Vendor-neutral
+
+
+
+
+
Interchangeable tool suite
+
+
+
+
+
Growing community
+
+
+
+
+
Look inside and improve
+
+
+
+
+
+
+
+
+ To understand how F4PGA works, it is best to start with an overview of
+ the general EDA tooling ecosystem and then proceed to see what
+ the F4PGA project consists of.
+
+
+
+
+
+
+ For both ASIC- and FPGA-oriented EDA tooling,
+ there are three major areas:
+
+
+ hardware description
+ frontend
+ backend
+
+
+
+ While there are a number of open hardware description languages, such as
+ Verilog, VHDL, Chisel, Migen and Amaranth HDL, the frontend and backend
+ tooling has been lacking established standard, vendor-neutral solutions.
+ F4PGA focuses on filling this gap.
+
+
+
+
+
+
+
+
+
+
+ To become a complete FOSS FPGA toolchain, F4PGA needs a number of
+ tools and projects to be in place to provide an end-to-end flow.
+ Thus, F4PGA serves as an umbrella framework for several activities,
+ the central of which focuses on the creation of FPGA
+ F4PGA Architecture Definitions, i.e. documentation of how specific
+ FPGAs work internally.
+
+
+ Those definitions and serve as input to backend tools like nextpnr and
+ Verilog to Routing, and frontend tools like Yosys. They are created
+ within separate collaborating projects targeting different FPGAs -
+ Project X-Ray for Xilinx 7-Series,
+ Project IceStorm for Lattice iCE40 and
+ Project Trellis for Lattice ECP5 FPGAs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Xilinx 7-Series
+
+ The most popular Xilinx FPGA family
+
+
learn more
+
+
+
+
+
+
Lattice ice40
+
+ World's smallest FPGAs for mobile devices
+
+
learn more
+
+
+
+
+
+
Lattice ecp5
+
+ Low cost FPGAs with high performance features
+
+
learn more
+
+
+
+
+
+
+
+
+
QuickLogic EOS S3
+
+ FPGA + CPU sensor processing platform
+
+
learn more
+
+
+
+
+
+
+
QuickLogic QLF K4N8
+
+ A 24x24 eFPGA with 6144 flip-flops, 4608 LUT4s, adder and shift-register support
+
+
learn more
+
+
+
+
+
+
+
Do you want to add more?
+
Help us!
+
learn more
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/lib/plugins/connections/connections.directive.html b/node_modules/browser-sync-ui/lib/plugins/connections/connections.directive.html
new file mode 100644
index 0000000..776d99b
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/connections/connections.directive.html
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/connections/connections.html b/node_modules/browser-sync-ui/lib/plugins/connections/connections.html
new file mode 100644
index 0000000..b16ec2c
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/connections/connections.html
@@ -0,0 +1,18 @@
+
+
{{section.title}}
+
+
+
+
Connected devices/browsers will be listed here. If you are not seeing your device in the list,
+ it's probably because the Browsersync script tag is not being loaded on your page.
+
+ Browsersync works by injecting an asynchronous script tag (<script async>...</script>
) right after the <body> tag during initial request. In order for this to work properly the <body> tag must be present. Alternatively you can provide a custom rule for the snippet using snippetOptions
+
+
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/lib/plugins/help/help.directive.html b/node_modules/browser-sync-ui/lib/plugins/help/help.directive.html
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/browser-sync-ui/lib/plugins/help/help.html b/node_modules/browser-sync-ui/lib/plugins/help/help.html
new file mode 100644
index 0000000..387afa3
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/help/help.html
@@ -0,0 +1,8 @@
+
+
{{ctrl.section.title}}
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/history/history.directive.html b/node_modules/browser-sync-ui/lib/plugins/history/history.directive.html
new file mode 100644
index 0000000..ad72102
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/history/history.directive.html
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/history/history.html b/node_modules/browser-sync-ui/lib/plugins/history/history.html
new file mode 100644
index 0000000..8e181d4
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/history/history.html
@@ -0,0 +1,16 @@
+
+
{{ctrl.section.title}}
+
+
+
+
+ Clear all
+
+
+
+
+
Pages you navigate to will appear here - making it easy
+ to sync all devices to a specific page
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/network-throttle/network-throttle.directive.html b/node_modules/browser-sync-ui/lib/plugins/network-throttle/network-throttle.directive.html
new file mode 100644
index 0000000..199aa6e
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/network-throttle/network-throttle.directive.html
@@ -0,0 +1,12 @@
+
+
+
+ Creating a throttled server, please wait...
+
+
+
+
diff --git a/node_modules/browser-sync-ui/lib/plugins/network-throttle/network-throttle.html b/node_modules/browser-sync-ui/lib/plugins/network-throttle/network-throttle.html
new file mode 100644
index 0000000..4ad0d2f
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/network-throttle/network-throttle.html
@@ -0,0 +1,93 @@
+
+
+
+
+ {{ctrl.section.title}}
+
+
+
+
+
Sorry, Network Throttling is only available in Server or Proxy mode.
+
+
+
+
+
+
+
Speed
+
+
+
+ {{item.title}}
+
+
+
+
Port
+
+
+
+
+
+ Create Server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Your Servers:
+ Your Servers will appear here...
+
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/lib/plugins/overview/overview.html b/node_modules/browser-sync-ui/lib/plugins/overview/overview.html
new file mode 100644
index 0000000..047f91d
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/overview/overview.html
@@ -0,0 +1,25 @@
+
+
+
+
+ {{ctrl.section.title}}
+
+
+
+
+
+
+
+
+
+
+
+
Current Connections
+
Connected browsers will be listed here.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/overview/snippet-info.html b/node_modules/browser-sync-ui/lib/plugins/overview/snippet-info.html
new file mode 100644
index 0000000..8349e63
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/overview/snippet-info.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
Place this snippet somewhere before the closing </body>
tag in your website
+
{{options.snippet}}
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/overview/url-info.html b/node_modules/browser-sync-ui/lib/plugins/overview/url-info.html
new file mode 100644
index 0000000..b74305c
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/overview/url-info.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
Serving files from
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/plugins/plugins.html b/node_modules/browser-sync-ui/lib/plugins/plugins/plugins.html
new file mode 100644
index 0000000..f870a2f
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/plugins/plugins.html
@@ -0,0 +1,33 @@
+
+
+
+ {{ctrl.section.title}}
+
+
+
+
+
+
+ Enable All
+
+
+
+
+
+ Disable all
+
+
+
+
+%pluginlist%
+
+
+
+
+
Sorry, no plugins were loaded
+
You can either write your own plugin (guide coming soon!) or Search NPM
+ for packages that contain the keywords browser sync plugin
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/remote-debug/compression.html b/node_modules/browser-sync-ui/lib/plugins/remote-debug/compression.html
new file mode 100644
index 0000000..7ae3827
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/remote-debug/compression.html
@@ -0,0 +1,19 @@
+
+
+
+
+
{{ctrl.compression.title}}
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/remote-debug/latency/latency.html b/node_modules/browser-sync-ui/lib/plugins/remote-debug/latency/latency.html
new file mode 100644
index 0000000..feae946
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/remote-debug/latency/latency.html
@@ -0,0 +1,12 @@
+
+
+
+ {{ctrl.latency.rate | number:1}}s
+
+
diff --git a/node_modules/browser-sync-ui/lib/plugins/remote-debug/no-cache.html b/node_modules/browser-sync-ui/lib/plugins/remote-debug/no-cache.html
new file mode 100644
index 0000000..1bea016
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/remote-debug/no-cache.html
@@ -0,0 +1,19 @@
+
+
+
+
+
{{ctrl.noCache.title}}
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/overlay-grid.html b/node_modules/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/overlay-grid.html
new file mode 100644
index 0000000..1de1c83
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/overlay-grid.html
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
CSS Selector
+
+
+
+
+
+
+
+
+
+
+
+
+
Offset Left
+
+
+
+
+
+
+
+
+
+
+
+
+ Horizontal Axis
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/lib/plugins/remote-debug/remote-debug.html b/node_modules/browser-sync-ui/lib/plugins/remote-debug/remote-debug.html
new file mode 100644
index 0000000..a79025c
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/remote-debug/remote-debug.html
@@ -0,0 +1,23 @@
+
+
+
+ {{ctrl.section.title}}
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/lib/plugins/sync-options/sync-options.html b/node_modules/browser-sync-ui/lib/plugins/sync-options/sync-options.html
new file mode 100644
index 0000000..527b591
--- /dev/null
+++ b/node_modules/browser-sync-ui/lib/plugins/sync-options/sync-options.html
@@ -0,0 +1,25 @@
+
+
+
+
+ {{ctrl.section.title}}
+
+
+
+
+
+ Enable All
+
+
+
+ Disable all
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/public/img/icons/preview.html b/node_modules/browser-sync-ui/public/img/icons/preview.html
new file mode 100644
index 0000000..b8fcab7
--- /dev/null
+++ b/node_modules/browser-sync-ui/public/img/icons/preview.html
@@ -0,0 +1,429 @@
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/public/index.html b/node_modules/browser-sync-ui/public/index.html
new file mode 100644
index 0000000..afed259
--- /dev/null
+++ b/node_modules/browser-sync-ui/public/index.html
@@ -0,0 +1,80 @@
+
+
+
+ Browsersync
+
+
+
+
+
+
+
+
+
+ %svg%
+
+
+
+
+
+
+ %header%
+
+
+
+
+ Loading...
+
+
+
+
+
+ {{item.title | ucfirst}}
+
+
+
+ CLOSE
+
+
+
+
+ %footer%
+
+
+
+
+
+ %pageMarkup%
+ %templates%
+
+
+
+
+ %footer%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/static/components.html b/node_modules/browser-sync-ui/static/components.html
new file mode 100644
index 0000000..9b1e152
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components.html
@@ -0,0 +1,583 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+ Crossbow WARNING: Include not found: ../../public/img/icons/svg/symbols.svg
+
+
+
Browsersync UI Components
+
Also, you can view static representations of each section:
+
+
+
+
+
+
Typography
+
Heading 1
+
+
Heading 2
+
+
Heading 3
+
+
Lede paragraph. Lorem ipsum dolor sit amet.
+
+
Paragraph. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Libero esse molestias, itaque, quia sed laudantium laboriosam amet aliquam ipsam, laborum asperiores quod obcaecati, maiores fugiat nihil cum minus provident vitae.
+
+
Small paragraph. Lorem ipsum dolor sit amet.
+
+
Link | Another link
+
+
Inline tags. Lorem strong ipsum code
dolar mark si em .
+
+
+
+
+ Lorem ipsum dolor sit amet.
+ Ratione dolore veritatis voluptas consequuntur!
+ Odit quis, pariatur ipsum vel.
+
+ Lorem ipsum dolor sit amet.
+ Ratione dolore veritatis voluptas consequuntur!
+ Odit quis, pariatur ipsum vel.
+ Suscipit laudantium, quam debitis tempore.
+ Nobis vero nesciunt suscipit porro.
+
+
+ Suscipit laudantium, quam debitis tempore.
+ Nobis vero nesciunt suscipit porro.
+
+
+
+ Lorem ipsum dolor sit amet.
+ Ratione dolore veritatis voluptas consequuntur!
+ Odit quis, pariatur ipsum vel.
+
+ Lorem ipsum dolor sit amet.
+ Ratione dolore veritatis voluptas consequuntur!
+ Odit quis, pariatur ipsum vel.
+ Suscipit laudantium, quam debitis tempore.
+ Nobis vero nesciunt suscipit porro.
+
+
+ Suscipit laudantium, quam debitis tempore.
+ Nobis vero nesciunt suscipit porro.
+
+
+
+ Lorem ipsum dolor sit amet.
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.
+ Lorem ipsum dolor sit amet.
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.
+ Lorem ipsum dolor sit amet.
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.
+
+
+
+
+
+ The Very Best Eggnog
+
+
+ Ingredients
+ Serves 12
+ Serves 24
+
+
+
+
+ Milk
+ 1 quart
+ 2 quart
+
+
+ Cloves
+ 5
+ 10
+
+
+ Egg Yolks
+ 12
+ 24
+
+
+ Cups Sugar
+ 1 ½ cups
+ 3 cups
+
+
+ Dark Rum
+ 1 ½ cups
+ 3 cups
+
+
+ Freshly grated nutmeg to taste
+
+
+
+
+
+
+
+
+
+
Buttons
+
Default button styles
+
+ Button
+ Button Small
+ Button Small
+
+
Subtle button styles
+
+ Button
+ Button Small
+ Button Small
+
+
Alternative Subtle button styles
+
+ Button
+ Button Small
+ Button Small
+
+
+
Default buttons with icons
+
+ Icon Left
+ Icon Right
+
+
+
+
+ Icon Left
+ Icon Right
+
+
+
+
+
Subtle buttons with icons
+
+ Icon Left
+ Icon Right
+
+
+
+
+ Icon Left
+ Icon Right
+
+
+
+
+
Alternative Subtle button styles with icons
+
+ Icon Left
+ Icon Right
+
+
+
+
+
+
+
+
Button bars
+
+ Website
+ Twitter
+ Github
+
+
+
+
+
+
+
+
+
+ Button
+
+ Button Small
+ n/a
+ Button Small
+
+
+ Button
+
+ Button Small
+ n/a
+ Button Small
+
+
+ Button
+
+ Button Small
+ n/a
+ Button Small
+
+
+
+
+
Form inputs
+
+ Grid Size
+
+
+
+
+ Some input
+
+
+
+
Form label
+
+
+
Input + Button
+
+ rs
+
+
+
+
+
+
+
+
+
+
+
+
Lists
+
+
+
Simple list
+
+ Item 1
+ Item 2
+ Item 3
+ Item 4
+ Item 5
+
+
+
Bordered list
+
+
+
Bordered list with controls
+
+
+
+
+ https://github.com/BrowserSync/browser-sync/
+
+
+
+
+
+
+
+
+
+
+ https://github.com/BrowserSync/browser-sync/issues
+
+
+
+
+
+
+
+
+
+
+ https://twitter.com/browsersync
+
+
+
+
+
+
+
+
+
+
+ https://browsersync.io
+
+
+
+
+
+
+
+
+
+
+ https://stackoverflow.com/questions/tagged/browser-sync
+
+
+
+
+
+
+
+
+
+
+ https://www.browsersync.io/docs/options/#option-snippetOptions
+
+
+
+
+
+
+
+
+
+
+ https://github.com/shakyShane/browser-sync/blob/master/CONTRIBUTING.md
+
+
+
+
+
+
+
+
+
+
+ https://www.browsersync.io/docs/options
+
+
+
+
+
+
+
+
+
+
+ https://wearejh.com
+
+
+
+
+
+
+
+
+
+
+
+
Headings
+
+
+
+ Server Info
+
+
+
+
+
+
Panels
+
+
+
Page heading
+
+
+
+ Overview
+
+
+
+
+
+
+ Sync all
+
+
+
+
+
+ Enable All
+
+
+
+ Disable all
+
+
+
+
+
+
+
+ Overview
+
+
+
+
+
+
+
Header
+
+
+
+
+
Switches
+
+
+
+
+
+
Css Grid Overlay
+
Some other content
+
+
+
+
+
+
+
+
+
+
+ Horizontal Axis
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/components/button-bars.html b/node_modules/browser-sync-ui/static/components/button-bars.html
new file mode 100644
index 0000000..c314867
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/button-bars.html
@@ -0,0 +1,33 @@
+
+ Website
+ Twitter
+ Github
+
+
+
+
+
+
+
+
+
+ Button
+
+ Button Small
+ n/a
+ Button Small
+
+
+ Button
+
+ Button Small
+ n/a
+ Button Small
+
+
+ Button
+
+ Button Small
+ n/a
+ Button Small
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/components/buttons.html b/node_modules/browser-sync-ui/static/components/buttons.html
new file mode 100644
index 0000000..b19fe77
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/buttons.html
@@ -0,0 +1,54 @@
+Default button styles
+
+ Button
+ Button Small
+ Button Small
+
+Subtle button styles
+
+ Button
+ Button Small
+ Button Small
+
+Alternative Subtle button styles
+
+ Button
+ Button Small
+ Button Small
+
+
+Default buttons with icons
+
+ Icon Left
+ Icon Right
+
+
+
+
+ Icon Left
+ Icon Right
+
+
+
+
+Subtle buttons with icons
+
+ Icon Left
+ Icon Right
+
+
+
+
+ Icon Left
+ Icon Right
+
+
+
+
+Alternative Subtle button styles with icons
+
+ Icon Left
+ Icon Right
+
+
+
diff --git a/node_modules/browser-sync-ui/static/components/footer.html b/node_modules/browser-sync-ui/static/components/footer.html
new file mode 100644
index 0000000..3409cf0
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/footer.html
@@ -0,0 +1,13 @@
+
diff --git a/node_modules/browser-sync-ui/static/components/forms.html b/node_modules/browser-sync-ui/static/components/forms.html
new file mode 100644
index 0000000..d3e3c63
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/forms.html
@@ -0,0 +1,34 @@
+
+ Grid Size
+
+
+
+
+ Some input
+
+
+
+Form label
+
+
+
Input + Button
+
+ rs
+
+
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/static/components/header.html b/node_modules/browser-sync-ui/static/components/header.html
new file mode 100644
index 0000000..744b2ce
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/header.html
@@ -0,0 +1,38 @@
+
diff --git a/node_modules/browser-sync-ui/static/components/heading.html b/node_modules/browser-sync-ui/static/components/heading.html
new file mode 100644
index 0000000..a873b0b
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/heading.html
@@ -0,0 +1,6 @@
+
+
+
+ Server Info
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/components/help-content.html b/node_modules/browser-sync-ui/static/components/help-content.html
new file mode 100644
index 0000000..b73347b
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/help-content.html
@@ -0,0 +1,45 @@
+
+
Help Content
+
+
+
+
+ Browsersync is an open-source project created by Shane Osbourne
+
+
Originally supported by [JH](https://wearejh.com).
+
+
+
+
+
Help
+
+ Why isn’t Browsersync connecting with my project?
+ 99% of the time, it's because your web page doesn't have a `body` tag.
+ In order for Browsersync to connect properly the `body` tag must be present in your website (we add a script tag just after it).
+ Alternatively you can provide a custom rule for the snippet using [snippetOptions](https://www.browsersync.io/docs/options/#option-snippetOptions)
+
+ Which mode should I be running in?
+
+
+ If you have simple HTML, CSS & JavaScript files, you need the [server option](https://www.browsersync.io/docs/options-server).
+ If you already have an existing server setup (such as an Express app, Mamp, Rails etc, then you need the [proxy option](https://www.browsersync.io/docs/options-proxy).
+ If you intend to copy/paste the snippet into your website manually, you use the `snippet` mode. This is the default mode and is
+ achieved by omitting both the server & proxy options
+
+
+ Where can I report an issue?
+
+ If you have found an issue with the Browsersync UI, please use our [issue tracker](https://github.com/BrowserSync/browser-sync/issues)
+
+
+
+
+
Need more assistance? Please try our [documentation](http://www.browsersync.io/docs/) for user guides or our [stackoverflow](https://stackoverflow.com/questions/tagged/browser-sync) tag for answers to common problems.
+
+
+
+
+
Contribute
+
We'd love for you to contribute to Browsersync and help make it even better than it is today! Please read our [contributor guidelines](https://github.com/shakyShane/browser-sync/blob/master/CONTRIBUTING.md).
+
+
diff --git a/node_modules/browser-sync-ui/static/components/lists.html b/node_modules/browser-sync-ui/static/components/lists.html
new file mode 100644
index 0000000..bf0c670
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/lists.html
@@ -0,0 +1,123 @@
+
+
Simple list
+
+ Item 1
+ Item 2
+ Item 3
+ Item 4
+ Item 5
+
+
+
Bordered list
+
+
+
Bordered list with controls
+
+
+
+
+ https://github.com/BrowserSync/browser-sync/
+
+
+
+
+
+
+
+
+
+
+ https://github.com/BrowserSync/browser-sync/issues
+
+
+
+
+
+
+
+
+
+
+ https://twitter.com/browsersync
+
+
+
+
+
+
+
+
+
+
+ https://browsersync.io
+
+
+
+
+
+
+
+
+
+
+ https://stackoverflow.com/questions/tagged/browser-sync
+
+
+
+
+
+
+
+
+
+
+ https://www.browsersync.io/docs/options/#option-snippetOptions
+
+
+
+
+
+
+
+
+
+
+ https://github.com/shakyShane/browser-sync/blob/master/CONTRIBUTING.md
+
+
+
+
+
+
+
+
+
+
+ https://www.browsersync.io/docs/options
+
+
+
+
+
+
+
+
+
+
+ https://wearejh.com
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/components/panels.html b/node_modules/browser-sync-ui/static/components/panels.html
new file mode 100644
index 0000000..be8d410
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/panels.html
@@ -0,0 +1,35 @@
+
+
Page heading
+
+
+
+ Overview
+
+
+
+
+
+
+ Sync all
+
+
+
+
+
+ Enable All
+
+
+
+ Disable all
+
+
+
+
+
+
+
+ Overview
+
+
+
+
diff --git a/node_modules/browser-sync-ui/static/components/switches.html b/node_modules/browser-sync-ui/static/components/switches.html
new file mode 100644
index 0000000..b96ed75
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/switches.html
@@ -0,0 +1,69 @@
+
+
+
+
+
Css Grid Overlay
+
Some other content
+
+
+
+
+
+
+
+
+
+
+ Horizontal Axis
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/static/components/type.html b/node_modules/browser-sync-ui/static/components/type.html
new file mode 100644
index 0000000..f118f0f
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/components/type.html
@@ -0,0 +1,103 @@
+Heading 1
+
+Heading 2
+
+Heading 3
+
+Lede paragraph. Lorem ipsum dolor sit amet.
+
+Paragraph. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Libero esse molestias, itaque, quia sed laudantium laboriosam amet aliquam ipsam, laborum asperiores quod obcaecati, maiores fugiat nihil cum minus provident vitae.
+
+Small paragraph. Lorem ipsum dolor sit amet.
+
+Link | Another link
+
+Inline tags. Lorem strong ipsum code
dolar mark si em .
+
+
+
+
+ Lorem ipsum dolor sit amet.
+ Ratione dolore veritatis voluptas consequuntur!
+ Odit quis, pariatur ipsum vel.
+
+ Lorem ipsum dolor sit amet.
+ Ratione dolore veritatis voluptas consequuntur!
+ Odit quis, pariatur ipsum vel.
+ Suscipit laudantium, quam debitis tempore.
+ Nobis vero nesciunt suscipit porro.
+
+
+ Suscipit laudantium, quam debitis tempore.
+ Nobis vero nesciunt suscipit porro.
+
+
+
+ Lorem ipsum dolor sit amet.
+ Ratione dolore veritatis voluptas consequuntur!
+ Odit quis, pariatur ipsum vel.
+
+ Lorem ipsum dolor sit amet.
+ Ratione dolore veritatis voluptas consequuntur!
+ Odit quis, pariatur ipsum vel.
+ Suscipit laudantium, quam debitis tempore.
+ Nobis vero nesciunt suscipit porro.
+
+
+ Suscipit laudantium, quam debitis tempore.
+ Nobis vero nesciunt suscipit porro.
+
+
+
+ Lorem ipsum dolor sit amet.
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.
+ Lorem ipsum dolor sit amet.
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.
+ Lorem ipsum dolor sit amet.
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.
+
+
+
+
+
+ The Very Best Eggnog
+
+
+ Ingredients
+ Serves 12
+ Serves 24
+
+
+
+
+ Milk
+ 1 quart
+ 2 quart
+
+
+ Cloves
+ 5
+ 10
+
+
+ Egg Yolks
+ 12
+ 24
+
+
+ Cups Sugar
+ 1 ½ cups
+ 3 cups
+
+
+ Dark Rum
+ 1 ½ cups
+ 3 cups
+
+
+ Freshly grated nutmeg to taste
+
+
+
+
+
diff --git a/node_modules/browser-sync-ui/static/content/help.content.html b/node_modules/browser-sync-ui/static/content/help.content.html
new file mode 100644
index 0000000..68d55e6
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/content/help.content.html
@@ -0,0 +1,46 @@
+
+
Help / About
+
+
+
+
+ Browsersync is an open-source project created by Shane Osbourne
+
+
Originally supported by JH .
+
+
+
+
+
Help
+
+ Why isn’t Browsersync connecting with my project?
+ 99% of the time, it's because your web page doesn't have a body
tag.
+ In order for Browsersync to connect properly the body
tag must be present in your website (we add a script tag just after it).
+ Alternatively you can provide a custom rule for the snippet using snippetOptions
+
+ Which mode should I be running in?
+
+
+ If you have simple HTML, CSS & JavaScript files, you need the server option .
+ If you already have an existing server setup (such as an Express app, Mamp, Rails etc, then you need the proxy option .
+ If you intend to copy/paste the snippet into your website manually, you use the snippet
mode. This is the default mode and is
+ achieved by omitting both the server & proxy options
+
+
+ Where can I report an issue?
+
+ If you have found an issue with the Browsersync UI, please use our issue tracker
+
+
+
+
+
Need more assistance? Please try our documentation for user guides or our stackoverflow tag for answers to common problems.
+
+
+
+
+
Contribute
+
We'd love for you to contribute to Browsersync and help make it even better than it is today! Please read our contributor guidelines .
+
+
+
diff --git a/node_modules/browser-sync-ui/static/help.html b/node_modules/browser-sync-ui/static/help.html
new file mode 100644
index 0000000..b04d328
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/help.html
@@ -0,0 +1,350 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rectangle 1 + Rectangle 2 + Rectangle 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fill 213 + Fill 132
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Help / About
+
+
+
+
+ Browsersync is an open-source project created by Shane Osbourne
+
+
Originally supported by JH .
+
+
+
+
+
Help
+
+ Why isn’t Browsersync connecting with my project?
+ 99% of the time, it's because your web page doesn't have a body
tag.
+ In order for Browsersync to connect properly the body
tag must be present in your website (we add a script tag just after it).
+ Alternatively you can provide a custom rule for the snippet using snippetOptions
+
+ Which mode should I be running in?
+
+
+ If you have simple HTML, CSS & JavaScript files, you need the server option .
+ If you already have an existing server setup (such as an Express app, Mamp, Rails etc, then you need the proxy option .
+ If you intend to copy/paste the snippet into your website manually, you use the snippet
mode. This is the default mode and is
+ achieved by omitting both the server & proxy options
+
+
+ Where can I report an issue?
+
+ If you have found an issue with the Browsersync UI, please use our issue tracker
+
+
+
+
+
Need more assistance? Please try our documentation for user guides or our stackoverflow tag for answers to common problems.
+
+
+
+
+
Contribute
+
We'd love for you to contribute to Browsersync and help make it even better than it is today! Please read our contributor guidelines .
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/history.html b/node_modules/browser-sync-ui/static/history.html
new file mode 100644
index 0000000..e27891a
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/history.html
@@ -0,0 +1,525 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rectangle 1 + Rectangle 2 + Rectangle 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fill 213 + Fill 132
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
History
+
+
+
+
+ Clear all
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/network-throttle.html b/node_modules/browser-sync-ui/static/network-throttle.html
new file mode 100644
index 0000000..52866a1
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/network-throttle.html
@@ -0,0 +1,400 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rectangle 1 + Rectangle 2 + Rectangle 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fill 213 + Fill 132
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Network Throttle
+
+
+
+
+
+
+
+
Port
+
+
+
+
+
+ Create Server
+
+
+
+
+
+
+
+
Your Servers
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/plugins.html b/node_modules/browser-sync-ui/static/plugins.html
new file mode 100644
index 0000000..fcc704a
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/plugins.html
@@ -0,0 +1,432 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rectangle 1 + Rectangle 2 + Rectangle 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fill 213 + Fill 132
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Plugins
+
+
+
+
+
+
+
+
+ Add Rewrite Rule
+
+
+
+
+
+
+
Current Replacements
+
+
+
+
+ Match regex
+ /skin/default/assets/(.+?)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Replacestring
+ <link rel="apple-touch-icon" sizes="114x114" href="http://www.sunspel.com/skin/frontend/sunspel/default/assets/img/114x114.png">
+ <link rel="apple-touch-icon" sizes="144x144" href="http://www.sunspel.com/skin/frontend/sunspel/default/assets/img/144x144.png">
+
+
+
+
+
+
+
+
+
+
Default behaviour is to compare the entire page. You can also restrict the comparisons
+ for localized edits.
+
+
+
+
+
+ New Restriction
+
+
+
+
+
Current Restrictions:
+
+ #main
+
+
+
+
+ #header
+ #footer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/remote-debug.html b/node_modules/browser-sync-ui/static/remote-debug.html
new file mode 100644
index 0000000..644fdbb
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/remote-debug.html
@@ -0,0 +1,405 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rectangle 1 + Rectangle 2 + Rectangle 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fill 213 + Fill 132
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Remote Debug
+
+
+
+ Enable All
+
+
+ Disable All
+
+
+
+
+
+
+
+
CSS Outlining
+
Some Awesome tagline here
+
+
+
+
+
+
+
+
Css Grid Overlay
+
Some other content
+
+
+
+
+
+
+
+
+
+
+ Horizontal Axis
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/server-info-snippet.html b/node_modules/browser-sync-ui/static/server-info-snippet.html
new file mode 100644
index 0000000..0ac5552
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/server-info-snippet.html
@@ -0,0 +1,326 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rectangle 1 + Rectangle 2 + Rectangle 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fill 213 + Fill 132
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Snippet Info
+
+
+
+
+
+
+
+
Place this snippet somewhere before the closing </body>
tag in your website
+
<script type='text/javascript' id="__bs_script__">//<![CDATA[
+document.write("<script async src='//HOST:3000/browser-sync/browser-sync-client.1.8.2.js'><\/script>".replace(/HOST/g, location.hostname).replace(/PORT/g, location.port));
+//]]></script>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/server-info.html b/node_modules/browser-sync-ui/static/server-info.html
new file mode 100644
index 0000000..7d6ab91
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/server-info.html
@@ -0,0 +1,381 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rectangle 1 + Rectangle 2 + Rectangle 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fill 213 + Fill 132
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Server Info
+
+
+
+
+
+
+
+
+
Serving files from
+
+ /Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures
+ /Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures
+ /Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/static/sync-options.html b/node_modules/browser-sync-ui/static/sync-options.html
new file mode 100644
index 0000000..b1883e0
--- /dev/null
+++ b/node_modules/browser-sync-ui/static/sync-options.html
@@ -0,0 +1,507 @@
+
+
+
+ Browser Sync - Control Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rectangle 1 + Rectangle 2 + Rectangle 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fill 213 + Fill 132
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Sync Options
+
+
+
+ Enable All
+
+
+ Disable All
+
+
+
+
+
+
+
+
Clicks
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Scroll
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Forms: Submit
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Forms: Toggles
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Forms: Inputs
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Clicks
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Scroll
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Forms: Submit
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Forms: Toggles
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
Forms: Inputs
+
Mirrors click events across devices
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/browser-sync-ui/templates/directives/bs-switch.html b/node_modules/browser-sync-ui/templates/directives/bs-switch.html
new file mode 100644
index 0000000..e93293b
--- /dev/null
+++ b/node_modules/browser-sync-ui/templates/directives/bs-switch.html
@@ -0,0 +1,20 @@
+
+
+
+
+
{{item.title}}
+
{{item.tagline}}
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/bs-recipes/recipes/grunt.html.injection/app/index.html b/node_modules/bs-recipes/recipes/grunt.html.injection/app/index.html
new file mode 100644
index 0000000..db834d3
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/grunt.html.injection/app/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+ Browsersync Grunt + HTML Injection Example
+
+
+
+
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/grunt.sass.autoprefixer/app/index.html b/node_modules/bs-recipes/recipes/grunt.sass.autoprefixer/app/index.html
new file mode 100644
index 0000000..1979179
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/grunt.sass.autoprefixer/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync, Grunt + SASS Example
+
+
+
+ Browsersync, Grunt + SASS Example
+
+
diff --git a/node_modules/bs-recipes/recipes/grunt.sass/app/index.html b/node_modules/bs-recipes/recipes/grunt.sass/app/index.html
new file mode 100644
index 0000000..1979179
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/grunt.sass/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync, Grunt + SASS Example
+
+
+
+ Browsersync, Grunt + SASS Example
+
+
diff --git a/node_modules/bs-recipes/recipes/gulp.browserify/app/index.html b/node_modules/bs-recipes/recipes/gulp.browserify/app/index.html
new file mode 100644
index 0000000..9ec1d22
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/gulp.browserify/app/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+ Browsersync Browserify Example
+
+
+
+ Browsersync Browserify Example
+
+
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/gulp.ruby.sass/app/index.html b/node_modules/bs-recipes/recipes/gulp.ruby.sass/app/index.html
new file mode 100644
index 0000000..0c62620
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/gulp.ruby.sass/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync, Gulp + Ruby SASS Example
+
+
+
+ Browsersync, Gulp + Ruby SASS Example
+
+
diff --git a/node_modules/bs-recipes/recipes/gulp.sass/app/index.html b/node_modules/bs-recipes/recipes/gulp.sass/app/index.html
new file mode 100644
index 0000000..2f40e11
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/gulp.sass/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync, Gulp + SASS Example
+
+
+
+ Browsersync, Gulp + SASS Example
+
+
diff --git a/node_modules/bs-recipes/recipes/gulp.swig/app/index.html b/node_modules/bs-recipes/recipes/gulp.swig/app/index.html
new file mode 100644
index 0000000..db1d368
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/gulp.swig/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync, Gulp + Swig templates
+
+
+
+ Browsersync, Gulp + Swig templates
+
+
diff --git a/node_modules/bs-recipes/recipes/gulp.task.sequence/app/index.html b/node_modules/bs-recipes/recipes/gulp.task.sequence/app/index.html
new file mode 100644
index 0000000..f378424
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/gulp.task.sequence/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync, Gulp, SASS + Slow tasks example
+
+
+
+ Browsersync, Gulp, SASS + Slow tasks example
+
+
diff --git a/node_modules/bs-recipes/recipes/html.injection/app/index.html b/node_modules/bs-recipes/recipes/html.injection/app/index.html
new file mode 100644
index 0000000..57cd4aa
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/html.injection/app/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+ Browsersync Server Example
+
+
+
+
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/middleware.css.injection/app/index.html b/node_modules/bs-recipes/recipes/middleware.css.injection/app/index.html
new file mode 100644
index 0000000..bab55d2
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/middleware.css.injection/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync Server Example
+
+
+
+ Browsersync Middleware CSS injection Example
+
+
diff --git a/node_modules/bs-recipes/recipes/server.gzipped.assets/app/index.html b/node_modules/bs-recipes/recipes/server.gzipped.assets/app/index.html
new file mode 100644
index 0000000..ae3fc76
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/server.gzipped.assets/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync Server + Gzipped assets Example
+
+
+
+ Browsersync Server + Gzipped assets Example
+
+
diff --git a/node_modules/bs-recipes/recipes/server.includes/app/footer.html b/node_modules/bs-recipes/recipes/server.includes/app/footer.html
new file mode 100644
index 0000000..640b8a1
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/server.includes/app/footer.html
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/node_modules/bs-recipes/recipes/server.includes/app/header.html b/node_modules/bs-recipes/recipes/server.includes/app/header.html
new file mode 100644
index 0000000..cd5b01a
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/server.includes/app/header.html
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/node_modules/bs-recipes/recipes/server.includes/app/index.html b/node_modules/bs-recipes/recipes/server.includes/app/index.html
new file mode 100644
index 0000000..316da74
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/server.includes/app/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ Browsersync Server Includes Example
+
+
+
+ @include("app/header.html")
+ Browsersync Server Includes Example
+ @include("app/footer.html")
+
+
diff --git a/node_modules/bs-recipes/recipes/server.middleware/app/index.html b/node_modules/bs-recipes/recipes/server.middleware/app/index.html
new file mode 100644
index 0000000..ab741f4
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/server.middleware/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync Server Example
+
+
+
+ Browsersync Server Example
+
+
diff --git a/node_modules/bs-recipes/recipes/server/app/index.html b/node_modules/bs-recipes/recipes/server/app/index.html
new file mode 100644
index 0000000..ab741f4
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/server/app/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Browsersync Server Example
+
+
+
+ Browsersync Server Example
+
+
diff --git a/node_modules/bs-recipes/recipes/webpack.babel/app/index.html b/node_modules/bs-recipes/recipes/webpack.babel/app/index.html
new file mode 100644
index 0000000..646b8a9
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/webpack.babel/app/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+ Browsersync, Webpack + Babel
+
+
+
+ Browsersync, Webpack + Babel Example
+
+ 0
+ Increase
+ Decrease
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/webpack.monkey-hot-loader/app/index.html b/node_modules/bs-recipes/recipes/webpack.monkey-hot-loader/app/index.html
new file mode 100644
index 0000000..0d4e19e
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/webpack.monkey-hot-loader/app/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+ Browsersync, Webpack + Monkey Hot Loader Example
+
+
+
+ Browsersync, Webpack + Monkey Hot Loader Example
+
+ 0
+ Increase
+ Decrease
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/webpack.preact-hot-loader/app/index.html b/node_modules/bs-recipes/recipes/webpack.preact-hot-loader/app/index.html
new file mode 100644
index 0000000..7b29218
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/webpack.preact-hot-loader/app/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+ Browsersync, Webpack + Preact Hot Loader Example
+
+
+
+
+ Browsersync, Webpack + Preact Hot Loader Example
+
+
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/webpack.react-hot-loader/app/index.html b/node_modules/bs-recipes/recipes/webpack.react-hot-loader/app/index.html
new file mode 100644
index 0000000..f2ef135
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/webpack.react-hot-loader/app/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+ Browsersync, Webpack + React Hot Loader Example
+
+
+
+
+ Browsersync, Webpack + React Hot Loader Example
+
+
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/webpack.react-transform-hmr/app/index.html b/node_modules/bs-recipes/recipes/webpack.react-transform-hmr/app/index.html
new file mode 100644
index 0000000..f2ef135
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/webpack.react-transform-hmr/app/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+ Browsersync, Webpack + React Hot Loader Example
+
+
+
+
+ Browsersync, Webpack + React Hot Loader Example
+
+
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/webpack.typescript.react/app/index.html b/node_modules/bs-recipes/recipes/webpack.typescript.react/app/index.html
new file mode 100644
index 0000000..62ef866
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/webpack.typescript.react/app/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ Browsersync, Webpack, TypeScript + React
+
+
+
+ Browsersync, Webpack, TypeScript + React example
+
+
+
+
diff --git a/node_modules/bs-recipes/recipes/webpack.typescript/app/index.html b/node_modules/bs-recipes/recipes/webpack.typescript/app/index.html
new file mode 100644
index 0000000..4b7a43b
--- /dev/null
+++ b/node_modules/bs-recipes/recipes/webpack.typescript/app/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ Browsersync, Webpack + TypeScript
+
+
+
+ Browsersync, Webpack, and TypeScript Example
+
+
+
+
diff --git a/node_modules/bs-snippet-injector/index.html b/node_modules/bs-snippet-injector/index.html
new file mode 100644
index 0000000..71ce692
--- /dev/null
+++ b/node_modules/bs-snippet-injector/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/console-stream/test/static/index.html b/node_modules/console-stream/test/static/index.html
new file mode 100644
index 0000000..60f6ef8
--- /dev/null
+++ b/node_modules/console-stream/test/static/index.html
@@ -0,0 +1,11 @@
+
+
+
+ TAPE Example
+
+
+
+
+
+
+
diff --git a/node_modules/gulp-inject-string/examples/build/after.html b/node_modules/gulp-inject-string/examples/build/after.html
new file mode 100644
index 0000000..dcb49b7
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/build/after.html
@@ -0,0 +1,15 @@
+
+
+
+ Example
+
+
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore!
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis.
+
+
+
+
diff --git a/node_modules/gulp-inject-string/examples/build/afterEach.html b/node_modules/gulp-inject-string/examples/build/afterEach.html
new file mode 100644
index 0000000..b911ab4
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/build/afterEach.html
@@ -0,0 +1,13 @@
+
+
+
+ Example
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore!
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis.
+
+
+
+
diff --git a/node_modules/gulp-inject-string/examples/build/append.html b/node_modules/gulp-inject-string/examples/build/append.html
new file mode 100644
index 0000000..6d68de7
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/build/append.html
@@ -0,0 +1,15 @@
+
+
+
+ Example
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore!
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/gulp-inject-string/examples/build/before.html b/node_modules/gulp-inject-string/examples/build/before.html
new file mode 100644
index 0000000..0de16a7
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/build/before.html
@@ -0,0 +1,14 @@
+
+
+
+ Example
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore!
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis.
+
+
+
+
+
diff --git a/node_modules/gulp-inject-string/examples/build/beforeEach.html b/node_modules/gulp-inject-string/examples/build/beforeEach.html
new file mode 100644
index 0000000..9b708b5
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/build/beforeEach.html
@@ -0,0 +1,13 @@
+
+
+
+ Example
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore! Finis.
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis. Finis.
+
+
+
+
diff --git a/node_modules/gulp-inject-string/examples/build/prepend.html b/node_modules/gulp-inject-string/examples/build/prepend.html
new file mode 100644
index 0000000..5c5d724
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/build/prepend.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Example
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore!
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis.
+
+
+
+
diff --git a/node_modules/gulp-inject-string/examples/build/replace.html b/node_modules/gulp-inject-string/examples/build/replace.html
new file mode 100644
index 0000000..15db4b8
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/build/replace.html
@@ -0,0 +1,13 @@
+
+
+
+ Example
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore!
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis.
+
+
+
+
diff --git a/node_modules/gulp-inject-string/examples/build/wrap.html b/node_modules/gulp-inject-string/examples/build/wrap.html
new file mode 100644
index 0000000..5fa0a35
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/build/wrap.html
@@ -0,0 +1,15 @@
+
+
+
+
+ Example
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore!
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis.
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/gulp-inject-string/examples/src/example.html b/node_modules/gulp-inject-string/examples/src/example.html
new file mode 100644
index 0000000..20692de
--- /dev/null
+++ b/node_modules/gulp-inject-string/examples/src/example.html
@@ -0,0 +1,13 @@
+
+
+
+ Example
+
+
+ gulp-inject-string Example
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id sunt harum optio totam, consequatur deserunt perspiciatis placeat commodi sint dolore!
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat eveniet itaque distinctio, accusantium rem omnis.
+
+
+
+
diff --git a/node_modules/gulp-inject-string/tests/expected/after.html b/node_modules/gulp-inject-string/tests/expected/after.html
new file mode 100644
index 0000000..8127c01
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/expected/after.html
@@ -0,0 +1,13 @@
+
+
+
+ Test file
+
+
+ Test file
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ First occurence of span
+ Second occurence of span
+
+ After test
+
diff --git a/node_modules/gulp-inject-string/tests/expected/afterEach.html b/node_modules/gulp-inject-string/tests/expected/afterEach.html
new file mode 100644
index 0000000..3e7587d
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/expected/afterEach.html
@@ -0,0 +1,13 @@
+
+
+
+ Test file
+
+
+ Test file
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ First occurence of span After test
+ Second occurence of span After test
+
+
+
diff --git a/node_modules/gulp-inject-string/tests/expected/afterEach2.html b/node_modules/gulp-inject-string/tests/expected/afterEach2.html
new file mode 100644
index 0000000..ae683a3
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/expected/afterEach2.html
@@ -0,0 +1,14 @@
+
+
+
+ Test file
+
+
+ Test file
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ First occurence of span
+ Second occurence of span
+
+
+
+
diff --git a/node_modules/gulp-inject-string/tests/expected/before.html b/node_modules/gulp-inject-string/tests/expected/before.html
new file mode 100644
index 0000000..4624a34
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/expected/before.html
@@ -0,0 +1,13 @@
+
+
+
+ Test file
+
+
+ Test file
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ First occurence of span
+ Second occurence of span
+
+ Before test
+
diff --git a/node_modules/gulp-inject-string/tests/expected/beforeEach.html b/node_modules/gulp-inject-string/tests/expected/beforeEach.html
new file mode 100644
index 0000000..25c2be1
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/expected/beforeEach.html
@@ -0,0 +1,13 @@
+
+
+
+ Test file
+
+
+ Test file
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ Before test First occurence of span
+ Before test Second occurence of span
+
+
+
diff --git a/node_modules/gulp-inject-string/tests/expected/beforeEach2.html b/node_modules/gulp-inject-string/tests/expected/beforeEach2.html
new file mode 100644
index 0000000..5a36de2
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/expected/beforeEach2.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Test file
+
+
+ Test file
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ First occurence of span
+ Second occurence of span
+
+
+
diff --git a/node_modules/gulp-inject-string/tests/expected/replace.html b/node_modules/gulp-inject-string/tests/expected/replace.html
new file mode 100644
index 0000000..8a6d9c3
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/expected/replace.html
@@ -0,0 +1,13 @@
+
+
+
+ Test file
+
+
+ Test file
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ First occurence of span
+ Second occurence of span
+
+
+
diff --git a/node_modules/gulp-inject-string/tests/expected/replace2.html b/node_modules/gulp-inject-string/tests/expected/replace2.html
new file mode 100644
index 0000000..ba20179
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/expected/replace2.html
@@ -0,0 +1,13 @@
+
+
+
+ New title
+
+
+ New title
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ First occurence of span
+ Second occurence of span
+
+
+
diff --git a/node_modules/gulp-inject-string/tests/fixtures/index.html b/node_modules/gulp-inject-string/tests/fixtures/index.html
new file mode 100644
index 0000000..ffa4fe5
--- /dev/null
+++ b/node_modules/gulp-inject-string/tests/fixtures/index.html
@@ -0,0 +1,13 @@
+
+
+
+ Test file
+
+
+ Test file
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti, consequuntur.
+ First occurence of span
+ Second occurence of span
+
+
+
diff --git a/node_modules/has-symbol-support-x/badges.html b/node_modules/has-symbol-support-x/badges.html
new file mode 100644
index 0000000..a3b8352
--- /dev/null
+++ b/node_modules/has-symbol-support-x/badges.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/has-symbol-support-x/tests/index.html b/node_modules/has-symbol-support-x/tests/index.html
new file mode 100644
index 0000000..9c027d4
--- /dev/null
+++ b/node_modules/has-symbol-support-x/tests/index.html
@@ -0,0 +1,34 @@
+
+
+
+
+ Jasmine Spec Runner: has-symbol-support-x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/has-to-string-tag-x/badges.html b/node_modules/has-to-string-tag-x/badges.html
new file mode 100644
index 0000000..a3b8352
--- /dev/null
+++ b/node_modules/has-to-string-tag-x/badges.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/jsbn/example.html b/node_modules/jsbn/example.html
new file mode 100644
index 0000000..7c26a56
--- /dev/null
+++ b/node_modules/jsbn/example.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/serve-index/public/directory.html b/node_modules/serve-index/public/directory.html
new file mode 100644
index 0000000..6f7e7b6
--- /dev/null
+++ b/node_modules/serve-index/public/directory.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+ listing directory {directory}
+
+
+
+
+
+
+
~ {linked-path}
+ {files}
+
+
+
\ No newline at end of file
diff --git a/node_modules/sprintf-js/demo/angular.html b/node_modules/sprintf-js/demo/angular.html
new file mode 100644
index 0000000..3559efd
--- /dev/null
+++ b/node_modules/sprintf-js/demo/angular.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+ {{ "%+010d"|sprintf:-123 }}
+ {{ "%+010d"|vsprintf:[-123] }}
+ {{ "%+010d"|fmt:-123 }}
+ {{ "%+010d"|vfmt:[-123] }}
+ {{ "I've got %2$d apples and %1$d oranges."|fmt:4:2 }}
+ {{ "I've got %(apples)d apples and %(oranges)d oranges."|fmt:{apples: 2, oranges: 4} }}
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/index.html b/node_modules/tar/coverage/lcov-report/index.html
new file mode 100644
index 0000000..2722480
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/index.html
@@ -0,0 +1,106 @@
+
+
+
+ Code coverage report for All files
+
+
+
+
+
+
+
+
+
+
+ All files
+
+
+
+ 99.94%
+ Statements
+ 1795/1796
+
+
+ 99.67%
+ Branches
+ 1224/1228
+
+
+ 100%
+ Functions
+ 271/271
+
+
+ 99.94%
+ Lines
+ 1748/1749
+
+
+
+
+
+
+
+
+ File
+
+ Statements
+
+ Branches
+
+ Functions
+
+ Lines
+
+
+
+
+ tar
+
+ 100%
+ 13/13
+ 100%
+ 0/0
+ 100%
+ 0/0
+ 100%
+ 13/13
+
+
+
+ tar/lib
+
+ 99.94%
+ 1782/1783
+ 99.67%
+ 1224/1228
+ 100%
+ 271/271
+ 99.94%
+ 1735/1736
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/index.html b/node_modules/tar/coverage/lcov-report/tar/index.html
new file mode 100644
index 0000000..9c917bd
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/index.html
@@ -0,0 +1,93 @@
+
+
+
+ Code coverage report for tar
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 13/13
+
+
+ 100%
+ Branches
+ 0/0
+
+
+ 100%
+ Functions
+ 0/0
+
+
+ 100%
+ Lines
+ 13/13
+
+
+
+
+
+
+
+
+ File
+
+ Statements
+
+ Branches
+
+ Functions
+
+ Lines
+
+
+
+
+ index.js
+
+ 100%
+ 13/13
+ 100%
+ 0/0
+ 100%
+ 0/0
+ 100%
+ 13/13
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/index.js.html b/node_modules/tar/coverage/lcov-report/tar/index.js.html
new file mode 100644
index 0000000..f04c992
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/index.js.html
@@ -0,0 +1,119 @@
+
+
+
+ Code coverage report for tar/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 13/13
+
+
+ 100%
+ Branches
+ 0/0
+
+
+ 100%
+ Functions
+ 0/0
+
+
+ 100%
+ Lines
+ 13/13
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+
+
+1x
+1x
+1x
+1x
+1x
+
+
+1x
+1x
+1x
+1x
+1x
+1x
+1x
+1x
+ 'use strict'
+
+// high-level commands
+exports.c = exports.create = require('./lib/create.js')
+exports.r = exports.replace = require('./lib/replace.js')
+exports.t = exports.list = require('./lib/list.js')
+exports.u = exports.update = require('./lib/update.js')
+exports.x = exports.extract = require('./lib/extract.js')
+
+// classes
+exports.Pack = require('./lib/pack.js')
+exports.Unpack = require('./lib/unpack.js')
+exports.Parse = require('./lib/parse.js')
+exports.ReadEntry = require('./lib/read-entry.js')
+exports.WriteEntry = require('./lib/write-entry.js')
+exports.Header = require('./lib/header.js')
+exports.Pax = require('./lib/pax.js')
+exports.types = require('./lib/types.js')
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/create.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/create.js.html
new file mode 100644
index 0000000..2f01c7e
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/create.js.html
@@ -0,0 +1,380 @@
+
+
+
+ Code coverage report for tar/lib/create.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 59/59
+
+
+ 100%
+ Branches
+ 35/35
+
+
+ 100%
+ Functions
+ 12/12
+
+
+ 100%
+ Lines
+ 59/59
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+
+
+2x
+
+2x
+2x
+2x
+2x
+2x
+
+2x
+15x
+1x
+
+15x
+1x
+
+15x
+2x
+
+13x
+
+13x
+
+13x
+1x
+
+12x
+1x
+
+11x
+
+
+
+
+
+2x
+4x
+4x
+
+
+4x
+4x
+
+
+2x
+4x
+4x
+
+
+4x
+
+4x
+4x
+4x
+4x
+
+
+4x
+
+4x
+
+
+2x
+5x
+7x
+3x
+
+
+
+7x
+
+
+4x
+
+4x
+
+
+2x
+9x
+8x
+8x
+3x
+
+
+7x
+3x
+
+5x
+
+6x
+
+
+2x
+1x
+1x
+1x
+
+
+2x
+2x
+2x
+2x
+
+ 'use strict'
+
+// tar -c
+const hlo = require('./high-level-opt.js')
+
+const Pack = require('./pack.js')
+const fs = require('fs')
+const fsm = require('fs-minipass')
+const t = require('./list.js')
+const path = require('path')
+
+const c = module.exports = (opt_, files, cb) => {
+ if (typeof files === 'function')
+ cb = files
+
+ if (Array.isArray(opt_))
+ files = opt_, opt_ = {}
+
+ if (!files || !Array.isArray(files) || !files.length)
+ throw new TypeError('no files or directories specified')
+
+ files = Array.from(files)
+
+ const opt = hlo(opt_)
+
+ if (opt.sync && typeof cb === 'function')
+ throw new TypeError('callback not supported for sync tar functions')
+
+ if (!opt.file && typeof cb === 'function')
+ throw new TypeError('callback only supported with file option')
+
+ return opt.file && opt.sync ? createFileSync(opt, files)
+ : opt.file ? createFile(opt, files, cb)
+ : opt.sync ? createSync(opt, files)
+ : create(opt, files)
+}
+
+const createFileSync = (opt, files) => {
+ const p = new Pack.Sync(opt)
+ const stream = new fsm.WriteStreamSync(opt.file, {
+ mode: opt.mode || 0o666
+ })
+ p.pipe(stream)
+ addFilesSync(p, files)
+}
+
+const createFile = (opt, files, cb) => {
+ const p = new Pack(opt)
+ const stream = new fsm.WriteStream(opt.file, {
+ mode: opt.mode || 0o666
+ })
+ p.pipe(stream)
+
+ const promise = new Promise((res, rej) => {
+ stream.on('error', rej)
+ stream.on('close', res)
+ p.on('error', rej)
+ })
+
+ addFilesAsync(p, files)
+
+ return cb ? promise.then(cb, cb) : promise
+}
+
+const addFilesSync = (p, files) => {
+ files.forEach(file => {
+ if (file.charAt(0) === '@')
+ t({
+ file: path.resolve(p.cwd, file.substr(1)),
+ sync: true,
+ noResume: true,
+ onentry: entry => p.add(entry)
+ })
+ else
+ p.add(file)
+ })
+ p.end()
+}
+
+const addFilesAsync = (p, files) => {
+ while (files.length) {
+ const file = files.shift()
+ if (file.charAt(0) === '@')
+ return t({
+ file: path.resolve(p.cwd, file.substr(1)),
+ noResume: true,
+ onentry: entry => p.add(entry)
+ }).then(_ => addFilesAsync(p, files))
+ else
+ p.add(file)
+ }
+ p.end()
+}
+
+const createSync = (opt, files) => {
+ const p = new Pack.Sync(opt)
+ addFilesSync(p, files)
+ return p
+}
+
+const create = (opt, files) => {
+ const p = new Pack(opt)
+ addFilesAsync(p, files)
+ return p
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/extract.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/extract.js.html
new file mode 100644
index 0000000..96245c7
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/extract.js.html
@@ -0,0 +1,401 @@
+
+
+
+ Code coverage report for tar/lib/extract.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 61/61
+
+
+ 100%
+ Branches
+ 45/45
+
+
+ 100%
+ Functions
+ 12/12
+
+
+ 100%
+ Lines
+ 60/60
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+
+
+2x
+2x
+2x
+2x
+2x
+
+2x
+21x
+1x
+20x
+1x
+
+21x
+3x
+
+21x
+13x
+
+8x
+
+21x
+
+21x
+2x
+
+19x
+1x
+
+18x
+7x
+
+18x
+
+
+
+
+
+
+
+2x
+13x
+7x
+
+7x
+87x
+87x
+
+
+
+87x
+87x
+
+
+7x
+9x
+9x
+
+
+2x
+6x
+
+6x
+6x
+
+6x
+
+
+5x
+5x
+
+
+
+4x
+
+
+2x
+9x
+9x
+
+9x
+9x
+9x
+9x
+
+
+
+9x
+9x
+1x
+
+8x
+
+
+
+8x
+8x
+
+
+
+9x
+
+
+2x
+1x
+
+
+2x
+2x
+
+ 'use strict'
+
+// tar -x
+const hlo = require('./high-level-opt.js')
+const Unpack = require('./unpack.js')
+const fs = require('fs')
+const fsm = require('fs-minipass')
+const path = require('path')
+
+const x = module.exports = (opt_, files, cb) => {
+ if (typeof opt_ === 'function')
+ cb = opt_, files = null, opt_ = {}
+ else if (Array.isArray(opt_))
+ files = opt_, opt_ = {}
+
+ if (typeof files === 'function')
+ cb = files, files = null
+
+ if (!files)
+ files = []
+ else
+ files = Array.from(files)
+
+ const opt = hlo(opt_)
+
+ if (opt.sync && typeof cb === 'function')
+ throw new TypeError('callback not supported for sync tar functions')
+
+ if (!opt.file && typeof cb === 'function')
+ throw new TypeError('callback only supported with file option')
+
+ if (files.length)
+ filesFilter(opt, files)
+
+ return opt.file && opt.sync ? extractFileSync(opt)
+ : opt.file ? extractFile(opt, cb)
+ : opt.sync ? extractSync(opt)
+ : extract(opt)
+}
+
+// construct a filter that limits the file entries listed
+// include child entries if a dir is included
+const filesFilter = (opt, files) => {
+ const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true]))
+ const filter = opt.filter
+
+ const mapHas = (file, r) => {
+ const root = r || path.parse(file).root || '.'
+ const ret = file === root ? false
+ : map.has(file) ? map.get(file)
+ : mapHas(path.dirname(file), root)
+
+ map.set(file, ret)
+ return ret
+ }
+
+ opt.filter = filter
+ ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, ''))
+ : file => mapHas(file.replace(/\/+$/, ''))
+}
+
+const extractFileSync = opt => {
+ const u = new Unpack.Sync(opt)
+
+ const file = opt.file
+ let threw = true
+ let fd
+ const stat = fs.statSync(file)
+ // This trades a zero-byte read() syscall for a stat
+ // However, it will usually result in less memory allocation
+ const readSize = opt.maxReadSize || 16*1024*1024
+ const stream = new fsm.ReadStreamSync(file, {
+ readSize: readSize,
+ size: stat.size
+ })
+ stream.pipe(u)
+}
+
+const extractFile = (opt, cb) => {
+ const u = new Unpack(opt)
+ const readSize = opt.maxReadSize || 16*1024*1024
+
+ const file = opt.file
+ const p = new Promise((resolve, reject) => {
+ u.on('error', reject)
+ u.on('close', resolve)
+
+ // This trades a zero-byte read() syscall for a stat
+ // However, it will usually result in less memory allocation
+ fs.stat(file, (er, stat) => {
+ if (er)
+ reject(er)
+ else {
+ const stream = new fsm.ReadStream(file, {
+ readSize: readSize,
+ size: stat.size
+ })
+ stream.on('error', reject)
+ stream.pipe(u)
+ }
+ })
+ })
+ return cb ? p.then(cb, cb) : p
+}
+
+const extractSync = opt => {
+ return new Unpack.Sync(opt)
+}
+
+const extract = opt => {
+ return new Unpack(opt)
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/header.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/header.js.html
new file mode 100644
index 0000000..69770d0
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/header.js.html
@@ -0,0 +1,881 @@
+
+
+
+ Code coverage report for tar/lib/header.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 161/161
+
+
+ 100%
+ Branches
+ 120/120
+
+
+ 100%
+ Functions
+ 20/20
+
+
+ 100%
+ Lines
+ 159/159
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+
+
+
+
+
+13x
+13x
+13x
+
+13x
+
+
+
+13121x
+13121x
+13121x
+
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+13121x
+
+13121x
+6393x
+6728x
+6726x
+
+
+
+6393x
+2795x
+
+6393x
+1x
+
+6392x
+6392x
+6392x
+6392x
+6392x
+6392x
+6392x
+
+
+6392x
+6392x
+1990x
+6392x
+2x
+
+
+
+
+
+
+6392x
+1594x
+
+6392x
+6392x
+4275x
+4275x
+4275x
+4275x
+4275x
+
+2x
+2x
+
+4273x
+4273x
+295x
+4273x
+4273x
+
+
+
+6392x
+6392x
+946016x
+
+6392x
+2275552x
+
+6392x
+6392x
+1860x
+
+
+
+6719x
+6600x
+6600x
+
+
+6719x
+6717x
+
+6719x
+1x
+
+6718x
+6718x
+6718x
+6718x
+6718x
+
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+6718x
+2x
+
+6716x
+6716x
+6716x
+
+
+6718x
+6718x
+994264x
+
+6718x
+2391608x
+
+6718x
+6718x
+6718x
+
+6718x
+
+
+
+6728x
+73451x
+66740x
+
+
+
+
+8178x
+
+
+
+4x
+
+
+
+6723x
+6719x
+
+4x
+
+
+
+13x
+6718x
+6718x
+6718x
+
+6718x
+
+6718x
+6683x
+
+
+35x
+35x
+
+35x
+
+49x
+
+21x
+
+
+28x
+
+13x
+
+
+
+15x
+15x
+
+
+
+
+35x
+1x
+
+6718x
+
+
+13x
+32001x
+
+13x
+14938x
+
+14938x
+
+13x
+55448x
+
+
+55411x
+
+13x
+55411x
+
+
+
+
+13x
+
+
+
+
+13x
+66910x
+
+
+
+
+13x
+66615x
+
+13x
+66615x
+
+13x
+66615x
+
+
+13x
+20150x
+
+
+
+13x
+
+13x
+40308x
+
+
+
+13x
+ 'use strict'
+// parse a 512-byte header block to a data object, or vice-versa
+// encode returns `true` if a pax extended header is needed, because
+// the data could not be faithfully encoded in a simple header.
+// (Also, check header.needPax to see if it needs a pax header.)
+
+const types = require('./types.js')
+const pathModule = require('path')
+const large = require('./large-numbers.js')
+
+const TYPE = Symbol('type')
+
+class Header {
+ constructor (data, off) {
+ this.cksumValid = false
+ this.needPax = false
+ this.nullBlock = false
+
+ this.block = null
+ this.path = null
+ this.mode = null
+ this.uid = null
+ this.gid = null
+ this.size = null
+ this.mtime = null
+ this.cksum = null
+ this[TYPE] = '0'
+ this.linkpath = null
+ this.uname = null
+ this.gname = null
+ this.devmaj = 0
+ this.devmin = 0
+ this.atime = null
+ this.ctime = null
+
+ if (Buffer.isBuffer(data)) {
+ this.decode(data, off || 0)
+ } else if (data)
+ this.set(data)
+ }
+
+ decode (buf, off) {
+ if (!off)
+ off = 0
+
+ if (!buf || !(buf.length >= off + 512))
+ throw new Error('need 512 bytes for header')
+
+ this.path = decString(buf, off, 100)
+ this.mode = decNumber(buf, off + 100, 8)
+ this.uid = decNumber(buf, off + 108, 8)
+ this.gid = decNumber(buf, off + 116, 8)
+ this.size = decNumber(buf, off + 124, 12)
+ this.mtime = decDate(buf, off + 136, 12)
+ this.cksum = decNumber(buf, off + 148, 12)
+
+ // old tar versions marked dirs as a file with a trailing /
+ this[TYPE] = decString(buf, off + 156, 1)
+ if (this[TYPE] === '')
+ this[TYPE] = '0'
+ if (this[TYPE] === '0' && this.path.substr(-1) === '/')
+ this[TYPE] = '5'
+
+ // tar implementations sometimes incorrectly put the stat(dir).size
+ // as the size in the tarball, even though Directory entries are
+ // not able to have any body at all. In the very rare chance that
+ // it actually DOES have a body, we weren't going to do anything with
+ // it anyway, and it'll just be a warning about an invalid header.
+ if (this[TYPE] === '5')
+ this.size = 0
+
+ this.linkpath = decString(buf, off + 157, 100)
+ if (buf.slice(off + 257, off + 265).toString() === 'ustar\u000000') {
+ this.uname = decString(buf, off + 265, 32)
+ this.gname = decString(buf, off + 297, 32)
+ this.devmaj = decNumber(buf, off + 329, 8)
+ this.devmin = decNumber(buf, off + 337, 8)
+ if (buf[off + 475] !== 0) {
+ // definitely a prefix, definitely >130 chars.
+ const prefix = decString(buf, off + 345, 155)
+ this.path = prefix + '/' + this.path
+ } else {
+ const prefix = decString(buf, off + 345, 130)
+ if (prefix)
+ this.path = prefix + '/' + this.path
+ this.atime = decDate(buf, off + 476, 12)
+ this.ctime = decDate(buf, off + 488, 12)
+ }
+ }
+
+ let sum = 8 * 0x20
+ for (let i = off; i < off + 148; i++) {
+ sum += buf[i]
+ }
+ for (let i = off + 156; i < off + 512; i++) {
+ sum += buf[i]
+ }
+ this.cksumValid = sum === this.cksum
+ if (this.cksum === null && sum === 8 * 0x20)
+ this.nullBlock = true
+ }
+
+ encode (buf, off) {
+ if (!buf) {
+ buf = this.block = Buffer.alloc(512)
+ off = 0
+ }
+
+ if (!off)
+ off = 0
+
+ if (!(buf.length >= off + 512))
+ throw new Error('need 512 bytes for header')
+
+ const prefixSize = this.ctime || this.atime ? 130 : 155
+ const split = splitPrefix(this.path || '', prefixSize)
+ const path = split[0]
+ const prefix = split[1]
+ this.needPax = split[2]
+
+ this.needPax = encString(buf, off, 100, path) || this.needPax
+ this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax
+ this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax
+ this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax
+ this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax
+ this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax
+ buf[off + 156] = this[TYPE].charCodeAt(0)
+ this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax
+ buf.write('ustar\u000000', off + 257, 8)
+ this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax
+ this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax
+ this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax
+ this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax
+ this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax
+ if (buf[off + 475] !== 0)
+ this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax
+ else {
+ this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax
+ this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax
+ this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax
+ }
+
+ let sum = 8 * 0x20
+ for (let i = off; i < off + 148; i++) {
+ sum += buf[i]
+ }
+ for (let i = off + 156; i < off + 512; i++) {
+ sum += buf[i]
+ }
+ this.cksum = sum
+ encNumber(buf, off + 148, 8, this.cksum)
+ this.cksumValid = true
+
+ return this.needPax
+ }
+
+ set (data) {
+ for (let i in data) {
+ if (data[i] !== null && data[i] !== undefined)
+ this[i] = data[i]
+ }
+ }
+
+ get type () {
+ return types.name.get(this[TYPE]) || this[TYPE]
+ }
+
+ get typeKey () {
+ return this[TYPE]
+ }
+
+ set type (type) {
+ if (types.code.has(type))
+ this[TYPE] = types.code.get(type)
+ else
+ this[TYPE] = type
+ }
+}
+
+const splitPrefix = (p, prefixSize) => {
+ const pathSize = 100
+ let pp = p
+ let prefix = ''
+ let ret
+ const root = pathModule.parse(p).root || '.'
+
+ if (Buffer.byteLength(pp) < pathSize)
+ ret = [pp, prefix, false]
+ else {
+ // first set prefix to the dir, and path to the base
+ prefix = pathModule.dirname(pp)
+ pp = pathModule.basename(pp)
+
+ do {
+ // both fit!
+ if (Buffer.byteLength(pp) <= pathSize &&
+ Buffer.byteLength(prefix) <= prefixSize)
+ ret = [pp, prefix, false]
+
+ // prefix fits in prefix, but path doesn't fit in path
+ else if (Buffer.byteLength(pp) > pathSize &&
+ Buffer.byteLength(prefix) <= prefixSize)
+ ret = [pp.substr(0, pathSize - 1), prefix, true]
+
+ else {
+ // make path take a bit from prefix
+ pp = pathModule.join(pathModule.basename(prefix), pp)
+ prefix = pathModule.dirname(prefix)
+ }
+ } while (prefix !== root && !ret)
+
+ // at this point, found no resolution, just truncate
+ if (!ret)
+ ret = [p.substr(0, pathSize - 1), '', true]
+ }
+ return ret
+}
+
+const decString = (buf, off, size) =>
+ buf.slice(off, off + size).toString('utf8').replace(/\0.*/, '')
+
+const decDate = (buf, off, size) =>
+ numToDate(decNumber(buf, off, size))
+
+const numToDate = num => num === null ? null : new Date(num * 1000)
+
+const decNumber = (buf, off, size) =>
+ buf[off] & 0x80 ? large.parse(buf.slice(off, off + size))
+ : decSmallNumber(buf, off, size)
+
+const nanNull = value => isNaN(value) ? null : value
+
+const decSmallNumber = (buf, off, size) =>
+ nanNull(parseInt(
+ buf.slice(off, off + size)
+ .toString('utf8').replace(/\0.*$/, '').trim(), 8))
+
+// the maximum encodable as a null-terminated octal, by field size
+const MAXNUM = {
+ 12: 0o77777777777,
+ 8 : 0o7777777
+}
+
+const encNumber = (buf, off, size, number) =>
+ number === null ? false :
+ number > MAXNUM[size] || number < 0
+ ? (large.encode(number, buf.slice(off, off + size)), true)
+ : (encSmallNumber(buf, off, size, number), false)
+
+const encSmallNumber = (buf, off, size, number) =>
+ buf.write(octalString(number, size), off, size, 'ascii')
+
+const octalString = (number, size) =>
+ padOctal(Math.floor(number).toString(8), size)
+
+const padOctal = (string, size) =>
+ (string.length === size - 1 ? string
+ : new Array(size - string.length - 1).join('0') + string + ' ') + '\0'
+
+const encDate = (buf, off, size, date) =>
+ date === null ? false :
+ encNumber(buf, off, size, date.getTime() / 1000)
+
+// enough to fill the longest string we've got
+const NULLS = new Array(156).join('\0')
+// pad with nulls, return true if it's longer or non-ascii
+const encString = (buf, off, size, string) =>
+ string === null ? false :
+ (buf.write(string + NULLS, off, size, 'utf8'),
+ string.length !== Buffer.byteLength(string) || string.length > size)
+
+module.exports = Header
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/high-level-opt.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/high-level-opt.js.html
new file mode 100644
index 0000000..0a59596
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/high-level-opt.js.html
@@ -0,0 +1,152 @@
+
+
+
+ Code coverage report for tar/lib/high-level-opt.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 5/5
+
+
+ 100%
+ Branches
+ 4/4
+
+
+ 100%
+ Functions
+ 3/3
+
+
+ 100%
+ Lines
+ 3/3
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+
+
+
+7x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+469x
+
+469x
+ 'use strict'
+
+// turn tar(1) style args like `C` into the more verbose things like `cwd`
+
+const argmap = new Map([
+ ['C', 'cwd'],
+ ['f', 'file'],
+ ['z', 'gzip'],
+ ['P', 'preservePaths'],
+ ['U', 'unlink'],
+ ['strip-components', 'strip'],
+ ['stripComponents', 'strip'],
+ ['keep-newer', 'newer'],
+ ['keepNewer', 'newer'],
+ ['keep-newer-files', 'newer'],
+ ['keepNewerFiles', 'newer'],
+ ['k', 'keep'],
+ ['keep-existing', 'keep'],
+ ['keepExisting', 'keep'],
+ ['m', 'noMtime'],
+ ['no-mtime', 'noMtime'],
+ ['p', 'preserveOwner'],
+ ['L', 'follow'],
+ ['h', 'follow']
+])
+
+const parse = module.exports = opt => opt ? Object.keys(opt).map(k => [
+ argmap.has(k) ? argmap.get(k) : k, opt[k]
+]).reduce((set, kv) => (set[kv[0]] = kv[1], set), Object.create(null)) : {}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/index.html b/node_modules/tar/coverage/lcov-report/tar/lib/index.html
new file mode 100644
index 0000000..1f908d1
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/index.html
@@ -0,0 +1,314 @@
+
+
+
+ Code coverage report for tar/lib
+
+
+
+
+
+
+
+
+
+
+
+
+ 99.94%
+ Statements
+ 1782/1783
+
+
+ 99.67%
+ Branches
+ 1224/1228
+
+
+ 100%
+ Functions
+ 271/271
+
+
+ 99.94%
+ Lines
+ 1735/1736
+
+
+
+
+
+
+
+
+ File
+
+ Statements
+
+ Branches
+
+ Functions
+
+ Lines
+
+
+
+
+ create.js
+
+ 100%
+ 59/59
+ 100%
+ 35/35
+ 100%
+ 12/12
+ 100%
+ 59/59
+
+
+
+ extract.js
+
+ 100%
+ 61/61
+ 100%
+ 45/45
+ 100%
+ 12/12
+ 100%
+ 60/60
+
+
+
+ header.js
+
+ 100%
+ 161/161
+ 100%
+ 120/120
+ 100%
+ 20/20
+ 100%
+ 159/159
+
+
+
+ high-level-opt.js
+
+ 100%
+ 5/5
+ 100%
+ 4/4
+ 100%
+ 3/3
+ 100%
+ 3/3
+
+
+
+ large-numbers.js
+
+ 100%
+ 59/59
+ 100%
+ 20/20
+ 100%
+ 8/8
+ 100%
+ 57/57
+
+
+
+ list.js
+
+ 100%
+ 80/80
+ 100%
+ 53/53
+ 100%
+ 14/14
+ 100%
+ 77/77
+
+
+
+ mkdir.js
+
+ 100%
+ 130/130
+ 100%
+ 91/91
+ 100%
+ 15/15
+ 100%
+ 128/128
+
+
+
+ pack.js
+
+ 100%
+ 228/228
+ 100%
+ 123/123
+ 100%
+ 44/44
+ 100%
+ 222/222
+
+
+
+ parse.js
+
+ 100%
+ 242/242
+ 100%
+ 155/155
+ 100%
+ 24/24
+ 100%
+ 236/236
+
+
+
+ pax.js
+
+ 100%
+ 62/62
+ 100%
+ 75/75
+ 100%
+ 9/9
+ 100%
+ 60/60
+
+
+
+ read-entry.js
+
+ 100%
+ 53/53
+ 100%
+ 36/36
+ 100%
+ 3/3
+ 100%
+ 51/51
+
+
+
+ replace.js
+
+ 100%
+ 131/131
+ 100%
+ 70/70
+ 100%
+ 18/18
+ 100%
+ 128/128
+
+
+
+ types.js
+
+ 100%
+ 3/3
+ 100%
+ 0/0
+ 100%
+ 1/1
+ 100%
+ 2/2
+
+
+
+ unpack.js
+
+ 100%
+ 254/254
+ 100%
+ 194/194
+ 100%
+ 44/44
+ 100%
+ 247/247
+
+
+
+ update.js
+
+ 100%
+ 20/20
+ 100%
+ 15/15
+ 100%
+ 4/4
+ 100%
+ 20/20
+
+
+
+ warn-mixin.js
+
+ 100%
+ 9/9
+ 100%
+ 4/4
+ 100%
+ 2/2
+ 100%
+ 8/8
+
+
+
+ winchars.js
+
+ 100%
+ 12/12
+ 100%
+ 0/0
+ 100%
+ 7/7
+ 100%
+ 8/8
+
+
+
+ write-entry.js
+
+ 99.53%
+ 213/214
+ 97.87%
+ 184/188
+ 100%
+ 31/31
+ 99.53%
+ 210/211
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/large-numbers.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/large-numbers.js.html
new file mode 100644
index 0000000..5b8610f
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/large-numbers.js.html
@@ -0,0 +1,341 @@
+
+
+
+ Code coverage report for tar/lib/large-numbers.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 59/59
+
+
+ 100%
+ Branches
+ 20/20
+
+
+ 100%
+ Functions
+ 8/8
+
+
+ 100%
+ Lines
+ 57/57
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+
+
+
+
+
+14x
+17x
+17x
+6x
+
+11x
+17x
+
+
+14x
+11x
+11x
+86x
+31x
+
+55x
+55x
+
+
+
+
+14x
+6x
+6x
+6x
+6x
+
+60x
+42x
+
+18x
+18x
+
+60x
+48x
+12x
+6x
+
+6x
+6x
+
+
+
+
+14x
+47x
+47x
+47x
+
+
+
+14x
+6x
+6x
+6x
+6x
+60x
+
+60x
+48x
+12x
+6x
+
+6x
+6x
+
+60x
+12x
+
+6x
+
+
+14x
+41x
+41x
+41x
+266x
+266x
+161x
+
+41x
+
+
+96x
+
+14x
+ 'use strict'
+// Tar can encode large and negative numbers using a leading byte of
+// 0xff for negative, and 0x80 for positive. The trailing byte in the
+// section will always be 0x20, or in some implementations 0x00.
+// this module encodes and decodes these things.
+
+const encode = exports.encode = (num, buf) => {
+ buf[buf.length - 1] = 0x20
+ if (num < 0)
+ encodeNegative(num, buf)
+ else
+ encodePositive(num, buf)
+ return buf
+}
+
+const encodePositive = (num, buf) => {
+ buf[0] = 0x80
+ for (var i = buf.length - 2; i > 0; i--) {
+ if (num === 0)
+ buf[i] = 0
+ else {
+ buf[i] = num % 0x100
+ num = Math.floor(num / 0x100)
+ }
+ }
+}
+
+const encodeNegative = (num, buf) => {
+ buf[0] = 0xff
+ var flipped = false
+ num = num * -1
+ for (var i = buf.length - 2; i > 0; i--) {
+ var byte
+ if (num === 0)
+ byte = 0
+ else {
+ byte = num % 0x100
+ num = Math.floor(num / 0x100)
+ }
+ if (flipped)
+ buf[i] = onesComp(byte)
+ else if (byte === 0)
+ buf[i] = 0
+ else {
+ flipped = true
+ buf[i] = twosComp(byte)
+ }
+ }
+}
+
+const parse = exports.parse = (buf) => {
+ var post = buf[buf.length - 1]
+ var pre = buf[0]
+ return pre === 0x80 ? pos(buf.slice(1, buf.length - 1))
+ : twos(buf.slice(1, buf.length - 1))
+}
+
+const twos = (buf) => {
+ var len = buf.length
+ var sum = 0
+ var flipped = false
+ for (var i = len - 1; i > -1; i--) {
+ var byte = buf[i]
+ var f
+ if (flipped)
+ f = onesComp(byte)
+ else if (byte === 0)
+ f = byte
+ else {
+ flipped = true
+ f = twosComp(byte)
+ }
+ if (f !== 0)
+ sum += f * Math.pow(256, len - i - 1)
+ }
+ return sum * -1
+}
+
+const pos = (buf) => {
+ var len = buf.length
+ var sum = 0
+ for (var i = len - 1; i > -1; i--) {
+ var byte = buf[i]
+ if (byte !== 0)
+ sum += byte * Math.pow(256, len - i - 1)
+ }
+ return sum
+}
+
+const onesComp = byte => (0xff ^ byte) & 0xff
+
+const twosComp = byte => ((0xff ^ byte) + 1) & 0xff
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/list.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/list.js.html
new file mode 100644
index 0000000..4e6e34e
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/list.js.html
@@ -0,0 +1,449 @@
+
+
+
+ Code coverage report for tar/lib/list.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 80/80
+
+
+ 100%
+ Branches
+ 53/53
+
+
+ 100%
+ Functions
+ 14/14
+
+
+ 100%
+ Lines
+ 77/77
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+
+
+
+
+
+5x
+5x
+5x
+5x
+5x
+
+5x
+34x
+1x
+33x
+1x
+
+34x
+5x
+
+34x
+31x
+
+3x
+
+34x
+
+34x
+1x
+
+33x
+1x
+
+32x
+3x
+
+32x
+22x
+
+32x
+
+
+
+
+5x
+22x
+22x
+255x
+255x
+72x
+
+
+
+
+5x
+6x
+3x
+
+3x
+125x
+125x
+
+
+
+125x
+125x
+
+
+3x
+32x
+64x
+
+
+5x
+13x
+13x
+13x
+
+13x
+13x
+12x
+12x
+10x
+
+2x
+2x
+2x
+2x
+28x
+27x
+27x
+
+1x
+
+11x
+
+13x
+1x
+
+
+
+5x
+16x
+16x
+
+16x
+16x
+16x
+16x
+
+16x
+16x
+2x
+
+14x
+
+
+
+14x
+14x
+
+
+
+16x
+
+
+16x
+ 'use strict'
+
+// XXX: This shares a lot in common with extract.js
+// maybe some DRY opportunity here?
+
+// tar -t
+const hlo = require('./high-level-opt.js')
+const Parser = require('./parse.js')
+const fs = require('fs')
+const fsm = require('fs-minipass')
+const path = require('path')
+
+const t = module.exports = (opt_, files, cb) => {
+ if (typeof opt_ === 'function')
+ cb = opt_, files = null, opt_ = {}
+ else if (Array.isArray(opt_))
+ files = opt_, opt_ = {}
+
+ if (typeof files === 'function')
+ cb = files, files = null
+
+ if (!files)
+ files = []
+ else
+ files = Array.from(files)
+
+ const opt = hlo(opt_)
+
+ if (opt.sync && typeof cb === 'function')
+ throw new TypeError('callback not supported for sync tar functions')
+
+ if (!opt.file && typeof cb === 'function')
+ throw new TypeError('callback only supported with file option')
+
+ if (files.length)
+ filesFilter(opt, files)
+
+ if (!opt.noResume)
+ onentryFunction(opt)
+
+ return opt.file && opt.sync ? listFileSync(opt)
+ : opt.file ? listFile(opt, cb)
+ : list(opt)
+}
+
+const onentryFunction = opt => {
+ const onentry = opt.onentry
+ opt.onentry = onentry ? e => {
+ onentry(e)
+ e.resume()
+ } : e => e.resume()
+}
+
+// construct a filter that limits the file entries listed
+// include child entries if a dir is included
+const filesFilter = (opt, files) => {
+ const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true]))
+ const filter = opt.filter
+
+ const mapHas = (file, r) => {
+ const root = r || path.parse(file).root || '.'
+ const ret = file === root ? false
+ : map.has(file) ? map.get(file)
+ : mapHas(path.dirname(file), root)
+
+ map.set(file, ret)
+ return ret
+ }
+
+ opt.filter = filter
+ ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, ''))
+ : file => mapHas(file.replace(/\/+$/, ''))
+}
+
+const listFileSync = opt => {
+ const p = list(opt)
+ const file = opt.file
+ let threw = true
+ let fd
+ try {
+ const stat = fs.statSync(file)
+ const readSize = opt.maxReadSize || 16*1024*1024
+ if (stat.size < readSize) {
+ p.end(fs.readFileSync(file))
+ } else {
+ let pos = 0
+ const buf = Buffer.allocUnsafe(readSize)
+ fd = fs.openSync(file, 'r')
+ while (pos < stat.size) {
+ let bytesRead = fs.readSync(fd, buf, 0, readSize, pos)
+ pos += bytesRead
+ p.write(buf.slice(0, bytesRead))
+ }
+ p.end()
+ }
+ threw = false
+ } finally {
+ if (threw && fd)
+ try { fs.closeSync(fd) } catch (er) {}
+ }
+}
+
+const listFile = (opt, cb) => {
+ const parse = new Parser(opt)
+ const readSize = opt.maxReadSize || 16*1024*1024
+
+ const file = opt.file
+ const p = new Promise((resolve, reject) => {
+ parse.on('error', reject)
+ parse.on('end', resolve)
+
+ fs.stat(file, (er, stat) => {
+ if (er)
+ reject(er)
+ else {
+ const stream = new fsm.ReadStream(file, {
+ readSize: readSize,
+ size: stat.size
+ })
+ stream.on('error', reject)
+ stream.pipe(parse)
+ }
+ })
+ })
+ return cb ? p.then(cb, cb) : p
+}
+
+const list = opt => new Parser(opt)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/mkdir.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/mkdir.js.html
new file mode 100644
index 0000000..afeb931
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/mkdir.js.html
@@ -0,0 +1,686 @@
+
+
+
+ Code coverage report for tar/lib/mkdir.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 130/130
+
+
+ 100%
+ Branches
+ 91/91
+
+
+ 100%
+ Functions
+ 15/15
+
+
+ 100%
+ Lines
+ 128/128
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+
+
+
+
+
+3x
+3x
+3x
+3x
+
+
+
+4x
+4x
+4x
+
+
+
+8x
+
+
+
+
+
+12x
+12x
+12x
+
+
+
+36x
+
+
+
+3x
+
+
+451x
+451x
+451x
+
+451x
+451x
+451x
+
+
+
+451x
+451x
+451x
+451x
+
+451x
+457x
+15x
+
+442x
+442x
+6x
+436x
+1x
+
+435x
+
+
+
+451x
+272x
+
+179x
+40x
+40x
+2x
+40x
+
+
+139x
+8x
+
+131x
+131x
+131x
+
+
+3x
+1062x
+119x
+943x
+943x
+943x
+723x
+220x
+
+
+222x
+222x
+36x
+
+4x
+
+32x
+32x
+4x
+28x
+22x
+6x
+3x
+3x
+1x
+2x
+
+3x
+2x
+
+1x
+
+
+186x
+186x
+
+
+
+3x
+
+
+276x
+276x
+276x
+
+276x
+276x
+276x
+
+
+
+276x
+276x
+276x
+276x
+
+276x
+266x
+266x
+6x
+266x
+1x
+266x
+
+
+276x
+128x
+
+148x
+34x
+34x
+34x
+34x
+
+1x
+
+34x
+2x
+
+32x
+32x
+
+
+114x
+7x
+
+107x
+107x
+107x
+107x
+
+
+
+792x
+608x
+
+184x
+184x
+169x
+169x
+
+15x
+
+4x
+
+11x
+9x
+4x
+4x
+5x
+2x
+2x
+2x
+2x
+2x
+3x
+2x
+
+
+
+99x
+
+ 'use strict'
+// wrapper around mkdirp for tar's needs.
+
+// TODO: This should probably be a class, not functionally
+// passing around state in a gazillion args.
+
+const mkdirp = require('mkdirp')
+const fs = require('fs')
+const path = require('path')
+const chownr = require('chownr')
+
+class SymlinkError extends Error {
+ constructor (symlink, path) {
+ super('Cannot extract through symbolic link')
+ this.path = path
+ this.symlink = symlink
+ }
+
+ get name () {
+ return 'SylinkError'
+ }
+}
+
+class CwdError extends Error {
+ constructor (path, code) {
+ super(code + ': Cannot cd into \'' + path + '\'')
+ this.path = path
+ this.code = code
+ }
+
+ get name () {
+ return 'CwdError'
+ }
+}
+
+const mkdir = module.exports = (dir, opt, cb) => {
+ // if there's any overlap between mask and mode,
+ // then we'll need an explicit chmod
+ const umask = opt.umask
+ const mode = opt.mode | 0o0700
+ const needChmod = (mode & umask) !== 0
+
+ const uid = opt.uid
+ const gid = opt.gid
+ const doChown = typeof uid === 'number' &&
+ typeof gid === 'number' &&
+ ( uid !== opt.processUid || gid !== opt.processGid )
+
+ const preserve = opt.preserve
+ const unlink = opt.unlink
+ const cache = opt.cache
+ const cwd = opt.cwd
+
+ const done = (er, created) => {
+ if (er)
+ cb(er)
+ else {
+ cache.set(dir, true)
+ if (created && doChown)
+ chownr(created, uid, gid, er => done(er))
+ else if (needChmod)
+ fs.chmod(dir, mode, cb)
+ else
+ cb()
+ }
+ }
+
+ if (cache && cache.get(dir) === true)
+ return done()
+
+ if (dir === cwd)
+ return fs.lstat(dir, (er, st) => {
+ if (er || !st.isDirectory())
+ er = new CwdError(dir, er && er.code || 'ENOTDIR')
+ done(er)
+ })
+
+ if (preserve)
+ return mkdirp(dir, mode, done)
+
+ const sub = path.relative(cwd, dir)
+ const parts = sub.split(/\/|\\/)
+ mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done)
+}
+
+const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => {
+ if (!parts.length)
+ return cb(null, created)
+ const p = parts.shift()
+ const part = base + '/' + p
+ if (cache.get(part))
+ return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
+ fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb))
+}
+
+const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => {
+ if (er) {
+ if (er.path && path.dirname(er.path) === cwd &&
+ (er.code === 'ENOTDIR' || er.code === 'ENOENT'))
+ return cb(new CwdError(cwd, er.code))
+
+ fs.lstat(part, (statEr, st) => {
+ if (statEr)
+ cb(statEr)
+ else if (st.isDirectory())
+ mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
+ else if (unlink)
+ fs.unlink(part, er => {
+ if (er)
+ return cb(er)
+ fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb))
+ })
+ else if (st.isSymbolicLink())
+ return cb(new SymlinkError(part, part + '/' + parts.join('/')))
+ else
+ cb(er)
+ })
+ } else {
+ created = created || part
+ mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
+ }
+}
+
+const mkdirSync = module.exports.sync = (dir, opt) => {
+ // if there's any overlap between mask and mode,
+ // then we'll need an explicit chmod
+ const umask = opt.umask
+ const mode = opt.mode | 0o0700
+ const needChmod = (mode & umask) !== 0
+
+ const uid = opt.uid
+ const gid = opt.gid
+ const doChown = typeof uid === 'number' &&
+ typeof gid === 'number' &&
+ ( uid !== opt.processUid || gid !== opt.processGid )
+
+ const preserve = opt.preserve
+ const unlink = opt.unlink
+ const cache = opt.cache
+ const cwd = opt.cwd
+
+ const done = (created) => {
+ cache.set(dir, true)
+ if (created && doChown)
+ chownr.sync(created, uid, gid)
+ if (needChmod)
+ fs.chmodSync(dir, mode)
+ cache.set(dir, true)
+ }
+
+ if (cache && cache.get(dir) === true)
+ return done()
+
+ if (dir === cwd) {
+ let ok = false
+ let code = 'ENOTDIR'
+ try {
+ ok = fs.lstatSync(dir).isDirectory()
+ } catch (er) {
+ code = er.code
+ } finally {
+ if (!ok)
+ throw new CwdError(dir, code)
+ }
+ done()
+ return
+ }
+
+ if (preserve)
+ return done(mkdirp.sync(dir, mode))
+
+ const sub = path.relative(cwd, dir)
+ const parts = sub.split(/\/|\\/)
+ let created = null
+ for (let p = parts.shift(), part = cwd;
+ p && (part += '/' + p);
+ p = parts.shift()) {
+
+ if (cache.get(part))
+ continue
+
+ try {
+ fs.mkdirSync(part, mode)
+ created = created || part
+ cache.set(part, true)
+ } catch (er) {
+ if (er.path && path.dirname(er.path) === cwd &&
+ (er.code === 'ENOTDIR' || er.code === 'ENOENT'))
+ return new CwdError(cwd, er.code)
+
+ const st = fs.lstatSync(part)
+ if (st.isDirectory()) {
+ cache.set(part, true)
+ continue
+ } else if (unlink) {
+ fs.unlinkSync(part)
+ fs.mkdirSync(part, mode)
+ created = created || part
+ cache.set(part, true)
+ continue
+ } else if (st.isSymbolicLink())
+ return new SymlinkError(part, part + '/' + parts.join('/'))
+ }
+ }
+
+ return done(created)
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/pack.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/pack.js.html
new file mode 100644
index 0000000..d46f96d
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/pack.js.html
@@ -0,0 +1,1268 @@
+
+
+
+ Code coverage report for tar/lib/pack.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 228/228
+
+
+ 100%
+ Branches
+ 123/123
+
+
+ 100%
+ Functions
+ 44/44
+
+
+ 100%
+ Lines
+ 222/222
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+
+
+
+
+
+
+
+
+
+
+
+
+6566x
+6566x
+6566x
+6566x
+6566x
+6566x
+6566x
+6566x
+
+
+
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+5x
+
+5x
+5x
+5x
+
+5x
+
+122x
+122x
+122x
+122x
+122x
+122x
+122x
+122x
+122x
+122x
+122x
+122x
+122x
+122x
+3x
+
+122x
+122x
+5x
+4x
+5x
+503x
+5x
+146x
+219x
+
+117x
+
+122x
+122x
+122x
+122x
+
+
+6507x
+
+122x
+122x
+122x
+122x
+122x
+
+
+
+106x
+
+
+
+107x
+103x
+
+
+
+100x
+21x
+99x
+99x
+99x
+
+
+
+128x
+1x
+
+127x
+27x
+
+100x
+123x
+
+
+
+27x
+27x
+1x
+
+
+27x
+2x
+
+25x
+25x
+25x
+25x
+25x
+
+
+27x
+
+
+
+6541x
+6541x
+34x
+
+6541x
+6541x
+
+
+
+6453x
+6453x
+6453x
+6453x
+6453x
+6453x
+6453x
+1x
+
+6452x
+
+
+
+
+6538x
+6538x
+
+
+6538x
+24x
+
+6538x
+
+
+
+821x
+821x
+821x
+821x
+821x
+821x
+1x
+820x
+
+
+
+
+858x
+858x
+858x
+
+
+
+20596x
+9093x
+
+11503x
+11503x
+
+
+38739x
+38735x
+25x
+25x
+25x
+
+
+
+11499x
+
+11499x
+96x
+4x
+
+92x
+92x
+
+
+
+
+
+25863x
+
+
+
+6533x
+6533x
+6533x
+
+
+
+38739x
+6156x
+
+32583x
+18770x
+4954x
+18770x
+
+
+13813x
+6541x
+4x
+
+6537x
+
+13811x
+6453x
+
+
+7358x
+24x
+
+7334x
+860x
+2x
+
+858x
+859x
+821x
+
+
+
+6512x
+6511x
+1x
+1x
+
+
+6510x
+1581x
+
+
+
+6537x
+
+1x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6512x
+6512x
+6512x
+6508x
+1x
+
+2x
+
+
+
+
+248x
+158x
+
+
+
+
+6448x
+
+6448x
+820x
+6393x
+
+
+
+6393x
+6393x
+
+
+6448x
+6448x
+
+6448x
+6336x
+11830x
+156x
+
+
+112x
+199x
+53x
+
+
+
+
+265x
+214x
+265x
+
+
+
+
+
+47x
+47x
+
+
+
+
+
+
+
+84x
+84x
+
+
+
+37x
+
+
+
+
+87x
+87x
+
+87x
+38x
+48x
+
+
+
+
+48x
+48x
+
+
+87x
+31x
+39x
+
+
+56x
+106x
+
+
+
+
+5x
+
+5x
+ 'use strict'
+
+// A readable tar stream creator
+// Technically, this is a transform stream that you write paths into,
+// and tar format comes out of.
+// The `add()` method is like `write()` but returns this,
+// and end() return `this` as well, so you can
+// do `new Pack(opt).add('files').add('dir').end().pipe(output)
+// You could also do something like:
+// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar'))
+
+class PackJob {
+ constructor (path, absolute) {
+ this.path = path || './'
+ this.absolute = absolute
+ this.entry = null
+ this.stat = null
+ this.readdir = null
+ this.pending = false
+ this.ignore = false
+ this.piped = false
+ }
+}
+
+const MiniPass = require('minipass')
+const zlib = require('minizlib')
+const ReadEntry = require('./read-entry.js')
+const WriteEntry = require('./write-entry.js')
+const WriteEntrySync = WriteEntry.Sync
+const WriteEntryTar = WriteEntry.Tar
+const Yallist = require('yallist')
+const EOF = Buffer.alloc(1024)
+const ONSTAT = Symbol('onStat')
+const ENDED = Symbol('ended')
+const QUEUE = Symbol('queue')
+const CURRENT = Symbol('current')
+const PROCESS = Symbol('process')
+const PROCESSING = Symbol('processing')
+const PROCESSJOB = Symbol('processJob')
+const JOBS = Symbol('jobs')
+const JOBDONE = Symbol('jobDone')
+const ADDFSENTRY = Symbol('addFSEntry')
+const ADDTARENTRY = Symbol('addTarEntry')
+const STAT = Symbol('stat')
+const READDIR = Symbol('readdir')
+const ONREADDIR = Symbol('onreaddir')
+const PIPE = Symbol('pipe')
+const ENTRY = Symbol('entry')
+const ENTRYOPT = Symbol('entryOpt')
+const WRITEENTRYCLASS = Symbol('writeEntryClass')
+const WRITE = Symbol('write')
+const ONDRAIN = Symbol('ondrain')
+
+const fs = require('fs')
+const path = require('path')
+const warner = require('./warn-mixin.js')
+
+const Pack = warner(class Pack extends MiniPass {
+ constructor (opt) {
+ super(opt)
+ opt = opt || Object.create(null)
+ this.opt = opt
+ this.cwd = opt.cwd || process.cwd()
+ this.maxReadSize = opt.maxReadSize
+ this.preservePaths = !!opt.preservePaths
+ this.strict = !!opt.strict
+ this.noPax = !!opt.noPax
+ this.prefix = (opt.prefix || '').replace(/(\\|\/)+$/, '')
+ this.linkCache = opt.linkCache || new Map()
+ this.statCache = opt.statCache || new Map()
+ this.readdirCache = opt.readdirCache || new Map()
+ this[WRITEENTRYCLASS] = WriteEntry
+ if (typeof opt.onwarn === 'function')
+ this.on('warn', opt.onwarn)
+
+ this.zip = null
+ if (opt.gzip) {
+ if (typeof opt.gzip !== 'object')
+ opt.gzip = {}
+ this.zip = new zlib.Gzip(opt.gzip)
+ this.zip.on('data', chunk => super.write(chunk))
+ this.zip.on('end', _ => super.end())
+ this.zip.on('drain', _ => this[ONDRAIN]())
+ this.on('resume', _ => this.zip.resume())
+ } else
+ this.on('drain', this[ONDRAIN])
+
+ this.portable = !!opt.portable
+ this.noDirRecurse = !!opt.noDirRecurse
+ this.follow = !!opt.follow
+ this.noMtime = !!opt.noMtime
+
+
+ this.filter = typeof opt.filter === 'function' ? opt.filter : _ => true
+
+ this[QUEUE] = new Yallist
+ this[JOBS] = 0
+ this.jobs = +opt.jobs || 4
+ this[PROCESSING] = false
+ this[ENDED] = false
+ }
+
+ [WRITE] (chunk) {
+ return super.write(chunk)
+ }
+
+ add (path) {
+ this.write(path)
+ return this
+ }
+
+ end (path) {
+ if (path)
+ this.write(path)
+ this[ENDED] = true
+ this[PROCESS]()
+ return this
+ }
+
+ write (path) {
+ if (this[ENDED])
+ throw new Error('write after end')
+
+ if (path instanceof ReadEntry)
+ this[ADDTARENTRY](path)
+ else
+ this[ADDFSENTRY](path)
+ return this.flowing
+ }
+
+ [ADDTARENTRY] (p) {
+ const absolute = path.resolve(this.cwd, p.path)
+ if (this.prefix)
+ p.path = this.prefix + '/' + p.path.replace(/^\.(\/+|$)/, '')
+
+ // in this case, we don't have to wait for the stat
+ if (!this.filter(p.path, p))
+ p.resume()
+ else {
+ const job = new PackJob(p.path, absolute, false)
+ job.entry = new WriteEntryTar(p, this[ENTRYOPT](job))
+ job.entry.on('end', _ => this[JOBDONE](job))
+ this[JOBS] += 1
+ this[QUEUE].push(job)
+ }
+
+ this[PROCESS]()
+ }
+
+ [ADDFSENTRY] (p) {
+ const absolute = path.resolve(this.cwd, p)
+ if (this.prefix)
+ p = this.prefix + '/' + p.replace(/^\.(\/+|$)/, '')
+
+ this[QUEUE].push(new PackJob(p, absolute))
+ this[PROCESS]()
+ }
+
+ [STAT] (job) {
+ job.pending = true
+ this[JOBS] += 1
+ const stat = this.follow ? 'stat' : 'lstat'
+ fs[stat](job.absolute, (er, stat) => {
+ job.pending = false
+ this[JOBS] -= 1
+ if (er)
+ this.emit('error', er)
+ else
+ this[ONSTAT](job, stat)
+ })
+ }
+
+ [ONSTAT] (job, stat) {
+ this.statCache.set(job.absolute, stat)
+ job.stat = stat
+
+ // now we have the stat, we can filter it.
+ if (!this.filter(job.path, stat))
+ job.ignore = true
+
+ this[PROCESS]()
+ }
+
+ [READDIR] (job) {
+ job.pending = true
+ this[JOBS] += 1
+ fs.readdir(job.absolute, (er, entries) => {
+ job.pending = false
+ this[JOBS] -= 1
+ if (er)
+ return this.emit('error', er)
+ this[ONREADDIR](job, entries)
+ })
+ }
+
+ [ONREADDIR] (job, entries) {
+ this.readdirCache.set(job.absolute, entries)
+ job.readdir = entries
+ this[PROCESS]()
+ }
+
+ [PROCESS] () {
+ if (this[PROCESSING])
+ return
+
+ this[PROCESSING] = true
+ for (let w = this[QUEUE].head;
+ w !== null && this[JOBS] < this.jobs;
+ w = w.next) {
+ this[PROCESSJOB](w.value)
+ if (w.value.ignore) {
+ const p = w.next
+ this[QUEUE].removeNode(w)
+ w.next = p
+ }
+ }
+
+ this[PROCESSING] = false
+
+ if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) {
+ if (this.zip)
+ this.zip.end(EOF)
+ else {
+ super.write(EOF)
+ super.end()
+ }
+ }
+ }
+
+ get [CURRENT] () {
+ return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value
+ }
+
+ [JOBDONE] (job) {
+ this[QUEUE].shift()
+ this[JOBS] -= 1
+ this[PROCESS]()
+ }
+
+ [PROCESSJOB] (job) {
+ if (job.pending)
+ return
+
+ if (job.entry) {
+ if (job === this[CURRENT] && !job.piped)
+ this[PIPE](job)
+ return
+ }
+
+ if (!job.stat) {
+ if (this.statCache.has(job.absolute))
+ this[ONSTAT](job, this.statCache.get(job.absolute))
+ else
+ this[STAT](job)
+ }
+ if (!job.stat)
+ return
+
+ // filtered out!
+ if (job.ignore)
+ return
+
+ if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) {
+ if (this.readdirCache.has(job.absolute))
+ this[ONREADDIR](job, this.readdirCache.get(job.absolute))
+ else
+ this[READDIR](job)
+ if (!job.readdir)
+ return
+ }
+
+ // we know it doesn't have an entry, because that got checked above
+ job.entry = this[ENTRY](job)
+ if (!job.entry) {
+ job.ignore = true
+ return
+ }
+
+ if (job === this[CURRENT] && !job.piped)
+ this[PIPE](job)
+ }
+
+ [ENTRYOPT] (job) {
+ return {
+ onwarn: (msg, data) => {
+ this.warn(msg, data)
+ },
+ noPax: this.noPax,
+ cwd: this.cwd,
+ absolute: job.absolute,
+ preservePaths: this.preservePaths,
+ maxReadSize: this.maxReadSize,
+ strict: this.strict,
+ portable: this.portable,
+ linkCache: this.linkCache,
+ statCache: this.statCache,
+ noMtime: this.noMtime
+ }
+ }
+
+ [ENTRY] (job) {
+ this[JOBS] += 1
+ try {
+ return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job))
+ .on('end', () => this[JOBDONE](job))
+ .on('error', er => this.emit('error', er))
+ } catch (er) {
+ this.emit('error', er)
+ }
+ }
+
+ [ONDRAIN] () {
+ if (this[CURRENT] && this[CURRENT].entry)
+ this[CURRENT].entry.resume()
+ }
+
+ // like .pipe() but using super, because our write() is special
+ [PIPE] (job) {
+ job.piped = true
+
+ if (job.readdir)
+ job.readdir.forEach(entry => {
+ const p = this.prefix ?
+ job.path.slice(this.prefix.length + 1) || './'
+ : job.path
+
+ const base = p === './' ? '' : p.replace(/\/*$/, '/')
+ this[ADDFSENTRY](base + entry)
+ })
+
+ const source = job.entry
+ const zip = this.zip
+
+ if (zip)
+ source.on('data', chunk => {
+ if (!zip.write(chunk))
+ source.pause()
+ })
+ else
+ source.on('data', chunk => {
+ if (!super.write(chunk))
+ source.pause()
+ })
+ }
+
+ pause () {
+ if (this.zip)
+ this.zip.pause()
+ return super.pause()
+ }
+})
+
+class PackSync extends Pack {
+ constructor (opt) {
+ super(opt)
+ this[WRITEENTRYCLASS] = WriteEntrySync
+ }
+
+ // pause/resume are no-ops in sync streams.
+ pause () {}
+ resume () {}
+
+ [STAT] (job) {
+ const stat = this.follow ? 'statSync' : 'lstatSync'
+ this[ONSTAT](job, fs[stat](job.absolute))
+ }
+
+ [READDIR] (job, stat) {
+ this[ONREADDIR](job, fs.readdirSync(job.absolute))
+ }
+
+ // gotta get it all in this tick
+ [PIPE] (job) {
+ const source = job.entry
+ const zip = this.zip
+
+ if (job.readdir)
+ job.readdir.forEach(entry => {
+ const p = this.prefix ?
+ job.path.slice(this.prefix.length + 1) || './'
+ : job.path
+
+
+ const base = p === './' ? '' : p.replace(/\/*$/, '/')
+ this[ADDFSENTRY](base + entry)
+ })
+
+ if (zip)
+ source.on('data', chunk => {
+ zip.write(chunk)
+ })
+ else
+ source.on('data', chunk => {
+ super[WRITE](chunk)
+ })
+ }
+}
+
+Pack.Sync = PackSync
+
+module.exports = Pack
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/parse.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/parse.js.html
new file mode 100644
index 0000000..1d505ab
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/parse.js.html
@@ -0,0 +1,1310 @@
+
+
+
+ Code coverage report for tar/lib/parse.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 242/242
+
+
+ 100%
+ Branches
+ 155/155
+
+
+ 100%
+ Functions
+ 24/24
+
+
+ 100%
+ Lines
+ 236/236
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+9x
+
+2032x
+
+9x
+
+742x
+742x
+
+742x
+134x
+
+608x
+589x
+589x
+589x
+589x
+
+
+742x
+742x
+742x
+
+
+742x
+742x
+
+742x
+742x
+742x
+742x
+742x
+742x
+742x
+742x
+742x
+742x
+742x
+742x
+36x
+742x
+34x
+
+
+
+6101x
+
+6101x
+1834x
+4267x
+160x
+4107x
+40x
+
+4067x
+4067x
+40x
+4027x
+40x
+
+3987x
+
+3987x
+759x
+260x
+260x
+260x
+499x
+455x
+475x
+455x
+
+
+
+3228x
+3228x
+3228x
+1070x
+1070x
+
+2158x
+1028x
+
+1130x
+1130x
+
+
+2158x
+1675x
+1675x
+
+483x
+
+
+
+
+
+
+
+4299x
+
+4299x
+1653x
+1653x
+2646x
+490x
+
+2156x
+2156x
+2150x
+1288x
+1288x
+
+
+
+4293x
+
+
+
+2947x
+
+2941x
+
+
+
+
+
+
+
+2478x
+2478x
+2478x
+2468x
+516x
+
+10x
+
+
+
+
+
+2194x
+2194x
+2194x
+
+
+2194x
+
+2194x
+2121x
+2121x
+2121x
+
+
+2194x
+
+
+
+475x
+475x
+
+
+475x
+455x
+
+475x
+
+
+
+4328x
+3815x
+
+513x
+
+
+
+455x
+455x
+
+
+351x
+351x
+
+
+44x
+44x
+
+
+
+40x
+40x
+40x
+
+
+20x
+20x
+20x
+
+
+
+
+
+
+
+2x
+2x
+2x
+
+
+
+669590x
+1x
+
+
+669589x
+944x
+224x
+224x
+
+944x
+224x
+224x
+
+720x
+947x
+493x
+
+720x
+227x
+227x
+227x
+20164x
+227x
+2x
+227x
+226x
+226x
+
+227x
+
+
+
+669138x
+669138x
+33586x
+
+635552x
+669132x
+
+
+
+669132x
+
+
+
+
+669132x
+63x
+
+669132x
+
+
+
+652869x
+652866x
+
+
+
+3449x
+709x
+709x
+709x
+2x
+2x
+
+2x
+1x
+2x
+
+709x
+
+
+
+
+655942x
+10x
+655932x
+381x
+
+655551x
+655551x
+652859x
+652859x
+652859x
+652859x
+
+2692x
+
+
+655545x
+2x
+2x
+2x
+
+655545x
+
+
+655936x
+3068x
+
+
+
+
+
+655553x
+655553x
+655553x
+8295x
+
+6101x
+6095x
+6095x
+
+
+
+1719x
+1719x
+
+
+475x
+475x
+
+
+
+
+
+
+
+655547x
+652863x
+1x
+
+652862x
+
+
+
+
+718x
+717x
+113x
+
+604x
+604x
+
+
+
+
+ 'use strict'
+
+// this[BUFFER] is the remainder of a chunk if we're waiting for
+// the full 512 bytes of a header to come in. We will Buffer.concat()
+// it to the next write(), which is a mem copy, but a small one.
+//
+// this[QUEUE] is a Yallist of entries that haven't been emitted
+// yet this can only get filled up if the user keeps write()ing after
+// a write() returns false, or does a write() with more than one entry
+//
+// We don't buffer chunks, we always parse them and either create an
+// entry, or push it into the active entry. The ReadEntry class knows
+// to throw data away if .ignore=true
+//
+// Shift entry off the buffer when it emits 'end', and emit 'entry' for
+// the next one in the list.
+//
+// At any time, we're pushing body chunks into the entry at WRITEENTRY,
+// and waiting for 'end' on the entry at READENTRY
+//
+// ignored entries get .resume() called on them straight away
+
+const warner = require('./warn-mixin.js')
+const path = require('path')
+const Header = require('./header.js')
+const EE = require('events')
+const Yallist = require('yallist')
+const maxMetaEntrySize = 1024 * 1024
+const Entry = require('./read-entry.js')
+const Pax = require('./pax.js')
+const zlib = require('minizlib')
+
+const gzipHeader = new Buffer([0x1f, 0x8b])
+const STATE = Symbol('state')
+const WRITEENTRY = Symbol('writeEntry')
+const READENTRY = Symbol('readEntry')
+const NEXTENTRY = Symbol('nextEntry')
+const PROCESSENTRY = Symbol('processEntry')
+const EX = Symbol('extendedHeader')
+const GEX = Symbol('globalExtendedHeader')
+const META = Symbol('meta')
+const EMITMETA = Symbol('emitMeta')
+const BUFFER = Symbol('buffer')
+const QUEUE = Symbol('queue')
+const ENDED = Symbol('ended')
+const EMITTEDEND = Symbol('emittedEnd')
+const EMIT = Symbol('emit')
+const UNZIP = Symbol('unzip')
+const CONSUMECHUNK = Symbol('consumeChunk')
+const CONSUMECHUNKSUB = Symbol('consumeChunkSub')
+const CONSUMEBODY = Symbol('consumeBody')
+const CONSUMEMETA = Symbol('consumeMeta')
+const CONSUMEHEADER = Symbol('consumeHeader')
+const CONSUMING = Symbol('consuming')
+const BUFFERCONCAT = Symbol('bufferConcat')
+const MAYBEEND = Symbol('maybeEnd')
+const WRITING = Symbol('writing')
+const ABORTED = Symbol('aborted')
+const DONE = Symbol('onDone')
+
+const noop = _ => true
+
+module.exports = warner(class Parser extends EE {
+ constructor (opt) {
+ opt = opt || {}
+ super(opt)
+
+ if (opt.ondone)
+ this.on(DONE, opt.ondone)
+ else
+ this.on(DONE, _ => {
+ this.emit('prefinish')
+ this.emit('finish')
+ this.emit('end')
+ this.emit('close')
+ })
+
+ this.strict = !!opt.strict
+ this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize
+ this.filter = typeof opt.filter === 'function' ? opt.filter : noop
+
+ // have to set this so that streams are ok piping into it
+ this.writable = true
+ this.readable = false
+
+ this[QUEUE] = new Yallist()
+ this[BUFFER] = null
+ this[READENTRY] = null
+ this[WRITEENTRY] = null
+ this[STATE] = 'begin'
+ this[META] = ''
+ this[EX] = null
+ this[GEX] = null
+ this[ENDED] = false
+ this[UNZIP] = null
+ this[ABORTED] = false
+ if (typeof opt.onwarn === 'function')
+ this.on('warn', opt.onwarn)
+ if (typeof opt.onentry === 'function')
+ this.on('entry', opt.onentry)
+ }
+
+ [CONSUMEHEADER] (chunk, position) {
+ const header = new Header(chunk, position)
+
+ if (header.nullBlock)
+ this[EMIT]('nullBlock')
+ else if (!header.cksumValid)
+ this.warn('invalid entry', header)
+ else if (!header.path)
+ this.warn('invalid: path is required', header)
+ else {
+ const type = header.type
+ if (/^(Symbolic)?Link$/.test(type) && !header.linkpath)
+ this.warn('invalid: linkpath required', header)
+ else if (!/^(Symbolic)?Link$/.test(type) && header.linkpath)
+ this.warn('invalid: linkpath forbidden', header)
+ else {
+ const entry = this[WRITEENTRY] = new Entry(header, this[EX], this[GEX])
+
+ if (entry.meta) {
+ if (entry.size > this.maxMetaEntrySize) {
+ entry.ignore = true
+ this[EMIT]('ignoredEntry', entry)
+ this[STATE] = 'ignore'
+ } else if (entry.size > 0) {
+ this[META] = ''
+ entry.on('data', c => this[META] += c)
+ this[STATE] = 'meta'
+ }
+ } else {
+
+ this[EX] = null
+ entry.ignore = entry.ignore || !this.filter(entry.path, entry)
+ if (entry.ignore) {
+ this[EMIT]('ignoredEntry', entry)
+ this[STATE] = entry.remain ? 'ignore' : 'begin'
+ } else {
+ if (entry.remain)
+ this[STATE] = 'body'
+ else {
+ this[STATE] = 'begin'
+ entry.end()
+ }
+
+ if (!this[READENTRY]) {
+ this[QUEUE].push(entry)
+ this[NEXTENTRY]()
+ } else
+ this[QUEUE].push(entry)
+ }
+ }
+ }
+ }
+ }
+
+ [PROCESSENTRY] (entry) {
+ let go = true
+
+ if (!entry) {
+ this[READENTRY] = null
+ go = false
+ } else if (Array.isArray(entry))
+ this.emit.apply(this, entry)
+ else {
+ this[READENTRY] = entry
+ this.emit('entry', entry)
+ if (!entry.emittedEnd) {
+ entry.on('end', _ => this[NEXTENTRY]())
+ go = false
+ }
+ }
+
+ return go
+ }
+
+ [NEXTENTRY] () {
+ do {} while (this[PROCESSENTRY](this[QUEUE].shift()))
+
+ if (!this[QUEUE].length) {
+ // At this point, there's nothing in the queue, but we may have an
+ // entry which is being consumed (readEntry).
+ // If we don't, then we definitely can handle more data.
+ // If we do, and either it's flowing, or it has never had any data
+ // written to it, then it needs more.
+ // The only other possibility is that it has returned false from a
+ // write() call, so we wait for the next drain to continue.
+ const re = this[READENTRY]
+ const drainNow = !re || re.flowing || re.size === re.remain
+ if (drainNow) {
+ if (!this[WRITING])
+ this.emit('drain')
+ } else
+ re.once('drain', _ => this.emit('drain'))
+ }
+ }
+
+ [CONSUMEBODY] (chunk, position) {
+ // write up to but no more than writeEntry.blockRemain
+ const entry = this[WRITEENTRY]
+ const br = entry.blockRemain
+ const c = (br >= chunk.length && position === 0) ? chunk
+ : chunk.slice(position, position + br)
+
+ entry.write(c)
+
+ if (!entry.blockRemain) {
+ this[STATE] = 'begin'
+ this[WRITEENTRY] = null
+ entry.end()
+ }
+
+ return c.length
+ }
+
+ [CONSUMEMETA] (chunk, position) {
+ const entry = this[WRITEENTRY]
+ const ret = this[CONSUMEBODY](chunk, position)
+
+ // if we finished, then the entry is reset
+ if (!this[WRITEENTRY])
+ this[EMITMETA](entry)
+
+ return ret
+ }
+
+ [EMIT] (ev, data, extra) {
+ if (!this[QUEUE].length && !this[READENTRY])
+ this.emit(ev, data, extra)
+ else
+ this[QUEUE].push([ev, data, extra])
+ }
+
+ [EMITMETA] (entry) {
+ this[EMIT]('meta', this[META])
+ switch (entry.type) {
+ case 'ExtendedHeader':
+ case 'OldExtendedHeader':
+ this[EX] = Pax.parse(this[META], this[EX], false)
+ break
+
+ case 'GlobalExtendedHeader':
+ this[GEX] = Pax.parse(this[META], this[GEX], true)
+ break
+
+ case 'NextFileHasLongPath':
+ case 'OldGnuLongPath':
+ this[EX] = this[EX] || Object.create(null)
+ this[EX].path = this[META].replace(/\0.*/, '')
+ break
+
+ case 'NextFileHasLongLinkpath':
+ this[EX] = this[EX] || Object.create(null)
+ this[EX].linkpath = this[META].replace(/\0.*/, '')
+ break
+
+ /* istanbul ignore next */
+ default: throw new Error('unknown meta: ' + entry.type)
+ }
+ }
+
+ abort (msg, error) {
+ this[ABORTED] = true
+ this.warn(msg, error)
+ this.emit('abort')
+ }
+
+ write (chunk) {
+ if (this[ABORTED])
+ return
+
+ // first write, might be gzipped
+ if (this[UNZIP] === null && chunk) {
+ if (this[BUFFER]) {
+ chunk = Buffer.concat([this[BUFFER], chunk])
+ this[BUFFER] = null
+ }
+ if (chunk.length < gzipHeader.length) {
+ this[BUFFER] = chunk
+ return true
+ }
+ for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) {
+ if (chunk[i] !== gzipHeader[i])
+ this[UNZIP] = false
+ }
+ if (this[UNZIP] === null) {
+ const ended = this[ENDED]
+ this[ENDED] = false
+ this[UNZIP] = new zlib.Unzip()
+ this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))
+ this[UNZIP].on('error', er =>
+ this.abort('zlib error: ' + er.message, er))
+ this[UNZIP].on('end', _ => {
+ this[ENDED] = true
+ this[CONSUMECHUNK]()
+ })
+ return ended ? this[UNZIP].end(chunk) : this[UNZIP].write(chunk)
+ }
+ }
+
+ this[WRITING] = true
+ if (this[UNZIP])
+ this[UNZIP].write(chunk)
+ else
+ this[CONSUMECHUNK](chunk)
+ this[WRITING] = false
+
+ // return false if there's a queue, or if the current entry isn't flowing
+ const ret =
+ this[QUEUE].length ? false :
+ this[READENTRY] ? this[READENTRY].flowing :
+ true
+
+ // if we have no queue, then that means a clogged READENTRY
+ if (!ret && !this[QUEUE].length)
+ this[READENTRY].once('drain', _ => this.emit('drain'))
+
+ return ret
+ }
+
+ [BUFFERCONCAT] (c) {
+ if (c && !this[ABORTED])
+ this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c
+ }
+
+ [MAYBEEND] () {
+ if (this[ENDED] && !this[EMITTEDEND] && !this[ABORTED]) {
+ this[EMITTEDEND] = true
+ const entry = this[WRITEENTRY]
+ if (entry && entry.blockRemain) {
+ const have = this[BUFFER] ? this[BUFFER].length : 0
+ this.warn('Truncated input (needed ' + entry.blockRemain +
+ ' more bytes, only ' + have + ' available)', entry)
+ if (this[BUFFER])
+ entry.write(this[BUFFER])
+ entry.end()
+ }
+ this[EMIT](DONE)
+ }
+ }
+
+ [CONSUMECHUNK] (chunk) {
+ if (this[CONSUMING]) {
+ this[BUFFERCONCAT](chunk)
+ } else if (!chunk && !this[BUFFER]) {
+ this[MAYBEEND]()
+ } else {
+ this[CONSUMING] = true
+ if (this[BUFFER]) {
+ this[BUFFERCONCAT](chunk)
+ const c = this[BUFFER]
+ this[BUFFER] = null
+ this[CONSUMECHUNKSUB](c)
+ } else {
+ this[CONSUMECHUNKSUB](chunk)
+ }
+
+ while (this[BUFFER] && this[BUFFER].length >= 512 && !this[ABORTED]) {
+ const c = this[BUFFER]
+ this[BUFFER] = null
+ this[CONSUMECHUNKSUB](c)
+ }
+ this[CONSUMING] = false
+ }
+
+ if (!this[BUFFER] || this[ENDED])
+ this[MAYBEEND]()
+ }
+
+ [CONSUMECHUNKSUB] (chunk) {
+ // we know that we are in CONSUMING mode, so anything written goes into
+ // the buffer. Advance the position and put any remainder in the buffer.
+ let position = 0
+ let length = chunk.length
+ while (position + 512 <= length && !this[ABORTED]) {
+ switch (this[STATE]) {
+ case 'begin':
+ this[CONSUMEHEADER](chunk, position)
+ position += 512
+ break
+
+ case 'ignore':
+ case 'body':
+ position += this[CONSUMEBODY](chunk, position)
+ break
+
+ case 'meta':
+ position += this[CONSUMEMETA](chunk, position)
+ break
+
+ /* istanbul ignore next */
+ default:
+ throw new Error('invalid state: ' + this[STATE])
+ }
+ }
+
+ if (position < length) {
+ if (this[BUFFER])
+ this[BUFFER] = Buffer.concat([chunk.slice(position), this[BUFFER]])
+ else
+ this[BUFFER] = chunk.slice(position)
+ }
+ }
+
+ end (chunk) {
+ if (!this[ABORTED]) {
+ if (this[UNZIP])
+ this[UNZIP].end(chunk)
+ else {
+ this[ENDED] = true
+ this.write(chunk)
+ }
+ }
+ }
+})
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/pax.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/pax.js.html
new file mode 100644
index 0000000..ed0e937
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/pax.js.html
@@ -0,0 +1,500 @@
+
+
+
+ Code coverage report for tar/lib/pax.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 62/62
+
+
+ 100%
+ Branches
+ 75/75
+
+
+ 100%
+ Functions
+ 9/9
+
+
+ 100%
+ Lines
+ 60/60
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+11x
+11x
+
+
+
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+435x
+
+
+
+34x
+34x
+1x
+
+33x
+
+
+33x
+33x
+
+
+33x
+16896x
+
+
+33x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+33x
+
+
+33x
+8949x
+
+
+33x
+
+
+
+34x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+510x
+204x
+306x
+
+306x
+
+
+
+306x
+
+
+
+306x
+306x
+30x
+306x
+306x
+
+
+
+401x
+
+11x
+401x
+
+11x
+401x
+
+
+
+
+11x
+2259x
+
+
+
+2259x
+5x
+
+2254x
+2254x
+2254x
+2254x
+1x
+
+2253x
+2253x
+
+
+
+2253x
+
+
+11x
+ 'use strict'
+const Header = require('./header.js')
+const path = require('path')
+
+class Pax {
+ constructor (obj, global) {
+ this.atime = obj.atime || null
+ this.charset = obj.charset || null
+ this.comment = obj.comment || null
+ this.ctime = obj.ctime || null
+ this.gid = obj.gid || null
+ this.gname = obj.gname || null
+ this.linkpath = obj.linkpath || null
+ this.mtime = obj.mtime || null
+ this.path = obj.path || null
+ this.size = obj.size || null
+ this.uid = obj.uid || null
+ this.uname = obj.uname || null
+ this.dev = obj.dev || null
+ this.ino = obj.ino || null
+ this.nlink = obj.nlink || null
+ this.global = global || false
+ }
+
+ encode () {
+ const body = this.encodeBody()
+ if (body === '')
+ return null
+
+ const bodyLen = Buffer.byteLength(body)
+ // round up to 512 bytes
+ // add 512 for header
+ const bufLen = 512 * Math.ceil(1 + bodyLen / 512)
+ const buf = Buffer.allocUnsafe(bufLen)
+
+ // 0-fill the header section, it might not hit every field
+ for (let i = 0; i < 512; i++) {
+ buf[i] = 0
+ }
+
+ new Header({
+ // XXX split the path
+ // then the path should be PaxHeader + basename, but less than 99,
+ // prepend with the dirname
+ path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99),
+ mode: this.mode || 0o644,
+ uid: this.uid || null,
+ gid: this.gid || null,
+ size: bodyLen,
+ mtime: this.mtime || null,
+ type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader',
+ linkpath: '',
+ uname: this.uname || '',
+ gname: this.gname || '',
+ devmaj: 0,
+ devmin: 0,
+ atime: this.atime || null,
+ ctime: this.ctime || null
+ }).encode(buf)
+
+ buf.write(body, 512, bodyLen, 'utf8')
+
+ // null pad after the body
+ for (let i = bodyLen + 512; i < buf.length; i++) {
+ buf[i] = 0
+ }
+
+ return buf
+ }
+
+ encodeBody () {
+ return (
+ this.encodeField('path') +
+ this.encodeField('ctime') +
+ this.encodeField('atime') +
+ this.encodeField('dev') +
+ this.encodeField('ino') +
+ this.encodeField('nlink') +
+ this.encodeField('charset') +
+ this.encodeField('comment') +
+ this.encodeField('gid') +
+ this.encodeField('gname') +
+ this.encodeField('linkpath') +
+ this.encodeField('mtime') +
+ this.encodeField('size') +
+ this.encodeField('uid') +
+ this.encodeField('uname')
+ )
+ }
+
+ encodeField (field) {
+ if (this[field] === null || this[field] === undefined)
+ return ''
+ const v = this[field] instanceof Date ? this[field].getTime() / 1000
+ : this[field]
+ const s = ' ' +
+ (field === 'dev' || field === 'ino' || field === 'nlink'
+ ? 'SCHILY.' : '') +
+ field + '=' + v + '\n'
+ const byteLen = Buffer.byteLength(s)
+ // the digits includes the length of the digits in ascii base-10
+ // so if it's 9 characters, then adding 1 for the 9 makes it 10
+ // which makes it 11 chars.
+ let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1
+ if (byteLen + digits >= Math.pow(10, digits))
+ digits += 1
+ const len = digits + byteLen
+ return len + s
+ }
+}
+
+Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g)
+
+const merge = (a, b) =>
+ b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a
+
+const parseKV = string =>
+ string
+ .replace(/\n$/, '')
+ .split('\n')
+ .reduce(parseKVLine, Object.create(null))
+
+const parseKVLine = (set, line) => {
+ const n = parseInt(line, 10)
+
+ // XXX Values with \n in them will fail this.
+ // Refactor to not be a naive line-by-line parse.
+ if (n !== Buffer.byteLength(line) + 1)
+ return set
+
+ line = line.substr((n + ' ').length)
+ const kv = line.split('=')
+ const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1')
+ if (!k)
+ return set
+
+ const v = kv.join('=')
+ set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k)
+ ? new Date(v * 1000)
+ : /^[0-9]+$/.test(v) ? +v
+ : v
+ return set
+}
+
+module.exports = Pax
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/read-entry.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/read-entry.js.html
new file mode 100644
index 0000000..9fca327
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/read-entry.js.html
@@ -0,0 +1,347 @@
+
+
+
+ Code coverage report for tar/lib/read-entry.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 53/53
+
+
+ 100%
+ Branches
+ 36/36
+
+
+ 100%
+ Functions
+ 3/3
+
+
+ 100%
+ Lines
+ 51/51
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+11x
+11x
+
+11x
+11x
+
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+
+
+
+
+
+
+
+
+
+
+3241x
+
+
+
+
+
+
+
+760x
+760x
+
+
+
+
+3x
+
+
+4004x
+4004x
+4004x
+3720x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+4004x
+
+4004x
+4004x
+
+
+
+2222x
+2222x
+2x
+
+2220x
+2220x
+2220x
+2220x
+2220x
+673x
+
+1547x
+132x
+
+
+1415x
+
+
+
+457x
+
+
+6384x
+
+2657x
+
+
+
+ 'use strict'
+const types = require('./types.js')
+const MiniPass = require('minipass')
+
+const SLURP = Symbol('slurp')
+module.exports = class ReadEntry extends MiniPass {
+ constructor (header, ex, gex) {
+ super()
+ this.extended = ex
+ this.globalExtended = gex
+ this.header = header
+ this.startBlockSize = 512 * Math.ceil(header.size / 512)
+ this.blockRemain = this.startBlockSize
+ this.remain = header.size
+ this.type = header.type
+ this.meta = false
+ this.ignore = false
+ switch (this.type) {
+ case 'File':
+ case 'OldFile':
+ case 'Link':
+ case 'SymbolicLink':
+ case 'CharacterDevice':
+ case 'BlockDevice':
+ case 'Directory':
+ case 'FIFO':
+ case 'ContiguousFile':
+ case 'GNUDumpDir':
+ break
+
+ case 'NextFileHasLongLinkpath':
+ case 'NextFileHasLongPath':
+ case 'OldGnuLongPath':
+ case 'GlobalExtendedHeader':
+ case 'ExtendedHeader':
+ case 'OldExtendedHeader':
+ this.meta = true
+ break
+
+ // NOTE: gnutar and bsdtar treat unrecognized types as 'File'
+ // it may be worth doing the same, but with a warning.
+ default:
+ this.ignore = true
+ }
+
+ this.path = header.path
+ this.mode = header.mode
+ if (this.mode)
+ this.mode = this.mode & 0o7777
+ this.uid = header.uid
+ this.gid = header.gid
+ this.uname = header.uname
+ this.gname = header.gname
+ this.size = header.size
+ this.mtime = header.mtime
+ this.atime = header.atime
+ this.ctime = header.ctime
+ this.linkpath = header.linkpath
+ this.uname = header.uname
+ this.gname = header.gname
+
+ if (ex) this[SLURP](ex)
+ if (gex) this[SLURP](gex, true)
+ }
+
+ write (data) {
+ const writeLen = data.length
+ if (writeLen > this.blockRemain)
+ throw new Error('writing more to entry than is appropriate')
+
+ const r = this.remain
+ const br = this.blockRemain
+ this.remain = Math.max(0, r - writeLen)
+ this.blockRemain = Math.max(0, br - writeLen)
+ if (this.ignore)
+ return true
+
+ if (r >= writeLen)
+ return super.write(data)
+
+ // r < writeLen
+ return super.write(data.slice(0, r))
+ }
+
+ [SLURP] (ex, global) {
+ for (let k in ex) {
+ // we slurp in everything except for the path attribute in
+ // a global extended header, because that's weird.
+ if (ex[k] !== null && ex[k] !== undefined &&
+ !(global && k === 'path'))
+ this[k] = ex[k]
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/replace.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/replace.js.html
new file mode 100644
index 0000000..e764c04
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/replace.js.html
@@ -0,0 +1,722 @@
+
+
+
+ Code coverage report for tar/lib/replace.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 131/131
+
+
+ 100%
+ Branches
+ 70/70
+
+
+ 100%
+ Functions
+ 18/18
+
+
+ 100%
+ Lines
+ 128/128
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+
+
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+
+
+
+
+
+
+
+3x
+
+3x
+70x
+
+70x
+1x
+
+69x
+1x
+
+68x
+1x
+
+67x
+
+67x
+
+
+
+3x
+26x
+
+26x
+
+
+
+26x
+26x
+26x
+
+4x
+2x
+
+2x
+
+
+24x
+22x
+
+22x
+61x
+63x
+
+
+
+61x
+2x
+
+59x
+2x
+
+
+55x
+55x
+8x
+47x
+47x
+2x
+
+
+45x
+45x
+28x
+
+18x
+
+18x
+
+26x
+8x
+
+
+
+3x
+18x
+
+
+
+18x
+18x
+
+
+3x
+41x
+41x
+
+41x
+37x
+37x
+4x
+
+33x
+
+
+37x
+37x
+8x
+
+29x
+29x
+29x
+112x
+2x
+110x
+110x
+6x
+
+
+
+
+104x
+2x
+
+
+102x
+4x
+
+98x
+98x
+13x
+
+85x
+85x
+4x
+
+81x
+81x
+4x
+
+77x
+46x
+77x
+77x
+
+29x
+
+
+41x
+41x
+41x
+41x
+45x
+4x
+4x
+
+
+41x
+2x
+
+39x
+39x
+2x
+37x
+37x
+4x
+33x
+
+
+
+33x
+33x
+33x
+33x
+
+
+
+41x
+
+
+41x
+
+
+3x
+18x
+19x
+1x
+
+
+
+3x
+
+
+18x
+
+18x
+
+
+3x
+34x
+33x
+33x
+1x
+
+
+3x
+1x
+
+32x
+
+33x
+
+ 'use strict'
+
+// tar -r
+const hlo = require('./high-level-opt.js')
+const Pack = require('./pack.js')
+const Parse = require('./parse.js')
+const fs = require('fs')
+const fsm = require('fs-minipass')
+const t = require('./list.js')
+const path = require('path')
+
+// starting at the head of the file, read a Header
+// If the checksum is invalid, that's our position to start writing
+// If it is, jump forward by the specified size (round up to 512)
+// and try again.
+// Write the new Pack stream starting there.
+
+const Header = require('./header.js')
+
+const r = module.exports = (opt_, files, cb) => {
+ const opt = hlo(opt_)
+
+ if (!opt.file)
+ throw new TypeError('file is required')
+
+ if (opt.gzip)
+ throw new TypeError('cannot append to compressed archives')
+
+ if (!files || !Array.isArray(files) || !files.length)
+ throw new TypeError('no files or directories specified')
+
+ files = Array.from(files)
+
+ return opt.sync ? replaceSync(opt, files)
+ : replace(opt, files, cb)
+}
+
+const replaceSync = (opt, files) => {
+ const p = new Pack.Sync(opt)
+
+ let threw = true
+ let fd
+ let position
+
+ try {
+ try {
+ fd = fs.openSync(opt.file, 'r+')
+ } catch (er) {
+ if (er.code === 'ENOENT')
+ fd = fs.openSync(opt.file, 'w+')
+ else
+ throw er
+ }
+
+ const st = fs.fstatSync(fd)
+ const headBuf = Buffer.alloc(512)
+
+ POSITION: for (position = 0; position < st.size; position += 512) {
+ for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) {
+ bytes = fs.readSync(
+ fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos
+ )
+
+ if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b)
+ throw new Error('cannot append to compressed archives')
+
+ if (!bytes)
+ break POSITION
+ }
+
+ let h = new Header(headBuf)
+ if (!h.cksumValid)
+ break
+ let entryBlockSize = 512 * Math.ceil(h.size / 512)
+ if (position + entryBlockSize + 512 > st.size)
+ break
+ // the 512 for the header we just parsed will be added as well
+ // also jump ahead all the blocks for the body
+ position += entryBlockSize
+ if (opt.mtimeCache)
+ opt.mtimeCache.set(h.path, h.mtime)
+ }
+ threw = false
+
+ streamSync(opt, p, position, fd, files)
+ } finally {
+ if (threw)
+ try { fs.closeSync(fd) } catch (er) {}
+ }
+}
+
+const streamSync = (opt, p, position, fd, files) => {
+ const stream = new fsm.WriteStreamSync(opt.file, {
+ fd: fd,
+ start: position
+ })
+ p.pipe(stream)
+ addFilesSync(p, files)
+}
+
+const replace = (opt, files, cb) => {
+ files = Array.from(files)
+ const p = new Pack(opt)
+
+ const getPos = (fd, size, cb_) => {
+ const cb = (er, pos) => {
+ if (er)
+ fs.close(fd, _ => cb_(er))
+ else
+ cb_(null, pos)
+ }
+
+ let position = 0
+ if (size === 0)
+ return cb(null, 0)
+
+ let bufPos = 0
+ const headBuf = Buffer.alloc(512)
+ const onread = (er, bytes) => {
+ if (er)
+ return cb(er)
+ bufPos += bytes
+ if (bufPos < 512 && bytes)
+ return fs.read(
+ fd, headBuf, bufPos, headBuf.length - bufPos,
+ position + bufPos, onread
+ )
+
+ if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b)
+ return cb(new Error('cannot append to compressed archives'))
+
+ // truncated header
+ if (bufPos < 512)
+ return cb(null, position)
+
+ const h = new Header(headBuf)
+ if (!h.cksumValid)
+ return cb(null, position)
+
+ const entryBlockSize = 512 * Math.ceil(h.size / 512)
+ if (position + entryBlockSize + 512 > size)
+ return cb(null, position)
+
+ position += entryBlockSize + 512
+ if (position >= size)
+ return cb(null, position)
+
+ if (opt.mtimeCache)
+ opt.mtimeCache.set(h.path, h.mtime)
+ bufPos = 0
+ fs.read(fd, headBuf, 0, 512, position, onread)
+ }
+ fs.read(fd, headBuf, 0, 512, position, onread)
+ }
+
+ const promise = new Promise((resolve, reject) => {
+ p.on('error', reject)
+ let flag = 'r+'
+ const onopen = (er, fd) => {
+ if (er && er.code === 'ENOENT' && flag === 'r+') {
+ flag = 'w+'
+ return fs.open(opt.file, flag, onopen)
+ }
+
+ if (er)
+ return reject(er)
+
+ fs.fstat(fd, (er, st) => {
+ if (er)
+ return reject(er)
+ getPos(fd, st.size, (er, position) => {
+ if (er)
+ return reject(er)
+ const stream = new fsm.WriteStream(opt.file, {
+ fd: fd,
+ start: position
+ })
+ p.pipe(stream)
+ stream.on('error', reject)
+ stream.on('close', resolve)
+ addFilesAsync(p, files)
+ })
+ })
+ }
+ fs.open(opt.file, flag, onopen)
+ })
+
+ return cb ? promise.then(cb, cb) : promise
+}
+
+const addFilesSync = (p, files) => {
+ files.forEach(file => {
+ if (file.charAt(0) === '@')
+ t({
+ file: path.resolve(p.cwd, file.substr(1)),
+ sync: true,
+ noResume: true,
+ onentry: entry => p.add(entry)
+ })
+ else
+ p.add(file)
+ })
+ p.end()
+}
+
+const addFilesAsync = (p, files) => {
+ while (files.length) {
+ const file = files.shift()
+ if (file.charAt(0) === '@')
+ return t({
+ file: path.resolve(p.cwd, file.substr(1)),
+ noResume: true,
+ onentry: entry => p.add(entry)
+ }).then(_ => addFilesAsync(p, files))
+ else
+ p.add(file)
+ }
+ p.end()
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/types.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/types.js.html
new file mode 100644
index 0000000..ad8de07
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/types.js.html
@@ -0,0 +1,197 @@
+
+
+
+ Code coverage report for tar/lib/types.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 3/3
+
+
+ 100%
+ Branches
+ 0/0
+
+
+ 100%
+ Functions
+ 1/1
+
+
+ 100%
+ Lines
+ 2/2
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+
+14x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+294x
+ 'use strict'
+// map types from key to human-friendly name
+exports.name = new Map([
+ ['0', 'File'],
+ // same as File
+ ['', 'OldFile'],
+ ['1', 'Link'],
+ ['2', 'SymbolicLink'],
+ // Devices and FIFOs aren't fully supported
+ // they are parsed, but skipped when unpacking
+ ['3', 'CharacterDevice'],
+ ['4', 'BlockDevice'],
+ ['5', 'Directory'],
+ ['6', 'FIFO'],
+ // same as File
+ ['7', 'ContiguousFile'],
+ // pax headers
+ ['g', 'GlobalExtendedHeader'],
+ ['x', 'ExtendedHeader'],
+ // vendor-specific stuff
+ // skip
+ ['A', 'SolarisACL'],
+ // like 5, but with data, which should be skipped
+ ['D', 'GNUDumpDir'],
+ // metadata only, skip
+ ['I', 'Inode'],
+ // data = link path of next file
+ ['K', 'NextFileHasLongLinkpath'],
+ // data = path of next file
+ ['L', 'NextFileHasLongPath'],
+ // skip
+ ['M', 'ContinuationFile'],
+ // like L
+ ['N', 'OldGnuLongPath'],
+ // skip
+ ['S', 'SparseFile'],
+ // skip
+ ['V', 'TapeVolumeHeader'],
+ // like x
+ ['X', 'OldExtendedHeader']
+])
+
+// map the other direction
+exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]]))
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/unpack.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/unpack.js.html
new file mode 100644
index 0000000..240a6fa
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/unpack.js.html
@@ -0,0 +1,1604 @@
+
+
+
+ Code coverage report for tar/lib/unpack.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 254/254
+
+
+ 100%
+ Branches
+ 194/194
+
+
+ 100%
+ Functions
+ 44/44
+
+
+ 100%
+ Lines
+ 247/247
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+3x
+
+
+3x
+60x
+
+
+
+
+
+134x
+4x
+
+134x
+109x
+109x
+
+
+134x
+
+134x
+134x
+
+134x
+134x
+
+134x
+
+134x
+
+9x
+2x
+7x
+1x
+
+6x
+6x
+6x
+
+125x
+125x
+125x
+
+
+
+131x
+119x
+
+12x
+
+131x
+
+131x
+
+
+
+131x
+
+
+131x
+
+
+131x
+
+
+131x
+
+
+
+
+131x
+
+
+
+131x
+
+131x
+131x
+131x
+131x
+
+131x
+131x
+571x
+
+
+
+473x
+98x
+98x
+98x
+98x
+
+
+
+
+571x
+144x
+144x
+9x
+135x
+
+
+562x
+545x
+545x
+2x
+2x
+
+
+
+
+543x
+2x
+2x
+2x
+
+
+
+
+560x
+3x
+3x
+
+
+
+560x
+2x
+
+558x
+
+560x
+
+
+
+571x
+11x
+
+560x
+
+560x
+
+
+179x
+140x
+
+
+
+
+
+
+554x
+
+
+
+
+6x
+
+
+
+
+
+
+
+39x
+12x
+
+27x
+27x
+27x
+
+
+
+
+451x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+473x
+
+
+
+
+
+
+
+
+30x
+
+
+
+30x
+
+
+
+221x
+221x
+
+
+
+221x
+
+221x
+221x
+421x
+1x
+1x
+
+
+421x
+219x
+
+
+221x
+219x
+192x
+192x
+
+
+219x
+10x
+10x
+
+
+219x
+
+
+221x
+
+
+
+97x
+97x
+97x
+3x
+
+94x
+94x
+171x
+94x
+94x
+
+
+
+94x
+73x
+73x
+
+
+94x
+4x
+4x
+
+
+94x
+
+
+
+
+6x
+6x
+
+
+
+21x
+
+
+
+19x
+
+
+
+354x
+
+
+
+364x
+364x
+
+
+
+4x
+4x
+
+
+
+
+354x
+354x
+354x
+12x
+342x
+342x
+2x
+340x
+318x
+22x
+16x
+11x
+9x
+
+2x
+
+5x
+
+6x
+
+
+
+
+
+528x
+1x
+
+527x
+
+
+
+314x
+
+
+19x
+
+
+21x
+
+
+
+173x
+
+
+
+
+
+21x
+21x
+1x
+20x
+20x
+
+
+
+
+
+
+59x
+
+
+
+200x
+200x
+9x
+191x
+191x
+17x
+2x
+15x
+2x
+
+13x
+13x
+6x
+3x
+2x
+
+3x
+
+7x
+12x
+
+1x
+
+
+
+174x
+
+
+
+
+93x
+
+93x
+6x
+6x
+
+
+
+
+93x
+93x
+
+1x
+
+
+92x
+86x
+86x
+
+1x
+
+
+
+92x
+86x
+86x
+58x
+
+85x
+12x
+
+82x
+
+4x
+
+
+
+
+
+
+76x
+76x
+76x
+1x
+75x
+56x
+56x
+
+
+75x
+4x
+4x
+
+
+75x
+
+
+
+276x
+276x
+
+
+
+
+
+
+
+
+
+
+
+
+4x
+
+
+
+
+19x
+19x
+17x
+
+2x
+
+
+
+
+3x
+3x
+ 'use strict'
+
+const assert = require('assert')
+const EE = require('events').EventEmitter
+const Parser = require('./parse.js')
+const fs = require('fs')
+const fsm = require('fs-minipass')
+const path = require('path')
+const mkdir = require('./mkdir.js')
+const mkdirSync = mkdir.sync
+const wc = require('./winchars.js')
+
+const ONENTRY = Symbol('onEntry')
+const CHECKFS = Symbol('checkFs')
+const MAKEFS = Symbol('makeFs')
+const FILE = Symbol('file')
+const DIRECTORY = Symbol('directory')
+const LINK = Symbol('link')
+const SYMLINK = Symbol('symlink')
+const HARDLINK = Symbol('hardlink')
+const UNSUPPORTED = Symbol('unsupported')
+const UNKNOWN = Symbol('unknown')
+const CHECKPATH = Symbol('checkPath')
+const MKDIR = Symbol('mkdir')
+const ONERROR = Symbol('onError')
+const PENDING = Symbol('pending')
+const PEND = Symbol('pend')
+const UNPEND = Symbol('unpend')
+const ENDED = Symbol('ended')
+const MAYBECLOSE = Symbol('maybeClose')
+const SKIP = Symbol('skip')
+const DOCHOWN = Symbol('doChown')
+const UID = Symbol('uid')
+const GID = Symbol('gid')
+
+// this.gid, entry.gid, this.processUid
+const uint32 = (a, b, c) =>
+ a === a >>> 0 ? a
+ : b === b >>> 0 ? b
+ : c
+
+class Unpack extends Parser {
+ constructor (opt) {
+ if (!opt)
+ opt = {}
+
+ opt.ondone = _ => {
+ this[ENDED] = true
+ this[MAYBECLOSE]()
+ }
+
+ super(opt)
+
+ this.writable = true
+ this.readable = false
+
+ this[PENDING] = 0
+ this[ENDED] = false
+
+ this.dirCache = opt.dirCache || new Map()
+
+ if (typeof opt.uid === 'number' || typeof opt.gid === 'number') {
+ // need both or neither
+ if (typeof opt.uid !== 'number' || typeof opt.gid !== 'number')
+ throw new TypeError('cannot set owner without number uid and gid')
+ if (opt.preserveOwner)
+ throw new TypeError(
+ 'cannot preserve owner in archive and also set owner explicitly')
+ this.uid = opt.uid
+ this.gid = opt.gid
+ this.setOwner = true
+ } else {
+ this.uid = null
+ this.gid = null
+ this.setOwner = false
+ }
+
+ // default true for root
+ if (opt.preserveOwner === undefined && typeof opt.uid !== 'number')
+ this.preserveOwner = process.getuid && process.getuid() === 0
+ else
+ this.preserveOwner = !!opt.preserveOwner
+
+ this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ?
+ process.getuid() : null
+ this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ?
+ process.getgid() : null
+
+ // turn ><?| in filenames into 0xf000-higher encoded forms
+ this.win32 = !!opt.win32 || process.platform === 'win32'
+
+ // do not unpack over files that are newer than what's in the archive
+ this.newer = !!opt.newer
+
+ // do not unpack over ANY files
+ this.keep = !!opt.keep
+
+ // do not set mtime/atime of extracted entries
+ this.noMtime = !!opt.noMtime
+
+ // allow .., absolute path entries, and unpacking through symlinks
+ // without this, warn and skip .., relativize absolutes, and error
+ // on symlinks in extraction path
+ this.preservePaths = !!opt.preservePaths
+
+ // unlink files and links before writing. This breaks existing hard
+ // links, and removes symlink directories rather than erroring
+ this.unlink = !!opt.unlink
+
+ this.cwd = path.resolve(opt.cwd || process.cwd())
+ this.strip = +opt.strip || 0
+ this.processUmask = process.umask()
+ this.umask = typeof opt.umask === 'number' ? opt.umask : this.processUmask
+ // default mode for dirs created as parents
+ this.dmode = opt.dmode || (0o0777 & (~this.umask))
+ this.fmode = opt.fmode || (0o0666 & (~this.umask))
+ this.on('entry', entry => this[ONENTRY](entry))
+ }
+
+ [MAYBECLOSE] () {
+ if (this[ENDED] && this[PENDING] === 0) {
+ this.emit('prefinish')
+ this.emit('finish')
+ this.emit('end')
+ this.emit('close')
+ }
+ }
+
+ [CHECKPATH] (entry) {
+ if (this.strip) {
+ const parts = entry.path.split(/\/|\\/)
+ if (parts.length < this.strip)
+ return false
+ entry.path = parts.slice(this.strip).join('/')
+ }
+
+ if (!this.preservePaths) {
+ const p = entry.path
+ if (p.match(/(^|\/|\\)\.\.(\\|\/|$)/)) {
+ this.warn('path contains \'..\'', p)
+ return false
+ }
+
+ // absolutes on posix are also absolutes on win32
+ // so we only need to test this one to get both
+ if (path.win32.isAbsolute(p)) {
+ const parsed = path.win32.parse(p)
+ this.warn('stripping ' + parsed.root + ' from absolute path', p)
+ entry.path = p.substr(parsed.root.length)
+ }
+ }
+
+ // only encode : chars that aren't drive letter indicators
+ if (this.win32) {
+ const parsed = path.win32.parse(entry.path)
+ entry.path = parsed.root === '' ? wc.encode(entry.path)
+ : parsed.root + wc.encode(entry.path.substr(parsed.root.length))
+ }
+
+ if (path.isAbsolute(entry.path))
+ entry.absolute = entry.path
+ else
+ entry.absolute = path.resolve(this.cwd, entry.path)
+
+ return true
+ }
+
+ [ONENTRY] (entry) {
+ if (!this[CHECKPATH](entry))
+ return entry.resume()
+
+ assert.equal(typeof entry.absolute, 'string')
+
+ switch (entry.type) {
+ case 'Directory':
+ case 'GNUDumpDir':
+ if (entry.mode)
+ entry.mode = entry.mode | 0o700
+
+ case 'File':
+ case 'OldFile':
+ case 'ContiguousFile':
+ case 'Link':
+ case 'SymbolicLink':
+ return this[CHECKFS](entry)
+
+ case 'CharacterDevice':
+ case 'BlockDevice':
+ case 'FIFO':
+ return this[UNSUPPORTED](entry)
+ }
+ }
+
+ [ONERROR] (er, entry) {
+ // Cwd has to exist, or else nothing works. That's serious.
+ // Other errors are warnings, which raise the error in strict
+ // mode, but otherwise continue on.
+ if (er.name === 'CwdError')
+ this.emit('error', er)
+ else {
+ this.warn(er.message, er)
+ this[UNPEND]()
+ entry.resume()
+ }
+ }
+
+ [MKDIR] (dir, mode, cb) {
+ mkdir(dir, {
+ uid: this.uid,
+ gid: this.gid,
+ processUid: this.processUid,
+ processGid: this.processGid,
+ umask: this.processUmask,
+ preserve: this.preservePaths,
+ unlink: this.unlink,
+ cache: this.dirCache,
+ cwd: this.cwd,
+ mode: mode
+ }, cb)
+ }
+
+ [DOCHOWN] (entry) {
+ // in preserve owner mode, chown if the entry doesn't match process
+ // in set owner mode, chown if setting doesn't match process
+ return this.preserveOwner &&
+ ( typeof entry.uid === 'number' && entry.uid !== this.processUid ||
+ typeof entry.gid === 'number' && entry.gid !== this.processGid )
+ ||
+ ( typeof this.uid === 'number' && this.uid !== this.processUid ||
+ typeof this.gid === 'number' && this.gid !== this.processGid )
+ }
+
+ [UID] (entry) {
+ return uint32(this.uid, entry.uid, this.processUid)
+ }
+
+ [GID] (entry) {
+ return uint32(this.gid, entry.gid, this.processGid)
+ }
+
+ [FILE] (entry) {
+ const mode = entry.mode & 0o7777 || this.fmode
+ const stream = new fsm.WriteStream(entry.absolute, {
+ mode: mode,
+ autoClose: false
+ })
+ stream.on('error', er => this[ONERROR](er, entry))
+
+ let actions = 1
+ const done = er => {
+ if (er) {
+ this[ONERROR](er, entry)
+ actions = 1
+ }
+
+ if (--actions === 0)
+ fs.close(stream.fd, _ => this[UNPEND]())
+ }
+
+ stream.on('finish', _ => {
+ if (entry.mtime && !this.noMtime) {
+ actions++
+ fs.futimes(stream.fd, entry.atime || new Date(), entry.mtime, done)
+ }
+
+ if (this[DOCHOWN](entry)) {
+ actions++
+ fs.fchown(stream.fd, this[UID](entry), this[GID](entry), done)
+ }
+
+ done()
+ })
+
+ entry.pipe(stream)
+ }
+
+ [DIRECTORY] (entry) {
+ const mode = entry.mode & 0o7777 || this.dmode
+ this[MKDIR](entry.absolute, mode, er => {
+ if (er)
+ return this[ONERROR](er, entry)
+
+ let actions = 1
+ const done = _ => {
+ if (--actions === 0) {
+ this[UNPEND]()
+ entry.resume()
+ }
+ }
+
+ if (entry.mtime && !this.noMtime) {
+ actions++
+ fs.utimes(entry.absolute, entry.atime || new Date(), entry.mtime, done)
+ }
+
+ if (this[DOCHOWN](entry)) {
+ actions++
+ fs.chown(entry.absolute, this[UID](entry), this[GID](entry), done)
+ }
+
+ done()
+ })
+ }
+
+ [UNSUPPORTED] (entry) {
+ this.warn('unsupported entry type: ' + entry.type, entry)
+ entry.resume()
+ }
+
+ [SYMLINK] (entry) {
+ this[LINK](entry, entry.linkpath, 'symlink')
+ }
+
+ [HARDLINK] (entry) {
+ this[LINK](entry, path.resolve(this.cwd, entry.linkpath), 'link')
+ }
+
+ [PEND] () {
+ this[PENDING]++
+ }
+
+ [UNPEND] () {
+ this[PENDING]--
+ this[MAYBECLOSE]()
+ }
+
+ [SKIP] (entry) {
+ this[UNPEND]()
+ entry.resume()
+ }
+
+ // check if a thing is there, and if so, try to clobber it
+ [CHECKFS] (entry) {
+ this[PEND]()
+ this[MKDIR](path.dirname(entry.absolute), this.dmode, er => {
+ if (er)
+ return this[ONERROR](er, entry)
+ fs.lstat(entry.absolute, (er, st) => {
+ if (st && (this.keep || this.newer && st.mtime > entry.mtime))
+ this[SKIP](entry)
+ else if (er || (entry.type === 'File' && !this.unlink && st.isFile()))
+ this[MAKEFS](null, entry)
+ else if (st.isDirectory()) {
+ if (entry.type === 'Directory') {
+ if (!entry.mode || (st.mode & 0o7777) === entry.mode)
+ this[MAKEFS](null, entry)
+ else
+ fs.chmod(entry.absolute, entry.mode, er => this[MAKEFS](er, entry))
+ } else
+ fs.rmdir(entry.absolute, er => this[MAKEFS](er, entry))
+ } else
+ fs.unlink(entry.absolute, er => this[MAKEFS](er, entry))
+ })
+ })
+ }
+
+ [MAKEFS] (er, entry) {
+ if (er)
+ return this[ONERROR](er, entry)
+
+ switch (entry.type) {
+ case 'File':
+ case 'OldFile':
+ case 'ContiguousFile':
+ return this[FILE](entry)
+
+ case 'Link':
+ return this[HARDLINK](entry)
+
+ case 'SymbolicLink':
+ return this[SYMLINK](entry)
+
+ case 'Directory':
+ case 'GNUDumpDir':
+ return this[DIRECTORY](entry)
+ }
+ }
+
+ [LINK] (entry, linkpath, link) {
+ // XXX: get the type ('file' or 'dir') for windows
+ fs[link](linkpath, entry.absolute, er => {
+ if (er)
+ return this[ONERROR](er, entry)
+ this[UNPEND]()
+ entry.resume()
+ })
+ }
+}
+
+class UnpackSync extends Unpack {
+ constructor (opt) {
+ super(opt)
+ }
+
+ [CHECKFS] (entry) {
+ const er = this[MKDIR](path.dirname(entry.absolute), this.dmode)
+ if (er)
+ return this[ONERROR](er, entry)
+ try {
+ const st = fs.lstatSync(entry.absolute)
+ if (this.keep || this.newer && st.mtime > entry.mtime)
+ return this[SKIP](entry)
+ else if (entry.type === 'File' && !this.unlink && st.isFile())
+ return this[MAKEFS](null, entry)
+ else {
+ try {
+ if (st.isDirectory()) {
+ if (entry.type === 'Directory') {
+ if (entry.mode && (st.mode & 0o7777) !== entry.mode)
+ fs.chmodSync(entry.absolute, entry.mode)
+ } else
+ fs.rmdirSync(entry.absolute)
+ } else
+ fs.unlinkSync(entry.absolute)
+ return this[MAKEFS](null, entry)
+ } catch (er) {
+ return this[ONERROR](er, entry)
+ }
+ }
+ } catch (er) {
+ return this[MAKEFS](null, entry)
+ }
+ }
+
+ [FILE] (entry) {
+ const mode = entry.mode & 0o7777 || this.fmode
+
+ const oner = er => {
+ try { fs.closeSync(fd) } catch (_) {}
+ this[ONERROR](er, entry)
+ }
+
+ let stream
+ let fd
+ try {
+ fd = fs.openSync(entry.absolute, 'w', mode)
+ } catch (er) {
+ return oner(er)
+ }
+
+ entry.on('data', chunk => {
+ try {
+ fs.writeSync(fd, chunk, 0, chunk.length)
+ } catch (er) {
+ oner(er)
+ }
+ })
+
+ entry.on('end', _ => {
+ try {
+ if (entry.mtime && !this.noMtime)
+ fs.futimesSync(fd, entry.atime || new Date(), entry.mtime)
+
+ if (this[DOCHOWN](entry))
+ fs.fchownSync(fd, this[UID](entry), this[GID](entry))
+
+ fs.closeSync(fd)
+ } catch (er) {
+ return oner(er)
+ }
+ })
+
+ }
+
+ [DIRECTORY] (entry) {
+ const mode = entry.mode & 0o7777 || this.dmode
+ const er = this[MKDIR](entry.absolute, mode)
+ if (er)
+ return this[ONERROR](er, entry)
+ if (entry.mtime && !this.noMtime) {
+ try {
+ fs.utimesSync(entry.absolute, entry.atime || new Date(), entry.mtime)
+ } catch (er) {}
+ }
+ if (this[DOCHOWN](entry)) {
+ try {
+ fs.chownSync(entry.absolute, this[UID](entry), this[GID](entry))
+ } catch (er) {}
+ }
+ entry.resume()
+ }
+
+ [MKDIR] (dir, mode) {
+ try {
+ return mkdir.sync(dir, {
+ uid: this.uid,
+ gid: this.gid,
+ processUid: this.processUid,
+ processGid: this.processGid,
+ umask: this.processUmask,
+ preserve: this.preservePaths,
+ unlink: this.unlink,
+ cache: this.dirCache,
+ cwd: this.cwd,
+ mode: mode
+ })
+ } catch (er) {
+ return er
+ }
+ }
+
+ [LINK] (entry, linkpath, link) {
+ try {
+ fs[link + 'Sync'](linkpath, entry.absolute)
+ entry.resume()
+ } catch (er) {
+ return this[ONERROR](er, entry)
+ }
+ }
+}
+
+Unpack.Sync = UnpackSync
+module.exports = Unpack
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/update.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/update.js.html
new file mode 100644
index 0000000..531cdde
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/update.js.html
@@ -0,0 +1,173 @@
+
+
+
+ Code coverage report for tar/lib/update.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 20/20
+
+
+ 100%
+ Branches
+ 15/15
+
+
+ 100%
+ Functions
+ 4/4
+
+
+ 100%
+ Lines
+ 20/20
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+
+
+
+2x
+2x
+
+
+2x
+36x
+
+36x
+1x
+
+35x
+1x
+
+34x
+1x
+
+33x
+
+33x
+33x
+
+
+2x
+33x
+
+33x
+32x
+
+33x
+2x
+24x
+
+ 'use strict'
+
+// tar -u
+
+const hlo = require('./high-level-opt.js')
+const r = require('./replace.js')
+// just call tar.r with the filter and mtimeCache
+
+const u = module.exports = (opt_, files, cb) => {
+ const opt = hlo(opt_)
+
+ if (!opt.file)
+ throw new TypeError('file is required')
+
+ if (opt.gzip)
+ throw new TypeError('cannot append to compressed archives')
+
+ if (!files || !Array.isArray(files) || !files.length)
+ throw new TypeError('no files or directories specified')
+
+ files = Array.from(files)
+
+ mtimeFilter(opt)
+ return r(opt, files, cb)
+}
+
+const mtimeFilter = opt => {
+ const filter = opt.filter
+
+ if (!opt.mtimeCache)
+ opt.mtimeCache = new Map()
+
+ opt.filter = filter ? (path, stat) =>
+ filter(path, stat) && !(opt.mtimeCache.get(path) > stat.mtime)
+ : (path, stat) => !(opt.mtimeCache.get(path) > stat.mtime)
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/warn-mixin.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/warn-mixin.js.html
new file mode 100644
index 0000000..99aa9f3
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/warn-mixin.js.html
@@ -0,0 +1,107 @@
+
+
+
+ Code coverage report for tar/lib/warn-mixin.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 9/9
+
+
+ 100%
+ Branches
+ 4/4
+
+
+ 100%
+ Functions
+ 2/2
+
+
+ 100%
+ Lines
+ 8/8
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+27x
+
+333x
+184x
+149x
+2x
+
+147x
+147x
+147x
+
+
+
+ 'use strict'
+module.exports = Base => class extends Base {
+ warn (msg, data) {
+ if (!this.strict)
+ this.emit('warn', msg, data)
+ else if (data instanceof Error)
+ this.emit('error', data)
+ else {
+ const er = new Error(msg)
+ er.data = data
+ this.emit('error', er)
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/winchars.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/winchars.js.html
new file mode 100644
index 0000000..8e9fb65
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/winchars.js.html
@@ -0,0 +1,134 @@
+
+
+
+ Code coverage report for tar/lib/winchars.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+ Statements
+ 12/12
+
+
+ 100%
+ Branches
+ 0/0
+
+
+ 100%
+ Functions
+ 7/7
+
+
+ 100%
+ Lines
+ 8/8
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+
+
+
+
+9x
+
+
+
+
+
+
+
+9x
+45x
+
+45x
+45x
+
+9x
+30x
+20x
+
+ 'use strict'
+
+// When writing files on Windows, translate the characters to their
+// 0xf000 higher-encoded versions.
+
+const raw = [
+ '|',
+ '<',
+ '>',
+ '?',
+ ':'
+]
+
+const win = raw.map(char =>
+ String.fromCharCode(0xf000 + char.charCodeAt(0)))
+
+const toWin = new Map(raw.map((char, i) => [char, win[i]]))
+const toRaw = new Map(win.map((char, i) => [char, raw[i]]))
+
+module.exports = {
+ encode: s => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s),
+ decode: s => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s)
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tar/coverage/lcov-report/tar/lib/write-entry.js.html b/node_modules/tar/coverage/lcov-report/tar/lib/write-entry.js.html
new file mode 100644
index 0000000..ba22b99
--- /dev/null
+++ b/node_modules/tar/coverage/lcov-report/tar/lib/write-entry.js.html
@@ -0,0 +1,1268 @@
+
+
+
+ Code coverage report for tar/lib/write-entry.js
+
+
+
+
+
+
+
+
+
+
+
+
+ 99.53%
+ Statements
+ 213/214
+
+
+ 97.87%
+ Branches
+ 184/188
+
+
+ 100%
+ Functions
+ 31/31
+
+
+ 99.53%
+ Lines
+ 210/211
+
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+6x
+6x
+6x
+6x
+6x
+6x
+
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+6x
+
+6x
+
+6570x
+6570x
+6570x
+1x
+6569x
+
+6569x
+
+6569x
+6569x
+6569x
+6569x
+6569x
+6569x
+6569x
+6569x
+6569x
+6569x
+
+6569x
+6515x
+
+6569x
+
+
+4x
+4x
+2x
+
+
+6567x
+6567x
+2x
+2x
+
+
+6567x
+
+6567x
+1x
+
+6567x
+6513x
+
+54x
+
+
+
+34x
+34x
+1x
+33x
+
+
+
+
+6566x
+6566x
+6566x
+902x
+6566x
+6566x
+6566x
+
+
+
+6566x
+5664x
+867x
+34x
+
+1x
+
+
+
+
+6563x
+4x
+
+6563x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6563x
+17x
+
+
+
+
+
+
+
+
+
+
+
+
+
+6563x
+
+
+
+867x
+859x
+867x
+867x
+867x
+
+
+
+32x
+32x
+1x
+31x
+
+
+
+
+32x
+32x
+32x
+
+
+
+1x
+1x
+1x
+1x
+1x
+
+
+
+5664x
+7x
+7x
+2x
+2x
+1x
+
+6x
+
+
+5663x
+5663x
+42x
+
+5621x
+
+
+
+5568x
+5568x
+2x
+5566x
+
+
+
+
+5617x
+5617x
+5617x
+5617x
+
+
+
+7336x
+7336x
+1x
+7335x
+
+
+
+
+5566x
+
+
+
+7393x
+2x
+2x
+2x
+2x
+2x
+
+
+
+7392x
+5614x
+1700449x
+1700449x
+1700449x
+
+
+
+7392x
+
+7392x
+7392x
+7392x
+7392x
+
+7392x
+
+7392x
+5614x
+2x
+5614x
+5614x
+5614x
+
+
+1778x
+1754x
+1754x
+
+1778x
+1778x
+
+
+
+
+
+99x
+
+
+
+20x
+
+
+
+2x
+
+
+
+53x
+
+
+
+59x
+59x
+59x
+58x
+57x
+
+59x
+2x
+
+
+
+
+51x
+
+
+
+6x
+
+33x
+33x
+33x
+33x
+33x
+33x
+33x
+
+33x
+33x
+33x
+
+
+33x
+33x
+33x
+26x
+33x
+33x
+33x
+33x
+33x
+33x
+33x
+33x
+33x
+
+33x
+27x
+
+33x
+2x
+2x
+
+
+
+1x
+
+
+32x
+32x
+
+32x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+32x
+14x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+32x
+32x
+
+
+
+52x
+52x
+1x
+51x
+51x
+
+
+
+29x
+22x
+29x
+
+
+
+6x
+6x
+
+6x
+6566x
+
+
+
+
+6x
+ 'use strict'
+const MiniPass = require('minipass')
+const Pax = require('./pax.js')
+const Header = require('./header.js')
+const ReadEntry = require('./read-entry.js')
+const fs = require('fs')
+const path = require('path')
+
+const types = require('./types.js')
+const maxReadSize = 16 * 1024 * 1024
+const PROCESS = Symbol('process')
+const FILE = Symbol('file')
+const DIRECTORY = Symbol('directory')
+const SYMLINK = Symbol('symlink')
+const HARDLINK = Symbol('hardlink')
+const HEADER = Symbol('header')
+const READ = Symbol('read')
+const LSTAT = Symbol('lstat')
+const ONLSTAT = Symbol('onlstat')
+const ONREAD = Symbol('onread')
+const ONREADLINK = Symbol('onreadlink')
+const OPENFILE = Symbol('openfile')
+const ONOPENFILE = Symbol('onopenfile')
+const CLOSE = Symbol('close')
+const warner = require('./warn-mixin.js')
+const winchars = require('./winchars.js')
+
+const WriteEntry = warner(class WriteEntry extends MiniPass {
+ constructor (p, opt) {
+ opt = opt || {}
+ super(opt)
+ if (typeof p !== 'string')
+ throw new TypeError('path is required')
+ this.path = p
+ // suppress atime, ctime, uid, gid, uname, gname
+ this.portable = !!opt.portable
+ // until node has builtin pwnam functions, this'll have to do
+ this.myuid = process.getuid && process.getuid()
+ this.myuser = process.env.USER || ''
+ this.maxReadSize = opt.maxReadSize || maxReadSize
+ this.linkCache = opt.linkCache || new Map()
+ this.statCache = opt.statCache || new Map()
+ this.preservePaths = !!opt.preservePaths
+ this.cwd = opt.cwd || process.cwd()
+ this.strict = !!opt.strict
+ this.noPax = !!opt.noPax
+ this.noMtime = !!opt.noMtime
+
+ if (typeof opt.onwarn === 'function')
+ this.on('warn', opt.onwarn)
+
+ if (!this.preservePaths && path.win32.isAbsolute(p)) {
+ // absolutes on posix are also absolutes on win32
+ // so we only need to test this one to get both
+ const parsed = path.win32.parse(p)
+ this.warn('stripping ' + parsed.root + ' from absolute path', p)
+ this.path = p.substr(parsed.root.length)
+ }
+
+ this.win32 = !!opt.win32 || process.platform === 'win32'
+ if (this.win32) {
+ this.path = winchars.decode(this.path.replace(/\\/g, '/'))
+ p = p.replace(/\\/g, '/')
+ }
+
+ this.absolute = opt.absolute || path.resolve(this.cwd, p)
+
+ if (this.path === '')
+ this.path = './'
+
+ if (this.statCache.has(this.absolute))
+ this[ONLSTAT](this.statCache.get(this.absolute))
+ else
+ this[LSTAT]()
+ }
+
+ [LSTAT] () {
+ fs.lstat(this.absolute, (er, stat) => {
+ if (er)
+ return this.emit('error', er)
+ this[ONLSTAT](stat)
+ })
+ }
+
+ [ONLSTAT] (stat) {
+ this.statCache.set(this.absolute, stat)
+ this.stat = stat
+ if (!stat.isFile())
+ stat.size = 0
+ this.type = getType(stat)
+ this.emit('stat', stat)
+ this[PROCESS]()
+ }
+
+ [PROCESS] () {
+ switch (this.type) {
+ case 'File': return this[FILE]()
+ case 'Directory': return this[DIRECTORY]()
+ case 'SymbolicLink': return this[SYMLINK]()
+ // unsupported types are ignored.
+ default: return this.end()
+ }
+ }
+
+ [HEADER] () {
+ if (this.type === 'Directory' && this.portable)
+ this.noMtime = true
+
+ this.header = new Header({
+ path: this.path,
+ linkpath: this.linkpath,
+ // only the permissions and setuid/setgid/sticky bitflags
+ // not the higher-order bits that specify file type
+ mode: this.stat.mode & 0o7777,
+ uid: this.portable ? null : this.stat.uid,
+ gid: this.portable ? null : this.stat.gid,
+ size: this.stat.size,
+ mtime: this.noMtime ? null : this.stat.mtime,
+ type: this.type,
+ uname: this.portable ? null :
+ this.stat.uid === this.myuid ? this.myuser : '',
+ atime: this.portable ? null : this.stat.atime,
+ ctime: this.portable ? null : this.stat.ctime
+ })
+
+ if (this.header.encode() && !this.noPax)
+ this.write(new Pax({
+ atime: this.portable ? null : this.header.atime,
+ ctime: this.portable ? null : this.header.ctime,
+ gid: this.portable ? null : this.header.gid,
+ mtime: this.noMtime ? null : this.header.mtime,
+ path: this.path,
+ linkpath: this.linkpath,
+ size: this.header.size,
+ uid: this.portable ? null : this.header.uid,
+ uname: this.portable ? null : this.header.uname,
+ dev: this.portable ? null : this.stat.dev,
+ ino: this.portable ? null : this.stat.ino,
+ nlink: this.portable ? null : this.stat.nlink
+ }).encode())
+ this.write(this.header.block)
+ }
+
+ [DIRECTORY] () {
+ if (this.path.substr(-1) !== '/')
+ this.path += '/'
+ this.stat.size = 0
+ this[HEADER]()
+ this.end()
+ }
+
+ [SYMLINK] () {
+ fs.readlink(this.absolute, (er, linkpath) => {
+ if (er)
+ return this.emit('error', er)
+ this[ONREADLINK](linkpath)
+ })
+ }
+
+ [ONREADLINK] (linkpath) {
+ this.linkpath = linkpath
+ this[HEADER]()
+ this.end()
+ }
+
+ [HARDLINK] (linkpath) {
+ this.type = 'Link'
+ this.linkpath = path.relative(this.cwd, linkpath)
+ this.stat.size = 0
+ this[HEADER]()
+ this.end()
+ }
+
+ [FILE] () {
+ if (this.stat.nlink > 1) {
+ const linkKey = this.stat.dev + ':' + this.stat.ino
+ if (this.linkCache.has(linkKey)) {
+ const linkpath = this.linkCache.get(linkKey)
+ if (linkpath.indexOf(this.cwd) === 0)
+ return this[HARDLINK](linkpath)
+ }
+ this.linkCache.set(linkKey, this.absolute)
+ }
+
+ this[HEADER]()
+ if (this.stat.size === 0)
+ return this.end()
+
+ this[OPENFILE]()
+ }
+
+ [OPENFILE] () {
+ fs.open(this.absolute, 'r', (er, fd) => {
+ if (er)
+ return this.emit('error', er)
+ this[ONOPENFILE](fd)
+ })
+ }
+
+ [ONOPENFILE] (fd) {
+ const blockLen = 512 * Math.ceil(this.stat.size / 512)
+ const bufLen = Math.min(blockLen, this.maxReadSize)
+ const buf = Buffer.allocUnsafe(bufLen)
+ this[READ](fd, buf, 0, buf.length, 0, this.stat.size, blockLen)
+ }
+
+ [READ] (fd, buf, offset, length, pos, remain, blockRemain) {
+ fs.read(fd, buf, offset, length, pos, (er, bytesRead) => {
+ if (er)
+ return this[CLOSE](fd, _ => this.emit('error', er))
+ this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead)
+ })
+ }
+
+ [CLOSE] (fd, cb) {
+ fs.close(fd, cb)
+ }
+
+ [ONREAD] (fd, buf, offset, length, pos, remain, blockRemain, bytesRead) {
+ if (bytesRead <= 0 && remain > 0) {
+ const er = new Error('unexpected EOF')
+ er.path = this.absolute
+ er.syscall = 'read'
+ er.code = 'EOF'
+ this.emit('error', er)
+ }
+
+ // null out the rest of the buffer, if we could fit the block padding
+ if (bytesRead === remain) {
+ for (let i = bytesRead; i < length && bytesRead < blockRemain; i++) {
+ buf[i + offset] = 0
+ bytesRead ++
+ remain ++
+ }
+ }
+
+ const writeBuf = offset === 0 && bytesRead === buf.length ?
+ buf : buf.slice(offset, offset + bytesRead)
+ remain -= bytesRead
+ blockRemain -= bytesRead
+ pos += bytesRead
+ offset += bytesRead
+
+ this.write(writeBuf)
+
+ if (!remain) {
+ if (blockRemain)
+ this.write(Buffer.alloc(blockRemain))
+ this.end()
+ this[CLOSE](fd, _ => _)
+ return
+ }
+
+ if (offset >= length) {
+ buf = Buffer.allocUnsafe(length)
+ offset = 0
+ }
+ length = buf.length - offset
+ this[READ](fd, buf, offset, length, pos, remain, blockRemain)
+ }
+})
+
+class WriteEntrySync extends WriteEntry {
+ constructor (path, opt) {
+ super(path, opt)
+ }
+
+ [LSTAT] () {
+ this[ONLSTAT](fs.lstatSync(this.absolute))
+ }
+
+ [SYMLINK] () {
+ this[ONREADLINK](fs.readlinkSync(this.absolute))
+ }
+
+ [OPENFILE] () {
+ this[ONOPENFILE](fs.openSync(this.absolute, 'r'))
+ }
+
+ [READ] (fd, buf, offset, length, pos, remain, blockRemain) {
+ let threw = true
+ try {
+ const bytesRead = fs.readSync(fd, buf, offset, length, pos)
+ this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead)
+ threw = false
+ } finally {
+ if (threw)
+ try { this[CLOSE](fd) } catch (er) {}
+ }
+ }
+
+ [CLOSE] (fd) {
+ fs.closeSync(fd)
+ }
+}
+
+const WriteEntryTar = warner(class WriteEntryTar extends MiniPass {
+ constructor (readEntry, opt) {
+ opt = opt || {}
+ super(opt)
+ this.preservePaths = !!opt.preservePaths
+ this.portable = !!opt.portable
+ this.strict = !!opt.strict
+ this.noPax = !!opt.noPax
+ this.noMtime = !!opt.noMtime
+
+ this.readEntry = readEntry
+ this.type = readEntry.type
+ I if (this.type === 'Directory' && this.portable)
+ this.noMtime = true
+
+ this.path = readEntry.path
+ this.mode = readEntry.mode
+ if (this.mode)
+ this.mode = this.mode & 0o7777
+ this.uid = this.portable ? null : readEntry.uid
+ this.gid = this.portable ? null : readEntry.gid
+ this.uname = this.portable ? null : readEntry.uname
+ this.gname = this.portable ? null : readEntry.gname
+ this.size = readEntry.size
+ this.mtime = this.noMtime ? null : readEntry.mtime
+ this.atime = this.portable ? null : readEntry.atime
+ this.ctime = this.portable ? null : readEntry.ctime
+ this.linkpath = readEntry.linkpath
+
+ if (typeof opt.onwarn === 'function')
+ this.on('warn', opt.onwarn)
+
+ if (path.isAbsolute(this.path) && !this.preservePaths) {
+ const parsed = path.parse(this.path)
+ this.warn(
+ 'stripping ' + parsed.root + ' from absolute path',
+ this.path
+ )
+ this.path = this.path.substr(parsed.root.length)
+ }
+
+ this.remain = readEntry.size
+ this.blockRemain = readEntry.startBlockSize
+
+ this.header = new Header({
+ path: this.path,
+ linkpath: this.linkpath,
+ // only the permissions and setuid/setgid/sticky bitflags
+ // not the higher-order bits that specify file type
+ mode: this.mode,
+ uid: this.portable ? null : this.uid,
+ gid: this.portable ? null : this.gid,
+ size: this.size,
+ mtime: this.noMtime ? null : this.mtime,
+ type: this.type,
+ uname: this.portable ? null : this.uname,
+ atime: this.portable ? null : this.atime,
+ ctime: this.portable ? null : this.ctime
+ })
+
+ if (this.header.encode() && !this.noPax)
+ super.write(new Pax({
+ atime: this.portable ? null : this.atime,
+ ctime: this.portable ? null : this.ctime,
+ gid: this.portable ? null : this.gid,
+ mtime: this.noMtime ? null : this.mtime,
+ path: this.path,
+ linkpath: this.linkpath,
+ size: this.size,
+ uid: this.portable ? null : this.uid,
+ uname: this.portable ? null : this.uname,
+ dev: this.portable ? null : this.readEntry.dev,
+ ino: this.portable ? null : this.readEntry.ino,
+ nlink: this.portable ? null : this.readEntry.nlink
+ }).encode())
+
+ super.write(this.header.block)
+ readEntry.pipe(this)
+ }
+
+ write (data) {
+ const writeLen = data.length
+ if (writeLen > this.blockRemain)
+ throw new Error('writing more to entry than is appropriate')
+ this.blockRemain -= writeLen
+ return super.write(data)
+ }
+
+ end () {
+ if (this.blockRemain)
+ this.write(Buffer.alloc(this.blockRemain))
+ return super.end()
+ }
+})
+
+WriteEntry.Sync = WriteEntrySync
+WriteEntry.Tar = WriteEntryTar
+
+const getType = stat =>
+ stat.isFile() ? 'File'
+ : stat.isDirectory() ? 'Directory'
+ : stat.isSymbolicLink() ? 'SymbolicLink'
+ : 'Unsupported'
+
+module.exports = WriteEntry
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/ua-parser-js/dist/ua-parser.html b/node_modules/ua-parser-js/dist/ua-parser.html
new file mode 100644
index 0000000..1e530bb
--- /dev/null
+++ b/node_modules/ua-parser-js/dist/ua-parser.html
@@ -0,0 +1 @@
+
diff --git a/node_modules/uglify-js/tools/domprops.html b/node_modules/uglify-js/tools/domprops.html
new file mode 100644
index 0000000..e217b17
--- /dev/null
+++ b/node_modules/uglify-js/tools/domprops.html
@@ -0,0 +1,456 @@
+
+
+
+
+
+
diff --git a/summer-of-code.html b/summer-of-code.html
new file mode 100644
index 0000000..7cb0f5a
--- /dev/null
+++ b/summer-of-code.html
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+ F4PGA
+
+
+
+
+ CHIPS Alliance F4PGA project GSoC 2022 contribution guidelines
+Step 0 - Prior Reading
+Firstly, please read the Google Summer of Code
+Contributor Manual . It contains a
+lot of helpful information about the program and about participating as a
+contributor in Google Summer of Code.
+Secondly, please read the Google Summer of Code
+FAQ .
+It contains lots of helpful information about the program, specific deadlines
+and how things will run.
+Step 1 - Finding an Idea
+Due to the F4PGA project being made up of
+many smaller projects (and as our list of supported platforms grows, that's not even the full list), it can be tricky to work out which projects match your skills. We have a number
+of useful tools to help match you with projects.
+As selecting a project or understanding an idea can be hard, we recommend you
+come join us on IRC and talk to us further about them. Good contributors engage with the community
+even before GSoC starts!
+Idea Issue Tracker
+The F4PGA project has a
+dedicated issue tracker
+that lists tasks that are suitable to be completed as part of GSoC.
+Can I work on XXX?
+If an idea is listed in our Idea issue tracker , it's probably
+a good one!
+What should I work on?
+What do you like doing? What interests you? You know better what projects are
+going to keep you interested for 3 months than we do.
+Is project XXX important?
+For GSoC the most important factor is the application's quality! If the
+strongest application submitted is for a lower priority project, it is much more likely to
+be accepted - even if poorer applications exist for higher priority projects.
+Step 2 - Writing A Proposal
+Feel free to submit multiple proposals.
+The following links detail general ways to write a successful Summer of Code Proposal:
+
+Tips
+Having reviewed many proposals in the past years, there are a couple of things that many of them seem to
+be lacking. This list of tips should help you avoid common mistakes and make
+your proposals better.
+Tip 1 - Include IRC Nickname
+Include your IRC nick as the first thing in the detailed description.
+During Summer of Code hundreds of new people turn up, keeping records straight
+can become a bit of a challenge. Especially when your IRC nick, email address and real name have
+no resemblance.
+Tip 2 - Project First , Resume Second
+We are most interested in your proposal for the project. If your proposal looks
+good, we may then want to look at your resume / personal description.
+Hence, include the project information first and your personal stuff second.
+Tip 3 - Include assertive Functional Milestones
+One of the best ways to show that you are a serious contributor is to include
+proper assertive milestones. These should be single sentences which say
+something like:
+
+The AI will issue move orders.
+The client will be able to display planets in a 3d fashion.
+The ruleset will allow tpclient-pywx to see planets.
+The metaserver will display a starmap generated from starmapper.
+
+The keyword here is will, it is assertive.
+These milestones should have dates associated with them. We understand that you
+are new to the project and that these dates will change as the project
+progresses. You will not fail just because a milestone had to be moved a week
+or dropped altogether.
+The milestones should be testable and specific. Here are some examples which
+are not acceptable.
+
+The AI framework will be finished.
+The star map will work.
+The ruleset will be balanced.
+
+Negative milestones are hard to test, avoid them if possible. For example "The
+AI will not issue wrong orders" is almost impossible to prove and not all that
+useful. More often negative statements are goals not milestones.
+These milestones will be hard to figure out, being able to talk about specifics
+shows that you have done your research and know your stuff. Have confidence in your
+own abilities!
+Keep your milestones small, they should be doable in less than a week's full
+time work. The smaller (and more specific) they are, the harder it will be to
+get behind on.
+Talk to the mentors about your milestones, they have a huge amount of knowledge
+about what is realistic and will be happy to help you refine the details.
+Tip 4 - We are not mind readers
+Anything which is not linked to from your proposal effectively does not
+exist. I'm afraid we cannot (yet) read your mind.
+It is unlikely that we will remember that IRC conversation we had about XYZ.
+Other mentors may not have seen that conversation either.
+If you have thought about a certain way to do something, tell us - even if you
+decided that it was not feasible. If you had an important IRC conversation
+which resulted in changing the way you think, link to the logs. If a web page
+you've been reading proved influential, share with us!
+Tip 5 - Submit now!
+Do not submit last minute as you won't have time to update your
+proposal based on feedback. There is still plenty of time for mentors to give
+feedback and for you to update your proposal. Plan ahead!
+Tip 6 - Make your application public
+Having a public application means not only can mentors give you feedback but
+other contributors and the general community can, too!
+Using a wiki is a good idea because it lets us look at the history of how your
+proposal has evolved. It also means you can have formatting, making it easier to
+read.
+Tip 7 - Splitting applications which are too long
+Google limits the text length you can submit for your detailed description.
+This can be quite limiting if you have some detailed information or pseudo code.
+Hence, it is recommended that you produce two versions of your application.
+A "cut back" version which fits into the character limit. This should be all
+the very important bits of your application. You must include your functional
+milestones in this section. There should be enough 'meat' in this section to
+convince us to look at your further URL.
+The URL in the document should link to your full proposal. Feel free to add
+things like pseudo code, design information or anything else which you feel is
+relevant.
+The extended proposal to which you will be linking should also be included in your complete
+Google application. Duplicated text should be clearly marked in a different
+color, ensure it remains readable. We will not be able to jump between documents back and forth,
+so make sure the extended proposal is self-contained.
+Remember, quality is better than quantity!
+
+
+Selection Criteria
+The following might give you an indication of some of the things we are looking for.
+There is always a subjective element to judging applications, but we believe that
+by trying to quantify the decision process, we're making it easier for people to understand why
+their application was or was not accepted.
+
+Proposal is longer than a few sentences. - We need some 'meat' in the proposal in order to even consider it.
+Proposer has contacted us prior to the submission. - This demonstrates a definite interest in F4PGA and proves your ability to communicate with us.
+Proposer knows the appropriate programming language(s).
+Proposer shows evidence of being able to create software. - Our goal is to help programmers become good at Open Source, not to teach non-programmers how to program. However, we are willing to help people develop their programming skills.
+Proposal is well written. - While we don't expect perfect English, we do expect that the proposer took time to spell check, proofread it, organize it logically, and use comprehensible grammar.
+Proposal demonstrates understanding of the subject matter. - We expect the proposer to do some research, ask questions, and gain some understanding of the project they're proposing. This gives us confidence that they'll be able to complete the project successfully.
+Proposal shows creativity. We like to see someone thinking outside the box, including proposing ideas for projects we hadn't listed.
+Proposal is the only submission for the given task. - Many proposals focus on the same few tasks, so if you're the only person proposing to do a given project, that weighs in your favor.
+Proposal shows implementation planning. - If the author has broken the work out into a task list, it shows that they know what they'll be doing.
+Proposal scope is realistic. - 12 weeks will go by fast. Proposals that promise too much are unlikely to be completed in a timely fashion.
+Proposal shows motivation. - While it's important to describe the project in detail and show us that you have the necessary skills, do not forget to communicate your motivation, i.e. why you want to work with us on this particular project.
+
+The following are conditions that automatically result in rejection:
+
+Group project proposed. Google has specified that groups MAY NOT participate. Individuals only.
+Proposer must be at least 18 years old at time of registration.
+Proposer must be eligible to work in their country of residence during the duration of the program.
+Proposer must be a resident of a country not currently embargoed by the United States.
+
+Step 4 - Fixing your first bug
+While not required, it is highly recommended that GSoC contributors try and fix
+at least one small bug before the mentors finish reviewing applications.
+Most F4PGA projects have a number of small tasks marked with the 'good first issue label'. These problems/improvements are generally smaller and designed to be easy to get started with.
+Submitting an enhancement or bug fix shows that you have understood the project enough to get things set up.
+How to ask for help
+Google Summer of Code will require you to work independently and hence showing
+independent investigation and troubleshooting skills is a must . We
+definitely encourage asking questions of the mentors, but you must demonstrate
+having researched the question.
+Some good pages to look for tips about writing good questions can be found below:
+
+Often the best way to ask questions is to start writing your Google Summer of Code proposal as documented in the Writing Proposals section and finding out what areas you are getting stuck at.
+
+Where to Ask Questions
+
+
+Frequently Asked Questions (FAQ)
+Can I work on project XXX?
+Yes!
+Can you please help me?
+Please ask more specific questions. What is it you don't understand? What have you
+read so far? Tell us about yourself.
+See the How to ask for help section above.
+What should I work on?
+What do you like doing? What interests you? You know better what projects are
+going to keep you interested for 3 months than we do.
+Is project XXX important?
+For GSoC the most important factor is the application's quality! If the strongest
+application submitted is for a lower priority project, it is much more likely to be
+accepted - even if poorer applications exist for higher priority projects.
+What should I do next?
+Start writing your proposal as laid out in the Writing
+Proposals section. This will help you ask better
+questions, too!
+
+As developer time is limited, we ask everyone post their messages to the public
+mailing list or IRC channel (read
+http://www.catb.org/esr/faqs/smart-questions.html#noprivate for a more detailed
+explanation).
+Thanks
+We would like to thank the following:
+
+
+
+
+
+
\ No newline at end of file