Skip to content

Instantly share code, notes, and snippets.

@tosunkaya
Created December 1, 2018 10:11
Show Gist options
  • Save tosunkaya/2aa991180a0e380e429c16ad45b88e4c to your computer and use it in GitHub Desktop.
Save tosunkaya/2aa991180a0e380e429c16ad45b88e4c to your computer and use it in GitHub Desktop.
jquery-svg-1.4.5-.js used on https://tosunkaya.com
!function(p){function t(){this._settings=[],this._extensions=[],this.regional=[],this.regional[""]={errorLoadingText:"Error loading",notSupportedText:"This browser does not support SVG"},this.local=this.regional[""],this._uuid=(new Date).getTime(),this._renesis=function(t){try{return!(!window.ActiveXObject||!new ActiveXObject(t))}catch(t){return!1}}("RenesisX.RenesisCtrl")}var i="svgwrapper";function e(t,e){this._svg=t,this._container=e;for(var n=0;n<p.svg._extensions.length;n++){var r=p.svg._extensions[n];this[r[0]]=new r[1](this)}}function n(){this._path=""}function r(){this._parts=[]}function l(t){return t&&t.constructor==Array}p.extend(t.prototype,{markerClassName:"hasSVG",svgNS:"http://www.w3.org/2000/svg",xlinkNS:"http://www.w3.org/1999/xlink",_wrapperClass:e,_attrNames:{class_:"class",in_:"in",alignmentBaseline:"alignment-baseline",baselineShift:"baseline-shift",clipPath:"clip-path",clipRule:"clip-rule",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",colorRendering:"color-rendering",dominantBaseline:"dominant-baseline",enableBackground:"enable-background",fillOpacity:"fill-opacity",fillRule:"fill-rule",floodColor:"flood-color",floodOpacity:"flood-opacity",fontFamily:"font-family",fontSize:"font-size",fontSizeAdjust:"font-size-adjust",fontStretch:"font-stretch",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",glyphOrientationHorizontal:"glyph-orientation-horizontal",glyphOrientationVertical:"glyph-orientation-vertical",horizAdvX:"horiz-adv-x",horizOriginX:"horiz-origin-x",imageRendering:"image-rendering",letterSpacing:"letter-spacing",lightingColor:"lighting-color",markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",strokeDashArray:"stroke-dasharray",strokeDashOffset:"stroke-dashoffset",strokeLineCap:"stroke-linecap",strokeLineJoin:"stroke-linejoin",strokeMiterLimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",underlinePosition:"underline-position",underlineThickness:"underline-thickness",vertAdvY:"vert-adv-y",vertOriginY:"vert-origin-y",wordSpacing:"word-spacing",writingMode:"writing-mode"},_attachSVG:function(e,n){var t=e.namespaceURI==this.svgNS?e:null;if(!p((e=t?null:e)||t).hasClass(this.markerClassName)){"string"==typeof n?n={loadURL:n}:"function"==typeof n&&(n={onLoad:n}),p(e||t).addClass(this.markerClassName);try{t||((t=document.createElementNS(this.svgNS,"svg")).setAttribute("version","1.1"),0<e.clientWidth&&t.setAttribute("width",e.clientWidth),0<e.clientHeight&&t.setAttribute("height",e.clientHeight),e.appendChild(t)),this._afterLoad(e,t,n||{})}catch(t){p.browser.msie?(e.id||(e.id="svg"+this._uuid++),this._settings[e.id]=n,e.innerHTML='<embed type="image/svg+xml" width="100%" height="100%" src="'+(n.initPath||"")+'blank.svg" pluginspage="http://www.adobe.com/svg/viewer/install/main.html"/>'):e.innerHTML='<p class="svg_error">'+this.local.notSupportedText+"</p>"}}},_registerSVG:function(){for(var t=0;t<document.embeds.length;t++){var e=document.embeds[t].parentNode;if(p(e).hasClass(p.svg.markerClassName)&&!p.data(e,i)){var n=null;try{n=document.embeds[t].getSVGDocument()}catch(t){return void setTimeout(p.svg._registerSVG,250)}(n=n?n.documentElement:null)&&p.svg._afterLoad(e,n)}}},_afterLoad:function(t,e,n){n=n||this._settings[t.id];this._settings[t?t.id:""]=null;var r=new this._wrapperClass(e,t);p.data(t||e,i,r);try{n.loadURL&&r.load(n.loadURL,n),n.settings&&r.configure(n.settings),n.onLoad&&!n.loadURL&&n.onLoad.apply(t||e,[r])}catch(t){alert(t)}},_getSVG:function(t){return t="string"==typeof t?p(t)[0]:t.jquery?t[0]:t,p.data(t,i)},_destroySVG:function(t){var e=p(t);e.hasClass(this.markerClassName)&&(e.removeClass(this.markerClassName),t.namespaceURI!=this.svgNS&&e.empty(),p.removeData(t,i))},addExtension:function(t,e){this._extensions.push([t,e])},isSVGElem:function(t){return 1==t.nodeType&&t.namespaceURI==p.svg.svgNS}}),p.extend(e.prototype,{_width:function(){return this._container?this._container.clientWidth:this._svg.width},_height:function(){return this._container?this._container.clientHeight:this._svg.height},root:function(){return this._svg},configure:function(t,e,n){if(t.nodeName||(n=e,e=t,t=this._svg),n)for(var r=t.attributes.length-1;0<=r;r--){var i=t.attributes.item(r);"onload"!=i.nodeName&&"version"!=i.nodeName&&"xmlns"!=i.nodeName.substring(0,5)&&t.attributes.removeNamedItem(i.nodeName)}for(var s in e)t.setAttribute(p.svg._attrNames[s]||s,e[s]);return this},getElementById:function(t){return this._svg.ownerDocument.getElementById(t)},change:function(t,e){if(t)for(var n in e)null==e[n]?t.removeAttribute(p.svg._attrNames[n]||n):t.setAttribute(p.svg._attrNames[n]||n,e[n]);return this},_args:function(t,e,n){e.splice(0,0,"parent"),e.splice(e.length,0,"settings");var r={},i=0;null!=t[0]&&t[0].jquery&&(t[0]=t[0][0]),null==t[0]||"object"==typeof t[0]&&t[0].nodeName||(r.parent=null,i=1);for(var s=0;s<t.length;s++)r[e[s+i]]=t[s];return n&&p.each(n,function(t,e){"object"==typeof r[e]&&(r.settings=r[e],r[e]=null)}),r},title:function(t,e,n){var r=this._args(arguments,["text"]),i=this._makeNode(r.parent,"title",r.settings||{});return i.appendChild(this._svg.ownerDocument.createTextNode(r.text)),i},describe:function(t,e,n){var r=this._args(arguments,["text"]),i=this._makeNode(r.parent,"desc",r.settings||{});return i.appendChild(this._svg.ownerDocument.createTextNode(r.text)),i},defs:function(t,e,n){var r=this._args(arguments,["id"],["id"]);return this._makeNode(r.parent,"defs",p.extend(r.id?{id:r.id}:{},r.settings||{}))},symbol:function(t,e,n,r,i,s,o){var a=this._args(arguments,["id","x1","y1","width","height"]);return this._makeNode(a.parent,"symbol",p.extend({id:a.id,viewBox:a.x1+" "+a.y1+" "+a.width+" "+a.height},a.settings||{}))},marker:function(t,e,n,r,i,s,o,a){var h=this._args(arguments,["id","refX","refY","mWidth","mHeight","orient"],["orient"]);return this._makeNode(h.parent,"marker",p.extend({id:h.id,refX:h.refX,refY:h.refY,markerWidth:h.mWidth,markerHeight:h.mHeight,orient:h.orient||"auto"},h.settings||{}))},style:function(t,e,n){var r=this._args(arguments,["styles"]),i=this._makeNode(r.parent,"style",p.extend({type:"text/css"},r.settings||{}));return i.appendChild(this._svg.ownerDocument.createTextNode(r.styles)),p.browser.opera&&p("head").append('<style type="text/css">'+r.styles+"</style>"),i},script:function(t,e,n,r){var i=this._args(arguments,["script","type"],["type"]),s=this._makeNode(i.parent,"script",p.extend({type:i.type||"text/javascript"},i.settings||{}));return s.appendChild(this._svg.ownerDocument.createTextNode(i.script)),p.browser.mozilla||p.globalEval(i.script),s},linearGradient:function(t,e,n,r,i,s,o,a){var h=this._args(arguments,["id","stops","x1","y1","x2","y2"],["x1"]),d=p.extend({id:h.id},null!=h.x1?{x1:h.x1,y1:h.y1,x2:h.x2,y2:h.y2}:{});return this._gradient(h.parent,"linearGradient",p.extend(d,h.settings||{}),h.stops)},radialGradient:function(t,e,n,r,i,s,o,a,h){var d=this._args(arguments,["id","stops","cx","cy","r","fx","fy"],["cx"]),l=p.extend({id:d.id},null!=d.cx?{cx:d.cx,cy:d.cy,r:d.r,fx:d.fx,fy:d.fy}:{});return this._gradient(d.parent,"radialGradient",p.extend(l,d.settings||{}),d.stops)},_gradient:function(t,e,n,r){for(var i=this._makeNode(t,e,n),s=0;s<r.length;s++){var o=r[s];this._makeNode(i,"stop",p.extend({offset:o[0],stopColor:o[1]},null!=o[2]?{stopOpacity:o[2]}:{}))}return i},pattern:function(t,e,n,r,i,s,o,a,h,d,l){var c=this._args(arguments,["id","x","y","width","height","vx","vy","vwidth","vheight"],["vx"]),u=p.extend({id:c.id,x:c.x,y:c.y,width:c.width,height:c.height},null!=c.vx?{viewBox:c.vx+" "+c.vy+" "+c.vwidth+" "+c.vheight}:{});return this._makeNode(c.parent,"pattern",p.extend(u,c.settings||{}))},clipPath:function(t,e,n,r){var i=this._args(arguments,["id","units"]);return i.units=i.units||"userSpaceOnUse",this._makeNode(i.parent,"clipPath",p.extend({id:i.id,clipPathUnits:i.units},i.settings||{}))},mask:function(t,e,n,r,i,s,o){var a=this._args(arguments,["id","x","y","width","height"]);return this._makeNode(a.parent,"mask",p.extend({id:a.id,x:a.x,y:a.y,width:a.width,height:a.height},a.settings||{}))},createPath:function(){return new n},createText:function(){return new r},svg:function(t,e,n,r,i,s,o,a,h,d){var l=this._args(arguments,["x","y","width","height","vx","vy","vwidth","vheight"],["vx"]),c=p.extend({x:l.x,y:l.y,width:l.width,height:l.height},null!=l.vx?{viewBox:l.vx+" "+l.vy+" "+l.vwidth+" "+l.vheight}:{});return this._makeNode(l.parent,"svg",p.extend(c,l.settings||{}))},group:function(t,e,n){var r=this._args(arguments,["id"],["id"]);return this._makeNode(r.parent,"g",p.extend({id:r.id},r.settings||{}))},use:function(t,e,n,r,i,s,o){var a=this._args(arguments,["x","y","width","height","ref"]);"string"==typeof a.x&&(a.ref=a.x,a.settings=a.y,a.x=a.y=a.width=a.height=null);var h=this._makeNode(a.parent,"use",p.extend({x:a.x,y:a.y,width:a.width,height:a.height},a.settings||{}));return h.setAttributeNS(p.svg.xlinkNS,"href",a.ref),h},link:function(t,e,n){var r=this._args(arguments,["ref"]),i=this._makeNode(r.parent,"a",r.settings);return i.setAttributeNS(p.svg.xlinkNS,"href",r.ref),i},image:function(t,e,n,r,i,s,o){var a=this._args(arguments,["x","y","width","height","ref"]),h=this._makeNode(a.parent,"image",p.extend({x:a.x,y:a.y,width:a.width,height:a.height},a.settings||{}));return h.setAttributeNS(p.svg.xlinkNS,"href",a.ref),h},path:function(t,e,n){var r=this._args(arguments,["path"]);return this._makeNode(r.parent,"path",p.extend({d:r.path.path?r.path.path():r.path},r.settings||{}))},rect:function(t,e,n,r,i,s,o,a){var h=this._args(arguments,["x","y","width","height","rx","ry"],["rx"]);return this._makeNode(h.parent,"rect",p.extend({x:h.x,y:h.y,width:h.width,height:h.height},h.rx?{rx:h.rx,ry:h.ry}:{},h.settings||{}))},circle:function(t,e,n,r,i){var s=this._args(arguments,["cx","cy","r"]);return this._makeNode(s.parent,"circle",p.extend({cx:s.cx,cy:s.cy,r:s.r},s.settings||{}))},ellipse:function(t,e,n,r,i,s){var o=this._args(arguments,["cx","cy","rx","ry"]);return this._makeNode(o.parent,"ellipse",p.extend({cx:o.cx,cy:o.cy,rx:o.rx,ry:o.ry},o.settings||{}))},line:function(t,e,n,r,i,s){var o=this._args(arguments,["x1","y1","x2","y2"]);return this._makeNode(o.parent,"line",p.extend({x1:o.x1,y1:o.y1,x2:o.x2,y2:o.y2},o.settings||{}))},polyline:function(t,e,n){var r=this._args(arguments,["points"]);return this._poly(r.parent,"polyline",r.points,r.settings)},polygon:function(t,e,n){var r=this._args(arguments,["points"]);return this._poly(r.parent,"polygon",r.points,r.settings)},_poly:function(t,e,n,r){for(var i="",s=0;s<n.length;s++)i+=n[s].join()+" ";return this._makeNode(t,e,p.extend({points:p.trim(i)},r||{}))},text:function(t,e,n,r,i){var s=this._args(arguments,["x","y","value"]);return"string"==typeof s.x&&arguments.length<4&&(s.value=s.x,s.settings=s.y,s.x=s.y=null),this._text(s.parent,"text",s.value,p.extend({x:s.x&&l(s.x)?s.x.join(" "):s.x,y:s.y&&l(s.y)?s.y.join(" "):s.y},s.settings||{}))},textpath:function(t,e,n,r){var i=this._args(arguments,["path","value"]),s=this._text(i.parent,"textPath",i.value,i.settings||{});return s.setAttributeNS(p.svg.xlinkNS,"href",i.path),s},_text:function(t,e,n,r){var i=this._makeNode(t,e,r);if("string"==typeof n)i.appendChild(i.ownerDocument.createTextNode(n));else for(var s=0;s<n._parts.length;s++){var o=n._parts[s];if("tspan"==o[0])(a=this._makeNode(i,o[0],o[2])).appendChild(i.ownerDocument.createTextNode(o[1])),i.appendChild(a);else if("tref"==o[0]){(a=this._makeNode(i,o[0],o[2])).setAttributeNS(p.svg.xlinkNS,"href",o[1]),i.appendChild(a)}else if("textpath"==o[0]){var a,h=p.extend({},o[2]);h.href=null,(a=this._makeNode(i,o[0],h)).setAttributeNS(p.svg.xlinkNS,"href",o[2].href),a.appendChild(i.ownerDocument.createTextNode(o[1])),i.appendChild(a)}else i.appendChild(i.ownerDocument.createTextNode(o[1]))}return i},other:function(t,e,n){var r=this._args(arguments,["name"]);return this._makeNode(r.parent,r.name,r.settings||{})},_makeNode:function(t,e,n){t=t||this._svg;var r=this._svg.ownerDocument.createElementNS(p.svg.svgNS,e);for(var e in n){var i=n[e];null==i||null==i||"string"==typeof i&&""==i||r.setAttribute(p.svg._attrNames[e]||e,i)}return t.appendChild(r),r},add:function(t,e){var n=this._args(1==arguments.length?[null,t]:arguments,["node"]),r=this;n.parent=n.parent||this._svg,n.node=n.node.jquery?n.node:p(n.node);try{if(p.svg._renesis)throw"Force traversal";n.parent.appendChild(n.node.cloneNode(!0))}catch(t){n.node.each(function(){var t=r._cloneAsSVG(this);t&&n.parent.appendChild(t)})}return this},clone:function(t,e){var n=this,r=this._args(1==arguments.length?[null,t]:arguments,["node"]);r.parent=r.parent||this._svg,r.node=r.node.jquery?r.node:p(r.node);var i=[];return r.node.each(function(){var t=n._cloneAsSVG(this);t&&(t.id="",r.parent.appendChild(t),i.push(t))}),i},_cloneAsSVG:function(e){var n=null;if(1==e.nodeType){n=this._svg.ownerDocument.createElementNS(p.svg.svgNS,this._checkName(e.nodeName));for(var t=0;t<e.attributes.length;t++){var r=e.attributes.item(t);"xmlns"!=r.nodeName&&r.nodeValue&&("xlink"==r.prefix?n.setAttributeNS(p.svg.xlinkNS,r.localName||r.baseName,r.nodeValue):n.setAttribute(this._checkName(r.nodeName),r.nodeValue))}for(t=0;t<e.childNodes.length;t++){var i=this._cloneAsSVG(e.childNodes[t]);i&&n.appendChild(i)}}else if(3==e.nodeType)p.trim(e.nodeValue)&&(n=this._svg.ownerDocument.createTextNode(e.nodeValue));else if(4==e.nodeType&&p.trim(e.nodeValue))try{n=this._svg.ownerDocument.createCDATASection(e.nodeValue)}catch(t){n=this._svg.ownerDocument.createTextNode(e.nodeValue.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"))}return n},_checkName:function(t){return"svg:"==(t="A"<=t.substring(0,1)&&t.substring(0,1)<="Z"?t.toLowerCase():t).substring(0,4)?t.substring(4):t},load:function(t,h){(h="boolean"==typeof h?{addTo:h}:"function"==typeof h?{onLoad:h}:"string"==typeof h?{parent:h}:"object"==typeof h&&h.nodeName?{parent:h}:"object"==typeof h&&h.jquery?{parent:h}:h||{}).parent||h.addTo||this.clear(!1);var d=[this._svg.getAttribute("width"),this._svg.getAttribute("height")],l=this,c=function(t){t=p.svg.local.errorLoadingText+": "+t,h.onLoad?h.onLoad.apply(l._container||l._svg,[l,t]):l.text(null,10,20,t)},e=function(t){var e=new ActiveXObject("Microsoft.XMLDOM");return e.validateOnParse=!1,e.resolveExternals=!1,e.async=!1,e.loadXML(t),0!=e.parseError.errorCode?(c(e.parseError.reason),null):e},n=function(t){if(t)if("svg"==t.documentElement.nodeName){for(var e=h.parent?p(h.parent)[0]:l._svg,n={},r=0;r<t.documentElement.attributes.length;r++){var i=t.documentElement.attributes.item(r);"version"!=i.nodeName&&"xmlns"!=i.nodeName.substring(0,5)&&(n[i.nodeName]=i.nodeValue)}l.configure(e,n,!h.parent);var s=t.documentElement.childNodes;for(r=0;r<s.length;r++)try{if(p.svg._renesis)throw"Force traversal";e.appendChild(l._svg.ownerDocument.importNode(s[r],!0)),"script"==s[r].nodeName&&p.globalEval(s[r].textContent)}catch(t){l.add(e,s[r])}h.changeSize||l.configure(e,{width:d[0],height:d[1]}),h.onLoad&&h.onLoad.apply(l._container||l._svg,[l])}else{var o=t.getElementsByTagName("parsererror"),a=o.length?o[0].getElementsByTagName("div"):[];c(o.length?(a.length?a[0]:o[0]).firstChild.nodeValue:"???")}};return t.match("<svg")?n(p.browser.msie?e(t):(new DOMParser).parseFromString(t,"text/xml")):p.ajax({url:t,dataType:p.browser.msie?"text":"xml",success:function(t){n(p.browser.msie?e(t):t)},error:function(t,e,n){c(e+(n?" "+n.message:""))}}),this},remove:function(t){return(t=t.jquery?t[0]:t).parentNode.removeChild(t),this},clear:function(t){for(t&&this.configure({},!0);this._svg.firstChild;)this._svg.removeChild(this._svg.firstChild);return this},toSVG:function(t){return t=t||this._svg,"undefined"==typeof XMLSerializer?this._toSVG(t):(new XMLSerializer).serializeToString(t)},_toSVG:function(t){var e="";if(!t)return e;if(3==t.nodeType)e=t.nodeValue;else if(4==t.nodeType)e="<![CDATA["+t.nodeValue+"]]>";else{if(e="<"+t.nodeName,t.attributes)for(var n=0;n<t.attributes.length;n++){var r=t.attributes.item(n);""==p.trim(r.nodeValue)||r.nodeValue.match(/^\[object/)||r.nodeValue.match(/^function/)||(e+=" "+(r.namespaceURI==p.svg.xlinkNS?"xlink:":"")+r.nodeName+'="'+r.nodeValue+'"')}if(t.firstChild){e+=">";for(var i=t.firstChild;i;)e+=this._toSVG(i),i=i.nextSibling;e+="</"+t.nodeName+">"}else e+="/>"}return e}}),p.extend(n.prototype,{reset:function(){return this._path="",this},move:function(t,e,n){return n=l(t)?e:n,this._coords(n?"m":"M",t,e)},line:function(t,e,n){return n=l(t)?e:n,this._coords(n?"l":"L",t,e)},horiz:function(t,e){return this._path+=(e?"h":"H")+(l(t)?t.join(" "):t),this},vert:function(t,e){return this._path+=(e?"v":"V")+(l(t)?t.join(" "):t),this},curveC:function(t,e,n,r,i,s,o){return o=l(t)?e:o,this._coords(o?"c":"C",t,e,n,r,i,s)},smoothC:function(t,e,n,r,i){return i=l(t)?e:i,this._coords(i?"s":"S",t,e,n,r)},curveQ:function(t,e,n,r,i){return i=l(t)?e:i,this._coords(i?"q":"Q",t,e,n,r)},smoothQ:function(t,e,n){return n=l(t)?e:n,this._coords(n?"t":"T",t,e)},_coords:function(t,e,n,r,i,s,o){if(l(e))for(var a=0;a<e.length;a++){var h=e[a];this._path+=(0==a?t:" ")+h[0]+","+h[1]+(h.length<4?"":" "+h[2]+","+h[3]+(h.length<6?"":" "+h[4]+","+h[5]))}else this._path+=t+e+","+n+(null==r?"":" "+r+","+i+(null==s?"":" "+s+","+o));return this},arc:function(t,e,n,r,i,s,o,a){if(a=l(t)?e:a,this._path+=a?"a":"A",l(t))for(var h=0;h<t.length;h++){var d=t[h];this._path+=(0==h?"":" ")+d[0]+","+d[1]+" "+d[2]+" "+(d[3]?"1":"0")+","+(d[4]?"1":"0")+" "+d[5]+","+d[6]}else this._path+=t+","+e+" "+n+" "+(r?"1":"0")+","+(i?"1":"0")+" "+s+","+o;return this},close:function(){return this._path+="z",this},path:function(){return this._path}}),n.prototype.moveTo=n.prototype.move,n.prototype.lineTo=n.prototype.line,n.prototype.horizTo=n.prototype.horiz,n.prototype.vertTo=n.prototype.vert,n.prototype.curveCTo=n.prototype.curveC,n.prototype.smoothCTo=n.prototype.smoothC,n.prototype.curveQTo=n.prototype.curveQ,n.prototype.smoothQTo=n.prototype.smoothQ,n.prototype.arcTo=n.prototype.arc,p.extend(r.prototype,{reset:function(){return this._parts=[],this},string:function(t){return this._parts[this._parts.length]=["text",t],this},span:function(t,e){return this._parts[this._parts.length]=["tspan",t,e],this},ref:function(t,e){return this._parts[this._parts.length]=["tref",t,e],this},path:function(t,e,n){return this._parts[this._parts.length]=["textpath",e,p.extend({href:t},n||{})],this}}),p.fn.svg=function(t){var e=Array.prototype.slice.call(arguments,1);return"string"==typeof t&&"get"==t?p.svg["_"+t+"SVG"].apply(p.svg,[this[0]].concat(e)):this.each(function(){"string"==typeof t?p.svg["_"+t+"SVG"].apply(p.svg,[this].concat(e)):p.svg._attachSVG(this,t||{})})},p.svg=new t}(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment