"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7146],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>y});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),l=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,u=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),s=l(r),f=o,y=s["".concat(u,".").concat(f)]||s[f]||m[f]||i;return r?n.createElement(y,a(a({ref:t},p),{},{components:r})):n.createElement(y,a({ref:t},p))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=f;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c[s]="string"==typeof e?e:o,a[1]=c;for(var l=2;l<i;l++)a[l]=r[l];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},30655:(e,t,r)=>{r.r(t),r.d(t,{contentTitle:()=>u,default:()=>f,frontMatter:()=>c,metadata:()=>l,toc:()=>p});var n=r(87462),o=r(63366),i=(r(67294),r(3905)),a=["components"],c={title:"Druid Contributor License Agreement",layout:"simple_page",canonical:"https://druid.apache.org/community/cla"},u="Druid Contributor License Agreement",l={type:"mdx",permalink:"/community/cla",source:"@site/src/pages/community/cla.md",title:"Druid Contributor License Agreement",description:"Per Apache policy, all Druid committers are required to have a contributor license agreement (CLA) on file with",frontMatter:{title:"Druid Contributor License Agreement",layout:"simple_page",canonical:"https://druid.apache.org/community/cla"}},p=[],s={toc:p},m="wrapper";function f(e){var t=e.components,r=(0,o.Z)(e,a);return(0,i.kt)(m,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"druid-contributor-license-agreement"},"Druid Contributor License Agreement"),(0,i.kt)("p",null,"Per Apache policy, all Druid committers are required to have a contributor license agreement (CLA) on file with\nthe Apache Software Foundation."),(0,i.kt)("p",null,"Other contributors are free to submit patches without having a CLA on file. You should only submit patches to the\nproject when you intend to license your contribution under the Apache 2.0 license, and have the legal right to do so."))}f.isMDXComponent=!0}}]);