New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

perfect-arrows

Package Overview
Dependencies
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

perfect-arrows - npm Package Compare versions

Comparing version 0.2.1 to 0.2.2

4

CHANGELOG.md

@@ -0,1 +1,5 @@

# 0.2.2
- Fixes default `padStart` for box to box arrows.
# 0.2.1

@@ -2,0 +6,0 @@

2

dist/perfect-arrows.cjs.development.js

@@ -557,3 +557,3 @@ 'use strict';

_options$padStart = _options.padStart,
padStart = _options$padStart === void 0 ? 20 : _options$padStart,
padStart = _options$padStart === void 0 ? 0 : _options$padStart,
_options$padEnd = _options.padEnd,

@@ -560,0 +560,0 @@ padEnd = _options$padEnd === void 0 ? 20 : _options$padEnd,

@@ -1,2 +0,2 @@

"use strict";function t(t,r,n,a){void 0===a&&(a=!1);var i=n[0]<n[1]?[n[0],n[1]]:[n[1],n[0]],o=i[0],u=i[1],h=n[0]+(t-r[0])/(r[1]-n[0])*(n[1]-n[0]);if(a){if(h<o)return o;if(h>u)return u}return h}function r(t,r,n,a,i){var o=Math.sin(i),u=Math.cos(i),h=t-n,v=r-a;return[h*u-v*o+n,h*o+v*u+a]}function n(t,r,n,a){return Math.hypot(a-r,n-t)}function a(t,r,n,a){return Math.atan2(a-r,n-t)}function i(t,r,n,a){return[Math.cos(n)*a+t,Math.sin(n)*a+r]}function o(t,r,n,a,i){return void 0===i&&(i=.5),[t+(n-t)*i,r+(a-r)*i]}function u(t,r){return void 0===r&&(r=8),Math.floor(r*(.5+t/(2*Math.PI)%r))}function h(t,r,n,a){return Math.abs((n-t)/2/((a-r)/2))}function v(t,r,n,a,i,o,u,h){for(var v=[],f=0,M=[[i,o,i+u,o],[i+u,o,i+u,o+h],[i+u,o+h,i,o+h],[i,o+h,i,o]];f<M.length;f++){var c=M[f],d=e(c[0],c[1],c[2],c[3],t,r,n,a);d&&v.push(d)}return v}function e(t,r,n,a,i,o,u,h){var v=(h-o)*(n-t)-(u-i)*(a-r);if(0!==v){var e=((u-i)*(r-o)-(h-o)*(t-i))/v,f=((n-t)*(r-o)-(a-r)*(t-i))/v;return e>=0&&e<=1&&f>=0&&f<=1?[t+e*(n-t),r+e*(a-r)]:void 0}}function f(t,r,n,i,o,u,h,v,f){var M=o+h,c=u+v,d=o+f,s=u+f,I=o+h-f,P=u+v-f,p=[[d,s,Math.PI,1.5*Math.PI],[I,s,1.5*Math.PI,2*Math.PI],[I,P,0,.5*Math.PI],[d,P,.5*Math.PI,Math.PI]],l=[];return[[o,P,o,s,o,u],[d,u,I,u,M,u],[M,s,M,P,M,c],[I,c,d,c,o,c]].forEach((function(o,u){var h=o[0],v=o[1],M=o[2],c=o[3],d=p[u],s=d[0],I=d[1],P=d[2],x=d[3];(function(t,r,n,a,i,o,u){var h,v,e,f,M,c,d,s,I=[o-a,u-i],P=[a-t,i-r];return h=I[0]*P[0]+I[1]*P[1],v=2*(I[0]*I[0]+I[1]*I[1]),h*=-2,e=Math.sqrt(h*h-2*v*(P[0]*P[0]+P[1]*P[1]-n*n)),isNaN(e)?[]:(M=(h+e)/v,d=[],s=[],c=[],(f=(h-e)/v)<=1&&f>=0&&(d[0]=a+I[0]*f,d[1]=i+I[1]*f,c[0]=d),M<=1&&M>=0&&(s[0]=a+I[0]*M,s[1]=i+I[1]*M,c[c.length]=s),c)})(s,I,f,t,r,n,i).filter((function(t){var r,n=(r=a(s,I,t[0],t[1]))-2*Math.PI*Math.floor(r/(2*Math.PI));return n>P&&n<x})).forEach((function(t){return l.push(t)}));var g=e(t,r,n,i,h,v,M,c);g&&l.push(g)})),l}function M(t,r,n,a,i,o,u,h){for(var v=[],e=0,f=[[i,o,i+u,o],[i+u,o,i+u,o+h],[i+u,o+h,i,o+h],[i,o+h,i,o]];e<f.length;e++){var M=f[e],d=c(t,r,n,a,M[0],M[1],M[2],M[3]);d&&v.push(d)}return v}function c(t,r,n,a,i,o,u,h){var v,e,f;if(a*(u-i)!=n*(h-o)&&0!=(f=n*(h-o)-a*(u-i))&&(e=((r-o)*n-(t-i)*a)/f,(v=((r-o)*(u-i)-(t-i)*(h-o))/f)>=0&&e>=0&&e<=1))return[t+v*n,r+v*a]}Object.defineProperty(exports,"__esModule",{value:!0}),exports.getArrow=function(v,e,f,M,c){void 0===c&&(c={});var d=c.bow,s=void 0===d?0:d,I=c.stretch,P=void 0===I?.5:I,p=c.stretchMin,l=void 0===p?0:p,x=c.stretchMax,g=void 0===x?420:x,m=c.padStart,b=void 0===m?0:m,w=c.padEnd,y=void 0===w?0:w,E=c.flip,A=void 0!==E&&E,B=c.straights,N=void 0===B||B,S=a(v,e,f,M),_=n(v,e,f,M),j=h(v,e,f,M);if(_<2*(b+y)||0===s&&0===P||N&&[0,1,Infinity].includes(j)){var q=Math.max(0,Math.min(_-b,b)),O=Math.max(0,Math.min(_-q,y)),T=i(v,e,S,q),k=T[0],z=T[1],C=i(f,M,S+Math.PI,O),D=C[0],F=C[1],G=o(k,z,D,F,.5);return[k,z,G[0],G[1],D,F,S,S,S]}var H=(u(S)%2==0?1:-1)*(A?-1:1),J=s+t(_,[l,g],[1,0],!0)*P,K=o(v,e,f,M,.5),L=K[0],Q=K[1],R=o(v,e,f,M,.5-J),U=R[0],V=R[1],W=r(U,V,L,Q,Math.PI/2*H),X=i(v,e,a(v,e,U=W[0],V=W[1]),b),Y=X[0],Z=X[1],$=i(f,M,a(f,M,U,V),y),tt=$[0],rt=$[1],nt=a(U,V,v,e),at=a(U,V,f,M),it=o(Y,Z,tt,rt,.5),ot=it[0],ut=it[1],ht=o(Y,Z,tt,rt,.5-J),vt=ht[0],et=ht[1],ft=r(vt,et,ot,ut,Math.PI/2*H),Mt=o(U,V,vt=ft[0],et=ft[1],.5);return[Y,Z,Mt[0],Mt[1],tt,rt,at,nt,S]},exports.getBoxToBoxArrow=function(e,c,d,s,I,P,p,l,x){var g,m,b,w;void 0===x&&(x={});var y=x.bow,E=void 0===y?0:y,A=x.stretch,B=void 0===A?.5:A,N=x.stretchMin,S=void 0===N?0:N,_=x.stretchMax,j=void 0===_?420:_,q=x.padStart,O=void 0===q?20:q,T=x.padEnd,k=void 0===T?20:T,z=x.flip,C=void 0!==z&&z,D=x.straights,F=void 0===D||D,G=e+d/2,H=c+s/2,J=I+p/2,K=P+l/2,L=e-O,Q=c-O,R=d+2*O,U=s+2*O,V=I-k,W=P-k,X=p+2*k,Y=l+2*k,Z=o(G,H,J,K,.5),$=Z[0],tt=Z[1],rt=a(G,H,J,K),nt=h(G,H,J,K),at=2*Math.min(R,U,X,Y),it=n(e,c,I,P),ot=at-it,ut=function(t,r,n,a,i,o,u,h){return!(t>=i+u||i>=t+n||r>=o+h||o>=r+a)}(L,Q,R,U,V,W,X,Y);if(F&&([0,1,Infinity].includes(nt)||G===J||H===K)&&!ut){var ht=v(G,H,J,K,L,Q,R,U)[0];g=ht[0],m=ht[1];var vt=v(G,H,J,K,V,W,X,Y)[0];return[g,m,$,tt,b=vt[0],w=vt[1],rt,rt+Math.PI,rt]}var et=(u(rt)%2==0?1:-1)*(C?-1:1),ft=t(it,[S,j],[1,0],!0),Mt=E+ft*B/2,ct=o(G,H,J,K,.5-Mt),dt=ct[0],st=ct[1],It=r(dt,st,$,tt,Math.PI/2*et);if(dt=It[0],st=It[1],ot>0){var Pt=i(dt,st,rt+Math.PI/2*-et,ot*Mt);dt=Pt[0],st=Pt[1]}var pt=f(G,H,dt,st,L,Q,R,U,O),lt=f(J,K,dt,st,V,W,X,Y,k);if(!pt[0]||!lt[0]||n(pt[0][0],pt[0][1],lt[0][0],lt[0][1])<O+k){var xt=function(t){return[Math.cos(t),Math.sin(t)]}(rt+Math.PI),gt=xt[0],mt=xt[1],bt=M(G,H,gt,mt,L,Q,R,U)[0];g=bt[0],m=bt[1];var wt=M(J,K,gt,mt,V,W,X,Y)[0];b=wt[0],w=wt[1],Mt=-1*(E+ft*B)}else{var yt=pt[0];g=yt[0],m=yt[1];var Et=lt[0];b=Et[0],w=Et[1],Mt=E+ft*B}var At=o(g,m,b,w,.5),Bt=At[0],Nt=At[1],St=o(g,m,b,w,.5-Mt),_t=r(dt=St[0],st=St[1],Bt,Nt,Math.PI/(2*et)),jt=a(dt=_t[0],st=_t[1],g,m);return[g,m,dt,st,b,w,a(dt,st,b,w),jt,rt]};
"use strict";function t(t,r,n,a){void 0===a&&(a=!1);var i=n[0]<n[1]?[n[0],n[1]]:[n[1],n[0]],o=i[0],u=i[1],h=n[0]+(t-r[0])/(r[1]-n[0])*(n[1]-n[0]);if(a){if(h<o)return o;if(h>u)return u}return h}function r(t,r,n,a,i){var o=Math.sin(i),u=Math.cos(i),h=t-n,v=r-a;return[h*u-v*o+n,h*o+v*u+a]}function n(t,r,n,a){return Math.hypot(a-r,n-t)}function a(t,r,n,a){return Math.atan2(a-r,n-t)}function i(t,r,n,a){return[Math.cos(n)*a+t,Math.sin(n)*a+r]}function o(t,r,n,a,i){return void 0===i&&(i=.5),[t+(n-t)*i,r+(a-r)*i]}function u(t,r){return void 0===r&&(r=8),Math.floor(r*(.5+t/(2*Math.PI)%r))}function h(t,r,n,a){return Math.abs((n-t)/2/((a-r)/2))}function v(t,r,n,a,i,o,u,h){for(var v=[],f=0,M=[[i,o,i+u,o],[i+u,o,i+u,o+h],[i+u,o+h,i,o+h],[i,o+h,i,o]];f<M.length;f++){var c=M[f],d=e(c[0],c[1],c[2],c[3],t,r,n,a);d&&v.push(d)}return v}function e(t,r,n,a,i,o,u,h){var v=(h-o)*(n-t)-(u-i)*(a-r);if(0!==v){var e=((u-i)*(r-o)-(h-o)*(t-i))/v,f=((n-t)*(r-o)-(a-r)*(t-i))/v;return e>=0&&e<=1&&f>=0&&f<=1?[t+e*(n-t),r+e*(a-r)]:void 0}}function f(t,r,n,i,o,u,h,v,f){var M=o+h,c=u+v,d=o+f,s=u+f,I=o+h-f,P=u+v-f,p=[[d,s,Math.PI,1.5*Math.PI],[I,s,1.5*Math.PI,2*Math.PI],[I,P,0,.5*Math.PI],[d,P,.5*Math.PI,Math.PI]],l=[];return[[o,P,o,s,o,u],[d,u,I,u,M,u],[M,s,M,P,M,c],[I,c,d,c,o,c]].forEach((function(o,u){var h=o[0],v=o[1],M=o[2],c=o[3],d=p[u],s=d[0],I=d[1],P=d[2],x=d[3];(function(t,r,n,a,i,o,u){var h,v,e,f,M,c,d,s,I=[o-a,u-i],P=[a-t,i-r];return h=I[0]*P[0]+I[1]*P[1],v=2*(I[0]*I[0]+I[1]*I[1]),h*=-2,e=Math.sqrt(h*h-2*v*(P[0]*P[0]+P[1]*P[1]-n*n)),isNaN(e)?[]:(M=(h+e)/v,d=[],s=[],c=[],(f=(h-e)/v)<=1&&f>=0&&(d[0]=a+I[0]*f,d[1]=i+I[1]*f,c[0]=d),M<=1&&M>=0&&(s[0]=a+I[0]*M,s[1]=i+I[1]*M,c[c.length]=s),c)})(s,I,f,t,r,n,i).filter((function(t){var r,n=(r=a(s,I,t[0],t[1]))-2*Math.PI*Math.floor(r/(2*Math.PI));return n>P&&n<x})).forEach((function(t){return l.push(t)}));var g=e(t,r,n,i,h,v,M,c);g&&l.push(g)})),l}function M(t,r,n,a,i,o,u,h){for(var v=[],e=0,f=[[i,o,i+u,o],[i+u,o,i+u,o+h],[i+u,o+h,i,o+h],[i,o+h,i,o]];e<f.length;e++){var M=f[e],d=c(t,r,n,a,M[0],M[1],M[2],M[3]);d&&v.push(d)}return v}function c(t,r,n,a,i,o,u,h){var v,e,f;if(a*(u-i)!=n*(h-o)&&0!=(f=n*(h-o)-a*(u-i))&&(e=((r-o)*n-(t-i)*a)/f,(v=((r-o)*(u-i)-(t-i)*(h-o))/f)>=0&&e>=0&&e<=1))return[t+v*n,r+v*a]}Object.defineProperty(exports,"__esModule",{value:!0}),exports.getArrow=function(v,e,f,M,c){void 0===c&&(c={});var d=c.bow,s=void 0===d?0:d,I=c.stretch,P=void 0===I?.5:I,p=c.stretchMin,l=void 0===p?0:p,x=c.stretchMax,g=void 0===x?420:x,m=c.padStart,b=void 0===m?0:m,w=c.padEnd,y=void 0===w?0:w,E=c.flip,A=void 0!==E&&E,B=c.straights,N=void 0===B||B,S=a(v,e,f,M),_=n(v,e,f,M),j=h(v,e,f,M);if(_<2*(b+y)||0===s&&0===P||N&&[0,1,Infinity].includes(j)){var q=Math.max(0,Math.min(_-b,b)),O=Math.max(0,Math.min(_-q,y)),T=i(v,e,S,q),k=T[0],z=T[1],C=i(f,M,S+Math.PI,O),D=C[0],F=C[1],G=o(k,z,D,F,.5);return[k,z,G[0],G[1],D,F,S,S,S]}var H=(u(S)%2==0?1:-1)*(A?-1:1),J=s+t(_,[l,g],[1,0],!0)*P,K=o(v,e,f,M,.5),L=K[0],Q=K[1],R=o(v,e,f,M,.5-J),U=R[0],V=R[1],W=r(U,V,L,Q,Math.PI/2*H),X=i(v,e,a(v,e,U=W[0],V=W[1]),b),Y=X[0],Z=X[1],$=i(f,M,a(f,M,U,V),y),tt=$[0],rt=$[1],nt=a(U,V,v,e),at=a(U,V,f,M),it=o(Y,Z,tt,rt,.5),ot=it[0],ut=it[1],ht=o(Y,Z,tt,rt,.5-J),vt=ht[0],et=ht[1],ft=r(vt,et,ot,ut,Math.PI/2*H),Mt=o(U,V,vt=ft[0],et=ft[1],.5);return[Y,Z,Mt[0],Mt[1],tt,rt,at,nt,S]},exports.getBoxToBoxArrow=function(e,c,d,s,I,P,p,l,x){var g,m,b,w;void 0===x&&(x={});var y=x.bow,E=void 0===y?0:y,A=x.stretch,B=void 0===A?.5:A,N=x.stretchMin,S=void 0===N?0:N,_=x.stretchMax,j=void 0===_?420:_,q=x.padStart,O=void 0===q?0:q,T=x.padEnd,k=void 0===T?20:T,z=x.flip,C=void 0!==z&&z,D=x.straights,F=void 0===D||D,G=e+d/2,H=c+s/2,J=I+p/2,K=P+l/2,L=e-O,Q=c-O,R=d+2*O,U=s+2*O,V=I-k,W=P-k,X=p+2*k,Y=l+2*k,Z=o(G,H,J,K,.5),$=Z[0],tt=Z[1],rt=a(G,H,J,K),nt=h(G,H,J,K),at=2*Math.min(R,U,X,Y),it=n(e,c,I,P),ot=at-it,ut=function(t,r,n,a,i,o,u,h){return!(t>=i+u||i>=t+n||r>=o+h||o>=r+a)}(L,Q,R,U,V,W,X,Y);if(F&&([0,1,Infinity].includes(nt)||G===J||H===K)&&!ut){var ht=v(G,H,J,K,L,Q,R,U)[0];g=ht[0],m=ht[1];var vt=v(G,H,J,K,V,W,X,Y)[0];return[g,m,$,tt,b=vt[0],w=vt[1],rt,rt+Math.PI,rt]}var et=(u(rt)%2==0?1:-1)*(C?-1:1),ft=t(it,[S,j],[1,0],!0),Mt=E+ft*B/2,ct=o(G,H,J,K,.5-Mt),dt=ct[0],st=ct[1],It=r(dt,st,$,tt,Math.PI/2*et);if(dt=It[0],st=It[1],ot>0){var Pt=i(dt,st,rt+Math.PI/2*-et,ot*Mt);dt=Pt[0],st=Pt[1]}var pt=f(G,H,dt,st,L,Q,R,U,O),lt=f(J,K,dt,st,V,W,X,Y,k);if(!pt[0]||!lt[0]||n(pt[0][0],pt[0][1],lt[0][0],lt[0][1])<O+k){var xt=function(t){return[Math.cos(t),Math.sin(t)]}(rt+Math.PI),gt=xt[0],mt=xt[1],bt=M(G,H,gt,mt,L,Q,R,U)[0];g=bt[0],m=bt[1];var wt=M(J,K,gt,mt,V,W,X,Y)[0];b=wt[0],w=wt[1],Mt=-1*(E+ft*B)}else{var yt=pt[0];g=yt[0],m=yt[1];var Et=lt[0];b=Et[0],w=Et[1],Mt=E+ft*B}var At=o(g,m,b,w,.5),Bt=At[0],Nt=At[1],St=o(g,m,b,w,.5-Mt),_t=r(dt=St[0],st=St[1],Bt,Nt,Math.PI/(2*et)),jt=a(dt=_t[0],st=_t[1],g,m);return[g,m,dt,st,b,w,a(dt,st,b,w),jt,rt]};
//# sourceMappingURL=perfect-arrows.cjs.production.min.js.map

@@ -553,3 +553,3 @@ /**

_options$padStart = _options.padStart,
padStart = _options$padStart === void 0 ? 20 : _options$padStart,
padStart = _options$padStart === void 0 ? 0 : _options$padStart,
_options$padEnd = _options.padEnd,

@@ -556,0 +556,0 @@ padEnd = _options$padEnd === void 0 ? 20 : _options$padEnd,

{
"version": "0.2.1",
"version": "0.2.2",
"license": "MIT",

@@ -36,2 +36,6 @@ "main": "dist/index.js",

"homepage": "https://github.com/steveruizok/perfect-arrows",
"repository": {
"type": "git",
"url": "https://github.com/steveruizok/perfect-arrows"
},
"keywords": [

@@ -38,0 +42,0 @@ "arrow",

@@ -7,3 +7,3 @@ # Perfect Arrows

👉 [Demo](https://example.steveruizok.vercel.app/)
👉 [Demo](https://perfect-arrows.now.sh/)

@@ -13,3 +13,3 @@ [![Edit example](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/steveruizok/perfect-arrows/tree/master/example?fontsize=14&hidenavigation=1&theme=dark)

- [x] `getArrow` - For point-to-point arrows.
- [ ] `getArrowBetweenRectangles` - For rectangle-to-rectangle arrows.
- [x] `getBoxToBoxArrow` - For rectangle-to-rectangle arrows.

@@ -111,4 +111,4 @@ ## Installation

<svg
viewBox="0 0 640 480"
style={{ width: 640, height: 480 }}
viewBox="0 0 720 480"
style={{ width: 720, height: 480 }}
stroke="#000"

@@ -129,4 +129,106 @@ fill="#000"

### `getBoxToBoxArrow(x0, y0, w0, h0, x1, y1, w1, h1, options)`
The `getBoxToBoxArrow` function accepts the position and dimensions of two boxes (or rectangles) and returns an array containing information for:
- three points: a start, end, and control point
- three angles: an end, start, and center
You can use this information to draw an arc and arrow-heads. You can use the options object to tweak the return values.
**Note:** The options and values returned by `getBoxToBoxArrow` are in the same format as the options and values for `getArrow`.
```js
const arrow = getBoxToBoxArrow(0, 0, 96, 128, 400, 200, 128, 96, {
bow: 0,
stretch: 0.5,
stretchMin: 0,
stretchMax: 420,
padStart: 0,
padEnd: 0,
flip: false,
straights: true,
})
const [sx, sy, cx, cy, ex, ey, ae, as, sc] = arrow
```
#### Arguments
| Argument | Type | Description |
| -------- | ------ | --------------------------------------------------------------------------- |
| `x0` | number | The x position of the first rectangle. |
| `y0` | number | The y position of the first rectangle. |
| `w0` | number | The width of the first rectangle. |
| `h0` | number | The height of the first rectangle. |
| `x1` | number | The x position of the second rectangle. |
| `y1` | number | The y position of the second rectangle. |
| `w1` | number | The width of the second rectangle. |
| `h1` | number | The height of the second rectangle. |
| options | object | An (optional) object containing one or more of the options described below. |
#### Options
See options in `getArrow` above. (Both functions use the same options object.)
#### Returns
See returns in `getArrow` above. (Both functions return the same set of values.)
## Example: A React Box-to-box Arrow Component
```jsx
import * as React from "react"
import { getArrow } from "perfect-arrows"
export function PerfectArrow() {
const p1 = { x: 64, y: 64, w: 64, h: 64 }
const p2 = { x: 128, y: 96, w: 64, h: 64 }
const arrow = getBoxToBoxArrow(
p1.x,
p1.y,
p1.w,
p1.h,
p2.x,
p2.y,
p2.w,
p2.h,
{
bow: 0.2,
stretch: 0.5,
stretchMin: 40,
stretchMax: 420,
padStart: 0,
padEnd: 20,
flip: false,
straights: true,
}
)
const [sx, sy, cx, cy, ex, ey, ae, as, ec] = arrow
const endAngleAsDegrees = ae * (180 / Math.PI)
return (
<svg
viewBox="0 0 1280 720"
style={{ width: 1280, height: 720 }}
stroke="#000"
fill="#000"
strokeWidth={3}
>
<circle cx={sx} cy={sy} r={4} />
<path d={`M${sx},${sy} Q${cx},${cy} ${ex},${ey}`} fill="none" />
<polygon
points="0,-6 12,0, 0,6"
transform={`translate(${ex},${ey}) rotate(${endAngleAsDegrees})`}
/>
</svg>
)
}
```
## Author
[@steveruizok](https://twitter.com/steveruizok)

@@ -59,3 +59,3 @@ import {

stretchMax = 420,
padStart = 20,
padStart = 0,
padEnd = 20,

@@ -62,0 +62,0 @@ flip = false,

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc